ARM 嵌入式操作系统移植 论文08852.doc

上传人:laozhun 文档编号:2392377 上传时间:2023-02-17 格式:DOC 页数:33 大小:367.50KB
返回 下载 相关 举报
ARM 嵌入式操作系统移植 论文08852.doc_第1页
第1页 / 共33页
ARM 嵌入式操作系统移植 论文08852.doc_第2页
第2页 / 共33页
ARM 嵌入式操作系统移植 论文08852.doc_第3页
第3页 / 共33页
ARM 嵌入式操作系统移植 论文08852.doc_第4页
第4页 / 共33页
ARM 嵌入式操作系统移植 论文08852.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《ARM 嵌入式操作系统移植 论文08852.doc》由会员分享,可在线阅读,更多相关《ARM 嵌入式操作系统移植 论文08852.doc(33页珍藏版)》请在三一办公上搜索。

1、摘 要随着ARM技术的广泛应用,建立基于ARM构架的嵌入式操作系统已成为当前研究的热点。本课题的研究内容就是利用移植技术将uC/ OS - II 移植到ARM 系统。将uC/ OS - II 移植到ARM 系统之后,可以充分结合两者的优势。uC/OS - II 的文件系统结构包括核心代码部分、设置代码部分、与处理器相关的移植代码部分。核心代码部分包括7 个源代码文件和1 个头文件. 功能分别是内核管理、事件管理、消息队列管理、存储管理、消息管理、信号量处理、任务调度和定时管理. 设置代码部分包括2 个头文件,用来配置事件控制块的数目以及是否包含消息管理相关代码. 而与处理器相关的移植代码部分则

2、是进行移植过程中需要更改的部分,包括1 个头文件OS CPU. H ,1 个汇编文件OS CPU A. S 和1 个C 代码文件.实际上将uC/ OS - II 移植到ARM 处理器上,需要完成的工作主要是以下三个与体系结构相关的文件:OS CPU. H ,OS CPU. C 以及OS CPU A. S。关键词: ARM 嵌入式操作系统 移植 uc/os-II AbstractAlong with the extensive application of ARM technology based on ARM architecture, the embedded operating syste

3、m has become a hotspot of current researches. The research content is the use of transplanting uC/ OS - II transplanted into ARM system. UC/ OS - II transplanted into ARM system, can combine the advantages of the two. UC/OS - II file system structure includes part of the core code, set the code port

4、ion, a processor associated with transplant code section. Part of the core code includes 7source code files and the1 header files. Function are core management, event management, message queue management, storage management, message management, signal processing, task scheduling and time management.

5、 Setting code portion includes the first 2 documents, used to configure event control block numbers and whether it contains message management code and a processor associated with transplant code is part of the transplant process need to change parts, including the1 header files OS CPU. H,1OS CPU A.

6、 files S and 1C code files. The actual admiral uC/ OS - II transferred to the ARM processor, work to be finished basically is the following three architecture dependent file: OS CPU. H, OS CPU. C and OS CPU A. S.Keyword: ARM embedded operating system porting uc/os-II目 录引 言11 UC /OS- II简介21.1 uC /OS-

7、 II的工作流程21.2 uC /OS- II的体系结构31.3 uC/OS-II工作原理42 UC/OS内核调度52.1 uC/OS-II内核结构52.2任务控制块(OS_TCB)62.3 就绪表(ReadyList)72.4 任务状态82.5 任务转换102.6 任务调度分析102.7 UC/OS-II的初始化123 UC/ OS - II 的移植133.1 OS CPU. H 的移植133.2 OS CPU. C 的移植143.3 OS CPU A. S 的移植143.4 硬件平台154 在嵌入式系统上的实现174.1 开/关中断的实现174.2 OSStartHighRdy 的实现18

8、4.3 任务级上下文切换的实现184.4 中断级上下文切换的实现195 多任务应用程序21结 束 语23参 考 文 献24致 谢25附录26引 言在开发嵌入式系统时,一般选择基于ARM 和uC/ OS - II 的嵌入式开发平台,因为ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点. 将uC/ OS - II 移植到ARM系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可以使一种特定的技术在更加广泛的范围使用,使软件使用更加灵活,不局限于某一条件.uC/OS - II

