En todo caso, lo importante es inicializar los LEDs desde el main, antes de llamar al RTOS.
Carl47D
Por requisitos de la Universidad estoy usando Keil uVision4, no el 5 , así que quizás no sea esa versión de RTOS. En todo caso ya solucioné el problema, lo que estaba haciendo mal era inicializar los LEDs dentro de una tarea del sistema operativo, cuando en realidad deberían inicializarse dentro del main, antes de iniciar el RTOS.
Finalmente el código quedaría así:
Código: C
#include <rtl.h> #include <stdint.h> OS_TID t_task1; uint32_t j; __task void task1 (void) { os_evt_wait_and(0x0001, 0xffff); //Espero por la señal (0x0001) de la tarea 'init' //Una vez recibida la señal, continúo for(;;) { for (j = 0; j < 1000000; j++); //Delay toggleLedR(); //Cambio el estado del LED (on - off) } } __task void init (void) { t_task1 = os_tsk_create(task1, 1); //Crea la tarea 'task1' y guarda su ID en 't_task1' os_evt_set (0x0001, t_task1); //Le envío a la tarea 'task1' un señal (0x0001) os_tsk_delete_self(); //Borro esta tarea 'init' ya que no la voy a utilizar más } int main (void) { initLedG(); //Activar relojes de los puertos, activar los bits que correspondan, etc initLedR(); //Activar relojes de los puertos, activar los bits que correspondan, etc os_sys_init(init); //Inicializa el RTOS }
P.D. Creo que en algún sitio leí que no se puede utilizar 'os_dly_wait' y 'os_itv_wait' dentro de la misma tarea, pero no me hagais mucho caso... A lo mejor lo soñé xD
You cannot mix the wait method os_itv_wait and os_dly_wait (or any other wait with a timeout) in the same task. RL-RTX maintains only one timer per task. It is used either for interval or delay waits.
En ese RTOS tenes:Disculpa xD, pensé que estaba en el código del primer post xD. No se si se note mucha diferencia usar el vTaskDelay (o equivalentes en RTX) en esta aplicación de una sola tarea, a menos que pongas a dormir al micro mientras no tenga tareas que despachar.
http://www.keil.com/support/man/docs/rlarm/rlarm_os_dly_wait.htm
http://www.keil.com/support/man/docs/rlarm/rlarm_os_itv_wait.htm
los cuales esperan cierta cantidad de ticks.
Pero para iniciar en el tema de los RTOS yo habia realizado ese delay en mi codigo xD.
Si habia problemas con iniciar las tareas, menos problemas nos ibamos a hacer metiendo mas funciones :P
Carl47D
Como dice KILLERJC en su último mensaje, tienes esas funciones para dejar pasar los ciclos de reloj que a ti te interese mientras puedes ejecutar otras tareas sin problema.
Este RTOS creo que también tiene mutex implementados, con los que imagino que se podría bloquear el acceso a ciertas áreas de memoria y dejar esperando una tarea a que otra le permita el paso.
P.D. Creo que en algún sitio leí que no se puede utilizar 'os_dly_wait' y 'os_itv_wait' dentro de la misma tarea, pero no me hagais mucho caso... A lo mejor lo soñé xD