fifo búfer en C

G

GrandAlf

Guest
Cualquier persona que ayuda con esto, no es muy buena en C todavía.Lo que tengo es un AT89s8252 programado con k ** l minúscula y RTOS.Tengo una tarea que utiliza y que se sienta _getkey y lo asigna a una de 8 bits variable global int.Esta variable es leído por otra tarea que los procesos que si> 0.El problema que tengo es que si más de un número que se reciba en un período inferior a la duración del proceso, me parece que me falta.Lo que me gustaría hacer es _getkey para la tarea de escribir en un búfer de 10 de decir y,
a continuación, leer en la otra tarea,
por supuesto, cuando un lugar se lee que debe ser destruido y la siguiente en la cola subir para ser procesados, hasta que el buffer se vacía.He buscado en la web, pero no puede encontrar nada adecuado para MCUs.Yo pensaba que este chip tiene un búfer de hardware, pero en esta aplicación parece que no tienen ningún efecto.Estaría muy agradecido toda la asistencia a este respecto.

Mike

 
Me gusta hacer algo por lo general estos fragmentos de código:

Código:

# define BUFSIZE 16 / * de los dos debería poder compilar de manera eficiente * /unsigned char volátiles fifo [BUFSIZE];

volátiles sin firmar º = 0, wr = 0; / * leer y escribir posiciones * // * Se escribe un byte en FIFO * /

fifo [WR] = get_input_byte ();

wr = (wr 1)% BUFSIZE;/ * Leer bytes de FIFO * /

while (er! = wr)

(

do_something_with_byte (fifo [III]);

º = (º 1)% BUFSIZE;

)

 
Brillante, justo lo que estaba buscando.Es similar a lo que yo estaba tratando de hacer, pero creo que follar en unos pocos lugares, donde puedo ver ahora.Muchas gracias.

 
Hay otro poco trik con FIFO buffers.

Si utiliza FIFO buen tamaño (16, 32, 64 o 128 bytes) se puede usar>> en vez del operador%.

Pero si usted usa 256 bytes FIFO de tamaño y un Byte FIFO búfer puntero no es necesario dividir cualquier operador, sólo el puntero de incremento operación.

# define FIFO_BUFFER_SIZE 256

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

unisgned char * pw, pr * / / el uso adecuado de una directiva del compilador byte punteros
unisgned char * p; / / puntero de dos bytes

vacío interrupt_service_routine ()
(
* pw = get_input_byte ();
)

void main () (
pw = & FIFO [0]; / / inicio FIFO escribir puntero
pr = & FIFO [0]; / / leer el puntero de inicio FIFO

p = & buffer [0];/ / En un proceso de rutina de verificación de estado FIFO y bytes para almacenar recibido
/ / Buffer lineal.

while (pr! = pw) (
* p =* pr / / almacenar byte recibido
)

/ / En otro proceso de control de rutina,
de proceso y de vacío tampón

if (p! = buffer [0]) (
check_buffer ();
if (condition_to_empty_buffer) (
p = buffer [0];
)
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top