基于Arm9的μCOSⅡ嵌入式系统移植.docx
- 文档编号:27360069
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:26
- 大小:829.30KB
基于Arm9的μCOSⅡ嵌入式系统移植.docx
《基于Arm9的μCOSⅡ嵌入式系统移植.docx》由会员分享,可在线阅读,更多相关《基于Arm9的μCOSⅡ嵌入式系统移植.docx(26页珍藏版)》请在冰豆网上搜索。
基于Arm9的μCOSⅡ嵌入式系统移植
摘要
随着计算机和电子技术的发展,越来越多的嵌入式产品出现在人们的日常生活和工业生产之中。
由于嵌入式设备的智能型,使得生活和生产变得极为方便,由此也带来了嵌入式操作系统的迅速发展。
本文通过ADS1.2和JLink的软件平台,以及芯片为S3C2440的ARM9开发板,成功进行微型嵌入式操作系统μC/OS-Ⅱ在开发板上的移植。
在此过程中对于μC/OS-Ⅱ进行了较为全面的学习,对于移植操作也有了深刻的认识。
关键词:
μC/OS-Ⅱ;Arm9;移植
Abstract
Withthedevelopmentofcomputerandelectronictechnology,moreandmoreembeddedinpeople'sdailylifeandindustrialproduction.Intelligentembeddeddevices,makinglifeextremelyconvenientandproduction,whichalsobroughttherapiddevelopmentofembeddedoperatingsystem.ThisarticlebyADS1.2andJLink,softwareplatforms,andchipS3C2440ARM9developmentboard,thesuccessofmicroembeddedoperatingsystemOS-IIdevelopmentboardtransplantation.Inthisprocess,theOS-IIforamorecomprehensivelearning,haveadeepunderstandingforthetransplantoperation.
Keywords:
uC/OS-Ⅱ;Arm9;transplant
目录
第一章嵌入式系统基础1
1.1嵌入式系统概述1
1.2嵌入式体系硬件基础1
1.3嵌入式体系软件基础2
第二章μC/OS-II介绍3
第三章ARM9介绍4
第四章μC/OS-Ⅱ在S3C2440上的移植5
4.1移植环境简介5
4.2移植条件5
4.3移植内容5
4.3.1INCLUDES.H5
4.3.2OS_CFG.H6
4.3.3OS_CPU.H6
4.3.4OS_CPU_C.C6
4.3.5OS_CPU_A.ASM8
第五章实例移植10
5.1函数配置10
5.2工程创建12
5.3工程设置13
5.4实例调试19
第六章结束语21
[参考文献]22
附录123
OS_CPU.H文件函数:
23
OS_CPU_A.ASM文件函数23
第一章嵌入式系统基础
1.1嵌入式系统概述
与一般的计算机系统不同,嵌入式系统的功能性、可靠性和安全性以及成本、体积、功耗都有严格的要求,并且在以应用为中心的前提下,能够进行软硬件的裁剪。
一般嵌入式系统的组成包括以下部分:
1.嵌入式的微处理器
2.硬件设备(外围)
3.嵌入式的操作系统
4.特定应用程序
嵌入式系统包含以下的特点:
1.特定且广泛的应用
2.密集的技术、知识、资金
3.高效性
4.较长生命周期
5.高可靠性
6.软硬件集于一体,以软件为主
嵌入式系统的应用领域十分广泛,主要包括交通管理、机器人、军事电子、通信设备、网络设备、医疗仪器、环境监测、汽车电子、工控设备等。
嵌入式系统从上世纪60年代中期开始,从无操作系统、简单操作系统、实时操作系统直至今日面向Intenet的阶段,历经50多年。
嵌入式因为广泛应用性,巨大的创业型和广阔市场性,走进了千家万户。
1.2嵌入式体系硬件基础
1.2嵌入式体系硬件基础
嵌入式系统的硬件核心是嵌入式微处理器,另外包括总线、存储器、输入/输出接口和设备。
1.微处理器:
至少包含一个微处理器,采用的体系结构是冯诺依曼或哈佛结构。
2.存储器:
包括主存和外存。
主存用于存数代码和数据;外存存放各种信息。
3.总线:
种类随处理器的不同而不同,有些处理器总线32位,有些则是26位的。
4.输入/输出接口和设备:
包含了串并口、中断处理器和DMA等设备。
1.3嵌入式体系软件基础
同WINDOWS类似,嵌入式软件系统一般由操作系统(RTOS)、图形界面(GUI)、网络以及一些通用的模块组成。
随着科技和技术的发展,已经推出了嵌入式产品的成功应用,且从单功能向专业化发展。
在除了任务调度,同步机制的一些基本功能外,嵌入式系统还具备有以下优点:
1.可装载卸载性。
开放性、可伸缩性体系结构。
2.极强的实时性。
EOS实时性较强,可用于各种设备的控制当中。
3.统一的接口。
提供了各种设备驱动接口。
4.方便操作、简单、提供图形GUI,图形的界面,追求的是易学易用性。
5.强大的网络支持功能,提供各种网络协议的接口。
强稳定性和弱交互性。
6.固化的代码,系统和应用软件固化在ROM中。
更好的适应硬件,具有良好的移植性。
第二章μC/OS-II介绍
RealTimeOperatingSystem,简称RTOS,是实时操作系统的英文缩写。
所谓实时,就是在外界中断或事件发生的时候,能够快速接受并进行处理,同时在规定时间内控制相应的过程作出响应。
20世纪90年代初期,美国人JeanJ.Labrosse在EmbeddedSystemProgramming杂志上最先发表了RTOS,名为μ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是32位通用微处理器ARM(AdvancedRISCMachine)家族中的一员,具有比较低的电源消耗和良好的性价比,由此广泛应用于工业生产和日常生活中。
基于RISC(精简指令)的结构,较微程序的控制复杂指令系统的计算机相对简单,使得它用有较高的中断响应和指令处理的能力。
ARM9的指令集共包含了11种基本类型:
1.桶式的移位器及乘法器和偏上算术的逻辑单元(两种);
2.指令控制数据传送:
用在弹性地址,高速内容切换,和交换数据(三种);
3.控制流程和特权级执行的指令(三种);
4.专门用在能够扩展到片外的协处理器中(三种)。
ARM9的指令集比较适用不同的高级语言编译器,但需要临界代码段,汇编语言编程也比较简单,不像其它的需要复杂的编译器来管理指令。
ARM9的流水线技术可以连续运行指令的处理和系统存储的各个部分。
在存储的系统中,ARM9存储接口的设计能够以低代价发挥最大限度性能。
ARM9有32位地址总线,也可以配制成26位的地址线,使早期版本的处理器能够被它兼容。
全静态CMOS的ARM9,允许时钟停止循环,并保存当前状态。
基于上述的优势,ARM9适用于一些需要紧凑且功能强大的RISC处理器系统,包括电子通讯、数据通信、信息存储、图像处理、JOEG控制器等,为人们的日常生活和工业生产带来了极大的便利。
第四章μC/OS-Ⅱ在S3C2440上的移植
4.1移植环境简介
保证一个系统的内核保证能够在多个微处理器或微控制器上,同时保持了它的实时性和稳定性操作过程,就是移植。
本文硬件平台选择的是S3C2440芯片,软件开发环境应用ADS1.2,再通过JLink-H进行调试,基本满足了移植的需求。
ARM9的S3C2440,能够在ARM920T核心的基础上,对系统内存进行高效的管理;基于ARBA总线和哈佛结构高速缓冲,使其具备了独立的16KB指令和数据高速缓存的体系结构。
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文件中的头文件,其中包含了可能用到的头文件和一些可能与实际应用不相关的头文件。
由于头文件的增加,导致了编译时间变长,但是避免了在编译过程中头文件丢失的风险,大大增强了移植性。
由于includes.h文件,我们在增加需要的头文件时,只需写入这个头文件中即可。
为了避免在编译过程中将已编译的内容重新编译,必须把需要增加的头文件加在includes.h列表的最后。
4.3.2OS_CFG.H
内核是一个系统的核心,而OS_CFG.H就是用来配置内核的头文件,根据不同的需要和应用,我们可以对内核进行定制和裁剪,从而提高了实时性。
4.3.3OS_CPU.H
OS_CPU.H文件中主要是用#define重新定义一些与处理器相关的常量,宏和数据类型。
众所周知,处理器有8位到64位甚至128之分,不同的处理器对应操作系统的位数也是不尽相同,否则会发生无法兼容的问题,在C中使用频繁的short(短整),int(整型)和long(长整)等数据类型,在μC/OS-Ⅱ是不使用的。
所以为了能够与处理器的字长相匹配,需要对μC/OS-Ⅱ中的数据类型进行重新的定义。
在任何的操作系统中,中断都是必不可少的,否则在更高优先级的任务发生时,无法对其进行处理,可能导致系统的崩溃。
μC/OS-Ⅱ在访问临界代码段的时候需要将中断禁止,并且在代码段访问完毕之后重新置中断为允许状态,所以μC/OS-Ⅱ中有两个宏对中断进行禁止和允许:
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
不同的处理器的堆栈生长方式不同,在移植过程中需要对堆栈生产方式进行改变,μC/OS-Ⅱ定义了结构常量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()过程中会得到任务传递地址,pdata指针,任务堆栈栈顶和任务优先级等参数,OSTaskStkInt()用上述的三个参数和一个附加在OSTaskCreateExt()中得到的选项确保了堆栈结构初始化的正确性。
在初始化堆栈开始时,OSTaskStkInit()返回堆栈指向的地址传递给OSTaskCreate()和OSTaskCreateExt(),同时任务控制块(OS_TCB)也会保存该地址,处理器文档会指明堆栈指针会是指向指向了还是数据的堆栈单元位置下个堆栈的空闲位置。
4.3.4.2OSTaskCreateHook()
OSTaskCreateHook():
μC/OS-Ⅱ的功能扩展的允许与否,在创建任务的时候通过这个函数进行功能设置。
建立任务之后会返回一个OS_TCB的指针,在选择扩展功能的时候,该指针会传给OSTaskCreateHook(),通过这个指针访问任务的附加数据(MMU寄存器,浮点寄存器,以及调试的信息等)和结构成员。
从而决定可允许扩展的成员。
4.3.4.3OSTaskDelHook()
OSTaskDelHook():
主要用在任务的删除时,同功能扩展函数的情形一样,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(),而此时OSStart()可以调用OSStartHighRdy(),执行优先级最高的任务。
需要注意的是,在调用OSTaskSwHook()之后和恢复最高优先级任务之前需要将OSStartHighRdy()中的OSRunning设置为TRUE。
4.3.5.2OSCtxSw()
OSCtxSw():
执行最高优先级的任务是μC/OS-Ⅱ的特点之一,而OSCtxSw()就是基于此而创建的函数。
同定义的函数OSTaskSwHook()的执行过程类似,OSCtxSw()执行时中断的状态也是禁止的。
4.3.5.3OSIntCtxSw()
OSIntCtxSw():
在μC/OS-Ⅱ中唯一与处理器相关的函数(代码需写在汇编文件中)。
当μC/OS-Ⅱ判断有比中断更为重要的事件发生时,OSIntExit()会调用OSIntCtxSw()从中断中切换出去。
需要注意的是,由于无法从C直接访问CPU的寄存器,所以在编译器能够插入汇编代码的前提下,可以将OSIntCtxSw()代码可以放到OS_CPU_C.C文件中,而不是OS_CPU_A.ASM文件中。
因为OSIntCtxSw()的代码与OSCtxSw()的函数代码基本上是相同的,所以可以通过“BL”指令减少OSIntCtxSw()代码量,这在移植实例中是常见的。
4.3.5.4OSTickISR()
OSTickISR():
通过调用,时钟节拍以每秒发生10-100次的频率从而满足时间期满和延时的功能。
第五章实例移植
本章的主要内容是在对移植有了较为全面的了解和认识之后,将μC/OS-Ⅱ操作系统移植到ARM9的处理器上,然后编写一个简单地应用程序,实现LED灯的控制。
5.1函数配置
实例移植是验证移植成功的关键。
通过网络或其它途径获得μC/OS-Ⅱ的源代码,对于一些在第四章描述的变量、宏和函数进行重新定义和配置。
下载的源代码如图5-1所示:
图5-1源代码文件夹
其中S3C2440文件夹中包含了两个子文件夹,分别是includes和source,如图5-2所示:
图5-2S3C2440文件夹下的文件
在includes文件中是一些与S3C2440相关的头文件,包括config.h、lcd.h、mmu.h、Nand.h、Option.h、S3C2440addr.h、S3C2440lib.h、S3C24400slib.h、Timer,如图5-3所示:
图5-3includes文件夹
在source文件中是S3C2440相关的源文件,包括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-10工程设置
(1)
在【Target】条目中选择【AccessPaths】,将【AlwaysSearchUserPaths】选中(因为ucos_ii部分文件采用#include<>包涵,不修改这里找不到文件),如图5.2.2所示。
图5-10工程设置
(2)
在【LanguageSettings】条目下依次选择【ARMAssembler】、【ARMCCompliler】、【ARMC++Complier】,将它们的处理器都设置成ARM920T,如图5-11所示。
图5-11工程设置(3)
在【LanguageSettings】条目下选择【ARMCCompliler】,在【Errors】中勾销掉【Implicitpointerc】,然后选择【ARMCCompliler】,在【Warnings】中购销掉【Unuseddeclaration】(-O1-g+-cpuARM920T-Wx-Ec),如图5-12所示
图5-12工程设置(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-13工程设置(5)
【ARMfromELF】条目下选择【Outputfilename】,填写“输出的二进制”,如图5-14所示
图5-14工程设置(6)
在ADS1.2工程配置过后,同样对JLink-H进行相应的设置。
打开JFlashARM,点击Options下拉菜单,找到Projectsettings选项,点击,在【General】中对连接USB端口进行设置(不确定的情况下去系统设备管理器中查找),如图5-15所示:
图5-15JLink设置
(1)
在【TargetInterface】条目中的【Core】选择设备:
ARM9,如图5-16所示:
图5-16JLink设置
(2)
JLink设置完毕。
5.4实例调试
在工程和JLink全部设置完毕,将测试程序写入到main.c函数中,测试程序见附录。
设置之后,选用DebugRel生成目标,然后点击Make编译工程。
编译成功显示如图5-17所示:
图5-17编译界面
在这里显示出现0个错误,7个警告,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Arm9 COS 嵌入式 系统 移植