嵌入式系統(tǒng)原理與應(yīng)用實(shí)驗(yàn)報(bào)告_第1頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用實(shí)驗(yàn)報(bào)告_第2頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用實(shí)驗(yàn)報(bào)告_第3頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用實(shí)驗(yàn)報(bào)告_第4頁(yè)
嵌入式系統(tǒng)原理與應(yīng)用實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式系統(tǒng) 實(shí)驗(yàn)報(bào)告18/55嵌入式系統(tǒng)原理與應(yīng)用實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)一ARM匯編指令實(shí)驗(yàn)—簡(jiǎn)單數(shù)據(jù)搬移實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康氖煜?shí)驗(yàn)開(kāi)發(fā)環(huán)境,掌握簡(jiǎn)單ARM匯編指令的使用方法。二、實(shí)驗(yàn)環(huán)境硬件:PC機(jī)軟件:ADS1.2集成開(kāi)發(fā)環(huán)境三、實(shí)驗(yàn)內(nèi)容熟悉開(kāi)發(fā)環(huán)境并使用LDR/STR,MOV等指令訪問(wèn)寄存器或存儲(chǔ)單元;使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本數(shù)學(xué)/邏輯運(yùn)算。四、實(shí)驗(yàn)要求(1)按照2.3節(jié)介紹的方法,在ADS下創(chuàng)建一個(gè)工程asmlab1,定義兩個(gè)變量x,y和堆棧地址0x1000,將變量x的內(nèi)容存到堆棧頂,然后計(jì)算x+y,并將和存到堆棧的下一個(gè)單元。通過(guò)AXD查看寄存器和memory和寄存器中數(shù)據(jù)變化。(2)在指令后面加上適當(dāng)注釋,說(shuō)明指令功能。(3)指出程序執(zhí)行完成后各相關(guān)寄存器及存儲(chǔ)器單元的具體內(nèi)容。五、實(shí)驗(yàn)過(guò)程(1)在ADS下創(chuàng)建一個(gè)工程asmlab1,定義兩個(gè)變量x,y和堆棧地址0x1000,將變量x的內(nèi)容存到堆棧頂,然后計(jì)算x+y,并將和存到堆棧的下一個(gè)單元。通過(guò)AXD查看寄存器和memory和寄存器中數(shù)據(jù)變化。創(chuàng)建工程:通過(guò)AXD查看寄存器和memory中數(shù)據(jù)變化:(2)在指令后面加上適當(dāng)注釋,說(shuō)明指令功能。AREAInit,CODE,READONLY;AREA用于聲明一個(gè)只讀或讀寫(xiě)的代碼或數(shù)據(jù)段

ENTRY;ENTRY聲明程序入口

CODE32;CODE32用于申明以下代碼為32位ARM指令

xEQU45;x=45

yEQU64;y=64

stack_topEQU0x1000;definethetopaddressforstacks棧頂為0x1000

startMOVSP,#stack_top;SP=0x1000

MOVR0,#x ;R0=45

STRR0,[SP] ;[1000]存放45

MOVR0,#y;R0=64

LDRR1,[SP];LDR加載指令

ADDR0,R0,R1;將R0與R1相加賦值給R0

