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

2020-01-01 17:51发布

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

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

__set_PRIMASK(0);

我推测关寄存器中断的速度不够导致的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
camtime
1楼-- · 2020-01-02 12:16
如果是原子操作,可以不用关中断处理。不是的话,还是老老实实用临界面
hustsolo
2楼-- · 2020-01-02 15:38
感谢楼主分享。
关掉串口中断使能,只是说串口模块不再向NVIC控制器发出中断请求了。但是在你关之前,可能NVIC控制中的这个串口中断已经挂起但还没有被CPU处理。所以在你看来,在你关了串口中断之后,串口中断还是被响应了。
关掉CPU的中断响应就没有这样的问题。即使NVIC中有串口中断没有被响应,cpu也不会去处理这个中断,直到你打开CPU的中断。
styleno1
3楼-- · 2020-01-02 15:49
 精彩回答 2  元偷偷看……
ywlzh
4楼-- · 2020-01-02 19:05
没明白楼主意思,是推荐关全局中断呢还是关相应的中断(比如串口)
nicksean
5楼-- · 2020-01-03 00:32
楼主是推荐关全局中断
isakura
6楼-- · 2020-01-03 06:15
我没理解楼主说的比如和那个中断有什么关系。。。。

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

一周热门 更多>