RT-Thread论坛
直播中

李艺银

8年用户 1160经验值
私信 关注
[问答]

开启POSIX支持后,编译出错的原因?怎么解决?

使用MDK525  编译器:ARMCC V5.06,rtthread打开posix支持后编译报错,提示:

  • ..rt-thread-mastercomponentslibcposixtlsemutls.c(148): error:  #20: identifier "__ATOMIC_ACQUIRE" is undefined


__ATOMIC_ACQUIRE  这个宏翻遍代码找不到,应该是跟编译器有关?


回帖(1)

wufan931111

2025-10-10 17:32:44

在 RT-Thread 中开启 POSIX 支持后编译出现 __ATOMIC_ACQUIRE 未定义的错误,是因为 ARMCC V5.06 编译器不支持 C11 原子操作标准。以下是具体原因和解决方案:


原因分析




  1. 编译器兼容性问题

    __ATOMIC_ACQUIRE 是 GCC 编译器内建的 C11 原子操作宏。ARMCC V5.06(尤其是 MDK v5)不支持 C11 原子操作,导致该宏无法识别。




  2. RT-Thread 的适配机制

    RT-Thread 的 libc/posix 组件默认基于较新的编译器(如 GCC、Clang 或 ARM Clang)设计,对 ARMCC V5 的适配可能不完整。




  3. POSIX TLS 依赖原子操作

    文件 tlsemutls.c 使用原子操作实现线程局部存储(TLS),而 ARMCC V5 缺乏必要的内置函数。






解决方案


以下是针对 ARMCC V5.06 的修改方法:


? 方法 1:内联汇编实现原子交换(推荐)


修改 rt-thread/components/libc/posix/tls/module/tlsemutls.c 文件:




  1. 替换原子交换函数

    找到使用 __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)
    );



⚙ 方法 2:强制关闭原子操作(备选)


修改 RT-Thread 配置或代码:




  1. 在头文件中关闭原子操作

    编辑 rt-thread/include/rtatomic.h,强制定义 RT_USING_C11_ATOMIC 为未支持:


    #define RT_USING_C11_ATOMIC 0  // 强制禁用 C11 原子操作



  2. 修改 Kconfig 配置

    在项目配置中禁用 TLS 功能:


    menuconfig -> RT-Thread Components -> POSIX (Portable Operating System Interface) 
        [ ] Enable Thread Local Storage (TLS)  # 关闭此项

    重新生成工程并编译。






升级编译器(长期方案)


若项目允许,升级工具链可一劳永逸解决问题:




  1. 切换至 ARM Compiler 6(ARMClang)

    ARMCC V5 已过时,ARM Compiler 6 支持 C11 原子操作。在 MDK 中:



    • Project -> Options -> Target -> ARM Compiler → 选择 V6 版本




  2. 或使用 GCC 工具链

    改用 arm-none-eabi-gcc 编译 RT-Thread(如通过 scons)。






验证修改后编译


重新编译工程,原子操作相关错误应已解决:


Rebuild project...
0 Error(s), 0 Warning(s).  # 编译通过


总结:优先使用 内联汇编替换原子交换函数(方法1),这是最精准的修复。若不影响功能,也可关闭 TLS(方法2)。长期推荐升级到 ARM Compiler 6 或 GCC 以满足现代编译标准。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分