关闭
搜索
搜索
本版
帖子
用户
热搜:
程序员
简洁模式
高级模式
用户组: 游客
消息
提醒
新听众
我关注的
帖子
道具
勋章
任务
设置
退出
请
登录
后使用快捷导航
没有帐号?
立即注册
设为首页
收藏本站
开启辅助访问
切换到窄版
登录
or
立即注册
快捷导航
搜索
首页
论坛
BBS
MCU单片机技术
程序员交流
ucos中的三种临界区管理机制
[复制链接]
作者:
boboming0926
版块:
›
灌水·股票·程序员大本营·工作之余需要点阳光·我们不只是工程师
›
IT业界资讯
发布时间:
2018-12-27 16:19:37
1108
0
返回列表
boboming0926
当前离线
新手上路
新手上路, 积分 24, 距离下一级还需 26 积分
新手上路
新手上路, 积分 24, 距离下一级还需 26 积分
积分
24
发消息
楼主
电梯直达
boboming0926
发表于 2018-12-27 16:19:37
|
只看该作者
|
倒序浏览
|
阅读模式
熟悉ucos,或者读过Jean.J.Labrosse写过的ucos书籍的人,一定会知道ucos中著名的临界去管理宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
同样是通过关中断来保护临界区,OS_ENTER_CRITICAL/OS_EXIT_CRITICAL一共实现了三种实现方式,如下所示:
[cpp]view plaincopyprint?
1.#ifOS_CRITICAL_METHOD==1
2.#defineOS_ENTER_CRITICAL()__asm__("cli")
3.#defineOS_EXIT_CRITICAL()__asm__("sti")
4.#endif
5.
6.#ifOS_CRITICAL_METHOD==2
7.#defineOS_ENTER_CRITICAL()__asm__("pushf\n\tcli")
8.#defineOS_EXIT_CRITICAL()__asm__("popf")
9.#endif
10.
11.#ifOS_CRITICAL_METHOD==3
12.#defineOS_ENTER_CRITICAL()(cpu_sr=OSCPUSaveSR())
13.#defineOS_EXIT_CRITICAL()(OSCPURestoreSR(cpu_sr))
14.#endif
第一种方式,OS_ENTER_CRITICAL()简单地关中断,OS_EXIT_CRITICAL()简单地开中断。这种方式虽然简单高效,但无法满足嵌套的情况。如果有两层临界区保护,在退出内层临界区时就会开中断,使外层的临界区也失去保护。虽然ucos的内核写的足够好,没有明显嵌套临界区的情况,但谁也无法保证一定没有,无法保证今后没有,无法保证在附加的驱动或什么位置没有,所以基本上第一种方法是没有人用的。
第二种方式,OS_ENTER_CRITICAL()会在关中断前保存之前的标志寄存器内容到堆栈中,OS_EXIT_CRITICAL()从堆栈中恢复之前保存的状态。这样就允许了临界区嵌套的情况。但现在看来,这种方法还存在很大的问题,甚至会出现致命的漏洞。
在OS_CRITICAL_METHOD=2的情况下,假设有如下代码:
[cpp]view plaincopyprint?
1.function_a()
2.{
3.inta=(1
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
收藏
0
相关帖子
•
Linux内核如何处理中断|Linux中国
•
没有弃用Sun拥抱HP/Linux,亚马逊或已倒闭!
•
英特尔的手机梦破碎:Linux5.12将移除Moorestown和Medfield平台驱动
•
为什么建议大牛都喜欢用Linux开发?
•
为什么大牛都喜欢用Linux开发?
•
IOT安全(二)——再探stm32
•
为什么建议大家使用Linux开发?
•
基于STM32的ch438串口扩展芯片使用
•
解决STM32单片机常见问题
•
STM32的DMA简介
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
表情
@朋友
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
生活交流*灌水区*工程师滋润生活*
linux
ARM
招聘&找工作
其他嵌入式相关
快速回复
返回顶部
返回列表