ARM嵌入式開發(fā)實例-第4章_第1頁
ARM嵌入式開發(fā)實例-第4章_第2頁
ARM嵌入式開發(fā)實例-第4章_第3頁
ARM嵌入式開發(fā)實例-第4章_第4頁
ARM嵌入式開發(fā)實例-第4章_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1在前面的內(nèi)容中已經(jīng)向讀者介紹過有關(guān)STM32F103XX系列處理器的指令系統(tǒng)。盡管目前處理器的編譯技術(shù)完全可以支持高級語言在嵌入式開發(fā)系統(tǒng)中的運行,但匯編語言的作用仍然不可替代。在STM32F103XX系列處理器的嵌入式系統(tǒng)開發(fā)過程中,最常用的編程語言就是匯編語言和C語言。這兩種程序設(shè)計語言各自具有不同的特點,并且兩者混合使用還能有助于用戶理解嵌入式系統(tǒng)的原理,提高嵌入式系統(tǒng)的調(diào)試能力。在本章內(nèi)容中,主要向讀者介紹ARM嵌入系統(tǒng)中匯編語言和C語言程序設(shè)計的方法。通過本章的學(xué)習(xí),用戶可以掌握匯編語言和C程序語言在嵌入式系統(tǒng)編程中的具體使用方法。第4章STM32F103XX程序設(shè)計本章節(jié)重難點2【本章重點】1匯編語言的程序設(shè)計;2C語言的程序設(shè)計;3匯編語言與C語言的混合編程;【本章難點】1程序設(shè)計中的變量定義;2C語言與匯編語言的交叉使用;3ARM嵌入式系統(tǒng)中的程序文件,通常也被稱為源文件,可以由任意一種文本編輯器來編寫。在ARM程序設(shè)計中,常用的源文件可以簡單的分為以下幾種,如表4.1所示。第4章STM32F103XX程序設(shè)計4.1STM32F103XX處理器的匯編程序開發(fā)框架表4.1ARM嵌入式系統(tǒng)中的源文件

44.1STM32F103XX處理器的匯編程序開發(fā)框架源程序文件文件后綴名說明匯編程序文件*.s用ARM匯編語言編寫的ARM程序或Thumb程序代碼C程序文件*.c用C語言編寫的程序代碼頭文件*.h為了簡化源程序代碼,將程序中經(jīng)常使用的常量命名、宏定義、數(shù)據(jù)結(jié)構(gòu)定義等,單獨放到一個文件中,該文件即為頭文件1、在ARM處理器中,匯編語言的語法結(jié)構(gòu)如下所示:標(biāo)號操作碼操作數(shù)1,操作數(shù),…… ;注釋標(biāo)號是代表地址的符號,必須在一行的頂格書寫,其后不能添加冒號“:”,而所有指令均不能頂格書寫。ARM匯編語言對標(biāo)識符的大小寫敏感,書寫標(biāo)號及指令時字母大小寫要一致。在ARM匯編語言中,ARM指令、偽指令、存放器名等可以全部大寫或者全部小寫,但不能大小寫混合使用。為了使源文件易讀,可以將一條長的指令通過使用反斜杠字符“\”將其分成幾行書寫。每行從第一個分號開始到本行結(jié)束為注釋內(nèi)容,所有的注釋內(nèi)容均被匯編起忽略。54.1STM32F103XX處理器的匯編程序開發(fā)框架〔第二章課件〕2、ARM匯編語言程序的根本結(jié)構(gòu)在ARM匯編語言程序中,以程序段為單位來組織代碼。段是相對獨立的指令或數(shù)據(jù)序列,具有特定的名稱。段可以分為代碼段和數(shù)據(jù)段,代碼段的內(nèi)容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運行時所需的數(shù)據(jù)。可執(zhí)行映像文件通常由以下幾局部構(gòu)成:一個或多個代碼段,代碼段為只讀屬性。零個或多個包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。零個或多個不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫64.1STM32F103XX處理器的匯編程序開發(fā)框架〔第二章課件〕73.1STM32F103XX系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架4.1.1ARM匯編語言中的代碼程序段將通過下面的匯編代碼向讀者介紹有關(guān)匯編語言中的代碼程序段。

AREAexample,CODE,READONLY ENTRYStartMOVR1,#0x1 MOVR2,#0x02 MOVR3,R1,R2 END8“AREAexample,CODE,READONLY”定義了一個名為example的代碼段。需要說明的是,AREA是匯編代碼中的一個偽指令,其功能是用來定義匯編語言中的代碼段或者數(shù)據(jù)段。AREA的根本語法格式為:AREA段名稱{,段的屬性1}{,段的屬性2}此外,偽指令CODE那么是對該段的屬性進(jìn)行設(shè)定,即表示該段的屬性為代碼段。與其對應(yīng)的是,如果偽指令是DATA,那么表示該段的屬性為數(shù)據(jù),即該段為數(shù)據(jù)段。1.1

ARM嵌入式系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架9偽指令READONLY是表示該代碼段的讀寫屬性為“只讀”。除此之外,用戶還可以通過使用偽指令READWRITE來表示當(dāng)前該代碼段的讀寫屬性為“可讀寫”;偽指令ENTRY用來標(biāo)識當(dāng)前代碼段的入口。在每一個匯編文件中,只能有一個偽指令ENTRY,即只能有一個程序入口;偽指令END標(biāo)志當(dāng)前程序段的結(jié)束。需要提醒用戶注意的是,END結(jié)束標(biāo)識符必須和ENTRY偽指令匹配使用。1.1

ARM嵌入式系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架10用DATA偽指令來定義了一段數(shù)據(jù)代碼段。

AREA

DataField,DATA,READWRITE DATA1SPACE256;分配一段連續(xù)的存儲單元;并初始化0 DATA2SPACE128 DATADCD2,3,4;1.1

ARM嵌入式系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架4.1.2ARM匯編語言中的數(shù)據(jù)程序段11在ARM匯編語言中有著對應(yīng)的宏定義的方法,其偽指令是MACRO,并與MEND配對使用,用于表示宏定義的結(jié)束。

MACRO

MULTI2 $DATA1;當(dāng)前宏定義代碼段的名稱 MOV R0,$DATA1 MOV R1,$DATA1 ADD R0,R0,R1;實現(xiàn)功能$DATA1*2

MEND

MULTI20x12;實現(xiàn)0x12*21.1

ARM嵌入式系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架4.1.3ARM匯編語言中的宏定義12在任何一個編程語言中,符號數(shù)據(jù)的使用可以給程序員帶來很大的便捷。如果沒有符號數(shù)據(jù),在程序設(shè)計的過程中必須使用嵌入式系統(tǒng)中操作數(shù)的內(nèi)存地址才能實現(xiàn)對數(shù)據(jù)的訪問。并且還需要在用到常量的地方注明當(dāng)前內(nèi)存空間的數(shù)值,一旦常量的數(shù)值發(fā)生改變就需要重新替換程序代碼中所有使用該常量的地方。在ARM嵌入式匯編代碼中,用戶可以使用符號數(shù)據(jù)來簡化程序代碼中變量。在使用符號數(shù)據(jù)的過程中,用戶必須遵守以下3個條件:〔1〕符號數(shù)據(jù)必須使用大小寫字母、數(shù)字或下劃線的組合來命名;

1.1

ARM嵌入式系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架4.1.4ARM匯編語言中的符號數(shù)據(jù)13〔2〕符號數(shù)據(jù)的名稱去區(qū)分大小寫。相同字符但大小寫不同的符號數(shù)據(jù),系統(tǒng)默認(rèn)為2個不同的符號數(shù)據(jù);〔3〕符號數(shù)據(jù)的名稱不可以與匯編語言中的偽指令重復(fù);1、常量的定義在所有的編程語言中,常量是較為常見的數(shù)據(jù)。在ARM匯編語言中,常量是32bit的整數(shù)。用戶可以使用偽指令EQU來定義數(shù)字常量。需要提醒用戶注意的是,用戶在定義完數(shù)字常量后,不可以再改變其數(shù)值。2、變量的定義在程序設(shè)計的過程中,變量是最常用的數(shù)據(jù)格式。在ARM匯編語言中,根據(jù)變量自身的作用范圍,可以將其分為全局變量和局部變量。

1.1

ARM嵌入式系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架14在ARM匯編語言中,用戶可以通過GBLA、GBLL和GBLS來申明全局變量;通過LCLA、LCLL和LCLS來聲明局部變量;同時,還可以使用SETA、SETL和SETS來對申明后的變量進(jìn)行賦值操作。1.1

ARM嵌入式系統(tǒng)簡介4.1STM32F103XX處理器的匯編程序開發(fā)框架15在ARM嵌入式系統(tǒng)中,雖然匯編語言與其他編程語言相比可以用更高的代碼效率,但實際上C/C++語言仍然是ARM嵌入式系統(tǒng)開發(fā)的主流編程語言。C/C++編程語言執(zhí)行效率較高,語法格式自由,模塊化性能好,因此受到很多ARM嵌入式開發(fā)工程師的青睞。在本章節(jié)的內(nèi)容中,將向讀者介紹C語言在ARM嵌入式系統(tǒng)中的應(yīng)用。需要說明的是,關(guān)于ARM嵌入式中C/C++編程語言的根本語法格式,與常用計算機軟件開發(fā)中用到的C/C++編程語言的語法格式根本相同。因此,本章節(jié)將主要就C語言在ARM嵌入式系統(tǒng)開發(fā)過程中,相對計算機軟件開發(fā)而言比較特殊的方面進(jìn)行詳細(xì)的介紹。第四章STM32F103XX程序設(shè)計4.2STM32F103XX處理器的數(shù)據(jù)操作圖4-1C語言中的數(shù)據(jù)類型

16在C語言程序中,數(shù)據(jù)類型可分為:根本數(shù)據(jù)類型,構(gòu)造數(shù)據(jù)類型,指針類型,空類型四大類,如圖4-1所示。4.2

STM32F103XX處理器的數(shù)據(jù)操作4.2.1C語言中數(shù)據(jù)類型表4.3C語言中的常用和數(shù)據(jù)類型

171.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作基本數(shù)據(jù)類型類型說明符字節(jié)長度數(shù)值范圍字符型char1C字符集基本整型int2-32768~32767短整型shortint2-32768~32767長整型longint4-214783648~214783647無符號型unsigned20~65535無符號長整型unsignedlong40~4294967295單精度實型float43/4E-38~3/4E+38雙精度實型double81/7E-308~1/7E+308在ARM嵌入式操作系統(tǒng)中,常用的根本數(shù)據(jù)類型可以大致歸結(jié)為以下幾種,具體如表4.3所示。用戶可以在該表中查詢常用數(shù)據(jù)類型的說明符、數(shù)據(jù)占據(jù)的存儲空間〔字節(jié)長度〕,以及數(shù)據(jù)類型所能表示的數(shù)值范圍。18在C語言程序設(shè)計中,用戶可以使用printf函數(shù)實現(xiàn)對數(shù)據(jù)的輸出操作。與此對應(yīng)的是,用戶可以使用scanf函數(shù)實現(xiàn)對數(shù)據(jù)的輸入操作。關(guān)于這兩個輸入輸出的函數(shù)的根本內(nèi)容,用戶都可以在標(biāo)準(zhǔn)C函數(shù)庫中查詢到。具體的語法格式為:〔1〕printf(格式控制,輸出表列〕;〔2〕scanf(格式控制,&輸出表列〕;從上述兩個函數(shù)的根本語法格式可以看出,printf函數(shù)和scanf函數(shù)的根本格式都是一致的。唯一不同的是,在scanf函數(shù)中,參數(shù)表列的前面需要添加取地址操作符-&。1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作4.2.2C語言中數(shù)據(jù)輸入/輸出格式19在ARM嵌入式C語言中,對于根本數(shù)據(jù)類型量,按其取值是否可改變又分為常量和變量兩種。在程序執(zhí)行過程中,數(shù)值不發(fā)生改變的量稱為常量,數(shù)值可變的量稱為變量。同時,ARM嵌入式代碼中的變量和常量還可以與數(shù)據(jù)類型結(jié)合起來分類。例如整型常量、整型變量、浮點型常量、浮點型變量、字符常量、字符變量、枚舉常量、枚舉變量。需要說明的是,在ARM嵌入式程序代碼中,常量是可以不經(jīng)申明而直接引用的,而變量那么必須先定義后使用。1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作4.2.3C語言中的變量和常量201、常量的定義和使用在代碼執(zhí)行的過程中,數(shù)值不發(fā)生改變的量稱為常量。在ARM嵌入式語言中,常見的常量類型可以分為以下幾種:〔1〕直接常量〔2〕標(biāo)識符〔3〕符號常量2、變量的定義和使用在代碼運行的過程中,數(shù)值可以改變的量稱為變量。在ARM嵌入式程序代碼中,任何一個變量都必須有一個變量名,并且在內(nèi)存中占據(jù)一定的存儲單元。ARM嵌入式代碼中,變量定義與常量的定義有所區(qū)別,用戶必須在變量使用之前對其進(jìn)行申明操作。通常情況下,變量的申明放在函數(shù)體的開頭局部。1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作21整型〔INTEGER〕數(shù)據(jù)是不包含小數(shù)局部的數(shù)值型數(shù)據(jù),用字母I表示。整型數(shù)據(jù)只用來表示整數(shù),以二進(jìn)制形式存儲。1.整形變量的格式〔1〕十進(jìn)制整常數(shù)(13)〔2〕八進(jìn)制整常數(shù)〔015〕〔3〕十六進(jìn)制整常數(shù)(0x1101)2.整形變量的分類在ARM嵌入式C語言程序代碼中,根據(jù)數(shù)據(jù)類型的長度,可以將其分為根本型,短整型,長整形,無符號型。

1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作4.2.4C語言中的整型數(shù)據(jù)223.整形變量的定義在ARM嵌入式程序代碼的設(shè)計過程中,用戶在使用變量前必須進(jìn)行聲明和定義,這是與C語言中常量不同的地方。變量定義的一般形式為:類型說明符

變量名標(biāo)識符,變量名標(biāo)識符,...;在C語言中,用戶可以通過下面的幾行代碼來聲明定義整型變量,例如:inta,b,c; //定義3個整型變量a,b,c為整型變量longx,y; //x,y為長整型變量unsignedp,q; //p,q為無符號整型變量1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作23在ARM嵌入式編程語言中,實型數(shù)據(jù)也稱為浮點型數(shù)據(jù)。與整型數(shù)據(jù)類似的是,實型數(shù)據(jù)也可以有常量和變量之分。在程序運行過程中可以改變其值的實型數(shù)據(jù)被稱為實型變量。在程序運行過程中不可以改變其值的實型數(shù)據(jù)被稱為實型常量。1.實型常量的格式實型常量也稱為實數(shù)或者浮點數(shù)。在C語言中,實數(shù)只能采用十進(jìn)制的表達(dá)格式。但實型常量可以使用2種不同形式的表達(dá)方法,即十進(jìn)制數(shù)形式,指數(shù)形式。1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作4.2.5C語言中的實型數(shù)據(jù)242.實型變量在ARM嵌入式系統(tǒng)中,實型數(shù)據(jù)一般占4個字節(jié)〔32bit〕內(nèi)存空間,且按指數(shù)形式存儲在系統(tǒng)的內(nèi)存空間中。從實型變量的格式上來看,小數(shù)局部占的位〔bit〕數(shù)愈多,數(shù)的有效數(shù)字愈多,精度愈高。而指數(shù)局部占的位數(shù)愈多,那么能表示的數(shù)值范圍愈大。根據(jù)數(shù)據(jù)的長度,可以將實型變量分為以下3種類型:單精度float型、雙精度double型和長雙精度longdouble型。1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作25字符型〔Character〕數(shù)據(jù)是不具計算能力的文字?jǐn)?shù)據(jù)類型,通常情況下用字母C表示。它包括中文字符、英文字符、數(shù)字字符和其他ASCII字符,其長度〔即字符個數(shù)〕范圍是0-254個字符。與前面幾種數(shù)據(jù)類型相似的是,C語言中的字符型數(shù)據(jù)同樣分為字符型常量和字符型變量。1.1

ARM嵌入式系統(tǒng)簡介4.2.6C語言中的字符型數(shù)據(jù)4.2

STM32F103XX處理器的數(shù)據(jù)操作26在ARM嵌入式程序代碼中,字符串常量是由一對雙引號括起的字符序列。例如:“CHINA”,“Cprogram”,“$12.5”等都是合法的字符串常量。字符串常量和字符常量是不同的數(shù)據(jù)類型,但兩者之間也有不同之處,主要有以下幾點區(qū)別:〔1〕字符型常量通常由單引號來引用,字符串常量那么通常由雙引號來引用;‘a(chǎn)’“china”〔2〕字符常量只能是單個字符,字符串常量那么可以含一個或多個字符;1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作4.2.7C語言中的字符串常量27〔3〕用戶可以把一個字符常量賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量。需要注意的是,在ARM嵌入式程序代碼中,沒有相應(yīng)的字符串變量。這是與其他編程語言不同的。但是用戶可以用一個字符數(shù)組來存放一個字符串常量;〔4〕字符常量占一個字節(jié)的內(nèi)存空間。字符串常量占的內(nèi)存字節(jié)數(shù)等于字符串中字節(jié)數(shù)加1。增加的一個字節(jié)中存放字符"\0"(ASCII碼為0)。這也是字符串結(jié)束的標(biāo)志。1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作28在ARM嵌入式程序代碼中,變量的數(shù)據(jù)類型是可以相互轉(zhuǎn)換的。轉(zhuǎn)換的方法有兩種,一種是自動轉(zhuǎn)換,一種是強制轉(zhuǎn)換。〔1〕數(shù)據(jù)類型的自動轉(zhuǎn)換通常情況下,自動轉(zhuǎn)換常用在不同數(shù)據(jù)類型的量混合運算時,由編譯系統(tǒng)自動完成?!?〕數(shù)據(jù)類型的強制轉(zhuǎn)換強制類型轉(zhuǎn)換是通過類型轉(zhuǎn)換運算來實現(xiàn)的,具體的語法格式如下所示:(類型說明符)(表達(dá)式)〔float〕〔a〕其功能主要是把表達(dá)式的運算結(jié)果強制轉(zhuǎn)換成類型說明符所表示的類型。1.1

ARM嵌入式系統(tǒng)簡介4.2

STM32F103XX處理器的數(shù)據(jù)操作4.2.8不同類型數(shù)據(jù)之間的混合運算29第四章STM32F103XX程序設(shè)計4.3STM32F103XX處理器的數(shù)據(jù)運算在ARM嵌入式程序代碼中,系統(tǒng)支持了大量C語言格式的運算符和表達(dá)式。因此,用戶可以通過不同的運算符和表達(dá)式在ARM嵌入式系統(tǒng)中實現(xiàn)各種對數(shù)據(jù)處理的功能,這也是ARM嵌入式程序設(shè)計的主要特點之一。與通用C語言的數(shù)據(jù)運算相同的是,ARM嵌入式程序代碼中的運算符不僅具有不同的優(yōu)先級,而且還具有一定的結(jié)合性。用戶在使用在表達(dá)式對數(shù)據(jù)進(jìn)行處理的過程中,參與運算的各個數(shù)據(jù)參與運算的先后順序不僅要遵守運算符優(yōu)先級別的規(guī)定,還要受到運算符結(jié)合性的制約,以便確定是自左向右進(jìn)行運算還是自右向左進(jìn)行運算。這種結(jié)合性是其它高級語言的運算符所沒有的,因此也增加了C語言的復(fù)雜性。30在ARM嵌入式程序代碼中,常見的算術(shù)運算操作符有加法運算符“+”、減法運算符“-”、乘法運算符“*”和除法運算符“/”。一般而言,ARM嵌入式系統(tǒng)中的乘法和除法操作具有專用的乘法器和除法器,主要是由于在ARM處理器中進(jìn)行乘法和除法運算需要占用大量的系統(tǒng)時間和資源,因此局部ARM處理器中,系統(tǒng)為用戶提供了專用的硬件乘法器和除法器。這種做法在很大程度上減輕了處理器的排隊任務(wù),有利于提高數(shù)據(jù)運算的效率。但該方法的缺點也比較明顯,即系統(tǒng)需要配備硬件乘法器和除法器,提供了ARM處理器的本錢。4.3

STM32F103XX處理器的數(shù)據(jù)運算4.3.1ARM程序代碼中的算術(shù)運算符31在ARM嵌入式程序代碼中,算術(shù)運算表達(dá)式是由常量、變量、函數(shù)和運算符組合起來的式子。一個表達(dá)式有一個值及其類型,它們等于計算表達(dá)式所得結(jié)果的值和類型。表達(dá)式求值按運算符的優(yōu)先級和結(jié)合性規(guī)定的順序進(jìn)行,例如最常見的是數(shù)學(xué)運算中的四那么運算。從某種意義上而言,單個的常量、變量、函數(shù)可以看作是表達(dá)式的特例。在ARM嵌入式程序代碼中,運算符的運算優(yōu)先級共分為15級,其中1級最高,15級最低。在表達(dá)式中,優(yōu)先級較高的先于優(yōu)先級較低的進(jìn)行運算。而在一個運算量兩側(cè)的運算符優(yōu)先級相同時,那么按運算符的結(jié)合性所規(guī)定的結(jié)合方向處理。1.1

ARM嵌入式系統(tǒng)簡介4.3

STM32F103XX處理器的數(shù)據(jù)運算4.3.2算術(shù)運算符的優(yōu)先級和結(jié)合性32除了上述的算術(shù)優(yōu)先級外,用戶在執(zhí)行運算操作的過程中還需要注意運算符之間的結(jié)合性。在ARM嵌入式程序代碼中,運算符的結(jié)合性分為兩種,即左結(jié)合性(自左至右)和右結(jié)合性(自右至左)。通常情況下,算術(shù)運算符的結(jié)合性是自左至右,即先左后右。例如在表達(dá)式x-y+z中,參數(shù)y應(yīng)先與“-”號結(jié)合,執(zhí)行x-y運算,然后再執(zhí)行+z的運算。這種自左至右的結(jié)合方向就稱為“左結(jié)合性”。除了上述的“左結(jié)合性”外,在局部算術(shù)表達(dá)式中還支持“右結(jié)合性”,即自右至左的結(jié)合方式。最典型的右結(jié)合性運算符是賦值運算符。例如在賦值表達(dá)式x=y=z中,由于“=”的右結(jié)合性,應(yīng)先執(zhí)行y=z再執(zhí)行x=(y=z)運算。

1.1

ARM嵌入式系統(tǒng)簡介33在ARM嵌入式程序代碼中,不同的數(shù)據(jù)類型之間可能需要相互轉(zhuǎn)化。需要說明的是,除了可以實現(xiàn)對變量類型的數(shù)據(jù)轉(zhuǎn)換外,同樣還可以對表達(dá)式的數(shù)據(jù)類型進(jìn)行強制轉(zhuǎn)換。用戶可以通過數(shù)據(jù)類型的強制轉(zhuǎn)換來實現(xiàn)不同數(shù)據(jù)類型的變通,具體的語法操作格式如下所示:〔類型說明符〕〔表達(dá)式〕該語法功能是將表達(dá)式的運算結(jié)果強制轉(zhuǎn)換成類型說明符所表示的類型。1.1

ARM嵌入式系統(tǒng)簡介4.3

STM32F103XX處理器的數(shù)據(jù)運算4.3.3數(shù)據(jù)類型的強制轉(zhuǎn)換34在ARM嵌入式代碼中,為了簡化循環(huán)操作,系統(tǒng)為用戶提供了自增與自減操作。在ARM嵌入式程序代碼中:〔1〕自增1運算符記為“++”,其功能是使變量值自增1;〔2〕自減1運算符記為“--”,其功能是使變量值自減1。需要說明的是,ARM嵌入式程序代碼中的“自增1”和“自減1”運算符均為單目運算,且都具有右結(jié)合性。1.1

ARM嵌入式系統(tǒng)簡介4.3

STM32F103XX處理器的數(shù)據(jù)運算4.3.4自增與自減操作35常用的自增與自減操作主要有以下幾種形式:++i i自增1后再參與其它運算--i i自減1后再參與其它運算i++ i參與運算后,i的值再自增1i-- i參與運算后,i的值再自減1在理解和使用上容易出錯的是i++和i--。特別是當(dāng)它們出在較復(fù)雜的表達(dá)式或語句中時,常常難于弄清,因此應(yīng)仔細(xì)分析。一般情況下,除了在一些功能比較明確的程序代碼中,如循環(huán)累加、累加運算,可以使用外,在其他的嵌入式代碼中,特別是存在全局變量的程序代碼中,不建議用戶過多的使用自增或自減操作。1.1

ARM嵌入式系統(tǒng)簡介4.3

STM32F103XX處理器的數(shù)據(jù)運算36在ARM嵌入式程序代碼中,需要對變量以及表達(dá)式進(jìn)行賦值操作。通常情況下,用戶可以通過賦值運算符“=”對變量或表達(dá)式進(jìn)行賦值操作,其中簡單賦值運算符用“=”來表示。在ARM嵌入式程序代碼中,由賦值運算符“=”連接的表達(dá)式稱為賦值表達(dá)式。其根本的語法格式如下所示:變量=表達(dá)式用戶除了可以對變量和表達(dá)式進(jìn)行賦值操作外,還可以將賦值表達(dá)式組成賦值語句,按照C語言規(guī)定,任何表達(dá)式在其末尾加上分號“;”就構(gòu)成為賦值語句。1.1

ARM嵌入式系統(tǒng)簡介4.3

STM32F103XX處理器的數(shù)據(jù)運算4.3.5賦值運算符和賦值表達(dá)式37在ARM嵌入式程序設(shè)計語言中,用戶還可以在賦值符“=”之前加上其它二目運算符構(gòu)成復(fù)合賦值符,如+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=等。

構(gòu)成復(fù)合賦值表達(dá)式的一般形式為:變量

雙目運算符=表達(dá)式需要說明的是,根據(jù)不同的符合賦值表達(dá)式的定義,可以將其等效于如表4.9所示的賦值表達(dá)式,即:變量=變量運算符表達(dá)式1.1

ARM嵌入式系統(tǒng)簡介4.3

STM32F103XX處理器的數(shù)據(jù)運算38在ARM嵌入式程序代碼中,逗號“,”也是一種運算符,稱為逗號運算符。其功能是將兩個表達(dá)式連接起來組成一個新的表達(dá)式,稱為逗號表達(dá)式。有關(guān)逗號表達(dá)式的語法格式具體如下所示:表達(dá)式1,表達(dá)式2有關(guān)逗號表達(dá)式求值的過程是分別求逗號前后兩個表達(dá)式的值,并以表達(dá)式2的值作為整個逗號表達(dá)式的值。用戶可以通過下面的例子對逗號運算符進(jìn)行了解。1.1

ARM嵌入式系統(tǒng)簡介4.3.6逗號運算符4.3

STM32F103XX處理器的數(shù)據(jù)運算39有關(guān)逗號表達(dá)式以及逗號運算符的內(nèi)容,還需要補充說明以下2點:〔1〕在逗號表達(dá)式的一般形式中,逗號運算符前后的表達(dá)式1和表達(dá)式2不僅可以是簡單的算術(shù)運算,也同樣可以是逗號表達(dá)式,即在逗號表達(dá)式中嵌套逗號表達(dá)式;〔2〕通常情況下,用戶在程序代碼中使用逗號表達(dá)式,是要分別求逗號表達(dá)式內(nèi)各表達(dá)式的值,并不一定要求整個逗號表達(dá)式的值。但需要提醒用戶注意的是,并不是在所有出現(xiàn)逗號的地方都會組成逗號表達(dá)式,例如在變量聲明、定義的過程中,函數(shù)參數(shù)表中逗號只是用作各變量之間的間隔符。

1.1

ARM嵌入式系統(tǒng)簡介4.3

STM32F103XX處理器的數(shù)據(jù)運算40通常情況下,ARM嵌入式程序中代碼的執(zhí)行是過程化的,即從上往下依次逐行執(zhí)行。但在實際的代碼設(shè)計過程中,經(jīng)常需要指定程序代碼執(zhí)行某局部而不執(zhí)行某局部,或者反復(fù)執(zhí)行某局部,這些就是流程控制。在ARM嵌入式程序代碼中,流程控制語句有兩類,具體有〔1〕判斷語句〔2〕循環(huán)語句。除此之外,在ARM嵌入式系統(tǒng)中還有一個能綜合使用判斷語句和起來的條件循環(huán)語句,即C語言中的while循環(huán)語句。第四章STM32F103XX程序設(shè)計4.4STM32F103XX的流程控制語句41在ARM嵌入式程序代碼中,用戶可以通過if語句來構(gòu)成分支結(jié)構(gòu)。它根據(jù)給定的條件進(jìn)行判斷,以決定執(zhí)行某個分支程序段。C語言的if語句有三種根本形式,if語句、if-else語句和if-else-if語句。1.If語句:if判斷語句的第一種形式為根本形式,也是if判斷語句中最為簡單的一種形式,具體的語法格式如下所示:if(表達(dá)式)執(zhí)行語句;該if判斷語句的根本含義是:如果偽指令if后表達(dá)式的值為真,那么執(zhí)行其后的執(zhí)行語句,否那么將不執(zhí)行該語句。4.4

STM32F103XX的流程控制語句4.4.1ARM中的if條件判斷語句422.If-else語句:在ARM嵌入式程序代碼中,用戶除了可以在滿足if判斷條件時通過判斷語句進(jìn)行流程控制外,還可以在不滿足if判斷條件的狀況下進(jìn)行流程控制,即if-else判斷語句。該判斷語句的根本語法格式如下所示:if(表達(dá)式)語句1;else語句2;該if-else判斷語句的根本含義是:如果偽指令if后表達(dá)式的值為真,那么執(zhí)行語句1;否那么程序?qū)?zhí)行語句2。1.1

