基于ARM9的UCOS-II移植.docx

上传人:牧羊曲112 文档编号:1667652 上传时间:2022-12-13 格式:DOCX 页数:31 大小:2.67MB
返回 下载 相关 举报
基于ARM9的UCOS-II移植.docx_第1页
第1页 / 共31页
基于ARM9的UCOS-II移植.docx_第2页
第2页 / 共31页
基于ARM9的UCOS-II移植.docx_第3页
第3页 / 共31页
基于ARM9的UCOS-II移植.docx_第4页
第4页 / 共31页
基于ARM9的UCOS-II移植.docx_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《基于ARM9的UCOS-II移植.docx》由会员分享,可在线阅读,更多相关《基于ARM9的UCOS-II移植.docx(31页珍藏版)》请在三一办公上搜索。

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

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

3、sII:12月16日-12月25日软件和硬件调试:12月26日-12月27日论文:12月28日验收:12月29日项目验收方式:1、在实训期间进行作品验收,验收后交实训论文及实训的资料打印稿及电子文稿。2、设计报告要符合桂林电子科技大学毕业设计论文统一格式。项目开始时间:2012年12月09日项目结束时间:2012年12月29日任务下达:2012年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, emb

5、edded computer-based technology, is one 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.I

6、n a variety of embedded processors, ARM 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

7、 a real-time operating system for real-time 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

8、-II to run multiple tasks to illustrate 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-II26目 录引言11 S3C2440系列微

9、处理器简介11.1ARM9内核11.2ARM9开发板32 C/OS-II42.1C/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硬件结构和代码的编写;

11、第二章讨论ucosii代码结构;第三章分析ucosii在arm板上的移植。1 S3C2440系列微处理器简介 1.1ARM9内核在ARM9系列处理器中S3C2440A是三星公司推出的一款功能强大,功耗极低的基于ARM920T核心的嵌入式处理器,它为手持设备和普通应用提供了低功耗和高性能的小型芯片微控制器的解决方案。为了降低整体系统成本,S3C2440A还提供了丰富的内部设备,其基本特征如下:基于ARM920T内核,支持JTAG仿真调试;具备16KB的指令缓存和16KB的数据缓存;具有MMU,支持Windows CE、PalmOS、Symbian OS、Linux等操作系统;有外部存储控制器(S

12、DRAM控制和片选逻辑);LCD 控制器(最大支持4K色STN和256K色TFT)提供1通道LCD专用DMA;4通道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像素输入支持

13、缩放);130个通用I/O口和24通道外部中断源;具有普通、慢速、空闲和掉电模式;具有PLL片上时钟发生器;图1.1 ARM模块示图1.2ARM9开发板基于S3C2440A的ARM9开发板在目前市场上有很多如友善之臂的mini2440、飞凌的TE2440开发板和OK2440开发板、天嵌科技的TQ2440开发板等等。在众多知名的开发板中它们都包含了丰富的硬件资源及参考资料。在这些开发板中都包含了电源电路、系统复位电路、系统时钟电路、JTAG接口、串行接口、按键输入接口、IIC接口、USB接口、IIS音频数据接口电路、以太网接口、ADC输入接口、摄像头接口、液晶接口等电路。本文选用Micro244

14、0开发板,采用底板与核心板分离设计,核心板6层布线系统运行相对比较稳定,底板预留了各个接口及总线的排针接口非常方便二次开发,对于液晶屏接口它采用的是24位,比其它非24位的要好得多。在技术售后方面该公司还专门建立了BBS,对使用中遇到的难题会有热心人士解答或有公司专业人士解答。目前使用TQ2440开发板在车载手持设备、GIS平台、Data Servers、VOIP、网络终端、工业控制、检测设备、仪器仪表、智能终端、医疗器械、安全监控等产品中均有应用。本设计使用TQ2440开发板作为硬件平台,其中它的板载存储器资源有:一片2MB的Nor Flash(EN29LV160AB)一片256MB的Nan

