Para crear un sistema de subprocesos múltiples adecuado, necesita hacer un 'cambio de contexto' ver Wikipedia 'cambio de contexto' para una explicación.
El código debe hacer que el 'cambio de contexto' sea 'invisible' para cada hilo. De lo contrario, no se podrá reiniciar un subproceso de forma confiable, destruyendo el valor de hacerlo.
Para hacer un cambio de contexto invisible a cualquier subproceso en ejecución todo de su estado se debe guardar. No es suficiente simplemente guardar el SREG (registro de estado) y voltear a otra pila. Debe guardar todos los registros que puedan estar en uso. Claramente, el conjunto obvio es el archivo de registro AVR completo, 32 registros. Deberían guardarse, y el archivo de registro para el hilo que se va a reanudar se cargará de tal manera que todo se restaurará al mismo estado en el punto en que el hilo se interrumpió previamente.
Resumen: sí, un sistema de subprocesos múltiples AVR podría construirse usando un temporizador, sin embargo, su código necesita guardar y restaurar mucho más estado.
Como dije en mi comentario, un AVR que se ejecuta a su velocidad máxima de 20MHz, necesita uno o más ciclos para completar una instrucción. Se necesitarían aproximadamente 32 instrucciones y, por lo tanto, 64 ciclos para almacenar todos los 32 registros en la memoria, y aproximadamente 64 ciclos más para cargar los registros de un hilo diferente, más un poco más para la entrada y salida del IRS.
Por lo tanto, debe estimar unos 140 ciclos para crear el cambio de contexto de subprocesos múltiples más básico. Eso es 7µs a 20MHz de reloj. Le sugiero que mantenga el cambio de contexto por debajo del 10% de los ciclos de CPU disponibles para que pueda realizar algún trabajo útil. Así que la interrupción es menos frecuente que 70µs.
Un lugar posible para ayudarlo a comprender el alcance de los problemas es mirar un sistema operativo simple existente. Entonces entenderás todas las otras piezas que probablemente se necesitarán más rápidamente. Por ejemplo, algo como FreeRTOS .
Esta página 'Arduino OS' puede ayudar también.
Gran parte del código de cambio de contexto tendrá que estar en el ensamblador porque no se puede obtener de manera confiable en los registros de C. Sin embargo, debido a que el conjunto de instrucciones del AVR es relativamente simple, no debería ser demasiado difícil.
Cada hilo suele estar representado por varios fragmentos de memoria (RAM) diferentes:
1. Los valores de registro.
2. La pila
El AVR de Atmel no tiene mucha RAM, por lo que una parte incómoda es asignar suficiente pila para el subproceso, sin usar tanta memoria que no haya espacio para suficientes subprocesos.
La última pequeña arruga que recuerdo es que una salida de ISR (RETI) no es exactamente lo mismo que un retorno de la subrutina (RET), por lo que también tendrá que pensar en eso. .