RTOS编程中的原子操作
RTOS编程中的原子操作
一、什么是原子操作
原子操作(Atomic operation)是指一种不可分割的操作,在整个操作过程中都不会被打断。
二、为什么需要原子操作
在一些可能 会被系统调度、中断等事件打断的场景的编程中,我们需要原子操作的支持来保障操作的原子性。
同时原子操作还可以在多线程编程中,保障多线程间的并发执行不出现数据竞争问题;在一些程序的同步、并发控制中,提供有效支撑。
在RTOS编程中,为了实现对临界区资源进行保护,常规的会通过 开关全局中断,调度器上锁等方式来进行处理。如果采用原子操作来替代这些处理,就能够大幅度提高临界区代码的执行效率、提升系统的运行效率,降低编程的复杂度。
三、RTOS是如何支持原子操作的
一般来说RTOS为了实现原子操作支持,都会借助芯片平台的硬件指令来进行,并为用户侧提供原子操作函数来供用户使用。
因为RTOS的原子操作支持依赖具体平台的原子操作指令与相关指令来实现,所以哪些平台有该支持呢?常规来说,采用ARM指令集的绝大多数内核、采用 RV32 指令集的大部分内核、采用 RV64 指令集的大部分内核都支持原子指令;少部分不支持的内核包括:cortex-m0、cortex-m0+、arm926、lpc214x、lpc24xx、s3c24x0、AT91SAM7、rv32m1_vega等。
- 硬实现:
所谓硬实现就是使用与具体平台(aarch64、arm、riscv)紧密相关的具体原语指令进行操作,如:aarch64中的LSE扩展和ldxr、stxr;arm中的同步原语(ldrex、ldrexb、ldrexh、ldrexd、strex、strexb、strexh、strexd);riscv中的amo指令(amoswap、amoadd、amoand、amoor、amoxor、amomx、amomaxu、amomin、amominu)。
- 软实现:
所谓软实现就是通过软件关中断的方式对操作段进行保护,操作结束后再开启中断。