STRR0,[SP,#4];STRR0,[SP,#4];先執(zhí)行SP+4,再將寄存器R0

B.END;END程序結(jié)束。(3)指出程序執(zhí)行完成后各相關(guān)寄存器及存儲(chǔ)器單元的具體內(nèi)容。六、相關(guān)知識(shí)(1)相關(guān)指令及偽指令A(yù)REA用于聲明一個(gè)只讀或讀寫(xiě)的代碼或數(shù)據(jù)段,ENTRY聲明程序入口,CODE32用于申明以下代碼為32位ARM指令,END程序結(jié)束。LDR加載指令,STR存儲(chǔ)指令.STRR0,[SP,#4];先執(zhí)行SP+4,再將寄存器R0內(nèi)容復(fù)制到SP指向的存儲(chǔ)器(2)存儲(chǔ)器的大小端存儲(chǔ)格式:1)大端格式在這種格式中,字?jǐn)?shù)據(jù)的高位字節(jié)存儲(chǔ)在低地址中,而字?jǐn)?shù)據(jù)的低位字節(jié)則存放在高地址中,如下圖所示。2)小端格式在這種格式中,字?jǐn)?shù)據(jù)的高位字節(jié)存儲(chǔ)在高地址中,而字?jǐn)?shù)據(jù)的低位字節(jié)則存放在低地址中,如下圖所示。實(shí)驗(yàn)二ARM匯編指令實(shí)驗(yàn)—字符串拷貝實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)實(shí)驗(yàn)掌握使用LDB/STB,b等指令完成較為復(fù)雜的存儲(chǔ)區(qū)訪問(wèn)和程序分支,學(xué)習(xí)使用條件碼。二、實(shí)驗(yàn)環(huán)境硬件:PC機(jī)。軟件:ADS1.2集成開(kāi)發(fā)環(huán)境三、實(shí)驗(yàn)內(nèi)容熟悉開(kāi)發(fā)環(huán)境的使用并完成一塊存儲(chǔ)區(qū)的拷貝。完成分支程序設(shè)計(jì),要求判斷參數(shù),根據(jù)不同參數(shù),調(diào)用不同的子程序。四、實(shí)驗(yàn)要求(1)按照2.3節(jié)介紹的方法,在ADS下創(chuàng)建一個(gè)工程asmlab2,定義兩個(gè)數(shù)據(jù)存儲(chǔ)區(qū)Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆棧地址0x400,將變量原字符串的內(nèi)容拷貝到目的字符串中,要能判斷原字符串的結(jié)束符(0),并統(tǒng)計(jì)字符串中字符的個(gè)數(shù)。通過(guò)AXD查看寄存器和memory和寄存器中數(shù)據(jù)變化。(2)在指令后面加上適當(dāng)注釋,說(shuō)明指令功能。(3)指出程序執(zhí)行完成后各相關(guān)寄存器及存儲(chǔ)器單元的具體內(nèi)容。五、實(shí)驗(yàn)過(guò)程(1)按照2.3節(jié)介紹的方法,在ADS下創(chuàng)建一個(gè)工程asmlab2,定義兩個(gè)數(shù)據(jù)存儲(chǔ)區(qū)Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆棧地址0x400,將變量原字符串的內(nèi)容拷貝到目的字符串中,要能判斷原字符串的結(jié)束符(0),并統(tǒng)計(jì)字符串中字符的個(gè)數(shù)。通過(guò)AXD查看寄存器和memory和寄存器中數(shù)據(jù)變化。創(chuàng)建工程如下:通過(guò)AXD查看寄存器和memory中數(shù)據(jù)變化:(2)在指令后面加上適當(dāng)注釋,說(shuō)明指令功能。AREAInit,CODE,READONLY;AREA用于聲明一個(gè)只讀或讀寫(xiě)的代碼或數(shù)據(jù)段,這里是只讀代碼段ENTRY ;ENTRY聲明程序入口CODE32 ;CODE32用于申明以下代碼為32位ARM指令START ;標(biāo)號(hào)“start”MOVSP,#0x400;SP=0x400LDRR0,=Src;LDR偽指令將源字符串的地址值讀取到R0寄存器中LDRR1,=Dst;LDR偽指令將目的字符串的地址值讀取到R1寄存器中MOVR3,#0;R3=0進(jìn)行初始化,用來(lái)統(tǒng)計(jì)字符串中字符的個(gè)數(shù)Strcopy ;標(biāo)號(hào)“strcopy”LDRBR2,[R0],#1;將源地址起始位置的一個(gè)字節(jié)數(shù)據(jù)裝入R2中,且R0=R0+1CMPR2,#0 ;比較R2和結(jié)束符0的大小BEQendcopy;若R2==0表示跳轉(zhuǎn)到endcopy處STRBR2,[R1],#1;若R2!=0,把寄存器R2中的字?jǐn)?shù)據(jù)(32位)保存到目的地址的內(nèi)存地址中,且R1=R1+1ADDR3,R3,#1;R3=R3+1用來(lái)統(tǒng)計(jì)字符串中字符的個(gè)數(shù)Bstrcopy;跳轉(zhuǎn)回標(biāo)號(hào)“strcopy”處Endcopy ;標(biāo)號(hào)“endcopy”LDRR0,=ByteNum?;LDR偽指令將ByteNum的地址值讀取到R0寄存器中STRR3,[R0]?;將統(tǒng)計(jì)得到的字符個(gè)數(shù)存儲(chǔ)到ByteNum內(nèi)存單元中B. ;無(wú)限循環(huán)跳轉(zhuǎn)到當(dāng)前地址AREADatapool,DATA,READWRITE;AREA用于聲明一個(gè)只讀或讀寫(xiě)的代碼或數(shù)據(jù)段,這里是讀寫(xiě)數(shù)據(jù)段SrcDCB"string"?;源字符串?dāng)?shù)據(jù)存儲(chǔ)地址 DstDCB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;目的字符串存儲(chǔ)地址ByteNumDCD0;字符個(gè)數(shù)統(tǒng)計(jì)單元存儲(chǔ)地址END ;END程序結(jié)束(3)指出程序執(zhí)行完成后各相關(guān)寄存器及存儲(chǔ)器單元的具體內(nèi)容。六、相關(guān)知識(shí)相關(guān)指令及偽指令LDR:LDR偽指令將一個(gè)32位的常數(shù)或者一個(gè)地址值讀取到寄存器中。當(dāng)需要讀取到寄存器中的數(shù)據(jù)超過(guò)了MOV指令可以操作的范圍時(shí),可以使用LDR偽指令將該數(shù)據(jù)讀取到寄存器中。在匯編編譯器處理源程序時(shí),如果該常數(shù)沒(méi)有超過(guò)MOV可以操作的范圍,則LDR指令被一條MOV替代,否則,該常數(shù)將被放在最近的一個(gè)文字池內(nèi)(literalpool),同時(shí),本指令被一條基于PC的加載指令LDR替代。語(yǔ)法格式:LDR<register>,=<expression>其中,expression為需要讀取的32位常數(shù)。register為目標(biāo)寄存器。加載或者存儲(chǔ)一個(gè)字節(jié)的數(shù)據(jù)時(shí),使用的指令為:LDRB和STRB實(shí)驗(yàn)三ARM匯編指令實(shí)驗(yàn)--ARM處理器工作模式實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?1)通過(guò)實(shí)驗(yàn)掌握學(xué)會(huì)使用msr/mrs指令實(shí)現(xiàn)ARM處理器工作模式的切換,觀察不同模式下的寄存器,加深對(duì)CPU結(jié)構(gòu)的理解;(2)通過(guò)實(shí)驗(yàn)掌握l(shuí)d中如何使用命令行指定代碼段起始地址。二、實(shí)驗(yàn)設(shè)備硬件:PC機(jī)軟件:ADS1.2集成開(kāi)發(fā)環(huán)境三、實(shí)驗(yàn)內(nèi)容通過(guò)ARM匯編指令,在各種處理器模式下切換并觀察各種模式下寄存器的區(qū)別;掌握ARM不同模式的進(jìn)入與退出。四、實(shí)驗(yàn)原理1.ARM處理器模式ARM體系結(jié)構(gòu)支持下表所列的7種處理器模式。2.程序狀態(tài)寄存器程序狀態(tài)寄存器CPSR和SPSR包含了條件碼標(biāo)志,中斷禁止位,當(dāng)前處理器模式以及其他狀態(tài)和控制信息。每種異常模式都有一個(gè)程序狀態(tài)保存寄存器SPSR。當(dāng)異常出現(xiàn)時(shí),SPSR用于保留CPSR的狀態(tài)。CPSR和SPSR的格式如下:條件碼標(biāo)志:?N,Z,C,V大多數(shù)指令可以檢測(cè)這些條件碼標(biāo)志以決定程序指令如何執(zhí)行2)控制位:最低8位I,F,T和M位用作控制位。當(dāng)異常出現(xiàn)時(shí)改變控制位。當(dāng)處理器在特權(quán)模式下也可以由軟件改變。中斷禁止位:I置1則禁止IRQ中斷;F置1則禁止FIQ中斷。T位:T=0指示ARM執(zhí)行;T=1指示Thumb執(zhí)行。在這些體系結(jié)構(gòu)的系統(tǒng)中,可自由的使用能在ARM和Thumb狀態(tài)之間切換的指令。模式位:M0,M1,M2,M3和M4(M[4:0])是模式位.這些位決定處理器的工作模式.如下表所示。ARM工作模式M[4:0]M[4:0]模式可訪問(wèn)的寄存器0b10000用戶模式PC,R14-R0,CPSR0b10001FIQ模式PC,R14_fiq-R8_fiq,R7-R0,CPSR,SPSR_fiq0b10010IRQ模式PC,R14_irq-R8_fiq,R12-R0,CPSR,SPSR_irq0b10011管理模式PC,R14_svc-R8_svc,R12-R0,CPSR,SPSR_svc0b10111中止模式PC,R14_abt-R8_abt,R12-R0,CPSR,SPSR_abt0b11011未定義模式PC,R14_und-R8_und,R12-R0,CPSR,SPSR_und0b11111系統(tǒng)模式PC,R14-R0,CPSR3.狀態(tài)寄存器與通用寄存器之間的傳送指令A(yù)RM指令中有兩條指令MSR和MRS,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過(guò)“讀取-修改-寫(xiě)回”三個(gè)步驟的操作來(lái)實(shí)現(xiàn)的。需要注意的是不能通過(guò)該指令直接修改CPSR中的T控制位直接將程序狀態(tài)切換到Thumb狀態(tài),必須通過(guò)BX等指令來(lái)完成程序狀態(tài)的切換。(1)狀態(tài)寄存器到通用寄存器的傳送指令(MRS)?MRS指令用于將狀態(tài)寄存器的內(nèi)容傳到通用寄存器中,它主要用于以下三種場(chǎng)合: 通過(guò)“讀取-修改-寫(xiě)回”操作序列修改狀態(tài)寄存器的內(nèi)容。MRS指令用于將狀態(tài)寄存器的內(nèi)容讀到通用寄存器中;? 當(dāng)異常中斷允許嵌套時(shí),需要在進(jìn)入異常中斷之后,嵌套中斷發(fā)生之前保存當(dāng)前處理器模式對(duì)應(yīng)的SPSR。這時(shí)需要先通過(guò)MRS指令讀出SPSR的值,再用其他指令將SPSR值保存起來(lái);? 當(dāng)進(jìn)程切換時(shí)也需要保存當(dāng)前寄存器值。(2)通用寄存器到狀態(tài)寄存器的傳送指令(MSR)?當(dāng)需要保存或修改當(dāng)前模式下CPSR或SPSR的內(nèi)容時(shí),這些內(nèi)容首先必須傳送到通用寄存器中,再對(duì)選擇的位進(jìn)行修改,然后將數(shù)據(jù)回寫(xiě)到狀態(tài)寄存器。這里講述的MSR指令完成這一過(guò)程的最后一步,即將立即數(shù)常量或通用寄存器的內(nèi)容加載CPSR或SPSR的指定區(qū)域。指令格式:?MSR{<cond>}CPSR_f|SPSR_f,#<32-bitimmediate>MSR{<cond>}CPSR_<field>|SPSR_<field>,Rm這里<field>表示下列情況之一:c-控制域-PSR[7:0]。x-擴(kuò)展域-PSR[15:8](在當(dāng)前ARM中未使用)。s-狀態(tài)域-PSR[23:16](在當(dāng)前ARM中未使用)。f-標(biāo)志位域-PSR[31:24]。五、實(shí)驗(yàn)過(guò)程(1)按照2.3節(jié)介紹的方法,在ADS下創(chuàng)建一個(gè)工程asmmodelab,完成各個(gè)模式下的堆棧初始化工作,并將R1-R12的內(nèi)容存入當(dāng)前模式下堆棧。通過(guò)AXD運(yùn)用單步執(zhí)行方式調(diào)試程序,驗(yàn)證工作模式的切換,注意觀察CPSR寄存器中的變化。隨著程序調(diào)試過(guò)程中在模式間的切換,使用寄存器觀察器切換到不同的工作模式下觀察SP(R13)的變化情況。創(chuàng)建工程如下:參考程序及注釋如下:usr_stack_legthequ64 ;用戶模式svc_stack_legthequ32 ;管理模式fiq_stack_legthequ16 ;快速中斷模式irq_stack_legthequ64 ;中斷模式abt_stack_legthequ16 ;中止模式und_stack_legthequ16 ;未定義模式 areareset,code,readonly ;聲明只讀代碼段reset entry ;ENTRY聲明程序入口 code32 ;CODE32用于申明以下代碼為32位ARM指令startmovr0,#0 movr1,#1 movr2,#2 movr3,#3 movr4,#4 movr5,#5 movr6,#6 movr7,#7 movr8,#8 movr9,#9 movr10,#10 movr11,#11 movr12,#12 blinitstack;初始化各模式下的堆棧指針BL(BranchwithLink跳轉(zhuǎn)將PC拷入LR,用于子程序返回);打開(kāi)irq中斷(將cpsr寄存器的i位清0) mrsr0,cpsr ;r0<--cpsr bicr0,r0,#0x80 ;開(kāi)IRQ中斷 msrcpsr_cxsf,r0 ;cpsr<--r0;切換到用戶模式msrcpsr_c,#0xd0 ;(CPSR[4:0]=10000,同時(shí)CPSR[7:6]=11,CPSR[5]=0保留,即CPSR[7:0]=11010000=0xd0) mrsr0,cpsr ;保存當(dāng)前CPSR,將CPSR傳入R0;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。stmfdsp!,{r1-r12} ;觀察由用戶模式能否切換到其他模式;切換到管理模式 msrcpsr_c,#0xdf mrsr0,cpsr ;保存當(dāng)前CPSR,將CPSR傳入R0 stmfdsp!,{r1-r12} ;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。haltbhalt ;留在此處Initstack ;初始化各模式下的堆棧子程序;子程序內(nèi)容r0<--lr,因?yàn)楦鞣N模式下r0是相同的而各個(gè)模式movr0,lr ;R0<-LR,各模式下的R0是相同的 ;設(shè)置管理模式堆棧 ;先切換到管理模式下再設(shè)置該模式下的SP

msrcpsr_c,#0xd3;11010011cpsr[4:0] ldrsp,stacksvc ;將StackSvc代表的地址裝入SPstmfdsp!,{r1-r12} ;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。;設(shè)置中斷模式堆棧;先切換到中斷模式下再設(shè)置該模式下的SP,;中斷模式CPSR[7:0]=110,10010 msrcpsr_c,#0xd2 ldrsp,stackirq ;將stackirq代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} msrcpsr_c,#0xd1; ;設(shè)置快速中斷模式堆棧 ldrsp,stackfiq ;將stackfiq代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} ;設(shè)置中止模式堆棧 ;先切換到中斷模式下再設(shè)置SP msrcpsr_c,#0xd7 ldrsp,stackabt ;將stackabt代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} ;設(shè)置未定義模式堆棧 msrcpsr_c,#0xdb ldrsp,stackund ;將stackund代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12};設(shè)置系統(tǒng)模式堆棧 msrcpsr_c,#0xdf ldrsp,stackusr ;將stackusr代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} movpc,r0 ;返回;定義堆棧首地址,即最高地址處stackusrdcdusrstackspace+(usr_stack_legth-1)*4stacksvcdcdsvcstackspace+(svc_stack_legth-1)*4stackirqdcdirqstackspace+(irq_stack_legth-1)*4stackfiqdcdfiqstackspace+(fiq_stack_legth-1)*4stackabtdcdabtstackspace+(abt_stack_legth-1)*4stackunddcdundstackspace+(und_stack_legth-1)*4 areareset,data,noinit,align=2 ;分配棧堆空間usrstackspacespaceusr_stack_legth*4 ;分配USR_STACK_LENGTH*4個(gè)字節(jié)svcstackspacespacesvc_stack_legth*4irqstackspacespaceirq_stack_legth*4fiqstackspacespacefiq_stack_legth*4abtstackspacespaceabt_stack_legth*4undstackspacespaceund_stack_legth*4 end通過(guò)AXD運(yùn)用單步執(zhí)行方式調(diào)試程序,驗(yàn)證工作模式的切換,注意觀察CPSR寄存器中的變化。隨著程序調(diào)試過(guò)程中在模式間的切換,使用寄存器觀察器切換到不同的工作模式下觀察SP(R13)的變化情況。(2)實(shí)驗(yàn)過(guò)程中請(qǐng)記錄并思考以下內(nèi)容:1)程序復(fù)位之后系統(tǒng)處于什么模式?管理模式。2)記錄每種模式下的初始堆棧指針,以及執(zhí)行R1-R12內(nèi)容壓棧后本模式堆棧相關(guān)內(nèi)存單元的數(shù)值。并分析快速中斷FIQ模式與其他模式存入的R1-R12有什么不同。管理模式,初始化堆棧指針:0x8240中斷模式,初始化堆棧指針:0x8340快速中斷模式,初始化堆棧指針:0x8380只到r7就停了,快速中斷模式有自己的分組寄存器R8_fiqR14_fiq。中止模式,初始化堆棧指針:0x8c0未定義模式,初始化堆棧指針:0x8400系統(tǒng)模式,初始化堆棧指針:0x81c03)切換成用戶模式之后還能否從用戶模式切換到其他模式(如系統(tǒng)模式)?能,例如可以切換到中斷模式。4)用戶模式下能否執(zhí)行堆棧壓棧操作?如果能得話,觀察用戶模式下壓棧之前和壓棧之后其堆棧區(qū)域的變化情況。用戶模式下能執(zhí)行壓棧操作。堆棧的變化情況如圖所示。5)觀察本程序模式切換過(guò)程中SPSR有無(wú)變化,并解釋其原因。無(wú)變化,因?yàn)闆](méi)有產(chǎn)生異常情況。實(shí)驗(yàn)四ARM匯編與C混合編程實(shí)驗(yàn)—ARM啟動(dòng)過(guò)程控制實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?1)

掌握建立基本完整的ARM工程,包含啟動(dòng)代碼,C語(yǔ)言程序等;?(2)

了解ARM啟動(dòng)過(guò)程,學(xué)會(huì)編寫(xiě)簡(jiǎn)單的C語(yǔ)言程序和匯編啟動(dòng)代碼并進(jìn)行調(diào)試;?(3)

掌握如何指定代碼入口地址與入口點(diǎn);?(4)

掌握通過(guò)memory/register/watch/variable窗口分析判斷結(jié)果。二、實(shí)驗(yàn)設(shè)備硬件:PC機(jī)軟件:ADS1.2集成開(kāi)發(fā)環(huán)境三、實(shí)驗(yàn)內(nèi)容使用匯編語(yǔ)言編寫(xiě)初始化程序,并引導(dǎo)至C語(yǔ)言main函數(shù),用匯編語(yǔ)言編寫(xiě)延時(shí)函數(shù)實(shí)現(xiàn)毫秒級(jí)的延時(shí),在C語(yǔ)言中調(diào)用延時(shí)函數(shù),實(shí)現(xiàn)1s鐘定時(shí)。四、實(shí)驗(yàn)原理?1.ARM異常向量表結(jié)構(gòu)當(dāng)正常的程序執(zhí)行流程暫時(shí)掛起時(shí),稱(chēng)之為異常,例如:處理一個(gè)外部的中斷請(qǐng)求。在處理異常之前,必須保存當(dāng)前的處理器狀態(tài),以便從異常程序返回時(shí)可以繼續(xù)執(zhí)行當(dāng)前的程序。ARM異常向量表如下:處理器允許多個(gè)異常同時(shí)發(fā)生,這時(shí),處理器會(huì)按照固定的順序進(jìn)行處理,參照下面的異常優(yōu)先級(jí)。高優(yōu)先級(jí):?1Reset?2Dataabort?3FIQ?4IRQ?5Prefetchabort低優(yōu)先級(jí):6UndefinedInstruction,Softwareinterrupt由上可見(jiàn),Reset入口,即為整個(gè)程序的實(shí)際入口點(diǎn)。因此,我們?cè)诰帉?xiě)代碼的時(shí)候,一般地,我們使用下面的代碼:Reset_Handler: BReset_HandlerUndefined_Handler:BUndefined_HandlerSWI_Handler: BSWI_HandlerPrefetch_Handler: BPrefetch_HandlerAbort_Handler: BAbort_HandlerNOP/*Reservedvector*/IRQ_Handler: BIRQ_HandlerFIQ_Handler: BFIQ_Handler2.ARMC與匯編混合編程及其接口ATPCS標(biāo)準(zhǔn)ATPCS(ARM-ThumbProduceCallStandard)是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則,目的是為了使單獨(dú)編譯的C語(yǔ)言程序和匯編程序之間能夠相互調(diào)用。這些基本規(guī)則包括子程序調(diào)用過(guò)程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則和參數(shù)的傳遞規(guī)則。(1)、寄存器的使用規(guī)則(2)、數(shù)據(jù)棧的使用規(guī)則ATPCS規(guī)定數(shù)據(jù)棧為FD(滿遞減)類(lèi)型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。(3)、參數(shù)的傳遞規(guī)則當(dāng)參數(shù)不超過(guò)4個(gè)時(shí),可以使用寄存器R0~R3來(lái)傳遞參數(shù);當(dāng)參數(shù)超過(guò)4個(gè)時(shí),還可以使用數(shù)據(jù)棧來(lái)傳遞參數(shù)。結(jié)果為一個(gè)32位的整數(shù)時(shí),可以通過(guò)寄存器R0返回;結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過(guò)寄存器R0和R1返回,依次類(lèi)推。(4)、內(nèi)嵌匯編指令的語(yǔ)法格式ARMC匯編器使用關(guān)鍵字“__asm"。如果有多條匯編指令需要嵌入,可以用{“}”將它們歸為一條語(yǔ)句。C編譯器在對(duì)程序進(jìn)行編譯時(shí),會(huì)直接將asm函數(shù)內(nèi)部的內(nèi)容直接引用到期編譯成的匯編語(yǔ)言程序中。asm函數(shù)的語(yǔ)法格式為:__asm{指令指令}(5)、C與匯編程序的相互調(diào)用1)在C語(yǔ)言程序中調(diào)用匯編程序?yàn)榱吮WC程序調(diào)用時(shí)參數(shù)的正確傳遞,匯編程序的設(shè)計(jì)要遵守ATPCS。在匯編程序中需要使用EXPORT偽操作來(lái)聲明,使得本程序可以被其它程序調(diào)用。同時(shí),在C程序調(diào)用該匯編程序之前需要在C語(yǔ)言程序中使用extern關(guān)鍵詞來(lái)聲明該匯編程序。2)在匯編程序中調(diào)用C語(yǔ)言程序?yàn)榱吮WC程序調(diào)用時(shí)參數(shù)的正確傳遞,匯編程序的設(shè)計(jì)要遵守ATPCS。在C程序中不需要使用任何關(guān)鍵字來(lái)聲明將被匯編語(yǔ)言調(diào)用的C程序,但是在匯編程序調(diào)用該C程序之前需要在匯編語(yǔ)言程序中使用IMPORT偽操作來(lái)聲明該C程序。在匯編程序中通過(guò)BL指令來(lái)調(diào)用子程序。五、實(shí)驗(yàn)過(guò)程(1)按照2.3節(jié)介紹的方法,在ADS下創(chuàng)建一個(gè)工程armasmc,編寫(xiě)3個(gè)文件,其中一個(gè)初始化匯編語(yǔ)言文件Init.s,該文件中主要完成異常矢量表的建立,模式堆棧初始化,并將程序引導(dǎo)至C語(yǔ)言的main函數(shù)。C語(yǔ)言程序保存為armasmc.c,C語(yǔ)言中調(diào)用匯編語(yǔ)言文件delay.s中的毫秒延時(shí)程序delayxms,C語(yǔ)言將延時(shí)的毫秒數(shù)通過(guò)參數(shù)傳遞到匯編語(yǔ)言,匯編語(yǔ)言完成延時(shí),然后返回C語(yǔ)言函數(shù)。通過(guò)AXD運(yùn)用單步執(zhí)行方式調(diào)試程序。觀察程序執(zhí)行過(guò)程中的寄存器及存儲(chǔ)器的變化情況。創(chuàng)建工程如下:通過(guò)AXD運(yùn)用單步執(zhí)行方式調(diào)試程序,觀察程序執(zhí)行過(guò)程中的寄存器及存儲(chǔ)器的變化情況。(2)實(shí)驗(yàn)過(guò)程中請(qǐng)記錄并思考以下內(nèi)容:1)如何建立異常矢量入口表?編寫(xiě)以下程序startbReset_HandlerUndefined_Handler bUndefined_HandlerSWI_HandlerbSWI_HandlerPrefetch_handlerbPrefetch_handlerAbort_HandlerbAbort_Handlernop;ReservedvectoIRQ_HandlerbIRQ_HandlerFIQ_HandlerbFIQ_Handler2)如何在匯編語(yǔ)言中切換至C語(yǔ)言的main函數(shù)?用BLmain實(shí)現(xiàn)從匯編語(yǔ)言切換到C語(yǔ)言。3)如何在C語(yǔ)言中調(diào)用匯編語(yǔ)言函數(shù),并完成參數(shù)傳遞?要在C語(yǔ)言中調(diào)用匯編函數(shù),首先要用extern等標(biāo)注函數(shù),傳遞參數(shù)要遵從ATPS的規(guī)則。4)匯編語(yǔ)言函數(shù)中用到的寄存器如何保護(hù)與恢復(fù),為什么要保護(hù)參考程序中的R11?要保護(hù)R11是因?yàn)橹蟮某绦蛞玫絉11=1000。5)將delay.s中的R11改成R4,并將兩條R11的保護(hù)與恢復(fù)語(yǔ)句stmfdsp!,{r12}和ldmfdsp!,{r11}刪掉,在C語(yǔ)言程序中的語(yǔ)句i--處設(shè)置端點(diǎn),觀察運(yùn)行過(guò)程中變量i的變化情況,并解釋其中的原因。更改的效果是,運(yùn)行到i--時(shí)候,i從100變到0。原因是i的值存儲(chǔ)在R4里面。實(shí)驗(yàn)五ARM硬件接口實(shí)驗(yàn)—基本IO實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?1)GPIO的功能配置方法;?(2)通過(guò)寄存器訪問(wèn)引腳的方法;?(3)實(shí)現(xiàn)GPIO輸入輸出功能的基本編程方法。二、實(shí)驗(yàn)設(shè)備硬件:北京博創(chuàng)UP-TECH三合一實(shí)驗(yàn)箱,J-Link仿真器套件,PC機(jī)軟件:ADS1.2集成開(kāi)發(fā)環(huán)境三、實(shí)驗(yàn)內(nèi)容編寫(xiě)S3C2440X處理器的端口控制程序,實(shí)現(xiàn)利用按鍵控制的跑馬燈程序。GPC5,GPC6,GPC7三個(gè)引腳連接發(fā)光二極管,按鈕開(kāi)關(guān)連接在GPF5引腳,如下圖所示:上電之后,GPC5、GPC6、GPC7按照如下圖所示的方向,輪流顯示,當(dāng)按鈕開(kāi)關(guān)按下去,方向反向,如下圖所示:實(shí)驗(yàn)過(guò)程中要注意按鍵去抖動(dòng)和每個(gè)發(fā)光二極管顯示一定的時(shí)間(至少100ms)。四、實(shí)驗(yàn)原理1、S3C2440的GPIO功能簡(jiǎn)介S3C2440有130個(gè)多功能輸入輸出接口(GPIO),它們被分成9組,分別是:—PortA(GPA):25-outputport?—PortB(GPB):11-input/outport?—PortC(GPC):16-input/outputport—PortD(GPD):16-input/outputport—PortE(GPE):16-input/outputport—PortF(GPF):8-input/outputport—PortG(GPG):16-input/outputport—PortH(GPH):9-input/outputport—PortJ(GPJ):13-input/outputport每個(gè)端口的功能可由軟件進(jìn)行配置。這些端口的功能如下表所示:S3C2440APortConfiguration(略)PortA,B,C,D,E,F,G,H,JSelectablePinFunctions(具體見(jiàn)嵌入式開(kāi)發(fā)實(shí)驗(yàn)手冊(cè))2、GPIO特殊功能寄存器對(duì)GPIO進(jìn)行配置和控制的特殊功能寄存器,主要有3類(lèi),分別是:端口控制寄存器GPxCON寄存器,端口數(shù)據(jù)寄存器GPxDAT寄存器和端口上拉寄存器GPxUP。GPxCON寄存器GPxCON寄存器是為了配置引腳功能的,每一個(gè)引腳都可以配置成為輸入、輸出、外部中斷組、特殊功能引腳中的至少三種情況。(2)GPxDAT寄存器GPxDAT是用來(lái)讀/寫(xiě)引腳狀態(tài)的:當(dāng)引腳設(shè)置為輸出時(shí),向該寄存器的對(duì)應(yīng)位寫(xiě)“1”可輸出高電平,寫(xiě)“0”可輸出低電平;當(dāng)引腳設(shè)置為輸入時(shí),讀此寄存器便可得知相應(yīng)引腳的電平狀態(tài);引腳被設(shè)置成為特殊功能時(shí),讀寫(xiě)此寄存器無(wú)效。(3)GPxUP寄存器GPxPUD寄存器是用來(lái)設(shè)置引腳的內(nèi)部上/下拉電阻的,寄存器每?jī)晌豢刂埔粋€(gè)引腳的上下拉電阻。當(dāng)引腳對(duì)應(yīng)的兩位為“00”時(shí),禁止上/下拉,為“01”時(shí),下拉使能,為“10”時(shí)上拉使能。上拉電阻和下拉電阻的作用是:當(dāng)GPIO引腳處于第三態(tài)(高阻態(tài),相當(dāng)于沒(méi)接芯片)時(shí),它的電平狀態(tài)由上拉電阻或下拉電阻確定。3、端口配置(1)GPC5,GPC6和GPC7三個(gè)管腳定義為輸出口,輸出低電平時(shí)相應(yīng)的LED燈點(diǎn)亮。#definerGPCCON(*(volatileunsigned*)(0x56000020))

#definerGPCDAT(*(volatileunsigned*)(0x56000024))

#definerGPCUP(*(volatileunsigned*)(0x56000028))

#defineGPC5_ONrGPCDAT&~(1<<5)

#defineGPC5_OFFrGPCDAT|(1<<5)

#defineGPC6_ONrGPCDAT&~(1<<6)

#defineGPC6_OFFrGPCDAT|(1<<6)

#defineGPC7_ONrGPCDAT&~(1<<7)

#defineGPC7_OFFrGPCDAT|(1<<7)

rGPCCON=rGPCCON&~(0x3f<<10)|(0x15<<10);//GPC5~7端口設(shè)置為輸出

rGPCUP=rGPCUP|(7<<5);//禁止GPC的5~7端口引腳上拉(2)GPF5定義為輸入,用于實(shí)現(xiàn)按鍵識(shí)別#definerGPFCON(*(volatileunsigned*)(0x56000050))

#definerGPFDAT(*(volatileunsigned*)(0x56000054))

#definerGPFUP(*(volatileunsigned*)(0x56000058))

rGPFCON=rGPFCON&~(0x3<<10);//將GPF的5端口設(shè)置為輸入

rGPFUP=rGPCUP&~(1<<5);//GPF的5端口引腳上拉

charKey_Scan()//按鍵掃描程序

{

if(!(rGPFDAT&(1<<5)))//如果GPF5被按下,讀取到低電平

{

delay(20);//延時(shí)去抖動(dòng),由于ARM11為流水線結(jié)構(gòu),這里只

//是一個(gè)大概的延時(shí)值

if(!(rGPFDAT&(1<<5)))//再次判斷

return1;//返回“1”

else

return0;

}

else

return0;

}

voiddelay(inttime)//延時(shí)函數(shù),用于掃描按鍵時(shí)去軟件抖動(dòng)

{

U8i,j,k;

for(i=0;i<time;i++)

or(j=0;j<255;j++)

}五、實(shí)驗(yàn)過(guò)程開(kāi)發(fā)調(diào)試環(huán)境設(shè)置?(1)CodeWarrior開(kāi)發(fā)環(huán)境設(shè)置(2)AXD調(diào)試環(huán)境設(shè)置為了向SDRAM中下載程序,并運(yùn)行和調(diào)試程序,則需要在上電之初在AXD的CommandLineInterface中輸入一系列的命令,這些命令可以直接操縱CPU內(nèi)部的寄存器,進(jìn)而完成對(duì)DRAM和看門(mén)狗的一些初始化工作,具體需要設(shè)置的內(nèi)容如下:?將上面的這些內(nèi)容輸入一個(gè)text文件2440init.txt,并在AXD中進(jìn)行設(shè)置,使其在打開(kāi)之后自動(dòng)運(yùn)行這些初始化命令。(1)按照前面介紹的方法,在ADS下創(chuàng)建一個(gè)工程GPIO,并將前面示例程序加入工程。(注意將實(shí)驗(yàn)箱中的JP1402設(shè)置為2-3短接,即選擇ARMICE模式)。創(chuàng)建工程如下:運(yùn)行AXD加載生成的image文件,點(diǎn)擊按鈕,運(yùn)用程序。觀察程序執(zhí)行的效果。并觀察按鍵按下和松開(kāi)跑馬燈輪換的方向。結(jié)果如下:正向:反向:(2)實(shí)驗(yàn)過(guò)程中請(qǐng)記錄并思考以下內(nèi)容:1)如何訪問(wèn)寄存器并修改其中的1位或多位數(shù)據(jù)?通過(guò)與、或、非等關(guān)系來(lái)訪問(wèn)寄存器并修改其中的1位或者多位數(shù)據(jù)的。2)如何配置S3C2440的PIO端口?通過(guò)配置相應(yīng)的寄存器。?3)在C語(yǔ)言中如何實(shí)現(xiàn)按鍵處理程序?在C語(yǔ)言中一定要通過(guò)延時(shí)按鍵延時(shí)消抖4)如何初始化DRAM,從而實(shí)現(xiàn)程序下載并在線調(diào)試?為了向SDRAM中下載程序,并運(yùn)行和調(diào)試程序,則需要在上電之初在AXD的CommandLineInterface中輸入一系列的命令,這些命令可以直接操縱CPU內(nèi)部的寄存器,進(jìn)而完成對(duì)DRAM和看門(mén)狗的一些初始化工作。(具體命令詳見(jiàn)嵌入式開(kāi)發(fā)實(shí)驗(yàn)手冊(cè))。5)嘗試實(shí)現(xiàn)利用按鍵切換控制跑馬燈的順序輪換(不是控制其輪換方向,而是在有按鍵按下并松開(kāi)后實(shí)現(xiàn)一次跑馬燈切換)。可改變輪換方向。實(shí)驗(yàn)六ARM硬件接口實(shí)驗(yàn)—外部中斷實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?1)

