操作系统μC/OS-Ⅱ读书笔记(2)

第3章μC/OS-Ⅱ中的任务
3.1任务的基本概念
☆μC/OS-Ⅱ操作系统内核的主要工作就是对任务进行管理和调度
☆任务
☆μC/OS-Ⅱ就是能对小任务的运行进行管理和调度的多任务操作系统
☆代码上看,μC/OS-Ⅱ的任务是一个函数,从任务的存储结构上看,μC/OS-Ⅱ的任务由三个部分组成:任务程序代码(函数),任务堆栈和任务控制块。
任务代码:任务的执行部分
任务堆栈:保存任务的工作环境
任务控制块(TCB):任务了任务代码的程序控制块,记录了任务的各个属性

☆μC/OS-Ⅱ的任务(最多含有64个任务):用户任务(应用程序设计者编写的任务,为了解决应用问题而编写的)和系统任务(由系统提供的任务,为应用程序提供某种服务或系统本身服务)
☆任务的状态
任务的状态 说明
睡眠状态 任务只是以代码的形式驻留在程序空间(ROM或RAM),还没有交给操作系统管理时的情况叫做睡眠状态。简单地说,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态
就绪状态 如果系统为配备了任务控制块且在任务就绪表中进行了就绪登记,则任务就具备了运行的充分条件,这时任务的状态就叫做就绪状态
运行状态 处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入运行状态,任何时刻只能有一个任务处于运行状态,就绪的人任务只有当所有优先级高于本任务的任务都转为等待状态时,才能进入运行状态。
等待状态 正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给其他任务而使任务进入等待状态。
中断服务状态 一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务,这时任务的状态叫做中断服务状态。

☆任务在不同状态之间的转换图

☆用户任务代码的一般结构
根据嵌入式系统任务的工作特点,任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构也叫做超循环结构。
示例:
void Mytask (void * pdata)
{
for(;;)
{
可以被中断的用户代码;
OS_ENTER_CRITICAL(); //进入临界段(关中断)
不可以被中断的用户的代码;
OS_EXIT_CRITICAL(); //退出临界段(开中断)
可以被中断得用户代码;
}
}
从程序设计的角度来看,一个μC/OS-Ⅱ任务的代码就是一个C语言函数。同时为了可以传递各种不同类型德 数据甚至是函数,任务的参数是一个void类型的指针。
μC/OS-Ⅱ里定义的宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()用以有效地对中断进行控制。
而在运行这两个宏之间的代码时是不会响应中断的,这种受保护的代码叫做临界段。在具体应用中可以根据实际需要在一个任务中使用这对宏从而设置多个临界段。
因此,μC/OS-Ⅱ任务的代码结构是一个带有临界段的无限循环。
☆用户应用程序的一般结构
从程序设计来看,用户任务是一个任务(进程)。不会被主函数或其他函数调用,主函数只负责创建和启动它们,而由操作系统负责调度运行它们。
用户应用程序的代码示例:
void MyTask1(void *pdata) //定义用户任务1
{
for(;;)
{
……
}
}
void MyTask2(void *pdata) //定义用户任务2
{
for(;;)
{
……
}
}
void MyTask3(void *pdata) //定义用户任务3
{
for(;;)
{
……
}
}

void main()
{
……
OSInit(); //初始化μC/OS-Ⅱ
……
OSTaskCreate(MyTask1,……); //创建用户任务1
OSTaskCreate(MyTask2,……); //创建用户任务2
OSTaskCreate(MyTask3,……); //创建用户任务3
……
OSSTART(); //启动μC/OS-Ⅱ

……
}
其中,OSTaskCreate()为操作系统μC/OS-Ⅱ提供的用来创建任务的函数;OSStart()为操作系统μC/OS-Ⅱ提供的启动各任务的函数,使用之后,任务就交由操作系统来管理和调度了。
☆系统任务
μC/OS-Ⅱ里所定义的两个应用程序的系统任务:
空闲任务(每个应用程序必须使用的):
在多任务系统运行时,系统经常会在某个时间内无用户任务可运行而处于所谓的空闲态。为使CPU在没有用户任务可执行时有事可做,μC/OS-Ⅱ提供了一种叫做空闲任务OSTaskIdle()的系统任务。
void OSTASKIdle(void * pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif

pdata = pdata; //防止某些编译器报错
for(;;)
{
OS_ENTER_CRITICAL(); //关闭中断
OSdleCtr++; //计数
OS_EXIT_CRITICAL(); //开放中断 <

你可能感兴趣的:(μC/OSⅡ,COS-,任哲,实时操作系统,任务,读书笔记)