打印
[技术问答]

UCOSIII 思维导图

[复制链接]
631|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linfelix|  楼主 | 2023-7-16 08:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

使用操作系统主要就是因为操作系统的管理功能,可以更加有效的管理硬件的资源,而且操作系统的多线程运行管理,是一个很棒的功能,之前只能再while(1)中执行的单线程的处理,现在可以将各个功能分开成多个任务,能够更加有效的进行任务的调用,而且实时操作系统可以有更快的任务相应速度,实时性很强,如果我们自己编写,很麻烦,而这有写好的,成品的操作操作系统,何必花大把的时间去自己编写,何不直接用成品呢!

一.任务管理1.任务状态

用户角度看,任务的状态共有五种:休眠态、就绪态、运行态、等待态、中断服务态;
休眠态:指任务已存在寄存器中,但不受系统的管理,可以通过OSTaskCreate();创建任务接收系统的管理,当不需要这个任务时,可以调用OSTaskCreate();删除任务,删除实际上是使该代码无法获得CPU的使用权。
就绪态:任务准备运行时,就进入了就绪态,任务就绪表根据任务的优先级顺序对任务进行排序。
运行态:CPU会调用当前就绪态中优先级最高的任务,使其获得CPU的使用权,但是此时如果有更高优先级的任务就绪,CPU会立即收回任务,调用更高优先级的任务,使其获得CPU的使用权。
等待态:当用户调用使其进入等待某个事件的函数时,任务就会进入等待态,并自动放入等代表,直到其等待的事件发生,就会自动进入就绪态,并放入就绪表,当ucos-iii系统服务会判断这个就绪任务的优先级是否最高,如果是,CPU会剥夺当前的任务的CPU使用权,而刚就绪的任务会获得CPU的使用权。
中断服务态:CPU允许中断,当中断发生,由于中断服务程序的优先级最高,所以CPU会保存当前正在运行的任务的状态,然后进入中断服务程序,中断服务程序推荐写的尽量的少,最好只是发送某个消息、信号,某个任务在消息队列中收到消息后,任务会进入就绪态,此时中断服务程序结束,CPU查看任务就绪表中是否有更高优先级任务就绪,如果有,更高优先级的任务会进入到运行态,CPU会进入到更高优先级任务运行,如果就绪表中没有更高优先级的任务,CPU会恢复到之前运行的任务的状态,恢复现场,回到之前运行的任务继续运行。


2.任务优先级管理

ucos-iii将最低优先级分配给了空闲任务,最高优先级分配给了中断队列处理任务。任务的优先级在ucos-iii中是以就绪任务优先级位映射表和就绪任务列表表现的。就绪表由两部分组成,一个就绪优先级位映射表, 用来记录哪个优先级下有任务就绪,一个就绪任务列表,记录每一个优先级下的所有任务。当一个优先级下有任务就绪,那么对应的优先级位就会置一。采用这样的结构,再使用计算前导零,就会很迅速的计算出哪个优先级下有任务就绪。


3.任务调度

任务调度就是中止当前正在运行的任务转而去执行其他的任务。
任务调度的类型可以分为可剥夺型调度,时间片轮转调度。ucos-iii中使用的主要是可剥夺型调度,只有当同一优先级下有多个任务时,才会使用时间片轮转调度。
UCOSIII是可剥夺型内核,因此当一个高优先级的任务准备就绪,并且此时发生了任务调度,那么这个高优先级的任务就会获得CPU的使用权!
UCOSIII中的任务调度是由任务调度器来完成的,任务调度器有2种:任务级调度器和中断级调度器。
任务级调度器为函数OSSched()。 调度器和任务切换执行期间中断是关闭的
中断级调度器为函数OSIntExit(),当退出外部中断服务函数的时候使用中断级任务调度。

3.1可剥夺型任务调度

可剥夺型任务调度又分为直接发布和延迟发布两种。

直接发布:
任务A正在运行,外设产生中断请求,该请求对应的中断服务程序运行,关闭中断,中断服务程序向外发布消息或者信号,开启中断,任务B正在等待该消息,任务B收到消息进入就绪态,任务调度器查找任务就绪表中优先级最高的任务,如果没有比A优先级更高的任务,就运行任务A,否则转而运行更高效优先级的任务。此过程中关中断来保护发布消息或者信号的过程。发布消息的代码放在了中断级运行。

延迟发布:
任务A正在运行,外设产生中断请求,该请求对应的中断服务程序运行,中断服务程序将要发布的函数调用和相关参数或者信号或消息存入“中断队列”,关闭中断,“中断队列处理任务”开始运行,将发布函数调用和相关参数提取出来,重新开启中断,锁定任务调度器,将发布函数调用和相关参数发布出去,挂起自身,解锁任务调度器。任务调度器查找任务就绪表中优先级最高的任务,如果没有比A优先级更高的任务,就运行任务A,否则转而运行更高效优先级的任务。此过程中关中断保护的是“中断队列处理任务”从“中断队列”提取发布函数调用信息的过程,锁定任务调度器是保护“中断队列处理任务”发布函数调用信息的过程。延迟发布巧妙的将发布函数调用信息的代码放在了任务级来操作,虽然减少了关中断时间,但是也延长了任务时间。注意:中断队列处理任务是系统内部任务,任务的优先级为最高(0);


