找回密码
 立即注册
查看: 201|回复: 8

STC32G在读取和写入volatile修饰的uint16_t的变量时,是否是原子操作。

[复制链接]

7

主题

9

回帖

59

积分

注册会员

积分
59
发表于 2026-8-20 16:24:51 | 显示全部楼层 |阅读模式
有没有大佬测试过?

回复

使用道具 举报 送花

33

主题

3085

回帖

7234

积分

论坛元老

积分
7234
发表于 2026-8-20 16:52:05 | 显示全部楼层
这个修饰符 和 原子操作好像没关系啊
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

已绑定手机

24

主题

701

回帖

2731

积分

金牌会员

积分
2731
发表于 2026-8-20 17:05:05 | 显示全部楼层
volatile与原子操作没有关系,16位变量可以直接读写(原子操作),但对其运算仍是读改写,非原子操作
回复

使用道具 举报 送花

7

主题

9

回帖

59

积分

注册会员

积分
59
 楼主| 发表于 2026-8-20 17:32:02 | 显示全部楼层
对volatile修饰的uint16_t 变量 i++操作后;
先读到寄存器+1,
写回内存。

写回内存是一次性写入2字节,还是说高字节和低字节分别写入?
回复

使用道具 举报 送花

已绑定手机

51

主题

2750

回帖

9613

积分

论坛元老

积分
9613
发表于 2026-8-20 17:48:48 | 显示全部楼层
用软件模拟仿真看看生成的汇编指令就知道了

截图202608201750235088.jpg
回复

使用道具 举报 送花

已绑定手机

307

主题

584

回帖

2961

积分

金牌会员

积分
2961
发表于 2026-8-20 18:22:52 | 显示全部楼层
keil不支持原子操作,这个是C11里面的概念,就算keil使用c11也不支持原子操作的

点评

C251支持16位的原子操作的。  详情 回复 发表于 2026-8-20 19:15
回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17932
发表于 2026-8-20 19:15:48 | 显示全部楼层
QQ6243*** 发表于 2026-8-20 18:22
keil不支持原子操作,这个是C11里面的概念,就算keil使用c11也不支持原子操作的 ...

C251支持16位的原子操作的。
回复

使用道具 举报 送花

28

主题

156

回帖

1158

积分

金牌会员

积分
1158
发表于 2026-8-20 20:26:14 | 显示全部楼层
我看过,写入读取都是单指令,加计算就不是了,可以先读入一个临时变量,计算后写入.
回复

使用道具 举报 送花

已绑定手机

24

主题

701

回帖

2731

积分

金牌会员

积分
2731
发表于 2026-8-21 08:22:27 | 显示全部楼层
wx_F*** 发表于 2026-8-20 17:32
对volatile修饰的uint16_t 变量 i++操作后;
先读到寄存器+1,
写回内存。

那是CPU内部的事情,不用管,反正写是原子操作,
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-8 02:00 , Processed in 0.078351 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表