15、d Flash (K9F2G08U0A) 及用2片SDRAM (MT48LC16M16A2)组成32位总线宽度构成64MB32bit的SDRAM,供系统使用。从性能及板载资源来看它完成胜任于本设计。2 C/OS-II随着嵌入式技术的快速发展,实时多任务操作系统作为一种软件平台已逐步成为国际嵌入式系统的主流,目前世界上已经有一大批成熟的实时嵌入式操作系统,通常,对嵌入式软件的基本要求是体积小、指令速度快、具有较好的裁减性和可移植性,目前,实时操作系统很多,如VxWorks,WindowsCE,pSOS,QNX,LynxOS等,这些操作系统都具有高可靠性、强实时性等特点,但他们都是商业操作系统,价

16、格昂贵,人们往往很难接受,C/OS-操作系统的出现是对这些商业操作系统的一个很大的冲击。C/OS-是源码公开的实时操作系统,是一个自由操作系统。程序开发人员可以改写源代码,使之符合自己的要求,裁减掉不需要的部分,使操作系统变得小巧、灵活、并且能满足用户特定操作系统的需要。为了提高系统的实时能力,C/OS-可以将一个复杂的应用划分为多个相互独立的任务,并根据任务的重要性来分配优先级。任务的调度完全由C/OS-的实时内核完成,主要包括任务的状态管理、选择最高优先级的任务、执行任务和撤销任务等,C/OS-内核还负责CPU时间分配,CPU时间总是优先分配给中断事件,其次是任务队列中当前优先级最高的任务

17、,不同任务间的通信可以通过C/OS-提供的信号量、邮箱、信息队列等机制完成,他的绝大部分代码是用C语言编写的,可移植性强,因此1997年以后,在国际上逐渐被广泛采用。2.1C/OS-II分析实时系统的特点是,如果逻辑和时序出现偏差将会引起严重后果的系统。有两种类型的实时系统:软实时系统和硬实时系统。在软实时系统中系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。在硬实时系统中,各任务不仅要执行无误而且要做到准时。大多数实时系统是二者的结合。实时系统的应用涵盖广泛的领域,而多数实时系统又是嵌入式的。这意味着计算机建在系统内部,用户看不到有个计算机在系统里面。以下是一

18、些嵌入式系统的例子:通讯类:Switch Hurb路由器机器人:航空航天飞机管理系统过程控制:药品加工化工厂汽车业:发动机控制防抱死系统(ABS)实时应用软件的设计一般比非实时应用软件设计难。不复杂的小系统一般设计成如图2.1 ucosii工作原理简图上图所示的那样时间相关性很强的关键操作(Criticaloperation)一定是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处理,这种系统在处理信息的及时性上,比实际可以做到的要差。这个指标称作任务级响应时间。最坏情况下的任务级响应时间取决于整个循环的执行时间。因为循环的执行时间不是常数,程序经

19、过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响。 2.1.1任务运行任务的状态如下:1.睡眠态(taskdormat):任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。2.就绪态(taskready):任务一旦建立,这个任务就进入了就绪态。3.运行态(taskrunning):调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。4.等待状态(taskwaiting):正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。5.中断状态(ISRr

20、unning):正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。任务是一个无返回的无穷循环,都有唯一的一个优先级。uc/os-ii总是运行进入就绪状态的最高优先级的任务。因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由调度器(scheduler)来完成的。任务级的调度是由函数OSSched()完成的,而中断级的调度是由函数OSIntExt()完成。对OSSched(),它内部调用的是OS_TASK_SW()完成实际的调度(人为模仿一次中断);OSIntExt()内部调用的是OSCtxSw

