FIFO bafer u C

G

GrandAlf

Guest
Svatko pomoći s ovim, ne jako dobar u C yet.Što sam je AT89s8252 programiran s l i k ** sićuušni rtos.Imam jedan zadatak da sjedi i koristi _getkey i dodjeljuje ga 8 bitni int globalna varijabla.Ova varijabla je tada pročitao neki drugi zadatak koji procesi ako> 0.Problem je u tome što sam, ako više od jednog broja primio je u periodu manje u odnosu na vrijeme obrade,
mislim da sam ga nedostaje.Što bih želio napraviti je za _getkey zadatak da napišete u međuspremnik od 10 recimo, a zatim pročitajte ga u drugi zadatak je, naravno, kada se određeni položaj je pročitao onda bi trebao biti uništen i slijedeći u red čekanja napredovati koji će se obrađivati, dok je buffer prazan.Ja sam pretražio na webu, ali ne može naći nešto prikladno za MCUs.Sam mislio da je ovaj čip je hardverski buffer, ali u tom zahtjevu se čini da nema efekta.Da li bi jako zahvalni na bilo koji puno pomoći na ovom.

Mike

 
JA obično činiti nešto poput ovih broj fragmenata:

Code:

# define BUFSIZE 16 / * power dvaju trebali prevesti efikasno * /isparljiv nepotpisan pougljiti FIFO [BUFSIZE];

isparljiv nepotpisan rd = 0, wr = 0; / * čitati i pisati pozicijama * // * Pisati bajt u FIFO * /

FIFO [wr] = get_input_byte ();

wr = (wr 1)% BUFSIZE;/ * Pročitajte bytes from FIFO * /

dok (rd! wr =)

(

do_something_with_byte (FIFO [rd]);

rd = (III. 1)% BUFSIZE;

)

 
Brilliant, samo što sam bio obličje za.To je slično onome što sam bio težak za napraviti, ali mislim ja pijan gore u nekoliko mjesta, da mogu vidjeti gdje sada.Mnogobrojan hvala.

 
Postoji još jedan mali trik s FIFO buffers.

Ako koristite dobar FIFO veličina (16, 32, 64 ili 128 bytes) možete koristiti>> operatera umjesto%.

Ali ako koristite 256 bytes FIFO veličini i jedan bajt FIFO bafer pokazivač ne trebate bilo kakve Razdijelit operator, samo pokazivač prirast rad.

# define FIFO_BUFFER_SIZE 256

nepotpisani pougljiti FIFO [FIFO_BUFFER_SIZE];
nepotpisani pougljiti buffer [2048];

unisgned pougljiti PW *, * pr; / / korištenje odgovarajućih direktiva kompajler za jedan bajt pokazivače
unisgned pougljiti * p; / / dva-byte nišandžija

poniłtava interrupt_service_routine ()
(
PW * = get_input_byte ();
)

poniłtava glavni () (
PW = & FIFO [0]; / / Init FIFO Napiši nišandžija
PR = FIFO [0]; / / Init FIFO pročitati nišandžija

p = buffer [0];/ / U nekim rutinskim proces provjera stanja FIFO i pohraniti da biste primili bytes
/ / Linearno međuspremnik.

dok (PR! = PW) (
* p =* PR ; / / pohranu primljenih bajtova
)

/ / U drugom postupku rutinske provjere, proces i prazne bufferif (p!=BUFFER[0]) { check_buffer ();
if (condition_to_empty_buffer) (
p = buffer [0];
)
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top