《嵌入式操作系统UCOSII原理及应用》任哲—学习笔记

更新时间:2023-11-26 17:02:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 嵌入式实时操作系统的概念

1. 计算机操作系统:对计算机系统资源进行管理,并向计算机用户提供若干服务。OR:计算机操作系统是计算机硬件的一个软件包装,它为应用程序设计人员提供了一个更便于使用的虚拟计算机。 2. 操作系统功能:

1)处理器的管理:(1) 中断管理;(2)对处理器工作进行调度; 2)存储的管理: 3)设备的管理: 4)文件的管理: 5)网络和通信的管理: 6)提供用户接口:

3. 嵌入式系统:对对象进行自动化控制而使其具有智能化并可嵌入对象体系中的专用计算机系统。

4. 嵌入式操作系统:运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件。 5. 实时操作系统:

(1)多任务系统;

(2)任务切换时间与系统中的任务数无关; (3)中断延时的时间可预知并尽可能短。

第二章uC/OS-II中的任务

1. uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度。 2. UC/OS-II的任务组成部分:

(1)任务程序代码:任务的执行部分; (2)任务堆栈:保存任务工作环境;

(3)任务控制块:保存任务属性。 3. uC/OS-II的两种任务:

用户任务:由应用程序设计者编写的任务。 系统任务:系统提供的任务。 4. 任务的状态:

(1)睡眠状态:是否配置或剥夺任务控制块的配置情况;

(2)就绪状态:任务就绪表进行就绪登记,等待优先级,具备运行充分条件;

(3)运行状态:获得CPU使用权限,任何时候只有一个任务处于运行状态。 (4)等待状态:正在运行的任务,需要等待一段时间或一件事件发生在运行,暂时交出CPU使用权。

5. 用户任务代码结构:任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构叫做超循环结构。

6. OSTaskCreate()用来创建任务的函数;OSStart()用来启动各项任务的函数,启动后,任务就交由操作系统来管理和调度了。 7. uC/OS-II预定义了两个为应用程序服务的系统任务:

空闲任务:每个应用程都必须使用的,是CPU处于空闲时有事可做,也可在其中添加用户工作代码;

统计任务:根据实际需要进行选择使用。函数名OSTaskSTat(),统计CPU的使用状态,以百分比形式存在变量OSCPUUsage中。若要使用这个任务,则要必须把系统头文件OS_CFG.H中的配置常熟OS_TASK_STAT_EN设置为1,并在创建统计任务之前调用OSStatInit()对统计系统进行初始化。 8. 任务的优先权及优先级别

(1)uC/OS-II有64个任务优先级别,“0”表示最高优先级,数字越大优先级越低。

(2)为了节省内存,可以根据需要设置OS_CFG.H中的最低优先级配置常数OS_LOWEST _PRIO,来说明应用程序中任务优先级的数目。拥有优先级从“0”~“OS_LOWEST _PRIO” OS_LOWEST _PRIO+1个任务。固定的OS_LOWEST _PRIO分配给空闲任务,若使用了统计任务,则OS_LOWEST _PRIO-1分配给

统计任务。因此用户可使用OS_LOWEST _PRIO-1个任务优先级。 9. 任务堆栈

(1)堆栈就是根据存储器中数据“后进先出”的原则组织的连续存储空间,为了满足任务切换和响应中断时保存CPU寄存器中的内容及存储任务是有数据的需要,每个任务务必要有自己的堆栈。

(2)在OS_CPU.H中专门定义了一个数据类型OS_STK,用此来定义一个数组作为任务堆栈的栈区。在用OSTaskCreate来创建一个任务时,把数组的指针传递给栈顶参数ptos,就可以把该数组与任务关联起来成为任务的堆栈。

(3)堆栈的增长方向因处理器不同而不同,有的处理器是向上增长的,则OSTaskCreate()中的数组指针从[0]开始;有的处理器是向下增长的,则OSTaskCreate()中的数组指针从[TASK_STK_SIZE-1]开始。因此在编程时,为了提高可移植性,利用OS_CFG.H中的常数OS_STK_GROWTH作为选择开关来把两种代码都编写出来。

