uC/OS-II源码分析(三)

简介: 首先来了解下实时系统的基本概念:1) 临界区,共享资源,任务(类似于进程),任务切换,任务调度,可剥夺型内核,可重入函数,动态优先级调度,2) 如何处理优先级反转问题。这个问题描述如下:有三个任务,优先级1高于2,2高于3,一开始1和2处于挂起,3在运行,3要使用某个共享资源,就P它的互斥信号量,3得到信号量后开始使用这个共享资源。

首先来了解下实时系统的基本概念:

1) 临界区,共享资源,任务(类似于进程),任务切换,任务调度,可剥夺型内核,可重入函数,动态优先级调度,

2) 如何处理优先级反转问题。这个问题描述如下:有三个任务,优先级1高于2,2高于3,一开始1和2处于挂起,3在运行,3要使用某个共享资源,就P它的互斥信号量,3得到信号量后开始使用这个共享资源。过一段时间后,1等待的事件发生后剥夺了3的CPU使用权,于是1开始运行。运行时,1也要用3占到的那个资源,所以1只好进入挂起状态,等待3释放这个资源。于是这时3准备继续运行,但这时2等待的事件也发生了,所以2抢占了3的CPU使用权,等2运行完后把CPU还给3,3继续运行,直到释放资源的信号量。这时1才能得以运行。这个过程中,1的优先级实际上降到了3的水平。

处理的方法描述如下:在1第一次抢占3的CPU时,1去申请资源信号量,但内核知道这个信号量被3占了,而3的优先级比1低,于是内核把3的优先级升至与1相同。内核将1放入等待资源信号量的任务列表,然后回到3继续运行。等3完成后释放资源信号量,这时内核恢复任务3本来的优先级,并查看等待该资源信号量的任务列表里有谁在等待这个信号量,这时有1,所以把信号量交给1,于是1得以运行。等1运行完后,2才能开始运行。但uC/OS-II不支持优先级继承,这个功能是可以使内核自动变换任务的优先级。

3) 处理互斥:开关中断(uC/OS-II中用OS_ENTER_CRITICAL和OS_EXTI_CRITICAL来实现),测试并置位,禁止/运行任务切换,互斥信号量,计数型信号量,

4) 同步:信号量,事件标志(任务与多个事件同步,若任务需要与任何事件之一发生同步,叫独立型同步,若任务与若干事件都发生同步,叫关联型同步)。

5) 任务间通信:消息邮箱,消息队列,中断,

作者:洞庭散人

出处:http://phinecos.cnblogs.com/    

本博客遵从 Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
目录
相关文章
|
7月前
|
人工智能 自然语言处理 算法
HippoRAG 2:开源RAG框架革新知识检索,多跳推理+持续学习全搞定
HippoRAG 2 是俄亥俄州立大学推出的检索增强生成框架,通过个性化PageRank算法和知识图谱技术,显著提升了RAG系统在复杂问答任务中的表现。
827 2
HippoRAG 2:开源RAG框架革新知识检索,多跳推理+持续学习全搞定
|
IDE Go 开发工具
Go Error module declares its path as but was required as解决方案
文章提供了一个解决方案,用于处理在Go工程中将依赖的仓库从A更换为B(即使它们完全相同)时遇到的路径声明错误,建议通过发布新版本来解决此问题。
301 0
|
JSON JavaScript 定位技术
Echarts自定义地图显示区域,可以显示街道,小区,学校等区域
Echarts自定义地图显示区域,可以显示街道,小区,学校等区域
|
缓存 Java Spring
一张图彻底搞懂Spring循环依赖
循环依赖就是指循环引用,是两个或多个Bean相互之间的持有对方的引用。BeanA 类依赖了Bean B类,同时Bean B类又依赖了Bean A类。这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖。Bean A类依赖了Bean B类,Bean B类依赖了Bean C类,Bean C类依赖了Bean A类,如此,也形成了一个依赖闭环。自己引用了自己,自己和自己形成了依赖关系。同样也是一个依赖闭环。
729 1
|
iOS开发
[✔️]xcode Instrucments排查app的内存泄露
[✔️]xcode Instrucments排查app的内存泄露
774 0
|
IDE 编译器 开发工具
全网最简约的Anaconda+Python3.7安装教程Win10(百分百成功)
全网最简约的Anaconda+Python3.7安装教程Win10(百分百成功)
1344 0
全网最简约的Anaconda+Python3.7安装教程Win10(百分百成功)
|
编解码 监控 Shell
Matrix源码分析系列-如何监控帧率变化
Matrix源码分析系列-如何监控帧率变化
524 0
Matrix源码分析系列-如何监控帧率变化
|
SQL 关系型数据库 MySQL
老司机总结的12条 SQL 优化方案(非常实用)(二)
老司机总结的12条 SQL 优化方案(非常实用)(二)
老司机总结的12条 SQL 优化方案(非常实用)(二)
|
Java Python
ACM 选手玩转 LeetCode 滑动窗口解决长度最小的子数组
给定含有 n 个正整数的数组和一个正整数 target: 找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度,若不存在,返回 0。
ACM 选手玩转 LeetCode 滑动窗口解决长度最小的子数组
寻找旋转排序数组中的最小值 (重复与非重复代码)
寻找旋转排序数组中的最小值 (重复与非重复代码)
143 0
寻找旋转排序数组中的最小值 (重复与非重复代码)