9、 是由Jean J. Labrosse 先生编写的完整的可移植、固化、裁剪的占先式实时多任务内核.uC/ OS - II 的源代码完全开放,这是其他商业实时内核无法比拟的. 它是针对嵌入式应用设计的,在设计之初就充分考虑了可移植性,它的大部分源代码都是用高可移植性的ANSIC 编写的.与硬件相关部分用汇编语言编写, 使之 可供不同构架的微处理器使用。只要有标准的 AN SI C 交叉编译器, 有汇编器、链接器等软件工具, 就可以将 C /OS- II嵌入到开发的产品中。uC/ OS - II可以移植到从8 位到64 位的不同类型、不同规模的嵌入式系统,并能在大部分的8 位、16 位、32 位、

10、甚至64 位的微处理器和DSP 上运行. 由于uC/ OS - II是一个实时操作系统,所以如果将它嵌入到ARM处理器上,就能够进一步简化ARM系统的开发。uC /OS- II是面向中小型嵌入式系统, 具有执行效 率高、占用空间小、实时性能优良和可扩展性强等特 点, 包含全部功能模块的内核大约为 10kB。如果经过 裁减只保留核心代码, 则可压缩到 3kB 左右。严格地 说, uC /OS- II只是一个实时操作系统内核, 它仅仅包 含了任务调度、任务管理、时间管理、内存管理和任务 间的通信和同步等基本功能, 没有提供输入输出管理、文件系统、网络等额外的服务。嵌入式技术发展至今已经进入到了嵌入

11、式Internet的阶段,越来越多的嵌入式设备实现了通过以太网技术接入互联网。将嵌入式设备接入以太网的关键是在嵌入式设备上实现嵌入式TCP/IP协议。相比普通的TCP/IP协议,嵌入式TCP/IP协议具有代码精简、很好的可裁减性和很强的移植性等特点。嵌入式系统是先进的计算机技术、半导体技术、电子技术、和各个行业的具体应用相结合的产物,它是以计算机应用为中心、以计算机技术为基础,软硬件可裁减的专用计算机系统。在嵌入式系统中使用操作系统(嵌入式操作系统)已是大势所趋,目前嵌入式操作系统的种类繁多,但uc/os-II以其源代码开放、价格便宜、可移植性强等特点,被广泛使用。1 uC /OS- II简介

12、C/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 C/OS-II 的前身是C/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在嵌入式系统编程杂志的5 月和6 月刊上刊登的文章连载,并把C/OS 的源码发布在该杂志的B B S 上。 C/OS 和C/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANS

13、I 的C交叉编译器,有汇编器、连接器等软件工具,就可以将C/OS-II嵌入到开发的产品中。C/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。C/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,

14、并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。1.1 uC /OS- II的工作流程uC /OS- II的工作流程如图1.1所示: 首先进行操作系统初始化, 主要完成任务控制块 ( TCB )初始化; 然后就可以开始创建新任务、初始化任务堆栈区; 最后调用 OSSTART( )函数, 启动多任务调度。在多任务调度开 始后, 启动时钟节拍源开始计时。此节拍源为系统提 供周期性的时钟中断信号、实现延时和超时确认。当 时钟中断来临时, 系统把当前正在执行的任务挂起, 保护现场, 进行中断处理, 判断有无任务延时到期。若 有, 则使该任务进入就绪态, 并对所有进

15、入就绪态的任 务的优先级进行比较, 通过任务切换去执行最高优先 级的任务。若没有别的任务进入就绪态, 则恢复现场 继续执行原任务。另一种调度方式是任务级的调度, 即通过发软中断命令或依靠处理器在任务执行中调 度。如任务要等待信号量或一个正在执行的任务被挂 起时, 就需要在此任务中调度, 找出目前处于就绪态的 优先级最高的任务去执行。当没有任何任务进入就绪 态时, 就去执行空任务。图1.1 uC /OS- II的工作流程图1.2 uC /OS- II的体系结构对 uC /OS - II的移植实际上就是对 与处理器有关的代码进行重写或修改。移植工作包括 以下几部分内容:用# define设置 1个

