我正在尝试使用自己的Makefile和链接器文件运行freeRTOS。问题是当我尝试使用3个文件编译项目时:
tasks.c:1614:6: error: 'ulTIM6_OverflowCount' undeclared (first use in this function)
task.c - 问题行:
void vTaskGetRunTimeStats( signed char *pcWriteBuffer )
{
unsigned portBASE_TYPE uxQueue;
unsigned long ulTotalRunTime;
/* This is a VERY costly function that should be used for debug only.
It leaves interrupts disabled for a LONG time. */
vTaskSuspendAll();
{
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
[1355] portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );
#else ...
文件中的宏portALT_GEN_RUN_TIME_COUNTER_VALUE()
FreeRTOSConfig.h中
#define portALT_GET_RUN_TIME_COUNTER_VALUE( ulCountValue ) \
{ \
TIM_Cmd( TIM6, DISABLE ); \
ulCountValue = ( ( ulTIM6_OverflowCount << 16UL ) | ( unsigned long ) TIM6->CNT ); \
TIM_Cmd( TIM6, ENABLE ); \
}
#endif /* FREERTOS_CONFIG_H */
最后我的main.c女巫我要编译:
#include "FreeRTOSConfig.h"
#include "task.h"
//problematic variable
unsigned long ulTIM6_OverflowCount = 0UL;
void main( void )
{
for( ;; );
}
错误前的编译器操作:
Compiling file: ./system_and_ST_code/STM32L1xx_StdPeriph_Driver/src/misc.c
/home/grochu/arm/arm-none-eabi-gcc-4_6/bin/arm-none-eabi-gcc -c -mcpu=cortex-m3 - mthumb -O0 -ffunction-sections -fdata-sections -Wall -Wstrict-prototypes -Wextra -std=gnu89 -g -ggdb3 -fverbose-asm -Wa,-ahlms=out/misc.lst -DSTM32L1XX_MD -MD -MP -MF out/misc.d -I. -I./ -I./include -I./portable/GCC/ARM_CM3 -I./Common/include -I./system_and_ST_code/CMSIS/CM3/DeviceSupport/ST/STM32L1xx -I./system_and_ST_code -I./system_and_ST_code/STM32L152_EVAL -I./system_and_ST_code/STM32L1xx_StdPeriph_Driver/inc -I./system_and_ST_code/Common -I./system_and_ST_code/CMSIS/CM3/CoreSupport ./system_and_ST_code/STM32L1xx_StdPeriph_Driver/src/misc.c -o out/misc.o
在我看来,变量:ulTIM6_OverflowCount应该是全局的,并且在文件task.c中是可见的 这是来自freeRTOS项目的示例,从女巫我删除了几乎所有的代码,但它是专门从IAR,没有makefile。 Make文件来自CortexM3的优秀教程,它可以选择添加所有INC和SRC目录,链接器也来自这个项目。 我的问题是我必须在哪里搜索错误:在链接器中? Compilator?还是在项目中呢? 当我使用另一个链接器(来自chibiOS项目)我没有任何错误,但我有一个损坏的精灵文件。 链接器是否可能没有看到main.c字段?或者我忘了包含一些文件? 我花了一整天来调试这个问题,现在我需要一些新的想法或提示。
非常感谢。
答案 0 :(得分:2)
在使用之前,您应该尝试添加一个真实的声明:
extern unsigned long ulTIM6_OverflowCount;
最好在task.h
和main.c
包含的task.c
标题中。