STM32 - Embedded IDE - GCC - 解决LWRB库在GCC编译器会编译失败,在ARMCC编译器时却正常编译
导言
最近,开始折腾从EIDE + ARMCC的开发切换为EIDE + GCC。在移植lwrb库时碰到编译失败。原因如上图所示。
一、解决方案
在lwrb.h增加如下代码,在lwrb.h中全局禁用该库的原子特性。说白了,就是不要使用类型atomic_ulong
了,ArmClang(AC6) 自带实现,因此在 AC6 下能过,在 GCC 下就不行。。
/** Disable atomic operations by default to ensure compatibility when* this header is included from both C and C++ translation units in* embedded GCC environments. Users can override by defining* LWRB_DISABLE_ATOMIC to 0 before including this header if they* provide proper C11 atomics support across all TUs.*/
#ifndef LWRB_DISABLE_ATOMIC
#define LWRB_DISABLE_ATOMIC 1
#endif
二、有什么影响?
禁用原子性后,在“中断写/主循环读”的单生产者单消费者模式下基本无影响。
但是,禁用原子性后,失去的是严格的跨上下文内存序保证。因此,避免让同一指针在多上下文同时写即可。说白了,若项目有中断/多线程并发,给 LwRB 配上 进入/退出临界区的宏(关中断或 RTOS 互斥量),就能保证安全。