历史上的今天
返回首页

历史上的今天

今天是:2025年12月20日(星期六)

2022年12月20日 | 进入临界有什么用?STM32单片机怎么实现?

2022-12-20 来源:zhihu

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

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

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

进入临界和退出临界,我第一次接触是在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的或许还要更复杂些,这里就不一一讲解了,理解本质就行。



推荐阅读

史海拾趣

中环(Central)公司的发展小趣事

中环公司的前身可以追溯到1958年成立的天津市半导体材料厂。随着技术的不断进步和市场需求的增长,公司在1978年开始涉足区熔单晶硅制造领域,并于1981年正式进入太阳能单晶硅制造领域,成为国内最早涉足光伏领域的企业之一。这一转变不仅体现了中环对市场趋势的敏锐洞察,也为其后续在光伏领域的发展奠定了坚实的基础。

意华(CZT)公司的发展小趣事

为了实现公司的长远发展,意华于2010年开始筹备上市工作。经过多年的准备和努力,意华成功在资本市场上市,为公司的发展注入了新的活力。上市后,意华通过资本市场融资和资本运作,加速了公司的扩张和技术创新步伐。同时,公司也更加注重规范运作和透明度提升,赢得了投资者的信任和支持。

AnDAPT__Inc.公司的发展小趣事

为了提高产品质量,意华先后通过了ISO9001、ISO14001、IECQC080000等多项国际质量管理体系认证。这些认证不仅证明了公司的质量管理水平,也为客户提供了更可靠的产品保障。通过持续的质量改进和过程控制,意华的产品质量得到了显著提升,赢得了更多客户的认可。

南晶电子(DGNJDZ)公司的发展小趣事

在发展过程中,南晶电子始终秉持合作共赢的理念。公司与上下游企业建立了紧密的合作关系,共同推动产业链的发展。同时,南晶电子还积极参与社会公益事业,为社会进步和发展贡献自己的力量。通过与各方的共同努力,南晶电子在电子行业树立了良好的企业形象和口碑。

DALLAS公司的发展小趣事

随着移动设备市场的蓬勃发展,Dallas公司敏锐地捕捉到了电池电量管理技术的市场需求。在深入研究和技术攻关后,Dallas成功推出了可编程锂离子电池电量计DS2790。这款产品集成了先进的微控制器、大容量程序和数据存储器以及精密的电池电流、电压和温度测量系统,为定制单节电池电量计的算法提供了优秀的平台。DS2790的推出不仅满足了市场需求,也为Dallas公司在电池管理技术方面赢得了声誉。

BROTHER公司的发展小趣事

随着全球市场的不断扩大,BROTHER意识到要实现持续发展,必须走国际化道路。因此,公司在上世纪五十年代开始积极实施国际化战略。首先,BROTHER在美国纽约建立了销售总部,以更好地服务北美市场。随后,公司又在欧洲等地建立生产基地和销售网络,进一步拓展国际市场。通过国际化战略的实施,BROTHER不仅提升了品牌知名度和市场份额,还积累了丰富的跨国经营经验。

问答坊 | AI 解惑

利用单片机的PWM产生方波信号!

我选用的单片机是增强型的C51系列80C552单片机,想利用它自带的PWM产生方波信号脉冲,应该涉及到哪些电路,最好能有连接图!方波信号的频率为20~90HZ左右.谢谢!…

查看全部问答>

单片机应用

单片机基应用和高级应用,包含原理图和源程序(proteus 仿真)…

查看全部问答>

VxWorks下编译ACE+TAO

本人正在VxWorks下编译ACE+TAO,出现编译错误,搜索以前的帖子编译需要make3_80.gvk_patches和make3_80.tor2_2.new_dependency_rules两个补丁的。 谁给发一份:yjbdgood@126.com 我没装补丁编译出现以下错误: $  make static_libs=1 re ...…

查看全部问答>

关于ADS Scatter 文件

load1 0x00000000 {   run1 0x00000000   {       ********   } } load2 0x00000800 {   run2 0x30000000   {       ********  &nbs ...…

查看全部问答>

关于开发板rootfs中NFS的问题

我用在开发板上用mount -t nfs -o nolock 196.168.0.110:/home/name/rootfs 按了回车一定反应都没有就跑到下一行,然后空白也没有出错信息,只有按ctrl+c终止 。PC上配置应该没有问题!自己可以mount(nfs)自己,开发板上也能ping通。 在内核设置 ...…

查看全部问答>

大家好哦,我想学习单片机!想报班效果怎么样啊??

各位高手有什么好书,或好的资料啊。我想报培训班大家给点建议啊!! 大家看这家培训机构怎么样啊》名字叫:硬件工程师高级职业教育项目组(http://test.pche.com.cn/pche/seign/default.asp)。…

查看全部问答>

单片机--点阵

  对于点阵来说,大家都不是很关注,在这里我也说说我对点阵的看法!  点阵分为行和列,在上面的8根引脚是行,而下面8根是列,所以只要在行列上有电势差就会使得点阵上所对应的点亮。但是还要看其中的二极管是怎么放的。在ISIS中的点阵是 ...…

查看全部问答>

ST的ARM7好像不支持SDRAM吧?

                                  …

查看全部问答>

USB相关质询

问题:我现在需要把9B96开发板通过usb接入电脑后,在电脑里面表现为一个大容量存储器(虽然只有几百K容量),我需要准备哪些相关的知识,从哪些方面着手?现在是一头雾水。我知道,开发包里面有一个usb_bulk的demo程序。 [ 本帖最后由 weirgu 于 2011 ...…

查看全部问答>