Hola javicho.
Lo que te ha comentado horacioe es la idea de como llevar a cabo varias tareas "a la vez"
Si... la idea era comentar, discutir, debatir, comparar distintas maneras de conseguir esto...
, en mi caso mis programas no tienen un .. loop goto loop, sino mas bien en ese loop hay bastante código al igual que en el RSI, yo prefiero colocar lo mas importante en el RSI, todo depende del sistema y cada uno suele ser diferente del otro asi que no se puede pedir una regla general de cómo se debe hacer esto, siempre dependerá del sistema en particular que estes diseñando.
Por ejemplo tu no usas un bucle en el sentido que lo hace horacioe (y yo también),... por lo que entiendo es una "combinación" de programación "secuencial" con algunas cosas por interrupciones con una base de tiempo.
Ciertamente todo depende del caso concreto,... puede darse el caso de que el programa esté normalmente esperando una entrada pero que a la vez haga algunas cosas cada cierto tiempo, o que cierta entrada ponga en funcionamiento una tarea que se realiza cada cierto tiempo hasta que se dé otra entrada.... las combinaciones son infinitas.
Te sugiero que te plantees un par de ejemplos y busques hacerlo, por ejemplo, unos leds parpadeando a diferente frecuencia, un teclado leido desde el programa principal y RX/TX por USART a la PC, con eso será mas que suficiente para que encuentres tu mejor técnica, incluso lo puedes hacer de varias formas.
Si... ya he hecho varias pruebas de ese tipo y ahora trato de aplicar todo esto a un caso concreto algo más complejo; pero son muchas las posibles combinaciones y las posibles estrategias y a veces tengo resultados extraños según como organice las cosas... hay maneras que resultan muy inestables, incluso el pic se "cuelga" igual que un PC... puede estar varios minutos funcionando hasta que se "congela" y no hace más nada, todavía no tengo claro donde está el punto flaco.
Por ejemplo según los tiempos que le dé a cada tarea... a veces todas las tareas se activan en el mismo ciclo, ya que suele haber un múltiplo común. He probado por ejemplo a "desfasar" algunas, si dos tareas se realizan cada 100 ms, una de ellas la inicio con el contador a 50 y entonces no deberían coincidir... aunque según aprendí de reiniertl, en estos casos nunca se debe presuponer el momento en que se vá a ejecutar cada tarea.
El caso es que para las pruebas una cosa que hago es mandar por Uart al PC los tiempos que duran algunas de ellas y representar graficamente esos datos... si todo funciona bién se vé una linea más o menos recta, ejemplo:
Pero hay veces que la linea parece un peine destrozado... totalmente irregular y con saltos arriba y abajo, entonces suele acabar quedándose colgado, ejemplo:
Creo que esto me pasa sobre todo si uso bases de tiempo muy cortas, al principio llegué a probar hasta con 100 us, por ver cual era el límite, pero cuantas más tareas iba añadiendo tenía que subir el tiempo para que me funcionara.
Ahora estoy probando con 1 ms, que es una medida facil de utilizar.
La manera como lo estaba haciendo era con un bucle principal donde están todas las tareas, cada tarea activada por un flag, que se controla desde RSI, poniéndolo a 1 cuando su contador correspondiente llega al tiempo estipulado.
Yo, al contrario que javicho me preocupaba de cargar lo menos posible la RSI y dejar todo lo gordo en el bucle principal; pero veo que esto no tiene porqué ser lo mejor, sobre todo si se alarga la base de tiempo lo suficiente como para que no haya otra interrupción del timer mientras todavía está en RSI...
Y el saber cuales son las estrategias de otros me abre otras posiblidades que no se me habían ocurrido...
Saludos y gracias por las respuestas.