ARM 内核中实现原子操作

前言

起因是学习 crazyflie 的代码中出现 **__ sync_fetch_and_add ** 这个操作比较好奇,查阅后发现 __sync_fetch_and_add 有一些列的操作函数用于实现原子操作 **fetch **是先返回然后再进行 add 操作

其他同类型的原子操作函数,gcc 支持的 keil 和 **iar ** 是否支持有待查证。

原子操作的定义

补充一下原子操作的定义,最早了解这个概念是在以前学习 RTOS 的时候接触到

ARM中的硬件指令支持

相看具体实现但是尝试汇编之后还是看不到实现

后面在@穿越、寂寞≯ 兄的提醒下使用 gcc 在线编译平台编译后就可以看见具体实现的汇编指令

Compiler Explorer (godbolt.org)

关键就是使用 ldrexstrex 实现内存的排他性访问从而实现原子操作

具体参考

ARM平台下独占访问指令LDREX和STREX的原理与使用详解_Roland_Sun的专栏-CSDN博客

posted @ 2021-06-16 10:14  齐刃  阅读(803)  评论(0编辑  收藏  举报