进入临界有什么用?STM32单片机怎么实现?

大家好,我是无际。

有一次我在给内部学员直播的时候,有几个小伙伴问我,为什么要进入临界,临界有什么用?

当时一时半会没想到好的解释,今天举几个例子来解答下。

如果有大佬觉得我说得不对请私聊我纠正,不要偷偷在评论区喷我,我改还不行吗。

进入临界和退出临界,我第一次接触是在ucos系统,当时我也感觉这个专业术语很牛逼很复杂的样子。

等我讲完人话,你会发现其实也挺low。

进入临界就是关闭单片机总中断,退出临界就是恢复单片机中断记住最好是恢复,不是打开,因为进入临界之前单片机总中断未必是开着的。

那为什么要进入临界?有什么作用?

我们假设一种场景:

我们来看这样一段代码。

假设我们程序执行到第12行,也就是a = 0的位置,*p的值肯定是等于2的对吧?

突然有个定时器中断来了,然后在定时器中断处理函数里面,我们执行了p++。

执行完以后回到主程序继续执行,也就是会去执行13行代码,这个时候*p的值你猜猜是多少?

没错,肯定不是2,而是3。

明明条件判断是2,最后值却变成了3,这种bug估计能调到你哭。

这个时候进入临界就稳得一逼了,可以改成如下代码。

STM32不像51单片机这样直接EA=0就能关闭总中断,而是通过__get_PRIMASK和__set_PRIMASK来做,当然也可以用__disable_irq和__enable_irq。

具体的可以在工程里搜索,看注释。

每个单片机关闭总中断的方式都不一样,所以进入临界和退出临界代码也有所区别。

你只需要记住本质就是关总中断,执行完程序后,恢复总中断就行了

不用过于担心单片机总中断怎么开关的问题,网上随便都能搜到。

那继续聊下我们上面那个程序,很多人可能会说,我写程序的时候规避这种问题,不在定时器里对p指针进行操作不就行了?

如果你是做一些比较大的项目,几乎不可能避免,比如说我们的队列算法。

我们会在串口中断里接收到数据以后,把数据丢进队列,然后在主函数进行解析。

用了队列以后,数据传输稳定性可以大大提升,哪怕是数据传输很快,数据量很大也不会出现丢包的情况。

我们不妨来看下队列算法的入列函数。

这种,如果不用指针,几乎不可能实现,哪怕实现了灵活性和移植性也不高。

试想一下,如果这种在主函数和中断里都会频繁去操作指针,不做临界的话程序很容易因为指针指向异常导致死机或者数据错乱导致的程序逻辑问题。

当然,进入临界除了保护全局变量、数组、结构体等数据不错乱以外,还能是硬件的数据,比如IO、SCI、SPI、flash。

当然,RTOS的或许还要更复杂些,这里就不一一讲解了,理解本质就行。

版权声明:本文为CSDN博主「无际单片机编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43982452/article/details/122895644

生成海报
点赞 0

无际单片机编程

我还没有学会写个人说明!

暂无评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

【STM32Cube笔记】12-配置外部中断

【STM32Cube笔记】系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯引脚配置 6-Cortex-M7内核基本配