Estoy recopilando datos de varias docenas de sensores en un bus SPI de 8 MHz a 400 Hz. Es crítico que los sensores se muestren a esta velocidad sin paquetes perdidos. Para hacer esto, tengo un temporizador (al que me referiré como TimerA) que provoca una interrupción cada 2,5 milisegundos. Para almacenar la gran cantidad de datos, estoy usando una tarjeta SD.
Aquí está mi flujo de programa actual
- Dentro del TimerA ISR, los datos se recopilan de todos los sensores. Esto toma aproximadamente 1 milisegundo.
- Esta muestra de datos se almacena en un búfer FIFO. El búfer puede almacenar hasta 400 muestras (1 segundo de datos).
- Cada vez que se escribe una muestra en el búfer, se incrementa un índice k . k realiza un seguimiento del número de muestras en el búfer FIFO.
- El bucle main () mira el índice k . Si k > 0, extrae una entrada del búfer FIFO, la procesa y luego almacena el resultado en el búfer de escritura de la tarjeta SD. k está decrementado.
- Una vez que el búfer de escritura de la tarjeta SD alcanza 512 bytes, el búfer de escritura de la tarjeta SD se escribe en la tarjeta SD.
Sé que tener la adquisición de datos dentro del TimerA ISR es un no-no, ya que el código ISR debe ser corto y fácil. Originalmente hice que el TimerA ISR levantara una bandera que se manejaría en main (), pero durante las escrituras largas en la tarjeta SD perdería varias muestras de datos.
Mi pregunta es: ¿es aceptable mi flujo de programa actual? ¿O es que el código de adquisición de datos dentro del TimerA ISR va a causar problemas?