第4章 嵌入式系統(tǒng)程序設(shè)計(jì)基礎(chǔ)(第二版)_第1頁(yè)
第4章 嵌入式系統(tǒng)程序設(shè)計(jì)基礎(chǔ)(第二版)_第2頁(yè)
第4章 嵌入式系統(tǒng)程序設(shè)計(jì)基礎(chǔ)(第二版)_第3頁(yè)
第4章 嵌入式系統(tǒng)程序設(shè)計(jì)基礎(chǔ)(第二版)_第4頁(yè)
第4章 嵌入式系統(tǒng)程序設(shè)計(jì)基礎(chǔ)(第二版)_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第4章嵌入式系統(tǒng)程序設(shè)計(jì)基礎(chǔ)

本章介紹基于ARM的嵌入式系統(tǒng)程序設(shè)計(jì)的一些基本概念,如ARM匯編語(yǔ)言的偽指令、匯編語(yǔ)言的語(yǔ)句格式和匯編語(yǔ)言的程序結(jié)構(gòu)等,同時(shí)介紹嵌入式C語(yǔ)言設(shè)計(jì)基礎(chǔ)、C與匯編語(yǔ)言的混合編程等問題。

主要內(nèi)容匯編語(yǔ)言的語(yǔ)句格式

匯編語(yǔ)言的程序結(jié)構(gòu)

ARM編譯器所支持的偽指令

34.134.234.334.4嵌入式C語(yǔ)言程序設(shè)計(jì)4.1ARM編譯器所支持的偽指令

在ARM的匯編程序中,有如下幾種偽指令:符號(hào)定義偽指令數(shù)據(jù)定義偽指令匯編控制偽指令宏指令以及其他偽指令返回符號(hào)定義偽指令(1)

符號(hào)定義偽指令用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義寄存器的別名等操作。1.GBLA、GBLL和GBLS格式:GBLA(GBLL或GBLS)全局變量名符號(hào)定義偽指令(2)2.LCLA、LCLL和LCLS格式:LCLA(LCLL或LCLS)局部變量名3.SETA、SETL和SETS格式:變量名SETA(SETL或SETS)表達(dá)式

符號(hào)定義偽指令(3)4.RLIST格式:名稱 RLIST{寄存器列表}示例:RegList RLIST {R0-R5,R8,R10};將寄存器列表名稱定義為RegList,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表。數(shù)據(jù)定義偽指令(1)

(1)DCB (2)DCW(DCWU) (3)DCD(DCDU) (4)DCFD(DCFDU)分配一片連續(xù)的字節(jié)存儲(chǔ)單元分配一片連續(xù)的半字存儲(chǔ)單元分配一片連續(xù)的字存儲(chǔ)單元為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元數(shù)據(jù)定義偽指令(2)(5)DCFS(DCFSU) (6)DCQ(DCQU) (7)SPACE

(8)MAP

(9)FIELD 為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元分配一片以8字節(jié)為單位的連續(xù)的存儲(chǔ)單元用于分配一片連續(xù)的存儲(chǔ)單元用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域匯編控制偽指令

匯編控制偽指令用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽指令包括以下幾條:(1)IF、ELSE、ENDIF(2)WHILE、WEND(3)MACRO、MEND(4)MEXIT示例:GBLL Test ……IF Test=TRUE

指令序列1ELSE

指令序列2ENDIFGBLACounterSETA 3 ……WHILE Counter<10

指令序列WEND語(yǔ)法格式:$標(biāo)號(hào) 宏名 $參數(shù)1,$參數(shù)2,……MEXIT用于從宏定義中跳轉(zhuǎn)出去其他常用的偽指令A(yù)REAALIGNCODE16、CODE32ENTRYENDEQUEXPORT(或GLOBAL)IMPORTEXTERNGET(或INCLUDE)INCBINRNROUT4.2匯編語(yǔ)言的語(yǔ)句格式ARM(Thumb)匯編語(yǔ)言的語(yǔ)句格式為:{標(biāo)號(hào)} {指令或偽指令} {;注釋}每一條指令的助記符可以全部用大寫、或全部用小寫,但不許在一條指令中大、小寫混用

長(zhǎng)語(yǔ)句若分為多行來書寫,在行的末尾用“\”表示下一行與本行為同一條語(yǔ)句返回匯編語(yǔ)言程序中常用的符號(hào)