16、常量的值 ( OS _CPU. H 文件中 );声明 10个数据类型 ( OS_CPU. H 文件中 ); 用# define声明 3个宏 ( OS_CPU. H 文件中 );用 C 语言编写 6个简单的函数 ( OS _CPU. C 文件中 );编写 4个汇编语言函数 ( OS _CPU. A SM 文件中 )。虽然 uC /OS - II的大部分代码是用 C 语言编写但还存在一些与处理器相关的汇编语言代码, 从而实 现对处理器寄存器的访问以及堆栈的操作。 uC/OS-II操作系统的移植主要是对 OS _CPU. H, OS _CPU. ASM, OS_CPU. C等 3个源程序的编写。OS

17、_CPU. H 中包括了用# define定义的与处理器相 关的常量和类型定义, 与 uC /OS - II所定义的变量类 型相一 致; 定义允许 和禁止中断宏 OS _ ENTER _ CR IT ICAL( )和 OS_EX IT_CRITICAL( ) 来保护临界段代 码免受多任务或中断服务例程的破坏。定义栈的增长 方向, GCC 的 C语言编译器仅支持从上往下增长, 并且 必须是满递减堆栈, OS_STK _GROWTH 的值定义为 1。OS_CPU. ASM中要求编写 4个简单的汇编函数: (1) OSStartHighRdy( )作用是运行最高优先级的就绪任务。(2) OSCtxS

18、w( )是实现 CPU 在正常运行时任务间的切换,即对当前任务堆栈的保存和对高优先级任务堆栈的弹出, 使最高优先级任务获取CPU 的控制权。(3) OSIntCtxSw( )是在中断服务程序中执行任务切换。(4) OSTickISR( )是系统时钟的中断服务程序,该程序执行频率为10 100 H z, 主要功能是检查是否有由于延时而被挂起的任务成为就绪任务。如果有,就调用OSIntCtxSw( )进行任务切换,从而运行高优先级的任务;因为uC /OS- II在每一个节拍都要检查有没有更高优先级的任务在等待执行,若有,就要进行任务切换。所以,时钟节拍率越高,系统的额外负荷就越重OS_CPU.C中

19、要求编写6个与操作系统相关的函数: OSTaskStkInit( ), OSTaskCreateHook( ),OSTaskDelHook( ), OSTaskStatHook( ) 及OSTmieTickHook( )。其中,唯一必须移植的是任务堆栈 初始化函OSTaskStkInit( ),这个函数在任务创建时被调用,负责初始化任务的堆栈结构并返回新堆栈的指针。1.3 uC/OS-II工作原理uC/OS-II是一种基于优先级的可抢先的硬实时内核。在uC/OS-II里,每个任务都有一个任务控制块(Task Control Block),这是一个比较复杂的数据结构。在任务控制块的偏移为0的地方

20、,存储着一个指针,它记录了所属任务的专用堆栈地址。在uC/OS-II内,每个任务都有自己的专用堆栈,彼此之间不能侵犯。这点要求程序员再他们的程序中保证。一般的做法是把他们申明成静态数组。而且要申明成OS_STK类型。当任务有了自己的堆栈,那么就可以将每一个任务堆栈在那里记录到前面谈到的任务控制快偏移为0的地方。以后每当发生任务切换,系统必然会先进入一个中断,这一般是通过软中断或者时钟中断实现。然后系统会先把当前任务的堆栈地址保存起来,仅接着恢复要切换的任务的堆栈地址。由于哪个任务的堆栈里一定也存的是地址(还记得我们前面说过的,每当发生任务切换,系统必然会先进入一个中断,而一旦中断CPU就会把地

21、址压入堆栈),这样,就达到了修改PC为下一个任务的地址的目的。2 uC/OS内核调度在多任务系统中,内核是负责管理各个任务,或者说是为每个任务分配CPU时间,同时负责任务之间的通讯。内核所提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。UC/OS-II内核调度特点:1.只支持基于优先级的抢占

