十、什么是临界资源及如何访问临界资源
文章目录
- 1、什么是临界资源?
- 2、什么是临界区?
- 3、临界资源访问的两种方法
- (1)关闭中断:避免了其他任务和中断来破坏,即这时候中断和任务调度无法正常进行
- 1)在任务中屏蔽中断
- 2)在中断服务函数中屏蔽中断
- 3)补充说明
- 4)为什么关闭中断也使任务调度停止了?——因为任务调度依赖于systick中断
- (2)关闭调度器:避免了其他任务破坏,但这时候中断还是可以发生和处理的
- 4、如果没有使用临界区后果会如何?
- (1)应用任务的优先级比初始任务高时
- (2)应用任务的优先级和初始任务一样时
- (3)应用任务的优先级比初始任务低时
1、什么是临界资源?
临界资源是一次仅允许一个进程使用的共享资源。通俗可以理解为同一时刻只能由一个进程进行访问的资源。
2、什么是临界区?
每个进程中访问临界资源的那段代码称为临界区(Critical Section)。即是一段不能被打断的代码段。
即保护了关键代码的执行不被打断,但也会影响系统的实时,任何使用了操作系统的中断响应都不会比裸机快。
每次只准许一个进程进入临界区,进入后不允许其他进程进入。
3、临界资源访问的两种方法
FreeRTOS中提供读写队列等API函数内部,均进行了临界资源的访问(即不会被其他事情干扰),在任务中如果不想使用队列等并且也不想被其他事情打扰均可参考这种进入临界区的做法。
(1)关闭中断:避免了其他任务和中断来破坏,即这时候中断和任务调度无法正常进行
在FreeRTOS提供的读写队列、信号量、互斥量等API函数里面,均实现了临界区的访问,其采用的均是关闭中断的方法来进行临界区的访问。
那么问题来了——这个关闭中断是关闭了所有中断吗?
答案很显然,肯定不是了,它关闭的只是部分优先级较低的中断。FreeRTOS为什么这样操作和在代码上如何做的在后面中断管理的博客中会详细说说。
进行临界资源访问的时候,这些API函数都是成对出现的,即有进入临界区的API函数,也有退出的。具体如下
1)在任务中屏蔽中断
/* 在任务中,当前时刻中断是使能的
* 执行这句代码后,屏蔽中断
*/
taskENTER_CRITICAL();
/* 访问临界资源 */
/* 重新使能中断 */
taskEXIT_CRITICAL();
2)在中断服务函数中屏蔽中断
{/* 用来记录当前中断是否使能 */UBaseType_t uxSavedInterruptStatus;/* 在 ISR 中,当前时刻中断可能是使能的,也可能是禁止的* 所以要记录当前状态, 后面要恢复为原先的状态* 执行这句代码后,屏蔽中断*/uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();/* 访问临界资源 *//* 恢复中断状态 */taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );/* 现在,当前 ISR 可以被更高优先级的中断打断了 */
}
3)补充说明
taskENTER_CRITICA()/taskEXIT_CRITICAL()之间和taskENTER_CRITICA_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()之间:
a)低优先级的中断被屏蔽了:即优先级低于、等于configMAX_SYSCALL_INTERRUPT_PRIORITY
b)高优先级的中断可以产生:优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY
4)为什么关闭中断也使任务调度停止了?——因为任务调度依赖于systick中断
(2)关闭调度器:避免了其他任务破坏,但这时候中断还是可以发生和处理的
在事件组的相关API函数内部进入临界区的方法均是采用关闭调度器的方法
/* 暂停调度器 */
void vTaskSuspendAll( void );
/* 恢复调度器
* 返回值: pdTRUE 表示在暂定期间有更高优先级的任务就绪了
* 可以不理会这个返回值
*/
BaseType_t xTaskResumeAll( void );
4、如果没有使用临界区后果会如何?
(1)应用任务的优先级比初始任务高时
创建完应用任务后会立马去执行优先级最高的任务,当其被阻塞时回到初始任务继续创建任务,直至应用任务创建完成,最后把自己(初始任务)删除。
(2)应用任务的优先级和初始任务一样时
创建完应用任务后根据任务的时间片来执行,直到所有应用任务创建完成,最后初始任务把自己删除。
(3)应用任务的优先级比初始任务低时
创建完应用任务后不会被执行,除非优先级和上述两种情况一样,直到所有应用任务创建完成,最后初始任务把自己删除。
十、什么是临界资源及如何访问临界资源相关推荐
- 什么是临界资源计算机网络,如何利用信号量机制来实现多个进程对临界资源的互斥访问...
进程互斥 定义:两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥. 在多道程序环境下,存在着临界资源,它是指多进程存在时必须互斥访问 ...
- Java实现主线程与子线程访问临界资源同步模拟
1.问题描述 使用不同的方法完成主线程与子线程的同步,要求子线程先执行,在主线程中使用Thread类创建一个子线程,主线程创建后进入阻塞状态,直到子线程运行完毕后唤醒主线程. 2.代码实现 (2.1) ...
- 什么是临界资源计算机网络,什么是临界资源?什么是临界区?
导航:网站首页 > 什么是临界资源?什么是临界区? 题目类型:[问答题,简答题] 什么是临界资源?什么是临界区? 匿名网友: 参考答案: 临界资源是指一次仅允许一个进程访问的资源.临界区是指每个 ...
- Bakery Algorithm的c#实现用于多线程互斥访问临界资源
算法原理:每个线程进入的时候都要取得一个编号,对于不同线程编号较小的较先运行,编号相同时进程号小的先运行. using System; using System.Collections.Generic ...
- 【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数
Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Java层代码,还没有看过的童鞋,请移步到如下博文: [iOS-cocos2d-X 游戏开发之十三]详细讲解在 ...
- java 包权限_Java基础(十二)之包和权限访问
软件包 软件包解决了两个类名字一样的问题.软件包就是一个"文件夹". 包名的命名规范: 1.要求所有字母都小写: 2.包名一般情况下,是你的域名倒过来写.比如baidu.com,p ...
- 第十五节:SpringBoot使用JPA访问数据库
JPA是Java Persistence API的简写,是官方提出的一种ORM规范! JPA规范,都在包路径:javax.persistence.*下,像一些常用的如:@Entity.@Id及@Tra ...
- 秉火429笔记之十五 DMA--直接存储区访问
目录 1. 简介 2. 功能 2.1 外设通道 2.2 仲裁器 2.3 FIFO 2.4 存储器端口和外设端口 2.5 编程接口 3. DMA数据配置 1. 简介 直接存储器访问 (DMA) 用于在外 ...
- Springboot 系列(十)使用 Spring data jpa 访问数据库
前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...
最新文章
- docker mysql 生产环境_Docker构建MySQL环境
- pythons_pythons是什么
- android自定义dialog不显示,Android 自定义的dialog显示不正常呢,怎么回事???
- matlab信号分割与比对,matlab测量计算信号的相似度
- wordpress在新窗口打开留言者链接
- 引用和可触及性的强度
- TS Type As
- 理想汽车已累计交付2万台 仅用时10个月
- 哈,我再xp Professional上安装SqlServer2005桌面管理器
- ViewController的生命周期你真的懂了吗?
- Pytorch——循环神经网络层、损失函数、优化器
- lv官网编码查询_图文讲解,如何免费自主查询商标近似情况
- 宋体(Simsun)和新宋体(NSimsun)的区别
- 一起聊聊操作简单又高效的Excel数据透视表
- element时间组件在苹果回显无效果
- TCP/IP基础(三)
- 你唯一需要擅长的事情
- sdn主要包含哪些接口_解读SDN的东西、南北向接口
- 账号被盗,如何强制下线?
- iPhone4S大跌4000港元成跌价王 水货商谨慎进货