ARM嵌入式系統(tǒng)簡介4.4

STM32F103XX的流程控制語句433.If-else-if語句:從上述2中if判斷語句的根本用法來看,在ARM嵌入式系統(tǒng)中,用戶不僅可以在符合if判斷語句條件的情況下執(zhí)行指定的操作代碼,也同樣可以在不滿足if判斷語句條件的情況下執(zhí)行指定的操作代碼。除此之外,在ARM嵌入式程序代碼中,用戶還可以使用if-else-if形式來實現(xiàn)條件判斷操作。前面介紹的2種形式的if條件判斷語句一般都用于兩個分支的情況。當(dāng)有多個分支需要選擇的時候,可采用if-else-if語句,其一般語法形式為:if(表達(dá)式1) 語句1;elseif(表達(dá)式2)語句2;1.1

ARM嵌入式系統(tǒng)簡介4.4

STM32F103XX的流程控制語句44elseif(表達(dá)式3)語句3;…elseif(表達(dá)式m)語句m;else語句n;上述代碼的根本語義是:編譯器依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個值為真時,那么執(zhí)行其對應(yīng)的語句,然后程序?qū)⑻秸麄€if語句之外繼續(xù)執(zhí)行其他的程序代碼。如果所有的表達(dá)式均為假,那么執(zhí)行語句n,然后跳出if-else-if語句并繼續(xù)執(zhí)行后續(xù)程序。1.1

ARM嵌入式系統(tǒng)簡介4.4

STM32F103XX的流程控制語句45在ARM嵌入式程序系統(tǒng)中,用戶除了可以通過if條件判斷語句進(jìn)行流程控制,還可以通過分支選擇語句來實現(xiàn)多重分支的選擇。C語言中,用戶可以通過switch語句來完成上述分支選擇的功能,具體的語法格式如下所示:switch(表達(dá)式){case常量表達(dá)式1:語句1;case常量表達(dá)式2:語句2;…case常量表達(dá)式n:語句n;default:語句n+1;}1.1

ARM嵌入式系統(tǒng)簡介4.4

STM32F103XX的流程控制語句4.4.2ARM中的switch分支選擇語句46在上述的程序代碼中,其根本的語義是:計算表達(dá)式的值,并逐個與其后case中的常量表達(dá)式值相比較。當(dāng)表達(dá)式的值與某個常量表達(dá)式的值相等時,即執(zhí)行其后的語句,繼而不再進(jìn)行判斷,執(zhí)行后面所有case中的語句。如表達(dá)式的值與所有case后的常量表達(dá)式均不相同時,那么執(zhí)行default后的語句。需要提醒用戶注意的是,在使用switch語句時還應(yīng)注意以下幾點:〔1〕在case分支語句后的各常量表達(dá)式的值不能相同,否那么會出現(xiàn)錯誤;〔2〕在case分支語句后,系統(tǒng)允許有多個執(zhí)行語句,也允許用戶不使用{}括起來;〔3〕每一個case和default子句的先后順序可以相互變動,而不會影響程序執(zhí)行結(jié)果;〔4〕default子句可以省略不用;1.1

