版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、UOSii在ARM7 LPC2132上移植雷海華摘要:近年來,在單片機系統(tǒng)中嵌入操作系統(tǒng)已經(jīng)成為人們越來越關心的一個話題,但很多軟件是收費的,由于u C / O S 是一種免費公開源代碼、結構小巧、具有可剝奪實時內核的實時操作系統(tǒng),因而被使用頻繁。本文通過對LPC2132硬件和源碼公開的嵌入式實時操作系統(tǒng)ucos ii的分析,以lpc2132單片機為例,闡述了在單片機中移植ucosii,來運行多個任務,如測量當時的溫度,用液晶顯示,然后用傳到PC機上,當溫度過高,蜂鳴器自動報警等任務的運行,達到模擬PC機CPU溫度過高自動關機,來說明ucosii移植的優(yōu)缺點,以及在移植中應注意的問題,啟動代碼
2、的理解,解析代碼的優(yōu)化.關鍵字:硬件 編程 嵌入式 實時 ARM7Research and implementation of RtKernel uC/OS-II to ARM7 LPC2132Lei HaihuaAbstract: In recent years, single chip embedded operating system has become a topic of growing concern, but many of the software for a fee, since u C / OS is a free open source, compact structu
3、re, with real-time kernel can be deprived of real-time operating system, which is used frequently. Based on the LPC2132 hardware and open source operating system for embedded real-time analysis of ucos ii to lpc2132 microcontroller, for example, described in MCU transplantation ucosii, to run multip
4、le tasks, such as measuring the temperature at the time, with a liquid crystal display, and then PC, with the spread, when the temperature is too high, the sound operation of automatic alarm and other tasks, PC-CPU to simulate high temperature shut down automatically to show the advantages and disad
5、vantages ucosii transplantation, and transplantation should pay attention to the problem, start understanding the code, parse the code optimization.Keywords: Hardware Pprograming EC Real-time ARM7 目 錄第一章 引言及ARM芯片11.1 Acorn RISC機器歷史11.2 Arm內核31.2.1 Arm的編程模型61.2.2 控制邏輯121.2.3 啟動代碼理解121.3 Arm代碼優(yōu)化15第二章
6、UCOS ii202.1 ucosii分析202.1.1 任務運行222.1.2 任務通信262.1.3 內存動態(tài)分配332.2C/OS- 的測試34第三章 ucosii在arm上的移植363.1與cpu有關的文件363.1.1 OS_CPU.H363.1.2 OS_CPU_C.C373.1.3 OS_CPU_A.S393.2移植代碼實現(xiàn)40第四章 結束語52參考文獻:53附圖:54附圖1 本設計完整電路圖:54附圖2 PCB布線情況:55附圖3 頂層布線情況:56附圖4 底層布線情況:57附圖5 UCOS在vc6.0上運行結果:58附表6 元件清單:59第一章 引言及ARM芯片l 早在20世
7、紀60年代,就已經(jīng)有人開始研究和開發(fā)嵌入式操作系統(tǒng)。但直到最近,它才在國內被越來越多的提及,在通信、電子、自動化等需要實時處理的領域所曰益顯現(xiàn)的重要性吸引了人們越來越多的注意力。但是,人們所談論的往往是一些著名的商業(yè)內核,諸如VxWorks、PSOS等。這些商業(yè)內核性能優(yōu)越,但價格昂貴,主要用于16位和32位處理器中,針對國內大部分用戶使用的risc系列8/16/32位單片機,可以選擇免費的ucos ii。通過在LPC2132上移植移植ucosii,移植bootload,ucosii的遠行原理。在原理的分析中,通過理論的學習,理論結合實際,通過制作和調試實驗板,其中多次用到單一分析法,單一調試
8、各個分支,然后系統(tǒng)綜合所有任務,完成整個系統(tǒng)遠行。論文第一章主要介紹lpc2132硬件結構和代碼的編寫;第二章討論ucosii代碼結構;第三章分析ucosii在arm板上的移植。1.1 Acorn RISC機器歷史第一個ARM處理器是1983年10月-1985年4月間在英國劍橋Acorn Computer公司開發(fā)的。1985年4月26日,第一個ARM原型在英國劍橋的Acorn計算機有限公司誕生,由美國加州SanJoseVLSI技術公司制造。20世紀80年代后期,ARM很快開發(fā)成Acorn的臺式機產(chǎn)品,形成英國的計算機教育基礎。那時候ARM代表Acorn RISC Machine公司,并一直持續(xù)
9、到Advanced RISC Machine limited(后來將名稱簡化為ARM Limited)。1990年成立了Advanced RISC Machines Limited(后來簡稱為ARM Limited,ARM公司)。ARM 即Advanced RISC Machines的縮寫,既可以認為是一個公司的名字,也可以認為是對一類微處理器的通稱,還可以認為是一種技術的名字。以后的ARM2具有32位的數(shù)據(jù)總線、26位的尋址空間,并提供64 Mbyte的尋址范圍與16個32-bit的暫存器。這些暫存器其中有一顆做為(word大?。┏淌接嫈?shù)器,其前面6 bits和后面2 bits用來保存處理器
10、狀態(tài)標記(Processor Status Flags)。ARM2可能是全世界最簡單實用的32位微處理器,其僅容納了30,000個晶體管。而與現(xiàn)今大多數(shù)的 CPU 不同,它沒有包含任何的高速緩存。20世紀90年代,ARM 32位嵌入式RISC(Reduced lnstruction Set Computer)處理器擴展到世界范圍,占據(jù)了低功耗、低成本和高性能的嵌入式系統(tǒng)應用領域的領先地位。設計了大量高性能、廉價、耗能低的RISC處理器、相關技術及軟件。技術具有性能高、成本低和能耗省的特點。適用于多種領域,比如嵌入控制、消費/教育類多媒體、DSP和移動式應用等。ARM將其技術授權給世界上許多著名
11、的半導體、軟件和OEM廠商,每個廠商得到的都是一套獨一無二的ARM相關技術及服務。利用這種合伙關系,ARM很快成為許多全球性RISC標準的締造者。ARM架構是面向低預算市場設計的第一款RISC微處理器。ARM公司既不生產(chǎn)芯片也不銷售芯片,它只出售芯片技術授權。基于 ARM 技術的微處理器應用約占據(jù)了 32 位 RISC 微處理器 75 以上的市場份額, ARM 技術正在逐步滲入到我們生活的各個方面。ARM是微處理器行業(yè)的一家知名企業(yè),目前,總共有30家半導體公司與ARM簽訂了硬件技術使用許可協(xié)議,其中包括Intel、IBM、LG半導體、NEC、SONY、PHILIPS和國民半導體這樣的大公司。
12、至于軟件系統(tǒng)的合伙人,則包括微軟、升陽和MRI等一系列知名公司。世界各大半導體生產(chǎn)商從ARM公司購買其設計的 ARM 微處理器核,根據(jù)各自不同的應用領域,加入適當?shù)耐鈬娐罚瑥亩纬勺约旱?ARM 微處理器芯片進入市場。ARM 是當前嵌入式領域最廣泛使用的微處理器。ARM 芯片種類很多,都是采用英國ARM公司(前身是Acorn 公司)設計并授權的RISC 內核, ARM 內核的微處理器從ARM7 到最新的ARM11 等,具有高性能、低價格、通用性好等特點。最常見的是ARM7 和ARM9 這兩個系列,ARM7 通常用于低成本方案,ARM9 通常用于性能要求較高的方案。各廠家根據(jù)自己的目標不同,在
13、ARM 內核的基礎上擴充了不同的協(xié)處理器、外圍接口等,方便嵌入式產(chǎn)品的設計。ARM 系列的微處理器已經(jīng)完全不同于8位單片機時代的微處理器,性能提高很大,價格并不高,而軟件系統(tǒng)的通用性相對單片機環(huán)境要好很多,開發(fā)模式也有極大改善。ARM7 是3 級流水線RISC 內核,以MIPS(百萬指令處理每秒)表示的ARM7 運算能力指標的計算公式是主頻 x 0.9,也就是說平均一條指令的執(zhí)行只需要一個時鐘周期略多一點的時間,約20ns(50MHz 主頻條件下)。5 級流水線RISC 內核的ARM9 MIPS 指標計算公式是主頻 x 1.1,也就是說一條指令的執(zhí)行平均不到一個時鐘周期就可以完成。50MHz
14、主頻的ARM7芯片的MIPS 指標約為45MIPS(參見具體處理器的數(shù)據(jù)手冊),該指標已經(jīng)超過i486 的性能指標。這也是uCLinux 等從PC 環(huán)境的操作系統(tǒng)衍生來的系統(tǒng)能夠在ARM7 這類微處理器上流暢運行的原因。通常這些ARM 芯片內還包含了網(wǎng)絡等極為豐富的外設,而價格卻非常低。而主頻能達到200-400MHz 的ARM9 系列微處理器,性能已經(jīng)超過i586(Pentium),外設更加豐富,性價比更好。1.2 Arm內核ARM模塊表如下:圖1.1 ARM模塊示圖一個簡單的處理器可以由一些基本的部件構成,即:*程序計數(shù)器(PC)寄存器:用來保存當前指令的地址;*累加器(ACC)寄存器:用
15、來保存正在處理的數(shù)據(jù);*算術邏輯單元(ALU):可以對二進制操作數(shù)進行若干操作,如加、減、增值等;*指令寄存器(IR):保存當前執(zhí)行的指令;*指令譯碼器和控制邏輯:塔根據(jù)指令控制上述部件、產(chǎn)生所需的結果。一個處理器還有它自身的指令集,ARM就用精簡指令集計算機(RISC,Reduced Instruction Set Computer),把簡單的硬件和指令集結合起來,RISC具有這些優(yōu)點:1.流水線:這是實現(xiàn)并行操作的最簡單行式2.高時鐘頻率和單周期執(zhí)行:RISC結構簡單,它可以工作在較高的時鐘頻率,充分使用已有的存儲器帶寬。實際處理器中,外設掛在外設總線上,外設總線和系統(tǒng)總線之間有一個“橋”
16、,這個橋實際上就是一個硬件FIFO,用于兩邊交流信息和指令。如果僅僅是簡單的編程情況下,按照上圖的邏輯結構理解ARM7 處理器即可,但是在重要的內核組件代碼中,則要仔細考慮外設總線和系統(tǒng)總線之間的數(shù)據(jù)傳遞問題。FIFO 是一種異步通訊的方式,這也是ARM 微處理器資料中談到的虛假(spurious)中斷產(chǎn)生的原因。橋接器在嵌入式處理器中很常見,PC 類的處理器中通常沒有這類結構,而是在主板中設計橋接。例如讀者可能在PC 主板中經(jīng)常見到南橋、北橋的概念,就是此處橋接器的類似對應物。嵌入式處理器通常是在一個芯片內部集成了多種常用外設,也就是說如果用PC 環(huán)境來理解嵌入式環(huán)境,它的對應物實際上應該是
17、包括主板及板上設備在內的整個PC 機。當然這種對應關系僅僅是一個粗略的為了方便理解的大致描述,實際情況要復雜很多。這種FIFO 異步橋接結構是嵌入式處理器常見結構,并非ARM 處理器獨有,因此虛假中斷問題在嵌入式處理器中也是常見需要處理的現(xiàn)象。只是虛假中斷出現(xiàn)的比例并不高,通常要在壓力測試情況下,存在很高中斷頻率的時候才能比較明顯地觀察到。而且和具體設備相關,通常都要經(jīng)受10 萬千萬次的中斷沖擊才會出現(xiàn)一次。但是在壓力測試條件下,這種中斷沖擊并不難達到,可能10 分鐘1 小時的測試就能觀察到一次?;蛘咴诜菈毫y試的正常運作中,長時間運行之后偶爾出現(xiàn)?,F(xiàn)在討論處理器內部的大致邏輯結構,從邏輯上看
18、,采用ARM 處理的系統(tǒng),包括如圖1.2所示幾個部分:1.處理器:處理器是核心運算模塊,可以工作在多種模式、狀態(tài)下。寄存器CPSR 標記處理器的當前狀態(tài)、模式值;2. 寄存器:寄存器通??梢灶惐葂86 CPU 中的EAX,EBX,ECX 等寄存器,是在指令集中可以直接訪問的單元,包括最重要的保存當前狀態(tài)的寄存器 CPSR,保存?zhèn)浞轄顟B(tài)的寄存器SPSR,以及保存程序運行數(shù)據(jù)的寄存器R0R15。計算單元處于不同模式時訪問的寄存器并不完全相同。R0R15 中,又以PC(R15) 、LR(R14)、SP(R13)最為關鍵;3. SFR 寄存器:SFR 寄存器從軟件角度上來說是位于一些特定內存地址的數(shù)據(jù)
19、塊。不同于上面所說的寄存器,訪問時必須像訪問內存那樣訪問。但是SFR 和普通內存最大的不同是對它們的改寫可能會引起微處理器行為、特性等的變化。處理器的變化、環(huán)境設備的變化等也會在這些SFR 中體現(xiàn)。每種ARM7 微處理器都有特定的SFR,只是名稱、具體功能細節(jié)等可能不同。通常SFR 位于系統(tǒng)總線側;4.設備寄存器:多數(shù)ARM 自帶設備是由SFR 代表的,用其它外圍芯片構造的設備也同樣映射到內存地址上。起到設備控制作用的設備寄存器的讀寫可能會引起設備行為、特性的變化,數(shù)據(jù)性質的設備寄存器讀寫通常不會影響設備的行為。通常設備寄存器位于外設總線側,通常編程不必理解系統(tǒng)SFR 與設備SFR 的不同,但
20、是在處理虛假中斷問題時必須理解兩者的不同;5.RAM:RAM 通常是外掛的內存芯片模塊,但是現(xiàn)在有一些微處理器內部本身帶有一些高速RAM,稱為SRAM,用于提高系統(tǒng)整體性能,通常用作高速緩沖(cache)或其它訪問速度要求較高的數(shù)據(jù)緩沖(buffer)。RAM 也是映射到內存地址進行訪問的,但是不同于SFR 的地方是和微處理器沒有密切關系,改寫其內容不會直接導致微處理器行為的變化,通常也不會引起設備行為的變化;6.ROM:ROM 通常用于保存系統(tǒng)代碼,通電后代碼被拷貝到RAM 中運行,有的方案讓代碼直接在ROM 中運行。大批量生產(chǎn)的產(chǎn)品為節(jié)省成本可能采用只寫一次的ROM。通常嵌入式開發(fā)中最常使
21、用的ROM 是Flash(實際上是一種RAM,通常當作ROM),F(xiàn)lash 可以通過程序多次改寫,非常方便產(chǎn)品調試、代碼升級,基本上已經(jīng)是嵌入式產(chǎn)品中的標準配置,價格也不高。有一些微處理器帶有片內Flash,片內Flash 甚至可能高達512K。通常片內Flash 比外擴Flash 速度高,并且具有保護代碼不被拷貝的作用。中小型嵌入式產(chǎn)品采用片內Flash配合片內Ram,基本上不用外擴內存即可滿足代碼運行的需求;7.協(xié)處理器:ARM7 通常不帶協(xié)處理器。在ARM 微處理器領域最常見的兩種協(xié)處理器是做內存保護和管理用的MMU,以及做浮點運算或乘除法運算用的算術協(xié)處理器。ARM9 及以上系列的微處
22、理器通常帶有這兩種協(xié)處理器。圖1.2 處理器的基本結構這些部件中寄存器、SFR 和設備寄存器最為關鍵,掌握這三部分的用法,基本上就可以在ARM 環(huán)境下自如地編寫程序。在內核代碼中主要考慮的就是寄存器、SFR 寄存器,在設備驅動代碼中主要考慮的是設備內部的寄存器。寄存器中最重要的是CPSR。但它的代碼密度低,不能執(zhí)行x86代碼:很難和IBM PC兼容。1.2.1 Arm的編程模型當前程序狀態(tài)寄存器(CPSR):當編寫用戶程序時,僅有15個通用32位寄存器(r0r14)、程序計數(shù)器(r15)和當前程序狀態(tài)寄存器(CPSR)需要考慮,其余寄存器僅用于系統(tǒng)編程和異常處理(如中斷)。圖1.3 ARM寄存
23、器在匯編語言中寄存器R0R13為保存數(shù)據(jù)或地址值的通用寄存器。它們是完全通用的寄存器,不會被體系結構作為特殊用途,并且可用于任何使用通用寄存器的指令。其中R0R7為未分組的寄存器,也就是說對于任何處理器模式,這些寄存器都對應于相同的32位物理寄存器。寄存器R8R14為分組寄存器。它們所對應的物理寄存器取決于當前的處理器模式,幾乎所有允許使用通用寄存器的指令都允許使用分組寄存器。寄存器R8R12有兩個分組的物理寄存器。一個用于除FIQ模式之外的所有寄存器模式,另一個用于FIQ模式。這樣在發(fā)生FIQ中斷后,可以加速FIQ的處理速度。寄存器R13、R14分別有6個分組的物理寄存器。一個用于用戶和系統(tǒng)
24、模式,其余5個分別用于5種異常模式。寄存器R13常作為堆棧指針(SP)。在ARM指令集當中,沒有以特殊方式使用R13的指令或其它功能,只是習慣上都這樣使用。但是在Thumb指令集中存在使用R13的指令。 R14為鏈接寄存器(LR),在結構上有兩個特殊功能:在每種模式下,模式自身的R14版本用于保存子程序返回地址;當發(fā)生異常時,將R14對應的異常模式版本設置為異常返回地址(有些異常有一個小的固定偏移量),如圖1.3。lr(R14)寄存器注意要點:當發(fā)生異常嵌套時,這些異常之間可能會發(fā)生沖突。例如:如果用戶在用戶模式下執(zhí)行程序時發(fā)生了IRQ中斷,用戶模式寄存器不會被破壞。但是如果允許在IRQ模式下
25、的中斷處理程序重新使能IRQ中斷,并且發(fā)生了嵌套的IRQ中斷時,外部中斷處理程序保存在R14_irq中的任何值都將被嵌套中斷的返回地址所覆蓋。 解決辦法是確保R14的對應版本在發(fā)生中斷嵌套時不再保存任何有意義的值(將R14入棧),或者切換到其它處理器模式下。r14)的作用問題,這個lr一般來說有兩個作用:當使用bl或者blx跳轉到子過程的時候,r14保存了返回地址,可以在調用過程結尾恢復;異常中斷發(fā)生時,這個異常模式特定的物理R14被設置成該異常模式將要返回的地址。另外注意pc,在調試的時候顯示的是當前指令地址,而用mov lr,pc的時候lr保存的是此指令向后數(shù)兩條指令的地址,大家可以試一下
26、用mov pc,pc,結果得到的是跳轉兩條指令,這個原因是由于arm的流水線造成的,預取兩條指令的結果.寄存器R15為程序計數(shù)器(PC),它指向正在取指的地址??梢哉J為它是一個通用寄存器,但是對于它的使用有許多與指令相關的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結果將是不可預測的。寄存器CPSR為程序狀態(tài)寄存器,在異常模式中,另外一個寄存器“程序狀態(tài)保存寄存器(SPSR)”可以被訪問。每種異常都有自己的SPSR,在因為異常事件而進入異常時它保存CPSR的當前值,異常退出時可通過它恢復CPSR。CPSR在用戶編程時用于存儲條件碼,如可以用來記錄比較操作的結果和控制條件轉移時是否發(fā)
27、生。在大多數(shù)情況下有一個簡單的條件測試,不需要計算出條件碼的精確值即可得到需要的結果。圖1.4 CPSR結構簡圖位 7 6 5 4 3 2 1 0代號 I:IRQ 屏蔽位F:FIQ 屏蔽位T:Thumb 代碼M:模式,如圖1.4。狀態(tài)寄存器的M0M4 位:表示處理器模式,包括SVC、USR、ABT、UND、IRQ、FIQ、SYS 等模式。CPSR 的模式、狀態(tài)等位會根據(jù)ARM 處理器自身運行狀態(tài)改變,也可以通過代碼進行設置。SVC 模式通常是操作系統(tǒng)內核代碼運行的模式,USR 通常是用戶代碼運行模式。處理器一旦進入USR 模式,必須通過SWI 異常中斷才能進入SVC 模式調用內核代碼的接口。但
28、是在沒有MMU 做內存保護的情況下,USR 模式也能訪問到SVC 模式的內存空間,因此用USR 隔離用戶級代碼的沒有意義。在UCOS-II、uRtos V1.0 內核中主要代碼在SVC 模式下運行,其他代碼也都不是在USR 模式下,移植中不應該考慮USR 模式。ABT/UND 模式是真正的“異常”,通常的處理是在提示簡單的系統(tǒng)錯誤信息(以便調試)后立即復位系統(tǒng)。對于具備MMU 協(xié)處理器并且采用了換頁方式的系統(tǒng),數(shù)據(jù)訪問異常不是真正的異常,而是內核對內存進行換頁調度的啟動器。對于設計了異常處理功能的系統(tǒng),指令異常也不是簡單復位處理的,通常是進入異常處理過程,涉及到堆?;貪L等等方面的問題。IRQ/
29、FIQ 模式是在微處理器收到中斷信號后強制處理器進入的模式,用于中斷處理。SYS 模式用于嵌套中斷處理。一些關于ARM7 編程指南中,認為SYS 模式是用于特權的操作系統(tǒng)代碼運行模式,這種看法是錯誤的。一些ARM 開發(fā)工程師沒有注意到SYS 模式的正確使用方式,它的主要用途就是嵌套式中斷。ARM 在被IRQ/FIQ 中斷信號中斷的時候自動改寫IRQ/FIQ 模式中的LR(也就是R14寄存器),LR 記錄的是被中斷的模式中運行的代碼位置計數(shù)器,以便退出中斷時能夠回到原來模式的原來代碼的位置。同時LR 也是每個模式下函數(shù)調用的返回代碼位置計數(shù)器。也就是說LR 寄存器具有保存函數(shù)和中斷返回位置兩種功
30、能。如果用IRQ/FIQ 模式嵌套中斷自身,則本模式的LR 被改寫后,本模式下原有的函數(shù)返回代碼位置計數(shù)器數(shù)據(jù)就無法還原。因此應該在關閉中斷的條件下,在IRQ/FIQ 模式中進行基本的環(huán)境準備后,讓ISR 切換到SYS 模式下運行。這種處理方式保證產(chǎn)生嵌套中斷的時候,被中斷的模式是SYS 而不是IRQ/FIQ 模式自身,IRQ/FIQ 模式中的LR 保存著回到SYS 模式的代碼位置,SYS 模式下LR 未被破壞,保存著函數(shù)返回用的代碼位置。需要注意的是,SYS、USR 模式的切換涉及到SWI 功能的應用。簡單移植中不使用USR、SYS 兩種模式。但是為了完成嵌套中斷,可以使用UND 模式替代S
31、YS 模式作為中斷的運行模式。在沒有MMU 的ARM7 條件下,正如前面討論不必使用USR 模式一樣,采用SYS、SWI 等功能,僅僅是帶入了復雜性,而沒有其他的好處。而且UND 模式在沒有協(xié)處理器的ARM7 中,同樣沒有用武之地,正好可以拿來替代SYS 模式使用。本書中多數(shù)描述中如果涉及到SYS 模式、嵌套中斷等情況下,沒有區(qū)別SYS/UND 兩種模式。狀態(tài)寄存器的I/F/T 位:表示處理器狀態(tài),表示屏蔽IRQ 中斷、屏蔽FIQ 中斷、Thumb。Thumb 代碼是16 位的,主要作用是提高代碼的功能密度。Thumb 代碼最好的應用環(huán)境是一些有大量算法處理的代碼,在操作系統(tǒng)內核一類的代碼中用
32、處不大。Thumb 代碼在32 位存儲器環(huán)境下,比ARM 代碼會降低一點執(zhí)行效率。但如果是16 位存儲器條件下,Thumb 代碼實際上比ARM 代碼效率還會高一些,因為16 位存儲器環(huán)境下,微處理器讀取32 位代碼是分兩次進行的。這種特征導致小型應用采用Thumb 代碼有一個關鍵的優(yōu)勢就是可以很高效地直接在Flash 中運行,因為性價比最好的片外Flash 存儲器通常都是16 位的。這種方式,加上微處理器通常都自帶有一些SRAM,系統(tǒng)不必配置RAM 就可以運行。這樣可以大量降低成本,并且不顯著影響效率。當然,對于有一定規(guī)模的應用來說,典型的執(zhí)行環(huán)境還是在32 位的RAM 中執(zhí)行,這種時候,Th
33、umb 代碼是有一點效率上的損失的。本書中給出的代碼都是32 位ARM 環(huán)境下執(zhí)行,沒有考慮Thumb 代碼的情況,讀者如果有需要可以自行解決這方面的問題。通常C 語言的代碼比較好處理,編譯器可以直接將代碼編譯成Thumb 代碼,匯編部分需要更多仔細編寫,特別是在子函數(shù)調用、任務切換等等環(huán)節(jié)。存儲器系統(tǒng):ARM系統(tǒng)還有存儲器狀態(tài),它可以看作是序號為0232-1的線性字節(jié)陣列。數(shù)據(jù)項可以是8位字節(jié)、16位半字和32位字??偸且?字節(jié)的邊界對準,就是最低二位的地址為,半字則以偶數(shù)字節(jié)的邊界對準。下面給出arm的小端格式圖:圖1.5 ARM小端格式3.LOAD-STORE體系結構A數(shù)據(jù)處理指令。這類
34、指令只能使用和改變寄存器中的值;B數(shù)據(jù)傳送指令。這類指令把存儲器的值拷貝到寄存器(load)或把寄存器的值拷貝到存儲器(store);另一種僅在系統(tǒng)代碼中有用,即交換存儲器和寄存器的值;C控制流指令。一般指令在執(zhí)行時使用存儲于連續(xù)的存儲器地址中的指令。塊拷貝尋址,LOAD-STORE指令集匯總如圖1.6:圖1.6 LOAD-STORE指令集4.監(jiān)控模式ARM支持被保護的監(jiān)控模式。代碼未經(jīng)適當檢查,確保不會執(zhí)行非法操作,那么就不能進入監(jiān)控特權。對于用戶級程序員,只能通過監(jiān)護調用,才能訪問系統(tǒng)級函數(shù),這些函數(shù)可以對外圍硬件的訪問和廣泛使用的操作,并處理與程序外部有關的事務。只要程序需要輸出或輸入,
35、如把一些文本送到顯示器,通常調用監(jiān)控程序,監(jiān)控程序時一個運行于特權級別的程序,它提供聊委托訪問系統(tǒng)資源的方式,對用戶級程序,更像一個專門的子程序入口。指令集包含一個專門的指令SWI,用來調用這類功能。SWI代表軟件中斷,但人們通常將它視為“監(jiān)控程序調用”。由于它是在系統(tǒng)軟件中實現(xiàn)的,從一個ARM系統(tǒng)到另一個系統(tǒng)的監(jiān)控程序調用可能會完全不同。圖1.7 24位立即數(shù)如果條件通過,則指令使用標準的ARM異常入口程序進入監(jiān)控模式,SWI后面指令的地址保存到r14_svc,將CPSR保存到SPSR_svc,然后將CPSR4:0設置為100112和將CPSR7設置為1,以便禁止IRQ,再將PC設置為081
36、0,并且從哪里開始執(zhí)行指令。1.2.2 控制邏輯1.決定何時激活RAM及何時激活ROM控制邏輯決定系統(tǒng)存儲器的映射。復位后處理器從0地址開始。由于RAM還沒有初始化,所以它肯定會找到ROM。因此,最簡單的存儲器映射是當A31為低時使能ROM,為高時使能RAM(大多數(shù)ARM系統(tǒng)在啟動后立即改變存儲器映射,將RAM放在存儲器的低地址處以便使異常向量可以修改)。 2.在寫操作時控制字節(jié)寫使能信號進行字寫操作時,使能所有字節(jié)信號;進行半字時,使能其中的二個;字節(jié)時,使能對應的字節(jié)。3.AMBA總線 AHB用于連接高性能系統(tǒng)模塊。支持突發(fā)數(shù)據(jù)傳送方式及單個數(shù)據(jù)傳送方式,所有時序都以單一時鐘的沿為基準;A
37、SB用于連接高性能系統(tǒng)模塊,支持突發(fā)數(shù)據(jù)傳送模式;APB為低性能的外圍部件提供接口。連接如圖1.8所示:圖1.8 總線結構1.2.3 啟動代碼理解所謂啟動代碼,就是處理器在啟動的時候執(zhí)行的一段代碼,主要任務是初始化處理器模式,設置堆棧,初始化變量等等.由于以上的操作均與處理器體系結構和系統(tǒng)配置密切相關,所以一般由匯編來編寫。具體到LPC2132的啟動代碼分成兩部分:一是與ARM7TDMI內核相關的部分,包括處理器各異常向量的配置,各處理器模式的堆棧設置,如有必要,復制向量到RAM,以便remap之后處理器正確處理異常,初始化數(shù)據(jù)(包括RW與ZI),最后跳轉到Main;二是與處理器外部設備相關的
38、部分,這和廠商的聯(lián)系比較大.雖然都采用了ARM7TDMI的內核,但是不同的廠家整合了不同的片上外設,需要不同的初始化,其中比較重要的是初始化WDT,初始化各子系統(tǒng)時鐘,有必要的話,進行remap.這一部分與一般控制器的初始化類似。圖1.9 ADS中startup.s文件模塊ADS中startup.s文件模塊如圖1.9。程序見附表清單程序1。IRQ.S文件用于管理IRQ中斷嵌套,可通過宏實現(xiàn),一般很少用,代碼見程序1,處理流程如圖1.10所示:圖1.10 IRQ.S文件處理流程Target.c文件包含和目標板初始化相關的代碼,如Remap設置、系統(tǒng)時鐘設置和存儲器加速模塊設置等,以及IRQ和FI
39、Q的異常處理空函數(shù),模塊框如圖1.11:圖1.11 Target.c文件結構Config.h包含一些類型定義和系統(tǒng)時鐘定義,如下:Target.h包含一些特殊定義和開關IPQ中斷、FIQ中斷的函數(shù)聲明,如下:INCLUDE.armirq.inc; Inport the head file 引入頭文件CODE32AREA IRQ,CODE,READONLY;/* 以下添加中斷句柄,用戶根據(jù)實際情況改變 */;/* Add interrupt handler here,user could change it as needed */;/*中斷*/;/*Interrupt*/IRQ_Handler
40、HANDLER IRQ_Exception;/*定時器0中斷*/;/*Time0 Interrupt*/Timer0_Handler HANDLER Timer0_ExceptionENDLPC2132復位后啟動代碼工作流程如下7:1.3 Arm代碼優(yōu)化32位ARM處理器的指令集支持有符號/無符號的8位、16位、32位整型和浮點型變量類型。按照作用范圍的不同,C語言的變量可以劃分為全局變量和局部變量。ARM編譯器通常將全局變量定位在存儲空間中,局部變量分配給通用寄存器。在默認的情況下,armcc是全部優(yōu)化功能有效的,而GNU編譯器的默認狀態(tài)下優(yōu)化都是關閉的。ARM C編譯器中定義的char類型
41、是8位無符號的,有別于一般流行的編譯器默認的char是8位有符號的。所以循環(huán)中用char變量和條件 i 0時,就會出現(xiàn)死循環(huán)。為此,可以用fsigned char(for gcc)或者zc(for armcc)把char改成signed。變量類型如下: char 無符號8位字節(jié)數(shù)據(jù) short 有符號16位半字節(jié)數(shù)據(jù) int 有符號32位字數(shù)據(jù)long 有符號32位字數(shù)據(jù) long long 有符號64位雙字數(shù)據(jù) 在全局變量聲明時,需要考慮最佳的存儲器布局,使得各種類型的變量能以32位的空間位基準對齊,從而減少不必要的存儲空間浪費,提高運行效率。如: 這里定義的四個變量形式相同,只是次序不同,
42、卻導致了在最終映像中不同的數(shù)據(jù)布局,如下圖所示。顯然第二種方式節(jié)約了更多的存儲器空間。 圖1.12 數(shù)據(jù)存儲結構 另外對于表達式的處理也要格外小心,如下例子: short checksum_v3(short * data) unsigned int i; short sum = 0; for(i = 0; i < 64 ; i+) sum = (short)( sum + data ); /這里表達式式整形的,所以返處理非32位數(shù)據(jù)時, /要小心處理數(shù)據(jù)類型的轉換。 /原來shortshortint 但 int intint。奇怪的處理 return sum; 同時如上例的程序所示,這樣
43、在循環(huán)體中的每次運算都要進行類型轉換,會降低程序的效率,可以先把其當作int來運算,然后再返回一個short類型。 同時,由于處理的data是一個short型數(shù)組,用LDRH指令的話,不能使用桶型移位器,所以只能先進行偏移量的以為操作,然后再尋址,也會造成不佳的性能。解決的方法是用指針代替數(shù)組操作。如下: short checksum_v4(short * data) unsigned int i; int sum = 0; for( i = ; i<64; i+) sun += ( data +); return (short) sum; 對于局部變量,要盡量不使用32位以外的變量類型
44、。當一個函數(shù)的局部變量數(shù)目不多時,編譯器會把局部變量分配給內部寄存器,每個變量占一個32位的寄存器。這樣short和char類型的變量不但起不到節(jié)省空間的作用,反而會耗費更多的指令周期來完成short和char的存取操作。C語言代碼及其編譯結果如下所示1: C編譯器必須逐字逐句地把C程序轉換成匯編程序,這樣編譯器就不會漏掉所有可能的輸入。實際上,許多輸入組合是不可能的或不會出現(xiàn)的。數(shù)據(jù)類型有8位或者16位數(shù)據(jù),但在裝載或存儲之前,先擴展成32位。無符號數(shù)把0作為擴展位。因此int格式數(shù)據(jù)無須花費多余的時間,來進行位擴展。同時8位和16位必須放到寄存器的低8位或低16位。而一個int或更小類型的
45、傳送,存儲時就不需要花費額外的指令時間了。因此,局部變量應盡可能用32位的數(shù)據(jù)類型int和long,即使在處理8位和16位的數(shù)值時,應避免使用char和short數(shù)據(jù)類型作為局部變量。唯一例外情況是,需要使用char和short類型的數(shù)據(jù)溢出歸零特性時,如模運算255+1=0,就需要使用char類型。函數(shù)參數(shù)和返回值應盡量使用int類型。 另外,對于調用頻率較低的全局變量,盡量使用小的數(shù)據(jù)類型以節(jié)省空間2。循環(huán)是程序設計中非常普遍的結構。在嵌入式系統(tǒng)中,微處理器執(zhí)行時間在循環(huán)中運行的比例較大,因此關注循環(huán)的執(zhí)行效率是非常必要的。除了在保證系統(tǒng)正確工作的前提下盡量簡化核循環(huán)體的過程以外,正確和高
46、效的循環(huán)結束標志條件也非常重要。按照以上所述的“與0比較”原則,程序中的循環(huán)結束條件應該是“減到0”的循環(huán),結束條件盡量簡單。應盡可能在關鍵循環(huán)中采取上述的判斷形式,這樣可以在關鍵循環(huán)中省去一些不必要的比較語句,減少不必要的開銷,提高性能。如下面二個示例1: fact1和fact2中通過定義局部變量a來減少對n的load/store操作。fact2函數(shù)遵循了“與0比較”原則,省去了fact1編譯結果中的比較指令,并且,變量n在整個循環(huán)過程不參與運算,也不需要保存。由于省去了寄存器分配,從而給其他部分程序的編譯帶來了方便,提高了運行效率。 “減到0”的方法同樣適用于while和do語句。如果一個
47、循環(huán)體只循環(huán)幾次,可以用展開的方法提高運行效率。當循環(huán)展開后,不需要循環(huán)計數(shù)器和相關的跳轉語句,雖然代碼的長度有所增加,但是得到了更高的執(zhí)行效率。C循環(huán)結構中的優(yōu)化,使用減數(shù)到零的循環(huán)體,以節(jié)省指令和寄存器的使用。使用無符號的循環(huán)計數(shù)值,并用條件 i != 0中止;如果循環(huán)體至少執(zhí)行一次,用優(yōu)先選用dowhile;適當情況下展開循環(huán)體; 盡量使用數(shù)組的大小是4或8的備述,用此倍數(shù)展開循環(huán)體 寄存器分配;盡量限制函數(shù)內部循環(huán)所用局部變量的數(shù)目,最多不超過12個,以便編譯器能把變量分配到寄存器;可以引導編譯器,通過查看是否屬于最內層循環(huán)的便賴寧嘎來去定某個變量的重要性。 函數(shù)調用中優(yōu)化。 ARM中
48、的函數(shù)前4個整型參數(shù)通過寄存器r0、r1、r2、r3來傳遞,隨后的整型參數(shù)通過堆棧來傳遞。(full desceding stack)。盡量限制函數(shù)參數(shù),不要超過四個,也可以把相關的參數(shù)組織在結構體傳遞; 把比較小的被調用函數(shù)和調用函數(shù)放在同一個源文件中,并且限定一,后調用,編譯器能進行優(yōu)化; 用_inline內聯(lián)性能影響較大的重要函數(shù)。 指針的使用, 用一個局部變量來保存公共子表達式的值,保證該表達式只求一次值。 避免使用局部變量的地址,否則訪問這個變量的效率較低。 結構體的安排達到優(yōu)化。小的元素放在結構體的開始,大的元素放在結構體的最后, 避免使用過大的結構體,用層次話的小結構體代替,人工
49、對API的結構體增加填充位以提高移植性,枚舉類型要慎用,因為它的大小與編譯器相關。 位域的優(yōu)化。盡量用define或者enum來代替位域,用邏輯運算來丟位域操作 邊界不對齊數(shù)據(jù)和字節(jié)排列方式,盡量避免使用邊界不對齊數(shù)據(jù),用char× 可指向任意字節(jié)對齊的的數(shù)據(jù),與邏輯運算配合,可訪問任意邊界和排列的數(shù)據(jù)。在使用除法時,一堆算法,不好寫,總的來說是以乘代除,配合移位運算。 內聯(lián)函數(shù)和內嵌匯編,沒什么好寫的,就是內聯(lián)減少調用開銷,內嵌匯編提高運行效率。存儲器相關的優(yōu)化方法,用查表代替計算,在處理器資源緊張而存儲器資源相對富裕的情況下, 可以用犧牲存儲空間換取運行速度的辦法。例如需要頻繁計
50、算正弦或余弦函數(shù)值時,可預先將函數(shù)值計算出來置于內存中供以后ARM查找。充分利用片內RAM ,一些廠商出產(chǎn)的ARM 芯片內集成有一定容量的RAM。處理器對片內RAM 的訪問速度要快于對外部RAM 的訪問,所以應盡可能將程序調入片內RAM 中運行。若因程序太大無法完全放入片內RAM ,可考慮ARM將使用最頻繁的數(shù)據(jù)或程序段調入片內RAM 以提高程序運行效率。ARM 7 處理器要求ARM程序中的32 位/16 位變量必須按字/ 半字對齊,這意味著如果變量順序安排不合理, 有可能會造成存儲空間的浪費。例如:一個結構體中的4個32 位int 型變量i1 i4 和4 個8 位char 型變量c1 c4,
51、若按照i1、c1、i2、c2、i3、c3、i4、c4 的順序交錯存放時, 由于整型變量的對齊會導致位于2 個整型變量中間的那個8 位char 型變量實際占用32 位的存儲器,這樣就造成了存儲空間的浪費。為避免這種情況, 應將int 型變量和char 型變量按類似i1、i2、i3、i4、c1、c2、c3、c4 的順序連續(xù)存放,這不僅可以節(jié)省代碼,而且可以提高代碼的運行效率??偨Y,高級語言的優(yōu)化和編譯器、硬件結構有關。硬件上,ARM一般為32位總線,以32位訪問數(shù)據(jù)的速度較快。局部變量和其他常用的變量要盡量利用32位的int類型,組織結構體時,也要注意元素的位置(小前大后),以節(jié)省空間。另外,由于
52、ARM指令可條件執(zhí)行,所以充分利用cpsr會使程序更有效率。同時注意好類型之間的運算,盡量減少轉型操作。任何時候除法和取模運算可以同時取得結果而不會額外增加運算過程,但單單對于除法,還是以乘代除比較劃算。對于編譯器,armcc遵從ATPCS的要求,第一到第四個參數(shù)依次通過r0r4傳遞,其他參數(shù)通過堆棧傳遞,返回值用r0傳遞,因此,為了把大部分操作放在寄存器中完成,參數(shù)最好不多與4個。另外,可用的通用寄存器有12個,所以盡量將局部變量控制在12個之內,效率上會得到提升。同時,由于編譯器比較保守,指針別名會引起多余的讀操作,所以盡量少用。使用Thumb 指令為了從根本上有效ARM降低代碼尺寸,AR
53、M 公司開發(fā)了16 位的Thumb 指令集。Thumb 是ARM 體系結構的擴充。Thumb 指令集是大多數(shù)常用32 位ARM 指令壓縮成16 位寬指令的集合。在執(zhí)行時,16 位指令透明的實時解壓成32 位ARM 指令并沒有性能損失。而且程序在Thumb狀態(tài)和ARM 狀態(tài)之間切換是零開銷的。與等價的32 位ARM 代碼相比,Thumb 代碼節(jié)省的存儲器空間可高達35% 以上。第二章 UCOS ii隨著嵌入式技術的快速發(fā)展,實時多任務操作系統(tǒng)作為一種軟件平臺已逐步成為國際嵌入式系統(tǒng)的主流,目前世界上已經(jīng)有一大批成熟的實時嵌入式操作系統(tǒng),通常,對嵌入式軟件的基本要求是體積小、指令速度快、具有較好的
54、裁減性和可移植性,目前,實時操作系統(tǒng)很多,如 VxWorks , Windows CE , pSOS , QNX , LynxOS 等,這些操作系統(tǒng)都具有高可靠性、強實時性等特點,但他們都是商業(yè)操作系統(tǒng),價格昂貴,人們往往很難接受, C/OS- 操作系統(tǒng)的出現(xiàn)是對這些商業(yè)操作系統(tǒng)的一個很大的沖擊。C/OS- 是源碼公開的實時操作系統(tǒng),是一個自由操作系統(tǒng)。程序開發(fā)人員可以改寫源代碼,使之符合自己的要求,裁減掉不需要的部分,使操作系統(tǒng)變得小巧、靈活、并且能滿足用戶特定操作系統(tǒng)的需要。為了提高系統(tǒng)的實時能力, C/OS- 可以將一個復雜的應用劃分為多個相互獨立的任務,并根據(jù)任務的重要性來分配優(yōu)先級。
55、任務的調度完全由 C/OS- 的實時內核完成,主要包括任務的狀態(tài)管理、選擇最高優(yōu)先級的任務、執(zhí)行任務和撤銷任務等, C/OS- 內核還負責 CPU 時間分配, CPU 時間總是優(yōu)先分配給中斷事件,其次是任務隊列中當前優(yōu)先級最高的任務,不同任務間的通信可以通過 C/OS- 提供的信號量、郵箱、信息隊列等機制完成,他的絕大部分代碼是用 C 語言編寫的,可移植性強,因此 1997 年以后,在國際上逐漸被廣泛采用。2.1 ucosii分析實時系統(tǒng)的特點是,如果邏輯和時序出現(xiàn)偏差將會引起嚴重后果的系統(tǒng)。有兩種類型的實時系統(tǒng):軟實時系統(tǒng)和硬實時系統(tǒng)。在軟實時系統(tǒng)中系統(tǒng)的宗旨是使各個任務運行得越快越好,并不
56、要求限定某一任務必須在多長時間內完成。在硬實時系統(tǒng)中,各任務不僅要執(zhí)行無誤而且要做到準時。大多數(shù)實時系統(tǒng)是二者的結合。實時系統(tǒng)的應用涵蓋廣泛的領域,而多數(shù)實時系統(tǒng)又是嵌入式的。這意味著計算機建在系統(tǒng)內部,用戶看不到有個計算機在系統(tǒng)里面。以下是一些嵌入式系統(tǒng)的例子:通訊類Switch Hurb路由器機器人航空航天飛機管理系統(tǒng)武器系統(tǒng)噴氣發(fā)動機控制民用消費品微波爐洗碗機洗依機穩(wěn)溫調節(jié)器過程控制藥品加工化工廠汽車業(yè)發(fā)動機控制防抱死系統(tǒng)(ABS)辦公自動化傳真機復印機計算機外設打印機計算機終端掃描儀調制解調器實時應用軟件的設計一般比非實時應實時應用軟件的設計一般比非實時應用軟件設計難。不復雜的小系統(tǒng)一
57、般設計成如下圖所示的樣子。這種系統(tǒng)可稱為前后臺系統(tǒng)或超循環(huán)系統(tǒng)(Super-Loops)。應用程序是一個無限的循環(huán),循環(huán)中調用相應的函數(shù)完成相應的操作,這部分可以看成后臺行為(background)。中斷服務程序處理異步事件,這部分可以看成前臺行為(foreground)。后臺也可以叫做任務級。前臺也叫中斷級。時間相關性很強的關鍵操作(Critical operation)一定是靠中斷服務來保證的。因為中斷服務提供的信息一直要等到后臺程序走到該處理這個信息這一步時才能得到處理,這種系統(tǒng)在處理信息的及時性上,比實際可以做到的要差。這個指標稱作任務級響應時間。最壞情況下的任務級響應時間取決于整個循環(huán)的執(zhí)行時間。因為循環(huán)的執(zhí)行時間不是常數(shù),程序經(jīng)過某一特定部分的準確時間也是不能確定的。進而,如果程序修改了,循環(huán)的時序也會受到影響。圖2.1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作總結之大四設計實習總結
- 2024年外匯、黃金等交易服務項目投資申請報告代可行性研究報告
- 銀行外匯業(yè)務管理規(guī)定制度
- 銀行合規(guī)管理制度實施跟進
- 風力發(fā)電基礎工程施工合同
- 農(nóng)學課件-植物微量元素營養(yǎng)
- 期貨品種介紹詳細課件版
- 空調實習報告
- 小學生簡單元旦節(jié)目的主持詞范文(33篇)
- 《計算機初級知識》課件
- 強制性條文監(jiān)理檢查記錄(電氣)
- 2024年輔導員年終總結
- GB/T 44811-2024物聯(lián)網(wǎng)數(shù)據(jù)質量評價方法
- 2024年國家開放大學本科《知識產(chǎn)權法》第一至四次形考任務試題及答案
- 母乳喂養(yǎng)課件(共68張課件)課件
- 中國話劇史19202學習通超星期末考試答案章節(jié)答案2024年
- 2024青海海東市水務集團限責任公司招聘27人高頻難、易錯點500題模擬試題附帶答案詳解
- 2025年教師資格考試初級中學面試信息技術試題及解答參考
- 工傷調解簡單協(xié)議書范本(35篇)
- 人工智能學習通超星期末考試答案章節(jié)答案2024年
- 河北省邢臺市2023-2024學年二年級上學期語文期中試卷(含答案)2
評論
0/150
提交評論