基于ARM9的UCOSII移植

上传人:痛*** 文档编号:127862906 上传时间:2022-07-31 格式:DOC 页数:38 大小:2.87MB
收藏 版权申诉 举报 下载
基于ARM9的UCOSII移植_第1页
第1页 / 共38页
基于ARM9的UCOSII移植_第2页
第2页 / 共38页
基于ARM9的UCOSII移植_第3页
第3页 / 共38页
资源描述:

《基于ARM9的UCOSII移植》由会员分享,可在线阅读,更多相关《基于ARM9的UCOSII移植(38页珍藏版)》请在装配图网上搜索。

1、编号: 嵌入式系统设计与制作(论文)阐明书题 目: 基于嵌入式ARM的 C/OS-II移植 院 (系): 信息与通信学院 专 业: 电子信息工程 学生姓名: 学 号: 指引教师: 12月29日嵌入式系统设计与制作实训任务书年级: 09 级 面向专业: 电子信息工程 学时: 3周 项目名称:基于嵌入式ARM的C/OS-II移植项目类型硬件与软件制作特殊规定无承当学生姓名学号专业联系电话电子信息工程项目设计规定:基本功能规定:1 移植目的芯片ARM92 移植有关文献的程序注释3 设计测试程序测试系统稳定性参照资料: 1.谭浩强.C程序设计.北京:清华大学出版社,2.Chris Wright等.AR

2、M嵌入式系统开发.北京:北京航空航天大学出版社,3.任哲.嵌入式实时操作系统C/OS-II原理及应用.北京.北京航空航天大学出版社,4. JeanJ Labrosse.嵌入式实时操作系统C/OS-II.北京.北京航空航天大学出版社,5.Norman Matloff等.软件调试的艺术.北京:人民邮电出版社,完毕形式:1. 设计与制作可供实际检测的实物样板;2. 每组的两位同窗完毕一种作品,作品的内容必须和ARM嵌入式有关;3. 完毕实训论文。项目设计进度规定:选题:12月09日-12月10日查找资料和方案拟定:12月11日-12月15日移植ucosII:12月16日-12月25日软件和硬件调试:

3、12月26日-12月27日论文:12月28日验收:12月29日项目验收方式:1、在实训期间进行作品验收,验收后交实训论文及实训的资料打印稿及电子文稿。2、设计报告要符合桂林电子科技大学毕业设计论文统一格式。项目开始时间:12月09日项目结束时间:12月29日任务下达:12月09日摘 要以应用为中心、以计算机为基本的嵌入式技术,是当今发展最快、应用最广、最有发展前景的重要技术之一。嵌入式技术已经被广泛应用于工业控制、移动通信、信息家电、医疗仪器、汽车电子、航空航天等各个领域。在多种嵌入式解决器中,ARM以体积小、低功耗、低成本、高性能等长处,获得许多半导体厂商的支持,在嵌入式应用领域获得巨大的成

4、功。软件方面,uC/OS是一种免费公开源代码、构造小巧、具有可剥夺实时内核的实时操作系统,因而被使用频繁。本文重要研究了C/OS-II在S3c2440芯片上的移植。本文通过对S3c2440硬件和源码公开的嵌入式实时操作系统C/OS-II的分析,以S3C2440为例,论述了在ARM9上移植C/OS-II,来运营多种任务,用液晶显示来阐明C/OS-II移植的优缺陷,以及在移植中应注意的问题,启动代码的理解,解析代码的优化。核心词:嵌入式系统;实时;ARM9;C/OS-IIAbstractApplication, embedded computer-based technology, is one

5、of todays fastest-growing, most widely used, the most promising technologies. Embedded technology has been widely used in industrial control, mobile communications, information appliances, medical equipment, automotive electronics, aerospace and other fields.In a variety of embedded processors, ARM

6、advantages of small size, low-power, low-cost, high-performance, get the support of many semiconductor manufacturers, achieved great success in the field of embedded applications. Software, u C / OS is a free, open-source, compact structure, can be deprived of a real-time operating system for real-t

7、ime kernel, thus frequent.This paper studies the C / OS-II in the S3c2440 chip transplant. This article by S3c2440 hardware and open source embedded real-time operating system C / OS-II analysis, for example, described to S3C2440 ARM9 on transplantation C / OS-II to run multiple tasks to illustrate

8、with LCD transplant C / OS-II strengths and weaknesses, as well as the transplant should pay attention to the problem of understanding of the startup code, the parsing code optimization.Key words: embedded system; real-time; ARM9; C / OS-II目 录引言11 S3C2440系列微解决器简介11.1ARM9内核11.2ARM9开发板32 C/OS-II42.1C/

9、OS-II分析42.1.1任务运营62.1.2任务通信72.1.3内存动态分派83 C/OS-II在ARM9上的移植93.1与CPU有关的文献93.1.1 OS_CPU.H93.1.2OS_CPU_C.C103.1.3OS_CPU_A.S123.2移植代码实现134 测试程序234.1整个测试程序的效果图234.2测试程序的功能235 总结24谢 辞25参照文献26引言早在20世纪60年代,就已有人开始研究和开发嵌入式操作系统。但直到近来,它才在国内被越来越多的提及,在通信、电子、自动化等需要实时解决的领域所曰益显现的重要性吸引了人们越来越多的注意力。但是,人们所谈论的往往是某些出名的商业内核

10、,诸如VxWorks、PSOS等。这些商业内核性能优越,但价格昂贵,重要用于16位和32位解决器中,针对国内大部分顾客使用的risc系列8/16/32位单片机,可以选择免费的ucos ii。通过在LPC2132上移植移植ucosii,移植bootload,ucosii的远行原理。在原理的分析中,通过理论的学习,理论结合实际,通过制作和调试实验板,其中多次用到单一分析法,单一调试各个分支,然后系统综合所有任务,完毕整个系统远行。论文第一章重要简介lpc2132硬件构造和代码的编写;第二章讨论ucosii代码构造;第三章分析ucosii在arm板上的移植。1 S3C2440系列微解决器简介 1.1

11、ARM9内核在ARM9系列解决器中S3C2440A是三星公司推出的一款功能强大,功耗极低的基于ARM920T核心的嵌入式解决器,它为手持设备和一般应用提供了低功耗和高性能的小型芯片微控制器的解决方案。为了减少整体系统成本,S3C2440A还提供了丰富的内部设备,其基本特性如下:基于ARM920T内核,支持JTAG仿真调试;具有16KB的指令缓存和16KB的数据缓存;具有MMU,支持Windows CE、PalmOS、Symbian OS、Linux等操作系统;有外部存储控制器(SDRAM控制和片选逻辑);LCD 控制器(最大支持4K色STN和256K色TFT)提供1通道LCD专用DMA;4通道

12、DMA有外部祈求引脚;3通道UART(IrDA1.0,64字节发送FIFO和64字节接受FIFO);2通道SPI;1通道IIC总线接口(支持多主机);1通道IIS总线音频编码器接口;AC97编解码器接口;兼容SD主接口合同1.0版和MMC卡合同2.11兼容版;2通道USB主机/1通道USB设备(1.1版);4通道PWM定期器和1通道内部定期器/看门狗定期8通道10位ADC和触摸屏接口;具有日历功能的RTC;摄像头接口(最大支持40964096像素输入;20482048像素输入支持缩放);130个通用I/O口和24通道外部中断源;具有一般、慢速、空闲和掉电模式;具有PLL片上时钟发生器;图1.1

13、 ARM模块示图1.2ARM9开发板基于S3C2440A的ARM9开发板在目前市场上有诸多如友善之臂的mini2440、飞凌的TE2440开发板和OK2440开发板、天嵌科技的TQ2440开发板等等。在众多出名的开发板中它们都涉及了丰富的硬件资源及参照资料。在这些开发板中都涉及了电源电路、系统复位电路、系统时钟电路、JTAG接口、串行接口、按键输入接口、IIC接口、USB接口、IIS音频数据接口电路、以太网接口、ADC输入接口、摄像头接口、液晶接口等电路。本文选用Micro2440开发板,采用底板与核心板分离设计,核心板6层布线系统运营相对比较稳定,底板预留了各个接口及总线的排针接口非常以便二

14、次开发,对于液晶屏接口它采用的是24位,比其他非24位的要好得多。在技术售后方面该公司还专门建立了BBS,对使用中遇到的难题会有热心人士解答或有公司专业人士解答。目前使用TQ2440开发板在车载手持设备、GIS平台、Data Servers、VOIP、网络终端、工业控制、检测设备、仪器仪表、智能终端、医疗器械、安全监控等产品中均有应用。本设计使用TQ2440开发板作为硬件平台,其中它的板载存储器资源有:一片2MB的Nor Flash(EN29LV160AB)一片256MB的Nand Flash (K9F2G08U0A) 及用2片SDRAM (MT48LC16M16A2)构成32位总线宽度构成6

15、4MB32bit的SDRAM,供系统使用。从性能及板载资源来看它完毕胜任于本设计。2 C/OS-II随着嵌入式技术的迅速发展,实时多任务操作系统作为一种软件平台已逐渐成为国际嵌入式系统的主流,目前世界上已有一大批成熟的实时嵌入式操作系统,一般,对嵌入式软件的基本规定是体积小、指令速度快、具有较好的裁减性和可移植性,目前,实时操作系统诸多,如VxWorks,WindowsCE,pSOS,QNX,LynxOS等,这些操作系统都具有高可靠性、强实时性等特点,但她们都是商业操作系统,价格昂贵,人们往往很难接受,C/OS-操作系统的浮现是对这些商业操作系统的一种很大的冲击。C/OS-是源码公开的实时操作

