Persistir el búfer circular en todo el código C

1

Tengo un búfer circular en un dispositivo integrado que necesito para persistir en todo el código. Específicamente, necesito que se pueda usar en la parte principal y también en un controlador de interrupciones (ambos están en archivos separados). Sé cómo hacer esto en ensamblaje al cargar registros manualmente, pero tengo problemas para hacerlo de manera limpia en C.

Aprecio cualquier ayuda, ya que he intentado hacer esto durante días sin suerte.

Notas: Estoy usando un stm32f103rg que usa una corteza M3 como procesador.

    
pregunta Lightyear Buzz

2 respuestas

2

Las estructuras de datos que declare fuera de cualquier función serán visibles para todas las funciones en el programa. Debe declarar la estructura de datos en cualquier archivo fuente que necesite usarla, y debe definir la estructura de datos en exactamente un archivo fuente.

En general, puede inicializar una variable cuando la define pero no cuando la declara. Utilice el calificador extern para declarar una variable global en aquellos archivos de código fuente que no definen la variable.

    
respondido por el Joe Hass
2

En un archivo, defina la variable fuera del alcance de cualquier función (es decir, una variable global). Use el calificador de tipo volatile para decirle al compilador que no optimice las lecturas porque el valor de esta variable podría cambiar en momentos impredecibles (por ejemplo, en el controlador de interrupciones).

volatile circular_buffer_type circularbuffer;

En el otro archivo, declare la variable como extern , nuevamente fuera del alcance de cualquier función. Esto permite que el otro archivo acceda a la misma variable definida en el primer archivo. Alternativamente, puede hacer esta declaración en un archivo .h incluido en el otro archivo.

extern volatile circular_buffer_type circularbuffer;

Todos los accesos a esta variable en el código principal deben ser atomic para evitar la corrupción de variables. Por ejemplo, si su código principal realiza una lectura-modificación-escritura y la interrupción ocurre entre la lectura y la escritura, entonces la escritura del código principal sobrescribirá cualquier cambio que haya ocurrido en el controlador de interrupciones. Para evitar esta situación, puede desactivar las interrupciones antes de la lectura y volver a habilitarlas después de la escritura para que el acceso de lectura-modificación-escritura sea atómico.

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas