基于ARM9的μCOS-Ⅱ嵌入式系统移植_.doc_第1页
基于ARM9的μCOS-Ⅱ嵌入式系统移植_.doc_第2页
基于ARM9的μCOS-Ⅱ嵌入式系统移植_.doc_第3页
基于ARM9的μCOS-Ⅱ嵌入式系统移植_.doc_第4页
基于ARM9的μCOS-Ⅱ嵌入式系统移植_.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大庆师范学院本科毕业论文(设计)大庆师范学院 本科生毕业论文基于arm9上的c/os-嵌入式系统移植-院 (系) 物理与电气信息工程 专 业 电子信息工程 研 究 方 向 嵌入式 学 生 姓 名 钮佳楠 学生名采用四号楷体,加粗、居中。其余各项均为四号宋体,数字用四号“times new roman”。各项下划线末端对齐。学 号 200901071677 指导教师姓名 成宝芝 指导教师职称 讲师 2013年 5 月 15 日摘 要“摘要”采用小五号黑体。行间距18磅,上下各空一标准行。随着计算机和电子技术的发展,越来越多的嵌入式产品出现在人们的日常生活和工业生产之中。由于嵌入式设备的智能型,使得生活和生产变得极为方便,由此也带来了嵌入式操作系统的迅速发展。c/os-内核作为一种代码公开的嵌入式实时操作系统,arm9以内核耗电少,成本低,二者相互搭配,构成了较为完美的搭配组合。 本文主要讲述的是c/os-在arm9上的系统移植问题。 中文摘要内容采用小五号楷体,首行缩进2字符,行间距18磅。字数一般为150-300字。关键词:c/os-;arm9;移植每篇论文(设计)选取3-6个词作为关键词。“关键词”采用小五号黑体,并缩进2字符。关键词内容采用小五号楷体,关键词之间用“;”分隔,行间距18磅。abstract“abstract”采用小五号“times new roman”,加粗,行间距为固定值18磅,上下各空一标准行。with 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 has 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 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第四章 c/os-在s3c2440上的移植84.1 移植环境简介84.2 移植条件84.3 移植步骤84.3.1 includes.h94.3.2 os_cfg.h94.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.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. 嵌入式的操作系统4. 特定应用程序嵌入式系统具有以下几个特点:1. 特定且广泛的应用2. 密集的技术、知识、资金3. 高效性4. 较长生命周期5. 高可靠性6. 软硬件集于一体,以软件为主嵌入式系统的应用领域十分广泛,主要包括交通管理、机器人、军事电子、通信设备、网络设备、医疗仪器、环境监测、汽车电子、工控设备等。嵌入式系统从上世纪60年代中期开始,从无操作系统、简单操作系统、实时操作系统直至今日面向intenet的阶段,历经50多年。嵌入式因为广泛应用性,巨大的创业型和广阔市场性,走进了千家万户。1.2 嵌入式体系硬件基础嵌入式系统的硬件核心是嵌入式微处理器,另外包括总线、存储器、输入/输出接口和设备。1. 微处理器:至少包含一个微处理器,采用的体系结构是冯诺依曼或哈佛结构。2. 总线:集成在嵌入式微处理器中,选择总线和微处理器密切相关,总线的种类随不同的微处理器的结构而不同。3. 存储器:包括主存和外存。主存用于存数代码和数据;外存存放各种信息4. 输入/输出接口和设备:集成在微处理器中,主要包括中断控制器、dma、串行和并行接口等1.3 嵌入式体系软件基础rtos(实时多任务操作系统)、文件系统、gui(图形接口)、网络系统和通用的组件模块构成了嵌入式系统的软件层。eos,即嵌入式操作系统是一种用途广泛的系统软件,主要负责系统软硬件分配、任务控制,调度以及协调并发的活动。目前,世界上一些应用比较成功的eos产品系列已经被推出了。随着internet技术发展、信息家电普及应用,eos已经开始从单一弱功能向高专业化强功能的方向发展。eos除了具备了一般操作系统最基本的功能(如任务调度、机制同步、中断处理、文件功能等)外,还具有以下的特点:1. 可装载卸载性。开放性、可伸缩性体系结构。2. 极强的实时性。eos实时性较强,可用于各种设备的控制当中。3. 统一的接口。提供了各种设备驱动接口。4. 方便操作、简单、提供图形gui,图形的界面,追求的是易学易用性。5. 支持tcp/ip协议和其它的网络协议,提供多种网络协议和mac访问的接口,为各种手持移动设备预留了接口。6. 强稳定性和弱交互性。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是它的升级版本,全部代码约有5000行,由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.1 c/os-ii体系结构第三章arm9介绍arm9是32位通用微处理器arm(advanced risc machine)家族中的一员,具有比较低的电源消耗和良好的性价比,由此广泛应用于工业生产和日常生活中。基于risc(精简指令)的结构,较微程序的控制复杂指令系统的计算机相对简单,使得它用有较高的中断响应和指令处理的能力。arm9的指令集共包含了11种基本类型:用于偏上的算术逻辑单元,桶式的移位器及乘法器(两种);指令控制数据传送:用在弹性地址,高速内容切换,和交换数据(三种); 用于流程控制和特权级执行的指令(三种);专门用在能够扩展到片外的协处理器中(三种)。指令集比较适用不同的高级语言编译器,但需要临界代码段,汇编语言编程也比较简单,不像其它的需要复杂的编译器来管理指令。arm9的流水线技术,能够使指令处理和系统存储的各个部分都可以连续的运行。比如一条指令正在执行,下一条指令正在被破译,同时第三条指令可以从存储器取出。 在存储的系统中,arm9存储接口的设计能够最大限度的发挥性能潜力且代价降低,被做成流水线方式,速度敏感控制信号推动着由工业dram提供的快速局部访问模式。 arm9有32位地址总线,也可以配制成26位的地址线,向下兼容其它的早期处理器。 全静态的cmos的arm9,允许时钟在周期内的停止,并保存当前的状态。基于上述的优势,arm9适用于一些需要紧凑且功能强大的risc处理器系统,包括电子通讯、数据通信、信息存储、图像处理、joeg控制器等,为人们的日常生活和工业生产带来了极大的便利。第四章 c/os-在s3c2440上的移植4.1 移植环境简介移植就是使实时内核能够在多个微处理器或微控制器上成功运行的过程。本文采用的是s3c2440芯片,开发环境采用keil uvision3,基本满足了移植的需求。三星公司的16/32位精简指令集的微处理器s3c2440,基于arm920t的核心,实现了内存管理,arba总线和哈佛结构高速缓冲的具有独立的16kb指令高速缓存和16kb数据高速缓存体系结构。4.2 移植条件由于cpu版本的不同,c/os-ii 可能会出现不兼容的问题,这时需要对操作系统进行移植,使它能够在使用的cpu 上运行。c/os-ii 的移植需满足以下的要求:1. 处理器的 c 编译器可产生可重入代码; 2. 进入和退出临界区代码可以使用 c 进行调用; 3. 处理器必须支持具有定时中断源的硬件中断; 4. 处理器必须能够容纳一定的数据硬件堆栈; 5. 处理器需要有交换数据的指令,使其能够在 cpu 的寄存器和内核及堆栈间进行数据的交换。 4.3 移植步骤c/os-作为实时操作系统操作系统,在设计初期就已经充分考虑了可移植性,针对不同的cpu版本,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.1 includes.h includes.h是一个被包含在所有.c文件中的头文件。简而言之,在这个includes.h使得项目中的每个.c文件不需要分头文件中包含了可能用到的头文件以及一些可能与实际应用不相关的头文件。虽然这增加了文件编译的时间,但是增强了可移植性。我们可以通过includes.h来增加自己需要的头文件,为了避免重新编译已编译的内容,增加的头文件必须添加在头文件列表的最后。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-中的数据类型进行重新的定义。与所有的实时内核一样,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-进行任务切换(低任务优先级级到最高优先级任务)时被调用的宏。任务切换只是简单的把处于当前优先级任务处理器的寄存器保存到将被挂起的任务堆栈中,同时将更高优先级的任务从堆栈中恢复出来。4.3.4 os_cpu_c.c 文件 c/os-的移植中需要编写六个简单的c函数:ostaskstkinit()ostaskcreatehook()ostaskdelhook()ostaskswhook()ostaskstathook()ostimetickhook()唯一必要的函数是ostaskstkinit(),其它五个函数需要声明但没必要包含代码。4.3.4.1 ostaskstkint()ostaskcreate()和 ostaskcreateext()通过调用ostaskstkint()进行任务的堆栈结构的初始化。ostaskcreate()和 ostaskcreateext()会得到传递任务地址,pdata指针,任务堆栈栈顶和任务优先级等参数,为了堆栈结构初始化的正确性,ostaskstkint()只需要上述的三个和一个附加在ostaskcreateext()中得到的选项。一旦堆栈初始化, ostaskcreate()和 ostaskcreateext()会获得ostaskstkinit()返回堆栈指向的地址,并将其保存至任务控制块(os_tcb)中。处理器文档会指明堆栈指针会是指向下个堆栈的空闲位置,还是指向了最后存入数据的堆栈单元位置。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()ostaskdelhook()在删除任务时被调用。当ostaskdelhook()被调用时,能够收到指向正被删除任务的os_tcb的指针,可用来检测tcb扩展建立与否并进行某些清楚操作。ostaskdelhook()无返回值。在此移植过程中不需要具体的ostaskdelhook()函数代码,所以在os_cfg.h中将os_cpu_hooks_en 置0时。4.3.4.4 ostaskswhook()ostaskswhook()是一个与任务切换相关的函数。不论任务切换是通过osctxsw()还是osintctxsw() 进行的切换操作,都需要调用该函数。注意:在调用ostaskswhook()期间中断是一直处于禁止状态。任务切换的时间越短,任务执行效率越高,所以在任务切换的时候尽量将代码简化,ostaskswhook()无参数,也没有返回值。在此移植过程中不需要具体的ostaskswhook ()函数代码,所以在os_cfg.h中将os_cpu_hooks_en 置0时。4.3.4.5 ostaskstathook()ostaskstat()以1秒/次的频率调用ostaskstathook()函数。因此可以用ostaskstathook()来进行扩展统计的功能。ostaskstathook()无参数,无返回值。在此移植过程中不需要具体的ostaskstat ()函数代码,所以在os_cfg.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()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-提供的系统服务,且更高优先级任务处于就绪状态的同时,c/os-就会借助向量地址找到osctxsw()。在调用的最后,调用 的ossched()可推断当前任务不是优先级最高的任务。如果是的话,ossched()会先将最高优先级任务地址装载到ostcbhighrdy 中,再通过调用 os_task_sw()执行软中断或陷阱指令。注意:变量ostcbcur包含了指向当前任务的os_tcb 的指针。因为不能直接从c中访问cpu寄存器,所以代码必须写在汇编语言中,。需要注意的是在osctxsw()和定义的函数ostaskswhook() 的执行的过程中,中断需要处于禁止的状态。4.3.5.3 osintctxsw()当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 ostickisr()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) ; /*关闭所有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)工程模板建立一个工程ucos_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存放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 search user paths】(ucos_ii部分文件采用#include 包涵,不修改这里找不到文件)3. 【language settings】下【arm assembler】、【arm c compliler】、【arm c+ complier】处理器设置成arm920t4. 【language settings】下【arm c compliler】下【errors】下去掉【implicit pointer c】,【arm c compliler】下【warnings】下去掉【unused declaration】(-o1 -g+ -cpu arm920t -wx -ec)5. 【arm linker】下,【output】下【ro base】设置成0x30000000,【options】下【image entry point】设置成0x30000000,【layout】下【place at beginning of image】下的【object/symbol】设置成2440init.o,【section】设置成init,【listings】下选勾image map、【list file】设置list.txt,勾上sizes、totals、unused、veneers。6. 【arm fromelf】下【output file name】下填写输出的二进制5.3 实例调试在工程设置之后,选用debugrel生成目标,然后编译链接工程。将arm9开发板上的蜂鸣器跳线jp9短接,将启动方式选择跳线jp8短接,然后按rst键复位系统。选择【project】-【debug】,启动axd进行jtag仿真调试。全速运行程序,程序将会在main.c的主函数中停止(因为main函数起始处默认设置有断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论