16、系统,是一种自由操作系统。程序开发人员可以改写源代码,使之符合自己的规定,裁减掉不需要的部分,使操作系统变得小巧、灵活、并且能满足顾客特定操作系统的需要。为了提高系统的实时能力,C/OS-可以将一种复杂的应用划分为多种互相独立的任务,并根据任务的重要性来分派优先级。任务的调度完全由C/OS-的实时内核完毕,重要涉及任务的状态管理、选择最高优先级的任务、执行任务和撤销任务等,C/OS-内核还负责CPU时间分派,CPU时间总是优先分派给中断事件,另一方面是任务队列中目前优先级最高的任务,不同任务间的通信可以通过C/OS-提供的信号量、邮箱、信息队列等机制完毕,她的绝大部分代码是用C语言编写的,可移

17、植性强,因此1997年后来,在国际上逐渐被广泛采用。2.1C/OS-II分析实时系统的特点是,如果逻辑和时序浮现偏差将会引起严重后果的系统。有两种类型的实时系统:软实时系统和硬实时系统。在软实时系统中系统的宗旨是使各个任务运营得越快越好,并不规定限定某一任务必须在多长时间内完毕。在硬实时系统中,各任务不仅要执行无误并且要做到准时。大多数实时系统是两者的结合。实时系统的应用涵盖广泛的领域,而多数实时系统又是嵌入式的。这意味着计算机建在系统内部,顾客看不到有个计算机在系统里面。如下是某些嵌入式系统的例子:通讯类:Switch Hurb路由器机器人:航空航天飞机管理系统过程控制:药物加工化工厂汽车业

18、:发动机控制防抱死系统(ABS)实时应用软件的设计一般比非实时应用软件设计难。不复杂的小系统一般设计成如图2.1 ucosii工作原理简图上图所示的那样时间有关性很强的核心操作(Criticaloperation)一定是靠中断服务来保证的。由于中断服务提供的信息始终要等到后台程序走到该解决这个信息这一步时才干得到解决,这种系统在解决信息的及时性上,比实际可以做到的要差。这个指标称作任务级响应时间。最坏状况下的任务级响应时间取决于整个循环的执行时间。由于循环的执行时间不是常数,程序通过某一特定部分的精确时间也是不能拟定的。进而,如果程序修改了,循环的时序也会受到影响。 2.1.1任务运营任务的状

19、态如下:1.睡眠态(taskdormat):任务驻留于程序空间(rom或ram)中,临时没交给ucos-ii解决。2.就绪态(taskready):任务一旦建立,这个任务就进入了就绪态。3.运营态(taskrunning):调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运营进入就绪态并且优先级最高的任务。4.等待状态(taskwaiting):正在运营的任务,通过延迟函数或pend(挂起)有关函数后,将进入等待状态。5.中断状态(ISRrunning):正在运营的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。任务是一种无返回的

20、无穷循环,均有唯一的一种优先级。uc/os-ii总是运营进入就绪状态的最高优先级的任务。由于uc/os-ii总是运营进入就绪状态的最高优先级的任务。因此,拟定哪个任务优先级最高,下面该哪个任务运营,这个工作就是由调度器(scheduler)来完毕的。任务级的调度是由函数OSSched()完毕的,而中断级的调度是由函数OSIntExt()完毕。对OSSched(),它内部调用的是OS_TASK_SW()完毕实际的调度(人为模仿一次中断);OSIntExt()内部调用的是OSCtxSw()实现调度。任务切换其实很简朴,由如下2步完毕:(1)将被挂起任务的解决器寄存器推入自己的任务堆栈。(2)然后将

21、进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到寄存器中。图2.2 OS_TCB链构造调度算法重要基于分级查询。考虑到任务数目64,可以用6bit来表达,分为高3位和低3位。uC/OS-II将优先级进行分组,按高三位进行分组,可得8个(最多)优先级数组(000-111);每个优先级的在数组中的位置由其低三位表达。在源码中,高三位用带Y后缀的变量表达,而低三位用带X后缀的变量表达。这样建立了1个变量OSRdyGrp(INT8U,8bit,每个bit代表一组)和1个数组OSRdyTbl8(INT8U,每组8bit,每个bit代表一种优先级)。这样形成了的二级查询,先选组,再选组内偏移。图2.

