[技术问答] 关于中断和主函数都会改变同一个变量的问题,困扰很久了!

[复制链接]
1030|6
 楼主| jcky001 发表于 2022-6-24 09:15 | 显示全部楼层 |阅读模式
你好,
有个C语言 请教一下!这个问题困扰我很久了!

你看看这个网友的观点是对的吗?
为了防止中断函数把某些共享数据破坏,在主函数中更改某个数据变量时,应该先关闭中断,修改完后再打开中断;如果是1个字节char变量没关系,如果是int等类型的2个字节以上的数据就有必要考虑一下。因为char是一个字节,在数据改变的时候,一条指令就可以更改完毕.而int是2个字节,更改数据的时候至少需要2条指令以上,所以我怕在刚执行一条指令的时候,还没来得及执行完第二条指令,也就是int数据还没更改完时出现定时中断,而恰好在定时中断里有发生了更改次变量的情况。



就是说中断里面用到的变量,如果主循环也有用,在主循环里面修改时,就要关中断,防止操作到一半,中断发生,中断里面改变了这个变量?

不知这个问题使用volatile能否解决?
谢谢!
cr315 发表于 2022-6-26 09:00 | 显示全部楼层
Volatile只是说, 每次在用到这个变量时, 都要重新读一次, 防止有中断或其它任务改变了这个值.

对于Cortex系列单片机, 变量是存在内存中, 只要改写变量, 就要先读到寄存器中,值改变后,再回写到内存中, 所以即使是char型8bit变量, 只要中断里有改写,中断外(或低优先级中断里)改写时,就一定要先关全局中断, 改写完后,再开全局中断. 而中断外(或低优先级中断里)的读不必这样关开中断.
redone 发表于 2022-7-6 21:01 | 显示全部楼层
额,应该不能这样
sadicy 发表于 2022-7-17 09:32 | 显示全部楼层
还是要仿真跟踪一下吧
不能乱猜
zhihongkevin 发表于 2022-7-20 11:04 | 显示全部楼层
我觉得这是控制逻辑的问题,我做一些实时控制的时候也会遇到这个问题。但是可用从程序控制的方面入手,即使出现了你说的这种情况,不会改变既定的控制逻辑
cyclefly 发表于 2022-7-21 09:35 | 显示全部楼层
中断应该不会这样,还是哪里赋值了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1654

主题

5794

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部