21、()实现调度。任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的任务堆栈。(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到寄存器中。图2.2 OS_TCB链结构调度算法主要基于分级查询。考虑到任务数目64,可以用6bit来表示,分为高3位和低3位。uC/OS-II将优先级进行分组,按高三位进行分组,可得8个(最多)优先级数组(000-111);每个优先级的在数组中的位置由其低三位表示。在源码中,高三位用带Y后缀的变量表示,而低三位用带X后缀的变量表示。这样建立了1个变量OSRdyGrp(INT8U,8bit,每个bit代表一组)和1个数组OSRdy

22、Tbl8(INT8U,每组8bit,每个bit代表一个优先级)。这样形成了的二级查询,先选组,再选组内偏移。图2.3 ucosii任务等待表2.1.2任务通信任务有如下状态:1.空闲任务(IdleTask)空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。2.统计任务(OSTaskstat)统计任务每秒计算一次CPU在单位时间被使用的时间,并且把计算结果一百分比的形式存放在变量OSCPUUsage中,以便应用程序通过反问来了解CPU的利用率,如果用户要使用这个函数,那么在系统头

23、文件OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置为1,创建之前,调用OSTaskstat对统计任务进行初始化。3.非系统任务这些任务是用户任务,通过运行,达到测量、监测、通信等功能,如图2.4。图2.4 Relationshipbetweentasks,ISRsandasemaphore2.1.3内存动态分配Ucos为内存中存储块的动态分配提供了支持。不同于malloc(),free(),ucos的存储管理机制是基于固定大小存储块的分配与回收。对于任务而言,每次只能申请固定大小的存储块,因而不存在外部碎片的问题。科学利用内存,操作系统把连续的大块内存按分区来管理,每个分区

24、中包含有整数个大小相同的内存块,使得它们可以分配和释放固定大小的内存块。如下图所示:图2.8 内存模块3 C/OS-II在ARM9上的移植随着国内工业化、数字化的步伐加快,嵌入式开发在IT行业中的重要性越来显著。中国成为“世界制造中心”甚至“设计中心”的趋势,必然对小型数字控制系统的需求越来越大。在这种情况下,类似于UCOS-II的小型硬实时嵌入式操作系统内核,具有低成本、易控制、小规模、高性能的特性,因而有相当好的发展前景。但是这类系统的基础较为薄弱,面临产品化、商业化程度不够的问题。采用此类系统进行产品开发需要仔细的分析、设计,否则也很难真正满足工业产品生产的要求。正是针对这种情况,在AR

25、M微处理器环境下,针对商业化、产品化环境的严格要求,设计构造了一种硬实时嵌入式内核体系结构。当然真正的商业化、产品化的嵌入式内核,既需要这种能够满足高标准要求的体系结构设计基础,还需要严格的产品化软件开发测试过程。只有理论基础和工程实践完整的结合,才能产生真正经受得起考验的,能够满足工业化生产,能够在各种环境下稳定运行并确保达到设计目的的产品。从这个角度考虑,仅仅拿来一个操作系统内核并开发应用产品,很难万全满足这种要求。必须要对内核的涉及思路进行仔细的考虑、验证,对应用的可选开发设计方法进行审慎的评估,并配合真正工业化的项目发管理办法,才能保障产品达到要求。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,i

27、nt和long等数据类型的定义,因为他们与处理器类型有关,隐含着不可移植性,代之以移植性强的整数数据类型,这样,既直观又可移植。根据ADS编译器的特性,代码为:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedshortINT16U;typedefsignedshortINT16S;typedefunsignedintINT32U;typedefsignedintINT32S;typedeffloatFP32;typedefdoubleFP64;typedefINT

28、32UOS_STK;(2)使用软中断SWI做底层接口因为带T变量的ARM7处理器核具有两个指令集,用户任务可以使用两种处理器模式,为了使底层接口函数与处理器状态无关,同时在任务调用相应函数时不需要知道该函数位置,本例使用软中断指令SWI作为底层接口,使用不同的功能号区分不同的函数。(3)OS_STK_GROWTHC/OS-使用结构常量OS_STK_GROWTH指定堆栈的生长方式,其lpc2132代码为:#defineOS_STK_GROWTH13.1.2OS_CPU_C.C移植OS_CPU_C.C文件时,需要编写的是任务堆栈初始化函数OSTaskStkInit和时钟节拍中断服务钩子函数OSTi

29、meTickHook。在C/OS-II中,每一个任务都有自己的任务堆栈,当发生任务切换或者中断时,其CPU使用权被剥脱,为了任务能被再次运行,那么这个被打断的任务所用到的处理器的寄存器内容均应得到保存,按照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=(

30、OS_STK)ptos;*-stk=(OS_STK)task;*-stk=(OS_STK)task;*-stk=0;*-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结构中的最前面的参数OSTCBStkPt

31、r中,当该任务要被恢复时,任务切换函数从其TCB块中取得其任务堆栈指针,依次将堆栈内容弹到处理器对应的CPSR、r0,r1,r12,lr,pc的寄存器中,完成现场的恢复和程序指针PC的返回。另一个需要编写的函数是OSTimeTickHook,该函数被时钟节拍中断服务函数OSTickISR中的OSTimeTick函数调用,用来清除时钟节拍中断发生设备的请求。本移植方案使用处理器的RTC模块的tick中断作为时钟节拍中断,该函数编写如下:voidOSTimeTickHook(void)rI_ISPC=(INT32U)0x01)20;注意:用户也可不修改此函数,但是必须在OSTickISR中执行清除

