首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreeRTOS vTaskGetRunTimeStats

FreeRTOS vTaskGetRunTimeStats
EN

Stack Overflow用户
提问于 2016-01-11 19:23:39
回答 1查看 7.2K关注 0票数 1

首先,我正在使用EFM32开发环境构建巨型壁虎SiLabs,并希望通过vTaskGetRunTimeStats()跟踪任务的使用情况。首先,我使用了STK3700_freertos_tickless,它有两个任务--一个是我添加的:

代码语言:javascript
复制
static char cBuffer[ 512 ];
vTaskGetRunTimeStats( cBuffer );

给我的FreeRTOSConfig.h:

代码语言:javascript
复制
#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

现在,首先-我删除了:

代码语言:javascript
复制
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 to ulHighFrequencyTimerTicks‘./FreeRTOS/efm32gg/tasks.o:在函数uxTaskGetSystemState': C:\Users\Chris\SimplicityStudio\v3_workspace\STK3700_freertos_tickless\GNU ARM v4.8.3 - Debug/../FreeRTOS/efm32gg/tasks.c:1815: undefined reference to ulHighFrequencyTimerTicks’./FreeRTOS/efm32gg/tasks.o:在函数vTaskSwitchContext': C:\Users\Chris\SimplicityStudio\v3_workspace\STK3700_freertos_tickless\GNU ARM v4.8.3 - Debug/../FreeRTOS/efm32gg/tasks.c:2173: undefined reference to ulHighFrequencyTimerTicks的收藏品2.exe:错误: ld返回一个退出状态:* STK3700_freertos_tickless.axf错误1

如果我把它放在tasks.c中以删除错误,那么我的演示程序就会被卡在

代码语言:javascript
复制
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中把它作为一个外挂是行不通的。

缺少哪一种设置?将高滴答度移动到tasks.c有效吗?

谢谢你,克里斯

更新1:

在FreeRTOSconfig.h中添加了函数:

代码语言:javascript
复制
/* 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()

C分别:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 Linker ARM - -o eabi- -g -g侏罗-2-mcpu=C m3 -mthumb -T "STK3700_freertos_tickless.ld“-Xlinker -gc-specs -Map="STK3700_freertos_tickless.map”-specs=nan.specs-o STK3700_freertos_tickless.axf“./src/低功耗_tick_management.o ement.o "./src/main.o”.“"./emlib/em_cmu.o“./emlib/em_gpio.o”"./emlib/em_int.o“./emlib/em_lcd.o”./emlib/em_rmu.o“./emlib/em_rtc.o”./emlib/em_rtc.o“.”"./FreeRTOS/efm32gg/port_gcc.o“./FreeRTOS/efm32gg/port_1.o "./FreeRTOS/efm32gg/list.o”./FreeRTOS/efm32gg/port_gcc.o“../FreeRTOS/efm32gg/Quee.o "./FreeRTOS/efm32gg/tasks.o”./FreeRTOS/efm32gg/timers.o“./驱动器/secmentlcd.o”./驱动器/睡眠“./CMSIS/efm32gg/stasks.o”“/CMSIS/efm32gg/timers.o”./CMSIS/efm32gg/timers.o“/CMSIS/efm32gg/system_ efm32gg.o“"./BSP/bsp_trace.o”-Wl,-start-group -lgcc -lc -lnosys -Wl,-end-group ./src/main.o: In function LcdPrint': C:\Users\Chris\SimplicityStudio\v3_workspace\STK3700_freertos_tickless\GNU ARM v4.8.3 - Debug/../src/main.c:61: undefined reference to vTaskGetRunTimeStats‘g.2.exe: error: ld返回1退出状态:* STK3700_freertos_tickless.axf错误1

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

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

更新2:

忘了更新1,代码起作用了--一个干净的项目成功了。

但是现在它确实是一个heap_1.c问题,被困在assertEFM函数中。

代码语言:javascript
复制
file    "../FreeRTOS/efm32gg/heap_1.c"  
line    153 

我也将尝试使用更小的sprintf代码来增加堆栈+。最好,C

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-11 20:54:05

我想这里有几件事搞混了。

首先,我不知道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。如果要使用将收集的统计数据格式化为人类可读表的助手函数之一,则只需要1。FUNCTIONS

然后,如前所述,卡在vPortFree()中与链接器问题无关。我猜你被困在configASSERT()中了吧?如果是这样,则尝试释放第一次调用pvPortMalloc()未分配的内存块,或者试图释放已损坏的内存块,或者尝试释放同一内存块两次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34729422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档