您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > uCOS-II--ppt-入门基础
uC/0S-II从这里起航。。。uC/OS-II简介•μC/OS和μC/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。•uC/OS-II是一种基于优先级的可抢先的硬实时内核。自从92年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内核,目前已经被移植到40多种不同结构的CPU上,运行在从8位到64位的各种系统之上。尤其值得一提的是,该系统自从2.51版本之后,就通过了美国FAA认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上。鉴于uC/OS-II可以免费获得代码,对于嵌入式RTOS而言,选择uC/OS无疑是最经济的选择。uC/OS-II嵌入式系统基本模型•严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。uC/OS操作系统的特点•uC/OS是一个完成的,可移植、可固化、可裁减的抢占式实时多任务操作系统内核。主要用ANSI的C语言编写,少部分代码是汇编语言。抢占式内核•内核抢占(可抢占式内核):即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。•非抢占式内核:高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直至完成或退出内核。优点•1、与终端硬件平台相适应•全部源代码5500行,可裁减定制,生成的可执行代码占15~20k,可以移植到多种系列单片机上,包括ARM;•2、考虑成本,免费的源代码公开;•3、uC/OS-II代码简单,容易掌握和使用;具有多任务调度的基本功能;缺点•1、缺少技术支持,相关的支持软件少;•2、和商业软件比,功能较弱(如不支持时间片轮转,最大任务数为64等);对应用开发的支持不够;前后台系统•不复杂的小系统一般设计成如图2.1所示的样子。这种系统可称为前后台系统或超循环系统(Super-Loops)。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。后台也可以叫做任务级。前台也叫中断级。uC/OS-II文件结构字符显示•为了性能更好,显示函数直接向显示内存区中写数据。在VGA显示器中,显示内存从绝•对地址0x000B8000开始(或用段、偏移量表示则为B800:0000)。在单色显示器中,用户可以把#defineconstantDISP_BASE从0xB800改为0xB000。•PC.C中的显示函数用x和y坐标来直接向显示内存中写ASCII字符。PC的显示可以达到•25行80列一共2,000个字符。每个字符需要两个字节来显示。第一个字节是用户想要显示的字符,第二个字节用来确定前景色和背景色。前景色用低四位来表示,背景色用第4位到6位来表示。最高位表示这个字符是否闪烁,(1)表示闪烁,(0)表示不闪烁。用PC.H中•#defienconstants定义前景和背景色,PC.C包括以下四个函数:••PC_DispClrScr()Clearthescreen•PC_DispClrLine()Clearasinglerow(orline)•PC_DispChar()DisplayasingleASCIIcharacteranywhereonthescreen•PC_DispStr()DisplayanASCIIstringanywhereonthescreen•基于uC/OS-II操作系统进行应用系统时,设计任务的主要任务是将系统合理划分成多个任务,并由RTOS进行调度,任务之间使用uC/OS-II提供的系统服务进行通信,以配合实现应用系统的功能。上图中应用代码部分主要是设计人员设计的业务代码。•与前后台系统一样,基于uC/OS-II的多任务系统也有一个main主函数,main函数由编译器所带的C启动程序调用。在main主函数中主要实现uC/OS-II的初始化OSInit()、任务创建、一些任务通信方法的创建、uC/OS-II的多任务启动OSStart()等常规操作。另外,还有一些应用程序相关的初始化操作,例如:硬件初始化、数据结构初始化等。•在使用uC/OS-II提供的任何功能之前,必须先调用OSInit()函数进行初始化。在main主函数中调用OSStart()启动多任务之前,至少要先建立一个任务。否则应用程序会崩溃。•OSInit()初始化uC/OS-II所有的变量和数据结构,并建立空闲任务OS_TaskIdle(),这个任务总是处于就绪态。典型的main函数•voidmain(void)•{•/*-----硬件初始化,等用户代码初始化-----*/•...•OSInit();/*初始化uC/OS-II*/•…/*-------安装中断向量---------*/•/*通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;*/•OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],2);•…•/*通过调用OSSemCreate()创建信号量等任务通信方式;*/•CalcSem=OSSemCreate(0);•…•OSStart();/*开始多任务调度!OSStart()永远不会返回*/•}•voidTaskStart(void*pdata)•{•/*安装并启动uC/OS-II的时钟节拍(4)*/•OSStatInit();/*初始化统计任务(5)*/•/*创建用户应用程序任务*/•for(;;){•/*这里是TaskStart()的代码!*/•}•}硬件初始化•系统启动处理(在调用uC/OS-II操作系统初始化函数OSInit()前,需要对CPU进行必要的初始化,例如设置异常处理栈空间。要使uC/OS-II能够正常运行,时钟任务是必不可少的。另外,启动代码需要存储在哪个内存空间,在运行时需要在哪个内存中运行,这些都需要程序员手动设置。)uC/OS-II初始化•调用uC/OS-II的服务之前要先调用系统初始化函数OSInit()。OSInit()初始化uC/OS-II所有的变量和数据结构,并建立空闲任务。uC/OS-II初始化任务控制块、事件控制块、消息队列缓冲、标志控制块等数据结构的空缓冲区。•多任务的启动是通过调用OSStart()实现的。启动之前要至少创建一个任务。OSStart()调用就绪任务启动函数OSStartHighRdy(),其功能是将任务栈的值恢复到CPU寄存器,并执行中断返回指令,强制执行该任务代码•空闲任务•在多任务系统运行时,系统经常会在某个时间内无用户任务可运行而处于所谓的空闲状态。空闲任务OSTaskIdle()的系统任务:只是进行OSdleCtr变量的自累加运算。如果需要可自行添加CPU空闲时的执行代码统计任务•这些代码很显然与处理器有关,中断的三种实现方法:可通过设置OS_CRITICAL_METHOD来分别实现(当然不同的处理器和c编译器实现的代码是不同的)•方法一:直接使用处理器的开中断,关中断调用汇编语句来实现。•方法二:在开中断时把程序标志字PSW保存中断允许标志位到堆栈,关中断时复位PSW位。•方法三:(前提条件:用户使用的C编译器具有扩展功能)用户可获得程序状态字的值,通过局部变量CPU_SR保存程序状态标志字PSW,而不必压到堆栈里。•统计任务OSTaskStat().这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把结果一百分比的形式存放在变量OSCPUUsage中。可通过OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置为1,并且必须在创建统计任务之前调用OSStatInit()对统计任务进行初始化。•μC/OS-II实时操作系统还保留对最高的四个优先级(0、1、2、3)和OS_LOWEST_PRIO•-3与OS_LOWEST_PRIO-2的使用权,以备将来操作系统升级时使用。如果用户的应用程序希望在将来升级后的操作系统下仍然可以不加修改地使用,则用户任务可以放心使用的优先级个数为OS_LOWEST_PRIO-7。在本例中,软件优先级资源为18-7=11个,即可使用的优先级为4、5、6、7、8、9、10、11、12、13、14。可重入函数与不可重入函数•(1)可重入函数:指函数代码在运行过程中可以被中断,中断返回后仍能够恢复到原来的状态,并能准确无误执行的函数。•可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数或者只使用局部变量,即变量保存在CPU寄存器或堆栈中;或者使用全局变量,则要对全局变量予以保护。•(2)不可重入函数:函数在运行过程中不可以被中断。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()•在一般情况下,在调用不可重入函数之前以及在修改全局变量的数据时,都需要先进入临界状态。当相应处理完成后,再返回到进入之前的原始状态。•临界状态指当前程序处于不可中断状态。一般情况下,在调用不可重入函数前或在修改全局变量数据时,都需要先进入临界状态。进入临界状态的主要操作是关闭所有可以屏蔽的中断;而退出临界状态的主要操作是恢复到上次进入临界状态时前中断管理的状态。时钟•PC机上移植和运行uC/OS-II要注意其与PC机中其他操作系统的关系(主要是与DOS操作系统之间的关系),不能因为安装了uC/OS-II而使其他操作系统不能正常使用。•在PC机中,DOS系统时间的周期为54.93ms(18.20648HZ)。•DOS操作系统的系统时钟是由PC机上配置的硬件定时器产生的。在硬件定时器的每个定时周期结束时,硬件定时器便向CPU申请一次中断,在中断服务程序中处理DOS所需要的系统时钟,同时处理DOS系统有关时间的一些管理事务。在80X86系统的中断向量表中,产生DOS系统时钟硬件定时器所占用的中断向量为0x08.•在这我们把uC/OS-II的系统时钟频率设置为200HZ,这显然比DOS的时钟频率高得多。因此,借用产生的DOS系统时钟的定时器信号来产生uC/OS-II系统时钟。200除于11等于18.18约等于18.2.后把uC/OS-II的时钟中断向量安装到0x08上,而把0x08中原来的DOS的时钟中断向量转存到中断向量表的另一个空白位置0x81中,这个工作由PC功能函数PC_DOSSaveReturn()来执行。任务的基本概念•人们在实践生活中处理一个大而复杂问题时,惯用的方法是“分而治之”,即把一个大问题分解成多个相对简单,比较容易解决的小问题,小问题解决了,大问题也就随之解决了。同样吗,在设计一个较为复杂的应用程序时,也通常是把一个大型任务分解成多个小任务,然后在计算机中通过运行这些小任务,最终达到完成大任务的目的,这种做法也使应用程序的维护变得容易起来。•从应用程序的角度来看,uC/OS-II的任务就是一个线程,就是一个用来解决用户问题的C语言函数和与之相关联的一些数据结构而构成的一个实体。•从任务的存储结构来看,uC/OS-II主要有三个组成部分:任务程序代码段,任务堆栈和任务控制块。其中,任务控制块用来保存任务的属性;任务堆栈用来保存任务工作环境;任务程序代码是任务的执行部分。任务•任务可以是一个无限的循环,也可以在一次执行后被操作系统删除。任务函数和任何C函数一样,具有一个返回类型和一个参数,但是它决不返回。任务必须是以下2种结构之一:
本文标题:uCOS-II--ppt-入门基础
链接地址:https://www.777doc.com/doc-5428740 .html