ARM嵌入式系統(tǒng)簡介4.4

STM32F103XX的流程控制語句47在ARM嵌入式程序代碼中,循環(huán)結(jié)構(gòu)是一種很重要的控制語句。其特點是在給定條件成立時,反復(fù)執(zhí)行某程序段,直到條件不成立為止。其中,給定的條件被稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。通常情況下,ARM嵌入式系統(tǒng)中向用戶提供了以下四種循環(huán)語句。用戶可以使用這些循環(huán)語句組成各種不同形式的循環(huán)結(jié)構(gòu),具體如下所示:〔1〕用goto語句和if語句構(gòu)成循環(huán);〔2〕用while語句;〔3〕用do-while語句;〔4〕用for語句;1.1

ARM嵌入式系統(tǒng)簡介4.4.3ARM中的循環(huán)控制語句4.4

STM32F103XX的流程控制語句48順序程序設(shè)計選擇結(jié)構(gòu)程序設(shè)計循環(huán)結(jié)構(gòu)程序設(shè)計利用函數(shù)處理批量數(shù)據(jù)利用函數(shù)模塊化程序設(shè)計1.1

ARM嵌入式系統(tǒng)簡介4.4

STM32F103XX的流程控制語句

4.5C語言與匯編語言混合編程在C程序和ARM匯編程序之間相互調(diào)用時必須遵守ATPCS規(guī)那么。ATPCS規(guī)定了一些子程序間調(diào)用的根本規(guī)那么,比方:1.存放器的使用規(guī)那么子程序之間通過存放器r0~r3來傳遞參數(shù),當(dāng)參數(shù)個數(shù)多于4個時,使用堆棧來傳遞參數(shù)。在子程序中,使用存放器r4~r11保存局部變量。存放器r12用于保存堆棧指針SP,當(dāng)子程序返回時使用該存放器出棧,記作IP。存放器r13用作堆棧指針,記作SP。存放器r14稱為鏈接存放器,記作LR。該存放器用于保存子程序的返回地址。存放器r15稱為程序計數(shù)器,記作PC。

