您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > uCOS操作系统及其移植
UCOS-ii操作系统及其移植一•操作系统简介二•UCOS-ii操作系统三•操作系统的移植四•UCOS-ii向430中移植•操作系统是一种为应用程序提供服务的系统软件,是一个完整计算机系统的有机组成部分。•从层次来看,操作系统位于计算机硬件之上,应用软件之下。所以也把它叫做应用软件的运行平台。什么是计算机操作系统(OperatingSystem,OS)•它在计算机应用程序与计算机硬件系统之间,屏蔽了计算机硬件工作的一些细节,并对系统中的资源进行有效的管理。•通过提供函数(应用程序接口(API)),从而使应用程序的设计人员得以在一个友好的平台上进行应用程序的设计和开发,大大地提高了应用程序的开发效率。计算机操作系统的作用从用户的角度来看,它就是一大堆函数(API和系统函数),用户可以调用(普通调用或系统调用)它们来对系统资源进行操作。计算机硬件用汇编语言编写的硬件抽象层高级语言的接口应用软件操作系统操作系统计算机操作系统的功能处理器的管理存储管理网络和通信的管理I/O设备管理文件管理任务管理任务表存储分配表文件目录设备表总之,需要一大堆表操作系统的分类操作系统实时系统分时系统C/OS简介μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。严格地说uC/OS-II只是一个实时操作系统内核μC/OS-II具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。μC/OS-II的前身是μC/OS,最早由美国人JeanLabrosse1992年完成。μC/OS-II已经移植到了几乎所有知名的CPU上。2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中。网站()μC/OS-II的组成部分核心部分(OSCore.c)任务处理部分(OSTask.c)时钟部分(OSTime.c)任务同步和通信部分与CPU的接口部分μC/OS-II的组成部分(续)核心部分是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等时钟部分即产生时钟节拍。任务延时等操作是在这里完成的。μC/OS-II的组成部分(续)任务同步和通信部分为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。与CPU的接口部分是指μC/OS-II针对所使用的CPU的移植部分。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。μC/OS-II的应用流程开启多任务调度,操作系统启动创建用户任务设置系统节拍删除初始任务板级初始化创建初始任务μC/OS-II的初始化,创建空闲任务μC/OS-II的初始化在使用μC/OS-II的所有服务之前,必须要调用μC/OS-II的初始化函数OSInit()对μC/OS-II自身的运行环境进行初始化。函数OSInit()将对μC/OS-II的所有的全局变量和数据结构进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永远的就绪状态。如果用户应用程序还要使用统计任务的话(常数OS_TASK_STAT_EN=1),则OSInit()还要以优先级别为OS_LOWEST_PRIO-1来创建统计任务初始化函数OSInit()对数据结构进行初始化时,主要要创建包括空任务控制块链表等空数据缓冲区。同时,为了可以快速地查询任务控制块链表中的各个元素,初始化函数OSInit()还要创建一个数组OSTCBPrioTbl[OS_LOWEST_PRIO+1],在这个数组中,按任务的优先级别的顺序把任务控制块的指针存放在了对应的元素中系统提供的空闲任务在多任务系统运行时,系统经常会在某个时间内无用户任务可运行而处于所谓的空闲状态,为了使CPU在没有用户任务可执行的时候有事可做,μC/OS-II提供了一个叫做空闲任务OSTaskIdle()的系统任务voidOSTaskIdle(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;//防止某些编译器报错for(;;){OS_ENTER_CRITICAL();//关闭中断OSdleCtr++;//计数OS_EXIT_CRITICAL();//开放中断}}空闲任务只是做了一个计数工作μC/OS-II规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的系统提供的另一个任务——统计任务μC/OS-II提供的另一个系统任务是统计任务OSTaskStat()。这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率,所以这个系统任务OSTaskStat()叫做统计任务任务创建的一般方法一般来说,任务可以在调用函数OSStart()启动任务调度之前来创建,也可以在任务中来创建。但是,μC/OS-II有一个规定:在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务。因此,人们习惯上在调用函数OSStart()之前先创建一个任务,并赋予它最高的优先级别,从而使它成为起始任务。然后在这个起始任务中,再创建其他各任务。如果要使用系统提供的统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用voidmain(void){……OSInit();//对μC/OS-II进行初始化……OSTaskCreate(TaskStart,……);//创建任务TaskStartOSStart();//开始多任务调度}voidTaskStart(void*pdata){……//在这个位置安装并启动μC/OS-II的时钟OSStatInit();//初始化统计任务……//在这个位置创建其他任务for(;;){起始任务TaskStart的代码}}OSTaskCreate()函数应用程序通过调用OSTaskCreate()函数来创建一个任务,OSTaskCreate()函数的原型如下:INT8UOSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata,//传递给任务的参数OS_STK*ptos,//指向任务堆栈栈顶的指针INT8Uprio//任务的优先级)μC/OS-II的启动μC/OS-II进行任务的管理是从调用启动函数OSStart()开始的,当然其前提条件是在调用该函数之前至少创建了一个用户任务调度时机很容易想到的调度时机就是定时调度。μC/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍(TimeTick)。硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR()。中断服务程序中会调用任务切换函数来进行任务切换。对于实时系统来说,应该尽可能地实现即时调度。一般任务结束调用函数OS×××Post()发送一个事件时,函数OS_EventTaskRdy()将被函数OS×××Post()所调用。该函数的作用就是把等待OS×××Post()所释放事件的任务在任务等待表中的位置清0(解除等待状态)后,再把该任务在任务就绪表中对应的位置1,然后引发一次任务调度。μC/OS-II系统响应中断,当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。注意!中断服务子程序运行结束之后,系统将会根据情况进行一次任务调度去运行优先级别最高的就绪任务,而并不是一定要接续运行被中断的任务的。信号量及其操作在使用信号量之前,应用程序必须调用函数OSSemCreate()来创建一个信号量,OSSemCreate()的原型为:OS_EVENT*OSSemCreate(INT16Ucnt//信号量计数器初值);函数的返回值为已创建的信号量的指针。任务通过调用函数OSSemPend()请求信号量,函数OSSemPend()的原型如下:voidOSSemPend(OS_EVENT*pevent,//信号量的指针INT16Utimeout,//等待时限INT8U*err);//错误信息参数pevent是被请求信号量的指针。为防止任务因得不到信号量而处于长期的等待状态,函数OSSemPend允许用参数timeout设置一个等待时间的限制,当任务等待的时间超过timeout时可以结束等待状态而进入就绪状态。如果参数timeout被设置为0,则表明任务的等待时间为无限长。任务获得信号量,并在访问共享资源结束以后,必须要释放信号量,释放信号量也叫做发送信号量,发送信号量需调用函数OSSemPost()。OSSemPost()函数在对信号量的计数器操作之前,首先要检查是否还有等待该信号量的任务。如果没有,就把信号量计数器OSEventCnt加一;如果有,则调用调度器OS_Sched()去运行等待任务中优先级别最高的任务。函数OSSemPost()的原型为:INT8UOSSemPost(OS_EVENT*pevent//信号量的指针);调用函数成功后,函数返回值为OS_ON_ERR,否则会根据具体错误返回OS_ERR_EVENT_TYPE、OS_SEM_OVF。应用程序如果不需要某个信号量了,那么可以调用函数OSSemDel()来删除该信号量,这个函数的原型为:OS_EVENT*OSSemDel(OS_EVENT*pevent,//信号量的指针INT8Uopt,//删除条件选项INT8U*err//错误信息);uC/OS-II的移植移植就是修改一个软件,使得它能在新的环境下(不同的处理器平台,或者不同的处理器型号,或者不同的板子,或者不同的系统下)运行移植工作量取决于被移植软件的复杂程度和移植的层次举例将linux移植到alpha处理器上,属于第一类:移植到新的处理器架构上。工作量巨大,非高手不能为将linux移植到s3c2410上,属于第二类:移植到不同处理器型号。工作量大大降低将linux移植到你开发的开发板上,属于第3类:移植到不同board上,如果你的board采用了如s3c2410这样的处理器,则工作量很小将QQ移植到linux平台上,属于第四类,把软件移植到不同的系统(操作系统)上……移植一个操作系统与什么有关?不考虑应用程序的移植,只考虑操作系统移植到不同平台上。主要的工作体现在:理解处理器架构(寄存器,指令集,编程模式…)了解board的硬件设计(内存基地址?Flash地址?使用了处理器哪些资源?…)了解编译器(编译器传递参数的约定,支持内嵌汇编否?)当然,理解操作系统的设计μC/OS-II的移植Ucosii相对简单,移植工作量不大。实现三个文件:os_cpu.hos_cpu_c.cos_cpu_a.s移植μC/OS-II满足的条件处理器的C编译器能产生可重入代码在程序中可以打开或者关闭中断处理器支持中断,并且能产生定时中断处理器支持能够容纳一定量数据的硬件堆栈(可能达几KB)处理器有将堆栈指针和其他的寄存器存储和读出到堆栈(或者内存)的指令•可重入代码是一段代码(一般指函数)可以同时被多个任务调用而不会担心数据会被破坏。用,而不必担心会破坏数据。•也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。•可重入的代码的实现主要是编程技术,所有嵌入式集成开发环境都能产生可重入的代码。inttemp;voidSwap(intx,inty){t
本文标题:uCOS操作系统及其移植
链接地址:https://www.777doc.com/doc-3354739 .html