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 版本的,而 __WEAKARMCC 的关键字,所有编译前提示 __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 未定义了。

编译报错没有了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注