资源描述
嵌入式实时操作系统课程大作业专业计算机科学与技术学生姓名 谢正涛班级D计算机131学号1310704123任课教师 孟 海 涛完成日期2016年1月14日一、嵌入式实时操作系统的基本概念2二、C/OS-II2三、C/OS-II的中断和时钟6四、任务的同不通信8五、信号量级8六、动态内存管理9七、单片机上移植C/OS-II9 前言有人说,嵌入式系统的应用和发展是计算机技术自桌面系统和网络技术之后,IT产业和IT技术的又一个新的重大进展。事实的确如此。就现在的情况来看,在当今人们的生产和生活中,嵌入式系统的应用和影响无处不在。暂且不论火箭、地球卫星、汽车生产线,也不论先进的武器装备系统,就是在日常生活中人们几乎天天离不开的移动电话、空调器、数码相机、洗衣机、电饭锅、电热水器先等装置和设备中,都有嵌入式系统在暗暗地发挥着控制作用,从而使这些装置和设备具有了较高的自动化水瓶,甚至体现出了某种智能性。为人们提供了更为体贴、更为周到的服务。可以期望,就在不远的将来,普通百姓还会用到地球卫星定位系统、高级音响系统、智能可视电话、只能采暖设备、个人医疗保健设备、家用机器人等更为人性化的装置和设备,从而使人们的生活更加舒适,工作效率更高。然而,这一切都是无不依赖嵌入式系统技术的发展和应用。做为嵌入式系统这种比较特殊的计算机系统,其基本构成仍然是硬件和软件两部分。一、嵌入式实时操作系统的基本概念 操作系统(Operating System OS)是一种系统软件。它在计算机硬件与计算机应用程序之间,用过提供应用程序接口(Application Programming Interface, API),屏蔽了计算机硬件工作的一些细节,从而使应用程序疯人设计人员得以在一个友好的平台上进行应用程序的设计和开发,大大提高了应用程序的卡发效率。嵌入式系统作为一个计算机系统,当然也需要一个合适的操作系统的支持,这种应用与嵌入式系统中的操作系统就叫做嵌入式操作系统。二、C/OS-IIC/OS-II操作系统内核的主要工作是对任务进行管理和调 度。弄清楚什么是任务、任务的结构和C/OS-II对任务的管理方法,对理解C/OS-II的体系结构无疑是极其重要的。 任务的基本概念:1、任务及其内存结构 2、任务的状态 3、用户任务代码的一般结构 (1)用户任务代码的一般结构 (2)用户应用程序的一般结构 4、任务系统 (1)空闲任务 (2)统计任务 5、任务的优先权及优先级别任务堆栈:1、任务堆栈的创建 2、任务堆栈的初始化任务控制块及其链表:1、任务控制块结构 2、任务控制块链表 3、任务控制块的初始化任务就绪表及任务调度: 1、任务就绪表结构 2、对任务就绪表的操作 (1)登记 (2)注销 (3)最高优先权就绪任务的查找 3、任务调度 (1)调度器的主要工作 (2)获得待运行就绪任务控快的 指针 (3)任务切换宏OS_TASK_SW()任务的创建:从前面的内容可知,C/OS-II是通过任务控制快来管理任务的。因此,创建任务的工作实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。当然,还要使刚创建的任务进入就绪状态,并接着引发一次任务调度。C/OS-II有两个用来创建任务的函数:OSTaskCreate()和OSTaskCreateExt()。其中OSTaskCreateExt()是OSTaskCreate()的扩展,并提供一些附加功能。用户可根据需要使用这两个函数之一来完成任务的创建工作。1、用函数OSTaskCreate()创建任务 TNT8U OSTaskCreate( void(*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) # if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr; #endif Void *psp; INT8U err; if(prioOS_LOWEST_PRIO) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); if(OSTCBPrioTblprio=(OS_TCB*)0) OSTCBProiTblprio=(OS_TCB*)1; OS_EXIT_CRITICAL(); psp= (void*)OSTaskStkInit( task, pdata, ptos, 0); Err =OSTCBInit( prio, Psp, (void*)0,0,0, (void*)0,0);If(err=OS_NO_ERR) OS_ENTER_CRITICAL(); OSTaskCtr+; OS_EXIT_CRITICAL(); If(OSRunning) ISSched(); Else OS_ETER_CRITICAL();OSTCBPrioTblprio=(OS_TCB)0;OS_EXIT_CRITICAL(); Return (err); Else OS_EXUT_CRITICAL(); Return(OS_PRIO_EXIST);2、用函数OSTaskCreateExt()创建任务INT8U OSTaskCreateExt( Void (*task)(void *pd), Void *pdata, OS_STK *ptos, INT8U prio, INT16U id, OS_STK *pbos, INT32U stk_size, Void *pext, INT16U opt); 任务的挂起和恢复:所谓的挂起一个任务,就是停止这个任务的运行。在C/OS-II中,用户任务可以通过调用系统提供OSTaskSuspend()函数来挂起自身或者除空闲任务之外的其他任务。用函数OSTaskSuspend()挂起任务,只能在其他任务中通过调用恢复函数。其他任务管理函数:1、任务优先级别的修改 每个任务都必须有个优先级别,但这个优先级别并不谁一成不变的。在程序的运行过程中,任务可根据需要通过调用函数OSTaskChangePrio()来改变任务的优先级别。2、 任务的删除 所谓删除一个任务,就是把该任务至于睡眠状态。具体做法是,把删除任务的任务控制快从任务控制块链表中删除,并归还给空人呢无控制块链表,然后在人呢无就绪表中把该任务的就绪状态设置成0,于是该人呢无就不能再被调用器调用了。简单的来说,就是把他的身份证吊销了。如果一个任务调用了这个函数是为了删除自己,则应该调用函数时将函数的prio参数改成OS_PRIO_SELF 。有时,任务会占用一些动态分配的内存或者信号之内的资源。这个时候,如果有其他任务把这个任务删除了哪么被删除任务所占用的一些资源就会因为没有被释放而丢失,这是任何系统都无法接受的,因此,在删除一个占用资源的任务时,一定要谨慎。C/OS-II的初始化和任务的启动:在使用C/OS-II的所有服务之前,必须调用C/OS-II的初始化函数OSInit(),对C/OS-II自身的运行环境进行初始化。函数OSInit()将对C/OS-II的所有全局变量和数据结构进行初始化,同时创建空间空闲任务OSTaskIdle,并赋之以最低的优先级别和永远的就绪状态。如果用户应用程序还要使用统计任务,则OSInit()还要以优先级别为OS_LOWEST_PRIO-1来创建统计任务。三、C/OS-II的中断和时钟中断是计算机系统出来异步事件的重要机制。当异步事件发生时,事件通常通过硬件向CPU发出中断请求。在一般情况下,CPU相应这个请求后会立即运行中断服务程序来出来这个事件。为了处理人呢无延时、任务调度一些与时间有关的事件,任何一个计算机系统都应该有一个系统时钟。与其他计算机系统一样,C/OS-II的时钟是同过迎来关键定时器产生定时中断来实现的。任务在运行的过程中,应内部或外部异步事件的请求终止当前任务,而去处理异步事件所要求的热舞的过程叫做中断。应中断请求而运行的程序叫做中低端服务子程序,中断服务子程序的入口地址叫做中断向量。C/OS-II系统相应中断的过程是:系统接受到中断请求,如果这时CPU处于中断允许状态,系统就会终止在运行的当前任务,而按照中断向量的指向转而去运行中部高端服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被终止的任务继续运行,或者转向运行另一个具有更高优先级别的就绪任务。中断级任务切换函数:C/OS-II在运行完中断服务程序后,并不一定返回到中断的任务,而是要通过一次任务调度来决定返回的去向,因此系统还需要一个中断级任务调度器。应用程序中的临界点:1. 临界点的基本概念 当有异步事件发时会引发中断请求,但CPU之有在中断开放期间才相应中断请求。也就是说,所有的CPU都具有开中断和关中断指令,以便使一些代码段不受到中断的干扰。在C/OS-II中,那些不希望被中断的代码叫做临界点。2. C/OS-II的时钟 任何操作系统都要提供一个周期性的信号源,以提供系统处理诸如延时、超时等与时间有关的事件,这个周期性的信号源叫做时钟 C/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为毫秒级的周期性中断来实现系统时钟。最小的时钟单位就是两次中断中间相隔的时间,这个最小时钟单位叫做时钟节拍。3. 时间管理 任务的延时:由于嵌入式系统的任务是一个无限循环,并且C/OS-II还是一个抢占式内核,所以为了使高优先级别的任务不至于独占CPU,可以给其他任务优先级别较低的任务获得CPU使用机会,C/OS-II规定:出了空闲任务之外所有任务必须在任务中合适的位置调用系统提供的函数OSTinmeDly(),使当前任务的运行延时一段时间并进行一次任务调度,以让出CPU的使用权。 取消任务延时:延时的任务可以通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态。如果新任务比正在运行任务优先级别高,则立即引发一次任务调度。四、任务的同不通信 应用程序中的各个任务,必须通过彼此之间的有效合作,才能完成一项大规模的工作,因为这些任务在运行时,经常需要相会无冲突的访问同一个共享资源,或者需要相互支持和依赖,甚至有时还要先后与加以必要的制约,才能保证任务的顺利进行。因此,操作系统必须具有对任何任务的运行进行调协的能力,从而保证任务之间的无冲突、流畅的同不运行,而不致导致灾难性的后果。任务间的同步:为了现实各个任务之间的合作和无冲突的运行,在各个任务之间必须建立一些制约关系,其中一种制约关系叫做直接制约关系,另一种制约关系叫做间接制约关系。 直接关系制约关系源于任务之间的合作。间接制约关系源于对资源的共享。事件:C/OS-II使用信号量、邮箱和消息队列这些中间环节来实现任务之间的同行。为了方便起见,这些中间环节都统一称为事件。五、信号量级在一个程序中一个任务的操作能否实施,尝尝需要由多个信号量的逻辑运算结果作为前提条件。为了处理此类问题,C/OS-II提供了可以处理多个信号的量集。信号量集的结构:从总体上看C/OS-II把信号量集分成了两部分:标志组和等待任务链表。标志组存放了信号集的所有信号,而等待任务链表中的每个节点都对应着一个叫做OS_FLAG_NODE的结构。OS_FLAG_NODE结构实质上就是等待任务控制块。也就是说,C/OS-II信号量集由一个标志组和多个等待任务控制块组成。六、动态内存管理 应用程序在运行中为了某种特殊需要,经常需要临时获得一些内存空间,因此作为一个比较完善的操作系统,必须具有动态分配内存的能力。能否合理、有效的对内存储器进行分配和管理,是衡量一个操作系统品质指标之一。特别是对于实时操作系统来说,还应该保证系统在动态分配内存时,他的执行时间必须是可确定的。C/OS-II改进了ANSI C用来动态分配和释放内存的函数malloc()和free(),使他们尅对大小固定的内存快进行操作,从而使函数malloc()和free()的执行时间成为可确定的,满足了实时操作系统的要求。内存控制快:C/OS-II对内存进行两级管理,即把一个连续的内存空间分为若干个分区,每个分区又分为若干个大小相等的内存快。操作系统以区分为单位来管理动态内存,而任务以内存快为单位来获得和释放动态内存。内存分区及内存快的使用情况则由un诶村控制块来记录。 1.内存快C/OS-II以内存快为单位向应用程序提供动态内存。内出快大小可由用户订制。 2.内存分区大小相等的多个内存快可以组成一个内存分区。内存分区是系统对内存进行管理的基本单位。 3.内存分区与内存快的定义在内存定义一个内存分区及其内容快的方法非常简单,只要顶一个二维数组即可。七、单片机上移植C/OS-II 操作系统是一种与硬件相关的软件,根据某一种处理器来设计的操作系统通常不能在其他种类的处理器上运行,如果要在其他处理器上运行该操作系统,则必须要对操作系统进行移植。一个软甲的移植工作总是与用户所选择的处理器硬件结构相关的,因此把一个软件往不同的处理器上移植的方法也不进相同,所以这里介绍一些共同特点。 1.可重入函数的概念 2.时钟节拍的产生 3.任务堆栈的设计 4.文件OS_CPU.H的修改 5.任务堆栈的设计 6.文件OS_CPU_C.C的修改
展开阅读全文