Sida 1 av 1

cirkulär kö ?

Postat: 26 september 2008, 05:42:14
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 ?

Postat: 26 september 2008, 07:06:37
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.

Postat: 26 september 2008, 08:38:37
av AndersG
Hur gör man en cirkulär kö på ett smart sätt ?
Som du redan gjort ;) Har du testat googla?

Postat: 26 september 2008, 10:06:52
av sodjan
Jag måste också fråga...
Varför beskriver du det först, och sedan frågar hur man gör ?

Postat: 26 september 2008, 10:36:31
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.

Postat: 26 september 2008, 10:40:34
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 ?

Postat: 26 september 2008, 10:41:05
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?

Postat: 26 september 2008, 10:41:26
av Rohan
Man måste också hålla koll så att inte slutet av bufferten varvar början.

Postat: 26 september 2008, 10:42:47
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?"

Postat: 26 september 2008, 10:49:26
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...