cirkulär kö ?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

cirkulär kö ?

Inlägg av persika »

( PIC12F629, MPLAB )

cirkulär kö ?

Jag vill ha en till för att lagra tecken som kommit in som serielldata.
Har gjort en som är 8 byte lång.

-Har använt adresserna för själva lagringen:
20h
21h
22h
23h
24h
25h
26h
27h

-Två variabler som pekar i kön ovan:
SerieKöHämtad
SerieKöLämnad

Efter att en pekare räknats fram, nollställer jag alltid bit 3 i pekaren, så att den inte kommer utan för det avsedda minnesområdet.

Hur gör man en cirkulär kö på ett smart sätt ?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kod: Markera allt

void Send_PC_Char(char Data)
  {
  if(SSR0_TDRE && !Ser0.Busy) SODR0 = Data; /* UART not busy, send direct */
  else
    { /* UART is busy, put into buffer */
    Disable_Global_Interrupt(); /* Interrupt at this point could be disasterous */
    Ser0.Busy = true; /* Mark as busy */
    Ser0.Tx_Buffer[Ser0.Tx_Input++] = Data; /* Put data into buffer and point on next location */
    if(Ser0.Tx_Input >= sizeof(Ser0.Tx_Buffer)) Ser0.Tx_Input = 0; /* It's a ring buffer */
    SSR0_TIE = true; /* Allow for UART to throw TX-interruptd */
    Enable_Global_Interrupt();
    }
  }
Så jag gör på "exakt" samma sätt: in-pekaren kollas mot storleken på buffern och nollas om den är like med eller större. Samma sak med ut-pekaren men det är interruptstyrd.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Hur gör man en cirkulär kö på ett smart sätt ?
Som du redan gjort ;) Har du testat googla?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag måste också fråga...
Varför beskriver du det först, och sedan frågar hur man gör ?
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Varför beskriver du det först, och sedan frågar hur man gör ?
Jag misstänker att han vill veta om det finns ett bättre/enklare sätt.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Inlägg av persika »

Tänkte om det var nån som visste något annat bra sätt.

Annan fråga..
När man ändrar pekarna bör man nog ha interrupt frånslaget.
Jag en timer som ger ett periodisk avbrott som sköter seriell sändning och mottagning.
Vad händer om man stänger av interrupt för en stund och precis då skulle det komma ett interrupt från timern, kommer det när man slår på igen eller det bara bränner inne ?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK. Kanske det...
Men vad är i så fall "att smart sätt".
Vad är det som är osmart (eller ett problem) med det beskrivna sättet?
Användarvisningsbild
Rohan
Inlägg: 1065
Blev medlem: 7 april 2004, 08:24:39
Ort: Eksjö, Småland
Kontakt:

Inlägg av Rohan »

Man måste också hålla koll så att inte slutet av bufferten varvar början.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Det händer rätt ofta att jag funderar på samma sätt, dvs "Detta fungerar, men finns det inte något elegantare sätt?"
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det är klart att man generallisera det hela för att t.ex fungera med valfri
längt på bufferten o.s.v, men grunden kommer alltid att vara samma.
D.v.s att man t.ex inte går till början av bufferten genom att nolla
bit 3 (vilket ju enbart fungerar om bufferten har 8 bitar...)

Det kommer sannolikt också att bli en del variationer beroende på
*vad* som ska buffras och beroende på krav från den aktuella
applikationen.

Lösningen på en PIC18 blir dessutom sannolikt lite annorlunda än på en PIC16.

Men annars är det i princip alltid 1 buffert och 2 pakare...
Skriv svar