您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > uCOS-II的移植及使用.
uCOS-II的移植及使用报告人:日期:2016.1.181425uC/OS-II的任务3uC/OS-II的移植uC/OS-II同步与通信uC/OS-II概述uC/OS-III简介目录uC/OS-II概述•C/OS——MicroControllerOS,微控制器操作系统–美国人JeanLabrosse1992年完成–应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等–1998年出C/OS-II,目前的版本C/OS-IIV2.91–2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中–网站概述-性能特点•源代码公开•可移植(Portable)–大部分代码用ANSIC写,与处理器无关,移植时不需修改–少量与微处理器硬件相关的部分用C与汇编编写,移植时需修改:•OS_CPU.H//与硬件相关,移植时需修改•OS_CPU_A.ASM//集中了所有与处理器相关的汇编语言代码•OS_CPU.C//集中了所有与处理器相关的汇编语言代码uC/OS-II概述-性能特点•可裁剪(Scalable)–可以只使用C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个C/OS-II调用,而另一个产品则使用了几乎所有C/OS-II的功能,这样可以减少产品中的C/OS-II所需的存储器空间(RAM和ROM)。–可剪裁性通过条件编译实现。uC/OS-II概述-性能特点•可剥夺性(Preemptive)与可确定性–内核可剥夺、函数调用或系统服务的执行时间具有可确定性,是硬实时操作系统。•支持多任务–C/OS-II可以管理255个任务•任务栈–每个任务有自己单独的栈,C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。uC/OS-II概述-性能特点•系统服务–C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。•中断管理–中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。应用软件(用户代码)μC/OS-II(与处理器类型无关的代码)μC/OS-II配置文件(与应用程序有关)移植μC/OS-II(与处理器类型有关的代码)软件硬件CPU定时器OS_Q.COS_SEM.COS_TASK.COS_TIME.CuC/OS-II.CuC/OS-II.HOS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_CFG.HINCLUDES.HOS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.CuC/OS-II概述--文件结构体系结构1425uC/OS-II的任务3uC/OS-II的移植uC/OS-II同步与通信uC/OS-II概述uC/OS-III简介目录uC/OS-II的任务2.1任务组成部分2.2任务的结构2.3任务存储结构2.4任务状态2.5任务优先级2.6任务就绪表及任务调度2.7任务操作2.8uC/OS-II的初始化一个完整的任务应该有如下三部分:任务代码(程序)任务的私有堆栈(用以保护运行环境)任务控制块(提供私有堆栈也是虚拟处理器的位置)2.1uC/OS-II的任务—组成前一个任务控制块的指针后一个任务控制块的指针指向任务的指针指向任务堆栈的指针任务的优先级别……voidmytask(void*pdata){……for(;;){……}}任务的代码任务控制块……任务堆栈任务图2-4任务的组成从应用程序设计的角度来看,任务就是一个线程。就是一个用来解决用户问题的C语言函数和与之相关联的一些数据结构而构成的一个实体从任务存储结构来看,由三部分构成:任务程序代码、任务堆栈和任务控制块。任务控制块用来保存任务属性,任务堆栈用来保存任务工作环境,任务程序代码是任务的执行部分2.1uC/OS-II的任务—组成•uCOS中的任务是一个线程,其代码通常是一个无限循环结构/超循环结构,看起来像其它C函数一样。2.1.1uC/OS-II的任务—代码结构voidMyTask(void*pdata){for(;;){可以被中断的任务代码;OS_ENTER_CRITICAL();//进入临阶段(关中断)不可以被中断的任务代码;OS_EXIT_CRITICAL();//退出临阶段(开中断)可以被中断的任务代码;}}根据嵌入式系统任务的工作特点,任务的执行代码通常是一个无限循环结构,并且在这个循环中可以响应中断,这种结构也叫超循环结构。为了有效的对中断进行控制,在任务的代码里可使用UC/OS-II定义的宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来控制何时响应中断,何时屏蔽中断。在运行这两个宏之间的代码时是不会响应中断的,这种受保护的代码段叫临界段。一旦任务建立,一个任务控制块OS_TCB就被赋值。任务控制块是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,任务的当前状态,任务的优先级等。任务CPU使用权被剥夺时,TCB保存该时刻任务状态;任务重新得到CPU控制权时,TCB确保任务从当时被中断的那一点丝毫不差地继续执行。OS_TCB全部驻留在RAM中。任务控制块就相当于是一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理的。2.1.2uC/OS-II的任务—任务控制块(TCB)任务控制块的结构typedefstructos_tcb{OS_STK*OSTCBStkPtr;//指向当前任务堆栈栈顶的指针。每个任务的堆栈容量可以是任意的。#ifOS_TASK_CREATE_EXT_ENvoid*OSTCBExtPtr;//指向任务控制块扩展的指针,扩展功能:任务执行时间、任务切换次数、任务堆栈使用情况等。OS_STK*OSTCBStkBottom;//指向当前任务堆栈栈底的指针。INT32UOSTCBStkSize;//任务堆栈的长度INT16UOSTCBOpt;//创建任务时的选择项INT16UOSTCBId;//用于存储任务的识别码。保留。#endifstructos_tcb*OSTCBNext;//指向后一个任务控制块的指针structos_tcb*OSTCBPrev;//指向前一个任务控制块的指针#if(OS_Q_EN&&(OS_MAX_QS=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEventPtr;//指向事件控制块的指针#endif#if(OS_Q_EN&&(OS_MAX_QS=2))||OS_MBOX_ENvoid*OSTCBMsg;//指向传递给任务消息的指针#endifINT16UOSTCBDly;//任务等待的时限INT8UOSTCBStat;//任务的当前状态标志INT8UOSTCBPrio;//任务的优先级别INT8UOSTCBX;//用于快速访问就绪表的数据INT8UOSTCBY;//用于快速访问就绪表的数据INT8UOSTCBBitX;//用于快速访问就绪表的数据INT8UOSTCBBitY;//用于快速访问就绪表的数据#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;//请求删除任务时用到的标志#endif}OS_TCB;任务控制块结构的主要成员typedefstructos_tcb{OS_STK*OSTCBStkPtr;//指向任务堆栈栈顶的指针……structos_tcb*OSTCBNext;//指向后一个任务控制块的指针structos_tcb*OSTCBPrev;//指向前一个任务控制块的指针……INT16UOSTCBDly;//任务等待的时限(节拍数)INT8UOSTCBStat;//任务的当前状态标志INT8UOSTCBPrio;//任务的优先级别……}OS_TCB;任务控制块的初始化当用户程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后利用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部。初始化任务控制块函数OSTCBInit()的原型如下:INT8UOSTCBInit(){INT8UPrio,//任务的优先级别,保存在OSTCBPrio中OS_STK*ptos,//任务堆栈栈顶指针,保存在OSTCBStkPtr中OS_STK*pbos,//任务堆栈栈底指针,保存在OSTCBStkBottom中INT16Uid,//任务的标示符,保存在OSTCBId中INT16Ustk_size,//任务堆栈的长度,保存在OSTCBStkSize中void*pext,//任务控制块的扩展指针,保存在OSTCBExtPtr中INT16Uopt//任务的控制块的选择项,保存在OSTCBOpt中};所谓堆栈,就是在存储器中按数据“后进先出(LIFO)”的原则组织的连续存储空间。为了满足任务切换和响应中断时保存CPU寄存器中的内容及存储任务私有数据的需要,每个任务都应该配有自己的堆栈。任务堆栈是任务的重要组成部分。2.1.3uC/OS-II的任务—任务堆栈任务堆栈的创建为方便定义任务堆栈,在文件OS_CPU.H中专门定义了一个数据类型OS_STK:TypedefunsignedintOS_STK;//该类型长度为16位这样,在应用程序中定义任务堆栈的栈区就非常简单,即定义一个OS_STK类型的一个数组即可。例如:#defineTASK_STK_SIZE512//定义堆栈长度(1024字节)OS_STKTaskStk[TASK_STK_SIZE];//定义一个数组来作为任务堆栈创建任务函数OSTaskCreate()原型如下:INT8UOSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata,//传递给任务的参数OS_STK*ptos,//任务堆栈栈顶的指针INT8Uprio);//指定任务优先级别的参数当调用函数OSTaskCreate()来创建一个任务时,把数组的指针传递给函数OSTaskCreate()中的堆栈栈顶参数ptos,就可以把该数组与任务关联起来而成为该任务的任务堆栈。任务堆栈的创建堆栈的增长方向是随系统所使用的处理器不同而不同。因此在使用函数OSTaskCreate()创建任务时,一定要注意所使用的处理器对堆栈增长方向的支持是向上的还是向下的。低地址高地址堆栈增长的方向向下堆栈增长的方向向上图3-7堆栈的不同增长方向上一练习时假设使用了支持堆栈向下增长方式的处理器设置参数ptos。如果使用的处理器支持堆栈的增长方向向上,则应该为:OSTaskCreate(MyTask,&ttt,&MyTaskStk[0],20);为了提高应用程序的移植性,在编写代码时可兼顾两种情况,利用OS_CFG.H文件中的常数OS_STK_GROWTH作为选择开关,使用户可通过定义该常数的值来选择相应代码段,以适应不同的堆栈增长方向的需要。试改写上一练习代码。任务堆栈的初始化uC/OS-II在创建任务函数OSTaskCreat()中通过调用任务堆栈初始化函数OSTaskStkInit()来完成任务堆栈初始化工作的,其原型如下:OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INIT16Uopt);由于各处理器的寄存器及对堆栈的操作方式不同,因此该函数需要用户在进行uC/OS-II的移植时,按所使用的处理器由用户来编写。当CPU启动运行一个任务时,CPU的各寄存器总是需要预置一些初始数据,例如指向任务的指针、任务堆栈指针、程序状态字等。#defineOS_TASK_OPT_STK_CHK
本文标题:uCOS-II的移植及使用.
链接地址:https://www.777doc.com/doc-2864464 .html