FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [April 2009 Threads] RTOS lockPosted by stefano664 on April 1, 2009 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.
RE: RTOS lockPosted by Stefano Oliveri on April 1, 2009 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
RE: RTOS lockPosted by dave m on April 1, 2009 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.
RE: RTOS lockPosted by stefano664 on April 1, 2009 Ok, ok, thanks to both you! Just a little error! :-) Now it work fine. Thanks!
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|