1

我正在尝试使用自己的 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 ...

文件中的宏端口ALT_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。制作文件来自 CortexM3 的优秀教程,它可以选择添加所有 INC 和 SRC 目录,链接器也来自这个项目。我的问题是我必须在哪里搜索错误:在链接器中?编译器?还是在项目中?当我使用另一个链接器(来自 chibiOS 项目)时,我没有收到任何错误,但我得到了一个损坏的 elf 文件。链接器是否有可能没有看到 main.c 字段?或者我忘了包含一些文件?我整天都在调试这个问题,现在我需要一些新的想法或提示。

非常感谢。

4

1 回答 1

2

You should try adding a true declaration before using it:

extern unsigned long ulTIM6_OverflowCount;

Preferably in a header like task.h that's included by both main.c and task.c.

于 2012-08-27T20:39:44.877 回答