uCOS-II任务讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.uCos-II操作系统内核的主要工作就是对任务进行管理和调度. 在应用程序设计的角度来看,uCos-II的任务就是一个线程.
2.从任务的存储结构来看,uCOS-II的任务由三个部分组成: 1-任务程序代码(任务的执行部分). 2-任务堆栈(用于保存任务工作环境) 3-任务控制块(用于保存任务属性)
3.uCOS-II的任务有两种,用户任务和系统任务. 由应用程序设计者编写的任务叫做用户任务. 由系统提供的任务叫做系统任务. 用户任务是为解决应用问题而编写的,系统任务是为应用程序来提供某种服务的.
4,任务的5种状态
5.从等待状态不能直接进入运行状态.
6.从程序设计的角度来看,一个uCOS-II任务的代码就是一个C语的函数.为了可以传递各种不同类型的数据甚至是函数,任务的参数是一个void类型的指针.可以说uCOS-II任务是一个代码结构是带有临界段的无限循环.
7.用户任务他不是被主函数或其他函数调用的, 主函数main()只负责创建和启动它们,而操作系统负责来调度运行.
8.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL用来做临界保护的.
9.OSTaskCreate()为操作系统uCOS-II提供的用来创建任务的函数.
10.OSStart()为操作系统提供启动各任务的函数.启动任务以后,任务就应由操作系统来管理和调度了.
11.uCOS-II预定义了两个为应用程序服务的系统任务:空闲任务和统计任务.其中空闲任务是每个应用程序必须使用的,而统计任务则是应用程序可以根据实际需要来选择使用的.
12.空闲任务:让CPU在没有用户任务可执行时有事可做.
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();
}
}
uCOS-II规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的.
13.统计任务(OSTaskStat())每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUUsage中. 如果用户应用程序要使用统计任务,则必须把定义在系统头文件OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置为1,并且必须在创建统计任务之前调用函数OSStatInit()对统计任务进行初始化.
14.通常一个应用程序的任务数小于64,数字0表示任务的优先级别最高;在文件OS_CFG.H中通过给表示最低优先级别的常数OS_LOWEST_PRIO赋值的方法,来说明应用程序中任务优级别的数目.
15.堆栈就是在存储器中按数据"后进先出"的原则组织的连续存储空间.
16.任务堆栈区的创建,在文件OS_CPU.H中专门定义了一个数据类型OS_STK. typedef unsigned int OS_STK.在应用程序中定义任务堆栈的栈区即定义一个OS_STK类型的一个数组即可.
17.因为不同的处理器的堆栈的成长方式可能不一样,我们可以使用OS_CFG.H中的常数OS_STK_GROWTH做为开关,以适应不同的堆栈增长方式的需求.
18.任务堆栈的初始化工作是在创建任务函数OSTaskCreate()通过调用任务堆栈初始化函数OSTaskStkInit()来完成.这个函应该是在用户移植是自己编写.
19.COS-II用两条链表来管理任务控制块. 一条是空任务块链表(其中所有任务控制块还没有分配给任务) 二条是任务块链表(其中所有任务控制块已经分配给任务)
20.uCOS-II允许用函数OSTaskDel()删除一个任务.删除一个任务,实质上就是把该任务从任务控制块链表中删掉,并把它归还给空任务控制块链表.
21.任务的任务控制块就如同人的身份证一样重要.
22.给用户任务分配任务控制块及对其进行初始化也是操作系统的职责.当应用程序调用函数OSTaskCreate创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化.这个函数首先被创建任务从空任务控制块链表获取珍上任务控制块,然后,用作任务的属性对任务控制块各个成员进行赋值;最后再把这个任务控制块链入到任务控制块链表的头部.
23.uCOS-II进行任务调度的思想是,每时每刻让优先级最高的就绪任务处于运行状态.
24.uCOS-II进行任务调度的依据就是任务就绪表.系统总是从处于就绪状态的任务中来选择一个任务运行.
25.想手动的将任务设计为就绪状态,修改就绪表就可以了.
26.任务调度器的主要工作有两项:一是在任务就绪表中查找具有最高优先级别的就绪任务,二是实现任务的切换.
27.uCOS-II有两种调度器:一种是任务级的调度器,另一种是中断级的调度器.任务级的调度器是由函数OSSched()实现,而中断级的调度器由函数OSIntExt()来实现.
28.uCOS-II允许应用程序通过调用函数OSScheLock()和OSSchedUnlock()给调度器上锁和解锁.定义一个变量OSLockNesting来记录调度器被锁和解锁情况.
29.任务切换就是中止正在运行的任务,转而去运行另外一个任务的操作.这个任务应该是就绪任务中优先级别最高的那个任务. 任务的切换就是断点数据的切换,断点数据的切换就是CPU堆栈指针切换,被中止运行任务的任务堆栈指针要保存到该任务的任务控制块中,待运行任务的任务堆栈指针要该任务控制块转存到CPU的SP中.
30.创建任务的工作实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务.
31.uCOS-II有两个用来创建任务的函数,OSTaskCreate(),OSTaskCreateExt(),其中函数OSTaskCreateExt()是OSTaskCreate()的扩展,并提供了一些附加功能.
32.uCOS-II有规定,在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务.
33.所谓挂起一个任务就是停止这个任务的运行,用户任务可以调用OSTaskSuspend()来挂起自身或空闲任务之外的其他任务.
34.在使用uCOS-II所有的服务之前,必段调用初始化函数OSInit();对自身的运行环境进行初始化.
35.小结: 任务由任务控制块,任务堆栈和任务代码三部组成.系统通过任务控制块来感知和控制任务.任务堆栈主要用来保护断点和恢复断点,任务代码是一个超的循环结构,它描述了任务的执行过程.在创建一个任务时,函数负责给任务分配任务控制块和任务堆栈.并对它们进行初始化.然后把任务控制块,任务堆栈,任务代码三者关联起来形成一个完整的任务. 系统是按任务就绪表和任务的优先级别来调度任务的.执行任务工作的是调度器,它负责查找具有最高优先级别的就绪任务并运行它.同时把这个任务TCB的指针存放在OSTABCur中,通常,系统在调用API函数和运行中断服务程序之后都要调用函数OSSched()来进行一次任务调度. 任务切换的核心工作是任务堆栈指针的切换. 任务的优先级别也是任务的标识. 应用程序首先应该调用函数OSInit()对全局变量和数据结构进行初始化,以建立uCOS-II的运行环境. 应用程序是通过函数OSSstart开始进入多任务管理的.但在调用函数OSStart之前,必须至少创建一个任务.(扣扣1138474382)