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

STC32位单片机解决原子操作问题小技巧

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:688
  • 最近打卡:2026-03-07 16:27:23
已绑定手机
已实名认证

129

主题

3376

回帖

8788

积分

版主

积分
8788
发表于 2026-2-10 14:04:52 | 显示全部楼层 |阅读模式
原子操作是指一个操作要么完整执行,要么完全不执行,在执行过程中不会被其他任务或中断打断的操作。在多任务环境或中断驱动的嵌入式系统中,原子操作是确保数据一致性和正确性的关键。

而在单片机中,这个打断的来源就是随时可能到来的中断
STC32位单片机:例如一个32位变量,如果在主循环中操作了,同时在中断内也操作了,那么就有可能主程序操作了16个字节,然后进入中断被修改了完整的32个字节,回来以后又被修改了剩下的16个字节,这样就是中断的16+主程序的16个字节,拼不成一个完整的内容了,这就会导致问题出现。
8位单片机:只要操作超过8位的变量,都有可能触发这个问题


但是STC32位单片机,本身是支持32位操作的,8位单片机中断的方法是关闭中断进行保护,写完了再打开。那么32位单片机中有没有更方便方法呢?
有的,只需要在edata区域定义一个32位变量作为缓冲,虽然写入32位变量需要16位16位的操作。但是32位变量到32位变量就只需要一条指令了,单指令的方式,就不存在被中断所打断的问题。

截图202602101402197345.jpg
简单来讲,就是让主程序操作的结果,给到一个缓冲32位变量(16位和8位不需要,可以一条指令执行完)
然后由这个缓冲的32位变量去再赋值给需要在主程序和中断内同时操作的变量
而且这个缓冲的32位变量可以重复使用,多个值都可以用来操作,只需要中转一下,这样中断内不操作这个缓冲变量,就可以做到有效隔离
且32位赋值操作一步到位,就没有中断打断问题
完美达到了原子操作的效果
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:243
  • 最近打卡:2026-03-06 08:17:29
已绑定手机

22

主题

622

回帖

2294

积分

金牌会员

积分
2294
发表于 2026-2-10 15:14:40 | 显示全部楼层
你这只能解决赋值问题,其它运算一样可能有问题

点评

运算可以先操作到中间值,只在最后一步进行赋值就行了 只要解决中断和主循环不要同时分步操作同一个变量就可以解决 赋值只需要一个指令周期 [attachimg]131787[/attachimg]  详情 回复 发表于 2026-2-10 17:11
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:688
  • 最近打卡:2026-03-07 16:27:23
已绑定手机
已实名认证

129

主题

3376

回帖

8788

积分

版主

积分
8788
发表于 2026-2-10 17:11:23 | 显示全部楼层
Ayb_*** 发表于 2026-2-10 15:14
你这只能解决赋值问题,其它运算一样可能有问题

运算可以先操作到中间值,只在最后一步进行赋值就行了
只要解决中断和主循环不要同时分步操作同一个变量就可以解决
赋值只需要一个指令周期
截图202602101711213199.jpg

同样的道理,读的时候也使用先读到缓冲变量即可

例如主循环中运算就是
long Tmp_value = 0;//缓冲变量32位变量
long Value = 0;//实际要用的32位变量
while(1)
{
……
Tmp_Value = Value;//先读回来
Tmp_Value = Tmp_Value/2+10;//各种复杂运算
if(Tmp_Value>10)Tmp_Value = 0;//判断什么的都无所谓,这些地方可以被随意打断
Value = Tmp_Value;//最后一个指令过去,单指令周期无法被打断
……
}

中断内
void isr_test(void) interrupt 10
{
Value++;
}
好处是不需要主循环每次访问Value这个变量的时候都进行关总中断保护,防止给忘了(最后结果没赋值过去很明显,但是关总中断方式可能会漏掉一两条,反而不好排查)
如果可以随时打断在任意计算,并且不会对Value产生影响。中断内的Value也可以正常操作
因为中断内不会被再打断(前提是没有其他更高优先级的中断操作这个变量,否则更复杂,也需要保护),平级中断是按顺序执行的,不用担心打断问题
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:58
  • 最近打卡:2026-03-03 12:20:56

140

主题

1291

回帖

1万

积分

荣誉版主

