XWOS的锁

临界区管理

临界区是指访问共用资源的程序片段,传统RTOS中,通常使用以下几种方式保护临界区资源:

  • 使用协作式内核:线程(任务)不主动放弃CPU不会发生调度,因此共享的资源在 线程(任务)中访问都是安全的。
  • 关闭抢占:可用于保护被多个线程(任务)共享的资源。
  • 关闭中断:可用于保护线程与线程、线程与中断共享的资源。
  • 互斥锁:可用于保护被多个线程(任务)共享的资源。

XWOS内核是假定系统为MP来设计的(UP可以视为MP的特例), 因此在进入临界区的方式与传统RTOS有些区别:

  • 关闭抢占:使用自旋锁或其派生锁的lockunlock形式的API;
  • 关闭CPU总中断:使用自旋锁或其派生锁的lock_cpuirqunlock_cpuirq形式的API。 若对临界区的访问需要获取多个自旋锁或其派生锁,应该使用lock_cpuirqsvunlock_cpuirqrs 形式的API来保存与恢复CPU总中断开关标志,防止内层锁解锁时意外地把CPU总中断打开;
  • 关闭部分中断:使用自旋锁或其派生锁的lock_irqsunlock_irqs形式的API, 若对临界区的访问需要获取多个自旋锁或其派生锁,应该使用lock_irqssvunlock_irqsrs 形式的API来保存与恢复部分中断开关标志,防止内层锁解锁时意外地把这些中断打开;
  • 关闭中断底半部:使用自旋锁或其派生锁的lock_bhunlock_bh形式的API;
  • 互斥锁:只能用于保护被多个线程共享的资源;
  • 原子操作:XWOS中提供原子操作的函数库xwos/lib/xwaop.h,并抽象了std:atomic类似的内存模型。

自旋锁

XWOS的自旋锁

顺序锁

XWOS的顺序锁

互斥锁

XWOS的互斥锁