cirkulär kö ?
cirkulär kö ?
( 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 ?
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 ?
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();
}
}
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 ?
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 ?
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...
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...