嵌入式系統(tǒng)原理與應用實驗報告_第1頁
嵌入式系統(tǒng)原理與應用實驗報告_第2頁
嵌入式系統(tǒng)原理與應用實驗報告_第3頁
嵌入式系統(tǒng)原理與應用實驗報告_第4頁
嵌入式系統(tǒng)原理與應用實驗報告_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

msrcpsr_c,#0xd3;11010011cpsr[4:0] ldrsp,stacksvc ;將StackSvc代表的地址裝入SPstmfdsp!,{r1-r12} ;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。;設置中斷模式堆棧;先切換到中斷模式下再設置該模式下的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; ;設置快速中斷模式堆棧 ldrsp,stackfiq ;將stackfiq代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} ;設置中止模式堆棧 ;先切換到中斷模式下再設置SP msrcpsr_c,#0xd7 ldrsp,stackabt ;將stackabt代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12} ;設置未定義模式堆棧 msrcpsr_c,#0xdb ldrsp,stackund ;將stackund代表的地址裝入SP;STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R1在最低地址,向上依次是R1,R2,...R12,LR。完成后SP指向保存R1的地址。 stmfdsp!,{r1-r12};設置系統(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個字節(jié)svcstackspacespacesvc_stack_legth*4irqstackspacespaceirq_stack_legth*4fiqstackspacespacefiq_stack_legth*4abtstackspacespaceabt_stack_legth*4undstackspacespaceund_stack_legth*4 end通過AXD運用單步執(zhí)行方式調(diào)試程序,驗證工作模式的切換,注意觀察CPSR寄存器中的變化。隨著程序調(diào)試過程中在模式間的切換,使用寄存器觀察器切換到不同的工作模式下觀察SP(R13)的變化情況。(2)實驗過程中請記錄并思考以下內(nèi)容:1)程序復位之后系統(tǒng)處于什么模式?管理模式。2)記錄每種模式下的初始堆棧指針,以及執(zhí)行R1-R12內(nèi)容壓棧后本模式堆棧相關內(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)觀察本程序模式切換過程中SPSR有無變化,并解釋其原因。無變化,因為沒有產(chǎn)生異常情況。實驗四ARM匯編與C混合編程實驗—ARM啟動過程控制實驗一、實驗目的(1)

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

了解ARM啟動過程,學會編寫簡單的C語言程序和匯編啟動代碼并進行調(diào)試;?(3)

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

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

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

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

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

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

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

charKey_Scan()//按鍵掃描程序

{

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

{

delay(20);//延時去抖動,由于ARM11為流水線結構,這里只

//是一個大概的延時值

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

return1;//返回“1”

else

return0;

}

else

return0;

}

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

{

U8i,j,k;

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

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

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

通過實驗掌握ARM處理器的中斷方式和中斷處理。?(2)

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

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

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

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

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

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

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

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

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

1)打開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. 本站所有資源如無特殊說明,都需要本地電腦安裝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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論