32、发生节拍中断的设备的中断请求标志,为便于说明,本文将利用内核提供给用户的OSTimeTickHook函数来完成清中断的任务。另外几个hook函数不必去改它们,至此,OS_CPU.C编写完成。包含了与移植有关的C函数,包括堆栈的初始化和一些钩子函数的实现,但是最重要的是OSTaskStkInit()函数,该函数是在用户建立任务时系统内部自己调用的,用来对用户任务的堆栈初始化。在ARM7体系结构下,任务堆栈空间由高至低递减,依次保存着PC,LR,R12,R1,R0,CPSR的初始化堆栈结构,当用户初始化了堆栈,OSTaskStkInit()就返回新的堆栈指针STK所指的定地址。OSTaskCrea

33、te()和OSTaskCreateExt()会获得该地址并将他保存到任务控制块TCB中,其他的几个钩子函数必须声明,但可以不包含任务代码,这些钩子函数在本移植中全为空函数。3.1.3OS_CPU_A.SC/OS-移植的绝大部分工作都集中在OS_CPU_A.S文件的移植上,在这个文件里,最困难的工作又集中体现在OSIntCtxSw和OSTickISR这两个函数的实现上。这是因为这两个函数的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关,在实际的移植工作中,这两个地方也是比较容易出错的地方,这部分需要对处理器的寄存器进行操作,所以必须用汇编语言编写,包括4个子函数:OSStart

34、HighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRdy()该函数首先调用钩子函数OSTaskSwHook(),然后将OSRunning标志位设置为真,表示任务开始执行,从而保证任务切换操作的正确执行,紧接着从具有最高优先级的任务控制块中取得任务的堆栈指针,初始化堆栈指针寄存器SP,然后恢复其他的寄存器,开始执行最高优先级的任务。OSCtxSw()该函数在任务级任务切换函数中调用,首先保存处理器寄存器,将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,从新任务的任务堆栈中恢复处理器所有寄存器的值,然后执行中断返回指令。OSI

35、ntCtxSw()该函数是在ISR中执行任务切换功能,其原理基本上与任务级的切换相同,区别只是ISR已经保存了CPU的寄存器,因此不要再进行类似的操作,只需对堆栈指针作相应的调整即可。OSTickISR()该函数是系统时钟节拍中断服务函数,首先要保存处理器寄存器,接着调用OSIntEnter()函数,以保证中断嵌套层数不超过255层,如果满足了该条件,则把堆栈指针保存到当前任务的任务控制块TCB中,然后给产生中断的设备清中断,重新允许中断,接下来调用OSTimeTick()来维持C/OS-内部的定时以及调用OSIntExit()函数决定是否因为这个中断服务程序的执行,使得更高优先级的任务就绪。