22、3 ucosii任务等待表2.1.2任务通信任务有如下状态:1.空闲任务(IdleTask)空闲任务OSTaskIdle()什么也不做,只是在不断地给一种32位的名叫OSIdleCtr的计数器加1,记录任务使用这个计数器以拟定现行应用软件实际消耗的CPU时间。2.记录任务(OSTaskstat)记录任务每秒计算一次CPU在单位时间被使用的时间,并且把计算成果一比例的形式寄存在变量OSCPUUsage中,以便应用程序通过反问来理解CPU的运用率,如果顾客要使用这个函数,那么在系统头文献OS_CFG.H中的系统配备常数OS_TASK_STAT_EN设立为1,创立之前,调用OSTaskstat对记录

23、任务进行初始化。3.非系统任务这些任务是顾客任务,通过运营,达到测量、监测、通信等功能,如图2.4。图2.4 Relationshipbetweentasks,ISRsandasemaphore2.1.3内存动态分派Ucos为内存中存储块的动态分派提供了支持。不同于malloc(),free(),ucos的存储管理机制是基于固定大小存储块的分派与回收。对于任务而言,每次只能申请固定大小的存储块,因而不存在外部碎片的问题。科学运用内存,操作系统把持续的大块内存按分区来管理,每个分区中包具有整数个大小相似的内存块,使得它们可以分派和释放固定大小的内存块。如下图所示:图2.8 内存模块3 C/OS-

24、II在ARM9上的移植随着国内工业化、数字化的步伐加快,嵌入式开发在IT行业中的重要性越来明显。中国成为“世界制造中心”甚至“设计中心”的趋势,必然对小型数字控制系统的需求越来越大。在这种状况下,类似于UCOS-II的小型硬实时嵌入式操作系统内核,具有低成本、易控制、小规模、高性能的特性,因而有相称好的发展前景。但是此类系统的基本较为单薄,面临产品化、商业化限度不够的问题。采用此类系统进行产品开发需要仔细的分析、设计,否则也很难真正满足工业产品生产的规定。正是针对这种状况,在ARM微解决器环境下,针对商业化、产品化环境的严格规定,设计构造了一种硬实时嵌入式内核体系构造。固然真正的商业化、产品化

25、的嵌入式内核,既需要这种可以满足高原则规定的体系构造设计基本,还需要严格的产品化软件开发测试过程。只有理论基本和工程实践完整的结合,才干产生真正经受得起考验的,可以满足工业化生产,可以在多种环境下稳定运营并保证达到设计目的的产品。从这个角度考虑,仅仅拿来一种操作系统内核并开发应用产品,很难万全满足这种规定。必须要对内核的波及思路进行仔细的考虑、验证,相应用的可选开发设计措施进行审慎的评估,并配合真正工业化的项目发管理措施,才干保障产品达到规定。3.1与CPU有关的文献与解决器有关的代码,这是移植中最核心的部分。内核将应用系统和底层硬件有机地结合成一种实时系统,要使同一种内核能合用于不同的硬件体

26、系,就需要在内核和硬件之间有一种中间层,这就是与解决器有关的代码,解决器不同,这部分代码也不同,我们在移植时需要自己解决这部分代码,在C/OS中这一部分代码提成3个文献:OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C,分别如下:3.1.1 OS_CPU.H涉及了用#define定义的与解决器有关的常量、宏和类型定义,具体有系统数据类型定义、栈增长方向定义、关中断和开中断定义、系统软中断的定义等。(1)不依赖于编译的数据类型C/OS-不使用C语言中的short,int和long等数据类型的定义,由于她们与解决器类型有关,隐含着不可移植性,代之以移植性强的整数数据类型,这样,既直

27、观又可移植。根据ADS编译器的特性,代码为:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedshortINT16U;typedefsignedshortINT16S;typedefunsignedintINT32U;typedefsignedintINT32S;typedeffloatFP32;typedefdoubleFP64;typedefINT32UOS_STK;(2)使用软中断SWI做底层接口由于带T变量的ARM7解决器核具有两个指令集,顾客任务可以使用两

28、种解决器模式,为了使底层接口函数与解决器状态无关,同步在任务调用相应函数时不需要懂得该函数位置,本例使用软中断指令SWI作为底层接口,使用不同的功能号辨别不同的函数。(3)OS_STK_GROWTHC/OS-使用构造常量OS_STK_GROWTH指定堆栈的生长方式,其lpc2132代码为:#defineOS_STK_GROWTH13.1.2OS_CPU_C.C移植OS_CPU_C.C文献时,需要编写的是任务堆栈初始化函数OSTaskStkInit和时钟节拍中断服务钩子函数OSTimeTickHook。在C/OS-II中,每一种任务均有自己的任务堆栈,当发生任务切换或者中断时,其CPU使用权被剥

