RTOS lock
Good morning,
I have an RTOS with some simple tasks, in particular one is used to blinking some leds, and another to write on a serial port. The system work fine, but if I insert in the serial port task some instruction I have a system lock (indentified because the leds dont blink). In paricular this code work fine:
static void vEnOceanTask( void *pvParameters )
{
char *testcar2;
for (;;)
{
CFM_Init ();
vTaskDelay( 50000 );
}
}
and this code:
static void vEnOceanTask( void *pvParameters )
{
char *testcar2;
for (;;)
{
CFM_Init ();
sprintf ( testcar2, "%X", 0x10);
vTaskDelay( 50000 );
}
}
The only different instruction is the "sprintf".
It seems that long blocking routines cause some errors in task manager of RTOS…
Unfortunly I can’t debug the board with Eclipse debugger because I have some problem with this.
RTOS lock
Hi,
testcar2 is only a pointer. You need to pass a buffer to sprintf function like
char testcar2[20];
sprintf ( testcar2, "%X", 0x10);
otherwise you have a buffer overflow.
For sure you have to try if this suggestion resolve your problem! ;-)
Regards,
Stefano
RTOS lock
If this is really the complete vEnOceanTask function:
static void vEnOceanTask( void *pvParameters )
{
char *testcar2;
for (;;)
{
CFM_Init ();
sprintf ( testcar2, "%X", 0x10);
vTaskDelay( 50000 );
}
}
Then you should consider yourself lucky that it crashes right away. The sprintf() call is writing characters to a random place in memory — whatever testcar2 happens to point to, since you haven’t initialized it. On the ARM processors I’m familiar with, you might be getting a Data Abort exception for writing to non-existent memory. Or, if testcar2 happens to point to actual memory, then you might be trashing the stack of some other task.
Whatever the case, this code is wrong and should not work. If you replace the declaration of testcar2 with:
char testcar2[8];
then it will probably work better.
d.
RTOS lock
Ok, ok, thanks to both you!
Just a little error! :-)
Now it work fine.
Thanks!