我用STM32 keil5 在移植lwrb时会报错
lwrb.c(539): error: address argument to atomic operation must be a pointer to non-const _Atomic type ('const lwrb_sz_atomic_t *' (aka 'const _Atomic(unsigned long) *') invalid)
翻译:
lwrb.c(539):错误:原子操作的地址参数必须是指向非const _Atomic类型的指针('const lwrb_sz_atomic_t *'(又名'const _Atomic(unsigned long) *')无效)
const_Atomic 意思是常量类型的原子操作类型的指针
报错位置: w = LWRB_LOAD(buff->w, memory_order_relaxed);
原因:lwrb_sz_t lwrb_get_linear_block_write_length(const lwrb_t* buff)
函数在传入指针时用的是常量指针,但是在原子操作时需要非常量指针,这导致类型无效报错,解决方法1、在lwrb.c中宏定义禁用原子操作:#define LWRB_DISABLE_ATOMIC
解决方法2、将传入的常亮指针要不强制转换,要不就赋值给新声明的变量指针,并将报错的函数指针改为新声明的。报错函数新增如下代码
lwrb_t* buff_t;
buff_t=(lwrb_t*)buff;
并将报错的地方 buff改为新声明的buff_t即可。
w = LWRB_LOAD(buff->w, memory_order_relaxed);
r = LWRB_LOAD(buff_t->r, memory_order_relaxed);