29、脱,为了任务能被再次运营,那么这个被打断的任务所用到的解决器的寄存器内容均应得到保存,按照ARM7解决器的压栈和入栈指令的特点,设计任务堆栈如下3:CPSRR0R1R12LR(R14)PC(R15)根据任务堆栈构造示意图,OS_STK函数编写如下5:#defineSVCMODE0x13OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt)OS_STK*stk;opt=opt;stk=(OS_STK)ptos;*-stk=(OS_STK)task;*-stk=(OS_STK)task;*-stk=0;

30、*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=(INT32U)pdata;*-stk=(SVC32MODE|0x40);return(OS_STK*)stk);阐明:顾客创立任务时,OSTaskCreat()会调用OSTaskStkInit函数初始化该任务的堆栈,并把返回的堆栈指针保存到该任务的TCB构造中的最前面的参数OSTCBStkPtr中,当该任务要被恢复时,任务切换函数从其TCB块中获得其任务堆栈指针,依次将堆栈内容弹到解决器相应的CPSR、r0

31、,r1,r12,lr,pc的寄存器中,完毕现场的恢复和程序指针PC的返回。另一种需要编写的函数是OSTimeTickHook,该函数被时钟节拍中断服务函数OSTickISR中的OSTimeTick函数调用,用来清除时钟节拍中断发生设备的祈求。本移植方案使用解决器的RTC模块的tick中断作为时钟节拍中断,该函数编写如下:voidOSTimeTickHook(void)rI_ISPC=(INT32U)0x01)20;注意:顾客也可不修改此函数,但是必须在OSTickISR中执行清除发生节拍中断的设备的中断祈求标志,为便于阐明,本文将运用内核提供应顾客的OSTimeTickHook函数来完毕清中断

32、的任务。此外几种hook函数不必去改它们,至此,OS_CPU.C编写完毕。涉及了与移植有关的C函数,涉及堆栈的初始化和某些钩子函数的实现,但是最重要的是OSTaskStkInit()函数,该函数是在顾客建立任务时系统内部自己调用的,用来对顾客任务的堆栈初始化。在ARM7体系构造下,任务堆栈空间由高至低递减,依次保存着PC,LR,R12,R1,R0,CPSR的初始化堆栈构造,当顾客初始化了堆栈,OSTaskStkInit()就返回新的堆栈指针STK所指的定地址。OSTaskCreate()和OSTaskCreateExt()会获得该地址并将她保存到任务控制块TCB中,其她的几种钩子函数必须声明,

33、但可以不涉及任务代码,这些钩子函数在本移植中全为空函数。3.1.3OS_CPU_A.SC/OS-移植的绝大部分工作都集中在OS_CPU_A.S文献的移植上,在这个文献里,最困难的工作又集中体目前OSIntCtxSw和OSTickISR这两个函数的实现上。这是由于这两个函数的实现是和移植者的移植思路以及有关硬件定期器、中断寄存器的设立有关,在实际的移植工作中,这两个地方也是比较容易出错的地方,这部分需要对解决器的寄存器进行操作,因此必须用汇编语言编写,涉及4个子函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRd

34、y()该函数一方面调用钩子函数OSTaskSwHook(),然后将OSRunning标志位设立为真,表达任务开始执行,从而保证任务切换操作的对的执行,紧接着从具有最高优先级的任务控制块中获得任务的堆栈指针,初始化堆栈指针寄存器SP,然后恢复其她的寄存器,开始执行最高优先级的任务。OSCtxSw()该函数在任务级任务切换函数中调用,一方面保存解决器寄存器,将目前SP存入任务TCB中,载入就绪最高优先级任务的SP,从新任务的任务堆栈中恢复解决器所有寄存器的值,然后执行中断返回指令。OSIntCtxSw()该函数是在ISR中执行任务切换功能,其原理基本上与任务级的切换相似,区别只是ISR已经保存了C

35、PU的寄存器,因此不要再进行类似的操作,只需对堆栈指针作相应的调节即可。OSTickISR()该函数是系统时钟节拍中断服务函数,一方面要保存解决器寄存器,接着调用OSIntEnter()函数,以保证中断嵌套层数不超过255层,如果满足了该条件,则把堆栈指针保存到目前任务的任务控制块TCB中,然后给产生中断的设备清中断,重新容许中断,接下来调用OSTimeTick()来维持C/OS-内部的定期以及调用OSIntExit()函数决定与否由于这个中断服务程序的执行,使得更高优先级的任务就绪。这一部分是顾客根据自己的应用系统来定制合适的内核服务功能,涉及2个文献:OS_CFG.H和INCLUDES.H

