第一篇:嵌入式實驗報告
嵌入式應用系統設計實驗報告
2013-12-17 計算機學院軟件工程系嵌入式應用系統設計
實驗一ARM 匯編指令
一、實驗目的
初步學會使用Embest IDE for ARM 開發環境及 ARM 軟件模擬器。通過實驗掌握簡單 ARM 匯編指令的使用方法。
二、實驗設備
硬件:PC 機。軟件:Embest IDE Pro 集成開發環境,Windows 98/2000/NT/XP。
三、實驗內容
熟悉開發環境的使用并使用ldr/str,mov等指令訪問寄存器或存單元。使用 add/sub/lsl/lsr/and/orr等指令,完成基本數學/邏輯運算。
四、實驗步驟
1)新建工程:
運行Embest IDE Pro 2005 集成開發環境,選擇菜單項 File → New Workspace,系統彈出一個對話框,按照圖 1-1 所示輸入相關內容。
點擊 OK 按鈕,將創建一個新工程,并同時創建一個與工程名相同的工作區。此時在工作區窗口將打開該工作區和工程。2)建立源文件:
點擊菜單項 File → New,系統彈出一個新的、沒有標題的文本編輯窗,輸入光標位于窗口中第一行,按照實驗參考程序編輯輸入源文件代碼。編輯完后,保存文件 asm1_a.s。3)添加源文件:
選擇 Project → Add To Project → Files 命令,或單擊工程管理窗口中的相應右鍵菜單命令,彈出文件選擇對話框,在工程目錄下選擇剛才建立的源文件 asm1_a.s。4)基本配置:
選擇菜單項 Project → Settings?或快捷鍵 Alt+F7,彈出工程設置對話框。在工程設置對話框中,選擇 Processor 設置對話框,按照圖 1-2 所示,進行目標板所用處理器的配置。
計算機學院軟件工程系嵌入式應用系統設計
圖 1-2 新的工作區處理器配置
5)編譯并生成目標代碼: 選擇菜單項 Build → Build asm_a或快捷鍵 F7,生成目標代碼。6)調試設置:
選擇菜單項 Project → Settings?或快捷鍵 Alt+F7,彈出工程設置對話框。在工程設置對話框中,選擇 Remote 設置對話框,按照圖 1-4 所示對調試設備模塊進行設置我們這里只能實現軟件仿真,故選 SimArm7。
圖 1-4 新工作區仿真器配置
按照圖 1-4 所示對調試設備模塊進行設置我們這里只能實現軟件仿真,注意: Symbol file 與 Download file 設置應該相同,用戶可以從 Linker 頁面拷貝系統默認的輸出文件配置;且該實驗輸入下載地址為 0x8000,即為AS 默認的代碼段起始地址。由于匯編和鏈接選項在本實驗中沒有進行配置,完全使用其默認選項,所以,代碼段是從 0x8000 開始的,下載地址應該與它保持一致。
計算機學院軟件工程系嵌入式應用系統設計
7)選擇 Debug 菜單 Remote Connect 進行連接軟件仿真器,執行 Download 命令下載程序,并打開寄存器窗口。打開 memory 窗口,觀察地址 0x8000~0x801f 的內容,與地址 0xff0~0xfff 的內容。8)單步執行程序并觀察和記錄寄存器與 memory 的值變化。9)結合實驗內容和相關資料,觀察程序運行,通過實驗加深理解 ARM 指令的使用。
10)程序運行以及觀察結果如下圖所示:
上圖為單步調試開始時執行結果,內容的地址為: 0x8000
上圖是執行到stop之前的調試結果。五.實驗總結
初次接觸到嵌入式,通過此次實驗對嵌入式的內容以及研究的對象有了初始化的理解,這有助于以后對嵌入式的學習。
計算機學院軟件工程系嵌入式應用系統設計
實驗二 ARM 匯編指令 一實驗目的
初步學會使用Embest IDE for ARM 開發環境及 ARM 軟件模擬器。通過實驗掌握簡單 ARM 匯編指令的使用方法。二實驗設備 硬件:PC 機。
軟件:Embest IDE Pro 集成開發環境,Windows 98/2000/NT/XP。三實驗內容
熟悉開發環境的使用并使用ldr/str,mov等指令訪問寄存器或存儲單元。使用 add/sub/lsl/lsr/and/orr等指令,完成基本數學/邏輯運算。
四實驗操作步驟
1)在工作區窗口工作區名稱上擊右鍵鼠標,在彈出的快捷菜單中選擇“Add New Project to Workspace?”。
2)參照實驗 A 及相應的實驗參考程序,建立工程 asm1_b。3)添加源文件:
選擇 Project → Add To Project → Files 命令,或單擊工程管理窗口中的相應右鍵菜單命令,彈出文件選擇對話框,在工程目錄下選擇剛才建立的源文件 asm1_b.s。4)基本配置:
選擇菜單項 Project → Settings?或快捷鍵 Alt+F7,彈出工程設置對話框。在工程設置對話框中,選擇 Processor 設置對話框,按照圖 1-7 所示,進行目標板所用處理器的配置。
計算機學院軟件工程系嵌入式應用系統設計
5)編譯并生成目標代碼:
選擇菜單項 Build → Build asm_a或快捷鍵 F7,生成目標代碼。6)參照實驗A 的步驟完成調試設置。
7)選擇 Debug 菜單 Remote Connect 進行連接軟件仿真器,執行 Download 命令下載程序,并打開寄存器窗口。打開 memory 窗口.8)程序執行結果及總結:
計算機學院軟件工程系嵌入式應用系統設計
初次接觸到嵌入式,通過此次實驗對嵌入式的內容以及研究的對象有了初始化的理解,這有助于以后對嵌入式的學習。并且本次實驗后,明白了嵌入式的開發環境及所用到的開發軟件,其次就是對程序的調試與運行,通過實驗認真思考其原理知識。本次實驗收益匪淺。五實驗參考程序
#NAME asm1_b.s # Author: Embest #DesARMinstructionexamples.equ x, 45 /* x=45 */.equ y, 64 /* y=64 */.equ z, 87 /* z=87 */.equstack_top, 0x1000 /* define the top address for stacks */.global _start.text _start: /* code start */ mov r0, #x /* put x value into R0 */ mov r0, r0, lsl #8 /* R0 = R0 << 8 */ mov r1, #y /* put y value into R1 */ 計算機學院軟件工程系嵌入式應用系統設計
add r2, r0, r1, lsr #1 /* R2 =(R1>>1)+ R0 */ movsp, #0x1000 str r2, [sp] mov r0, #z /* put z value into R0 */ and r0, r0, #0xFF /* get low 8 bit from R0 */ mov r1, #y /* put y value into R1 */ add r2, r0, r1, lsr #1 /* R2 =(R1>>1)+ R0 */ ldr r0, [sp] /* put y value into R1 */ mov r1, #0x01 orr r0, r0, r1 mov r1, R2 /* put y value into R1 */ add r2, r0, r1, lsr #1 /* R2 =(R1>>1)+ R0 */ }}
實驗三 C 語言程序實驗一
一.實驗目的
學會使用Embest IDE 編寫簡單的 C 語言程序并進行調試。學會編寫和使用命令腳本文件。
掌握過memory/register/watch/variable 窗口分析判斷運行結果。二.實驗設備
硬件:PC 機。
軟件:Embest IDE Pro 2005 集成開發環境,Windows 98/2000/NT/XP。三.實驗內容
利用命令腳本初始化棧指針,并使用 c 語言完成延時函數。四.實驗操作步驟
1)參考前面實驗創建新的工程(工程名為 C1);
2)按照參考程序,編寫源文件 C1.c 和 C1.cs,并把它們加入工程里面。C1.cs 加在工程根目錄即可。
計算機學院軟件工程系嵌入式應用系統設計
3)參考前面例子進行標準的設置,其中需要注意的是,在調試 Debug 對話框設置的時候,增加連接后自動執行腳本文件:
4)參考前面實驗步驟進行編譯和連接;
5)下載,打開 Memory/Register/Watch/Variable 窗口,單步執行,通過 memory/register /watch/variable 窗口分析判斷結果,在 watch 框中輸入要觀察變量 I 和變量 J 的值,并記錄下來。特別注意在 variable 窗口觀察變量 I 的變化并記錄下來;
6)結合實驗內容和相關資料,觀察程序運行,通過實驗; 7)理解和掌握實驗后,完成實驗練習題。五.實驗參考程序 1.C1.c 參考源代碼:/********************************************************** * File: c1.c * Author: embest * Desc: c language example 1 /*********************************************************/ /* function declare */ void delay(int nTime);/********************************************************** * name: _start * func: entry point **********************************************************/ _start(){ int i = 5;for(;;){ delay(i);} } /********************************************************** * name: delay * func: delay some time * para: nTime--input * ret: none *******************************************************/ void delay(nTime){
int i, j = 0;for(i = 0;i < nTime;i++){ for(j = 0;j < 10;j++)} 計算機學院軟件工程系嵌入式應用系統設計
} 2.C1.cs 參考源代碼 stop regwrite sp 0x1000;initialize the sp , sp = 0x1000 實驗截圖如下:
六、實驗總結
在實驗中我慢慢地熟悉了EmbestIDE的使用,在老師的教導和指導下,學會了編寫和使用簡單的命令腳本文件,學會了在memory/register/watch/variable等等中查看變量,分析判斷運行結果。
計算機學院軟件工程系嵌入式應用系統設計
實驗四 C 語言程序實驗二
一.實驗目的
掌握建立基本完整的 ARM 工程,包含啟動代碼,連接腳本等。了解 ARM9 啟動過程,學會使用Embest IDE 編寫簡單的 C 語言程序和匯編啟動代碼并進行調試。掌握鏈接腳本的作用。掌握如何指定代碼入口地址與入口點。掌握通過 memory/register/watch/variable 窗口分析判斷結果。二.實驗設備
硬件:PC 機。
軟件:Embest IDE Pro 2005 集成開發環境,Windows 98/2000/NT/XP。三.實驗內容
用 c 語言編寫延時函數,使用嵌入匯編實驗原理 1.ARM 異常向量表
當正常的程序執行流程暫時掛起時,稱之為異常,例如:處理一個外部的中斷請求。在處理異常之前,必須保存當前的處理器狀態,以便從異常程序返回時可以繼續執行當前的程序。ARM 異常向量表如下:
表 1-4 ARM 異常向量表
地址異常入口模式 0x00000000 Reset 管理 0x00000004 Undefined Instruction 未定義 0x00000008 Software interrupt 管理0x0000000C Prefetch abort 中止 0x00000010 Data abort 中止 0x00000014 Reserved 保留 0x00000018 IRQ IRQ 0x0000001C FIQ FIQ處理器允許多個異常同時發生,這時,處理器會按照固定的順序進行處理,參照下面的異常優先級。
高優先級: 1----Reset 2----Data abort 3----FIQ 4----IRQ 5----Prefetch abort 低優先級: 6----Undefined Instruction,Software interrupt 由上可見,Reset 入口,即為整個程序的實際入口點。因此,我們在編寫代碼的時候,第一條語句是在 0x00000000 處開始執行的。一般地,我們使用下面的代碼: #---Setup interrupt / exception vectors B Reset_HandlerUndefined_Handler: B Undefined_HandlerSWI_Handler: B SWI_HandlerPrefetch_Handler: B Prefetch_HandlerAbort_Handler: B Abort_Handler NOP /* Reserved vector */ IRQ_Handler: B IRQ_HandlerFIQ_Handler: B FIQ_HandlerReset_Handler: LDR sp, =0x00002000 2.鏈接腳本文件
所有的鏈接都是通過鏈接腳本來控制實現的。這些鏈接腳本文件使用鏈接命令語言編寫。鏈接腳本的主要作用是描述我們編寫的文件中這么多個部分應該如何的 計算機學院軟件工程系嵌入式應用系統設計
相應擺放在輸出文件中,并控制存儲區如何定位這些輸出文件。同時,如果需要,我們還可以使用鏈接腳本文件實現其它功能。大部分鏈接腳本文件都是很簡單的。簡單的鏈接腳本只有一行命令:SECTIONS。我們使用 SECTIONS 命令來告訴存儲區應該如何擺放我們的輸出文件。SECTIONS 命令是一個強大的命令,這里通過一個簡單的例子來說明一下。假設程序中包括代碼、已經初始化的數據和還沒有初始化的數據。這些需要相應的分別擺放在.text.data 和.bss部分。針對這個例子,我們可以假設代碼必須放在 0x10000,數據必須放在地址 0x8000000 開始的地方。下面是一個描述上面內容的一個簡單的鏈接腳本:
SECTIONS {.= 0x10000;.text : { *(.text)}.= 0x8000000;.data : { *(.data)}.bss : { *(.bss)}.} 鏈接腳本文件中全部使用半角符號,文件編寫格式必須從 SECTIONS 關鍵字開始,緊接著是開大括號,接著是所有需要輸出的描述部分,后用閉大括號收尾。上面的例子的鏈接腳本命令第一行使用專門的符號“.”,它指向當前的地址計數器。如果沒有在其它地方專門的說明輸出部分的地址(有關“其它地方”后面有說明),一般程序都會默認當前的地址計數器。地址計數器會根據輸出部分的大小而增加。在 SECTIONS 命令開始,地址計數器一般為 0。第二行定義了一個輸出區,.text。其中的“:”號是必須的,但是它經常被忽略。在大括號里面,每個輸出部分的名稱后面必須把所有需要輸入的部分的名字都列出來。“*”號是一個通配符,可以搭配成任何文件名字。*(text)表示在輸入文件中所有的.text 輸入部分。開始時定義了輸出部分.text 的起始地址為 0x10000,鏈接器會把輸出文件中的.text 部分的地址設置為 0x10000。在后面的幾行里面,定義了.data 和.bss部分。連接器會把.data 輸出部分的起始地址設置為 0x8000000。當連接器設置.data 部分后,當前地址計數器會自動指向 0x800000。這樣,連接器會緊跟著把.bss部分放在.data 部分后面。連接器會增加本地計數器,以確保需要時每個輸出部分都有必需的隊列。在這個例子里面,為.text和.data 部分指定了特定的地址,這兩個部分會確保可以得到隊列保證,但是連接器可能會在.dat a 和.bss之間創建一個小小的空隙。
3.內嵌匯編語言從下面的示例看得出來,GCC 支持大部分基本的內嵌匯編語言。編譯器遇到這個聲明的時會在輸出流中插入一個匯編語言標記。示例:一個基本的內嵌匯編語言例子 __asm__(“mov r1, r2”);四.實驗操作步驟
1.參考前面實驗創建新的工程(工程名為:C2)。
2.編寫新的源代碼文件 c2.c,init.s和腳本文件ldscript,并把它們加入工程中。
3.參考前面例子進行標準的設置。4.參考前面實驗步驟進行編譯&連接。
計算機學院軟件工程系嵌入式應用系統設計
5.下載調試,打開 memory/register/watch/variable 窗口,單步執行,并通過 memory/re gister/watch/variable 窗口分析判斷結果。
6.結合實驗內容和相關資料,觀察程序運行。7.理解和掌握實驗后,完成實驗練習題。五.實驗參考程序 1.c2.c 參考源代碼
/******************************************************************* *File: c2.c * Author: embest * Desc: c language example 2 ********************************************************************/ /******************************************************************** * name: _nop_ * func: The following shows c language embededassembel language * para: none * ret: none ********************************************************************/ void _nop_(){ __asm(“ mov r0,r0 ”);} /******************************************************************** * name: delay * func: delay time * para: none * ret: none ********************************************************************/ void delay(void){ inti;for(i = 0;i<= 10;i++){ _nop_();} } /******************************************************************** * name: delay10 * func: delay time * para: none * ret: none ********************************************************************/ void delay10(void){ inti;for(i = 0;i<= 10;i++){ delay();} } /******************************************************************** * name: _main 計算機學院軟件工程系嵌入式應用系統設計
* func: c code entry * para: none * ret: none ********************************************************************/ __main(){ inti = 5;for(;;){ delay10();} } 2.init.s 參考源代碼:
#******************************************************************** # File:init.s # Author: embest # Desc:C start up codes.Configure memory, #InitializeISR ,stacks,initialize C-variables # Fill zeros into zero-initialized C-variables #******************************************************************** /* global symbol define */.global _start /* code */.text _start: # Set interrupt / exception vectors b Reset_HandlerUndefined_Handler: b Undefined_HandlerSWI_Handler: b SWI_HandlerPrefetch_Handler: b Prefetch_HandlerAbort_Handler: b Abort_Handlernop /* Reserved vector */ IRQ_Handler: b IRQ_Handler FIQ_Handler: b FIQ_HandlerReset_Handler: ldrsp, =0x00002000 # ******************************************************************** # Branch on C code Main function(with interworking).* # Branch must be performed by an interworking call as.* # either an ARM or Thumb.main C function must be.* # supported.This makes the code not position-independent.* # A Branch with link would generate errors * # ***********************************************************************.extern __main ldr r0, = __main movlr, pc # jump to __main()bx r0 # ************************************************************************ # * Loop for ever * 計算機學院軟件工程系嵌入式應用系統設計
# * End of application.Normally, never occur.* # * Could jump on Software Reset(B 0x0).* # ************************************************************************End: b End.end 3.ldscript參考源代碼:
SECTIONS {.= 0x0;.text : { *(.text)}.data : { *(.data)}.rodata : { *(.rodata)}.bss : { *(.bss)} } 五.實驗截圖如下:
六、實驗總結:
在實驗中我學會了建立基本完整的 ARM 工程,包含啟動代碼,連接腳本等。了解 ARM9 啟動過程,學會簡單使用 Embest IDE 編寫簡單的 C 語言程序和匯編啟動代碼并進行調 試。明白了一些鏈接腳本的作用。子解了如何指定代碼入口地址與入口點。通過 memory/register/watch/variable 窗口分析判斷結果。
計算機學院軟件工程系嵌入式應用系統設計
實驗五 LED 控制實驗
一.實驗目的
? 在 EBDCC2530 節點板上運行自己的程序。? 通過 I/O 控制小燈閃爍和蜂鳴器鳴叫。二.實驗環境
? 硬件:PC 機,EBDCC2530 節點板,USB 接口仿真器。? 軟件:Windows 98/2000/NT/XP,IAR 集成開發環境。三.實驗原理
低電平來控制燈的亮與滅和蜂鳴器的鳴叫。
本實驗設置 P1.0、P1.1、P1.4 I/O 引腳來選通 LED1、LED2、LED3,引腳置為低電平點亮 LED,反之熄滅 LED。設置 P0.1 引腳來選通 BEEP,引腳置為低電平蜂鳴器鳴叫,反之蜂鳴器不鳴叫。
P1DIR(P1 方向寄存器):D7 D6 D5 D4 D3 D2 D1 D0 P1.7方向 0:輸入 1:輸出P1.6方向 0:輸入 1:輸出 P1.5方向 0:輸入 1:輸出P1.4方向 0:輸入 1:輸出 P1.3方向 0:輸入 1:輸出P1.2方向 0:輸入 1:輸出 P1.1方向 0:輸入 1:輸出P1.0方向 0:輸入 1:輸出
P1.7 功能 0:普通 I/O 1:外設P1.6 功能 0:普通 I/O 1:外設 P1.5 功能 0:普通 I/O 1:外設P1.4 功能 0:普通 I/O 1:外設 P1.3 功能 0:普通 I/O 1:外設P1.2 功能 0:普通 I/O 1:外設 P1.1 功能 0:普通 I/O 1:外設P1.0 功能 0:普通 I/O 1:外設 LDE 燈實現的主要代碼為: void main(void){ led_beep_init();halWait(250);while(1){ //開始循環 LED1 = 0;LED1 = 1;//LED1 閃爍halWait(250);halWait(250);LED2 = 0;//LED2 閃爍 halWait(250);LED2 = 1;halWait(250);LED3 = 0;//LED3 閃爍 halWait(250);LED3 = 1;halWait(250);BEEP = 0;//BEEP 鳴叫 halWait(250);BEEP = 1;halWait(250);LED1 = 0;LED2 = 0;LED3 = 0;//LED 燈全亮 halWait(250);halWait(250);LED1 = 1;LED2 = 1;LED3 = 1;//LED 燈全滅
計算機學院軟件工程系嵌入式應用系統設計
halWait(250);halWait(250);} } 四.實驗步驟
1、正確連接 USB 仿真器的下載線和 EBDCC2530 節點板。
2、打開實驗源碼LEDs.eww(路徑為:出廠光盤 DISK-EMBV210-WSN 主站蜘蛛池模板: 亚洲夜色噜噜av在线观看| 97久久精品无码一区二区天美| 曰欧一片内射vα在线影院| 久久综合色老色| 亚洲精品乱码久久久久久蜜桃不卡| 精品一区二区三区免费毛片爱| 成人国内精品视频在线观看| aⅴ免费视频在线观看| 精品无人国产偷自产在线| 日韩a片无码一区二区五区电影| 97免费人妻无码视频| 国产精品视频免费一区二区| 777亚洲精品乱码久久久久久| 中文字幕精品亚洲人成在线| 精品国产免费人成电影在线看| 女人扒开屁股爽桶30分钟| 美女露出奶头扒开尿口免费网站| 亚洲精品久久久久国色天香| 亚洲顶级裸体av片| 人妻中文字幕乱人伦在线| 欧美va亚洲va在线观看日本| 亚洲欧美闷骚少妇影院| 众筹模特内部视频2023年最新一期| 国产精品久久国产精品99 gif| 女人和拘做受全程看视频| 亚洲美女做爰av人体图片| 人妻综合专区第一页| 久久99精品国产麻豆婷婷洗澡| 2019久久久高清日本道| 无码aⅴ精品一区二区三区浪潮| 精品久久一区二区乱码| 69国产精品成人aaaaa片| 人妻互换精品一区二区| 中文字幕av无码不卡免费| 久久精品黄aa片一区二区三区| 亚洲中文久久精品无码照片| 精品一区二区三区在线观看视频| 国产偷人妻精品一区| 亚洲人成欧美中文字幕| 精品国产乱码久久久久久浪潮| 国产精品va在线观看无码不卡|