安防通讯百科

您现在的位置是:首页 > IT通信百科 > 正文

IT通信百科

UCOSII,ucosii任务是如何调度的?

root012023-04-23IT通信百科50

UCOS-III的任务调度

任务调度就是CPU终止当前正在运行的任务,转而去执行其他就绪的任务。

UCOS-III 是可剥夺型内核,因此当一个高优先级的任务准备就绪,并且在当前正在执行的任务中发生了任务调度,那么此时这个在任务就绪表中的最高优先级的任务,就会获得CPU的使用权。

UCOS-III的任务调度是有任务调度器来完成的(所谓任务调度器其实就是两个函数),任务调度器函数有2种:分别是 任务级调度器和中断级调度器。

任务级调度器为OSSched()。

中断级调度器为函数OSintExit(),当退出外部中断服务函数的时候使用中断级任务调度。

 1、ucos ii是原来只有0~63个优先级,而且优先级不能重复,ucos iii允许几个任务使用同一个优先级,在同一个优先级里面,支持时间片调度法;

  2、ucos iii允许用户在程序运行中动态配置实时操作系统内核资源,比如,任务、任务栈、信号量、事件标志组、消息队列、消息数、互斥型信号量、存储块划分和定时器,可以在程序运行中变更。这样,用户可以避免在程序编译过程中出现资源不够分配的问题。在资源复用上,也做了一些改进。

  3、μC/OS-II中,最多任务数有64个,到了版本2.82以后是256个,μC/OS-III中,用户可以由任意多的任务、任意多的信号量、互斥型信号量、事件标志、消息列表、定时器和任意分配的存储块容量,仅受限于用户CPU可以使用的RAM量。

任务栈和函数栈有很大不同,要回答你的问题首先应该需要知道任务是怎样切换的以及切换过程对栈的操作。

正如你所说,每个任务都需要分配一个内存空间,这个内存空间作为任务栈,在任务运行时使用。先说单任务情况,给该任务分配一个内存空间作为任务栈,假设在一个时候程序暂停,再运行任务时,仍然可以接着刚才停之前运行处继续执行,为啥呢?因为在停的时候该任务栈保存了所有该任务的信息,再回来时可以继续执行。

换到多任务,每次执行代码cpu是不会关心是什么任务,它只会根据当前指令和栈里的信息执行而已。试想一下,一个任务执行的时候被打断,再次返回时栈里的信息不变,它是不是可以按照被打断前那样继续执行。

好了,接下来该说切换任务时怎么找到栈。要切换任务一般在中断或者陷阱产生后才切换,也就是说当前任务将被打断,进去中断后操作系统(ucos2等)需要将一些必要的寄存器信息保存到该任务栈中,然后找到即将运行的任务栈,恢复寄存器信息即可运行别的任务。举个例子,假设任务a在地址为0x0a0000的指令处被打断,此时pc寄存器(假设该寄存器存放当前指令地址的寄存器)和其他一些相关寄存器被保存到该任务的任务栈中。需要切回该任务时,只要从该任务栈中恢复这些寄存器即可,此时cpu就知道任务刚才被打断时在地址为0x0a0000处,就可以沿着该地址继续执行。

任务切换时cpu入栈出栈确实不用普通用户关系,不关心并不是什么都没做,这部分已经由操作系统处理(如果你需要移植的话,怎么出栈怎么入栈可以自己写),出栈入栈按照一定的顺序保障寄存器恢复正确。

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~