trace hook macros (PIC24)

Hi All, I am teaching myself FreeRTOS…so far so good with most of the functionality with your kind help and the excellent online documentaion. At the moment I am having some diffiulty in undesrstanding how to use the trace macros. To start with I want to see a task being switched in and out. For this exercise I have created a simple task that just prints a character to IO (using simulator mode in MPLAB x) I couldnt find much documentation (or dont know where to look) on how to use the trace macros…namely traceTASKSWITCHEDIN() and traceTASKSWITCHEDOUT() to start with This is the task that i want to see being moved in and out of the running state:
static void vPrintTask( void pvParameters ) { while(1) { printf(“.”); vTaskDelay(100/portTICKRATEMS); }
} How do i associate vPrintTask with the said trace macros? Could someone help in starting me off please? Cheers

trace hook macros (PIC24)

Store the handle of vPrintTask() in a variable, say xPrintTask. Then define your traceTASKSWITCHEDIN() and traceTASKSWITCHEDOUT() macros at the END of FreeRTOSConfig.h. The task being switched in or out is stored in the pxCurrentTCB variable. So…
#define traceTASK_SWITCHED_OUT()     
     if( xPrintTask == pxCurrentTCB ) 
     {                                
         /* xPrintTask is being switched out. */ 
     }


#define traceTASK_SWITCHED_IN()      
     if( xPrintTask == pxCurrentTCB ) 
     {                                
         /* xPrintTask is being switched in. */ 
     }

See the table on http://www.freertos.org/rtos-trace-macros.html

trace hook macros (PIC24)

Thanks OK in my main file i have the task handle as: TaskHandle_t xHandle; If i put the macros at the end of FreeRTOSConfig.h what is the best way to resolve the location of xHandle which is declared in another file? Have tried putting extern TaskHandle_t xHandle in FreeRTOSConfig.h but have compile errors… …or should I create another header file for referencing xHandle and iclude this in FreeRTOSConfig.h? Also, just for this tutorial can i use a printf statement in the macros ie at /* xPrintTask is being switched in. */
printf(“INn”); etc So in summary using extern in i get these errors: if extern statement is declared in FreeRTOSConfig.h the error is: ../FreeRTOSConfig.h:89:21: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute‘ before ‘xHandle’ In file included from ../../../Source/include/FreeRTOS.h:98:0, if extern statement is excluded from FreeRTOSConfig.h the error is: ../../../Source/tasks.c:2772:3: error: ‘xPrintTask’ undeclared (first use in this function) ../../../Source/tasks.c:2772:3: note: each undeclared identifier is reported only once for each function it appears in make[2]: *** [build/default/production/_ext/449926602/tasks.o] Error 255 (ie cannot find xPrintTask handle) and clicking on the errot takes you to traceTASKSWITCHEDOUT in task.c
else
{
    xYieldPending = pdFALSE;
    traceTASK_SWITCHED_OUT();
Thanks

trace hook macros (PIC24)

Extern the variable in the macro itself as the TaskHandle_t type will be in scope there:
traceTASK_SWITCHED_IN/OUT()
{
extern TaskHandle_t xHandle:

     if( xHandle == pxCurrentTCB ) /* etc.*/
}

trace hook macros (PIC24)

Sorry, Im being a bit dim here, but is this the correct definition? ~~~

define traceTASKSWITCHEDIN()

extern TaskHandle_t xHandle if( xPrintTask == pxCurrentTCB ) { /* xPrintTask is being switched in. */ } ~~~ as this still doesnt compile

trace hook macros (PIC24)

sorry, please ignore the last message, its compiling now after a clean build

trace hook macros (PIC24)

…and IN/OUT macros are working… Thanks a lot for all your help…much appreciated

trace hook macros (PIC24)

Hi All, I have made some progress on using trace macros. I’ve put the macro definitions in seperate file and it all seems fine. I am still playing around with the IN/OUT macros…I notice that if i have both macros “enabled” then RTOS stops running…and ive traced out where it ends up…in vApplicationStackOverflowHook() where it executes taskDISABLE_INTERRUPTS(); Just to elaborate, with the IN macro running, all is well ~~~

define traceTASKSWITCHEDIN()

extern TaskHandle_t xHandle; if( pxCurrentTCB != xHandle ) { sprintf( cBuffer, “%s switched out, %s switched in, tick count = %un”, ( ( tskTCB* ) xHandle )->pcTaskName, ( ( tskTCB* ) pxCurrentTCB )->pcTaskName, xTickCount ); printf( cBuffer ); } ~~~ However with the OUT macro also defined i end up in vApplicationStackOverflowHook() ~~~

define traceTASKSWITCHEDOUT()

extern TaskHandle_t xHandle; xHandle = pxCurrentTCB ~~~ Could someone please throw some light on this? Cheers

trace hook macros (PIC24)

1) sprintf() is probably using masses of stack, and may even be calling malloc(). 2) it is never a good idea to use any of the printf() style string formatting functions inside an interrupt, or malloc, or any other non-reentrant stack hungry function that could potentially take a long time to execute – these macros are called from inside an interrupt.

trace hook macros (PIC24)

OK, thanks…ofcourse i would never use printf etc from an ISR in a real application, this is just something im doing to learn FreeRTOS…will use the macros to toggle an I/O line or something on a demo board etc…thanks a lot

trace hook macros (PIC24)

Incidentally, if i wanted to gather task switching data etc in a real application, how would one go about doing this?…are there function available that are safe to use for formatting data in the printf style ?(task names being switched in and out, quesus being created, waiting on queues etc)…ie a safe way to log switching data for later review? Thanks

trace hook macros (PIC24)

Have you seen the trace tool? http://www.freertos.org/FreeRTOS-Plus/FreeRTOSPlusTrace/FreeRTOSPlusTrace.shtml

trace hook macros (PIC24)

Thanks, the trace tool looks fantastic; I’ll have a play around with the free edition later on…. Anyway, If I wanted to use the trace macros in a real world app, what approach do you recommend for logging the data from the macros (in light of the fact that printf, sprintf should not be used) …i.e. what sort of event logging scheme do people use? Cheers

trace hook macros (PIC24)

Something much faster than sprintf’ing – which would probably all but bring your system to a standstill. Digital outputs would be the older way, on ARM hardware ETM is the fast modern way. Not sure about the capabilities of PIC24 for trace output though.

trace hook macros (PIC24)

OK, thanks a lot