ucos-ii操作系统可以允许后台运行多个任务,而每个任务都是无限循环的,内核是如何调度的,
发布网友
发布时间:2022-05-01 05:21
我来回答
共4个回答
热心网友
时间:2023-10-07 14:57
每个嵌入式操作系统都会牵扯到这个问题。
任务调度通俗的讲就是操作系统分配每个任务的运行时间,协调他们的工作。
对于每个任务来说,编程者可以认为只有它占用CPU,故而可以写成无限循环的形式,在这个循环中加入系统延时(或请求消息、事件等),当任务运行到系统延时这条语句不会傻傻的等待,而是转而处理其他的任务。操作系统记住了延时时间,当时间到时如果这个任务就绪再引发一次调度,执行本任务,也就是延时之后的程序。
操作系统是怎么知道哪个任务应该运行,哪个任务需要等待,哪个任务需要消息的呢?不管哪个操作系统,都要有一个任务控制块,这个控制块要标明任务的优先级、任务的入口地址,并且给任务分别堆栈等。堆栈其实就是保存任务运行信息的,比如在哪个地方调用了系统延时,当系统调度给这个任务运行时就能找到在什么地方运行了。
找本ucOS的书看,然后读代码,能很快理解。学习任何一门知识都要扎实,这种问题书上讲解的很清楚,不要上来就问,这不是学习的好态度。祝你好运~
热心网友
时间:2023-10-07 14:58
通常情况下。ucos的所有任务都会做的事情就是在大循环查询它的消息邮箱,等收到一个消息MSG。等到之后,任务就开始执行不同的消息的处理函数,执行完毕后重来继续等下一个消息。
所谓的调度就是,当任务A执行完一次消息处理、或者查询自己邮箱发现没有消息、或者某个更高优先级的任务需要执行、或者发生某个中断的时候(这取决于内核的调度策略),内核会将任务A挂起。将这个任务A的执行上下文(寄存器状态、堆栈指针、PC指针等)保存起来,然后将它们恢复成任务B(或者中断服务程序)的执行上下文,这样寄存器、堆栈、PC等的值就切换成任务B(或者中断服务程序)的上下文,于是接下来任务B(或者中断服务程序)开始跑。
如果所有的任务都没有消息,则内核最终切换到IDLETASK(空闲任务)。这是内核提供的最低优先级任务(就是一段空跑的for循环)。每隔一定时间,空闲任务都会“自动挂起”,引发一次内核调度,使得用户任务得以运行
热心网友
时间:2023-10-07 14:58
如果你有对比过,你会发现每一个循环里都会有一个系统延时函数(DelayHHMMSS类的名字),里面就有任务优先级查询,调度的处理。另外也有可能存在信号量,邮箱等的Pend函数,该函数里也有任务优先级查询,调度处理。
所以多任务的处理其实就是,在一个任务在等待时间到或信号到的期间,可以执行另一个任务。
热心网友
时间:2023-10-07 14:59
先保存此任务,再恢复彼任务,何谓保存,CPU的寄存器入栈,何谓恢复,CPU的寄存器出栈,详细来我空间看看