


版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第4章 ARM系統(tǒng)硬件設計基礎有了前面的知識,就可以編寫程序了。但是還要解決兩個問題:(1)選擇具體的一種以 ARM為核的單片機,學習這種單片機各種的外圍功能模塊的用法,做出硬件設計。(2)選擇一種開發(fā)工具,利用開發(fā)工具進行程序的編寫、編譯、鏈接和調(diào)試。編輯程序是軟件開發(fā)的第一步,編輯中有很多技巧和靈活性。選擇編程語言也很重要,主要考慮以下幾點:使用匯編語言可以提高代碼的效率,節(jié)省程序的存儲空間, 在需要實時控制的場合可以精確計算程序的執(zhí)行時間,在ARM處理器的中斷入口 (包括復位處理)處使用匯編語言實現(xiàn)中斷向量表十分方便。Thumb指令是ARM指令集的子集,代碼密度更大。C語言具有很好的可讀
2、性,易于修改和移植,在處理數(shù)據(jù)方面比匯編語言更靈活,在實現(xiàn)控制控制時比/C+語言更方便。C+語言比C語言的底層控制靈活性稍差。在ARM程序中,以上語言混合運用很重要,可以充分發(fā)揮各種語言的特點。編輯程序需要一個特定的軟件環(huán)境。ARM的匯編語言要求環(huán)境支持 ASM類型,C語言要求環(huán)境符合 ANSIC標準,C+語言要求環(huán)境符合 ANSI C+或EC+標準。只要滿足這些標準,程序就可以移植。Code Warrior for ARM 是一種常用的 ARM程序開發(fā)工具。、1 .程序的匯編或編譯通常把從匯編語言變換到目標代碼的過程稱為匯編,把這種工具稱為匯編器;把從其他高級語言(非匯編) 變換到匯編語言(
3、或直接變換到目標代碼)的過程稱為編譯,把這種工具稱為編譯器。很多情況下,編譯器都帶 有匯編功能。以下敘述中,不再區(qū)分匯編和編譯,統(tǒng)稱編譯。對已經(jīng)編輯完成的程序要進行匯編或編譯,這里面要完成的任務是:(1)查找程序中的語法錯誤、邏輯錯誤編譯器在查找錯誤以后會產(chǎn)生兩種信息:一種是警告(Warning)信息;另一種是錯誤(Error)信息。警告信息是支出程序中可能存在的問題,這些問題可能影響程序的執(zhí)行,也可能不影響執(zhí)行,可以不排除,所以如果 程序只存在警告信息,編譯器會生成目標文件,可以進行連接和調(diào)試。錯誤信息則肯定影響程序的執(zhí)行,必須排 除,不能生成目標文件。例1編譯時發(fā)現(xiàn)簡單錯誤對于ARM指令行
4、MOv r4, #0x20編譯器指出Error:A1163E: Unknown opcode編譯器指出了錯誤編號 A1163E,原因是不能識別代碼 MOv,因為語法規(guī)定代碼中不允許大小寫混合使用。例2編譯時發(fā)現(xiàn)邏輯錯誤對于ARM偽指令ADR R4, START+OxOFOOO編譯器指出Error:A1170E : Immediate OxOFOOO out rang for this operation編譯器指出了錯誤編號A1170E,原因是賦值的立即數(shù)超過了偽指令ADR的限定范圍(土 1024字節(jié))。例3編譯時發(fā)現(xiàn)警告對于C語言程序的注釋行/* while i=1 jump */編譯器指出W
5、arning : C 2809W : character sequenee /* inside comment編譯器指出了錯誤編號C2809W,原因是while指令出現(xiàn)在注釋行,可能是寫錯了(也可能設計者就是要這樣寫)。編譯器在警告的同時照常生成目標文件。(2)把C或C+語言程序編譯成匯編語言程序,然后再把匯編語言程序匯編成目標代碼。在ARM的開發(fā)工具中,C/C+編寫的程序都是先編譯成匯編指令。設計者可以對編譯出的匯編指令進行分 析、計算執(zhí)行時間以及分析代碼效率。(3)生成列表文件和供連接用的目標代碼文件等。列表文件包括編譯過程和編譯結果等一系列信息,也包含錯誤和報警信息。2 連接程序編譯器只
6、負責把源程序編譯成機器碼,這些機器碼僅僅是那些和地址無關的指令的代碼,編譯器不能生成與地址有關的指令的代碼(如跳轉指令) 。編譯器為這些沒有生成代碼的部分生成編譯信息(符號表) ,連接器負責 與地址相關的編譯工作。為指令生成和地址相關的代碼,完成編譯器未完成的指令代碼。把所有相關聯(lián)的文件所包含的程序段組織在一起,鏈接成一個完整程序。根據(jù)程序員所指定的選項,為這個程序分配地址空間。給出鏈接信息,說明鏈接過程和鏈接結果。一個復雜的項目會包含很多文件,編譯器只負責把每個文件編譯成一個目標文件,而連接器則會把所有的目標文件連接在一起。在連接時,不僅僅是簡單連接,還會做一些處理和優(yōu)化,優(yōu)化可能會刪除一些
7、不是用的程序 段和數(shù)據(jù)段。3.調(diào)試程序調(diào)試程序需要建立一個軟件調(diào)試環(huán)境,調(diào)試硬件自然要建立硬件調(diào)試環(huán)境。 調(diào)試軟件需要用到軟件仿真工具。待調(diào)試的程序和仿真工具都在同一臺計算機上。Windows98以前的很長一段對任何語言的程序設計來說,程序的編譯、鏈接和調(diào)試是三個不同的過程。在時間內(nèi),這三個過程都是單獨處理的(三個單獨軟件)。現(xiàn)在則出現(xiàn)了集成開發(fā)環(huán)境IDE,可以在一個軟件里面進行編輯、編譯、鏈接和調(diào)試。51單片機開發(fā)較早,應用普遍,所以集成開發(fā)環(huán)境比較完善,功能強大。ARM處理器的仿真系統(tǒng)和 51系列有較大差別:51單片機是一個單獨的系列,雖然品種很多,但是內(nèi)核基本相同,不同的是封裝形式、存儲
8、器容量、存儲器類型和速度等。所以比較容易實現(xiàn)一個仿真器能夠仿真所有家族成員。ARM則有多種內(nèi)核,不同廠家的產(chǎn)品之間差別很大,所以ARM仿真器的適用范圍受到一定限制。只有內(nèi)核是同一系列的條件下,仿真器才可以通用。51單片機的仿真器是單純的仿真,不負責程序代碼的寫入/燒錄。但是以ARM為核的單片機都沒有專門的寫入設備,ARM仿真器在進行在線仿真調(diào)試時還要完成代碼的寫入。由于不同廠家的產(chǎn)品的程序 存儲器使用方法有別,因此盡管一個仿真器可以仿真所有同類內(nèi)核的單片機,但是不一定能對所有單片/ 機進行程序代碼寫入。ARM為核的單片機需要把單片機焊接在目標板上,仿真依賴于ARM處理器自帶的JTAG接口和系統(tǒng)
9、主機連接。51單片機的芯片可以拆卸,仿真利用的是仿真器的仿真頭。51單片機的仿真器在對目標機仿真時,實際運行的是仿真器,仿真器模擬出51對指令的操作和內(nèi)部模塊的功能。ARM處理器的仿真是運行實際的目標板,指令的執(zhí)行、內(nèi)部模塊功能的實現(xiàn)、輸入輸出口 線的驅動和檢測都是實際ARM處理器實現(xiàn)的。4.1 ADS1.2集成開發(fā)環(huán)境簡介ARM處理器的仿真系統(tǒng)也有多種,比較流行的是ARM公司推出的ADS ARM Developer Suit。這是基于Code Warrior IDE集成開發(fā)環(huán)境的 ARM處理器的編譯、連接和仿真環(huán)境。與51仿真系統(tǒng)有兩點不同:(1) ADS把編譯、連接和仿真調(diào)試集成在兩個環(huán)境
10、中。編譯和連接集成在 Metrowerks Code Warrior for ARM Developer Suit,一般簡稱為 Code Warrior for ADS 或者 Code Warrior IDE。仿真調(diào)試集成在 ARM eXtended Debugger 環(huán)境中,簡稱AXD。(2)ADS既提供了集成的編譯、連接環(huán)境,還提供了命令行編譯、連接環(huán)境。較新的版本是 ADS1.2,適用于 Windows NT4、Windows 2000、Windows95、Windows 98、Windows XP 以 及 Windows Me。Code Warrior for ADS 的主菜單9項,其
11、中 Debug沒有功能(功能在 AXD環(huán)境中),Option功能合并在 Edit 菜單中。AXD的主菜單10項,有單獨的 Option菜單項,調(diào)試菜單不叫Debug而是Execute。eksikju:t vt.執(zhí)行/實行/處死從下表可以看出,AXD沒有編輯、編譯、連接功能,仿真調(diào)試發(fā)現(xiàn)問題只能返回ADS修改。3個環(huán)境比較環(huán)境文件管理編輯瀏覽調(diào)試編譯鏈接項目管理設置窗口管理幫助51仿真系統(tǒng)VVVVVVVVVADSVVVXVVVVVAXDVXVVXXVVV1 . ADS系統(tǒng)包含的可選文件/ADS系統(tǒng)包含下列可選文件,在安裝的時候按需要選擇安裝。(1 )系統(tǒng)文件Executables類文件:系統(tǒng)所有
12、可執(zhí)行的二進制文件,包括編譯文件、命令行工具和GUI組件。C libraries,big endian :用于大端系統(tǒng)的 C語言鏈接庫文件。C libraries, little endian :用于小端系統(tǒng)的 C語言鏈接庫文件。C+ libraries, big endian :用于大端系統(tǒng)的 C+鏈接庫文件。C+ libraries, little endian :用于小端系統(tǒng)的 C+鏈接庫文件。Include files :包含用戶源程序的所有C和C+頭文件。Help files :包含用于GUI的在線幫助信息,與運行無關,可以不安裝。(2)其他文件Example Files :一組程序
13、舉例,包括源代碼和 Code Warrior工程文件,可以在 ADS中使用。HTML documents :適用于 Rogue Wave C+庫的文檔,可以適用網(wǎng)絡瀏覽器閱讀。Dyna Text documents : ADS的連機在線格式的文檔,為適應Dyna Tex閱讀器而設計。PDF-ONL Y DOCUMENTS : PDF格式的文件,ARM 體系結構手冊,適用 Adobe Acrobat閱覽器。ARMulator extension kit :擴展的 ARM 仿真工具包。ARM FPA sources : ARM 中的 FPA源文件。Source: ARM應用軟件庫源文件。Docum
14、entation : PDF格式的ARM 應用軟件庫文件,適用于 Adobe Acrobat Reader閱覽器。2. ADS環(huán)境中的文件類型ADS開發(fā)環(huán)境中用到多種文件類型。(1) 程序員通過編輯環(huán)境建立的文件C source file : C語言源程序文件,擴展名.c。C+ source file : C+語言源文件,擴展名.cpp。Assemble source file :匯編語言源文件,擴展名 .s。Code Warrior project file : Code Warrior的工程項目管理文件,擴展名.mcp。內(nèi)容是所有源文件以及調(diào)試信息。(2) 通過編譯器和連接器生成的文件fi
15、lename.h :頭文件。filename.o :編譯器輸出的 ELF格式的目標文件。filename.lst :編譯器輸出的包含錯誤信息的列表文件。filename.axf :連接器生成的可執(zhí)行映像文件。symswfs :格式文件,是連接器生成的全局符號表文件。(3)經(jīng)常使用的工具文件armcc: ARM C語言編譯器,用于把 C語言源程序(擴展名.c)編譯成32位的ARM代碼。tcc: ARM C語言編譯器,把 C語言源程序(擴展名.c)編譯成16位的Thumb代碼。armcpp: ARM C+語言編譯器,用于把 C+語言源程序(擴展名.cpp)編譯成32位的ARM代碼。tccpp :
16、ARM C+語言編譯器,把 C+語言源程序(擴展名.cpp)編譯成16位的Thumb代碼。armasm: ARM 匯編語言編譯器,用于把 ARM指令和Thumb指令的源程序編譯成機器碼。armlink : ARM 連接器,把編譯輸出的ELF格式的目標文件以及相關的C和C+運行時庫連接在一起,生成可執(zhí)行映像文件。4.1.1 ADS1.2集成開發(fā)環(huán)境下工程的創(chuàng)建1. 新建工程2. 設置目標及其參數(shù)(1)目標設置(2)語言設置(3)連接器設置3. 向工程中添加文件4.1.2 ADS1.2集成開發(fā)環(huán)境下的仿真和調(diào)試方法4.2基于ARM的匯編語言程序設計匯編器支持的偽指令ARM匯編器支持的偽指令:符號定
17、義、數(shù)據(jù)定義、匯編控制、宏指令以及其他。P.108有 ARM 偽指令 4 條: ADR、ADRL、LDR、NOPP.116有 Thumb 偽指令 3 條:ADR、LDR、NOP表4.1 ARM匯編器支持的偽指令類能例符 號疋 義 偽 指 令GBLA/GBLL/GBLS分別用于定義全局的數(shù)值變量 / 邏輯變量/字符串變量GBLA Test1;定義一個名為 Test1的全局數(shù)值字變量LCLA/LCLL/LCLS分別用于定義局部的數(shù)值變量 / 邏輯變量/字符串變量LCLL Test2;定義一個名為 Test2的局部邏輯變量SETA/SETL/SETS分別用于給數(shù)值、邏輯、字符 串變量賦值Test1
18、SETA 0xaa;將數(shù)值變量Test1賦值為0xaaRLIST/為一個通用寄存器列表起別 名,該別名可在ARM指令LDM/STM 中使用RegListRLIST R0-R3 , R8為奇存器列表起別名RegList數(shù)據(jù)/疋義 偽 指令DCB/DCW/DCD分別用于分配連續(xù)的字節(jié)/半字 /字存儲單兀并初始化str DCB“ That is a test”;分配起始地址為str的一段連續(xù)字節(jié)存儲單兀存放字符串DCFD/DCFS分別用于為雙/單精度浮點數(shù)分 配連續(xù)的字存儲單元并初始化Fdata DCFD2E11, -5E7;分配兩個連踹的雙精度存儲空間存放2E11和-5E7DCQ用于分配以8字節(jié)為
19、單位的連 續(xù)存儲單兀并初始化DataD DCQ 10;分配8字節(jié)的連續(xù)存儲單元存放10SPACE用于分配一段連續(xù)的字節(jié)存儲 單兀并初始化為0DataSpace SPACE 10;分配10字節(jié)的存儲單元并初始化為 0 MAP用于定義一個結構化的內(nèi)存表 的首地址MAP 0x100, R0S;定義結構化內(nèi)存表首地址為0x100+R0A FIELD 10;定義 A的長度為10字節(jié)B FIELD 20;定義B的長度為20字節(jié)FIELD用處定義一個結構化的內(nèi)存表 的數(shù)據(jù)域匯編控制偽指令IF/ELSE/ENDIF條件匯編IF Test=TRUE;如果條件成立指令序列1;匯編指令序列1ELSE;如果條件不成立
20、指令序列2;匯編指令序列2ENDIF;結束WHILE/WEND重復匯編WHILE Test10 ;當 Test小于 10 成立 指令序列;匯編指令序列WEND;結束宏指令MACRO/MEND宏定義:將一段代碼定義為一 個整體并命名,稱為宏指令。 后面的程序可以使用這個名 i字,調(diào)用這段代碼。MACRO Seg;定義一個宏指令 Seg指令序列;代表這段代碼MEND;宏定義結束MEXIT從宏指令跳出MEXIT/苴丿、他 偽 指 令AREA定義一個代碼段或數(shù)據(jù)段,段 的屬性可以取值:CODE (代碼 段八DATA (數(shù)據(jù)段)、READONL Y (只讀)、 RAEDWRITE (可讀可寫)等。/AR
21、EA In it , CODE , READONL Y ALIGN =3;定義了一個名為In it的代碼段,只讀屬性, 并指定其后的指令為 8 ( 23)字節(jié)對齊ALIGN指疋當前位置的對齊方式,取 值是2的幕CODE16/CODE32通知編譯器,其后的指令時16位的THUMB指令或者32位的ARM指令ENTRY指定匯編程序的入口點一END指定匯編程序的結尾一EQU為常量或符號起別名Test EQU 50;定義標號 Test的值為50EXPORT/GLOBAL聲明一個全局標號EXPORT FLAG ;聲明全局標號 FLAGIMPORT/EXTERN通知編譯器引用一個其他源文 件定義的標號IMP
22、ORT mai n;通知編譯器要使用其他源文件疋義的標號 mainGET/INCLUDE將一個源文件包含到當前原文 件中GETIn it.s;通知編譯器當前源文件包含源文件Init.sINCBIN/將一個目標文件或數(shù)據(jù)文件包 含到當前源文件中INCBIN al.dat;通知編譯器當前源文件包含文件 al.dat參考:趙星寒從51到ARM的偽指令一覽表指令類別指令名稱指令說明ARM專 用 偽 指 令把地址加載到寄存器ADR把一個地址加載到寄存器把長地址加載到寄存 器ADRL把一個長地址加載到寄存器中,這個地址可以是程序 偏移(PC偏移)的地址,也可以是寄存器偏移的地址。把一個數(shù)字常量或一個地址加
23、載到寄存器LDR把一個32位的數(shù)字常量或一個地址加載到寄存器中空操作NOP這條指令被編譯成1條無效指令(如 MOV R0 , R0), 占用32位代碼空間Thumb專用偽 指 令、把地址加載到低端寄 存器ADR把一個地址加載到低端寄存器(R0-R7)中,這個地址必需是程序相對偏移的地址。把一個數(shù)字常量或一 個地址加載到低端寄 存器LDR把一個32位的數(shù)字量或一個地址加載到寄存器中空操作NOP這條指令被編譯成1條無效指令(如 MOV R0 , R0), 占用32位代碼空間通 用 變 量 疋 義 和 賦 值 偽 指 令聲明一個全局算術變 量GBLAGBLA用來聲明一個全局算術變量,并初始化為0。聲
24、明一個全局邏輯變量 GBLLGBLL用來聲明一個全局邏輯變量,并初始化為假(false)。聲明一個全局字符串 變量GBLSGBLS用開聲明一個全局字符串變量,并初始化為空(null)。聲明一個局部算術變 量LCLALCLA用來聲明一個局部算術變量,并初始化為0。聲明一個局部邏輯變 量LCLLLCLL用來聲明一個局部邏輯變量,并初始化為假(false)。聲明一個局部字符串變量 LCLSLCLS用開聲明一個局部字符串變量,并初始化為空 (null)。為一個算術變量賦值SETASETA為一個算術變量賦值。為一個邏輯變量賦值SETLSETL為一個邏輯變量賦值。為一個字符串變量賦 值SETSSETS為一
25、個字符串變量賦值。疋義 寄 存為通用寄存器列表定義偽指令RLIST把多個通用寄存器定義成一個名字,便于整體使用這 多個寄存器(入出棧操作或多寄存器傳送)。為協(xié)處理器定義名稱偽指令CP把某一編號的的協(xié)處理定義個名字名 稱 偽 指 令為協(xié)處理器的寄存器 定義名稱偽指令CN為一個協(xié)處理器的寄存器定義名稱。為VFP的寄存器命名 的偽指令DN 和SN/ DN為雙精度的VFP寄存器定義名稱 SN為單精度的VFP寄存器定義名稱為浮點寄存器命名偽指令FN為一個浮點寄存器定義名稱數(shù) 據(jù) 疋 義 偽 指 令聲明一個數(shù)據(jù)緩沖區(qū)偽指令/LTORG聲明一個數(shù)據(jù)緩沖區(qū)的開始內(nèi)存表疋乂偽扌曰令MAP和FIELDMAP用于定
26、義一個結構化的內(nèi)存表的首地址;FIELD用于定義內(nèi)存表中數(shù)據(jù)的長度。 這兩個指令一起使用,可以定義結構化的內(nèi)存表。內(nèi)存單兀的分配偽指令/SPACE進行內(nèi)存單元的分配,并把內(nèi)存單元初始化為0。為字節(jié)分配內(nèi)存單兀DCB分配一段字節(jié)內(nèi)存單兀,并用指定的數(shù)值或字符初始 化。為字分配內(nèi)存單元的偽指令DCU 和DCDUDCU為字分配一段字對準的內(nèi)存單兀,并用指定的數(shù)值或標號初始化;DCDU用來為字分配一段非字對準的內(nèi)存單元,并用 指疋的數(shù)值或標號初始化。為字分配內(nèi)存單元的偽指令DCDO為字分配一段字對準的內(nèi)存單元,并用一個地址偏移 量初始化,這個偏移量是 DCDO定義的標號地址到 R9 指定的地址之間的差
27、值。為浮點數(shù)分配內(nèi)存單 元的偽指令DCFD和DCFDU、DCFS 和DCFSUDCFD用于為雙精度浮點數(shù)分配一段字對準的內(nèi)存單元,并用指定的數(shù)據(jù)初始化,每個數(shù)占2個字;DCFDU用于為雙精度浮點數(shù)分配一段可以非字對準 的內(nèi)存單元,并用指定的數(shù)據(jù)初始化,每個數(shù)占2個字;DCFS用于為單精度浮點數(shù)分配一段字對準的內(nèi)存單元,并用指定的數(shù)據(jù)初始化,每個數(shù)占1個字;DCFSU用于為單精度浮點數(shù)分配一段可以非字對準 的內(nèi)存單元,并用指定的數(shù)據(jù)初始化,每個數(shù)占1個字;為雙字分配內(nèi)存單元 的偽指令DCQ和DCQUDCQ用于為雙字分配一段字對準的內(nèi)存單兀,并用指 定的數(shù)據(jù)初始化;DCQU用于為雙字分配一段可以非
28、字對準的內(nèi)存單 元,并用指定的數(shù)據(jù)初始化。/為半字分配內(nèi)存單元 的偽指令 DCW和DCWUDCW用于為半字分配一段半字對準的內(nèi)存單兀,并用指定的數(shù)據(jù)初始化;DCWU用于為半字分配一段可以非 半字對準的內(nèi)存單元,并用指定的數(shù)據(jù)初始化???制 程 序 流 向 的 偽 指 令宏定義偽指令MACRO 、MEND 和 MEXITMACRO定義一個宏語句段的開始;MEND定義宏語句段的結束; MEXIT 了以實現(xiàn)從宏程序段跳出。條件分支偽指令IF、ELSE 和ENDIF條件匯編偽指令:滿足條件分支一匯編到目標程序, 不滿足條件分支二匯編到目標程序。條件循環(huán)偽指令WHILE 和 WEND重復匯編偽指令:條件
29、滿足時重復匯編循環(huán)體的指令。苴丿、他 偽 指地址對準偽指令ALIGN ;ALIGN通過插入字節(jié)使得其后的數(shù)據(jù)從地址對準的位 置存儲代碼長度定義偽指令CODE16和CODE16告訴編譯器把其后的程序編譯成16位的Thumb代碼:令CODE32CODE32告訴編譯器八氣候的程序編譯成32位的ARM代碼。段指示偽指令AREA;7偽指令AREA定義一個段的起始,同時明確是代碼段 或者數(shù)據(jù)段、只讀或者可讀可寫等屬性。程序入口偽指令ENTRYENTRY定義程序的入口。 一個程序至少有一個入口。 一個源文件只能有一個入口。編譯結束偽指令ENDEND用于表明源程序的結尾。 每個源程序必須有一個 END。符號定
30、義偽指令EXPOR T和IMPORTEXPORT聲明一個(可供公用的)符號,這個符號通 過鏈接可以被其他文件引用;IMPORT聲明引用一個(外部)符號,這個符號實在 其他文件定義的,聲明引用以后就可以調(diào)用這個外部符 號。文件包含指示偽指令GET和INCBINGET聲明包含另一個源文件, 并在GET偽指令處匯編 被包含的文件;INCBIN聲明包含另一個源文件,但僅在 INCBUN處 引用這個文件而不匯編。422基于ARM的匯編語言語句格式ARM匯編語言的指令格式包括 3部分:標號指令或偽指令;注釋3部分都是可選的;標號必須頂格書寫;(后面不能加冒號?。┧兄噶疃疾辉试S頂格書寫;標識符大小寫有別,
31、一條指令中助記符和語句標號不允許大小寫混合;行末的反斜杠是續(xù)行符;注釋用分號引導。 /4.2.3 ARM匯編語言程序的基本結構在ARM匚編語言程序中,是以程序段為單位來組織代碼。 段是相對獨立的指令或數(shù)據(jù)序列,具有特定的名稱。段可以分為代碼段的和數(shù)據(jù)段,代碼段的內(nèi)容為執(zhí)行代碼, 數(shù)據(jù)段存放代碼運行時所需的數(shù)據(jù)。一個匯編程序至少應該有一個代碼段, 當程序較長時,可以分割為多個代碼段和數(shù)據(jù)段,多個段在程序編譯鏈接時最終形成一個可執(zhí)行文件??蓤?zhí)行映像文件通常由以下幾部分構成: 一個或多個代碼段,代碼段為只讀屬性。零個或多個包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。零個或多個不包含初始化數(shù)據(jù)的數(shù)據(jù)
32、段,數(shù)據(jù)段的屬性為可讀寫。鏈接器根據(jù)系統(tǒng)默認或用戶設定的規(guī)則,將各個段安排在存儲器中的相應位置。源程序中段之間的相鄰關系與執(zhí)行的映象文件中的段之間的相鄰關系不一定相同。在ARM匚編語言中,子程序調(diào)用是通過B或者BL指令實現(xiàn)的,調(diào)用格式為:B 子程序名;不記錄返回地址的調(diào)用,不能返回 = 51單片機無條件跳轉 LJMP AJMR SJMPBL子程序名;帶鏈接的調(diào)用=真正的子程序調(diào)用, 跳轉之前將下一條指令的地址復制到了LR( R14),所以子程序結尾寫上【MOV PC LR】就可以實現(xiàn)程序的返回?;贏RM的匯編語言程序舉例本程序連續(xù)發(fā)送了 128個字節(jié)的ASCII字符。下面分析一下程序的源碼。
33、在UART前的部分為系統(tǒng)的初始化,這在后邊BOOTLOADE的章節(jié)里,要詳細介紹。UART后的程序為主程序,在程序中找到下面這部分的代碼,;/呼叫主應用程序b UART;調(diào)用UARTUART;子程序標號,頂格書寫,不要加冒號!ldr rO, =GPHCON;偽指令,R0指向一個設置 GPIO(RxD0,TxD0引腳)的地址ldr r1, =0x2afaaa;偽指令,R1獲得立即數(shù)0x2afaaastr r1, r0;真指令,把R1的值寫到R0指向的地址(就是GPHCOIldr r0, =GPHUP;偽指令,R0指向一個地址(接口寄存器映射的I/O地址)ldr r1, =0x7ff;偽指令,R1
34、獲得立即數(shù)0x7ffstr r1, r0;真指令,把 R1中的0x7ff存儲到(寫到) GPHUPldr r0, =UFCON0 ;偽指令,R0指向一個地址,設置禁用 FIFOldr r1, =0x0;偽指令,R1獲得立即數(shù)0str r1, r0;真指令,把 R1中的0存儲到(寫到) UFC0N0ldr r0, =UMCON0 ;偽指令,R0指向一個地址,設置禁用AFCldr r1, =0x0;偽指令,R仁0str r1, r0;真指令,把 R1中的0存儲到(寫到) UMC0N0ldr r0, =ULCON0 ;偽指令,R0指向一個地址,設置 線寄存器ldr r1, =0x3;偽指令,R1=E
35、常模式,無奇偶校驗,一個停止位,8個數(shù)據(jù)位str r1, r0;真指令,把R1的值存儲到(寫到)ULC0N0ldr rO, =UCONO ;偽指令,設置 UartO控制器(串口設置)ldr r1, =0x245str r1, rO偽指令,R仁RX邊沿觸發(fā),TX電平觸發(fā),禁用延時中斷;使用RX錯誤中斷,正常操作模式,中斷請求或表決模式真指令,把R1的值存儲到(寫到) UC0N0ldr r0, =UBRDIV0 ;偽指令,設置波特率為 115200ldr r1, =0x1a;” / 偽指令,R1=i nt(50700000 / 16 / 115200) - 1 = 26str r1, r0;真指令
36、,把 R1的值存儲到(寫到) UBRDIV0mov r1, #100只仁立即數(shù)100,延時空循環(huán)次數(shù)Delay;延時空循環(huán)標號sub r1, r1, #0x1;R仁R1-1(為什么沒有 S后綴也行?)bne Delay;不為0,跳到Delay循環(huán);為0則延時空循環(huán)結束開中斷l(xiāng)dr r0, =INTMSK ;偽指令,R0指向INSMSKldr r1, r0;真指令,把R0所指單兀的值(4字節(jié))加載給R1and r1, r1, #0xefffffff;真指令,清零 R1的最高位str r1, r0;把R1的值存儲到R0所指的單兀MOV R5 , #127;設置要打印的字符的個數(shù)MOV R1 , #
37、0x0;LOOP設置要打印的字符(ASCII碼初值)LDR R3,=UTRSTAT0;偽指令,R3獲得一個地址(串口狀態(tài)寄存器)LDR R2 , R3;真指令,從R3指向的地址獲得串口狀態(tài)數(shù)據(jù)加載R2TST R2 ,#0x04; 判斷發(fā)送緩沖區(qū)是否為空BEQ LOOP;為空則執(zhí)行下邊的語句,不為空則跳轉到LOOPLDR R0 , =UTXH0;偽指令,R0指向串口數(shù)據(jù)寄存器STR R1 ,R0;真指令,把R1的數(shù)據(jù)寫到串口數(shù)據(jù)緩沖區(qū)ADD R1, R1, #1;真指令,ASCII碼加1SUB R5 ,R5, #0x01 ;循環(huán)次數(shù)計數(shù)器減1CMP R5 ,#0x0;判斷計數(shù)器值是否為 0BNE
38、 LOOP;不為0,繼續(xù)循環(huán)B L00P2;為0表示發(fā)送完畢,程序在這句無限循環(huán)(相當于 :LJMP $ )分析清楚之后,可以改變 R1的數(shù)據(jù),然后保存、編譯、調(diào)試。觀察結果的變化。4.3基于ARM的硬件啟動程序設計基于ARM芯片的應用系統(tǒng),多數(shù)為復雜的片上系統(tǒng)( SO System On Chip )。在這類復雜系統(tǒng)里,多數(shù)硬 件模塊都是可配置的(可編程接口),需要由軟件來預先設置其需要的工作狀態(tài),因此在用戶的應用程序之前, 需要由專門的一段代碼來完成對系統(tǒng)基本的初始化工作。由于初始化的工作直接面對處理器內(nèi)核和硬件控制器進行編程,故一般均用匯編語言實現(xiàn)。系統(tǒng)的基本初始化內(nèi)容一般包括:(1)分
39、配中斷向量表(2)初始化存儲器系統(tǒng)(3)初始化各工作模式的堆棧(4)初始化有特殊要求的硬件模塊(5)初始化用戶程序的執(zhí)行環(huán)境(6)切換處理器的工作模式(7)呼叫主應用程序分配中斷向量表ARM要求中斷向量表(P.82表3.5 )必須放置在從0x00000000地址開始,連續(xù)32個字節(jié)的空間內(nèi)。每當一 個中斷發(fā)生后,ARM處理器便強制把 PC指針指向對應中斷類型的向量表中的地址。因為每個中斷只占據(jù)向量表 中4個字節(jié)的存儲空間,只能放置一條ARM指令,所以,通常放一條跳轉指令讓程序跳轉到存儲器的其他地方,再執(zhí)行中斷處理。(與51的ROM空間的6個特殊入口地址處理思路完全相同?。┙滩腜.201 :表4
40、.2中斷向量表(P.82表3.5 )中斷入口地址(中斷矢量)中斷入口地址(中斷矢量)復位0x00數(shù)據(jù)中止0x10未定義0x04、保留0x14軟件中斷0x08IRQ0x18預取中止0x0cFIQ/0x1c中斷初始化程序的任務就是在這7個特定入口處寫一條跳轉指令,使得對應的中斷(異常)發(fā)生后,能夠把程序的執(zhí)行位置引導到預先寫好的相應中斷服務程序處。中斷向量表的設置程序通常如下表示:AREA In it ,CODE, READONLYENTRYB ResetHa ndlerB Un defHa ndlerB SWIHa ndlerB PreAbortHa ndlerB DataAbortHa ndl
41、erBB IRQHa ndlerB FIQHa ndler其中關鍵字ENTRY是指定編譯器保留這段代碼,鏈接的時候要確保這段代碼被鏈接在整個程序的入口地址, 該地址也就是 R0的連接地址。當 ARM啟動時,PC指針會自動尋找該關鍵字從該關鍵字處執(zhí)行,該關鍵字的地址 應滿足4字節(jié)對齊的地址。除了上述ARM處理器固有的7種異常中斷外,系統(tǒng)不可避免地會有其他外圍模塊(其他接口、其他設備)的 中斷。當中斷控制器使能外設模塊為向量中斷時,如定時器向量中斷、ADC向量中斷、外部中斷向量中斷等等,外設中斷向量表同理需要相應的跳轉指令,以發(fā)生相應中斷時從對應的中斷向量表跳到存儲器的某個地方,一般可選擇讓其跳到
42、 SDRAM勺高端地址,然后,再跳入中斷服務程序的地址,往下執(zhí)行。(這就是P.82表3.5中的高端地址的含義!)初始化存儲系統(tǒng)存儲器類型,存儲的容量以及時序配置、總線寬度等等。通常Flash和SRAM同屬于靜態(tài)存儲器類型,可以合用同一個存儲器端口;而DRAM因為有動態(tài)刷新和地址線復用等特性,通常配有專用的存儲器端口。除存儲器外,網(wǎng)絡芯片的存儲器相關配置、外接大容量的存儲卡的配置均在此處實現(xiàn)。存儲器端口的接口時序優(yōu)化是非常重要的,這會影響到整個系統(tǒng)的性能。因為一般系統(tǒng)運行的速度瓶頸都存在于存儲器訪問,所以存儲器訪問時序應盡可能的快;而同時又要考慮到由此帶來的穩(wěn)定性問題。初始化堆棧因為ARM有 7
43、種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SF)都是獨立的(P.80圖3.26 )。所以,對程序中需要用到的每一種模式都要給SP定義一個堆棧地址。定義不同模式下堆棧指針的方法:通過改變狀態(tài)寄存器CPSR內(nèi)的模式位(P.80表3.4 , M4-M0),使處理器切換到不同的狀態(tài),然后給SP賦值。注意:不要切換到User模式進行User模式的堆棧設置,因為進入User模式后就不能再操作 CPSR到別的 模式了,可能會對接下去的程序執(zhí)行造成影響。User模式和System模式寄存器完全相同(SP也是同一個),但是System模式有特權,所以在 System模式設置SP就等同于在User模式設置SP。這是
44、一段堆棧初始化的代碼示例: ;/預定義處理器模式常量USERMODEEQU0x10;用戶模式的模式碼10000B,參見 P.80 表 3.4FIQMODEEQU0x11;FIQ模式的模式碼10001BIRQMODEEQU0x12;IRQ模式的模式碼10010BSVCMODEEQU0x13;管理模式的模式碼10011BABORTMODE EQU0x17;中止模式的模式碼10111BUNDEFMODE EQU0x1b ;未定義模式的模式碼11011BSYSMODEEQU0x1f ;系統(tǒng)模式的模式碼 11111BNOINTEQU0xc0/屏蔽中斷位,0xc0=11000000B,禁止FIQ和IRQ/
45、參見P.79的CPSR的控制位In itStacksorr r1,rO,#ABORTMODE|NOINTmsr cpsr _cxsf ,r1;/終止模式堆棧ldr sp,=AbortStackorr r1,rO,#IRQMODE|NOINTmsr cpsr_cxsf,r1;/中斷模式堆棧ldr sp,=IRQStackorr r1,rO,#FIQMODE|NOINTmsr cpsr_cxsf,r1;/快中斷模式堆棧教材P.107:MSR指令可以選擇寫入 CPSR 或SPSR的區(qū)域。C域7:0X 域15:8F 域23:16R 域31:24可以選擇其中的一項或多項使用cxfs意味著全部改寫。ldr
46、 sp,=FIQStackbic r0,r0,#M0DEMASK|N0INTorr r1,r0,#SVCMODEmsr cpsr_cxsf,r1;/管理模式堆棧ldr sp,=SVCStackmrs r0,cpsr;讀取CPSF的值到R0bic r0,r0,#MODEMASK;把模式位清0。 ( MODEMASK模式掩碼,未給出!)orr r1,r0,#UNDEFMODE|NOINT ;用【或】操作修改模式位msr cpsr _cxsf ,r1;把修改后的值寫回 CPSR進入未定義模式ldr sp,=Un defStack;設置此模式的堆棧指針mov pc,lrLTORG【MOV PC,R14】就是子程序返回 =RET初始化有特殊要求的硬件模塊,比如:LED時鐘、看門狗等,也需要進行初始化設置。系統(tǒng)中如果有其他功能模塊(外設控制模塊) 外設初始化代碼一般在系統(tǒng)初始化代碼之后。435初始化應用程序的執(zhí)行環(huán)境一個典型的可執(zhí)行程序的映像結構通常如表4.3所示:表4.3可執(zhí)行程序的映像結構存儲器分區(qū)說明ZI (初始化為0的可讀/寫數(shù)據(jù)只定義了變量名的全局變量RW(可讀/寫數(shù)據(jù))定義時帶初值的全局變量RO (代碼和只讀數(shù)據(jù))編譯結果映像一開始總是存儲在 ROW Flash中,其RO部分即可以在 ROI% Flash里面執(zhí)行,也可以轉移到速度更快
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技行業(yè)中的決策制定策略與案例
- 二零二五年度專業(yè)培訓機構營養(yǎng)餐服務采購協(xié)議
- 二零二五年度道路施工勞務安全保證協(xié)議
- 2025年度電子商務勞務輸送與平臺運營管理協(xié)議
- 二零二五年度定制門設計制作合同
- 二零二五年度事業(yè)單位公有住房租賃合同(含租賃房屋安全標準)
- 2025年度美甲沙龍品牌連鎖合作協(xié)議
- 二零二五年度環(huán)保產(chǎn)業(yè)代理招聘人才合同
- 2025至2030年中國組合型干變溫控儀數(shù)據(jù)監(jiān)測研究報告
- 二零二五年度委托代理招聘與人力資源咨詢合作協(xié)議
- 20kV及以下配網(wǎng)工程建設預算編制與計算規(guī)定-
- 公路瀝青路面施工技術規(guī)范JTGF40-2004
- JJG(交通)054-2009 加速磨光機檢定規(guī)程-(高清現(xiàn)行)
- 全方位管理理念下腫瘤心臟病學課件
- 普通生物學普通生物學試題
- H.248協(xié)議正常呼叫流程解析
- 玻璃水鉆行業(yè)需求分析及生產(chǎn)工藝流程
- 上科教版五年級上冊書法教案
- 宏偉公司財務管理目標與利益沖突案例
- (完整版)信息技術讀書筆記3篇
- 商務運營管理PPT課件
評論
0/150
提交評論