Hola a todos. Estoy empezando con freeRTOS y he tenido problemas al usar la funcion sprintf(). Se produce un error del tipo CORE-E0001: Trap due to stack error, occurred from instruction at 0x006466 mientras se esta ejecutando el _vPortYield del RTOS. La rutina _vPortYield se ejecuta muchas veces, y la sprintf() tambien, pero si esta esta ultima en el programa se "cuelga" a los 250uS.
static void vTaskGenerate( void *pvParameters )
{
char text_message[] = "12345678901234567890";
for( ;; )
{
vTaskDelay(250);
//...mas codigo
sprintf( text_message, "%02X:%02X", 0x10, 0x20);
//...mas codigo
glcd_text57(28,15,text_message,1,1);
}
}
Si la funcion sprinf esta comentada el programa funciona correctamente, si no lo esta se produce un error en la rutina _vPortYield, concretamente en la linea 86(MOV W0, _uxCriticalNesting).
No se si es xq la funcion sprintf no es reentrante, pero no creo xq ninguna otra tarea la esta utilizando. Es mas, si muevo ese sprintf a otra tarea del RTOS el programa funciona correctamente.
No se si es problema del RTOS, de su configuracion, del tamaño de stack o el del stak, del stack de cada tarea...el caso es q de momento he intentado adaptar alguna implementacion sencilla del printf.
Encontre esta:
http://www.menie.org/georges/embedded/printf.c, pero hay un problema que aun no he entendido. Es todo codigo ANSI C y aparentemente no hay ninguna dependencia del hardware, pero en el MPLAB C30 no me funciona correctamente y en el PC si.
Depurando paso a paso en el MPLAB y en el CodeBlocks he visto que hay alguna diferencia en como incrementa los punteros...no se...
volviendo al tema principal, necesito saber exactamente como se trabaja con una funcion que tiene un numero de argumentos variable, xq no estoy seguro si el fallo empieza por ahi...
la funcion tiene esta forma:
int printf(const char *format, ...)
{
int *varg = (int *)(&format);
return print(0, varg);
}
donde *varg apuntara a los argumentos opcionales, que unas veces seran char, int o float... ademas para apuntar al iguiente argumento utiliza (char *)(*varg++) si es un numero y *((char **)varg++) si es un string...
-Si alguien esta dispuesto esta dispuesto a ejecutar paso a paso el codigo en el MPLAB y en PC para aveiguar donde esta la diferencia, prometo hablar de él a todas las chicas con las que me cruce x la calle durante todo un mes... pensaoslo, son mucha chicas...
- Si alguien tiene mas experiencia con RTOS y cree que el fallo esta en algo de la configuracion o algo asi solo les hablare de él durante dos semanas, ya que esta cuestion requiere menos esfuerzo...
Saludos a todos..
PD:Si hay alguna chica y mi recompensa no le parece interesante o le parece machista o cualquier cosa asi, no hay problema, volvere atras en el tiempo y no escribire este post.
-alguien