畢業設計(論文)基于arm的gps定位信息顯示器的軟件設計_第1頁
畢業設計(論文)基于arm的gps定位信息顯示器的軟件設計_第2頁
畢業設計(論文)基于arm的gps定位信息顯示器的軟件設計_第3頁
畢業設計(論文)基于arm的gps定位信息顯示器的軟件設計_第4頁
畢業設計(論文)基于arm的gps定位信息顯示器的軟件設計_第5頁
已閱讀5頁,還剩48頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論