You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言如何在ARMv7M裸机环境下一次性原子读取多个变量

ARMv7M裸机场景下无锁原子读取三变量方案

该场景属于典型的单方向抢占实时模型:仅高优先级线程可抢占低优先级执行流,高优先级线程自身运行全程不会被打断,完全不需要引入互斥锁这类会阻塞、增加高优线程开销的机制,以下两个方案都满足高优线程时间关键的约束。


方案1:读侧临时配置BASEPRI寄存器(最推荐,高优线程零修改)

ARMv7M架构自带的BASEPRI寄存器可以实现细粒度的优先级屏蔽,完全不需要修改高优先级线程的任何代码,所有逻辑都在低优先级读侧实现:

  • 读取操作开始前,向BASEPRI寄存器写入高优先级线程对应的优先级值,此时所有优先级不高于该值的抢占都会被临时阻塞,高优先级线程无法打断当前读流程
  • 连续读取a/b/c三个变量到本地副本
  • 读取完成后,将BASEPRI寄存器恢复为原值,被暂挂的高优先级线程会立刻得到调度

方案优势

  • 对高优先级线程零额外开销:不需要改动高优线程的任何指令,不存在死锁、阻塞风险
  • 临界区极短:整个操作仅包含2次寄存器写入、3次32位内存读取,总共不超过10个CPU周期,给高优线程带来的最大调度延迟仅为几个周期,完全满足硬实时要求
  • 实现简单:不需要额外的变量、校验逻辑

注意事项

不要使用cpsid i指令关闭全局中断,该操作会屏蔽NMI、HardFault等高优先级系统异常,存在系统稳定性风险,用BASEPRI做精确优先级屏蔽即可。


方案2:版本号重试校验(无中断配置修改,可移植性强)

如果不希望操作中断优先级配置,可以用版本号一致性校验的方案,仅需要在高优先级线程的操作末尾增加1条单周期自增指令,对时间关键路径的影响可以忽略:

  1. 新增一个单调递增的版本计数变量seq,初始值为0
  2. 在高优先级线程三个变量更新操作的最后,执行一次seq自增,修改后的高优线程代码如下:
_Atomic uint32_t a, b, c, seq = 0;

void thread_high_priority(void)
{
  atomic_fetch_sub_explicit(&a, 1, memory_order_relaxed);
  atomic_fetch_add_explicit(&b, 1, memory_order_relaxed);
  atomic_fetch_sub_explicit(&c, 1, memory_order_relaxed);
  atomic_fetch_add_explicit(&seq, 1, memory_order_relaxed); // 仅新增1条自增指令
}
  1. 低优先级线程读时循环校验前后版本号,版本号一致说明读取过程没有被高优线程抢占,拿到的是一致快照,读侧实现如下:
void thread_low_priority(void)
{
  uint32_t _a, _b, _c, seq_snapshot1, seq_snapshot2;
  do {
    seq_snapshot1 = atomic_load_explicit(&seq, memory_order_acquire);
    _a = atomic_load_explicit(&a, memory_order_relaxed);
    _b = atomic_load_explicit(&b, memory_order_relaxed);
    _c = atomic_load_explicit(&c, memory_order_relaxed);
    seq_snapshot2 = atomic_load_explicit(&seq, memory_order_acquire);
  } while (seq_snapshot1 != seq_snapshot2);
  // 此处_a、_b、_c为一致性快照
}

方案优势

  • 高优线程开销极低:仅新增1条32位自增指令,执行时长不到1个CPU周期,远低于互斥锁的加锁解锁开销
  • 不需要修改任何中断配置,代码可跨架构移植
  • 绝大多数场景下第一次读取就能满足版本一致的条件,重试概率极低,读侧开销极小

原直接读取写法的问题

低优线程顺序读取三个变量的逻辑存在一致性风险:高优线程可能抢占发生在读取a之后、读取b之前,此时a读到的是修改前的值,b/c读到的是修改后的值,三个变量不属于同一个状态快照,逻辑会出错。

内容的提问来源于stack exchange,提问作者Taiyou Kuo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:39:32