Quality RTOS & Embedded Software

 Real time embedded FreeRTOS RSS feed 
Quick Start Supported MCUs PDF Books Trace Tools Ecosystem TCP & FAT




Loading

trace hook macros (PIC24)

Posted by paraparvy on July 6, 2016

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)

Posted by rtel on July 6, 2016

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)

Posted by paraparvy on July 6, 2016

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)

Posted by rtel on July 6, 2016

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)

Posted by paraparvy on July 6, 2016

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)

Posted by paraparvy on July 6, 2016

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


trace hook macros (PIC24)

Posted by paraparvy on July 6, 2016

...and IN/OUT macros are working...

Thanks a lot for all your help...much appreciated


trace hook macros (PIC24)

Posted by paraparvy on July 7, 2016

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)

Posted by rtel on July 7, 2016

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)

Posted by paraparvy on July 7, 2016

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)

Posted by paraparvy on July 7, 2016

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)

Posted by rtel on July 7, 2016

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


trace hook macros (PIC24)

Posted by paraparvy on July 7, 2016

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)

Posted by rtel on July 7, 2016

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)

Posted by paraparvy on July 7, 2016

OK, thanks a lot


[ Back to the top ]    [ About FreeRTOS ]    [ Sitemap ]    [ ]




Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.

Latest News

FreeRTOS kernel V10 is available for immediate download. Now MIT licensed.


FreeRTOS Partners

ARM Connected RTOS partner for all ARM microcontroller cores

IAR Partner

Microchip Premier RTOS Partner

RTOS partner of NXP for all NXP ARM microcontrollers

STMicro RTOS partner supporting ARM7, ARM Cortex-M3, ARM Cortex-M4 and ARM Cortex-M0

Texas Instruments MCU Developer Network RTOS partner for ARM and MSP430 microcontrollers

OpenRTOS and SafeRTOS