首先,我正在使用EFM32开发环境构建巨型壁虎SiLabs,并希望通过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:在函数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:在函数vTaskSwitchContext': C:\Users\Chris\SimplicityStudio\v3_workspace\STK3700_freertos_tickless\GNU ARM v4.8.3 - Debug/../FreeRTOS/efm32gg/tasks.c:2173: undefined reference toulHighFrequencyTimerTicks的收藏品2.exe:错误: ld返回一个退出状态:* 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中把它作为一个外挂是行不通的。
缺少哪一种设置?将高滴答度移动到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()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 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 tovTaskGetRunTimeStats‘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函数中。
file "../FreeRTOS/efm32gg/heap_1.c"
line 153 我也将尝试使用更小的sprintf代码来增加堆栈+。最好,C
发布于 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()未分配的内存块,或者试图释放已损坏的内存块,或者尝试释放同一内存块两次。
https://stackoverflow.com/questions/34729422
复制相似问题