09-12-2012, 01:16 AM
Kas FIFO-ga (First In, First Out) oled tuttav? Seda võib nimetada ka ringpuhvriks, sest softis tehtud FIFO on sisult ringpuhver. Nimi reedab olemuse - välja võetakse andmed samas järjekorras, mis nad sinna sisse pandi, ehk ingliskeelne otsetõlge - esimesena sisse ja esimesena välja.
Seda võib teha näiteks kolme muutuja:
ja järgmiste definitsioonide abil (pseudokood):
Olgu näiteks kontrolleriplokile vaja saata baite 3ms vahedega. Kas poleks katkestuses
mugav kasutada alamfunktsiooni "slow_send (char)", mis char'i paneb kuskile nurka
oma aega ootama ja pöördub kiiresti tagasi, et katkestus saaks oma asjadega edasi tegelda?
Milal see "oma aeg" tuleb, seda saab aga määrata 3ms perioodiga taimeri katkestusega.
Selline alamfunktsioon, mis selle nurgana kasutab FIFO-t ja saatmiseks taimerit,
näeks pseudokoodis välja järgmine:
Peakontrolleri kaudu toimetamiseks on sarnane nipp, ainult et taimeri katkestamise asemel kasutatakse kahte UART-i enda geneeeritud "andmete puhver tühi" ja/või "kõik bitid saadetud" katkestust. See on veidi keerulisem, aga mitte liiga.
Seda võib teha näiteks kolme muutuja:
Kood:
head: byte // järgmine positsioon kirjutamiseks cbuffer-is.
tail: byte // järgmine positsioon lugemiseks cbuffer-is
cbuffer: array of 256 bytes // puhvri sisu
Kood:
// Kas FIFO on tyhi?
is_empty:
head = tail
// Kas FIFO on täis?
is_full:
tail + 1 = head
// Lisada täht FIFO-sse. NB! FIFO ei tohi olla täis!
push char:
cbuffer[head] <- char
head <- (head + 1) % sizeof(cbuffer)
// Eemaldada täht FIFO-st. NB! FIFO ei tohi olla tühi!
pop:
return_value <- cbuffer[tail]
tail <- tail + 1
return-value
Olgu näiteks kontrolleriplokile vaja saata baite 3ms vahedega. Kas poleks katkestuses
mugav kasutada alamfunktsiooni "slow_send (char)", mis char'i paneb kuskile nurka
oma aega ootama ja pöördub kiiresti tagasi, et katkestus saaks oma asjadega edasi tegelda?
Milal see "oma aeg" tuleb, seda saab aga määrata 3ms perioodiga taimeri katkestusega.
Selline alamfunktsioon, mis selle nurgana kasutab FIFO-t ja saatmiseks taimerit,
näeks pseudokoodis välja järgmine:
Kood:
slow_send char:
push char
timer_at_3ms_interval:
if not is_empty then
char <- pop
write_uart_data_register char
// NB! kirjutamise lõppu ei pea ootama (3ms on niigi varu).
end if
Peakontrolleri kaudu toimetamiseks on sarnane nipp, ainult et taimeri katkestamise asemel kasutatakse kahte UART-i enda geneeeritud "andmete puhver tühi" ja/või "kõik bitid saadetud" katkestust. See on veidi keerulisem, aga mitte liiga.