未声明的Variable Cross C链接器或编译器

时间:2012-08-27 20:36:55

标签: c compilation embedded arm freertos

我正在尝试使用自己的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字段?或者我忘了包含一些文件? 我花了一整天来调试这个问题,现在我需要一些新的想法或提示。

非常感谢。

1 个答案:

答案 0 :(得分:2)

在使用之前,您应该尝试添加一个真实的声明:

extern unsigned long ulTIM6_OverflowCount;

最好在task.hmain.c包含的task.c标题中。