36、这一部分是用户根据自己的应用系统来定制合适的内核服务功能,包括2个文件:OS_CFG.H和INCLUDES.H。OS_CFG.H用来配置内核,用户根据需要对内核进行修改,留下需要的部分,去掉不需要的部分,比如系统可提供的最大任务数量,是否定制邮箱服务,是否提供优先级动态改变功能等等,所有的配置更改包括头文件的增减均在该文件中进行。INCLUDES.H系统头文件,整个实时系统程序所需要的文件,包括了内核和用户的头文件,这样使得用户项目中的每个C文件不用分别去考虑他实际上需要哪些头文件。3.2移植代码实现复位入口代码的主要功能就是设置好PLL然后搬迁代码。此处列出的是标准写法,根据编译链接参数不同

37、,还有其他一些优化写法。例如,在编译调试工具中(SDTV2.51或ADSV1.2),如果只配置RO-BASE参数,不配置RW-BASE参数,RO和RW段是自然衔接的,这样代码的拷贝搬迁工作可以简化。另外要注意的是,这部分代码要仔细检查、调试实际的执行结果。例如,搬迁后,应该初始化的全局变量是否正确初始化。SDTV2.51下,如果用JTAG调试,RW-BASE配置了参数,直接下载代码到RAM中,因为没有自己控制内存搬迁和拷贝初始化数据段的代码,就存在全局变量没有正确初始化的问题。工程师编写代码的时候,不可能不考虑调试状态,因此这种调试状态下代码段搬迁的初始化问题同样要仔细考虑。比较好的方式,是在

38、模块的初始化函数中,进行所有处于RW段、ZI段的全局变量的详细初始化。这种初始化过程不影响主体代码的仅仅在开始阶段执行一次,完全不会影响主体程序的执行效率,确能够保障代码在任何情况下的稳定运行。代码三十五.2132复位及中断入口代码init.sIMPORTi_pCurTcbIMPORTIrqFinishIMPORTPreISRIMPORTIntrNestedIMPORTI2C0VectIMPORTIsrHandlerIMPORT|Image$RO$Limit|IMPORT|Image$RW$Base|IMPORT|Image$ZI$Base|IMPORT|Image$ZI$Limit|EXPO

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

40、成复位bHandleFIQLTORG;/*/;/*IRQ中断预处理例程*/;/*入口条件:IRQ中断屏蔽,LR是被中断任务或ISR的PC值,*/;/*SPSR是被中断任务或ISR的当前处理器状态值,*/;/*SP是IRQ模式当前堆栈指针值*/;/*/HandlerIRQ;/*/;1.4SPSR保存到R0;压栈R0,是IRQ模式的SPSR,也是被中断模式的CPSR;/*/mrsr4,spsrstmfdsp!,r4movr0,r6blPreISR;r0中返回处理结果cmpr0,#0beqkeepirq;/*/;结束应急处理并结束中断处理,已处理完;/*/ldrr0,=SFR_VICVectAddr

41、ldrr1,=0strr1,r0ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r12,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值到R

42、0地址(前面2.1);/*/ldrr1,=1strr1,r0;/*/;不是嵌套中断切换到svc模式处理任务;3.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;/*/;3.3当前SP指针(这是SVC模式下任务当前的堆栈指针)保存到任务控制;块结构的第一个字段.保存sp到tcb,便于任务切换*/;因为任务被中断时,堆栈尚未与环境同步;/*/ldrr0,=i_pCurTcbldrr1,r0strsp,r1;/*/;3.4完成了SVC模式下的处理,切换到SYS/UND,跳转到5;/*/msrcpsr_cxsf,#ARM7_UND_MOD|ARM7_I_BITbIRQPREOVERLTORGIRQN

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号