符號(hào)的命名必須遵循以下的約定:符號(hào)區(qū)分大小寫,同名的大、小寫符號(hào)會(huì)被編譯器認(rèn)為是兩個(gè)不同的符號(hào)。符號(hào)在其作用范圍內(nèi)必須唯一。自定義的符號(hào)名不能與系統(tǒng)的保留字相同。符號(hào)名不應(yīng)與指令或偽指令同名。匯編語(yǔ)言程序中的表達(dá)式和運(yùn)算符表達(dá)式一般由變量、常量、運(yùn)算符和括號(hào)構(gòu)成,運(yùn)算次序遵循如下的優(yōu)先級(jí):(1)優(yōu)先級(jí)相同的雙目運(yùn)算符的運(yùn)算順序?yàn)閺淖蟮接摇?2)相鄰的單目運(yùn)算符的運(yùn)算順序?yàn)閺挠业阶?,且單目運(yùn)算符的優(yōu)先級(jí)高于其他運(yùn)算符。(3)括號(hào)運(yùn)算符的優(yōu)先級(jí)最高。數(shù)字表達(dá)式及運(yùn)算符(1)

“+”、“-”、“×”、“/”及“MOD”算術(shù)運(yùn)算符示例:X/Y表示X除以Y的商?!癛OL”、“ROR”、“SHL”及“SHR”移位運(yùn)算符示例:X:ROL:Y 表示將X循環(huán)左移Y位。

“AND”、“OR”、“NOT”及“EOR”按位邏輯運(yùn)算符示例::NOT:Y 表示將Y按位作邏輯非的操作。邏輯表達(dá)式及運(yùn)算符(2)

“=”、“>”、“<”、“>=”、“<=”、“/=”、“<>”運(yùn)算符示例: X<>Y 表示X不等于Y。“LAND”、“LOR”、“LNOT”及“LEOR”運(yùn)算符示例:X:LAND:Y 表示將X和Y作邏輯與的操作字符串表達(dá)式及運(yùn)算符(3)

LEN運(yùn)算符:返回字符串的長(zhǎng)度示例::LEN:X

CHR運(yùn)算符:將0~255之間的整數(shù)轉(zhuǎn)換為一個(gè)字符示例::CHR:MSTR運(yùn)算符:將一個(gè)數(shù)字表達(dá)式或邏輯表達(dá)式轉(zhuǎn)換為一個(gè)字符串示例::STR:X字符串表達(dá)式及運(yùn)算符(4)LEFT運(yùn)算符:返回某個(gè)字符串左端的一個(gè)子串示例:X:LEFT:YRIGHT運(yùn)算符:返回某個(gè)字符串右端的一個(gè)子串示例:X:RIGHT:YCC運(yùn)算符:將兩個(gè)字符串連接成一個(gè)字符串示例:X:CC:Y與寄存器和程序計(jì)數(shù)器(PC)相關(guān)的表達(dá)式及運(yùn)算符

BASE運(yùn)算符:返回基于寄存器的表達(dá)式中寄存器的編號(hào)示例::BASE:XINDEX運(yùn)算符:返回基于寄存器的表達(dá)式中相對(duì)于其基址寄存器的偏移量示例::INDEX:X其他常用運(yùn)算符

?運(yùn)算符:返回某代碼行所生成的可執(zhí)行代碼的長(zhǎng)度示例:?XDEF運(yùn)算符:符判斷是否定義某個(gè)符號(hào)示例::DEF:X4.3ARM匯編語(yǔ)言程序結(jié)構(gòu)本節(jié)的重點(diǎn)在于了解ARM匯編語(yǔ)言的基本程序結(jié)構(gòu)、ARM匯編語(yǔ)言子程序的調(diào)用方法。

返回ARM匯編語(yǔ)言的基本程序結(jié)構(gòu)程序段

組織代碼的單位數(shù)據(jù)段代碼段

映象文件可執(zhí)行編譯鏈接

匯編語(yǔ)言源程序的基本結(jié)構(gòu)示例AREA Init,CODE,READONLYENTRYStartLDR R0,=0x3FF5000LDR R1,0xFFSTR R1,[R0]LDR R0,=0x3FF5008LDR R1,0x01STR R1,[R0]……ENDAREA偽指令定義一個(gè)段名為Init的代碼段,屬性為只讀

ENTRY偽指令標(biāo)識(shí)程序的入口點(diǎn)

指令序列END偽指令,指示代碼段的結(jié)束匯編語(yǔ)言的子程序調(diào)用

在ARM匯編語(yǔ)言程序中,子程序的調(diào)用一般是通過BL指令來實(shí)現(xiàn)的。格式:BL 子程序名4.4嵌入式C語(yǔ)言程序設(shè)計(jì)嵌入式C語(yǔ)言程序設(shè)計(jì)是利用基本的C語(yǔ)言知識(shí),面向嵌入式工程實(shí)際應(yīng)用進(jìn)行程序設(shè)計(jì)的語(yǔ)言。C語(yǔ)言是一種結(jié)構(gòu)化的程序設(shè)計(jì)語(yǔ)言,它的優(yōu)點(diǎn)是運(yùn)行速度快、編譯效率高、移植性好和可讀性強(qiáng)。返回4.4.1嵌入式C語(yǔ)言設(shè)計(jì)基礎(chǔ)1.預(yù)處理命令的應(yīng)用