(4)任务堆栈初始化:就是将任务指针、任务堆栈指针、程序状态字等事先存放在任务堆栈中,当任务获得CPU使用权时,就把任务堆栈中数据读出启动任务。初始化工作由操作系统负责,在OSTaskCreate()创建任务时,会通过调用任务堆栈初始化函数OSTaskStkInit()来完成。需根据处理器的寄存器及堆栈的操作方式,在用户进行移植时进行编写。 10. 任务控制块

(1)任务控制块(OS_TCB):用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性表。

(2)任务控制块主要负责吧任务代码和任务堆栈进行关联,使得任务控制块、任务代码和任务堆栈成为一个整体,并且系统要通过这个任务控制块来感知和管理一个任务。任务控制块就相当于任务的身份证,没有身份证就不能被系统认知和管理。

(3)任务控制块是一个结构型数据,当用OSTaskCreate()创建任务时,就会对任务块中的所有成员赋予该任务相关的数据,并驻留在RAM中。

(4)uC/OS-II用两条链表来管理任务控制块,一是空任务链表(其中任务控制块没有分配给任务,调用OSInit()建立);二是任务块链表(中所有任务块已分配给任务,调用OSTaskCreate()建立)。

(5)uC/OS-II可以用OSTaskDel()删除一个任务,实质上就是把任务从任务控制链表中删除,并把它归还个空任务控制链表。

(6)任务块初始化:由操作系统负责,当调用OSTaskCreate()时,这个函数就会调用系统函数OSTCBInit()来为任务块进行初始化。 11.任务就绪表

(1)uC/OS-II进行任务调度的依据就是任务调度表,而任务调度表的OSRdyGrp(8位二进制)与OSRdyTbl[](8位二进制)组合来表示任务的优先级。

(2)可将优先级这个单字节的数值转化为6位二进制数字(最大63为00111111),高3位用来指明变量OSRdyGrp的具体数据位置1,表示OSRdyTbl[*]任务组中有任务就绪,低3位用来指明任务组OSRdyTbl[*]中的具体数据位置1,表示任务组中的具体任务就绪。

(3)对任务就绪表的操作:从任务就绪表中读取最高优先级的任务。 12. 任务调度

(1)任务调度是有任务调度器来完成的,任务调度器的任务:一是查找最高优先级别的就绪任务;二是实现任务的切换。

(2)在uC/OS-II中有两种任务调度器:任务级的调度器由OSSched()来实现;中断级的任务调度器由OSIntExit()实现。

(3)任务调度器切换任务的步骤:一,获得待运行任务的TCB指针;二,进行断点数据的切换。

(4)任务切换可依据OSTCBHighRdy和OSTCBCur这两个分别指向待运行任务控制块和当前任务控制块的指针在宏OS_TASK_SW()中实现。

(5)任务的切换就是断点数据的切换,断点数据的切换也就是CPU堆栈指针的切换,被终止运行任务的任务堆栈指针要保存到该任务的任务控制块中,待运行的任务堆栈指针要由该任务控制块转存到CPU的SP中。这些操作就需要OSCtxSw()来实现。

(6)由于目前的处理器一般没有对程序指针寄存器PC的出栈和入栈指令,就利用中断,让中断向量指向OSCtxSW(),利用系统在跳转到中断服务程序时自动把断点指针压入堆栈,利用中断返回指令IRET把断点指针推入CPU的PC寄存器,恢复运行任务的断点。这样就实现了任务断点的保存和恢复了。

13. 任务的创建

(1)任务的穿件实质上就是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个整体的任务。

(2)创建任务的函数:OSTaskCreate()和OSTaskCreateExt()。后者是前者的扩展,并提供了一些附加功能。 14. 任务的挂起和恢复

(1)用户任务可以通过调用系统函数OSTaskSuspend()来挂起自身或者除空闲任务之外的其他任务,只能在其他任务中调用恢复函数OSTaskResume()使其恢复为就绪状态。 15. 其他任务管理函数

(1)任务优先级别的修改:OSTaskChangePrio(INT8U oldprio, INT8U newprio);

(2)任务的删除:OSTaskDel(INT8U prio); (3)请求删除任务:OSTaskDelReq(INT8U prio);

(4)查询任务的信息:OSTaskQuery(INT8U prio, OS_TCB *pdata); 16.uC/OS-II的初始化

OS_Init(); 17.uC/OS-II的启动 OSStart();

本文来源:https://www.bwwdw.com/article/d1lt.html

Top