36、。OS_CFG.H用来配备内核,顾客根据需要对内核进行修改,留下需要的部分,去掉不需要的部分,例如系统可提供的最大任务数量,与否认制邮箱服务,与否提供优先级动态变化功能等等,所有的配备更改涉及头文献的增减均在该文献中进行。INCLUDES.H系统头文献,整个实时系统程序所需要的文献,涉及了内核和顾客的头文献,这样使得顾客项目中的每个C文献不用分别去考虑她事实上需要哪些头文献。3.2移植代码实现复位入口代码的重要功能就是设立好PLL然后搬迁代码。此处列出的是原则写法,根据编译链接参数不同,尚有其她某些优化写法。例如,在编译调试工具中(SDTV2.51或ADSV1.2),如果只配备RO-BASE参

37、数,不配备RW-BASE参数,RO和RW段是自然衔接的,这样代码的拷贝搬迁工作可以简化。此外要注意的是,这部分代码要仔细检查、调试实际的执行成果。例如,搬迁后,应当初始化的全局变量与否对的初始化。SDTV2.51下,如果用JTAG调试,RW-BASE配备了参数,直接下载代码到RAM中,由于没有自己控制内存搬迁和拷贝初始化数据段的代码,就存在全局变量没有对的初始化的问题。工程师编写代码的时候,不也许不考虑调试状态,因此这种调试状态下代码段搬迁的初始化问题同样要仔细考虑。比较好的方式,是在模块的初始化函数中,进行所有处在RW段、ZI段的全局变量的具体初始化。这种初始化过程不影响主体代码的仅仅在开始

38、阶段执行一次,完全不会影响主体程序的执行效率,确可以保障代码在任何状况下的稳定运营。代码三十五.2132复位及中断入口代码init.sIMPORTi_pCurTcbIMPORTIrqFinishIMPORTPreISRIMPORTIntrNestedIMPORTI2C0VectIMPORTIsrHandlerIMPORT|Image$RO$Limit|IMPORT|Image$RW$Base|IMPORT|Image$ZI$Base|IMPORT|Image$ZI$Limit|EXPORTENTER_U0EXPORTENTER_U1EXPORTENTER_I2C0EXPORTENTER_DEF

39、AREAInit,CODE,READONLYCODE32ENTRY;入口;/*/;/异常矢量,接到异常跳转*/;/有顺序问题必须按照异常顺序*/;/*/bHandlerRST;实际启动点,非再次跳转的例程bHandleFIQ;此下之后均为再次跳转例程bHandleFIQbHandleFIQbHandleFIQ;不适合跳转解决DCD0xA73FFFC6LDRPC,PC,#-0xff0;分发例程可以C安装设备中断HandleFIQ;不解决FIQ,所有异常进入此处死循环nop;并通过看门狗完毕复位bHandleFIQLTORG;/*/;/*IRQ中断预解决例程*/;/*入口条件:IRQ中断屏蔽,LR

40、是被中断任务或ISR的PC值,*/;/*SPSR是被中断任务或ISR的目前解决器状态值,*/;/*SP是IRQ模式目前堆栈指针值*/;/*/HandlerIRQ;/*/;1.4SPSR保存到R0;压栈R0,是IRQ模式的SPSR,也是被中断模式的CPSR;/*/mrsr4,spsrstmfdsp!,r4movr0,r6blPreISR;r0中返回解决成果cmpr0,#0beqkeepirq;/*/;结束应急解决并结束中断解决,已解决完;/*/ldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r

41、12,lr,pcLTORGkeepirq;/*/;1.6恢复堆栈指针的原值,并保存到R3;以便背面算法使用,此后不再用到IRQ堆栈;/*/addr3,sp,#64movsp,r3;/*/;2.判断与否第一层中断,如果不是第一层,进入3;2.1嵌套中断数变量地址到R0,变量值读入到R1;/*/ldrr0,=IntrNestedldrr1,r0cmpr1,#0;/*/;2.2如果不是第一次,跳到第3步;/*/bneIRQNESTMODE;/*/;3设立嵌套层数为1。R1=1,保存R1值到R0地址(前面2.1);/*/ldrr1,=1strr1,r0;/*/;不是嵌套中断切换到svc模式解决任务;3

42、.1切换到SVC模式,第一层中断,一定是中断运营在SVC模式下的任务;/*/msrcpsr_cxsf,#ARM9_SVC_MOD|ARM7_I_BIT;/*/;3.2将保存在IRQ模式下的任务环境拷贝到任务的堆栈(SP),;其中LR无法拷贝,需要在本模式获取;/*/ldmdbr3!,r0;拷贝PCstmfdsp!,r0ldmdbr3!,r0;压栈真正LRstmfdsp!,lrldrr1,=56;准备要拷贝字节数,与硬件有关IRQSTACKSVCCOPYldmdbr3!,r0;反向popstmfdsp!,r0;pushsubsr1,r1,#4;递减计数bneIRQSTACKSVCCOPY;/*/