22、式调度算法,不支持时间片轮训;2.64个优先级,只能创建64个任务,用户只能创建56个任务;3.每个任务优先级都不相同;4.不支持优先级逆转;5.READY队列通过内存映射表实现快速查询。效率非常高;6.支持时钟节拍; 7.支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;8.支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文; 9.每个任务有自己的堆栈,堆栈大小用户自己设定;10.支持动态修改任务优先级;11.任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存; 12.任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建

23、本身不进行动态内存分配;13.任务的总个数(OS_MAX_TASKS)由用户决定;14.0优先级最高,63优先级最低;15.有一个优先级最低的空闲任务,在没有用户任务运行的时候运行。2.1 uC/OS-II内核结构1、uC/OS-II是以源代码形式提供的实时操作系统内核,其包含的文件结构如下:基于uC/OS-II操作系统进行应用系统时,设计任务的主要任务是将系统合理划分成多个任务,并由RTOS进行调度,任务之间使用uC/OS-II提供的系统服务进行通信,以配合实现应用系统的功能。上图中应用代码部分主要是设计人员设计的业务代码。应用软件(用户代码)uC/OS-II内核文件(与处理器类型无关的代码

24、)OS_CORE.C OS_TASK.COS_FLAG.C OS_TIME.COS_MBOX.C uCOS-II.COS_MEM.C uCOS-II.HOS_MUTEX.C OS_SEM.COS_Q.CuC/OS-II 配置文件(与应用程序有关)OS_CFG.HINCLUDES.H移植uC/OS-II(与处理器类型有关的代码)OS_CPU.H OS_CPU_C.COS_CPU_A.ASM CPU 定时器图2.1 uC/OS-II 的文件结构软件硬件基于uC/OS-II操作系统进行应用系统时,设计任务的主要任务是将系统合理划分成多个任务,并由RTOS进行调度,任务之间使用uC/OS-II提供的系

25、统服务进行通信,以配合实现应用系统的功能。上图中应用代码部分主要是设计人员设计的业务代码。与前后台系统一样,基于uC/OS-II的多任务系统也有一个main主函数,main函数由编译器所带的C启动程序调用。在main主函数中主要实现uC/OS-II的初始化OSInit()、任务创建、一些任务通信方法的创建、uC/OS-II的多任务启动OSStart()等常规操作。另外,还有一些应用程序相关的初始化操作,例如:硬件初始化、数据结构初始化等。 在使用uC/OS-II提供的任何功能之前,必须先调用OSInit()函数进行初始化。在main主函数中调用OSStart()启动多任务之前,至少要先建立一个

26、任务。否则应用程序会崩溃。OSInit()初始化uC/OS-II所有的变量和数据结构,并建立空闲任务OS_TaskIdle(),这个任务总是处于就绪态。2.2任务控制块(OS_TCB)任务控制块(TCB)是一个数据结构OS_TCB,一旦一个任务创建,就有一个和它关联的TCB被赋值。当任务的CPU使用权被剥夺时,它用来保存该任务的状态。这样,当任务重新获得CPU使用权时,可以从TCB中获取任务切换前的信息,准确的继续运行。任务控制块包含了许多任务信息,主要有:.OSTCBStkPtr 指向当前任务堆栈栈顶的指针。uC/OS-II允许每个任务有自己的堆栈,每个任务堆栈的大小可以不一样。.OSTCB

27、Next 和.OSTCBPrev 指向OS_TCB双向链表的前、后连接。.OSTCBEventPtr 指向事件控制块的指针;.OSTCBDly 保存任务的延时节拍数,或允许等待事件发生的最多节拍数。.OSTCBPrio 任务的优先级;文件OS_CFG.H中定义的最多任务数OS_MAX_TASKS决定了分配给用户程序的任务控制块的数目。所有的任务控制块都放在任务控制块数组OSTCBTbl 中。uC/OS-II初始化时,所有OS_TCB都被链接成单向空任务链表。任务一旦建立,就将链表开头的OS_TCB赋给该任务。一旦任务被删除,OS_TCB就还给空任务链表。任务建立时,函数OS_TCBInit()

