Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
原子指令-原子操作_atomic
原创征文
添加原子操作到4.0.2版本
发布于 2023-09-06 10:21:22 浏览:1426
订阅该版
[tocm] ## 0. 概述 原子操作很好用,在两三个小线程要同步变量时,不占用中断,也不过度占用资源。如果使用Mutex等并发原语进行这些优化,虽然可以解决问题,但是这些并发原语的实现逻辑比较复杂,对性能还是有一定的影响的。atomic包提供的方法会提供内存屏障的功能,atomic不仅仅可以保证赋值的数据完整性,还能保证数据的可见性,一旦一个核更新了该地址的值,其它处理器总是能读取到它的最新值。 原子操作常用的三个操作有load,store,exchange。load方法会取出addr地址中的值;store方法会把一个值存入到指定的addr地址中;如果不需要比较旧值,只是比较粗暴地替换的话,就可以使用exchange方法,它替换后还可以返回旧值。 但是原子操作只有5.0.0版本上面才有,基于现有工程使用升级内核不太现实,所以要添加一下。现在的版本是4.0.2,芯片为stm32f407,以下均为在rt-thread文件夹下的更改。 ## 1. 增加文件 增加/libcpu/arm/commom/atomic_arm.c,增加/include/rtatomic.h,添加arm硬件原子操作源文件。附件增加了arm的文件,也可以从5.0版本拉下来,其他架构添加对应的。 [rtatomic.h](https://club.rt-thread.org/file_download/d54ec1dd03f4ad66) [atomic_arm.c](https://club.rt-thread.org/file_download/fa7c1fc5860cce68) ## 2. 修改rtdef.h 增加代码段,添加原子操作定义 ```c #if !defined(__cplusplus) #if defined(RT_USING_STDC_ATOMIC) #include
typedef atomic_size_t rt_atomic_t; #elif defined(RT_USING_HW_ATOMIC) typedef volatile rt_base_t rt_atomic_t; #else /* To detect std atomic */ #if defined(RT_USING_LIBC) && defined(__GNUC__) && !defined(__STDC_NO_ATOMICS__) #include
typedef atomic_size_t rt_atomic_t; #else typedef volatile rt_base_t rt_atomic_t; #endif /* __GNUC__ && !__STDC_NO_ATOMICS__ */ #endif /* RT_USING_STDC_ATOMIC */ #endif /* __cplusplus */ ``` ## 3. 修改rtatomic.h 增加一段头文件包含,这样#defined(RT_USING_HW_ATOMIC)才能识别到 ```c #include
``` ## 4. 修改libcpu/Kconfig 增加芯片硬件原子操作定义RT_USING_HW_ATOMIC ```c config RT_USING_HW_ATOMIC bool default n config ARCH_ARM bool config ARCH_ARM_CORTEX_M bool select ARCH_ARM config ARCH_ARM_CORTEX_FPU bool config ARCH_ARM_CORTEX_M0 bool select ARCH_ARM_CORTEX_M config ARCH_ARM_CORTEX_M3 bool select ARCH_ARM_CORTEX_M select RT_USING_HW_ATOMIC config ARCH_ARM_MPU bool depends on ARCH_ARM config ARCH_ARM_CORTEX_M4 bool select ARCH_ARM_CORTEX_M select RT_USING_HW_ATOMIC config ARCH_ARM_CORTEX_M7 bool select ARCH_ARM_CORTEX_M select RT_USING_HW_ATOMIC config ARCH_ARM_CORTEX_R bool select ARCH_ARM select RT_USING_HW_ATOMIC config ARCH_ARM_MMU bool depends on ARCH_ARM config ARCH_ARM_ARM9 bool select ARCH_ARM config ARCH_ARM_ARM11 bool select ARCH_ARM config ARCH_ARM_CORTEX_A bool select ARCH_ARM select RT_USING_HW_ATOMIC ``` ## 4. 修改libcpu/SConscript 增加删去原子操作的定义 ```c if rtconfig.PLATFORM == 'armcc' and rtconfig.ARCH == 'arm' and rtconfig.CPU == 'arm926': ASFLAGS = ' --cpreproc' /* 增加内容 */ if not GetDepend('RT_USING_HW_ATOMIC'): SrcRemove(src, Glob(comm + 'atomic_arm.c')) CPPPATH = [RTT_ROOT + '/libcpu/' + arch + '/' + rtconfig.CPU, RTT_ROOT + '/libcpu/' + arch + '/common'] ``` ## 5. 实现 menuconfig一下,然后构建工程
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
redoc
这家伙很懒,什么也没写!
文章
1
回答
11
被采纳
0
关注TA
发私信
相关文章
1
探讨关于多线程一写多读是否需要保护?
2
很多变量多线程读写是使用关中断好还是使用互斥进行保护
3
关于新增原子操作找不到文件
4
rt-thread 如何原子操作时,如何实现不关闭总中断,只关闭指定优先级中断
5
多线程同时调用同一个函数哪些操作需要进行互斥处理?
6
rt-thread-master的bsp很多例程都会报错 在汇编文件中有定义 但是提示找不到
7
多线程访问链表是否需要加锁
8
cannot open source input file stdatomic.h
9
单核CortexA5 原子操作data abort
10
为什么V5版本加入的原子操作限制只能在C中使用,C++中无法使用呢
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部