1、基于asp技术的论坛网站的设计与实现学士学位论文大庆师范学院 本科生毕业论文基于ARM9上的C/OS-嵌入式系统移植-院 (系) 物理与电气信息工程 专 业 电子信息工程 研 究 方 向 嵌入式 摘 要随着计算机和电子技术的发展,越来越多的嵌入式产品出现在人们的日常生活和工业生产之中。由于嵌入式设备的智能型,使得生活和生产变得极为方便,由此也带来了嵌入式操作系统的迅速发展。C/OS-内核作为一种代码公开的嵌入式实时操作系统,ARM9以内核耗电少,成本低,二者相互搭配,构成了较为完美的搭配组合。 本文主要讲述的是C/OS-在ARM9上的系统移植问题。 关键词:C/OS-;Arm9;移植Abstr
2、actWith the development of computer and electronic technology, embedded has become an indispensable part of modern society. Big to industrial production, such as aerospace, small to daily life, such as smart card applications, many devices are built into the embedded, makes the equipment or device h
3、as a high automation performance and some degree of intelligence, great convenience to peoples production and living needs, and thus also brought the rapid development of the embedded operating system. Mu C/OS - kernel code, as a kind of open embedded real-time operating system, the ARM kernel, less
4、 consumption, lower cost, the two match each other, form the relatively perfect collocation. This article mainly tells the mu C/OS - portability issues on the ARM of the system.Keywords: u C/OS - ; Arm; transplant目录第一章 嵌入式系统基础 51.1 嵌入式系统概述 51.2 嵌入式体系硬件基础 51.3 嵌入式体系软件基础 6第二章 C/OS-II介绍 6第三章ARM9介绍 7第四章
5、 C/OS-在S3C2440上的移植 84.1 移植环境简介 84.2 移植条件 84.3 移植步骤 84.3.1 INCLUDES.H 94.3.2 OS_CFG.H 94.3.3 OS_CPU.H 文件 94.3.4 OS_CPU_C.C 文件 104.3.4.1 OSTaskStkInt() 104.3.4.2 OSTaskCreateHook() 104.3.4.3OSTaskDelHook() 104.3.4.4 OSTaskSwHook() 114.3.4.5 OSTaskStatHook() 114.3.4.6 OSTimeTickHook() 114.3.5 OS_CPU_A.
6、ASM 文件 114.3.5.1 OSStartHighRdy() 114.3.5.2 OSCtxSw() 124.3.5.3 OSIntCtxSw() 124.3.5.4 OSTickISR() 124.4 移植测试 12第五章 实例移植 135.1 工程创建 135.2 工程设置 145.3 实例调试 18第六章 结束语 18参考文献 19谢 辞 20第一章 嵌入式系统基础1.1 嵌入式系统概述基于计算机技术,以应用为中心,且软硬件可裁剪,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统,叫做嵌入式系统。一般由以下几部分组成:1. 嵌入式的微处理器2. 硬件设备(外围)3. 嵌入
7、式的操作系统4. 特定应用程序嵌入式系统具有以下几个特点:1. 特定且广泛的应用2. 密集的技术、知识、资金3. 高效性4. 较长生命周期5. 高可靠性6. 软硬件集于一体,以软件为主嵌入式系统的应用领域十分广泛,主要包括交通管理、机器人、军事电子、通信设备、网络设备、医疗仪器、环境监测、汽车电子、工控设备等。嵌入式系统从上世纪60年代中期开始,从无操作系统、简单操作系统、实时操作系统直至今日面向Intenet的阶段,历经50多年。嵌入式因为广泛应用性,巨大的创业型和广阔市场性,走进了千家万户。1.2 嵌入式体系硬件基础嵌入式系统的硬件核心是嵌入式微处理器,另外包括总线、存储器、输入/输出接口
8、和设备。1. 微处理器:至少包含一个微处理器,采用的体系结构是冯诺依曼或哈佛结构。2. 总线:集成在嵌入式微处理器中,选择总线和微处理器密切相关,总线的种类随不同的微处理器的结构而不同。3. 存储器:包括主存和外存。主存用于存数代码和数据;外存存放各种信息4. 输入/输出接口和设备:集成在微处理器中,主要包括中断控制器、DMA、串行和并行接口等1.3 嵌入式体系软件基础RTOS(实时多任务操作系统)、文件系统、GUI(图形接口)、网络系统和通用的组件模块构成了嵌入式系统的软件层。 EOS,即嵌入式操作系统是一种用途广泛的系统软件,主要负责系统软硬件分配、任务控制,调度以及协调并发的活动。目前,
9、世界上一些应用比较成功的EOS产品系列已经被推出了。随着Internet技术发展、信息家电普及应用,EOS已经开始从单一弱功能向高专业化强功能的方向发展。EOS除了具备了一般操作系统最基本的功能(如任务调度、机制同步、中断处理、文件功能等)外,还具有以下的特点:1. 可装载卸载性。开放性、可伸缩性体系结构。2. 极强的实时性。EOS实时性较强,可用于各种设备的控制当中。3. 统一的接口。提供了各种设备驱动接口。4. 方便操作、简单、提供图形GUI,图形的界面,追求的是易学易用性。5. 支持TCP/IP协议和其它的网络协议,提供多种网络协议和MAC访问的接口,为各种手持移动设备预留了接口。6.
10、强稳定性和弱交互性。7. 固化的代码,系统和应用软件固化在ROM中。8. 更好的适应硬件,具有良好的移植性。第二章 C/OS-II介绍实时操作系统,英文称Real Time Operating System,简称RTOS,是一种能够接受并快速处理外界时间或中断,且处理接口在规定时间内来控制过程作出响应,并控制所有实时任务一致运行的系统。1992年美国人Jean J.Labrosse在Embedded SystemProgramming杂志上最先发表了RTOS,名为C/OS,从而开创了它的新时代。C/OS是一个源码开放,抢占式微内核的实时操作系统,C/OS-II是它的升级版本,全部代码约有500
11、0行,由ANSI C,以及少量的汇编语言编写而成,结构简洁,实时性和内核的稳定性强。至今,从8位到64位,C/OS-II已经在超过40种的不同微处理器上运行,在世界范围内得到广泛使用,包括诸多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制等。实际上,C/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明C/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统;当然,也可用于非安全紧要系统。C/OS-II体系结构如图2.1所示图2
12、.1 C/OS-II体系结构第三章ARM9介绍ARM9是32位通用微处理器ARM(Advanced RISC Machine)家族中的一员,具有比较低的电源消耗和良好的性价比,由此广泛应用于工业生产和日常生活中。基于RISC(精简指令)的结构,较微程序的控制复杂指令系统的计算机相对简单,使得它用有较高的中断响应和指令处理的能力。ARM9的指令集共包含了11种基本类型:用于偏上的算术逻辑单元,桶式的移位器及乘法器(两种);指令控制数据传送:用在弹性地址,高速内容切换,和交换数据(三种); 用于流程控制和特权级执行的指令(三种);专门用在能够扩展到片外的协处理器中(三种)。指令集比较适用不同的高级
13、语言编译器,但需要临界代码段,汇编语言编程也比较简单,不像其它的需要复杂的编译器来管理指令。ARM9的流水线技术,能够使指令处理和系统存储的各个部分都可以连续的运行。比如一条指令正在执行,下一条指令正在被破译,同时第三条指令可以从存储器取出。 在存储的系统中,ARM9存储接口的设计能够最大限度的发挥性能潜力且代价降低,被做成流水线方式,速度敏感控制信号推动着由工业DRAM提供的快速局部访问模式。 ARM9有32位地址总线,也可以配制成26位的地址线,向下兼容其它的早期处理器。 全静态的CMOS的ARM9,允许时钟在周期内的停止,并保存当前的状态。基于上述的优势,ARM9适用于一些需要紧凑且功能
14、强大的RISC处理器系统,包括电子通讯、数据通信、信息存储、图像处理、JOEG控制器等,为人们的日常生活和工业生产带来了极大的便利。第四章 C/OS-在S3C2440上的移植4.1 移植环境简介移植就是使实时内核能够在多个微处理器或微控制器上成功运行的过程。本文采用的是S3C2440芯片,开发环境采用Keil uVision3,基本满足了移植的需求。三星公司的16/32位精简指令集的微处理器S3C2440,基于ARM920T的核心,实现了内存管理,ARBA总线和哈佛结构高速缓冲的具有独立的16KB指令高速缓存和16KB数据高速缓存体系结构。4.2 移植条件由于CPU版本的不同,C/OS-II
15、可能会出现不兼容的问题,这时需要对操作系统进行移植,使它能够在使用的CPU 上运行。C/OS-II 的移植需满足以下的要求:1. 处理器的 C 编译器可产生可重入代码; 2. 进入和退出临界区代码可以使用 C 进行调用; 3. 处理器必须支持具有定时中断源的硬件中断; 4. 处理器必须能够容纳一定的数据硬件堆栈; 5. 处理器需要有交换数据的指令,使其能够在 CPU 的寄存器和内核及堆栈间进行数据的交换。 4.3 移植步骤C/OS-作为实时操作系统操作系统,在设计初期就已经充分考虑了可移植性,针对不同的CPU版本,C/OS-的移植核心环节就是改写一些与处理器硬件相关的函数。移植工作包括以下内容
16、:1. 用#define设置一些常量的值(OS_CPU.H)2. 声明10个指定的数据类型(OS_CPU.H) 3. 用#define声明2个宏(OS_CPU.H) 4. 用 C 语言编写6个简单函数(OS_CPU_C.C) 5. 根据硬件编写了4个函数(OS_CPU_ A.ASM)4.3.1 INCLUDES.H INCLUDES.H是一个被包含在所有.C文件中的头文件。简而言之,在这个INCLUDES.H使得项目中的每个.C文件不需要分头文件中包含了可能用到的头文件以及一些可能与实际应用不相关的头文件。虽然这增加了文件编译的时间,但是增强了可移植性。我们可以通过INCLUDES.H来增加自
17、己需要的头文件,为了避免重新编译已编译的内容,增加的头文件必须添加在头文件列表的最后。4.3.2 OS_CFG.H 内核是一个系统的核心,而OS_CFG.H就是用来配置内核的头文件,根据不同的需要和应用,我们可以对内核进行定制和裁剪,从而提高了实时性。4.3.3 OS_CPU.H 文件 OS_CPU.H主要包含了一些用#define定义的常量,宏和类型定义(与处理器相关)。众所周知,不同的处理器字长是不相同的,尤其是,C/OS-代码不使用与编译器相关的C的short(短整),int(整型)和long(长整)等数据类型。所以为了移植的成功,需要对C/OS-中的数据类型进行重新的定义。与所有的实时
18、内核一样,C/OS-需要先将中断禁止再进行访问代码临界段,且在访问完毕重新允许中断。C/OS-定义了两个宏来禁止和允许中断:OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()。结构常量OS_STK_GROWTH是用来改变堆栈生长方式。因为不同的微处理器和微控制器堆栈生长方式不同,C/OS-中可以通过改变OS_STK_GROWTH的值来改变堆栈生长方式当把OS_STK_GROWTH值置0,堆栈的生长方式是从下往上长。当把OS_STK_GROWTH值置1,堆栈的生长方式是从上往下长。OS_TASK_SW()是一个在C/OS-进行任务切换(低任务优先级级到最高优先级任务)
19、时被调用的宏。任务切换只是简单的把处于当前优先级任务处理器的寄存器保存到将被挂起的任务堆栈中,同时将更高优先级的任务从堆栈中恢复出来。4.3.4 OS_CPU_C.C 文件 C/OS-的移植中需要编写六个简单的C函数:OSTaskStkInit()OSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()唯一必要的函数是OSTaskStkInit(),其它五个函数需要声明但没必要包含代码。4.3.4.1 OSTaskStkInt()OSTaskCreate()和 OSTaskCreateExt(
20、)通过调用OSTaskStkInt()进行任务的堆栈结构的初始化。OSTaskCreate()和 OSTaskCreateExt()会得到传递任务地址,pdata指针,任务堆栈栈顶和任务优先级等参数,为了堆栈结构初始化的正确性,OSTaskStkInt()只需要上述的三个和一个附加在OSTaskCreateExt()中得到的选项。一旦堆栈初始化, OSTaskCreate()和 OSTaskCreateExt()会获得OSTaskStkInit()返回堆栈指向的地址,并将其保存至任务控制块(OS_TCB)中。处理器文档会指明堆栈指针会是指向下个堆栈的空闲位置,还是指向了最后存入数据的堆栈单元位
21、置。4.3.4.2 OSTaskCreateHook()OSTaskCreateHook()是一个允许扩展C/OS-的功能的函数,在用OSTaskCreate()或OSTaskCreateExt()建立任务的时候会被调用。当OSTaskCreateHook()被调用时,能够收到指向已建立的任务的OS_TCB 的指针,可用于访问任务的附加数据(MMU 寄存器,浮点寄存器,以及调试的信息等)和其它所有结构成员。在此移植过程中不需要具体的OSTaskCreateHook()函数代码,所以在OS_CFG.H中将OS_CPU_HOOKS_EN 置0时。4.3.4.3OSTaskDelHook()OSTa
22、skDelHook()在删除任务时被调用。当OSTaskDelHook()被调用时,能够收到指向正被删除任务的OS_TCB的指针,可用来检测TCB扩展建立与否并进行某些清楚操作。OSTaskDelHook()无返回值。在此移植过程中不需要具体的OSTaskDelHook()函数代码,所以在OS_CFG.H中将OS_CPU_HOOKS_EN 置0时。4.3.4.4 OSTaskSwHook()OSTaskSwHook()是一个与任务切换相关的函数。不论任务切换是通过OSCtxSw()还是OSIntCtxSw() 进行的切换操作,都需要调用该函数。注意:在调用OSTaskSwHook()期间中断是
23、一直处于禁止状态。任务切换的时间越短,任务执行效率越高,所以在任务切换的时候尽量将代码简化,OSTaskSwHook()无参数,也没有返回值。在此移植过程中不需要具体的OSTaskSwHook ()函数代码,所以在OS_CFG.H中将OS_CPU_HOOKS_EN 置0时。4.3.4.5 OSTaskStatHook()OSTaskStat()以1秒/次的频率调用OSTaskStatHook()函数。因此可以用OSTaskStatHook()来进行扩展统计的功能。OSTaskStatHook()无参数,无返回值。在此移植过程中不需要具体的OSTaskStat ()函数代码,所以在OS_CFG.
24、H中将OS_CPU_HOOKS_EN 置0时。4.3.4.6 OSTimeTickHook()在每一个时钟节拍OSTaskTick()都会调用OSTaskTimeHook()。事实上,OSTaskTimeHook()是在节拍被C/OS-真正处理,并通知实例或应用程序之前被调用。OSTaskTimeHook()无参数,无返回值。在此移植过程中不需要具体的OSTaskTimeHook ()函数代码,所以在OS_CFG.H中将OS_CPU_HOOKS_EN 置0时。4.3.5 OS_CPU_A.ASM 文件 C/OS-的移植的实例要求编写四个汇编函数:OSStartHighRdy()OSCtxSw(
25、)OSIntCtxSw()OSTickISR()如果编译器能够支持插入汇编代码,则可以将所有与处理器相关的代码放到OS_CPU_C.C 文件中,而不必将汇编文件分散。4.3.5.1 OSStartHighRdy()使就绪状态的任务开始运行的函数叫做OSStart()。OSStartHighRdy()由 OSStart()调用,进行执行最高优先级任务的操作。在最高优先级任务恢复之前及在调用OSTaskSwHook()之后设置OSStartHighRdy()中的OSRunning 为 TRUE。4.3.5.2 OSCtxSw()OSCtxSw()主要是进行任务级的切换。在当前任务调用C/OS-提供
26、的系统服务,且更高优先级任务处于就绪状态的同时,C/OS-就会借助向量地址找到OSCtxSw()。在调用的最后,调用 的OSSched()可推断当前任务不是优先级最高的任务。如果是的话,OSSched()会先将最高优先级任务地址装载到OSTCBHighRdy 中,再通过调用 OS_TASK_SW()执行软中断或陷阱指令。注意:变量OSTCBCur包含了指向当前任务的OS_TCB 的指针。因为不能直接从C中访问CPU寄存器,所以代码必须写在汇编语言中,。需要注意的是在OSCtxSw()和定义的函数OSTaskSwHook() 的执行的过程中,中断需要处于禁止的状态。4.3.5.3 OSIntCt
27、xSw()当C/OS-判断有比中断更为重要的事件发生时,OSIntExit()会调用OSIntCtxSw()从中断中切换出去。OSIntCtxSw()是C/OS-中唯一的与编译器相关的函数, 它的代码须必须写在汇编中。如果编译器能够插入汇编代码,就可以将 OSIntCtxSw()代码放到 OS_CPU_C.C 文件中,而不放到 OS_CPU_A.ASM 文件中,这是因为不能直接从 C 语言中访问 CPU 寄存器。因为OSIntCtxSw()的代码与 OSCtxSw()基本上是相同的,所以可以通过“BL”指令减少 OSIntCtxSw()代码量,这在移植实例中是常见的。4.3.5.4 OSTic
28、kISR()C/OS-要求提供一个时钟资源实现时间延时和期满的功能,时钟节拍应该每秒发生 10至100次。为了完成任务,调用OSTickISR()可以解决这个问题。4.4 移植测试当移植工作完成之后就是对它的测试。测试工作能够在没有应用程序的情况下进行。即是使内核进行自测。在ADS1.2下进行编译、链接成可执行文件后,通过以下的测试用例,验证系统移植的成功。测试代码程序如下:void OSTaskIdleHook (void)static x = 0 ;if (x %10000= = 0) /*每10000次点亮一个LED 灯*/sysUtilsLightLed (LED_ ALL,FALSE
29、) ; /*关闭所有LED灯*/sysUtilsLightLed (i %3+1,TRUE) ; /*循环点亮LED灯*/x + + ;ret urn ;第五章 实例移植 本章的主要内容是在对移植有了较为全面的了解和认识之后,将C/OS-操作系统移植到ARM9的处理器上,然后编写一个简单地应用程序,实现LED灯的控制。5.1 工程创建1. 连接EasyJTAG-H仿真器和ARM9的开发板,然后安装EasyJTAG-H仿真器,短接蜂鸣器跳线JP9。 2. 启动ADS 1.2,新建一个ARM Executable Image for DeviceARM2410(uCOSII)工程模板建立一个工程u
30、COS_II。3. 创建uCOS_II文件夹,创建两个子文件夹,分别为ARM、SOURCEa ARM存放和平台相关的文件(OS_CPU.H Os_cpu_a.s Os_cpu_c.c )b SOURCE下存入和平台无关的文件(ucos_ii.h os_cfg.h os_core.c os_flag.c os_mbox.c os_mem.c os_mutex.c os_q.c os_sem.c os_task.c os_time.c os_tmr.c ),即将C/OS 2.52源代码添加到SOURCE文件夹4. 创建一个S3C2440文件夹,创建两个子文件夹,分别为INC、SRCa. INC存放
31、S3C2440相关头文件(2440addr.h 2440lib.h 2440slib.h config.h Def1.h lcd.h mmu.h Option.h Target.h Timer.h )b. SRC存放S3C2440相关源文件(Timer.c 2440init.s 2440lib.c 2440slib.s Font_Libs.c iphone.c lcd.c mmu.c nand.c Target.c )5. 创建一个APP文件夹(app_cfg.h、main.c、Printf.c、Printf.h)在APP文件夹的main.c中编写主程序代码。5.2 工程设置在工程建立之后,还需要对于工程进行相应的设置在【Edit】【DebugRel Settings】下1. 【Target】【Target Settings】【,Post-linker】:ARM fromELF2. 【Target】【Access Paths】选中【Always Sea
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1