在 RT-Thread 中开启 POSIX 支持后编译出现 __ATOMIC_ACQUIRE 未定义的错误,是因为 ARMCC V5.06 编译器不支持 C11 原子操作标准。以下是具体原因和解决方案:
编译器兼容性问题
__ATOMIC_ACQUIRE 是 GCC 编译器内建的 C11 原子操作宏。ARMCC V5.06(尤其是 MDK v5)不支持 C11 原子操作,导致该宏无法识别。
RT-Thread 的适配机制
RT-Thread 的 libc/posix 组件默认基于较新的编译器(如 GCC、Clang 或 ARM Clang)设计,对 ARMCC V5 的适配可能不完整。
POSIX TLS 依赖原子操作
文件 tlsemutls.c 使用原子操作实现线程局部存储(TLS),而 ARMCC V5 缺乏必要的内置函数。
以下是针对 ARMCC V5.06 的修改方法:
修改 rt-thread/components/libc/posix/tls/module/tlsemutls.c 文件:
替换原子交换函数
找到使用 __atomic_exchange 的位置(报错的 148 行附近),替换为以下内联汇编实现:
// 替换前代码示例:
// uintptr_t old_value = __atomic_exchange_n(&tls->lock, 1, __ATOMIC_ACQUIRE);
// 替换为 ARMCC 兼容的原子交换:
uintptr_t old_value;
__asm volatile (
"swp %0, %1, [%2]"
: "=&r" (old_value)
: "r" (1), "r" (&tls->lock)
);修改 RT-Thread 配置或代码:
在头文件中关闭原子操作
编辑 rt-thread/include/rtatomic.h,强制定义 RT_USING_C11_ATOMIC 为未支持:
#define RT_USING_C11_ATOMIC 0 // 强制禁用 C11 原子操作修改 Kconfig 配置
在项目配置中禁用 TLS 功能:
menuconfig -> RT-Thread Components -> POSIX (Portable Operating System Interface)
[ ] Enable Thread Local Storage (TLS) # 关闭此项重新生成工程并编译。
若项目允许,升级工具链可一劳永逸解决问题:
切换至 ARM Compiler 6(ARMClang)
ARMCC V5 已过时,ARM Compiler 6 支持 C11 原子操作。在 MDK 中:
Project -> Options -> Target -> ARM Compiler → 选择 V6 版本。或使用 GCC 工具链
改用 arm-none-eabi-gcc 编译 RT-Thread(如通过 scons)。
重新编译工程,原子操作相关错误应已解决:
Rebuild project...
0 Error(s), 0 Warning(s). # 编译通过
总结:优先使用 内联汇编替换原子交换函数(方法1),这是最精准的修复。若不影响功能,也可关闭 TLS(方法2)。长期推荐升级到 ARM Compiler 6 或 GCC 以满足现代编译标准。
举报
更多回帖