1 votos

Problemas de concurrencia con el búfer circular en un programa integrado

Estoy trabajando en un programa integrado en el microcontrolador TM4C123GH6PM de Texas Instruments Tiva C Series LaunchPad.

El programa debe muestrear un ADC externo en una interrupción de temporizador y enviar los valores convertidos a una cola (en este caso, un búfer circular basado en un array).

El bucle principal está transfiriendo los valores (sacando bytes de la cola) a una PC a través de UART.

Dentro de la interrupción del temporizador, se realiza una verificación para asegurarse de que hay espacio disponible en la cola. Si es así, se empujan los bytes a la cola. Si no hay espacio, se detiene el temporizador. El bucle principal transferirá los bytes restantes y volverá a iniciar el temporizador una vez que la cola esté vacía (todos los bytes se hayan transferido).

Mi problema es que el temporizador no siempre se detiene incluso si la cola está llena.

¿Podría ser un problema de concurrencia? En ese caso, ¿cómo lo soluciono?

Por cierto, he probado con locks pero esto causa interbloqueos. También me aseguré de que la cola y las variables relacionadas accesadas tanto por el bucle principal como por la interrupción del temporizador estén declaradas como volátiles.

¡Gracias de antemano! :-)

2voto

Oleg Mazurov Puntos 2150

Si su cola tiene exactamente un productor y un consumidor, asegúrese de que el consumidor tenga mayor prioridad en todo momento. Después de lograr esto, la concurrencia no causará ningún problema. La implementación depende del hardware utilizado, aquí está (mi) código utilizando una cola en el microcontrolador PIC24 -> https://github.com/felis/lcdtune/blob/master/lcdtune.c. La cola, así como la cabeza y la cola, se definen aquí -> https://github.com/felis/lcdtune/blob/master/lcdtune.c#L50, el productor está aquí -> https://github.com/felis/lcdtune/blob/master/lcdtune.c#L233, y el consumidor (la ISR) está aquí -> https://github.com/felis/lcdtune/blob/master/lcdtune.c#L102

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X