rt-thread
rt-thread copied to clipboard
add atomic support.
拉取/合并请求描述:(PR description)
[ 添加 原子操作
- [x] 原子类型定义
- [x] 用户使用 API 列表
- [x] 架构移植接口
- [x] 测试用例
- [x] ARM 架构实现
- [x] RISC-V 架构实现
- [ ] X86 架构实现
- [ ] 其他架构
性能测试
- [ ] 单核下相比于关中断性能比较
- [ ] 多核下相对于关中断性能比较
- [ ] 将内核中全局变量关中断的地方改完原子操作能否提升内核性能?(线程切换时间?中断响应延时?网络吞吐速度?)
如何融合到内核中,提升内核性能?
]
以下的内容不应该在提交PR时的message修改,修改下述message,PR会被直接关闭。请在提交PR后,浏览器查看PR并对以下检查项逐项check,没问题后逐条在页面上打钩。 The following content must not be changed in the submitted PR message. Otherwise, the PR will be closed immediately. After submitted PR, please use a web browser to visit PR, and check items one by one, and ticked them if no problem.
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
- [x] 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
- [ ] 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
- [ ] 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
- [ ] 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
- [ ] 没有垃圾代码,代码尽量精简,不包含
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up - [ ] 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
- [ ] 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
- [ ] 本拉取/合并请求代码是高质量的 Code in this PR is of high quality
- [ ] 本拉取/合并使用formatting等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
赞! RISC-V计划啥时候上线?
关联 #1339
赞! RISC-V计划啥时候上线?
关联 #1339
risc-v 好像有工具链内联函数哎
PR title是否也需要调整的,stomic or atomic?
@GuEe-GUI 麻烦关注其中的aarch64实现情况;
@Guozhanxin 对于ARM32来说,需要分别来多做验证,包括:arm7,arm cortex-m0/m3/../m7(后面几个估计都有对应的,前面的可能反而是麻烦的),arm cortex-a的情况。
建议增加以下接口:
使用频率较高的接口
rt_atomic_t rt_atomic_read(rt_atomic_t *ptr);
void rt_atomic_inc(rt_atomic_t *ptr);
void rt_atomic_dec(rt_atomic_t *ptr);
可能调用方想要知道独占的情况:
rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr);
rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);
是的,M0没有,其他的都有。在scons脚本里做了处理。其他的都能正常编译通过。

建议增加以下接口:
使用频率较高的接口
rt_atomic_t rt_atomic_read(rt_atomic_t *ptr); void rt_atomic_inc(rt_atomic_t *ptr); void rt_atomic_dec(rt_atomic_t *ptr);可能调用方想要知道独占的情况:
rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val); rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val); rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr); rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);
rt_atomic_read 不应该本身就是原子的吗?
建议增加以下接口: 使用频率较高的接口
rt_atomic_t rt_atomic_read(rt_atomic_t *ptr); void rt_atomic_inc(rt_atomic_t *ptr); void rt_atomic_dec(rt_atomic_t *ptr);可能调用方想要知道独占的情况:
rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val); rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val); rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr); rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);rt_atomic_read 不应该本身就是原子的吗?
读内存数据至少需要两条指令。
建议增加以下接口: 使用频率较高的接口
rt_atomic_t rt_atomic_read(rt_atomic_t *ptr); void rt_atomic_inc(rt_atomic_t *ptr); void rt_atomic_dec(rt_atomic_t *ptr);可能调用方想要知道独占的情况:
rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val); rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val); rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr); rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);rt_atomic_read 不应该本身就是原子的吗?
读内存数据至少需要两条指令。
为什么会需要两条指令呢?地址不对齐?
为什么会需要两条指令呢?地址不对齐?
1.将目的地址加载入寄存器。 2.从内存或缓存上加载目的地址的数据到寄存器。
寄存器
可是第一步“将目的地址加载入寄存器”,寄存器属于私有化的数据吧,不存在原子操作的说法吧。也不会有人再操作这个寄存器。 就算这两个指令中间被打断,也不会对结果有影响啊。
寄存器
可是第一步“将目的地址加载入寄存器”,寄存器属于私有化的数据吧,不存在原子操作的说法吧。也不会有人再操作这个寄存器。 就算这两个指令中间被打断,也不会对结果有影响啊。
主要是屏障方面的问题,请参考:https://www.kernel.org/doc/html/v4.12/core-api/atomic_ops.html
是的,M0没有,其他的都有。在scons脚本里做了处理。其他的都能正常编译通过。
这个,如果M0没有,但是代码中使用了原子操作,这个时候怎么处理?符号找不到?
是的,M0没有,其他的都有。在scons脚本里做了处理。其他的都能正常编译通过。
这个,如果M0没有,但是代码中使用了原子操作,这个时候怎么处理?符号找不到?
目前就是会报找不到,后面计划用开关中断实现一份通用的放进来。
v5.0建议重点推进这份 PR
这里是一份无锁的rb,如果支持了atomic操作,也可以尝试下: https://github.com/DNedic/lfbb
最近在项目中有使用#include <stdatomic.h>,感觉挺方便的,是否可以直接考虑兼容呢。
或是直接用,但给不支持C11的环境做个适配?。
v5.0建议重点推进这份 PR
坚决支持,尤其是基于无锁操作衍生的例如上面提到的无锁ringbuffer等上层基础无锁设施
最近在项目中有使用
#include <stdatomic.h>,感觉挺方便的,是否可以直接考虑兼容呢。 或是直接用,但给不支持C11的环境做个适配?。
参见 https://github.com/RT-Thread/rt-thread/pull/6931