当前位置:首页>Linux>裸机、rtos和linux下同步手段分别有哪些?

裸机、rtos和linux下同步手段分别有哪些?

  • 2026-10-11 07:53:03
裸机、rtos和linux下同步手段分别有哪些?

在嵌入式系统中,经常会涉及资源共享或流程时序控制等需求,此时就需要在生产者与消费者之间,插入同步逻辑,以保证数据一致性和流程时序。下面就罗列了一些在裸机、rtos和linux下常用的同步手段。

一、裸机(无 OS 前后台架构)

同步手段 1:开关中断(屏蔽中断)

原理:进入临界区前关全局 / 局部中断,执行完再开中断

适用场景

  • 保护全局变量、硬件寄存器
  • 中断与主循环共享资源互斥
  • 极简临界区保护
限制
  • 关中断时间不能太长,否则丢中断、实时性变差
  • 无法做多任务优先级管理
  • 只适合简单系统,不适合复杂并发

同步手段 2:全局标志位 / 状态变量

原理:中断置标志,主循环轮询判断

适用场景

  • 中断给主循环发事件通知(串口接收、定时器事件)
  • 异步事件解耦
限制
  • 轮询空耗 CPU
  • 无阻塞等待,只能轮询
  • 多事件复杂逻辑不好管理

同步手段 3:忙等待(自旋轮询)

原理:while(!ready); 死等条件满足

适用场景

  • 等待硬件外设就绪(SPI/Flash 状态位)
  • 极短时间等待
限制
  • 独占 CPU,无法做其他任务
  • 等待时间不可控,不适合实时系统

同步手段 4:内存屏障(编译器 / CPU 屏障)

原理:阻止编译器乱序、CPU 流水线乱序

适用场景

  • 多核裸机、寄存器操作、共享内存
限制
  • 只解决指令乱序,不解决并发竞争
  • 必须配合关中断 / 标志位一起用

二、RTOS(FreeRTOS/RT-Thread/uC/ 鸿蒙轻量)

1. 二值信号量

场景:任务 ↔ 中断 同步、任务间事件唤醒

限制

  • 不适合资源计数
  • 无法保护多临界区嵌套

2. 计数信号量

场景:资源池管理(串口、缓冲区、硬件资源)、生产者消费者

限制:无所有权概念,谁都能释放,容易误释放

3. 互斥锁 Mutex

场景:多任务独占共享资源(外设、全局结构体)

限制

  • 中断上下文不能用
  • 有优先级继承,但仍可能死锁
  • 不能递归嵌套(部分 RTOS 支持递归互斥锁)

4. 事件组 Event Group

场景:一个任务等待多个事件组合触发

限制

  • 只做事件同步,不适合数据传递
  • 不适合精细资源互斥

5. 消息队列

场景:任务间带数据同步 + 通信,生产者->消费者

限制

  • 有内存开销
  • 适合整包消息,不适合简单临界区保护

6. 挂起调度器(锁任务调度)

场景:保护较长临界区,不想关中断

限制

  • 全局禁止任务切换,所有高优先级任务都不能抢占
  • 实时性下降,不能在中断里使用

7. 中断专用同步(ISR 版信号量 / 队列)

场景:中断里唤醒任务

限制

  • 中断里禁止用 Mutex、不能阻塞
  • 只能用非阻塞 ISR 接口

三、Linux

(一)Linux 用户态 同步手段

1. 互斥锁 pthread_mutex

场景:多线程临界区互斥、共享变量保护

限制

  • 只能同进程线程间使用
  • 加锁后不可重复加(普通锁),容易死锁

2. 条件变量 pthread_cond

场景:线程等待某个条件满足(生产者 - 消费者)

限制

  • 必须搭配 mutex 使用
  • 存在虚假唤醒,必须 while 循环判断

3. 读写锁 rwlock

场景:读多写少 场景(配置表、状态全局变量)

限制

  • 写饥饿问题
  • 复杂度高于普通互斥锁

4. 自旋锁 pthread_spinlock

场景:临界区执行极短,不想休眠切换线程

限制

  • 等待时 CPU 空转,占用高
  • 不适合临界区耗时久的场景

5. 无名 / 有名信号量 sem_t

场景:多线程、多进程间同步

限制

  • 无所有权,可被任意进程释放
  • 不适合复杂互斥逻辑

6. 文件锁 flock/fcntl

场景:多进程对同一文件、资源互斥

限制

  • 只能做进程级粗粒度互斥
  • 不能用于内存变量同步

(二)Linux 内核态 同步手段

1. 自旋锁 spinlock_t

场景:SMP 多核、中断上下文、临界区很短

限制

  • 禁止睡眠,不能调用会阻塞的函数
  • 等待时 CPU 忙循环

2. 互斥锁 struct mutex

场景:进程上下文、临界区可睡眠、耗时较长

限制

  • 中断 / 软中断上下文不能用
  • 只能进程上下文

3. 内核信号量 semaphore

场景:资源计数、进程间同步、可阻塞等待

限制

  • 比 mutex 重,开销大
  • 不适合高频短临界区

4. 关中断 + 自旋锁(spinlock_irqsave)

场景:防止任务与中断、多核同时竞争资源

限制

  • 关中断会轻微影响系统实时性
  • 临界区必须短小

5. 完成量 completion

场景:内核异步等待(驱动等待硬件就绪、初始化完成)

限制:专用于一次性等待,不适合循环互斥

6. RCU 读写同步

场景:读极多、写极少 内核数据结构(路由表、设备链表)

限制

  • 接口复杂、有延迟回收
  • 普通驱动很少用,只适合核心子系统
四、结语
合理使用上述裸机、rtos和linux下的常用同步方法,就可以让资源共享,时序控制等程序变得丝滑起来。

最新文章

随机文章