通過(guò)實(shí)驗(yàn)掌握ARM處理器的中斷方式和中斷處理。?(2)

熟悉S3C2440X的中斷控制寄存器的使用;?(3)

理解S3C2440X的中斷處理機(jī)制?(4)

熟練掌握如何進(jìn)行ARM處理器中斷處理的軟件編程方法。?(5)

掌握生成離線運(yùn)行(Release模式)程序的開(kāi)發(fā)環(huán)境設(shè)置方法。?(6)

掌握通過(guò)J-link向Norflash燒些程序的方法。?二、實(shí)驗(yàn)設(shè)備硬件:北京博創(chuàng)UP-TECH三合一實(shí)驗(yàn)箱,J-Link仿真器套件,PC機(jī)軟件:ADS1.2集成開(kāi)發(fā)環(huán)境三、實(shí)驗(yàn)內(nèi)容硬件電路和前面的實(shí)驗(yàn)五完全相同。這里將按鈕開(kāi)關(guān)所連接的GPF5引腳設(shè)定為外部中斷EINT5,中斷模式位IRQ,在中斷服務(wù)程序中完成LED燈的切換,即正常狀態(tài)時(shí)LED5燈亮,按下按鈕開(kāi)關(guān)時(shí)LED6燈亮。四、實(shí)驗(yàn)原理1.ARM中斷(1)中斷源S3C2440具有56個(gè)中斷源。這些中斷源可以是來(lái)自片內(nèi)外設(shè)的中斷,比如DMA、UART、IIC等;也可以是處理器的外部中斷輸入引腳。在這些中斷源中,部分中斷源通過(guò)分支中斷控制器來(lái)申請(qǐng)使用中斷,這部分中斷源包括(11個(gè)):INT_ADCADC轉(zhuǎn)換中斷?INT_TC觸摸屏中斷?INT_ERR2UART2收發(fā)錯(cuò)誤中斷INT_TXD2UART2發(fā)送中斷INT_RXD2UART2接收中斷?INT_ERR1UART1收發(fā)錯(cuò)誤中斷INT_TXD1UART1發(fā)送中斷?INT_RXD1UART1接收中斷?INT_ERR0UART0收發(fā)錯(cuò)誤中斷INT_TXD0UART0發(fā)送中斷?INT_RXD0UART0接收中斷(2)中斷控制器實(shí)際上最初CPU內(nèi)核只有FIQ(快速中斷請(qǐng)求)和IRQ(通用中斷請(qǐng)求)兩種中斷,其它中斷都是各個(gè)芯片廠家在設(shè)計(jì)芯片時(shí),通過(guò)加入一個(gè)中斷控制器來(lái)擴(kuò)展定義的,這些中斷根據(jù)中斷的優(yōu)先級(jí)高低來(lái)進(jìn)行處理,更符合實(shí)際應(yīng)用系統(tǒng)中要求提供多個(gè)中斷源的要求。例如,如果你定義所有的中斷源為IRQ中斷(通過(guò)中斷模式寄存器設(shè)置),并且同時(shí)有10個(gè)中斷發(fā)出請(qǐng)求,這時(shí)可以通過(guò)讀中斷優(yōu)先級(jí)寄存器來(lái)確定哪一個(gè)中斷將被優(yōu)先執(zhí)行。中斷控制器(InterruptControlerLogic)的任務(wù)是在片內(nèi)外圍和外部中斷源組成的多重中斷發(fā)生時(shí),選擇其中一個(gè)中斷通過(guò)FIQ或IRQ向CPU內(nèi)核發(fā)出中斷請(qǐng)求。當(dāng)多重中斷源請(qǐng)求中斷時(shí),硬件優(yōu)先級(jí)邏輯會(huì)判斷哪一個(gè)中斷將被執(zhí)行,同時(shí),硬件邏輯將會(huì)執(zhí)行位于0X18(或0X1C)地址處的指令,再由軟件編程識(shí)別各個(gè)中斷源,然后再根據(jù)中斷源跳轉(zhuǎn)到相應(yīng)的中斷處理程序。中斷優(yōu)先級(jí)仲裁電路如下圖所示:S3C2440X中的優(yōu)先級(jí)產(chǎn)生模塊包含7個(gè)單元,1個(gè)主單元和6個(gè)從單元。兩個(gè)從優(yōu)先級(jí)產(chǎn)生單元管理4個(gè)中斷源,四個(gè)從優(yōu)先級(jí)產(chǎn)生單元管理6個(gè)中斷源。主優(yōu)先級(jí)產(chǎn)生單元管理6個(gè)從單元。每一個(gè)從單元有4個(gè)可編程優(yōu)先級(jí)中斷源和2個(gè)固定優(yōu)先級(jí)中斷源。這4個(gè)中斷源的優(yōu)先級(jí)是由ARB_SEL和ARM_MODE決定的。另外2個(gè)固定優(yōu)先級(jí)中斷源在6個(gè)中斷源中的優(yōu)先級(jí)最低。(3)中斷控制寄存器中斷控制器有5個(gè)控制寄存器:源掛起寄存器(SRCPND)、中斷模式寄存器(INTMOD)、中斷屏蔽寄存器(INTMSK)、中斷優(yōu)先權(quán)寄存器(PRIORITY)、中斷掛起寄存器(INTPND)。中斷源發(fā)出的中斷請(qǐng)求首先被寄存器在中斷源掛起寄存器(SRCPND)中,INTMOD把中斷請(qǐng)求分為兩組:快速中斷請(qǐng)求(FIQ)和中斷請(qǐng)求(IRQ),PRIORITY處理中斷的優(yōu)先級(jí)。1)中斷源掛起寄存器(SRCPND)中斷源掛起寄存器SRCPND共有32位,每一位對(duì)應(yīng)著一個(gè)中斷源,當(dāng)中斷源發(fā)出中斷請(qǐng)求的時(shí)候,就會(huì)置位源掛起寄存器的相應(yīng)位。反之,中斷的掛起寄存器的值為0。SRCPND每一位的是否置1只與該位對(duì)應(yīng)的中斷源是否提出中斷請(qǐng)求有關(guān)系,與該中斷源是否被屏蔽沒(méi)有關(guān)系。如果在中斷服務(wù)過(guò)程中,為了允許同一源的其他中斷源能夠進(jìn)一步引起中斷,或者為了防止一次中斷多次服務(wù),用戶可以清除相應(yīng)的中斷標(biāo)志位,清除的方法是向相應(yīng)的位寫(xiě)1(即:寫(xiě)1清0),寫(xiě)0是沒(méi)有影響的。2)中斷模式寄存器(INTMOD)中斷模式寄存器INTMOD共有32位,每一位對(duì)應(yīng)著一個(gè)中斷源,當(dāng)中斷源的模式位設(shè)置為1時(shí),對(duì)應(yīng)的中斷會(huì)由ARM920T內(nèi)核以FIQ模式來(lái)處理。相反的,當(dāng)模式位設(shè)置為0時(shí),中斷會(huì)以IRQ模式來(lái)處理。注意,中斷控制寄存器中只有一個(gè)中斷源可以被設(shè)置為FIQ模式,因此只能在緊急情況下使用FIQ。如果INTMOD寄存器把某個(gè)中斷設(shè)為FIQ模式,FIQ中斷不影響INTPND和INTOFFSET寄存器,因此,這兩個(gè)寄存器只對(duì)IRQ模式中斷有效。3)中斷屏蔽寄存器(INTMSK)這個(gè)寄存器有32位,分別對(duì)應(yīng)一個(gè)中斷源。當(dāng)中斷源的屏蔽位設(shè)置為1時(shí),CPU不響應(yīng)該中斷源的中斷請(qǐng)求,反之,等于0時(shí)CPU能響應(yīng)該中斷源的中斷請(qǐng)求。4)中斷優(yōu)先級(jí)寄存器(PRIORITY)中斷優(yōu)先級(jí)寄存器管理32個(gè)中斷源的優(yōu)先級(jí)仲裁規(guī)則以及是否允許優(yōu)先級(jí)輪換。5)中斷掛起寄存器(INTPND)中斷掛起寄存器INTPND共有32位,每一位對(duì)應(yīng)著一個(gè)中斷源,當(dāng)中斷請(qǐng)求被響應(yīng)的時(shí)候,相應(yīng)的位會(huì)被設(shè)置為1。在某一時(shí)刻只有一個(gè)位能為1,因此在中斷服務(wù)子程序中可以通過(guò)判斷INTPND來(lái)判斷哪個(gè)中斷正在被響應(yīng),在中斷服務(wù)子程序中必須在清零SRCPND中相應(yīng)位后清零相應(yīng)的中斷掛起位,清零方法和SRCPND相同。注意:1.FIQ響應(yīng)的時(shí)候不會(huì)影響INTPND相應(yīng)的標(biāo)志位2.向INTPND等于“1”的位寫(xiě)入“0”時(shí),INTPND寄存器和INTOFFSET寄存器會(huì)有無(wú)法預(yù)知的結(jié)果,因此,千萬(wàn)不要向INTPND的“1”位寫(xiě)入“0”,推薦的清零方法是把INTPND的值重新寫(xiě)入INTPND。6)IRQ偏移寄存器中斷偏移寄存器給出INTPND寄存器中哪個(gè)是IRQ模式的中斷請(qǐng)求。7)子中斷源掛起寄存器SUBSRCPND對(duì)于多合一的中斷源,利用子中斷源掛起寄存器SUBSRCPND來(lái)進(jìn)一步標(biāo)明提出請(qǐng)求的到底是哪個(gè)中斷源。8)子中斷源屏蔽寄存器INTSUBMSK用于控制子中斷源是否被屏蔽。9)外部中斷控制寄存器(EXTINTn)S3C2410X的24個(gè)外部中斷有幾種中斷觸發(fā)方式,EXTINTn配置外部中斷的觸發(fā)類(lèi)型是電平觸發(fā)、邊沿觸發(fā)以及觸發(fā)的極性。其中EXTINT0寄存器管理外部中斷源0-7,EXTINT1寄存器管理外部中斷源8-15,EXTINT2寄存器管理外部中斷源16-23。10)外部中斷屏蔽寄存器EINTMASK11)外部中斷掛起寄存器EINTPEND各中斷源與上述各中斷管理寄存器之間的關(guān)系如下圖所示:2.中斷程序設(shè)計(jì)要想正確地執(zhí)行2440的外部中斷,一般需要完成兩個(gè)部分內(nèi)容:中斷初始化和中斷處理函數(shù)。(1)中斷初始化:在執(zhí)行中斷之前,要初始化好要用的中斷。中斷初始化工作包含幾個(gè)部分:端口功能設(shè)定:2440的外部中斷引腳EINT與通用IO引腳F和G復(fù)用,要想使用中斷功能,就要把相應(yīng)的引腳配置成中斷模式。2)

