二、UC/OS-II中的任务
2.1任务的基本概念
2.1.1任务及其内存结构
在设计一个较为复杂的程序时,通常把一个大型任务分解为多个小任务,然后在计算机中通过运行小任务,最终达到完成大人物的目的。这种方法可以使系统并发运行多个任务,从而提高处理器的利用率,加快程序的执行速度,因此现代操作系统几乎都是多任务操作系统。
在uC/OS-II中,与上述小任务对应的程序实体叫“任务”,而uC/OS-II就是一个能对这些小任务的运行进行管理和调度的多任务操作系统。
从代码上看,uC/OS-II的任务是一个函数;
从任务的存储结构上看,uC/OS-II任务由:任务程序代码(函数)、任务堆栈和任务控制块组成。
uC/OS-II任务的组成
进程:具有私有空间的任务
线程:没有私有空间的任务
uC/OS-II中的任务属于线程。
uC/OS-II用任务控制块链表对任务进行管理
用户任务:由应用程序设计者编写的任务(为了解决应用
问题)
uC/OS-II任务
系统任务:由系统提供的任务(为应用程序提供某种服务
或系统本身服务的)
目前,在uC/OS-II中,最多可以含有64个任务(包括用户任务和系统任务)
2.1.2 任务的状态
uC/OS-II任务的5种状态
在系统的管理下,一个任务可以在5个不同的状态之间发生转换。转换关系如图所示:
2.1.3 用户任务代码的一般结构
1.用户任务代码的一般结构
任务的执行代码是一个无线循环结构,在循环当中可以响应中断,这种结构也叫做超循环结构。
void MyTask(void *pdata)
{
for(;;)
{
可以被中断的用户代码;
OS_ENTER_CRITICAL(); //进入临界段(关中断)
不可以被中断的用户代码;
OS_EXIT_CRITICAL(); //退出临界段(开中断)
可以被中断的用户代码;
}
}
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是uC/OS-II定义的两个宏。
2.用户应用程序的一般结构
用户任务是C语言函数,不由主函数main()调用,何时运行及何时中止由操作系统来调度。
main()函数是程序运行的入口,虽不用调度任务,但要负责任务的创建并将它们交给系统。
用户应用程序的结构:
void MyTask1(void *pdata) //定义用户任务1
{
for(;;)
{
……
}
}
void MyTask2(void *pdata) //定义用户任务2
{
for(;;)
{
……
}
}
void MyTask23void *pdata) //定义用户任务3
{
for(;;)
{
……
}
}
void main()
{
……
OSInit(); //初始化uC/OS-II
……
OSTaskCreate(MyTask1,……); //创建用户任务1
OSTaskCreate(MyTask2,……); //创建用户任务2