首页 文章

FreeRTOS vTaskGetRunTimeStats

提问于
浏览
1

首先,我使用SiLabs IDE构建Giant Gecko EFM32,并希望通过vTaskGetRunTimeStats()跟踪我的任务使用情况 . 首先,我使用STK3700_freertos_tickless,它有两个任务 - 其中一个我添加:

static char cBuffer[ 512 ];
vTaskGetRunTimeStats( cBuffer );

到我的FreeRTOSConfig.h:

#define configUSE_TRACE_FACILITY                  ( 1 )
#define configGENERATE_RUN_TIME_STATS             ( 1 )
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()  ( ulHighFrequencyTimerTicks = 0UL )
#define configUSE_STATS_FORMATTING_FUNCTIONS      ( 1 )
#define portGET_RUN_TIME_COUNTER_VALUE()          ulHighFrequencyTimerTicks

现在,首先 - 我删除了:

volatile unsigned long ulHighFrequencyTimerTicks;

并且在我得到的时候将它移动到tasks.c:

./FreeRTOS/efm32gg/tasks.o:在函数vTaskStartScheduler'中:C:\ Users \ Chris \ SimplicityStudio \ v3_workspace \ STK3700_freertos_tickless \ GNU ARM v4.8.3 - Debug /../ FreeRTOS / efm32gg / tasks.c:1532: undefined reference toulHighFrequencyTimerTicks'./FreeRTOS/efm32gg/tasks.o:in function uxTaskGetSystemState':C:\ Users \ Chris \ SimplicityStudio \ v3_workspace \ STK3700_freertos_tickless \ GNU ARM v4.8.3 - Debug /../ FreeRTOS / efm32gg / tasks.c :1815:undefined reference toulHighFrequencyTimerTicks'./FreeRTOS/efm32gg/tasks.o:In function vTaskSwitchContext':C:\ Users \ Chris \ SimplicityStudio \ v3_workspace \ STK3700_freertos_tickless \ GNU ARM v4.8.3 - Debug /../ FreeRTOS / efm32gg / tasks.c:2173:undefined reference toulHighFrequencyTimerTicks'colsall2.exe:错误:ld返回1退出状态make:*** [STK3700_freertos_tickless.axf]错误1

如果我把它放在tasks.c中以删除错误,那么我的演示就会陷入困境

void vPortFree( void *pv )
{
    /* Memory cannot be freed using this scheme.  See heap_2.c, heap_3.c and
    heap_4.c for alternative implementations, and the memory management pages of
    http://www.FreeRTOS.org for more information. */
    ( void ) pv;

    /* Force an assert as it is invalid to call this function. */
    configASSERT( pv == NULL );
}

增加我的堆没有任何帮助 . 我知道我应该解决第一个错误,但是在FreeRTOSConfig.h中将它作为extern放置是行不通的 .

缺少哪个设置?将高刻度def移动到tasks.c是否有效?

谢谢,克里斯

更新1:

在FreeRTOSconfig.h中添加了功能:

/* Run time stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS             ( 1 )
extern volatile unsigned long ulHighFrequencyTimerTicks;
extern void vConfigureTimerForRunTimeStats( void );
extern unsigned long vGetTimerForRunTimeStats( void );
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()    vConfigureTimerForRunTimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE()            vGetTimerForRunTimeStats()

和main.c分别:

void vConfigureTimerForRunTimeStats( void ) {
    CMU->HFRCOCTRL = 0x8;                           // Set High Freq. RC Osc. to 1 MHz
    CMU->HFPERCLKEN0 |= CMU_HFPERCLKEN0_TIMER3;     // Enable clock for Timer3
    TIMER3->CNT = 0x0;
    TIMER3->CTRL = ( TIMER3->CTRL & ~_TIMER_CTRL_PRESC_MASK) | TIMER_CTRL_PRESC_DIV1024; // Prescaler needed to reduce resolution, 1024
    TIMER3->CMD = 0x1;                              // Start Timer3
}

unsigned long vGetTimerForRunTimeStats( void ) {
    return ( TIMER3->CNT );
}

所有编译都很好,我的vTaskGetRunTimeStats在以下函数中调用,基于STK3700_freertos_tickless示例代码:

static void LcdPrint(void *pParameters)
{
  pParameters = pParameters;   /* to quiet warnings */
  static char sBuffer[ 240 ]; // 40 B per task

  for (;;)
  {
    /* Wait for semaphore, then display next number */
   if (pdTRUE == xSemaphoreTake(sem, portMAX_DELAY)) {  
    SegmentLCD_Write(text);
    }

   vTaskGetRunTimeStats( ( char * ) sBuffer );

  }
}