中斷模式選定:為INTMOD寄存器相關(guān)位設(shè)定合時(shí)的數(shù)值(0或1),將所使用的中斷影射為FIQ或IRQ。?3)

中斷優(yōu)先級(jí)設(shè)定:為所使用的中斷源設(shè)定合時(shí)的中斷優(yōu)先級(jí)。?4)

為外部中斷選定合適的觸發(fā)方式。?5)

關(guān)聯(lián)相應(yīng)的中斷服務(wù)程序。?(2)中斷使能:中斷使能的工作有以下幾部分1)清除當(dāng)前的中斷標(biāo)志位,包括中斷源掛起寄存器SRCPND,中斷掛起寄存器INTPND,以及外部中斷源掛起寄存器EINTPEND。注意要想清除某一中斷標(biāo)志,需要向相對(duì)應(yīng)的位寫(xiě)1(寫(xiě)1清0)。2)打開(kāi)有關(guān)中斷屏蔽位,使能相關(guān)中斷。方法是向中斷屏蔽寄存器INTMSK和外部中斷屏蔽寄存器EINTMASK相關(guān)位寫(xiě)0。(3)中斷處理函數(shù)負(fù)責(zé)執(zhí)行具體的中斷指令,除此以外還需要把SRCPND和INTPND中的相應(yīng)的位清零(通過(guò)置1來(lái)清零),因?yàn)楫?dāng)中斷發(fā)生時(shí),2440會(huì)自動(dòng)把這兩個(gè)寄存器中相對(duì)應(yīng)的位置1,以表示某一中斷發(fā)生,如果不在中斷處理函數(shù)內(nèi)把它們清零,系統(tǒng)會(huì)一直執(zhí)行該中斷函數(shù)。五、實(shí)驗(yàn)過(guò)程開(kāi)發(fā)調(diào)試環(huán)境設(shè)置CodeWarrior開(kāi)發(fā)環(huán)境設(shè)置通過(guò)J-Link燒寫(xiě)Norflash程序(1)按照2.3節(jié)介紹的方法,在ADS下創(chuàng)建一個(gè)工程ext_interrupt,并將前面示例程序加入工程。按照上面的介紹進(jìn)行環(huán)境設(shè)置,并進(jìn)行程序?qū)懭?。?chuàng)建工程如下:關(guān)掉實(shí)驗(yàn)箱電源,將其核心板上的撥動(dòng)開(kāi)關(guān)撥到右邊Nor的位置,觀察程序運(yùn)行結(jié)果。按下INTKEY按鈕,再次觀察程序運(yùn)行效果。結(jié)果如下:(2)實(shí)驗(yàn)過(guò)程中請(qǐng)記錄并思考以下內(nèi)容:

