找回密码
 立即注册
查看: 145|回复: 4

16位变量在主函数和中断中都可以操作有可能出错问题

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:416
  • 最近打卡:2025-05-02 08:12:03

10

主题

70

回帖

1311

积分

金牌会员

积分
1311
发表于 2025-3-20 11:01:34 | 显示全部楼层 |阅读模式

16位变量在主函数和中断中都可以操作有可能出错问题:

比如定时器中断有一个16位全局变量a在累加,main函数在读取a或给a置零时由于16位变量需要分开两个字节来处理,如果刚好在操作完第一个字节时定时器中断打断了并且改变了a变量,这种情况在某些要求高的项目上会是一个不容易察觉的漏洞,为项目带来隐患。

我想到的解决办法是关闭中断后再读写a,但是频繁开关中断不好。请问STC32位单片机是否可以一次完成16位变量的读写,这样就不会有问题,或者有其他办法可以保证16位变量读写中不会被中断打断?

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-20 11:03:00 | 显示全部楼层
在嵌入式系统中,16位变量在主函数和中断中同时操作确实可能导致数据不一致问题。针对这一问题,以下是几种可行的解决方案:<br><br>1. 原子操作:某些32位单片机(如STC32)支持16位变量的原子操作,确保在单条指令内完成读写,避免被中断打断。您可以查阅STC32的手册,确认其是否支持此类操作。<br><br>2. 临界区保护:通过关闭中断来保护临界区,确保变量操作的完整性。虽然频繁开关中断可能影响系统实时性,但在关键操作中使用是可行的。例如:<br>  
  1. c<br>   disableirq(); // 关闭中断<br>   a = 0;           // 操作变量<br>   enableirq();  // 开启中断
复制代码
<br><br>3. 使用硬件支持:某些单片机提供硬件支持的互斥机制(如硬件锁或信号量),可在不关闭全局中断的情况下保护共享资源。<br><br>4. 优化设计:尽量减少全局变量的使用,或将操作限制在单一上下文中,降低冲突概率。<br><br>建议根据具体应用场景选择合适的方法,并进行充分测试以确保系统稳定性。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-05-02 07:55:51
已绑定手机

46

主题

1694

回帖

2544

积分

金牌会员

积分
2544
发表于 2025-3-20 11:27:21 | 显示全部楼层
stc32支持16位和32位一次操作吧,stc8不可以
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-20 11:27:33 | 显示全部楼层
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-3-20 11:31:50 | 显示全部楼层
STC32可以一次性读写,但写仍需要先送到寄存器,操作完再写回去,所以读16位不用关中断,写仍需要关中断
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:13 , Processed in 0.143352 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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