4.5匯編語言和語言混合編程

4.5C語言與匯編語言混合編程2、堆棧的使用規(guī)那么堆棧采用滿遞減類型〔FD,F(xiàn)ullDescending〕,即堆棧通過減小存儲器地址而向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。3、參數(shù)的傳遞規(guī)那么整數(shù)參數(shù)的前4個使用r0~r3傳遞,其他參數(shù)使用堆棧傳遞;浮點參數(shù)使用編號最小且能夠滿足需要的一組連續(xù)的FP存放器傳遞參數(shù)子程序的返回結(jié)果為一個32位整數(shù)時,通過r0返回;返回結(jié)果為一個64位整數(shù)時,通過r0和r1返回;依此類推。結(jié)果為浮點數(shù)時,通過浮點運算部件的存放器F0、D0或S0返回匯編程序調(diào)用C程序的方法為:首先在匯編程序中使用IMPORT偽指令事先聲明將要調(diào)用的C語言函數(shù);然后通過BL指令來調(diào)用C函數(shù)。例如在一個C源文件中定義了如下求和函數(shù):intadd(intx,inty){return(x+y);}調(diào)用add()函數(shù)的匯編程序結(jié)構(gòu)如下:

IMPORTadd;聲明要調(diào)用的C函數(shù)…MOVr0,1MOVr1,2BLadd;調(diào)用C函數(shù)add4.5C語言與匯編語言混合編程