43、;3.3目前SP指针(这是SVC模式下任务目前的堆栈指针)保存到任务控制;块构造的第一种字段.保存sp到tcb,便于任务切换*/;由于任务被中断时,堆栈尚未与环境同步;/*/ldrr0,=i_pCurTcbldrr1,r0strsp,r1;/*/;3.4完毕了SVC模式下的解决,切换到SYS/UND,跳转到5;/*/msrcpsr_cxsf,#ARM7_UND_MOD|ARM7_I_BITbIRQPREOVERLTORGIRQNESTMODE;/*/;/*4.嵌套数加1.R1+=1,保存R1值到R0地址(前面2.1);/*/addr1,r1,#1strr1,r0;/*/;是嵌套中断切换到sys

44、模式解决ISR;4.1切换到SYS模式,UND替代;/*/msrcpsr_cxsf,#ARM7_UND_MOD|ARM7_I_BIT;/*/;4.2将保存在IRQ模式下的ISR环境拷贝到ISR的堆栈(SP),;其中LR无法拷贝,需要在本模式获取;/*/ldmdbr3!,r0;拷贝PCstmfdsp!,r0ldmdbr3!,r0;压栈真正LRstmfdsp!,lrldrr1,=56;准备要拷贝字节数,与硬件有关NESTSTACKSVCCOPYldmdbr3!,r0;反向popstmfdsp!,r0;pushsubsr1,r1,#4;递减计数bneNESTSTACKSVCCOPY;/*/;由于SY

45、S模式一旦运营就不会被切换掉,只能被中断或退出;因此不存在3.3的相应环节;同步已经是SYS模式下,也不存在3.4的相应环节;/*/IRQPREOVER;/*/;5.调用IRQ解决函数,也就是HandleIRQ位置的函数指针,;事实上是os_isr.c文献中的voidIsrHandler(void)函数。;注意该函数中也许打开了中断,因此才存在嵌套中断的也许。;如果不需要嵌套中断,只需要在该函数中,保持中断屏蔽即可。;返回后中断是屏蔽的,即该函数结尾时再次打开了中断,;并且是在在中断屏蔽后才退出设备保护,这样解决;即能保持系统的嵌套中断能力,又能避免同一设备的嵌套中断;/*/movr0,r6;

46、r6中中断偏移blIsrHandlerldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0;/*/;6中断结束解决,IrqFinish,SYS模式的原有堆栈指针作为参数;6.1屏蔽中断;6.2递减中断嵌套计数;6.3判断与否最后一层,如果不是则函数返回进入76.4(最后一层)调中断调度器,恢复SYS模式的原始堆栈指针,调度;到被中断任务,不再返回。从这里可以看出,中断结束时,没有回来恢;复IRQ模式的堆栈,因此才有前面第1.6步的预先恢复IRQ模式的SP指针。;同步在这一步解决中还要恢复SYS模式的堆栈指针,道理相似。;如果IrqFinish和HandleIRQ中的函数

