UCOS-III任务管理 (上)
1、任务的基本概念
在生活中我们对许多问题进行分而治之,这里就存在许多的大问题和小问题,小问题解决掉,大问题才能随之而解决,在这里小问题即是本次所说的小任务。
在我们设计复杂、大型程序的时候也是一样的,将这些负责的程序分割成许多个简单的小程序,这些小程序就是单
个的任务,所有的小任务和谐的工作,最终完成复杂的功能。在操作系统中这些小任务可以并发执行,从而提高CPU的
使用效率。
UCOSIII就是一个可剥夺的多任务系统,我们使用UCOSIII的一个重要 的原因就是它的多任务处理能力。
2、UCOSIII中的任务
在UCOSIII中任务就是程序实体,UCOSIII能够管理和调度这些小任务。
在UCOSIII中任务由三部分组成:任务堆栈、任务控制模块和任务函数。
在此给出任务函数的模版
void XX task(void *p_arg)
{
/* 任务处理 */
while(1)
{
}
}
3、UCOSIII系统任务
系统任务,即系统默认的的任务。
1)空闲任务:UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务有UCOSIII自动创建,不需要用户手动创建。
2)时钟节拍任务:此任务也是必须创建的任务。
3)统计任务:可选任务,用来统计CPU使用率和各个任务的堆栈使用量。此任务是可选任务,由宏OS_CFG_STAT_TASK_EN控制是否使用此任务。
4)定时任务:用来向用户提供定时服务,也是可选任务,由宏OS_CFG_TMR_EN控制是否使用此任务。
5)中断服务管理任务:可选任务,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任务。
UCOS-III任务管理 (中)
1、任务堆栈的创建
任务堆栈属于任务的重要组成部分,为了满足任务切换和响应中断时保存CPU寄存器中内容及任务调用其他函数时的需要,每个任务都应该有自己的堆栈。
eg,#define START_STK_SIZE 512//堆栈大小512*4
CPU_STK START_TASK_STK[START_STK_SIZE];
2、任务堆栈初始化
把任务初始数据放到任务堆栈的工作即是任务堆栈的初始化,OSTaskStkInit()
3、UCOSIII任务就绪表
优先级:UCOSIII中任务优先级数由宏OS_CFG_PRIO_MAX来配置,UCOSIII中数值越小,优先级越高,最低可用优先级即OS_CFG_PRIO_MAX-1。
就绪表:OSPrioTb1[] OSRdyList[]
UCOS-III任务管理 (下)
1、可剥夺型任务调度
任务调度就是中止当前正在运行的任务转而去执行其他的任务。
UCOSIII是可剥夺型内核,因此当一个高优先级的任务准备就绪,并且此时发生了任务调度,那么这个高优先级的任务就会获得CPU的使用权!
UCOSIII中的任务调度是由任务调度器来完成的,任务调度器有2种:任务级调度器和中断级调度器。
任务级调度器为函数OSSched()。
中断级调度器为函数OSIntExit(),当退出外部中断服务函数的时候使用中断级任务调度。
2、任务切换
当UCOSIII需要切换到另外一个任务时,它将保存当前任务的现场到当前任务的堆栈中,主要是CPU寄存器值,然后恢复新的现场并且执行新的任务,这个过程就是任务切换。
任务切换分为两种:任务级切换和中断级切换。
任务级切换函数为:OSCtxSw()。
中断级切换函数为:OSIntCtxSw()。