MDK5 FreeRTOS AC6 报编译器不认识 __WEAK 关键字错误
今天用 AT32 WorkBench 生成了一个 FreeRTOS 工程,生成的任务函数选择了“弱定义”,就是我们可以实现自己的任务函数定义,下面是弱函数定义和我的函数定义:
__WEAK void led_task_func(void *pvParameters)
{
/* add user code begin led_task_func 0 */
/* add user code end led_task_func 0 */
/* add user code begin led_task_func 2 */
/* add user code end led_task_func 2 */
/* Infinite loop */
while (1)
{
/* add user code begin led_task_func 1 */
vTaskDelay(1);
/* add user code end led_task_func 1 */
}
}
我重新在其它文件中进行定义实现:
void led_task_func(void *pvParameters)
{
while (1)
{
state_led_toggle();
vTaskDelay(pdMS_TO_TICKS(100));
}
}
编译时 MDK5 报了下面错误:

原因如下:

AT32 Work Bench 生成代码时我选择的 V6 版本的编译器,MDK5 包含的 FreeRTOS 实现为 GCC 版本的,而 __WEAK 为 ARMCC 的关键字,所有编译前提示 __WEAK 未定义,解决办是我们自定义 __WEAK 宏为 GCC 版本的实现(attribute((weak))),把下面宏定义到公共的头文件:
/************************************************************************************************** * @file common.h * @author 小土坡 (xiaotupo@163.com) * @brief * @version V0.1.0 * @date 2026-05-23 * * @copyright Copyright (c) 2025 by 小土坡 xiaotupo.com, All Rights Reserved. * @website https://xiaotupo.com * *************************************************************************************************/ #ifndef __COMMON_H #define __COMMON_H #ifndef __WEAK #define __WEAK __attribute__((weak)) #endif #endif
在用到 __WEAK 的地方的文件中包含 common.h,就不会再报 __WEAK 未定义了。

编译报错没有了。
