RT-Thread Studio刚新建工程后直接打开main.c编译就board.c里产生报错,解决办法

发布时间 2023-10-28 16:56:36作者: 这个菠萝好咸

如题,RT-Thread Studio刚新建工程后直接打开main.c编译就产生报错。

具体为:刚新建了一个stm32F407ZGT6和一个STM32F103RCT6的工程,之后啥代码也没有改,直接打开main.c文件然后编译,直接报错。

报错定位在“drivers/board.c”,再具体定位在代码“RT_WEAK void rt_hw_board_init()”。


以下是代码原码:

board.c

#include <rtthread.h>
#include <board.h>
#include <drv_common.h>

RT_WEAK void rt_hw_board_init()
{
    extern void hw_board_init(char *clock_src, int32_t clock_src_freq, int32_t clock_target_freq);

    /* Heap initialization */
#if defined(RT_USING_HEAP)
    rt_system_heap_init((void *) HEAP_BEGIN, (void *) HEAP_END);
#endif

    hw_board_init(BSP_CLOCK_SOURCE, BSP_CLOCK_SOURCE_FREQ_MHZ, BSP_CLOCK_SYSTEM_FREQ_MHZ);

    /* Set the shell console output device */
#if defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE)
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

    /* Board underlying hardware initialization */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

}

解析:

RT_WEAK是一个RT-Thread特有的宏,用于指定一个弱函数。在C语言中,函数可以被定义为弱函数,当在其他文件中有相同名字的强函数时,链接器会优先选择强函数,忽略弱函数。

在RT-Thread中,RT_WEAK用于定义那些可以被其他文件覆盖的函数。

这个错误可能是由于编译器或环境不支持RT_WEAK这个宏。RT_WEAK是RT-Thread特有的宏,如果你在一个非RT-Thread的环境下编译这段代码,可能就会出现这样的错误。

 

可以改为:

__attribute__((weak)) void rt_hw_board_init()

 

然后编译,结果如下:0 error ,0 warning。

16:45:36 **** Incremental Build of configuration Debug for project new1 ****
make -j8 all 
arm-none-eabi-size --format=berkeley "rtthread.elf"
   text	   data	    bss	    dec	    hex	filename
  60256	   2152	   3336	  65744	  100d0	rtthread.elf

              Used Size(B)           Used Size(KB)
Flash:          62408 B               60.95 KB
RAM:             5488 B                5.36 KB

16:45:37 Build Finished. 0 errors, 0 warnings. (took 978ms)