积分
10507
发表于 2026-2-10 19:42:27 | 显示全部楼层
楼主能不能不关闭中断实现对16/32位XSFR的写的“原子操作”?比如一次写16位的HSFR:
#define     PWMA_CNTRH              (*(unsigned char volatile far *)0x7efece)
#define     PWMA_CNTRL              (*(unsigned char volatile far *)0x7efecf)
或者
#define     PWMA_PSCRH              (*(unsigned char volatile far *)0x7efed0)
#define     PWMA_PSCRL              (*(unsigned char volatile far *)0x7efed1)
或者
sfr         T4H         =           0xd2;
sfr         T4L         =           0xd3;
或者
sfr         T3H         =           0xd4;
sfr         T3L         =           0xd5;
或者
sfr         T2H         =           0xd6;
sfr         T2L         =           0xd7;
这些都满足高字节在低地址的大端格式

点评

老版本的芯片设计中,是不行的 新版本的芯片,从硬件上已经支持了这个功能,可以一次性直接写入 [attachimg]131807[/attachimg] 头文件中使用了int定义的,都是可以直接使用int操作的,不需要分两次  详情 回复 发表于 2026-2-10 21:01
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:688
  • 最近打卡:2026-03-07 16:27:23
已绑定手机
已实名认证

129

主题

3376

回帖

8788

积分

版主

积分
8788
发表于 2026-2-10 21:01:45 | 显示全部楼层
杨*** 发表于 2026-2-10 19:42
楼主能不能不关闭中断实现对16/32位XSFR的写的“原子操作”?比如一次写16位的HSFR:
#define     PWMA_CNT ...

老版本的芯片设计中,是不行的
新版本的芯片,从硬件上已经支持了这个功能,可以一次性直接写入
截图202602102101262504.jpg
头文件中使用了int定义的,都是可以直接使用int操作的,不需要分两次

点评

所以作为官方版主,不要把心思花在小技巧,要多介绍AI芯片的 新特征。比如哪些型号已支持这个功能(这就是16/32位单片机外设的典型特性),对于同一款单片机,如何区分是老版本和新版本,以及为什么会与硬件有关等。  详情 回复 发表于 2026-2-10 22:39
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:58
  • 最近打卡:2026-03-03 12:20:56

140

主题

1291

回帖

1万

积分

荣誉版主

积分
10507
发表于 2026-2-10 22:39:04 | 显示全部楼层
王*** 发表于 2026-2-10 21:01
老版本的芯片设计中,是不行的
新版本的芯片,从硬件上已经支持了这个功能,可以一次性直接写入

所以作为官方版主,不要把心思花在小技巧,要多介绍AI芯片的 新特征。比如哪些型号已支持这个功能(这就是16/32位单片机外设的典型特性),对于同一款单片机,如何区分是老版本和新版本,以及为什么会与硬件有关等。我想这些内容才是网友最应该知道的

点评

好的,您批评的是,之后我会更多的介绍芯片的新功能,以及改进了哪些方向  详情 回复 发表于 2026-2-10 23:06
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:688
  • 最近打卡:2026-03-07 16:27:23
已绑定手机
已实名认证

129

主题

3376

回帖

8788

积分

版主

积分
8788
发表于 2026-2-10 23:06:44 | 显示全部楼层
杨*** 发表于 2026-2-10 22:39
所以作为官方版主,不要把心思花在小技巧,要多介绍AI芯片的 新特征。比如哪些型号已支持这个功能(这就 ...

好的,您批评的是,之后我会更多的介绍芯片的新功能,以及改进了哪些方向
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:761
  • 最近打卡:2026-03-07 09:49:48
已绑定手机

16

主题

1402

回帖

4893

积分

论坛元老

积分
4893
发表于 2026-2-11 08:43:29 | 显示全部楼层
杨*** 发表于 2026-2-10 22:39
所以作为官方版主,不要把心思花在小技巧,要多介绍AI芯片的 新特征。比如哪些型号已支持这个功能(这就 ...

我也觉得官方应该通过正式渠道发布芯片各个固件版本的判定方法,以及各个版本存在的各种问题和优化点。
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2026-03-07 09:59:50
已绑定手机

4

主题

198

回帖

748

积分

高级会员

积分
748
发表于 2026-2-11 09:36:06 | 显示全部楼层
学习一下,避免BUG
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 20:03 , Processed in 0.123574 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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