預(yù)處理命令可以改進(jìn)程序設(shè)計(jì)環(huán)境,提高編程效率。C提供的預(yù)處理功能主要有以下三種:宏定義、文件包含和條件編譯。

宏定義1、

[不帶參數(shù)的宏定義]:用一個(gè)指定的標(biāo)識(shí)符來代表一個(gè)字符串。其一般形式為:

#define

宏標(biāo)識(shí)符

宏體

如:#define

PI

3.1415926

宏定義2、

[帶參數(shù)的宏定義]:不僅進(jìn)行簡(jiǎn)單的字符替換,還要進(jìn)行參數(shù)替換。其一般形式為:

#define

宏標(biāo)識(shí)符(參數(shù)表)

宏體

如:#define

S(a,b)

(a)*(b)宏定義說明宏定義不是C語(yǔ)句,不必在行末加分號(hào),否則,會(huì)連分號(hào)一起進(jìn)行置換;在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層置換;對(duì)程序中用雙括號(hào)括起來的字符串內(nèi)的字符,即使與宏名相同,也不進(jìn)行置換;宏定義只做字符替換,不分配內(nèi)存空間。例題題目:用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)。

分析:

兩種錯(cuò)誤寫法: #defineSECONDS60*60*24*365 #defineSECONDS(60*60*24*365)正確答案:

#defineSECONDS(60*60*24*365)UL

文件包含

定義:“文件包含”處理是指一個(gè)源文件可以將另外一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來,即將另外的文件包含到本文件之中。

其一般形式為:

#include

"文件名"

#include

<文件名>條件編譯

條件編譯一般有以下兩種形式:

a) #ifdef

標(biāo)識(shí)符

程序段1

#else

程序段2

#endif

b) #ifndef

標(biāo)識(shí)符

程序段1

#else

程序段2

#endif

示例#ifdefBIG_ENDIAN//大端模式下RTC寄存器地址宏定義#definerRTCCON(*(volatileunsignedchar*)0x1d70043)#definerRTCALM(*(volatileunsignedchar*)0x1d70053)#definerALMSEC(*(volatileunsignedchar*)0x1d70057)……#else//小端模式下RTC寄存器地址宏定義#definerRTCCON(*(volatileunsignedchar*)0x1d70040)#definerRTCALM(*(volatileunsignedchar*)0x1d70050)#definerALMSEC(*(volatileunsignedchar*)0x1d70054)……#endif2.嵌入式系統(tǒng)中常用的C語(yǔ)言語(yǔ)句

C語(yǔ)言的語(yǔ)句有多種:如表達(dá)式語(yǔ)句、復(fù)合語(yǔ)句、條件語(yǔ)句、循環(huán)語(yǔ)句、swith語(yǔ)句、break語(yǔ)句、continue語(yǔ)句、返回語(yǔ)句等。嵌入式系統(tǒng)開發(fā)中最為常用的是條件語(yǔ)句、swith語(yǔ)句和循環(huán)語(yǔ)句,這些語(yǔ)句的用法和一般C語(yǔ)言中類似。條件語(yǔ)句

條件語(yǔ)句有兩種格式,分別是兩重選擇和多重選擇,如下所述。switch語(yǔ)句

循環(huán)語(yǔ)句

在C語(yǔ)言中有3種循環(huán)語(yǔ)句:for循環(huán)語(yǔ)句、while循環(huán)語(yǔ)句和dowhile循環(huán)語(yǔ)句,根據(jù)具體的情況選擇使用。for循環(huán)語(yǔ)句格式:例題:使用for循環(huán)語(yǔ)句控制在8段數(shù)碼管上循環(huán)顯示0~F。voidDigit_Led_Display(void){inti;for(i=0;i<16;i++){LED8ADDR=Symbol[value];//LED8ADDR為8段數(shù)碼管地址,//Symbol[]中為段碼值Delay(10000);//延時(shí)

}}循環(huán)語(yǔ)句

例題:在嵌入式系統(tǒng)中沒有程序的結(jié)尾,通常在主函數(shù)中有一個(gè)死循環(huán),如何實(shí)現(xiàn)死循環(huán)?

while(1){…}while循環(huán)語(yǔ)句格式:dowhile循環(huán)語(yǔ)句格式:4.4.2匯編語(yǔ)言與C語(yǔ)言的混合編程

匯編語(yǔ)言與C/C++的混合編程通常有以下幾種方式:(1)在C/C++代碼中嵌入?yún)R編指令。(2)在匯編程序和C/C++的程序之間進(jìn)行變量的互訪。(3)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論