47、指针;没有定义为_irq,函数会破坏寄存器;/*/blIrqFinish;仅仅是嵌套数减1;/*/;7.恢复SYS模式的环境回到上一层被中断的中断;第一种位置应当寄存的是被中断模式的CPSR也就是irq的SPSR;/*/ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r12,lr,pcLTORG;/*/;/*开始*/;/*复位初始化完毕后CSPR中的I/F是打开的*/;/*因此不应当在此过程中打开具体设备*/;/*/HandlerRSTmrsr0,cpsrbicr0,r0,#ARM7_TMOD_MASKorrr1,r0,#ARM7_SVC_MOD|ARM7_NOIN

48、TRmsrcpsr_cxsf,r1;屏蔽中断控制器中各个中断ldrr0,=SFR_VICIntEnClrldrr1,=0xFFFFFFFFstrr1,r0ldrr0,=SFR_VICSoftIntClearstrr1,r0ldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0;*;*设立PLL时钟控制器寄存器*;*ldrr0,=SFR_PLLCFGldrr1,=0x22;0x43=00100010=001(P=2)00010(M=3)strr1,r0ldrr0,=SFR_PLLCONldrr1,=0x3;使能并连接strr1,r0ldrr0,=SFR_PLLFEEDldr

49、r1,=0xAAldrr2,=0x55strr1,r0strr2,r0ldrr0,=SFR_PLLSTATldrr0,=SFR_VPBDIV;外设时钟除数ldrr1,=0x00;1/4时钟strr1,r0checkpllldrr1,r0orrr2,r1,#0x0400;检查PLOCKcmpr2,#0beqcheckpll;拷贝准备ldrr1,=|Image$RO$Limit|;也是RW在FLASH中起始位置ldrr2,=|Image$RW$Base|;从r1位置拷贝到r2位置ldrr3,=|Image$ZI$Base|subsr3,r3,r2;r3=RW大小beqRW2SRAM_OKRW2SR

50、AM_COPY_LOOP;拷贝rwldrr0,r1,#4strr0,r2,#4subsr3,r3,#4;递减计数bneRW2SRAM_COPY_LOOPRW2SRAM_OKldrr1,=|Image$ZI$Base|ldrr2,=|Image$ZI$Limit|subsr2,r2,r1;r2=zi大小beqCLEARZI_OKmovr0,#0CLEARZI_LOOP;zi清0strr0,r1,#4subsr2,r2,#4;递减计数bneCLEARZI_LOOPCLEARZI_OK;*;*初始化堆栈函数*;*初始化完毕后cpsr中的I/F位保持打开*;*因此在操作系统中已开始就要屏蔽中断*;*I

51、nitStacksmsrcpsr_cf,#ARM7_UND_MOD|ARM7_NOINTR;未定义模式,屏蔽中断ldrsp,=UNDStackmsrcpsr_cf,#ARM7_ABT_MOD|ARM7_NOINTR;AbortModeldrsp,=ABTStackmsrcpsr_cf,#ARM7_IRQ_MOD|ARM7_NOINTR;IRQModeldrsp,=IRQStackmsrcpsr_cf,#ARM7_SVC_MOD|ARM7_NOINTR;回到SVC模式ldrsp,=SVCStackbENTERMAIN;加密定义CrpDataWHILE.0x1fcNOPWENDCrpData1DC

52、D0x12345678;当此数为0x87654321时,顾客程序被保护;DCD0x87654321LTORG;*ENTERMAINIMPORTMAINldrr0,=|Image$ZI$Limit|bMAIN;跳到应用代码入口LTORGENTER_U0;矢量化中断进入同一接口前准备subslr,lr,#4stmfdsp!,lraddlr,lr,#4stmfdsp!,lrstmfdsp!,r0-r12movr6,#6bHandlerIRQLTORGENTER_U1subslr,lr,#4stmfdsp!,lraddlr,lr,#4stmfdsp!,lrstmfdsp!,r0-r12一方面是C语言入

53、口函数Main(所有C程序的入口).它里面涉及调用函数ARMTargetInit()初始化ARM解决器,调用OSInit()进行uC/OS-II操作系统初始化,然后调用OSTaskCreate()函数创立任务TaskLED和TaskSEG,最后调用ARMTargetStart()函数启动时钟节拍中断,并且调用OSStart()启动系统任务调度,由于在程序当中使用for(;),这是一种永无止境的回路,因此装置可以始终进行下去,直到关闭装置.intmain(void)OSInit();OSTaskCreate(TaskStart,(void*)0,&TaskStartStkTASK_STK_SIZ

54、E-1,0);OSStart();/*Startmultitasking*/4 测试程序4.1整个测试程序的效果图图4.1 图4.2测试程序的功能在主程序中创立三个任务OSTaskCreate(Task0,(void*)0,&TaskStk0TaskStkLengh-1,3);OSTaskCreate(Task1,(void*)0,&TaskStk1TaskStkLengh-1,4);OSTaskCreate(Task2,(void*)0,&TaskStk2TaskStkLengh-1,5);三个任务的重要工作是按不同的频率点亮,同步通过LCD显示出它们运营的次数,和CPU使用的比例。5 总结

55、本文重要简介了采用Micro2440开发板做为硬件平台,并使用C/OS-II系统进行基于液晶屏的的具体论述。文中还针对设计规定简介了如何选择开发的ARM9硬件平台,并简介了开发过程中如何移植C/OS-II和开发相应的任务程序,及程序的调试措施。通过三个星期的努力完毕了硬件接口的制作和调试,并完毕了C/OS-II系统的移植、在C/OS-II下任务的编写、基于C/OS-II的图形仪表界面的开发等工作。最后实现了设计规定,并能在液晶屏上较好的显示系统任务。从总也证明了本文论证的设计方案的可行性。本设计方案采用嵌入式系统实现,并且已能较好地提供高性能人机交互界面,显示样式较好、并且在体积、功耗比老式的老式嵌入式系统要小得多,因此有一定的市场推广价值。谢 辞首大学生活即将结束,这也意味这在校的学习生涯即将结束。回忆在这充实幸福快乐的大学中我倍感欣慰。在大学里我学到了专业知识、提供了思想修养、懂的了做人

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!