版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘要随着计算机技术,微电子技术和网络技术的迅速发展,嵌入式系统技术是电子产品设计领域最为热门的技术之一。在消费电子、网络通信、工业控制等诸多领域得到了广泛的应用。ARM处理器是目前公认的领先的32位嵌入式RSIC微处理器,已成为许多行业嵌入式解决方案的RISC标准。ARM技术以低功耗,低成本、体积小等诸多优点在嵌入式领域获得更广泛的应用。GPS是以卫星为基础的无线导航定位系统。它具有全能性(陆地、海洋、航空和航天)、全球性、全天候、连续性和实时性的导航、定位和定时的功能,能为用户提供精密的三维坐标、速度和时间。本设计将阐述LPC2292的启动程序、串口UART0通讯程序、I2C通讯程序和GPS
2、数据解码程序,重点介绍LPC2292串口UART0、I2C部件和NMEA-0813协议,在LCD显示方面介绍如何使用ZLG/GUI编写菜单界面, 本软件能正确的对GPS信息进行解码,并在液晶上显示。关键词: LPC2292 、 GPS接收器 、 I2C 、 NMEA-0813协议 AbstractWith the development of the computer technology ,microelectronics and network technology, embedded system is one of the most popular technology of the
3、field of electronic product design.Embedded system is adopted in the fields of consumer electronics, network communication, industrial control and so on. ARM processor is a kind of advance 32-bit microprocessor embedded RISC, it have becomed embedded RISC stardard of solution for many industries. AR
4、M technology have low-power, low-cost, small size and many other advantages, so it applied in the field of embedded system widely.GPS is a Wireless navigation and positioning system based on Satellite.It has the function of omnipotent (terrestrial, marine, aviation and aerospace), a global, all-weat
5、her, continuity and attachment of navigation, positioning and timing,it can provide for the customer Sophisticated three-dimensional coordinates, speed and time.This article expo und that how to program for 2292Bootloader、serial UART0 communi cation、I2C communication .And GPS data decode,and introdu
6、ce LPC 2292 emphasis on serial UART0 、I2C and NMEA-0813 protocol,and introduce how to use ZLG/GUI program menu interface in the part of lcd display. This software can decode GPS data accuracy and display on the LCD.Keyword: LPC2292 、 GPS receiver 、 I2C 、 NMEA-0813 protocol 目录 TOC o 1-3 h z u HYPERLI
7、NK l _Toc200741127 绪论 PAGEREF _Toc200741127 h 1 HYPERLINK l _Toc200741128 2 总体方案设计 PAGEREF _Toc200741128 h 2 HYPERLINK l _Toc200741129 2.1 设计任务 PAGEREF _Toc200741129 h 2 HYPERLINK l _Toc200741130 2.2 硬件设计 PAGEREF _Toc200741130 h 2 HYPERLINK l _Toc200741131 2.3 软件设计 PAGEREF _Toc200741131 h 3 HYPERLIN
8、K l _Toc200741132 3 各模块程序设计 PAGEREF _Toc200741132 h 5 HYPERLINK l _Toc200741133 3.1 Bootloader代码 PAGEREF _Toc200741133 h 5 HYPERLINK l _Toc200741134 3.1.1 初始化中断向量 PAGEREF _Toc200741134 h 6 HYPERLINK l _Toc200741135 3.1.2 初始化外部总线控制器 PAGEREF _Toc200741135 h 7 HYPERLINK l _Toc200741136 3.1.3 堆栈初始化 PAGE
9、REF _Toc200741136 h 8 HYPERLINK l _Toc200741137 3.1.4 目标板初始化 PAGEREF _Toc200741137 h 9 HYPERLINK l _Toc200741138 移殖COS-到LPC2292 PAGEREF _Toc200741138 h 12 HYPERLINK l _Toc200741139 3.2.1 编写 PAGEREF _Toc200741139 h 13 HYPERLINK l _Toc200741140 文件 PAGEREF _Toc200741140 h 15 HYPERLINK l _Toc200741141 文
10、件 PAGEREF _Toc200741141 h 15 HYPERLINK l _Toc200741142 3.2.4 中断及时钟节拍 PAGEREF _Toc200741142 h 17 HYPERLINK l _Toc200741143 3.3 信息解码程序设计 PAGEREF _Toc200741143 h 18 HYPERLINK l _Toc200741144 3.3.1 NMEA-0183的协议标准 PAGEREF _Toc200741144 h 18 HYPERLINK l _Toc200741145 3.3.2 GPS数据结构的定义 PAGEREF _Toc200741145
11、 h 20 HYPERLINK l _Toc200741146 3.3.3 GPS信息解码程序设计 PAGEREF _Toc200741146 h 23 HYPERLINK l _Toc200741147 3.4 串口驱动程序 PAGEREF _Toc200741147 h 23 HYPERLINK l _Toc200741148 3.4.1 串口结构图 PAGEREF _Toc200741148 h 23 HYPERLINK l _Toc200741149 3.4.2 串口的初始化 PAGEREF _Toc200741149 h 24 HYPERLINK l _Toc200741150 3.
12、4.3 串口接收数据程序设计 PAGEREF _Toc200741150 h 25 HYPERLINK l _Toc200741151 3.5 键盘处理程序 PAGEREF _Toc200741151 h 27 HYPERLINK l _Toc200741152 3.5.1 I2C总线 PAGEREF _Toc200741152 h 27 HYPERLINK l _Toc200741153 3.5.2 I2C总线速度的配置 PAGEREF _Toc200741153 h 34 HYPERLINK l _Toc200741154 3.5.3 ZLG7290 PAGEREF _Toc2007411
13、54 h 34 HYPERLINK l _Toc200741155 3.6 液晶显示程序的设计 PAGEREF _Toc200741155 h 36 HYPERLINK l _Toc200741156 4 软件的调试 PAGEREF _Toc200741156 h 38 HYPERLINK l _Toc200741157 4.1 软件调试流程 PAGEREF _Toc200741157 h 38 HYPERLINK l _Toc200741158 4.2 调试结果 PAGEREF _Toc200741158 h 38 HYPERLINK l _Toc200741159 结束语 PAGEREF
14、_Toc200741159 h 39 HYPERLINK l _Toc200741160 致谢 PAGEREF _Toc200741160 h 40 HYPERLINK l _Toc200741161 参考文献 PAGEREF _Toc200741161 h 41 HYPERLINK l _Toc200741162 附录 PAGEREF _Toc200741162 h 42绪论GPS卫星导航定位技术是现代信息通信领域中一门新兴的技术。GPS系统的空间部分由24颗卫星组成,均匀分布在6个轨道面上,地面高度为20200公里,轨道倾角为55度,扁心率约为0,周期约为12小时,卫星向地面发射两个波段的
15、载波信号,载波信号频率分别为1575.442兆赫兹(L1波段)和1227.6兆赫兹(L2 波段),卫星上安装了精度很高的原子钟,以确保频率的稳定性,在载波上调制有表示卫星位置的广播星历,用于测距的C/A码和P码,以及其它系统信息,能在全球范围内向任意多用户提供高精度的、全天候的、连续的、实时的三维测速、三维定位和授时。GPS系统的控制部分由设在美国本土的5个监控站组成,这些监控站不间断地对GPS卫星进行观测,并将计算和预报的信息由注入站对卫星信息更新。GPS系统的用户是非常隐蔽的,它是一种单程系统,用户只接收而不必发射信号,因此用户的数量也是不受限制的。目前,中国卫星导航技术应用领域十分广阔,
16、传统测量应用及军工相关应用的比例在逐年下降,应用已渗透到许多崭新的行业。通信行业用GPS做时间同步测控;电力、有线电视、城市地下管道采用GPS布设线路;交通、运输部门用GPS等相关集成技术营建ITS系统和监控系统;公安、银行、医疗、消防等用GPS营建紧急救援或报警系统;汽车、船舶用GPS导航;GIS数据提供商用GPS采集地理信息相关数据,并提供位置信息相关服务(LBS);广播电视行业用GPS与罗盘制造卫星电视定向接收天线;电子商务领域,GPS甚至应用于CRM客户管理和物流配送体系中;而电脑制造商、通讯设备商正在推动通讯、电脑、GPS一体化的各类移动信息终端应用。现实的应用已经使卫星导航技术从专
17、业化领域走向了大众化应用的广阔前景,这也使得卫星导航技术逐渐成为通信、互联网之后的第三个IT新增长点。中国卫星导航产品与服务一直呈现强劲增长的势头。据有关部门统计,GPS接收机相关产品的拥有量8万台左右,航海型约有5万台左右,应用数量最多;车载型以每年200%的速度递增,发展最快;手持型各类个人消费终端产品形态极为丰富,最具诱惑力。本设计主要研究对基于NMEA-0813协议的GPS信息解码程序的设计,程序可以对RMC(推荐定位信息)、GGA(固定数据输出信息)、GSA(当前卫星信息)进行精确的解码,并能在液晶显示器显示经度、纬度、日期、时间等信息。2 总体方案设计2.1 设计任务本软件设计的所
18、需完成的任务是:(1) 通过编写GPS信息解码程序,能对GPS信息进行正确的解码;(2) 通过移值ZLG/GUI,设计菜单操作界面,方便用户操作,并显示详细的GPS信息。2.2 硬件设计本设计要求微处理器能提供串口接收GPS模块输出的信息,并有较强的运算能力及高的处理速度使得菜单界面显示效果好。目前,ARM所提供的16/32位嵌入式RISC内核主要有以下几个系列产品:ARM7、ARM9、ARM10E、ARM11和SecurCore、StrongARM和Xscale等。ARM7TMDI属于低端的ARM处理器,其最高主频可达130MIPS(Million Instructions Per Seco
19、nd),高速的运算能力能胜任绝大多数复杂的应用。本次设计采用LPC2292作为微处理器,其最高主频为60 MH z,足以胜任本次设计任务,LPC2292有256kB片内Flash,为本次设计提供了足够的程序存储空间,可以不用扩展外部Flash。虽然LPC2292有16kB的片内RAM,但是仍然不够用,因为本设计所移植的uCOS_II操作系统和ZLG/GUI共生成了7kB多的Data,必须为每一个任务分配足够的堆栈空间和声明存放GPS信息的数组,加上定义必要的变量将增加大约6kB的Data,使16kB的RAM剩余不多。考虑到以后能容易的添加新的功能,本设计采用外部RAM储存程序变量,具体芯片选用
20、高速访问时间达10ns、高性能和低功耗的IS61LV25616AL,该芯片是美国ISSI公司生产的SRAM(静态RAM),存储容量是512kB,这为以后扩展功能提供极大的发挥余地。本设计采用ZLG7290作为键盘接口,ZLG7290是标准的I2C接口器件,只使用三个LPC2292的I/O口,其中有两个是I2C引脚SDA、SCL,另外一个引脚是外部中断EINT3,这样就可以节省I/O口又可以扩展多达64个引脚ZLG7290可以自动消除抖动,其中有8只可以作为功能键使用。另外ZLG7290内部还设置有连击计数器,能够使某键按下后不松手而连续有效。在液晶方面可以选用点阵图形的单色液晶,也可以选用ST
21、N或者更高级别的液晶,但价格昂贵。本设计采用SMG240128A作为显示器,就可以满足设计要求。本设计的总体硬件框图如图2.1所示。LPC2292 UART GPS Model ZLG7290 SMG240128 IS61LV25616AL 电源 Key 图2.1 总体硬件框图2.3 软件设计本设计采用COS-实时操作系统实现,该操作系统的优点是提高处理事件的实时性。本设计共建立3个任务,分别为TaskA、TaskB、TaskC。其中TaskA为起始任务,其优先级最高,在TaskA中建立TaskB、TaskC。TaskB是显示GPS信息任务,TaskC是键盘检测任务。TaskB获取键盘的方法是
22、,先建立邮箱havenewkey,并等待邮箱havenewkey,TaskC检测到按键按下时发出邮箱havenewkey,之后当执行任务TaskB时通过邮箱havenewkey获取按键值。主程序执行过程如图2.2所示。程序由7部分组成:Bootloader、GPS信息解码程序、串口中断服务程序、读按键值程序、ZLG/GUI、COS-和主程序,下面将阐述其中几部分程序的设计方法。启动初始化显示开机界面键盘检测启动接收GPS信息使能串口中断对接收到的信息进行解码并显示信息等待邮箱(20个时钟节拍)Havenewkey退出接收信息xinGPSxinxYN显示GPS简介YYN建立任务TaskA任务调度
23、在TaskA中建立任务TaskB、TaskC, 延时60个时钟节拍运行任务TaskB无限期等待邮箱Havenewkey无限期等待邮箱Havenewkey运行任务TaskC按键有效发出邮箱HavenewkeyN延时6个时钟节拍图2.2 主程序流程图3 各模块程序设计3.1 Bootloader代码Bootloader代码(启动代码)是嵌入式系统中应用程序的开头部分,它与应用程序一起固化在ROM中,并首先在系统上运行。Bootloader代码是嵌入式程序的重要组成部分,好的Bootloader代码是系统能够正常工作的前提。本设计的启动代码的整个流程图如图3.1所示。设置存储器控制寄存器设置系统各部
24、分时钟 设置存储器加速模块 进入主程序 初始化各模式堆栈 初始化中断向量 配置外部总线 图3.1 启动代码流程图3.1.1 初始化中断向量ARM体系中共包含7个异常中断,异常的类型及向量地址见表3.1。表3.1 异常的类型及向量地址异常中断类型异常中断模式向量地址复位管理模式0 x00000000未定义指令未定义模式0 x00000004软件中断(SWI)管理模式0 x00000008指令预取中止中止模式0 x0000000C数据访问中止中止模式0 x00000010保留0 x00000014外部中断请求IRQIRQ模式0 x00000018快速中断请求FIQFIQ模式0 x0000001C初
25、始化中断向量是设置中断向量表,该中断向量表给出了ARM芯片出现异常时转去执行的程序地址,如当ARM芯片复位时,产生复位中断,进入管理模式,执行地址为0 x00000000处的代码。初始化中断向量程序代码如下:CODE32 AREA vectors,CODE,READONLY ENTRY;中断向量表Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr DCD 0 xb9205f80 LDR PC, PC, #-0 xff0 LDR PC,
26、FIQ_AddrResetAddr DCD ResetInitUndefinedAddr DCD UndefinedSWI_Addr DCD SoftwareInterruptPrefetchAddr DCD PrefetchAbortDataAbortAddr DCD DataAbortNouse DCD 0IRQ_Addr DCD 0FIQ_Addr DCD FIQ_Handler;未定义指令Undefined B Undefined;取指令中止PrefetchAbort B PrefetchAbort;取数据中止DataAbort B DataAbort;快速中断FIQ_Handler
27、STMFD SP!, R0-R3, LR BL FIQ_Exception LDMFD SP!, R0-R3, LR SUBS PC, LR, #4AREA是伪操作,定义了名为vectors的代码段,ENTRY是至关重要的伪操作,作用是指定程序的入口点,即是ARM执行程序的起始点。从上面的代码可以看出若发生取数据中止、指令预取中止、未定义指令异常时,程序将进入死循环,这有助于用户调试程序,如执行用户代码:K+=Tabtemp,若在执行该行程序之前,未对Tabtemp赋值,则程序将进入取数据中止死循环,这使得用户发现程序错误从而矫正错误。当发生IRQ异常,CPU跳转至异常向量地址为0 x0000
28、0018处执行指令LDR PC,PC,#-0 x0FF0,此时程序计数器PC中内容为0 x00000020,0 x00000020减去0 x00000FF0为0 xFFFFF030,这是向量中断控制器(VIC)的向量地址寄存器VICVectAddr的地址,这个寄存器保存当前将要服务的IRQ中断服务程序的入口,用这一条指令就可以直接跳转到需要的中断服务程序中。保留的异常向量“DCD 0 xb9205f80”位置填充数据0 xb9205f8是为了使向量表中所有的数据32位累加和为0。3.1.2 初始化外部总线控制器正确的配置外部存储器控制器是保证ARM运行良好的前提,LPC2292 含有外部总线控
29、制器,支持静态存储器映射器件,包括RAM、ROM、Flash、Burst ROM 和一些外部I/O器件。该模块可同时支持多达4个单独配置的存储器组。初始化外部存储器控制器BCFG时,主要设置该寄存器的几个域:BM(27),若使用的是Burst ROM(突发数据传输仅读记忆体),则设置BM为1,否则设置为0;对不同宽度的存储器,设置MW(2928),设为00表示使用8位的存储器,设为01表示使用16位的存储器,设为10表示使用32位的存储器;若是带字节选择输入的16/32位宽度的器件,需要设置RBLE(10)为1,然后设置总线切换的空闲周期IDCY(30),读访问长度WST1(95),写访问长度
30、WST2。以下为配置外部存储器控制器的代码。LDR R0, =BCFG0 LDR R1, =(128)+(0 x0211)+(110)+(0 x025)+(1);STR R1, R0;LDR R0, =BCFG1 LDR R1, =(128)+(0 x411)+(110)+(0 x45)+(0 x01);STR R1, R0;LDR R0, =BCFG2;LDR R1, =(028)+(0 x611)+(110)+(0 x65)+(0 x01);STR R1, R0LDR R0, =BCFG3; 设置BCFG3寄存器 LDR R1,= (128)+(0 x511)+(110)+(0 x55)+
31、(0 x01); STR R1, R0本设计分别把IS61LV25616AL、SST39VF1601分配到BANK0、BANK1,IS61LV25616AL、SST39VF1601都是16位的外部存储器,因此MW(2928)设为1,IS61LV25616AL高速访问时间分别为10ns、90ns,以上的程序把对这两个外部存储器的读写配置成最快速度。 堆栈初始化每个异常模式都有自身堆栈空间,异常处理程序通常将其它要使用的寄存器保存到这个堆栈。以下为初始化堆栈的代码。InitStack MOV R0, LR;设置中断模式堆栈 MSR CPSR_c, #0 xd2 LDR SP, StackIrq;设
32、置快速中断模式堆栈 MSR CPSR_c, #0 xd1 LDR SP, StackFiq;设置中止模式堆栈 MSR CPSR_c, #0 xd7 LDR SP, StackAbt;设置未定义模式堆栈 MSR CPSR_c, #0 xdb LDR SP, StackUnd;设置系统模式堆栈 MSR CPSR_c, #0 xdf LDR SP, =StackUsr MOV PC, R0StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4S
33、tackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4AREA MyStacks, DATA, NOINIT, ALIGN=2IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间UndtStac
34、kSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈MSR为写状态寄存器指令,该指令可以直接设置状态寄存器CPSR或SPSR,上述代码的MSR指令都是设置CPSR的控制域psr7:0,接着指令LDR是设置各个模式的专用的堆栈指针SP的地址。用伪操作AREA声明名为MyStatus的数据段,数据伪操作SPACE为各个堆栈分配内存单元,并用0初始化内存单元,从程序中可以看出中止模式、未定义模式堆栈空间都被初始化为0,是因为在这些异常模式下都是执行一个死循环不需要保存数据。由于CPU要进行模式切换即由管理模式切换到系统模式,不能由系统模式的LR正确返回子程序,所以在初始
35、化堆栈程序的入口处保存链接寄存器LR(模式自身的LR(R14)用于保存子程序返回地址)到R0,同时用R0返回子程序。3.1.4 目标板初始化根据目标板的外围电路设置存储器映射控制寄存器MEMMAP、分频器寄存器VPB、PLL倍频值寄存器PLLCFG4:0、MAM定时寄存器。以下为初始化目标板代码。#ifdef _DEBUG MEMMAP = 0 x3; /remap#endif#ifdef _OUT_CHIP MEMMAP = 0 x3; /remap#endif#ifdef _IN_CHIP MEMMAP = 0 x1; /remap#endif/* 设置系统各部分时钟 */ PLLCON
36、= 1;#if (Fpclk / (Fcclk / 4) = 1 /fcclk=4倍的Fpclk VPBDIV = 0;#endif#if (Fpclk / (Fcclk / 4) = 2/fcclk=2倍的Fpclk VPBDIV = 2;#endif#if (Fpclk / (Fcclk / 4) = 4/fcclk=1倍的Fpclk VPBDIV = 1;#endif#if (Fcco / Fcclk) = 2 PLLCFG = (Fcclk / Fosc) - 1) | (0 5);#endif#if (Fcco / Fcclk) = 4 PLLCFG = (Fcclk / Fosc)
37、 - 1) | (1 5);#endif#if (Fcco / Fcclk) = 8 PLLCFG = (Fcclk / Fosc) - 1) | (2 5);#endif#if (Fcco / Fcclk) = 16 PLLCFG = (Fcclk / Fosc) - 1) | (3 5);#endif PLLFEED = 0 xaa; PLLFEED = 0 x55; while(PLLSTAT & (1 10) = 0); PLLCON = 3; PLLFEED = 0 xaa; PLLFEED = 0 x55; MAMCR = 0;#if Fcclk 20000000 MAMTIM =
38、 1;#else#if Fcclk 40000000 MAMTIM = 2;#else MAMTIM = 3;#endif#endifMAMCR = 2;存储器映射控制寄存器的配置是根据用户使用何种方式启动ARM,在调试前若选择RelOutChip则编译器会执行#ifdef _OUT_CHIP MEMMAP = 0 x3; /remap#endif把MEMAP设置为0 x3,即选择用户外部存储器模式,从0 x80000000处开始执行程序,这样0 x80000000-0 x8000003C异常向量表便映射0 x00000000 -0 x00 00003C。同样的,若选择RelInChip则编译
39、器会执行#ifdef _IN_CHIP MEMMAP = 0 x1; /remap#endif选择用户Flash模式,ARM直接从0 x00000000执行程序。在本设计中使用11.0592MHz晶振,倍增器值M=4,所以处理器时钟(Fcclk)为MHz。为了使电流控制振荡器频率(Fcco)满足156-320MHz,选择分频器的值P=2,使得MHz。取VPB分频器的分频值为1/4,所以外设时钟(Fpclk)MHz,为了使PLLCON和PLLCFG寄存器的更改生效,必须将正确的馈送序列写入PLLFEED寄存器。馈送序列是将值0 xAA 写入PLLFEED,接着将值0 x55写入PLLFEED。w
40、hile(PLLSTAT & (1 10) = 0);是等待PLL处于锁定状态,MAM定时寄存器决定使用多少个cclk周期访问Flash存储器。这样可调整MAM时序使其匹配处理器操作频率,在本设置所使用的处理器时钟较快,把MAMTIM配置为3,即使用3个处理器时钟访问外部FLASH。经过了初始化中断向量表、配置外部总线、初始化各模式堆栈、设置系统各部分时钟、设置存储加速模块ARM后,ARM将进入用户主程序,执行用户代码。移殖COS-到LPC2292嵌入实时操作系统COS-C/OS-的结构以及它与硬件的关系。Applition SoftWareCOS-(Processer Indentent C
41、ode)COS- Configuration(Apptication Sepcific)COS- Port (Processer Specific Code) 、OS_CPU_A.ASM、OS_CPU_C.CCPUTimerSoftWareHardWareHardWare图3.2 C/OS-的结构以及它与硬件的关系COS-II中要移植的部分见表3.2所示。移植COS-II到一个新的体系机构上一般需要3个文件:OS_CPU.H(C语言头文件)、OS_CPU_C.C(C程序源文件)及OS_CPU_A.ASM(汇编程序源文件)。由表3.2可以看出,移植COS-II需要在OS_CPU.H包含几个类型的
42、定义和几个常数的定义;在OS_CPU_C.C和OS_CPU_A.ASM中包含几个函数的定义和时钟节拍中断服务程序的代码。实际上,还有一个includes.h文件需要关注,因为每一个应用都包含独特的includes.h文件。 COS-II中要移植的部分移殖内容类型所属文件描述BOOLEAN、INT8U INT8S、INT16U INT16S、INT32U INT32S 、FP32 、FP64数据类型与编译器无关的数据类型OS_STK数据类型堆栈数据类型OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()宏开关中断的代码OS_STK_GROWTH常量定义堆栈增长方向OS_T
43、ASK_SW函数任务切换时执行的代码OSTaskStkInit函数任务堆栈初始化函数OSTaskStkInit()OSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()OSTimeIdleHook()函数COS-II在执行某些操作调用的用户函数,一般为空OSStartHighRdy()函数进入多任务环境时运行优先级最高的任务OSIntCtxSw()函数中断级的任务切换函数OSTickISR()中断服务函数时钟节拍中断服务程序COS-II移植的要求,本移植也包括OS_CUP.h、OS_CPU_
44、C.c和OS_CPU_A.s三个文件。将OS_CUP_A.asm更名为OS_CPU_A.s是遵照ADS 编译器的惯例。实际上,还有一个文件很重要,就是IRQ.inc,它定义了一个汇编宏,是COS-II为ARM7通用的中断服务程序的汇编与函数接口代码。时钟节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自己编写,不过可以通过IRQ.S简化用户代码的编写。(1)数据类型定义 数据类型的修改与所使用的编译器相关,不同的编译器使用不同的字节长度表示同一数据类型。根据ADS编译器的要求,这些代码定义如下: typedef unsigned char BOOLEAN; /* 布尔变量 *
45、/typedef unsigned char INT8U; /* 无符号8位整型变量 */typedef signed char INT8S; /* 有符号8位整型变量 */typedef unsigned short INT16U; /* 无符号16位整型变量 */typedef signed short INT16S; /* 有符号16位整型变量 */typedef unsigned int INT32U; /* 无符号32位整型变量 */typedef signed int INT32S; /* 有符号32位整型变量 */typedef float FP32; /* 单精度浮点数(32位
46、长度)*/typedef double FP64; /* 双精度浮点数(64位长度)*/typedef INT32U OS_STK; /* 堆栈是32位宽度 */(2)使用软件中断SWI作底层接口 表3.3 软中断功能号功能号接口函数 简介0 x00void OS_TASK_SW(void);任务级任务切换函数0 x01void _OSStartHighRdy(void);运行优先级最高的任务0 x02void OS_ENTER_CRITICAL(void)关中断0 x03void OS_EXIT_CRITICAL(void);开中断0 x80void ChangeToSYSMode(void
47、);任务切换到系统模式0 x81void ChangeToUSRMode(void); 任务切换到用户模式 0 x82void TaskIsARM(INT8U prio); 任务代码是ARM代码 0 x83void TaskIsTHUMB(INT8U prio); 任务代码是THUMB代码 底层接口函数声明如下:_swi(0 x00) void OS_TASK_SW(void); _swi(0 x01) void _OSStartHighRdy(void); _swi(0 x02) void OS_ENTER_CRITICAL(void); _swi(0 x03) void OS_EXIT_C
48、RITICAL(void); _swi(0 x80) void ChangeToSYSMode(void); _swi(0 x81) void ChangeToUSRMode(void); _swi(0 x82) void TaskIsARM(INT8U prio); _swi(0 x83) void TaskIsTHUMB(INT8U prio); 用软件中断作为操作系统的底层接口就需要在C语言中使用SWI指令。在ADS中,有一个关键字_swi,用它声明一个不存在的函数,调用这个函数就在调用这个函数的地方插入一条SWI指令,并且可以指定功能号。(3) 定义堆栈增长方向 虽然ARM处理器可以支
49、持堆栈向上增长,也可以支持堆栈向下增长,但是ADS的C语言编译器仅支持一种方式,即从上往下增长。所以定义如下: #define OS_STK_GROWTH 1(1) OSTaskStkInit()OSTaskCreate()和OSTaskCreateExt()通过调用OSTaskStkInt()来初始化任务的堆栈结构。(2) 软件中断异常SWI服务程序C语言部分函数原型为void SWI_Exception(int SWI_Num,int *regs);参数SWI_Num为功能号,而Regs为指向堆栈中保存寄存器的值的位置。程序通过一个switch语句把各个功能分割开,各个功能相对独立。(3)
50、 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()COS-II使用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()分别关中断和开中断。在ARM处理器核中关中断和开中断时,通过改变程序状态寄存器CPSR中的相应位来实现。由于使用了软件中断,程序状态寄存器CPSR保存到程序状态保存寄存器SPSR中,软件中断退出时会将SPSR恢复到CPSR中,所以程序只要改变程序状态保存寄存器SPSR中的相应的控制位就可以了。(1) SoftwareInterrupt()这是软件中断的汇编接口,当发生软件中断时,程序通过异常向量表跳转到软中断的汇编与C接口程
51、序SoftwareInterrupt处。软件中断代码如下:LDR SP, StackSvc ; 重新设置堆栈指针STMFD SP!, R0-R3, R12, LRMOV R1, SP ; R1指向参数存储位置MRS R3, SPSRTST R3, #T_bit ; 中断前是否是Thumb状态LDRNEH R0, LR,#-2 ; 是: 取得Thumb状态SWI号BICNE R0, R0, #0 xff00LDREQ R0, LR,#-4 ; 否: 取得arm状态SWI号BICEQ R0, R0, #0 xFF000000; r0 = SWI号,R1指向参数存储位置CMP R0, #1LDRLO
52、 PC, =OSIntCtxSwLDREQ PC, =_OSStartHighRdy ; SWI 0 x01为第一次任务切换 BL SWI_ExceptionLDMFD SP!, R0-R3, R12, PCStackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)因为执行任务切换时堆栈指针会指向用户的堆栈,这样下一次进入管理模式就会破坏用户堆栈,从而导致程序执行不正确。所以程序在一开始设置堆栈指针。软中断指令使处理器进入管理模式,而用户程序处于系统用户模式,其它异常也有自己的处理器模式,都有各自的堆栈指针,不会因为给堆栈指针赋值而破坏其它处理
53、器模式的堆栈而影响其它程序的执行。返回的地址已经存储在连接寄存器LR中而不是存储在堆栈中。由于进入管理模式自动关中断,所以这段程序不会被其它程序同时调用,设置的堆栈指针指向的位置肯定是空闲位置,后一次调用不会影响前一次调用。这样就可以保证“LDR SP, StackSvc”进行正确的堆栈指针设置。(2) OSCtxSw()任务级的任务切换函数,当任务被阻塞而主动请求CPU调度时被执行,由于此时的任务切换在非异常模式下进行,因此有别于中断级别的任务切换。它的工作是先将当前的任务的CPU现场保存到该任务堆栈中。然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行。这样就
54、完成一次任务的切换。(3) OSIntCtxSw()中断级的任务切换,在时钟中断ISR中发现有高优先级任务等待时钟信号的到来,则在中断退出后并不是返回被中断的任务,而是直接调度就绪的高优先级任务执行(函数OSIntExit()被用来在ISR使得更高优先级的任务处于就绪态)。从而能够尽快让高优先级的任务得到响应,保证系统的实时性能。其基本原理与任务的切换相同。但是由于进入中断时已经保存了被中断的CPU现场,因此不用做类似的操作,只需对堆栈指针做相应调整。(4) OSStartHighRdy()C/OS-启动多任务环境的函数叫做OSStart()。用户在调用OSStart()之前,必须已经建立了一
55、个或更多任务。OSStart()最终调用OSStartHighRdy()函数运行多任务启动前优先级最高的任务。由软中断的汇编接口SWI_Exception()与C接口程序SoftwareInterrupt()可知,这是调用软中断的1号功能。这是因为ARM处理器核具有两个指令集,在执行Thumb指令的状态时不是所有寄存器都可见,而且任务可能不在特权模式。为了兼容任意一种模式,本移植使用软中断指令SWI使处理器进入管理模式和ARM指令状态,并使用功能1实现OSStartHighRdy的功能。C/OS-中调用函数OSStartHighRdy()之前,OSTCBHighRdy指向的是优先级最高的任务的
56、任务控制块。_OSStartHighRdy代码如下: MSR CPSR_c, #(NoInt | SYS32Mode) LDR R4, =OSRunning MOV R5, #1 STRB R5, R4 BL OSTaskSwHook LDR R6, =OSTCBHighRdy LDR R6, R6 B OSIntCtxSw_1在C/OS-中,需要用户提供周期性信号源,用于实现时间延时和确认超时。必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。换句话说,在调用OSStart()之后做的第一件事是初始化定时器中断。通常,容易犯的错误是将允许时钟节拍器中断放在系统初始
57、化函数OSInit()之后,在调用启动多任务系统启动函数OSStart()之前允许时钟节拍中断。C/OS-的启动多任务函数OSStart()会在最后调用OSStartHighRdy,而SStartHighRdy的第一条语句MSR CPSR_c,#(NoInt|SYS32Mode),是将CPSR的第8位置1,允许IRQ中断。3.2.4 中断及时钟节拍(1) 中断句柄HANDLER中断句柄HANDLER可以容易的声明中断处理函数,如在IRQ.s文件中添加中断句柄 Uart0_Handler HANDLER UART0_IRQ,其中 UART0_IRQ是中断处理函数名,可以用语句VICVectAdd
58、r1=(uint32)Uart0_Handler;告知微处理器发生UART0中断时中断处理程序的地址。中断句柄HANDLER是通过宏定义实现的。(2) 中断程序框架 OS_ENTER_CRITICAL(); 清除中断源; 通知中断控制器中断结束;OS_EXIT_CRITICAL(); 用户处理代码;程序中的、是必需的,因为在中断发生之前一定是允许中断的,如果用户在程序之前调用C/OS-的系统服务函数,就很可能打开中断,而在系统没有清中断和/或没有执行的情况下就开中断就会造成芯片的中断系统工作异常而使程序工作异常。如果用户没有这种情况,则可以不要程序,而把程序用普通的方法打开中断。(3) 挂接S
59、WI软件中断通过在Startup.s中设置中断向量表的软件中断代码处添加程序LDR PC,SWI_Addr,并对SWI_Addr作如下定义:SWI_Addr DCD SoftwareInterrupt每当发生软件中断时,程序便跳转到软件中断的汇编接口程序,执行相应的程序。(4) 时钟节拍通过Timer0提供时钟节拍,Timer0中断处理程序如下:T0IR=0 x01;VICVectAddr=0; /通知中断控制器中断结束OSTimeTick();Timer0的匹配寄存器的设置是,T0MR0=(Fpclk/OS_TICKS_PER_SEC);即每1/OS_TICKS_PER_SEC秒发生一次中断
60、。3.3 信息解码程序设计3.3.1 NMEA-0183的协议标准本设计使用SRIFStarIII模块接收GPS定位信息,该模块遵循NMEA-0183 (National Marine Electronics Association即国际海洋电子协会)协议标准。以下分别列出NMEA-0183协议标准的输出数据格式中的RMC、GGA、GSA。RMCRecommended Minimum Specific GNSS Data Example: $GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.6 2,12 0 598, ,*10nameex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 赣南师范大学科技学院《免疫学实验》2023-2024学年第一学期期末试卷
- 赣东学院《母婴中医护理学》2023-2024学年第一学期期末试卷
- 七年级生物上册第二单元第二章第一节细胞通过分裂产生新细胞教案新版新人教版
- 七年级语文上册单元清三新人教版
- 三年级科学上册第一单元科学在我们身边第二课我们周围的动物教案青岛版
- 甲流乙流培训课件
- 雪佛兰销售培训课件
- 培训课件包教学课件
- 《抗菌药物概论课件》课件
- 小学生比赛课件模板
- 水电站生态环境影响评估
- 2024车载定位系统技术要求及试验方法 第1部分:卫星定位
- 吉林省白山市抚松县2023-2024学年部编版八年级上学期期末测试历史试卷
- 全过程工程咨询服务服务质量保障方案
- 四年级数学(四则混合运算)计算题专项练习与答案
- 改革开放史智慧树知到期末考试答案2024年
- 低压电工常识及安全用电
- 2024五凌电力限公司招聘5人高频考题难、易错点模拟试题(共500题)附带答案详解
- 五年级上册数学脱式计算300题及答案
- 市政公司3年战略规划方案
- 2024年全国中考英语试单选(动词时态)
评论
0/150
提交评论