1)打開(kāi)s2440addr.h頭文件,觀察并分析其內(nèi)容。//%%%%%%%%%%%%%%s3c2440.h%%%%%%%%%%%%%%%%/*WOTCHDOGregister*/#defineWTCON(*(volatileunsignedlong*)0x53000000)/*SDRAMregisers*/#defineMEM_CTL_BASE0x48000000#defineSDRAM_BASE0x30000000/*NANDFlashregisters*/#defineNFCONF(*(volatileunsignedint*)0x4e000000)#defineNFADDR(*(volatileunsignedchar*)0x4e000008)#defineNFDATA(*(volatileunsignedchar*)0x4e00000c)#defineNFSTAT(*(volatileunsignedchar*)0x4e000010)/*GPIOregisters*/#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT#defineGPFCON#defineGPFDAT#defineGPFUP#defineGPGCON#defineGPGDAT#defineGPGUP#defineGPHCON#defineGPHDAT#defineGPHUP/*UARTregisters*/#defineULCON0#defineUCON0#defineUFCON0#defineUMCON0#defineUTRSTAT0#defineUTXH0#defineURXH0#defineUBRDIV0/*interruptregistes*/#defineSRCPND#defineINTMOD(*(volatileunsignedlong*)0x56000014)(*(volatileunsignedlong*)0x56000050)(*(volatileunsignedlong*)0x56000054)(*(volatileunsignedlong*)0x56000058)(*(volatileunsignedlong*)0x56000060)(*(volatileunsignedlong*)0x56000064)(*(volat

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論