3.2时间片轮转调度

UCOSIII允许一个优先级下有多个任务,每个任务可以执行指定的时间(时间片),然后轮到下一个任务,这个过程就是时间片轮转调度,当一个任务不想在运行的时候就可以放弃其时间片。
时间片轮转调度器为:OS_SchedRoundRobin()。
如图,3个同一优先级任务,每个任务都是4个时间片。


3.3调度点

1、释放信号量或者发送消息,也可通过配置相应的参数不发生任务调度。
2、使用延时函数OSTimeDly()或者OSTimeDlyHMSM()。
3、任务等待的事情还没发生(等待信号量,消息队列等)。
4、任务取消等待。
5、创建任务。
6、删除任务。
7、删除一个内核对象。
8、任务改变自身的优先级或者其他任务的优先级。
9、任务通过调用OSTaskSuspend()将自身挂起。
10、任务解挂某个挂起的任务。
11、退出所有的嵌套中断。
12、通过OSSchedUnlock()给调度器解锁。
13、任务调用OSSchedRoundRobinYield()放弃其执行时间片。
14、用户调用OSSched()。


4.任务切换

当UCOSIII需要切换到另外一个任务时,它将保存当前任务的现场到当前任务的堆栈中,主要是CPU寄存器值,然后恢复新的现场并且执行新的任务,这个过程就是任务切换。

任务切换分为两种:任务级切换和中断级切换。
任务级切换函数为:OSCtxSw()。
中断级切换函数为:OSIntCtxSw()。

两者的不同点就是,任务级切换有两步,第一步保存当前CPU运行的任务的状态,将其堆栈压入RAM中,第二步将新任务的栈压入CPU。而中断级是假设当前运行的任务的状态已经被保存过了,所以只做了将中断的堆栈压入CPU中。两者的堆栈指针也不同,任务有任务的堆栈区,中断有中断自己的堆栈区。


5.任务同步

任务同步的方式有:单向同步和双向同步,双向不同不能被用来ISR和任务之间的同步。
任务同步的方法有:
- 信号量–更多被用来实现任务间的同步以及任务和ISR之间的同步。
- 任务信号量–使用的是任务内嵌的信号量,
- 事件标志组–任务与多个事件的发生同步,可以有“或”和“与”两种同步方式。
- 与多任务同步–通过广播信号量的方式使得多个任务同时开始执行。

任务同步的方式:
- 单向同步(信号量)–任务向任务,ISR向任务发送信号量
- 双向同步(任务信号量)–任务A正在执行,发布任务B的任务信号量,任务A通过等待内嵌信号量来与任务B同步,因为任务B还没有执行,任务A的执行被阻塞,等待任务A信号量发布。ucos-iii将任务B执行,发布任务A的任务信号量,因为任务B的任务信号量被发布了,所以任务B就与任务A同步了。


6.任务挂起表

当一个任务等待信号量、互斥信号量、事件标志组、或者消息队列时,该任务就被加入任务挂起表,或者等待表中。
任务挂起表中的任务也是按照优先级排序的,高优先级的任务放在前面, 低优先级的任务放在后面。
以下是用到任务挂起表的几种内核对象,事件标志组、互斥信号量、信号量、消息。每个内核对象的头部都有三个相同的数据域,这三个数据域合起来叫做OS_PEND_OBJ。


任务挂起表实际上并不指向任务的控制块OS_TCB,而是指向一个OS_PEND_DATA类型的数据结构,其在任务被放入任务挂起表时会被动态分配到改任务的堆栈空间中。

转自https://blog.csdn.net/JosephGodVim/article/details/52021136


使用特权

评论回复
沙发
tpgf| | 2023-8-5 08:58 | 只看该作者
我使用操作系统主要就是看中了操作系统的多线程

使用特权

评论回复
板凳
wiba| | 2023-8-5 19:02 | 只看该作者
是不是所有的系统都是可剥夺型内核呢

使用特权

评论回复
地板
kxsi| | 2023-8-5 19:41 | 只看该作者
最大的优点就是实时性好  这是裸奔所无法比拟的

使用特权

评论回复
5
chenjun89| | 2023-8-5 20:04 | 只看该作者
这就是思维导图?

使用特权

评论回复
6
coshi| | 2023-8-5 20:28 | 只看该作者
如何确定哪些任务是空闲任务呢

使用特权

评论回复
7
qcliu| | 2023-8-5 21:00 | 只看该作者
请问什么叫做可剥夺内核呢?这是它的特性吗

使用特权

评论回复
8
drer| | 2023-8-5 21:32 | 只看该作者
在我们跑系统的时候,会不会出现一种极限情况就是一个低优先级的任务一直无法执行啊

使用特权

评论回复
9
weifeng90| | 2023-8-6 09:01 | 只看该作者
你这个哪里是思维导图?纯文字啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

1273

帖子

1

粉丝