首页 > 代码库 > μC/OS-Ⅲ系统的任务切换和任务调度

μC/OS-Ⅲ系统的任务切换和任务调度

一、任务切换

         在操作系统中当任务需要从一个任务切换到另外一个任务时,要将当前任务的现场保存到当前任务的堆栈中(当前任务现场主要指CPU相关寄存器),然后回复新任务的现场并执行新任务。这个叫做上下文切换(context switch),也可以叫任务切换。

        上下文切换会给系统带来一定的负担。CPU寄存器越多,负担越重。切换时间取决于有多少寄存器需要切换。

         在μC/OS-Ⅲ中,任务切换属于与处理器相关需要移植的部分。这部分代码放在几个特殊的文件中:os_cpu.h、os_cpu_c.c和os_cpu_a.asm。

         在μC/OS-Ⅲ中,任务切换有两个函数:任务级切换函数---OSCtxSw()和中断级切换函数---OSIntCtxSw()。这两个函数大体功能相同,区别在于中断级任务切换函数由于仅被中断调度器调用,所以在被调用前已经进行了现场保存(进入中断时需进行现场保存),因此不需要任务级切换的现场保存内容,只需要回复新任务现场即可。任务切换原理书中介绍非常清楚,在此不再详述,具体内容参见本书第一版8.1、8.2节P111。

二、任务调度

        μC/OS-Ⅲ采用可剥夺调度算法,总是执行进入就绪态的优先级最高的任务。

        μC/OS-Ⅲ允许在同一优先级下有多个任务,这些任务间使用时间片轮转调度算法(即相同优先级的任务,每个任务运行一段固定的时间)。

       在程序调用某些μC/OS-Ⅲ服务函数时,调度器会启动,这些时间点又叫调度点。

        μC/OS-Ⅲ有两个调度器:在任务级代码使用OSSched(),在中断服务程序结束时调用OSIntExit()。二者的不同在于OSIntExit()在执行时会进行中断嵌套相关处理,并在任务切换时调用中断级任务切换,而OSSched()不处理中断嵌套,使用任务级任务切换。

μC/OS-Ⅲ系统的任务切换和任务调度