第6章 μCOS-II操作系统基础及其移植开发初步
- 格式:doc
- 大小:102.50 KB
- 文档页数:13
目录摘要 (1)关键词 (1)1 引言 (1)2 μC/OS-II简介 (2)2.1 μC/OS-II的特点 (2)2.2 μC/OS-II的体系结构 (3)3 移植规划 (3)3.1 移植条件 (3)3.1.1 可重入代码与非可重入代码 (4)3.1.2 OS_ENTER_CRITICAL( )与OS_EXIT_CRITICAL( ) (4)3.2 移植要求 (4)3.3 移植需要编写的文件 (4)3.4 移植代码包括的主要内容 (5)3.5 编译器的选择 (5)4 移植的实现 (6)4.1 OS_CPU.H的移植 (6)4.1.1数据类型的定义 (6)4.1.2堆栈的定义 (6)4.1.3中断与临界区代码 (7)4.1.4使用软中断SWI作底层接口 (8)4.2 OS_CPU_C.C的移植 (9)4.2.1 OSTaskStkInit( ) (9)4.2.2 Hook( )函数 (10)4.3 OS_CPU_A.ASM的移植 (11)4.3.1 OSStartHighRdy()函数 (11)4.3.2 OSCtxSw( )函数 (12)4.3.3 OSIntCtxSw()函数 (13)4.3.4 OSTickISR()函数 (14)5 嵌入式系统的初始化 (16)5.1初始化程序的下载执行 (16)5.2嵌入式系统的初始化过程 (17)5.2.1硬件初始化阶段 (17)5.2.2 RTOS初始化阶段 (18)5.3 ARM920T系统初始化的一般过程 (19)5.3.1设置程序入口指针 (19)5.3.2设置中断向量 (19)5.4初始化存储器系统 (20)5.4.1存储器地址分布 (20)5.4.2 ROM地址重映射的实现 (20)5.5初始化堆栈 (21)5.6初始化应用程序执行环境 (22)5.6.1初始化C环境 (22)5.6.2改变处理器模式 (23)5.6.3调用C程序 (23)5.7 uC/OS系统的初始化 (23)5.7.1 ARM的硬件抽象层——uHALuC/OS (24)5.7.2 ARMTargetInit()函数结构 (24)5.7.3 uHAL的功能 (25)6 移植测试 (25)6.1测试移植代码 (25)6.1.1确保C编译器、汇编编译器及链接器正常工作 (25)6.1.2验证OSTskStkInit() 和OSStartHighRdy()函数 (25)6.1.3验证OSCtxSw() 函数 (26)6.1.4验证OSIntCtxSw()和OSTickISR()函数 (26)6.2在S3C2440上测试移植结果 (26)6.2.1编译uCOS2 (26)6.2.2把uCOS2下载到内存中运行 (28)7 结论 (30)致谢 (31)参考文献 (31)英文翻译 (32)实时操作系统μC/OS-II在ARM上的移植研究陈利顺重庆三峡学院物理与电子工程学院电子信息工程专业06级重庆万州 404000摘要本设计采用三星公司生产的一款基于ARM920T核的高性能低功耗soc芯片S3C2440作为移植的硬件平台。
嵌入式实时操作系统μCOS-Ⅱ的移植1、引言嵌入式系统由于它具有软件代码小、高度自动化、响应速度快等特点已经使它在许多领域得到广泛的应用[3]。
从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等。
嵌入式系统通常由硬件环境和操作系统构成。
在嵌入式操作系统的统一调度管理下实现对所有系统资源的合理利用和分配,达到提高系统性能和有效利用有限资源的目的。
μCOS-Ⅱ作为一个源码开放的嵌入式实时操作系统,同时具有良好的可移植性、可裁剪性、可剥夺性、稳定性和可靠性等优点,使其成为许多嵌入式操作系统的首选。
本文将μCOS-Ⅱ在Freescale的8位处理器芯片HC9S08上移植实现。
2、μCOS-Ⅱ系统结构μCOS-Ⅱ是一个完整的可移植可固化可裁剪的抢占式实时多任务内核。
可以在不需要做很大修改的基础上方便的移植到多种处理器上。
条件是:该处理器要具有一定数量的堆栈,能够使用软件中断,产生定时器中断,此外,编译器要支持可重入代码,并且要能使用汇编实现对处理器内部寄存器的相关操作[2][4]。
通过μCOS-Ⅱ的管理,使多个任务之间相互协调,分时的占用CPU,实现充分利用资源和实时等相应的功能。
任务通常是一个死循环,用来完成某一特定的功能;一个任务相当于一个线程。
μCOS-Ⅱ可以管理多达64个任务,每个任务都具有一个唯一的合法优先级。
但是,优先级最低的那个任务已经被系统定义为空闲任务,用户不能使用。
用户可以通过函数OSTaskCreate()来创建任务,通过OSTaskDel()来删除任务。
任务可能有以下五种状态:睡眠态、就绪态、运行态、等待状态、中断服务态。
利用不同的系统函数可以实现任务在各状态之间的转换。
μCOS-Ⅱ通过对就绪表的操作总是选择在就绪任务中优。
第六章μC O S-I I操作系统基础及其移植开发初步μCOS-II内核作为一种代码公开的嵌入式实时操作系统内核非常有特色,在规模不大的代码内实现了抢占式任务调度和多任务间通信等功能,任务调度算法也很有独特。
该内核裁剪到最小状态后编译出来只有8K左右,全部内核功能(添加LWIP网络协议栈等)也就100K 左右,资源消耗非常小。
市面上一些ARM微处理器片上所带内存就已经足够一个裁剪合适的内核的简单应用,非常方便产品的开发设计。
当前,μCOS-II是一个基本完整的嵌入式操作系统解决方案套件,包括μC/TCP-IP(IP 网络协议栈)、μC/FS(文件系统)、μC/GUI(图形界面)、μC/USB(USB驱动)、μC/FL(Flash加载器)等部件。
但是这些部件不是公开代码的。
还有一些比较重要的可能在嵌入式环境中发挥重要重要作用的部件,包括嵌入式数据库、POSIX兼容性接口、常用设备的驱动模块等。
将来这个行业还会产生更多的重要部件需求,在互联网上的开源社区通常能够找到相应的开源代码包,并且可以进行移植。
6.1 实时操作系统基本原理与技术本节将主要讲述实时操作系统的基本原理和技术,通过对本章的学习读者可以了解掌握RTOS(Real Time operation System,实时操作系统)的基本特征、结构体系、重要指标、性能参数等重要理论,为全面掌握RTOS打下基础。
6.1.1 实时操作系统基本特征根据IEEE实时UNIX分委会对实时操作系统的定义,实时操作系统的基本特征应表现为以下几个方面:∙实时性:对外部事件作出反应的时间必须在限定的时间内,在某些情况下还需要是确定的,可重复实现的,不管当时系统内部状态如何,都是可预测的;∙异步并发事件响应能力:异步事件是指无一定时序关键随机发生的事件。
如外部设备完成数据传输,实时控制设备出现异常情况等。
实际环境中,嵌入式实时系统处理的外部事件往往不是单一的,这些事件往往同时出现,而且发生的时刻也是随机的,即异步的。
实时软件应有能力对这类外部事件组有效地进行处理;∙抢占式调度:为确保响应时间,实时操作系统必须允许高优先级的任务一旦准备好,马上抢占低优先级任务的执行。
∙内存锁定:必须具有将程序或部分程序锁定在内存的能力,锁定在内存的程序减少了为获得该程序而访问磁盘的时间,从而保证了快速的响应时间;∙快速启动,出错处理和自动复位功能;∙优先级中断和调度机制:必须允许客户定义中断优先级和被度任务的优先级并指定如何中断服务;∙连续文件存储机制:通常要求数据存储在连续文件上,以减少存取数据时的查找时间;∙同步/互斥机制:提供同步和互斥共享数据使用和执行的手段;∙应用程序和操作系统两种软件一体化;∙需要独立的开发平台。
实时操作系统能对来自外界的作用和信号在限定的时间范围内作出响应。
它强调的实时性、可靠性和灵活性。
它与实时应用软件相结合成为有机整体,起着核心作用。
由它来管理和调度各项工作,为应用软件提供良好的运行环境及开发环境。
一般说来,实时操作系统提供系统调用来实现对上层实时应用程序的支持,而操作系统是以库的形式来实现这些支持。
应用程序通过链接实时操作系统的库来获得实时支持。
6.1.2 实时操作系统关键技术指标评价一个实时操作系统一般可以从进程管理、任务调度、内存管理、任务通信、内存开销、任务切换时间和最大中断禁止时间等技术指标来衡量其优劣。
∙任务调度算法:RTOS的实时性和多任务能力在很大程度上取决于它的任务调度算法。
从调度策略上来讲,可分为优先级调度策略和时间片轮转调度策略;从调度方式上来讲,可分为可抢占式、不可抢占式和选择可抢占式调度方式;从时间片来看,分固定与可变时间片轮转两种方式。
常用的调度算法有:Rate Monotonic(发生率单调)、优先级与发生率成正比(LiuLay 1973)、Lottery Scheduler(彩票调度,Wald&Weih194)等;∙上下文切换时间(Context Switching Time):在多任务系统中,上下文切换指当处理器的控制权由运行任务转移到另一个就绪任务时所发生的事件序列。
当运行任务转为就绪、挂起、或删除时,另外一个被选定的就绪任务就成为当前任务。
上下文切换包括保持当前任务的状态,决定哪个任务运行,恢复将要运行的那个任务状态。
保护和恢复上下文是依赖于相关处理器的。
因此,上下文切换时间是影响RTOS性能的一个重要指标。
∙确定性(Determinism):在实时操作系统中,在一定的条件下,系统调用运行的时间是可以预测的。
但这并不意味着所有的系统调用都总是执行一个固定长度的时间,而不管系统的负载如何。
系统调用的最大执行时间可以确定;∙内存管理:通常内存管理分为两种模式:实时模式和保护模式;∙最小内存开销:在RTOS设计过程中,最小内存开销是一个比较重要的指标,这是因为在工业控制的领域中的某些工控机(如上下位机控制系统中的下位机),由于基于降低成本的考虑,其内存的配置一般都不大。
因此在RTOS的设计中,其占用内存大小是一个很重要的指标,这是RTOS设计与其他操作系统设计的明显区别之一;∙最大中断禁止时间:当RTOS运行在核状态或执行某些系统调用时,是不会因为外部中断的到来而中断执行的。
只有当RTOS重新回到用户态时才响应外部中断请求,这一过程所需的最大时间就是最大中断禁止时间;∙任务切换时间:由于某种原因使一个任务退出运行时,RTOS保持它的运行现场信息、插入相应队列、并根据一定的调度算法重新选择一个任务使之投入运行,这一过程所需时间称为任务切换时间。
上述几项中,最大中断禁止时间和任务切换时间是评价一个RTOS实时性最重要的两个技术指标。
6.1.3 实时操作系统基本术语本节将主要介绍在RTOS领域常见的专业术语,以便读者更好地掌握本书余下章节内容。
∙硬实时(Hard Real-Time):通常将采用优先级驱动的,具有时间确定性的,可抢占调度的实时操作系统而设计的实时系统称为硬实时系统。
硬实实时,主要强调对实时性的要求较高。
∙优先级驱动(Priority-Driven):在一个多任务系统中,正在运行的任务总是优先级最高的任务。
在任何给定的时间内,总是把处理器分配给最高优先级的任务。
∙优先级反转(Priority Inversion):当一个任务等待比它优先级低的任务释放资源而被阻塞时,就会发生优先级反转。
优先级继承技术可以解决优先级反转问题。
∙优先级继承(Priority-Inheritance):优先级继承是用来解决优先级反转问题的技术。
当优先级反转发生时,较低优先级任务的优先级暂时提高,以匹配较高优先级任务的优先级。
这样,就可以使较低优先级任务尽快地执行并且释放较高优先级任务所需要的资源。
∙实时执行体(Realtime Executive):实时执行程序包括一套支持实时系统所必需的机制。
如多任务、CPU调度、通信和存储分配等。
在嵌入式应用中,这一套机制被称为实时操作系统或实时执行体或实时内核。
∙重调度过程(Rescheduling Procedure):重调度过程是判断任务优先级和执行状态的过程。
∙任务(Task):RTOS中的任务相当于一般操作系统的进程(Process),一个任务就是RTOS的一个可以运行的历程。
∙任务上下文(Task context):任务上下文指一个未运行的任务状态,如堆栈指针、计数器、内存字段和通用寄存器等。
∙调度延时(Scheduling Latency):调度延时是指当一个事件从引起更高优先级的任务就绪到这个任务开始运行之间的时间。
简而言之,是一个任务被触发后,由就绪到开始运行的时间。
∙可伸缩的体系结构(Scalable Architecture):可伸缩的体系结构指一个软系统能够支持多种应用而无须在接口上做很大的变动。
这种结构往往提供可选用的系统组件,供开发者“量体裁衣”。
∙中断延时(Interrupt Latency):中断延时指从中断发生到开始执行中断处理程序的这一段时间。
∙互斥(Mutual Exclusion):互斥是用于控制多任务对共享数据进行顺序访问的同步机制。
在多任务应用中,当两个或更多的任务同时访问同一数据区时,就会造成访问冲突。
互斥能使它们依次访问共享数据而不引起冲突。
∙抢占(Preemptive):抢占是指当系统处于核心态的内核运行时,允许任务重新调度。
也就是说,一个正在执行的任务可以被打断而让另一个任务运行,这提高了应用对外部中断的响应性。
许多RTOS都是以抢占方式运行。
但这并不是说调度在任何时候都是可以发生的。
例如,当RTOS的一个任务正在通过系统调用访问共享数据时,重新调度和中断都是不允许的。
6.2 μCOS-II应用程序开发μCOS-II自1992年发布以来,在世界各地获得了广泛的应用,它是一种专门为嵌入式设备设计的内核。
鉴于μCOS-II可免费获得代码,对于嵌入式RTOS而言,μCOS-II无疑是最经济的选择。
应用μCOS-II,自然要为它开发应用程序。
下面介绍基于μCOS-II的应用程序的基本结构以及与应用程序开发相关的知识。
6.2.1 μCOS-II的变量类型由于C语言变量类型的长度与编译器类型相关,为了便于在各个平台间移植,在μCOS-II 中没有使用C语言的数据类型,而是定义了自己的数据类型。
具体的变量类型如表6.1所示,这些变量的定义,可参加μCOS-II源码的OS_CPU.H文件。
表6.1 μCOS-II使用的变量类型6.2.2 应用程序基本结构每个μCOS-II应用至少要求有一个任务。
每个任务必须被写成无限循环的形式。
下面代码是μCOS-II推荐的结构,V oid task(void * pdata){INT8U err;InitTimer();While(1){…//应用程序代码OSTimeDly(1) ; //可选}}系统会为每一个任务保留一个堆栈空间。
由于系统在任务切换时要恢复上下文并执行一条reti指令返回,如果允许任务执行到最后一个花括号,那么很可能会破坏系统的堆栈空间,从而使应用程序的执行带有不确定性。
换句话说,程序“跑飞”了。
所以,每一个任务必须被写成无限循环的形式。
不管是系统强制(通过ISR),还是主动放弃(通过调用OS API),开发者都要使自己的任务能够放弃对CPU的使用权。
现在来讨论InitTimer()函数。
这个函数应由系统提供,开发者需要在优先级最高的任务内调用它且不能在for循环内调用。
需要注意的是,这个函数是和所使用的CPU相关的,每种系统都有自己的Timer初始化程序。
在μCOS-II的帮助手册内,作者强调绝不能在OSInit()或OSStart()内调用用Timer初始化程序,那么会破坏系统的可移植性,同时也会带来性能上的损失。