打印
[应用方案]

一个全局变量,在主函数和中断都会操作到,则在主循环必须先关闭中断再操作该变量吗?

[复制链接]
2580|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2021-10-15 16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
无意中看到你之前回答的中断中修改全局变量的代码,在主函数中必须关闭中断再操作该变量

http://www.nuvoton-mcu.com/nufaq/?q-334.html

就是说对ARM cortex的任何芯片,不管是8位、16位还是32位变量,都要在主函数中先关闭中断再操作变量?

但我有用到的M451 Series, NUC123SeriesBSP好多例程都是中断会改变变量值,而主循环一直读该变量进行判断操作,都是没关闭中断的,如这个例程

M451 Series BSP CMSIS V3.01.001\SampleCode\StdDriver\SPI_MasterMode

还是说主循环如果只是对变量进行大小之类的逻辑判断,不是重新赋值给该变量,就不需要关中断?

使用特权

评论回复
沙发
twjiang| | 2021-10-15 17:41 | 只看该作者
分两种情况:
(1)做某件事只依赖于唯一的一个中断事件
(2)做某件事依赖于两个及以上的中断事件

第(1)种情况非常简单



使用特权

评论回复
板凳
zchong| | 2021-10-15 18:22 | 只看该作者
关注变量的数据完整性,举例,一个2字节的数据,你是读两次单字节获取的,那么你就要注意两次读中间可能被打断且数据可能被修改。还比如一个数据你在两处使用,那么两处之间的代码有可能被打断,其值可能被修改。

使用特权

评论回复
地板
panxiaoyi| | 2021-10-15 19:08 | 只看该作者
我就踩过这个坑。当时是8位单片机,主程序读取16位变量,中断里面更改该变量,结果发生错误。后来我在主程序读取该变量前,关闭中断,读取后再打开中断,问题解决
经验总结:
如果是8位机,在读写16位/32位变量时,假设主程序在读取低字节后且还没有读取高字节时,中断刚好发生的话,且中断会改变该变量,这时主程序操作的结果就有可能错误
如果是32位机操作16位变量,我认为没有关闭中断的必要
如果是位变量,如果编译出来的汇编语句是先读整数变量、修改某位、再写,这时候,估计也要考虑上面的问题,不过,我不懂汇编,瞎猜呵

使用特权

评论回复
5
weiwei4dk| | 2021-10-15 20:31 | 只看该作者
这个要看具体操作,如楼上所说,单片机可操作的变量类型与实际使用的变量类型存在差别时,这时就很容易出现问题
在操作时我一般将变量读入到一个临时变量里,防止操作中受到其它程序的改变造成影响,当然也可以用标志位做互斥判断之类

使用特权

评论回复
6
一刀一级| | 2022-3-16 09:43 | 只看该作者
1>,如果中断内外都对一个变量写,中断外的写就要关中断。

2>,如果中断内写,中断外只读;或中断外写,中断内只读,可以不关中断,

3>,如果一变量只在一个中断里写个标志(不与其它中断共用),中断外检测并清标志,代码较少时,只要不会在执行中断代码时,又发生中断标志置位,就不会丢标志。否则仍有可能丢一次标志。



精简指令单片机,无论8位,16位,还是32位都有上述问题。非精简指令单片机,一条指令完成内存中的数据改写,就不存在上述问题,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

440

主题

1669

帖子

1

粉丝