FreeRTOS vTaskGetRunTimeStats

FreeRTOS vTaskGetRunTimeStats

本文关键字:vTaskGetRunTimeStats FreeRTOS      更新时间:2023-10-16

首先,我正在使用SiLabs IDE在Giant Gecko EFM32上进行构建,并希望通过vTaskGetRunTimeStats()跟踪我的任务使用情况。因此,首先,我使用STK3700_freertos_tlickless有两个任务——我添加了其中一个:

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;

并将其移动到任务.c,正如我得到的:

/FreeRTOS/efm32gg/tasks.o:在函数vTaskStartScheduler': C:UsersChrisSimplicityStudiov3_workspaceSTK3700_freertos_ticklessGNU ARM v4.8.3 - Debug/../FreeRTOS/efm32gg/tasks.c:1532: undefined reference to ulHighFrequencyTimerTicks中/FreeRTOS/efm32gg/tasks.o:在函数uxTaskGetSystemState': C:UsersChrisSimplicityStudiov3_workspaceSTK3700_freertos_ticklessGNU ARM v4.8.3 - Debug/../FreeRTOS/efm32gg/tasks.c:1815: undefined reference to ulHighFrequencyTimerTicks中/FreeRTOS/efm32gg/tasks.o:在函数vTaskSwitchContext': C:UsersChrisSimplicityStudiov3_workspaceSTK3700_freertos_ticklessGNU ARM v4.8.3 - Debug/../FreeRTOS/efm32gg/tasks.c:2173: undefined reference to ulHighFrequencyTimerTicks的collect2.exe中:错误:ld返回1退出状态make:***[STK3700_freertos_tlickless.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中把它作为外部错误是行不通的。

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

提前感谢Chris

更新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_tlickless示例代码:

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_tlickless.axf调用:GNU ARM C链接器arm none eabi gcc-g-gdwarf-2-mcpu=cortex-m3-mthumb-T"STK3700_ freertos_-Xlinker--gc节-Xlinker-Map=";STK3700_ freertos_--specs=nano.specs-o STK3700_freertos_tlickless.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/面包丁&"/FreeRTOS/efm32gg/heap_1.o";&"/FreeRTOS/efm32gg/list.o"&"/FreeRTOS/efm32gg/port_gcc.o";&"/FreeRTOS/efm32g/queue.o"&"/FreeRTOS/efm32gg/tasks;&"/FreeRTOS/efm32gg/timers&"/驱动器/分段液晶显示器;&"/驾驶员/睡眠&"/CMSIS/efm32g/startup_gcc_efm32g.o";&"/CMSIS/efm32g/system_efm32g.o"&"/BSP/BSP_trace.o";-Wl,--起始组-lgcc-lnosys-Wl,--结束组/src/main.o:在函数LcdPrint': C:UsersChrisSimplicityStudiov3_workspaceSTK3700_freertos_ticklessGNU ARM v4.8.3 - Debug/../src/main.c:61: undefined reference to vTaskGetRunTimeStats的collect2.exe:error:ld返回1退出状态制造商:***[STK3700_freertos_tlickless.axf]错误1

我有#include";FreeRTOSConfig.h"#包括";FreeRTOS.h";以及#include";task.h";在我的主.c文件中。任务.h包含:void vTaskGetRunTimeStats(char*pcWriteBuffer)PRIVILEGED_UNCTION;

还有最后的想法吗?快到了!C

更新2:

忘记更新1,代码就可以工作了——一个干净的项目就完成了。

但现在,assertEFM函数中确实存在heap_1.c问题。

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

我也会尝试使用较小的sprintf代码来增加stack+。最佳,C

我认为这里混淆了几件事。

首先,我不知道ulHighFrequencyTimerTicks通常在哪里定义或递增,它不是FreeRTOS变量,所以假设它是应用程序的一部分。这是有意义的,因为运行时统计数据需要应用程序提供的时钟(因为时钟取决于可用的硬件)。在任何情况下,它都只是一个变量,因此适用普通的C范围规则。我预计它将在一个文件中声明并递增,但定义portGET_UN_TIME_COUNTER_VALUE()来引用它意味着你试图从一个单独的文件中引用它,因此出现了链接器错误。这可以通过将变量保留在原来的位置,并在试图在范围外使用它的文件中将其声明为extern来解决。或者,在声明仅返回变量值的ulHighFrequencyTimerTicks的文件中实现一个"get"函数,并定义portGET_UN_TIME_COUNTER_value()来调用该函数。

(要回答其他注释端口GET_UN_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()首先分配的内存块,或者您正在尝试释放一个已损坏的内存块或您正在尝试两次释放同一内存块。

相关文章:
  • 没有找到相关文章