Iškarpinę FIFO C

G

GrandAlf

Guest
Anyone help su šiuo, ne itin gera C dar.Kas man yra AT89s8252 programuotas su k ** l ir mažų Realaus laiko OS.Aš vieną užduotį, kad sėdi ir naudoja _getkey ir priskiria jį į 8 bitų int globalių kintamųjų.Šis kintamasis yra tada skaityti kitą užduotį, kad procesai, jei> 0.Ši problema man yra tai, kad jei daugiau nei vienas numeris yra gauta per mažiau nei perdirbimo metu rasti Esu trūkstamų ji.Ką norėtumėte daryti yra skirtas _getkey užduotį parašyti buferinės 10 tarkim, o paskui jį perskaityti ir kitas užduotis, žinoma, kai tam tikroje vietoje yra skaityti turėtų būti sunaikinti, o kitą į eilę atslinkti turi būti tvarkomi, kol buferio buvo tuščias.Turiu rasti internete, bet negali rasti nieko tinkamo skirtas MCUs.Aš maniau, kad šis lustas buvo aparatūros buferio, tačiau šis prašymas, atrodo, neturi poveikio.Būtų labai dėkingi už bet kokią pagalbą šiuo klausimu.

Mike

 
Aš paprastai tai nors tokių kodo fragmentus:

Kodas:

# define BUFSIZE 16 / * galios du turėtų parengti veiksmingai * /lakiųjų unsigned char FIFO [BUFSIZE];

lakiųjų Nepasirašytos rd = 0, WR = 0; / * skaityti ir rašyti vietų * // * Parašyti baitas į FIFO * /

FIFO [WR] = get_input_byte ();

WR = (WR 1)% BUFSIZE;/ * Skaityti baitų iš FIFO * /

o (rd! = wr)

(

do_something_with_byte (FIFO [III]);

rd = (III 1)% BUFSIZE;

)

 
Brilliant, tik tai, ko aš ieškau.Jis yra panašus į tai, ką aš bandžiau padaryti, bet manau įsukus į keletą vietų, aš galiu matyti, kur dabar.Many thanks.

 
Yra dar viena maža Trik su FIFO buferio.

Jei naudojate gerą FIFO dydžiai (16, 32, 64 arba 128 baitai) galima naudoti>> operatoriaus vietoj%.

Bet jei jūs naudojate 256 baitų FIFO dydį ir vienas baitas Iškarpinę FIFO rodyklė Jums nereikia padalinti operatorius, tik rodyklių nepadidinimas operacijos.

# define FIFO_BUFFER_SIZE 256

unsigned char FIFO [FIFO_BUFFER_SIZE];
unsigned char buferiniu [2048];

unisgned char * pw, * pr; / / naudoti tinkamas Kompiliavimo direktyvos vienas baitas rodykles
unisgned char * p; / / dviejų baitų rodyklė

tuščia interrupt_service_routine ()
(
* pw = get_input_byte ();
)

void main () (
pw = & FIFO [0] / / Init FIFO parašyti rodyklė
pr = & FIFO [0] / / Init FIFO skaityti rodyklė

P = & buferiniu [0];/ / Kai procesas kasdieninį patikrinimą būklės FIFO ir laikyti gavo baitų,
/ / Linijinės buferio.

while (pr! = pw) (
* p =* pr ; / / saugoti gautus baitas
)// In another process routine check, process and empty BUFFER if (p! = buferiniu [0]) (
check_buffer ();
jei (condition_to_empty_buffer) (
p = buferiniu [0];
)
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top