Creo que tenes un problema de conceptos, aunque esto no tiene nada que ver con un esquema multitarea o RTOS, normalmente para aprovechar al máximo los recursos de hardware con respecto a las UARTS, se deben implementar atravez de colas circulares o tambien llamados bufferes en anillo. La idea es tener un buffer en memoria de tamaño X y dos indices, cuando vas a enviar una cadena o un buffer, actualizas uno de los indices y activas la interrupcion por transmicion, en el handler del mismo vas actualizando el otro indice hasta que no los indices son iguales condicion de que no hay nada para transmitir, ahi apagas la interrupcion por transmicion. En definitiva con este metodo no esperas nada, el micro interrumpe solo cuando el buffer de transmicion esta vacio, la unica cosa a tener en cuenta es implementar una funcion que te devuelva cuando el buffer de transmicion esta vacio que te indicaria que el buffer se transmitio. En terminos generales ese es el concepto, en la web vas a encontrar doquier de implementaciones y mejor explicacion.
Gracias por la explicación.
Si... mis conceptos sobre esto están todavía formándose.
Pero si la forma que has explicado permite que se ejecuten otras "tareas" (o como quieran llamarlas) en esos tiempos de espera... como lo llamarías?....
Una cosa son conceptos y otra cosa es si lo llamamos blanco oscuro o negro claro...
El caso es que normalmente las funciones de los compiladores, incluso las funciones escritas por usuarios para uart(por ejemplo) son de este tipo
while ( TXIF == 0 );
TXREG=dato;
Eso es una manera de programar tipo: "hasta que no termine esto no sigo con otra cosa".
La manera que tu explicaste permite que se ejecuten otras tareas sin haber terminado totalmente esta. Eso no es un RTOS, no es un sistema operativo, pero es una manera de programar orientada a que parezca que se ejecutan varias cosas a la vez.... de hecho se ejecutan varias tareas a la vez... no varias instrucciones a la vez, quizás multitarea no sea la terminología correcta, pero el concepto está muy claro.
Usar bases de tiempo también permite este tipo de cosas, el ejemplo básico son dos led parpadeantes a distintas velocidades.
Combinando bases de tiempo con programacion al estilo de lo que explicaste con uart, se consigue realizar muchas tareas a la vez.
Bueno aclaremos, "mal llamadas tareas", son rutinas, subprogramas o funciones que para ser ejecutadas dependen de una condición, en este caso del contador asociado a una base de tiempos.
Bueno... yo no sé cual es la terminología correcta, pero para mi está claro lo que es una tarea, por ejemplo hacer un arroz es una tarea, que se divide en varios pasos básicos , yo voy realizando cada paso y en medio de paso y paso puedo empezar otra tarea, por ejemplo freir papas; acabar otra que había empezado hace un rato, por ejemplo freir un huevo; incluso empezar y acabar otra pequeña tarea como mirar la hora, todas esas "tareas" las hago a la vez, aunque solo doy un paso de una tarea cada vez...
Sigo pensando que la idea está clara, las terminologías serán las que sean.
Hola, lo queres hacer en lenguaje se hace utilizando las funciones setjmp y longjmp ( que serian algo asi como un no local goto )
Estas son funciones ANSI C standart, pero solo los compiladores decentes la implementan.
Ok... a ver si les echo una mirada... Lo bueno sería compilar una función de esas y ver el asm que sacan, tanto "setjmp" como "longjmp"