This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LC4357: configGENERATE_RUN_TIME_STATS

Part Number: TMS570LC4357
Other Parts Discussed in Thread: HALCOGEN

Hi,

I am using FreeRTOS on TMS570 provided by Halcogen 04.07.01 version.

I would like to use "portCONFIGURE_TIMER_FOR_RUN_TIME_STATS"  to check the execution time of the task its active state time etc.

Can you please guide me to define "portCONFIGURE_TIMER_FOR_RUN_TIME_STATS"  It will be great if you provide a simple example project.

Regards,

Kishor

  • Hi 

    portCONFIGURE_TIMER_FOR_RUN_TIME_STATS is not enabled in the HAL generated code. TMS570 has 4 RTI compares, and the RTI compare0 is used as the RTOS TICK timer. 

    You need to setup another timer to measure the task execution time. This timer should run at least 10x faster than the RTOS Tick timer. In the HAL example code, the tick rate is 1 Khz which is defined in freeRTOS.h:

    This means the runtime timer shall run at least with 10 kHz. The RTI module configuration GUI is hidden in HAL freeRTOS example. You have to configure the RTI Compare 1 manually. I don't have ready example now.

  • Can you explain what do you mean by manual configuration?

    I see below changes if I change Non RTOS project RTI1 to 100kHz.

    HL_rti.h

    #define RTI_UDCP1_CONFIGVALUE 10U

    HL_rti.c

    rtiREG1->CMP[1U].COMPx = 10000U;

    /** - Setup update compare 1 value. This value is added to the compare 1 value on each compare match. */
    rtiREG1->CMP[1U].UDCPx = 10000U;

    Should I load these values directly from main.c?

    Regards,

    Kishor

  • Hi Kishor,

    You need to configure FreeRTOS with the following macro set to 1 to perform runtime analysis:

    Additionally the following two macros need to be provided:

    portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
    portGET_RUN_TIME_COUNTER_VALUE()

    Which are used by the freeRTOS to configure the runtime counter timer and to get the timer value. For example:

     /* USER CODE BEGIN (1) */
    extern void RTOS_AppConfigureTimerForRuntimeStats(void);
    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() RTOS_AppConfigureTimerForRuntimeStats()
    extern uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void);
    #define portGET_RUN_TIME_COUNTER_VALUE() RTOS_AppGetRuntimeCounterValueFromISR()
    /* USER CODE END */

    And define those two functions in sys_main():

    static uint32_t RTOS_RunTimeCounter; /* runtime counter, used for configGENERATE_RUNTIME_STATS */


    void RTOS_AppConfigureTimerForRuntimeStats(void)
    {
            RTOS_RunTimeCounter = 0;
    }

    uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void)
    {
           return RTOS_RunTimeCounter;
    }

  • In freeRTOS, the compare 0 is configured in :"void prvSetupTimerInterrupt(void)" of os_port.c. You can use this function to configure the RTI compare 1:  

    The code in blue is to set RTI compare 1 compare register and compare 1 update compare register. For simplicity, U use 10*configTICK_RATE_HZ for run time counter:


    static void prvSetupTimerInterrupt(void)
    {
    /* Disable timer 0. */
    portRTI_GCTRL_REG &= 0xFFFFFFFEUL;

    /* Use the internal counter. */
    portRTI_TBCTRL_REG = 0x00000000U;

    /* COMPSEL0 will use the RTIFRC0 counter. */
    portRTI_COMPCTRL_REG = 0x00000000U;

    /* Initialise the counter and the prescale counter registers. */
    portRTI_CNT0_UC0_REG = 0x00000000U;
    portRTI_CNT0_FRC0_REG = 0x00000000U;

    /* Set Prescalar for RTI clock. */
    portRTI_CNT0_CPUC0_REG = 0x00000001U;
    portRTI_CNT0_COMP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;
    portRTI_CNT0_UDCP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;

    portRTI_CNT0_COMP1_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ / 10; //QJ
    portRTI_CNT0_UDCP1_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ / 10; //QJ


    /* Clear interrupts. */
    portRTI_INTFLAG_REG = 0x0007000FU;
    portRTI_CLEARINTENA_REG = 0x00070F0FU;

    /* Enable the compare 0 interrupt. */
    portRTI_SETINTENA_REG = 0x00000001U;

    portRTI_SETINTENA_REG |= 0x00000002U; //QJ


    portRTI_GCTRL_REG |= 0x00000001U;
    }

  • The last is to define the ISR for RTI compare 1 interrupt. You can place them in sys_main() file:

    void vPortRTOSRunTimeISR(void);

    /* USER CODE BEGIN (4) */

    void vPortRTOSRunTimeISR(void) {
           /* Clear interrupt flag.*/
           //rtiREG1->INTFLAG = 2U;
          *((volatile uint32_t *) 0xFFFFFC88)) = 2U;
          RTOS_RunTimeCounter++;    /* increment runtime counter */
    }

    Then you can get the execution total time in main():

    #if configGENERATE_RUN_TIME_STATS
         ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); /* get total time passed in system */
    #endif

    Please refer to freeRTOS manual to get more details.

  • Thank you very much, Mr. Wang, for your prompt reply, definitely I will test your method today.

  • in the above example below function is not getting executed so the return value is always 0.

    void vPortRTOSRunTimeISR(void) 

    Is there anything I need to enable to map this ISR.

    Regards,

    Kishor

  • portRTI_CNT0_COMP1_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ / 10; //QJ

    Que 1;

    /10 does is indicate the comparator 1 frequency is 10 times the OS clock?

    Que 2: for run time stat do I need to call below function from the task and declare a pointer for each task?

     vTaskGetRunTimeStats

    FYI, I have added below definition since it was giving undefined error

    #define portRTI_CNT0_FRC1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC30 ) )
    #define portRTI_CNT0_UC1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC34 ) )
    #define portRTI_CNT0_CPUC1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC38 ) )
    #define portRTI_CNT0_COMP1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC58 ) )
    #define portRTI_CNT0_UDCP1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC5C ) )

    Regards,

    Kishor

  • /10 does is indicate the comparator 1 frequency is 10 times the OS clock?

    Yes. The configCPU_CLOCK_HZ in freeRTOSConfig.h is RTI clock rather the real CPU clock (might be 300MHz). 

             

    Que 2: for run time stat do I need to call below function from the task and declare a pointer for each task?

     vTaskGetRunTimeStats

    Yes, you can use this API (vTaskGetRunTimeStats( char *pcWriteBuffer )) to get the execution times which is written to argument of this function: pcWriteBuffer

    You can also use portGET_RUN_TIME_COUNTER_VALUE to get the timer's current count value.

  • Hi Kishor,

    The RTI has two counters: counter0 and counter1. You can select either of them for RTI compares respectively. The default is that all the four compares use counter0. The compare 0 in freeRTOS example uses counter 0. 

    If you want to use counter 1 for compare 1, please write 1 to bit 4 of RTICOMPCTRL register. You can use the default setting: counter 0.

    BTW, I am not freeRTOS expert, please refer to freeRTOS manual for using run time APIs. Thanks

  • Thank you very much for your response.

    The ISR vPortRTOSRunTimeISR is not getting executed/called can you please check if there any modification is required? 

    vPortRTOSRunTimeISR(void) 

    void vPortRTOSRunTimeISR(void) {
           /* Clear interrupt flag.*/
           //rtiREG1->INTFLAG = 2U;
          *((volatile uint32_t *) 0xFFFFFC88)) = 2U;
          RTOS_RunTimeCounter++;    /* increment runtime counter */
    }

    And below of below getting called

    RTOS_AppConfigureTimerForRuntimeStats : only once.

    uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void) : I guess its periodically called

    void RTOS_AppConfigureTimerForRuntimeStats(void)
    {
            RTOS_RunTimeCounter = 0;
    }

    uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void)
    {
           return RTOS_RunTimeCounter;
    }

    Regards,

    Kishor

  • Hi  Mr. Wang,

    Why the "vPortRTOSRunTimeISR" is not getting executed in my example?

    Can you please take a look.

    Regards,

    Kishor

  • vPortRTOSRunTimeISR needs to be added to VIM table

    I also suggest you use #PROGMA INTERRUPT for the ISR in your application. It instructs the compiler to generate code for interrupt functions (registers saving and restoring).

    #pragma CODE_STATE(vPortRTOSRunTimeISR, 32)

    #pragma INTERRUPT(vPortRTOSRunTimeISR, IRQ)

    void vPortRTOSRunTimeISR(void) {
           /* Clear interrupt flag.*/
           //rtiREG1->INTFLAG = 2U;
          *((volatile uint32_t *) 0xFFFFFC88)) = 2U;
          RTOS_RunTimeCounter++;    /* increment runtime counter */
    }

  • I am thankful for your great support Mr. Wang,

    As per recommendation below is the respective code generated in the project. I observed the " vPortRTOSRunTimeISR" ISR is executed couple of times but after that the code gets stuck at dataEntry.

    dataEntry
    b dataEntry

    Can you please take a look if there any bug or the use of "portGET_RUN_TIME_COUNTER_VALUE" function.

    Regards,

    Kishor

    /*HL_sys_vim.c*/


    static const t_isrFuncPTR s_vim_init[128U] =
    {
    &phantomInterrupt,
    &esmHighInterrupt, /* Channel 0 */
    &phantomInterrupt, /* Channel 1 */
    &vPortPreemptiveTick, /* Channel 2 */
    &vPortRTOSRunTimeISR, /* Channel 3 */
    &phantomInterrupt, /* Channel 4 */
    &phantomInterrupt, /* Channel 5 */

    /*HL_sys_vim.h*/


    extern void esmHighInterrupt(void);
    extern void phantomInterrupt(void);
    extern void vPortPreemptiveTick(void);
    extern void vPortRTOSRunTimeISR(void);
    extern void vPortYeildWithinAPI(void);

    /*FreeRTOSConfig.h*/

    #define configUSE_PREEMPTION 1
    #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
    #define configUSE_FPU 1
    #define configUSE_IDLE_HOOK 0
    #define configUSE_TICK_HOOK 0
    #define configUSE_TRACE_FACILITY 1
    #define configUSE_16_BIT_TICKS 0
    #define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 75000000 ) /* Timer clock. */
    #define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
    #define configMAX_PRIORITIES ( 30 )
    #define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
    #define configTOTAL_HEAP_SIZE ( ( size_t ) 122882 )
    #define configMAX_TASK_NAME_LEN ( 16 )
    #define configIDLE_SHOULD_YIELD 1
    #define configGENERATE_RUN_TIME_STATS 1
    #define configUSE_MALLOC_FAILED_HOOK 0

    /* USER CODE BEGIN (1) */

    //extern void vConfigureTimerForRunTimeStats( void );
    //#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()

    extern void RTOS_AppConfigureTimerForRuntimeStats(void);
    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() RTOS_AppConfigureTimerForRuntimeStats()
    extern uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void);
    #define portGET_RUN_TIME_COUNTER_VALUE() RTOS_AppGetRuntimeCounterValueFromISR()

    /*OS_port.c*/

    static void prvSetupTimerInterrupt(void)
    {
    /* Disable timer 0. */
    portRTI_GCTRL_REG &= 0xFFFFFFFEUL;

    /* Use the internal counter. */
    portRTI_TBCTRL_REG = 0x00000000U;

    /* COMPSEL0 will use the RTIFRC0 counter. */
    portRTI_COMPCTRL_REG = 0x00000000U;

    /* Initialise the counter and the prescale counter registers. */
    portRTI_CNT0_UC0_REG = 0x00000000U;
    portRTI_CNT0_FRC0_REG = 0x00000000U;

    /* Set Prescalar for RTI clock. */
    portRTI_CNT0_CPUC0_REG = 0x00000001U;
    portRTI_CNT0_COMP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;
    portRTI_CNT0_UDCP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;
    portRTI_CNT0_COMP1_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ / 10; //QJ
    portRTI_CNT0_UDCP1_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ / 10; //QJ

    // portRTI_CNT0_COMP1_REG = ( configCPU_CLOCK_HZ / 2 ) / (configTICK_RATE_HZ*10); //QJ
    // portRTI_CNT0_UDCP1_REG = ( configCPU_CLOCK_HZ / 2 ) / (configTICK_RATE_HZ*10); //QJ

    /* Clear interrupts. */
    portRTI_INTFLAG_REG = 0x0007000FU;
    portRTI_CLEARINTENA_REG = 0x00070F0FU;

    /* Enable the compare 0 interrupt. */
    portRTI_SETINTENA_REG = 0x00000001U;
    portRTI_SETINTENA_REG |= 0x00000002U; //QJ

    portRTI_GCTRL_REG |= 0x00000001U;
    }

    /* Code in Main.c */

    void vEventTest_20ms1_AFE_Func(void *pvParameters)
    {
    EventBits_t xEventGroupValue;
    static char cBuffer[ 512 ];
    // int i=0;
    const EventBits_t xBitsToWaitFor = TASK1_20MS1_BIT;
    while(1)
    {
    xEventGroupValue = xEventGroupWaitBits( /*Event group to read*/
    xEventGroup,
    xBitsToWaitFor,
    pdTRUE,
    pdFALSE, // Event flag will be cleared
    //portMAX_DELAY);
    xDelay20ms); // shoud be less than task period, otherwise this will overcome task period

    if((xEventGroupValue & TASK1_20MS1_BIT)!=0)
    {
    gioSetBit(gioPORTB, 2, gioGetBit(gioPORTB, 2) ^ 1);
    //
    // Runnable
    #if configGENERATE_RUN_TIME_STATS
    ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); /* get total time passed in system */
    // vTaskGetRunTimeStats( cBuffer );
    #endif

    // vTaskGetRunTimeStats( cBuffer );

    // printf( cBuffer );
    // Counter20ms1++;
    }
    }
    }


    void RTOS_AppConfigureTimerForRuntimeStats(void)
    {
    RTOS_RunTimeCounter = 0;
    }

    uint32_t RTOS_AppGetRuntimeCounterValueFromISR(void)
    {

    return RTOS_RunTimeCounter;
    }


    void vPortRTOSRunTimeISR(void)
    // void rtiNotification(rtiBASE_t *rtiREG, uint32 notification)
    {
    /* Clear interrupt flag.*/
    //rtiREG1->INTFLAG = 2U;
    *((volatile uint32_t *) 0xFFFFFC88) = 2U;
    RTOS_RunTimeCounter++; /* increment runtime counter */

  • Hi Kishor,

    A Data Abort Exception is a response of an invalid data access. If the exception is confirmed to be a Data Abort, as the first step, check the value of the Data Fault Status Register (DFSR) of the Cortex-R CPU. Please find the value of the status registers:

         

  • the status register as in below image.

  • Can you please help me to identify the exact issue and its solution?

    Regards,

    Kishor

  • Is it correct? datasheet says write in privilege mode only.

    How to use this privilege mode?

    void vPortRTOSRunTimeISR(void)
    {

    *((volatile uint32_t *) 0xFFFFFC88) = 2U;

    RTOS_RunTimeCounter++;

    }

    Regards,

    Kishor

  • Hi,

    Can you please guide me the steps to fix this issue?

    Regards,

    Kishor

  • Hi Kishor,

    The data fault address is 0x0808000C which is out of the valid range (0x0~0x0807FFFF). You need to figure out why your code accesses this invalid location.

     privilege mode is all other modes except user mode. It is in system mode by default if using HALCoGen generated code.

  • When I try to use "vPortRTOSRunTimeISR" this function then only ( b   dataEntry) exception is happening.

    any direction of fix it?

    After enabling "configUSE_STATS_FORMATTING_FUNCTIONS " below code gets activated any relation with the bug?

    #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )
    void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer )
    {
    BaseType_t xRunningPrivileged = prvRaisePrivilege();
    vTaskGetRunTimeStats( pcWriteBuffer );
    portRESET_PRIVILEGE( xRunningPrivileged );
    }
    #endif

    Thank you very much

    Regards,

    Kishor

  • First 26 calls are happening for the ISR "vPortRTOSRunTimeISR", after this it goes to Data Abort Exception.

  • Hi Kishor,

    I am not an expert of freeRTOS, so not able to debug your code.

  • Is it related to " void vPortRTOSRunTimeISR(void)" ISR setup, because if I disable it code runs normally.

    Can you please provide any example where this ISR is used.

    Thanks and Regards,

    Kishor

  • The comment I received from FreeRTOS is as below,

    The TMS570 port distributed by TI is a bit different to our port, so the requirements for interrupt service routines may be a bit different, but the doc pages for our port say there are no special requirements for writing an ISR. Also probably depends on the compiler.

  • The moment below channel 3 interrupt disabled project executes fine but not not measure task timing.

    Thanks and Regards,

    Kishor

  • Hi Kishor,

    I asked you add the ISR name to the VIM vector table manually, so you don't have to check RTI compare1:

    Checking this one will add the ISR (vPortRTOSRunTimeISR) to VIM vector table in HL_sys_vim.c:

    You can use either way.

  • The RTI compare 0 and 1 are configured and interrupt are enabled  in  prvSetupTimerInterrupt(). Because we add RTI compare 1 to here manually, any update from HALCOGen (generate code) will delete the added code, please double check.

    prvSetupTimerInterrupt(); is called by the task scheduler, so the timer starts there.

  • I am taking care to copy below lines every time I generate new code. The function look like this.

    static void prvSetupTimerInterrupt(void)
    {
    /* Disable timer 0. */
    portRTI_GCTRL_REG &= 0xFFFFFFFEUL;

    /* Use the internal counter. */
    portRTI_TBCTRL_REG = 0x00000000U;

    /* COMPSEL0 will use the RTIFRC0 counter. */
    portRTI_COMPCTRL_REG = 0x00000000U;

    /* Initialise the counter and the prescale counter registers. */
    portRTI_CNT0_UC0_REG = 0x00000000U;
    portRTI_CNT0_FRC0_REG = 0x00000000U;

    /* Set Prescalar for RTI clock. */
    portRTI_CNT0_CPUC0_REG = 0x00000001U;
    portRTI_CNT0_COMP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;
    portRTI_CNT0_UDCP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ;

    portRTI_CNT0_COMP1_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ / 10; //QJ
    portRTI_CNT0_UDCP1_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ / 10; //QJ
    /* Clear interrupts. */
    portRTI_INTFLAG_REG = 0x0007000FU;
    portRTI_CLEARINTENA_REG = 0x00070F0FU;

    /* Enable the compare 0 interrupt. */
    portRTI_SETINTENA_REG = 0x00000001U;
    portRTI_SETINTENA_REG |= 0x00000002U; //QJ

    portRTI_GCTRL_REG |= 0x00000001U;
    }

    Thanks and Regards,

    Kishor

  • What should be next step to debug this issue?

  • If you want I can share the project.

  • Sure, It would be good if you can share the project with us. 

  • I am sharing the complete project please take a look and fix it so that I can read the absolute and percentage time using the  Run_Time_Stats feature

    ConfigGENERATE_RUN_TIME_STATS

    Regards,

    kishor

  • please give me acknowledgment after you can download the project.

    Regards,

    Kishor

  • Hello Can you please check and find out why I am hitting the exception?

    If required please do necessary modification to use Run_Time_Stats feature of RTOS.

    Regards,

    Kishor

  • This issue is not resolved, I am waiting for the solution. I can not share the complete project in this platform I tried all methods. 

  • Hi Kishor,

    Have you make the project work? I assume you did. 

  • No its not working please provide the method to share the project I will share complete project.

    It might be some bug in RTOS generated code.

    Regards,

    Kishor

  • Hi Kishor,

    I don't have a working project. 

  • FreeRTOS says its not RTOS issue, how can I fix it.  

  • Please post your project, so I can try it on my launchpad.

    The CCS doesn't have GUI for freeRTOS to display the priority, stack, and run time of all the tasks. Where and How do call the function (portGET_RUN_TIME_COUNTER_VALUE()) to get the run time for each tasks?

  • The CCS doesn't have GUI for freeRTOS to display the priority, stack, and run time of all the tasks.

    In the past have used the Stateviewer Plug-in from WITTENSTEIN to display FreeRTOS task information for a Cortex-M4 device inside CCS - see CCS/TM4C1294NCZAD: FreeRTOS debugging support in Code Composer

    Can't remember also testing with a Cortex-R device.

  • Hi Chester,

    I didn't find the stateviewer from the download center. I think it was removed from the download center:

    https://www.highintegritysystems.com/?dlm_download_category=stateviewer

  • Hi Kishor,

    Are you going to upload your project? 

  • I didn't find the stateviewer from the download center. I think it was removed from the download center:

    I agree there is no Eclipse stateviewer download link on the download center.

    However there is Eclipse Stateviewer Application Guide which is a link to a PDF document which gives the steps for how to use the Eclipse "Install New Software" option to install the Stateviewer.

    Edit: You need to create an account with WITTENSTEIN and be logged in in order for the above link to work.

    With CCS 11.2 under Linux was able to follow the steps and get StateViewer installed, and the following shows up from Help -> About Code Composer Studio -> Installation Details -> WHIS StateViewer Properties:

    Next step is try using StateViewer with a Hercules FreeRTOS project,

  • I observed the " vPortRTOSRunTimeISR" ISR is executed couple of times but after that the code gets stuck at dataEntry.

    The problem is the lack of the INTERRUPT and CODE_STATE pragmas, which means the vPortRTOSRunTimeISR function isn't defined as an interrupt handler. With the pragmas missing I can repeat the failure of the program ending up in an abort after the interrupt is executed several time.

    I.e. try changing your code to:

    #pragma CODE_STATE(vPortRTOSRunTimeISR, 32)
    #pragma INTERRUPT(vPortRTOSRunTimeISR, IRQ)
    void vPortRTOSRunTimeISR(void)
    {
        /* Clear interrupt flag.*/
        //rtiREG1->INTFLAG = 2U;
        *((volatile uint32_t *) 0xFFFFFC88) = 2U;
        RTOS_RunTimeCounter++;    /* increment runtime counter */
    }

    With that I was able to get the example running. Also, after having installed StateViewer into CCS 11.2 was also able to use the Task Table to display the Runtime information:

    The above was based upon the HALCoGen example_freeRTOSBlinky.c which just uses a task to toggle a LED, so a low CPU load in the task.