28、初始化任务控制块。2.3 就绪表(ReadyList)UC/OS-II采用内存映射的方式来实现READY队列的加入,查找,删除功能,效率非常高。但是也因此只能支持64个任务,每个任务都有自己的优先级,不能和其他任务优先级向同。每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl.在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl中的相应元素的相应位也置位。就绪表OSRdyTbl数组的大小取决于OS_LOWEST_PRIO(见文件OS_CFG

29、.H)。为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_LOWEST_PRIO在就绪表中相应字节的相应位置是按以下规则给出的: 当OSRdyTbli中的任何一位是1时,OSRdyGrp的第i位置1.i从0到7.使任务进入就绪态OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0x07;任务优先级的低三位用于确定任务在总就绪表OSRdyTbl中的所在位。接下去的三位用于确定是在OSRdyTbl数组的第几个元素。OSMapTbl是在ROM中的(见文件OS_CORE.C)屏蔽字,用于限制OSRdyTbl数组的元素下标在0到7之间,如果一

30、个任务被删除了,则用程序清单3.6中的代码做求反处理。程序清单L3.6从就绪表中删除一个任务if(OSRdyTblprio3&=OSMapTblprio&0x07)=0)OSRdyGrp&=OSMapTblprio3;以上代码将就绪任务表数组OSRdyTbl中相应元素的相应位清零,而对于OSRdyGrp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也就是说OSRdyTblprio3所有的位都是零时,OSRdyGrp的相应位才清零。为了找到那个进入就绪态的优先级最高的任务,并不需要从OSRdyTbl0开始扫描整个就绪任务表,只需要查另外一张表,即优先级判定表OSU

31、nMapTbl。OSRdyTbl中每个字节的8位代表这一组的8个任务哪些进入就绪态了,低位的优先级高于高位。利用这个字节为下标来查OSUnMapTbl这张表,返回的字节就是该组任务中就绪态任务中优先级最高的那个任务所在的位置。这个返回值在0到7之间。确定进入就绪态的优先级最高的任务是用以下代码完成的。找出进入就绪态的优先级最高的任务y=OSUnMapTblOSRdyGrp;x=OSUnMapTblOSRdyTbly;prio=(y图3.2 堆栈增长方向3.2 OS CPU. C 的移植OS CPU. C 的移植包括任务堆栈初始化和相应函数的实现.在这里,共有6个函数:OSTaskStkInit

32、(),OSSTaskCreateHook(),OSTaskDelHook(),OS2TaskSwHook(),OSTaskStatHook(),OSTimeTickHook().其中后面的5个HOOK函数又称为钩子函数,主要是用来对uC/OS-II 进行功能扩展.这些函数为用户定义函数,由操作系统调用相应的HOOK函数去执行,在一般情况下,他们都没有代码,所以实现为空函数即可.而函数OSTaskStkInit()对堆栈进行初始化,在ARM系统中,任务堆栈空间由高到低为PC,LR,R12,R11,R1,R0,CPSR,SPSR.在进行堆栈初始化以后,OSTaskStkInit()返回新的堆栈栈顶指针.3.3 OS CPU A. S 的移植OS CPU A. S文件的移植需要对处理器的寄存器进行操作,所以必须用汇编语言来编写. 这个文件的实现集中体现了所要移植到处理器的体系结构和uC/ OS - II 的移植原理.它包括4个子函数:OSStartHighRdy() ,OSCtxSw(),OSIntCtxSw(),OSTick2ISR().其中难点在于OSIntCtxSw()和OSTickISR() 函数的实现,因为这两个函数的实现与移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关.在实际的移植工作中,这两处也是比较容易出错的地方.OSIntCtxSw( )函数由OSIntE

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号