但现在我的错误是一个未定义的引用:

完成建筑:../ src / main.c构建目标:STK3700_freertos_tickless.axf调用:GNU ARM C链接器arm-none-eabi-gcc -g -gdwarf-2 -mcpu = cortex-m3 -mthumb -T“STK3700_freertos_tickless . ld“-Xlinker --gc-sections -Xlinker -Map =”STK3700_freertos_tickless.map“--specs = nano.specs -o STK3700_freertos_tickless.axf”./ src /low_power_tick_management.o“”./ src / main.o“” ./emlib/em_assert.o“”./ emlib / em_burtc.o“”./ emlib / em_cmu.o“”./ emlib / em_emu.o“”./ emlib / em_gpio.o“”./ emlib / em_int .o“”./ emlib / em_lcd.o“”./ emlib / em_rmu.o“”./ emlib / em_rtc.o“”./ emlib / em_system.o“”./ FreeRTOS /efm32gg / croutine.o“ “./FreeRTOS/efm32gg/heap_1.o”“./ FreeRTOS /efm32gg / list.o”“./ FreeRTOS /efm32gg / port_gcc.o”“ . / FreeRTOS / emm32gg / quue.o”“./ FreeRTOS / emm32gg /tasks.o“”./ FreeRTOS /efm32gg / timers.o“”./ Drivers / segmentlcd.o“”./ Drivers /sleep.o“”./ CMSIS /efm32gg / startup_gcc_efm32gg.o“”./ CMSIS / efm32gg / system_efm32gg.o“”./ BSP /à_trace.o“-Wl, - start-group -lgcc -lc -lnosys -Wl, - end-group ./src/main.o:In function Lcd打印':C:\ Users \ Chris \ SimplicityStudio \ v3_workspace \ STK3700_freertos_tickless \ GNU ARM v4.8.3 - Debug /../ src / main.c:61:未定义引用vTaskGetRunTimeStats'collect2.exe:错误:ld返回1退出状态make:*** [STK3700_freertos_tickless.axf]错误1

我的main.c文件中有#include“FreeRTOSConfig.h”#include“FreeRTOS.h”和#include“task.h” . Task.h包含:void vTaskGetRunTimeStats(char * pcWriteBuffer)PRIVILEGED_FUNCTION;

最后的想法?差不多了! C

更新2:

废料更新1,代码工作 - 一个项目干净的伎俩 .

但是现在它确实是一个被堆在assertEFM函数中的heap_1.c问题 .

file    "../FreeRTOS/efm32gg/heap_1.c"  
line    153

我也会尝试使用较小的sprintf代码来增加堆栈 . 最好,C

1 回答

  • 1

    我认为这里有几件事情混杂在一起 .

    首先,我不知道ulHighFrequencyTimerTicks通常定义或增加的位置,它不是FreeRTOS变量,因此假设它是应用程序的一部分 . 这是有意义的,因为运行时统计需要应用程序提供的时钟(因为时钟取决于可用的硬件) . 在任何情况下,它只是一个变量,因此适用正常的C范围规则 . 我希望它将在一个文件中声明和递增,但是然后定义portGET_RUN_TIME_COUNTER_VALUE()以引用它意味着您试图从单独的文件引用它 - 因此链接器错误 . 这可以通过将变量保留在原来的位置来修复,并在尝试使用它超出范围的文件中将其声明为extern . 或者,在声明ulHighFrequenyTimerTicks的文件中实现一个'get'函数,该函数只返回变量的值,并定义portGET_RUN_TIME_COUNTER_VALUE()来调用该函数 .

    (要回答另一个注释portGET_RUN_TIME_COUNTER_VALUE(),只需要求值一个值,该值可以是函数返回值,也可以是对变量的直接引用:http://www.freertos.org/rtos-run-time-stats.html

    接下来,configUSE_STATS_FORMATTING_FUNCTIONS不需要为1即可使用vTaskGetRunTimeState() . 如果要使用其中一个辅助函数将收集的统计信息格式化为人类可读表,则只需要为1 . http://www.freertos.org/a00110.html#configUSE_STATS_FORMATTING_FUNCTIONS

    然后,如前所述,卡在vPortFree()中与链接器问题无关 . 我假设你陷入了configASSERT()?如果是这样,那么你试图释放一个通过调用pvPortMalloc()而没有首先分配的内存块,或者你试图释放已经损坏的内存块,或者你试图释放相同的内存块两次 .

相关问题