分享一个经验:原子操作时,不要用寄存器关中断

2020-01-01 17:51发布

比如说,有一个变量,仅在主程序和串口中断中被修改,照理只关串口中断就行了,影响范围小一些,不过经过实测,用下面的写法是不行的:
USART2->CR1 &= ~USART_FLAG_RXNE;
       
USART2->CR1 |= USART_FLAG_RXNE;

关全局中断就行:
__set_PRIMASK(1);

__set_PRIMASK(0);

我推测关寄存器中断的速度不够导致的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
elecsun
1楼-- · 2020-01-03 10:10
isakura 发表于 2016-7-27 10:37
我没理解楼主说的比如和那个中断有什么关系。。。。

实际应用很少有关全局中断的情况 ...

楼主的关键词是“原子操作”,你可以搜索一下原子操作的意义,就明白楼主的意思了。

简单的类比说就是为了多线程的数据同步。
agilityChen
2楼-- · 2020-01-03 15:11
 精彩回答 2  元偷偷看……
error_dan
3楼-- · 2020-01-03 17:54
用位带操作,并且主动清除外设中断挂起标识。
关全局中断响应太那啥了,裸机程序从来没用过。
lihui_mc
4楼-- · 2020-01-03 17:59
hustsolo 发表于 2016-7-27 08:33
感谢楼主分享。
关掉串口中断使能,只是说串口模块不再向NVIC控制器发出中断请求了。但是在你关之前,可能N ...

可能是你说的nvic中断挂起未处理的原因
lihui_mc
5楼-- · 2020-01-03 22:23
styleno1 发表于 2016-7-27 08:41
谢楼主,这个思路挺对症下药,只关闭相关的中断。以后我学你这样用。

你误会了,我是不建议只关闭相关中断

一周热门 更多>