uC/OS – II中的任务_读书笔记_3
任务的创建、任务的挂起和恢复、任务优先级别的修改、任务的删除、查询任务的信息、**uC/OS – II的初始化和任务的启动**
2.5任务的创建
2.5.1用函数OSTaskCreate()创建任务
(1)先对创建任务的优先级进行一系列的判断
(2)确认该优先级别合法且未被使用后,随即调用函数OSTaskSktInit()和函数OSTCBInit()对任务堆栈和任务控制块进行初始化。
(3)初始化成功后,除了把任务计数器加1外,还要进一步判断uC/OS的核是否在运行状态(即ISRunning的值是否为1)。如果OSRunning的值为1,则调用OSSched()进行任务调度。
(4)OSTaskCreate()创建任务成功后,将返回OS_NO_ERR;否则,返回0S_PRIO_INVALID,OS_PRIO_EXTST及在函数内调用函数失败时返回的信息。
2.5.2用函数OSTaskCreateExt()创建任务
用该函数创建任务更为灵活,但也会增加一些额外的开销。
2.5.3创建任务的一般方法
(1)调用函数0SStart()启动任务调度之前来创建任务,也可在任务中创建。
(2)但是要在启动任务函数OSStart()之前先创建一个任务,并赋予它最高的优先级,然后在这个起始任务中,在创建其他各项任务。
示意性代码:
/*********************主函数***********************/
voidmain()
{
……
OSInit(); //对uC/OS-II进行初始化
……
OSTaskCreate(TaskStart,……);
OSStart();
}
/**********************起始任务***********************/
voidTaskStart(void *pdata)
{
……
OSStatInit(); //初始化统计任务
……
while(1)
{
起始任务TaskStart()的代码段;
}
}
(3)uC/OS不允许在中断服务程序中创建任务。
2.6任务的挂起和恢复
2.6.1挂起任务
(1)挂起任务函数OSTaskSuspend()原型如下:
INT8UOSTaskSuspend(INT8U prio);
(2)函数的参数prio为待挂起任务的优先级别,如果任务要挂起自身,则参数必须为常数OS_PRIO_SELF(0xFF)。
(3)挂起任务本身,删除任务在就绪表中的就绪标志,并在任务控制块成员OSTCBStat中做挂起记录,然后引发一次任务调度,使CPU去运行就绪的其他任务。
挂起其他任务,删除任务在就绪表中的就绪标志,并在任务控制块成员OSTCBStat中做挂起记录。
函数OSTaskSuspend()流程图
2.6.2恢复任务
INT8UOSTaskResume()的原型如下:
INT8UOSTaskResume(INT8U prio);
函数0STaskResume()的流程图
2.7其他任务管理函数
2.7.1任务优先级别的修改
调用函数
0STaskChangePrio()
{
INT8Uoldprio; //任务现在的优先级别
INT8Unewprio; //要修改的优先级别
}
若调用函数OSTaskChangePrio()成果,则函数返回OS_NO_ERR。
2.7.2任务的删除
(1)所谓删除一个任务,把任务置于睡眠状态。
(2)调用OSTaskDel()删除任务自身或除了空闲任务之外的其他任务。
(3)函数原型:
#ifOS_TASK_DEL_EN
INT8UOSTaskDelReq
(
INT8U prio //要删除任务和优先级别
);
2.7.3查询任务的信息
了解应用程序运行需要了解一个任务的指针堆栈等信息,通过调用OSTaskQuery
函数原型:OSTaskQuery(
INT8U prio,
OS_TCB *pdata
);
查询成功将得到的任务信息放在结构OS_TCB变量中。
2.8uC/OS – II的初始化和任务的启动
2.8.1Uc/OS – II 的初始化
(1)初始化函数OSInit()
(2)初始化之后各全局变量的情况:
2.8.2Uc/OS – II 的启动
(1)启动函数:OSStart();
(2)启动之后各个全局变量的值
还没有评论,来说两句吧...