基于ARM9的μCOSⅡ嵌入式系统移植毕业设计Word文档格式.docx
《基于ARM9的μCOSⅡ嵌入式系统移植毕业设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于ARM9的μCOSⅡ嵌入式系统移植毕业设计Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
一般嵌入式系统的组成包括以下部分:
1.嵌入式的微处理器
2.硬件设备(外围)
3.嵌入式的操作系统
4.特定应用程序
嵌入式的系统特点如下:
1.特定且广泛的应用
2.密集的技术、知识、资金
3.高效性
4.较长生命周期
5.高可靠性
6.软硬件集于一体,以软件为主
嵌入式系统的应用领域十分广泛,主要包括交通管理、机器人、军事电子、通信设备、网络设备、医疗仪器、环境监测、汽车电子、工控设备等。
嵌入式系统从上世纪60年代中期开始,从无操作系统、简单操作系统、实时操作系统直至今日面向Intenet的阶段,历经50多年。
嵌入式因为广泛应用性,巨大的创业型和广阔市场性,走进了千家万户。
1.2嵌入式体系硬件基础
存储器、总线和输入输出设备以及作为硬件核心的微处理器共同组成了嵌入式系统的硬件体系。
1.微处理器:
至少包含一个微处理器,采用的体系结构是冯诺依曼或哈佛结构。
2.存储器:
由内存和外存构成。
内存(即主存)存放一些数据和具体的代码;
外存中存放各种信息,包括配置信息,调试信息等。
3.总线:
种类随处理器的不同而不同,有些处理器总线32位,有些则是26位的。
4.输入/输出接口和设备:
包含了串并口、中断处理器和DMA等设备。
1.3嵌入式体系软件基础
同WINDOWS类似,嵌入式软件系统一般由操作系统(RTOS)、图形界面(GUI)、网络以及一些通用的模块组成。
随着科技和技术的发展,嵌入式产品的功能由单一化转向专业化,成功应用在了各行各业。
在除了任务调度,同步机制的一些基本功能外,嵌入式系统还具备有以下优点:
1.可装载卸载性。
开放性、可伸缩性体系结构。
2.极强的实时性。
EOS实时性较强,可用于各种设备的控制当中。
3.统一的接口。
提供了各种设备驱动接口。
4.方便操作、简单、提供图形GUI,图形的界面,追求的是易学易用性。
5.网络协议的多元化,提供各种网络协议的接口。
6.强稳定性和弱交互性。
7.固化的代码,系统和应用软件固化在ROM中。
更好的适应硬件,具有良好的移植性。
第二章μC/OS-II介绍
嵌入式操作系统(RTOS)是一个实时操作系统,所说的实时,就是指在外界中断或事件产生的时候,能够快速进行该中断的接受和处理操作,同时在规定的时间内使之控制相应的过程并作出正确响应的性能。
20世纪90年代初期,美国人JeanJ.Labrosse在《嵌入式系统编程》杂志上发表了一个关于名为μC/OS的实时操作系统的文章,从而为μC/OS系统掀开了崭新的篇章。
微型内核的μC/OS源码开放,稳定性强,作为μC/OS升级版本的μC/OS-II,主要有ANSIC,以及少量的汇编代码构成,全部代码不超过5000行,正因为占用空间的小巧,结构的简洁,基于实时性强的优点,μC/OS-II能在多重不同位数的处理器上运行。
大到航空航天,小至手持设备,μC/OS-II已经成功应用诸多领域,为人们的生活带来了极大的便利。
μC/OS-II体系结构如图2.1所示
图2.1μC/OS-II体系结构
第三章ARM9介绍
ARM9的低功耗和高性价比,使之在工业生产和日常生活中得到广泛应用。
ARM9基于RISC(精简指令)的结构,使它较用微程序控制的复杂指令系统的计算机具有更高的中断响应和指令处理的能力。
ARM9的指令集共包含了11种基本类型:
1.桶式的移位器及乘法器和偏上算术的逻辑单元(两种);
2.指令控制数据传送:
用在弹性地址,高速内容切换,和交换数据(三种);
3.控制流程和特权级执行的指令(三种);
4.专门用在能够扩展到片外的协处理器中(三种)。
ARM9的指令集比较适用不同的高级语言编译器,但需要临界代码段,汇编语言编程也比较简单,不像其它的需要复杂的编译器来管理指令。
ARM9的流水线技术使它可以在译码的同时进行下一条指令的取指操作,具有更高的速率和效率。
ARM9有32位地址总线,也可以配制成26位的地址线,使早期版本的处理器能够被它兼容。
全静态CMOS的ARM9,允许时钟停止循环,并保存当前状态。
基于上述的优势,ARM9适用于一些需要紧凑且功能强大的RISC处理器系统,包括电子通讯、数据通信、信息存储、图像处理、JOEG控制器等,为人们的日常生活和工业生产带来了极大的便利。
第四章μC/OS-Ⅱ在S3C2440上的移植
4.1移植环境简介
保证一个系统的内核保证能够在多个微处理器或微控制器上,同时保持了它的实时性和稳定性操作过程,就是移植。
本文硬件平台选择的是S3C2440芯片,软件开发环境应用ADS1.2,再通过JLink-H进行调试,基本满足了移植的需求。
ARM9的S3C2440,能够在ARM920T核心的基础上,对系统内存进行高效的管理;
哈佛体系结构使其执行效率和速度得到了加强。
4.2移植条件
由于CPU版本的不同,μC/OS-II可能会出现不兼容的问题,这时需要对操作系统进行移植,使它能够在使用的CPU上运行。
μC/OS-II的移植必须满足下列要求:
1.处理器的C编译器可产生可重入代码;
2.进入和退出临界区代码用C进行调用;
3.处理器必须支持具有定时中断源的硬件中断处理器必须能够容纳一定的数据硬件堆栈;
4.处理器需要有交换数据的指令,使其能够在CPU的寄存器和内核及堆栈间进行数据的交换。
4.3移植内容
针对μC/OS-Ⅱ的移植操作看似复杂,其实过程并不困难,在理解处理器位数和操作系统位数的前提下,只需要改写几个与处理器硬件相关的函数就能够保证移植操作的成功。
一般而言,在μC/OS-Ⅱ的移植过程中做到以下几点就基本可以使移植成功:
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.1INCLUDES.H
在移植初期,需要写入一个被包含在所有.C文件中的头文件,其中包含了可能用到的头文件和一些可能与实际应用不相关的头文件。
由于头文件的增加,导致了编译时间变长,但是避免了在编译过程中头文件丢失的风险,大大增强了移植性。
当加入新的程序或代码的时,只需将所用头文件放到include.h文件中即可。
需要增加的头文件必须需放在include.h头文件的最后,为了避免在编译过程中将已编译的内容再重新进行编译。
4.3.2OS_CFG.H
内核是一个系统的核心,而OS_CFG.H就是用来配置内核的头文件,根据不同的需要和应用,我们可以对内核进行定制和裁剪,从而提高了实时性。
4.3.3OS_CPU.H
OS_CPU.H:
由#define重新定义的与处理器相关的宏,数据类型和常量存放在这个文件中。
众所周知,处理器有8位,16位,32位,64位甚至128位,对应到不同处理器的操作系统中位数是不一样的,否则会发生无法兼容的问题,μC/OS-Ⅱ中不使用C中使用频繁的short(短整),int(整型)和long(长整)等数据类型。
所以为了能够与处理器的字长相匹配,需要对μC/OS-Ⅱ中的数据类型进行重新的定义。
在任何的操作系统中,中断都是必不可少的,否则在更高优先级的任务发生时,无法对其进行处理,可能导致系统的崩溃。
在类似这种情况下,需要对μC/OS-Ⅱ进行中断的禁止操作,且在访问代码结束重新将中断置为允许状态。
所以在μC/OS-Ⅱ中有两个宏:
OS_ENTER_CRITICAL()(中断禁止)和OS_EXIT_CRITICAL()(中断允许)。
结构常量OS_STK_GROWTH是在移植过程中专门为改变堆栈生长方式而定义的一个宏:
将其置1时生长方式是从上往下,置0则相反。
在执行中断,或者任务优先级变化的时候,需要任务的切换(低任务优先级级到最高优先级任务)。
任务切换简而言之就是将当前任务的寄存器和状态字保存到堆栈中并把更高优先级任务从堆栈中恢复出来。
任务切换的时候需要OS_TASK_SW(),在移植过程中需要对这个宏重新定义。
4.3.4OS_CPU_C.C
μC/OS-Ⅱ的移植中需要用C语言编写六个简单的函数:
1.OSTaskStkInit()
2.OSTaskCreateHook()
3.OSTaskDelHook()
4.OSTaskSwHook()
5.OSTaskStatHook()
6.OSTimeTickHook()
在移植过程中,OSTaskStkInit()是唯一需要进行改写的函数,其余的五个钩子函数(挂机函数),只需要对其声明,不需要详细的代码,且由于只是声明,所以在内核配置文件OS_CFG.H中需要将OS_CPU_HOOKS_EN的值设置为0。
4.3.4.1OSTaskStkInt()
OSTaskStkInt():
初始化堆栈欧诺个能函数。
在早期任务创建时使用OSTaskCreate()和OSTaskCreateExt()调用OSTaskStkInt(),在这个过程中OSTaskStkInt()获得通过的pdata指针,任务堆栈栈顶和任务优先级和其它参数参数,以确保正确的初始化堆栈结构。
4.3.4.2OSTaskCreateHook()
OSTaskCreateHook():
μC/OS-Ⅱ的功能扩展的允许与否,在创建任务的时候通过这个函数进行功能设置。
建立任务之后会返回一个OS_TCB的指针,在选择扩展功能的时候,该指针会传给OSTaskCreateHook(),通过这个指针访问任务的附加数据(MMU寄存器,浮点寄存器,以及调试的信息等)和结构成员。
从而决定可允许扩展的成员。
4.3.4.3OSTaskDelHook()
OSTaskDelHook():
用于任务的删除。
任务建立之后会返回一个OS_TCB指针,在删除任务的时候,该指针会传给OSTaskDelHook(),通过这个指针访问任务的附加数据和结构成员。
从而决定删除的对象。
4.3.4.4OSTaskSwHook()
OSTaskSwHook():
优先级改变,或者中断发生,进行任务切换的时候调用的函数。
调用OSTaskSwHook()期间中断应该处于禁止的状况,这是为了防止程序的崩溃。
任务切换的时间越短,任务执行效率越高,所以在任务切换的时候尽量将代码简化,OSTaskSwHook()无参数,也没有返回值。
4.3.4.5OSTaskStatHook()
OSTaskStatHook():
进行扩展统计功能的函数。
OSTaskStatHook()无参数,无返回值。
4.3.4.6OSTimeTickHook()
OSTaskTimeHook():
应用于每一个时钟节拍中。
事实上,OSTaskTimeHook()是在节拍被μC/OS-Ⅱ真正处理,并通知实例或应用程序之前被调用。
OSTaskTimeHook()无参数,无返回值。
4.3.5OS_CPU_A.ASM
四个汇编函数的编写是μC/OS-Ⅱ移植的重点:
1.OSStartHighRdy()
2.OSCtxSw()
3.OSIntCtxSw()
4.OSTickISR()
为了节省空间和内存,将所有与处理器相关的函数、代码集中放到OS_CPU_C.C文件中。
4.3.5.1OSStartHighRdy()
OSStartHighRdy():
选择优先级最高的任务执行。
OSStart是开始运行任务的函数,在运行开始之后可以调用OSStartHighRdy()选择优先级最高的任务执行。
在任务切换之后和恢复先前任务之前需要将此函数的OSRunning设置为0。
4.3.5.2OSCtxSw()
OSCtxSw():
执行最高优先级的任务是μC/OS-Ⅱ的特点之一,而OSCtxSw()就是基于此而创建的函数。
调用任务切换函数的时候中断也必须处于禁止状态。
4.3.5.3OSIntCtxSw()
OSIntCtxSw():
μC/OS-Ⅱ中唯一与微处理器相关的函数。
4.3.5.4OSTickISR()
OSTickISR():
为了满足时间期满和延迟功能而编写的函数。
第五章实例移植
本章是在基于第四章内容的基础上,进行一个详细的代码实例移植。
通过源码介绍、软件设置和仿真调试,实现ARM9开发板上LED灯的控制。
5.1函数配置
实例移植是验证移植成功的关键。
通过网络或其它途径获得μC/OS-Ⅱ的源代码,对于一些在第四章描述的变量、宏和函数进行重新定义和配置。
源代码如图5-1所示:
图5-1源代码文件夹
在S3C2440文件夹下有两个子文件夹,分别是includes和source,如图5-2所示:
图5-2S3C2440文件夹下的文件
在includes文件中包括config.h、lcd.h、mmu.h、Nand.h、Option.h、S3C2440addr.h、S3C2440lib.h、S3C24400slib.h、Timer.h,这些文件都是一些与芯片相关的头文件。
如图5-3所示:
图5-3includes文件夹
在source文件中包括Timer.c、2440init.s、2440lib.c、2440slib.s、Font_Libs.c、iphone.c、lcd.c、mmu.c"
、nand.c、Target.c、main.c等,这些都是一些与芯片相关的源文件,这里的main.c函数可以写入测试程序,执行测试操作,如图5-4:
图5-4source文件夹
uCOS_II文件夹中包含了四个文件夹,分别是API、include、arm、SOURCE。
图5-5uCOS_II文件夹
在API文件夹中只有一个应用配置相关的头文件:
app_cfg.H,如图5-6所示:
图5-6API文件夹
include中有三个文件:
os_cfg.h、OS_CPU.H和ucos_ii.H,其中OS_CPU.H需要进行配置,如图5-7:
图5-7include文件夹
arm文件夹中也是三个文件:
IRQ.inc、Os_cpu_a.a、Os_cpu_c.C,其中后两个是需要进行配置的文件,如图5-8所示:
图5-8arm文件夹
在SOURCE文件夹中有一个API文件夹(包含os_api.h和os_api.c)和os_core.c、os_dbg_r.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、Printf.h、Printf.c和ucos_ii.c文件,这些是一些与系统服务相关的函数文件,比如消息机制,内存共享,信号量等函数。
图5-8所示:
图5-8SOURCE文件夹
在对源码结构了解之后,就是对所需文件进行相应的配置,具体配置代码见附录1。
5.2工程创建
在PC机上安装ADS1.2和JLink-H仿真器(软件和驱动),通过转换口将JLink-H仿真器和ARM9的开发板以及PC机连接起来,ARM9的蜂鸣器短接跳线JP9。
J-Link与ARM9连接图如图5-9所示
图5-9JLink与ARM9的连接图
PC机上启动ADS1.2,新建一个ARMExecutableImage工程,在【Projectname】中填写工程名称:
uCOS.mcp,在Location中填入代码所在位置,工程建立完毕。
5.3工程设置
在ADS1.2中的工程建立之后,还需要对于工程进行相应的设置
在【Edit】→【DebugRelSettings】下
在【Target】条目中选择【TargetSettings】,将其中的【Post-linker】设置成ARMfromELF,如图5-10所示。
图5-10ADS1.2工程设置
(1)
在【Target】条目中选择【AccessPaths】,将【AlwaysSearchUserPaths】选中(因为系统的部分文件采用包涵在#include<
>
,这里不做修改可能无法导致文件),如图5.2.2所示。
图5-10ADS1.2工程设置
(2)
在【LanguageSettings】条目下依次选择【ARMAssembler】,将其处理器设置成ARM920T,【ARMCCompliler】、【ARMC++Complier】也是类似操作,如图5-11所示。
图5-11ADS1.2工程设置(3)
在【LanguageSettings】条目下选择【ARMCCompliler】,在【Errors】中勾销掉【Implicitpointerc】,然后选择【ARMCCompliler】,在【Warnings】中购销掉【Unuseddeclaration】
(-O1-g+-cpuARM920T-Wx-Ec),如图5-12所示
图5-12ADS1.2工程设置(4)
在【ARMLinker】条目下选择【Output】,将【ROBase】设置成0x30000000,【Options】下【Imageentrypoint】设置成0x30000000,【Layout】下【Placeatbeginningofimage】下的【Object/Symbol】设置成2440init.o,【Section】设置成Init,【Listings】下选勾Imagemap、【Listfile】设置list.txt,勾上Sizes、Totals、Unused、Veneers。
如图5-13所示。
图5-13ADS1.2工程设置(5)
【ARMfromELF】条目下选择【Outputfilename】,填写“输出的二进制”,如图5-14所示
图5-14ADS1.2工程设置(6)
在ADS1.2工程配置过后,同样对JLink-H进行相应的设置。
打开JFlashARM,点击Options下拉菜单,找到Projectsettings选项,点击,在【General】中对连接USB端口进行设置(不确定的情况下去系统设备管理器中查找),如图5-15所示:
图5-15JFashArm设置
(1)
在【TargetInterface】条目中的【Core】选择设备:
ARM9,如图5-16所示:
图5-16JFashArm设置
(2)
JLink设置完毕。
5.4实例调试
在工程和JLink全部设置完毕,将测试程序写入到main.c函数中,测试程序见附录。
设置之后,选用DebugRel生成目标,然后点击Make编译工程。
编译成功显示如图5-17所示:
图5-17编译界面
在这里显示出现0个错误,7个警告,由下面的窗口可知,警告是因为LCD日期打印,导致的原因可能是下载的源码中LCD源码部分不完整或者混淆,但是这不影响移植的测试,所以未加以修改。
将ARM9开发板上的蜂鸣器\Lcd跳线进行短接,启动方式的选择跳线也短接,然后按RST键复位系统。
点击Debug,进行JLink的仿真调试
在这里声明一下,因为JLink是一个在线修改下载的仿真器,所以在代码不正确都得情况下,可以直接在线修改,不需要像DNW和超级终端一样重复下载。
在main.c中默认设置几个断点,程序会在断点处停止,然后进行分步执行操作
同VB类似,在ADS1.2中可以通过观察窗口观察程序中的全局变量和局部变量的值的变化情况,具体操作是点击【ContextVariable】按钮(或者选择【ProcessorViews】条目下的【Variables】)。
第六章结束语
本文通过对嵌入式、μC/OS-Ⅱ和ARM9的介绍,以及较为详细的移植内容分析,基于ADS1.2、EasyJTAG-H仿真器和开发板组合的实例测试,验证了此移植的准确性,为μC/OS-Ⅱ嵌入式系统的应用,提供了最为基本的条件。
随着科技的发展,工业生产和日常生活的需要,作为一个具有明显优势的实时操作系统,μC/OS-Ⅱ具有广泛的应用前景和市场价值,必定会在嵌入式中占据一席之地。
[参考文献]
[1]王振宇.uC/OS操作系统在ARM系统中的应用[D].长春:
吉林大学硕士学位论文,2003:
1-16.
[2]李承创,陈跃斌,房晓丽,等.uC/OS-III在Cortex-M3处理器上的移植[J].单片机与嵌入式系统应用,2012(4):
42-44.
[3]孙顺远,秦会斌,崔佳冬,等.μC/OS-Ⅱ在Cortex-M3内核上的移植及优化[J].计算机系统应用,2010(4):
208-211.
[4]唐其伟.基于ARM与μC/OS-II的嵌入式系统研究[D].广州:
广东工业大学硕士学位论文,2005