Esto suena muy razonable, siempre y cuando tenga en cuenta que acceder a los mismos datos mediante el código normal y el código de interrupción puede causar problemas, si sucede al mismo tiempo.
Imagínese, tiene un búfer para enviar datos a través de USB y un contador para el número de bytes de datos que realmente están dentro del búfer.
En realidad, hay 10 bytes para enviar en el búfer, por lo que counter
= 10.
Si su código desea agregar tres bytes más, lo hará:
- Lea
counter
para saber en qué posición del búfer deben insertarse los bytes
- Escriba los bytes en las posiciones 11, 12, 13
- Aumente
counter
en 3, ya que ahora hay tres bytes más en el búfer.
La rutina de USB llamada más tarde, será para esto:
- Lea
counter
para saber cuántos bytes deben enviarse
- Envía esos bytes
- Establezca
counter
en cero
Ahora, si la rutina USB es llamada por una interrupción del temporizador, se llama mientras su función normal está ejecutando una línea aleatoria. Por ejemplo, puede llamarse justo después de que la función normal haya procesado el paso 2. ¿Qué sucede?
- La rutina normal ya ha escrito los nuevos bytes en las posiciones 11, 12 y 13.
- La rutina USB lee
counter
, que todavía es 10, y por lo tanto envía solo los primeros diez bytes en el búfer. Después, establece counter
en cero.
- La rutina normal continúa donde se interrumpió y aumenta
counter
en tres. Es counter
= 3!
El código no solo ignora los nuevos tres bytes. En la próxima llamada, la rutina USB enviará los primeros tres bytes en el búfer, que son los mismos tres bytes enviados por la última llamada.
Para evitar este problema, simplemente haga todo el procesamiento de datos / lectura de botones mientras que la interrupción del temporizador llama a la rutina USB. Tan pronto como desee colocar datos en el búfer, deshabilite la interrupción / temporizador, escriba en el búfer y a counter
, y habilite la interrupción nuevamente.
La rutina USB se debe llamar al menos una vez dentro de un intervalo de tiempo determinado. Si su tiempo es demasiado apretado, es posible que exceda el intervalo al desactivar la interrupción. Por lo tanto, llame a la rutina del USB manualmente después de deshabilitar la interrupción, o elija un período mucho más corto para su temporizador.