当前位置: 首页>行业 >

单片机裸机临界区保护的几种方法!

来源: 面包芯语 | 时间: 2023-07-04 21:14:53 |


(资料图片仅供参考)

一、临界区保护测试场景

关于临界区保护的测试场景无非两种。第一种场景是受保护的多个任务间并无关联,也不会互相嵌套,如下面的代码所示,task1 和 task2 是按序被保护的,因此 enter_critical() 和 exit_critical() 这两个临界区保护函数总是严格地成对执行:

voidcritical_section_test(void){//进入临界区enter_critical();//做受保护的任务1do_task1();//退出临界区exit_critical();//进入临界区enter_critical();//做受保护的任务2,与任务1无关联do_task2();//退出临界区exit_critical();}

需要注意的是,task1 里面的子任务 task3 虽然没有像子任务 task2 那样被主动加一层保护,但由于主任务 task1 整体是受保护的,因此子任务 task3 也应该是受保护的。

voiddo_task1(void){//进入临界区enter_critical();//做受保护的任务2,是任务1中的子任务do_task2();//退出临界区exit_critical();//做任务3do_task3();}voidcritical_section_test(void){//进入临界区enter_critical();//做受保护的任务1do_task1();//退出临界区exit_critical();}

二、临界区保护三种实现

2.1 入门做法

首先是非常入门的做法,直接就是对系统全局中断控制函数 __disable_irq()、__enable_irq() 的封装。回到上一节的测试场景里,这种实现可以很好地应对非嵌套型任务的保护,但对于互相嵌套的任务保护就失效了。上一节测试代码里,task3 应该也要受到保护的,但实际上并没有被保护,因为紧接着 task2 后面的 exit_critical() 直接就打开了系统全局中断。

voidenter_critical(void){//关闭系统全局中断__disable_irq();}voidexit_critical(void){//打开系统全局中断__enable_irq();}

2.2 改进做法

针对入门做法,可不可以改进呢?当然可以,我们只需要加一个全局变量 s_lockObject 来实时记录当前已进入的临界区保护的次数,即如下代码所示。每调用一次 enter_critical() 都会直接关闭系统全局中断(保证临界区一定是受保护的),并记录次数,而调用 exit_critical() 时仅当当前次数是 1 时(即当前不是临界区保护嵌套情况),才会打开系统全局中断,否则只是抵消一次进入临界区次数而已。改进后的实现显然可以保护上一节测试代码里的 task3 了。

staticuint32_ts_lockObject;voidinit_critical(void){__disable_irq();//清零计数器s_lockObject=0;__enable_irq();}voidenter_critical(void){//关闭系统全局中断__disable_irq();//计数器加1++s_lockObject;}voidexit_critical(void){if(s_lockObject<=1){//仅当计数器不大于1时,才打开系统全局中断,并清零计数器s_lockObject=0;__enable_irq();}else{//当计数器大于1时,直接计数器减1即可--s_lockObject;}}

2.3 终极做法

上面的改进做法虽然解决了临界区任务嵌套保护的问题,但是增加了一个全局变量和一个初始化函数,实现不够优雅,并且嵌入式系统里全局变量极容易被篡改,存在一定风险,有没有更好的实现呢?

当然有,这要借助 Cortex-M 处理器内核的特殊屏蔽寄存器 PRIMASK,下面是 PRIMASK 寄存器位定义(取自 ARMv7-M 手册),其仅有最低位 PM 是有效的,当 PRIMASK[PM] 为 1 时,系统全局中断是关闭的(将执行优先级提高到 0x0/0x80);当 PRIMASK[PM] 为 0 时,系统全局中断是打开的(对执行优先级无影响)。

看到这,你应该明白了 __disable_irq()、__enable_irq() 功能其实就是操作 PRIMASK 寄存器实现的。既然 PRIMASK 寄存器控制也保存了系统全局中断的开关状态,我们可以通过获取 PRIMASK 值来替代上面改进做法里的全局变量 s_lockObject 的功能,代码实现如下:

uint32_tenter_critical(void){//保存当前PRIMASK值uint32_tregPrimask=__get_PRIMASK();//关闭系统全局中断(其实就是将PRIMASK设为1)__disable_irq();returnregPrimask;}voidexit_critical(uint32_tprimask){//恢复PRIMASK__set_PRIMASK(primask);}
voidcritical_section_test(void){//进入临界区uint32_tprimask=enter_critical();//做受保护的任务do_task();//退出临界区exit_critical(primask);//...}

附录、PRIMASK寄存器设置函数在各 IDE 下实现

////////////////////////////////////////////////////////IAR环境下实现(见cmsis_iccarm.h文件)#define__set_PRIMASK(VALUE)(__arm_wsr("PRIMASK",(VALUE)))#define__get_PRIMASK()(__arm_rsr("PRIMASK"))////////////////////////////////////////////////////////Keil环境下实现(见cmsis_armclang.h文件)__STATIC_FORCEINLINEvoid__set_PRIMASK(uint32_tpriMask){__ASMvolatile("MSRprimask,%0"::"r"(priMask):"memory");}__STATIC_FORCEINLINEuint32_t__get_PRIMASK(void){uint32_tresult;__ASMvolatile("MRS%0,primask":"=r"(result));return(result);}

本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

往期推荐

《嵌入式Linux驱动大全》

关键词:

 

热文推荐

单片机裸机临界区保护的几种方法!

今天给大家分享的是Cortex-M裸机环境下,临界区保护的三种实现。搞嵌入

2023-07-04

顺利退: 关于股票进入退市整理期交易的第八次风险提示公告

顺利退:关于股票进入退市整理期交易的第八次风险提示公告

2023-07-04

同济科技:工程咨询业务量增长等,上半年归母净利润同比预增122%到159%

同济科技7月4日公告,公司预计2023年上半年归属于母公司所有者的净利润

2023-07-04

8倍目标第118天:109.4万

2023年,20万起步,目标8倍。第118天,目前账户:109 4万,盈利:89 4

2023-07-04

男士流行的大牌腰带 盘点几款经典时尚的男士腰带

hello,我是数字华夏网小杨来为大家解答以上问题,男士流行的大牌腰带

2023-07-04

6月下旬生猪价格环比下降3.5%_快播报

据人民网报导,国家统计局今日发布数据显示,据对全国流通领域9大类50

2023-07-04

热点!泰康沪港深精选混合月度点评

泰康沪港深精选混合6月净值涨跌幅%,在混合型-灵活类2305只基金中排名

2023-07-04

中国制造业未来将更可靠-环球观天下

到2030年,10类关键核心产品可靠性水平达到国际先进水平中国制造业未来

2023-07-04

福建省开展青年专项技能提升行动

应届高校毕业生返校参加招聘活动有补贴(副题)福建日报讯(记者储白珊

2023-07-04

漯河市郾城区法院对新招录人员及实习生进行岗前培训|滚动

大河网讯7月3日下午,漯河市郾城区人民法院对新入职的十名书记员及实习

2023-07-04

六大国有银行 存款利率最新调整:2023年7月,全新整存整取利率表 环球聚看点

2023年已经进入下半场,期待着存款利率能上调的小伙伴们被打脸了,因为

2023-07-04

人生一趟,不过是看一场人间烟火,除了生死,其余的都是演戏,又何必

人生一趟,不过是看一场人间烟火,除了生死,其余的都是演戏,又何

2023-07-04

腾势N7震撼上市 重新定义高端豪华电动驾驶体验

汽车时光网报道:7月3日晚,腾势N7正式上市。新车是腾势汽车推出的首款

2023-07-04

消息!争做文明有礼天津人:文明一“夏” 与“窝”同行

六月  年岁将半,阳光鼎盛  随着文明创建工作的不断深入  文明的

2023-07-04

遂昌“大山”里的蔬菜端上了“海边”的餐桌

潮新闻共享联盟(遂昌)龚隆淼通讯员郑淑君“彭可忆同学,你们寄过来的

2023-07-04

泉州市场上,做全自动螺纹袖口切翻一体机供应商找谁靠谱

泉州市创美贸易有限公司,24小时咨询热线:186-5900-1027,我司的手套

2023-07-04

大行评级|大和:下调申洲目标价至90港元 评级“买入”

格隆汇7月4日丨大和发表报告指,相比疫情前,申洲国际(2313 HK)现时在

2023-07-04

以“十个思考”推动高质量发展

清远市清城区石角镇,纺织服装产业转移方兴未艾。谢志彦在这里驻点半年

2023-07-04

无人驾驶板块震荡走高 浙江世宝、合兴股份、众泰汽车涨停|天天资讯

上证报中国证券网讯7月4日上午交易时段,无人驾驶板块震荡走高。10时02

2023-07-04

环球看热讯:芙蓉国评论丨自省自励 走好毕业“就业路”

□蒋文杰湖南2023届高校毕业生约49 8万人,同比增加1 8万人,规模再创

2023-07-04

资讯

北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27     
22年从警生涯 面对荣誉他说不要给我报功

9月24日,时任安徽省安庆市公安局迎江分局刑警大队大要案中队中队长周磊因在工作中激烈搏斗引发心源性猝死,倒在了工作岗位上,经医院抢救

2021-10-27     
走近冬奥|五棵松体育中心场馆“黑科技”全面上岗 助力冬

“相约北京”冰球国内测试活动将于2021年11月7日至10日在五棵松体育中心场馆举行,在疫情防控方面,场馆引入了诸多“黑科技”,为防疫安全

2021-10-27