En muchos casos, será posible dividir las tareas en aquellas que requieren cantidades muy pequeñas y predecibles de trabajo que se realizarán en momentos arbitrarios en respuesta a eventos externos, cantidades de trabajo moderadamente pequeñas que se programarán a intervalos regulares, cosas lo que se espera que se realice de manera razonablemente rápida pero que no tenga un requisito de tiempo en particular, y las cosas que deben seguir un flujo de programa a largo plazo (por ejemplo, una interfaz de usuario de solicitud). Las cosas asíncronas se hacen mediante interrupciones asíncronas; las cosas programadas se hacen por un tic temporizador. Las cosas no críticas en el tiempo se realizan mediante una rutina poll()
a la que se llama, por ejemplo, a la espera de que se presione un botón, y el flujo de la interfaz de usuario se maneja usando el "flujo de programa normal" [por ejemplo, cuando el usuario ingresa a un menú, la ejecución del programa ingresará a una rutina para manejar ese menú, y solo saldrá de esa rutina cuando el usuario abandone el menú].
Si el tiempo total pasado en el peor de los casos en eventos asíncronos en cada marca está por debajo de la fluctuación de tiempo permitida para los eventos periódicos, y si el tiempo combinado en el peor caso para los eventos periódicos y eventos asíncronos en una marca es menor que la duración La garrapata, entonces las cosas son muy simples. Si uno tiene dos conjuntos de eventos que se supone que ocurren a intervalos de 1 ms, y si el tiempo del caso más desfavorable para cada uno es significativamente inferior a 500us, puede ser útil definir una interrupción que se ejecute cada 500us y maneje los dos eventos alternativamente.
El uso de un sistema operativo en tiempo real puede permitirle cumplir con una variedad de requisitos de tiempo complicados en los casos en que una combinación de programación fija e interrupciones de prioridad fija no sería adecuada, pero en los casos en que los métodos más simples serían suficientes utilizando una El sistema operativo en tiempo real puede ser excesivo.
En algunos procesadores, si hay más de una tarea que requiere un "flujo de programa lógico" en lugar de tener una rutina que siempre ingresa en la parte superior y usa indicadores para controlar su estado, puede ser útil definir un simple " método de cambio de tarea ". En el 8051, si hay exactamente dos de estas tareas, tal método sería:
_TaskSwitch: ; Assumes all registers may be freely trashed on a subroutine call
mov a,AltSP
xchg a,SP
mov AltSp,A
ret
No hay mucho que hacer. Un "sistema operativo" de cuatro instrucciones! Para configurarlo, uno debe definir una región de memoria para usar como la pila de la segunda tarea, almacenar al principio la dirección de la primera rutina que se ejecutará usando la segunda pila y configurar AltSP justo después de esa dirección almacenada. La primera llamada a TaskSwitch cambiará a esa pila, abrirá la dirección almacenada y comenzará a ejecutar el código desde allí.
Tenga en cuenta que el código anterior no es un sistema operativo en tiempo real, pero he usado ese enfoque en varios proyectos. Tenga en cuenta que no hay nada en la lógica de cambio de tarea para manejar la programación. Si una tarea tiene mucho trabajo que hacer pero llama a _taskswitch periódicamente para garantizar que la otra tarea tenga la oportunidad de ejecutarse, y la otra tarea no hace más que esperar a que expire el temporizador, entonces cada llamada _taskswitch hará que la ejecución cambie a la segunda tarea que luego verá que el temporizador aún no ha expirado y llama a _taskswitch para volver a la primera. Todo el cambio de tareas puede parecer inútil, pero en realidad ocurre en menos tiempo de lo que gastaría un RTOS más sofisticado al determinar que no era necesario un cambio de tarea.