4.5.2匯編程序調(diào)用C程序的方法C程序調(diào)用匯編子程序的方法為:首先在匯編程序中使用EXPORT偽指令聲明被調(diào)用的子程序,表示該子程序?qū)⒃谄渌募斜徽{(diào)用;然后在C程序中使用extern關(guān)鍵字聲明要調(diào)用的匯編子程序為外部函數(shù)。4.5C語言與匯編語言混合編程

4.5.2C程序調(diào)用匯編程序的方法例如在一個匯編源文件中定義了如下求和函數(shù):EXPORTadd;聲明add子程序?qū)⒈煌獠亢瘮?shù)調(diào)用…add;求和子程序addADDr0,r0,r1MOVpc,lr…在一個C程序的main()函數(shù)中對add匯編子程序進(jìn)行了調(diào)用:externintadd(intx,inty);//聲明add為外部函數(shù)voidmain(){inta=1,b=2,c;c=add(a,b);//調(diào)用add子程序…}在C語言中內(nèi)嵌匯編語句可以實現(xiàn)一些高級語言不能實現(xiàn)或者高級語言不容易實現(xiàn)的功能以及時間緊迫的功能。內(nèi)嵌的匯編器支持大局部ARM指令和Thumb指令,但是不支持諸如直接修改PC實現(xiàn)跳轉(zhuǎn)的底層功能,也不能直接引用C語言中的變量。4.5C語言與匯編語言混合編程

4.5.3C語言中嵌套匯編語句的方法嵌入式匯編語句在形式上表現(xiàn)為獨立定義的函數(shù)體,其語法格式為:__asm{指令[;指令]…[指令]}基于ARM的C語言與匯編語言混合編程舉例舉例:一個向串口不斷發(fā)送0x55的例子。#include"..\inc\config.h"http://將有關(guān)硬件定義的頭文件包含進(jìn)來unsignedchardata;//定義全局變量voidMain(void){ Target_Init();//對目標(biāo)板的硬件初始化

Delay(10);//延時

data=0x55;//給全局變量賦值

while(1){Uart_Printf("%x",data);//向串口送數(shù)

Delay(10);}}…IMPORTMainAREAInit,CODE,READONLY;ENTRY…BLMain;跳轉(zhuǎn)到Main()函數(shù)處的C/C++程序…END;標(biāo)識匯編程序結(jié)束啟動代碼的整體框架C語言寫的主函數(shù)55硬件啟動程序的工作一般包括:〔1〕分配中斷向量表〔2〕初始化存儲器系統(tǒng)〔3〕初始化各工作模式下的堆?!?〕初始化有特殊要求的硬件模塊〔5〕初始化用戶程序的執(zhí)行環(huán)境〔6〕切換處理器的工作模式〔7〕呼叫主應(yīng)用程序第四章STM32F103XX程序設(shè)計4.6基于ARM的硬件啟動程序中斷地址復(fù)位0x00未定義0x04軟件中斷0x08預(yù)取中止0x0C數(shù)據(jù)中止0x10保留0x14IRQ0x18FIQ0x1CARM要求中斷向量表必須放置在從0x0地址開始的連續(xù)32個字節(jié)空間內(nèi)。AREAInit,CODE,READONLYENTRYBResetHandlerBUndefHandlerBSWIHandlerBPreAbortHandlerBDataAbortHandlerB.BIRQHandlerBFIQHandler

中斷向量表的程序通常如下

溫馨提示

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

評論

0/150

提交評論