2023年ARM實驗報告新編_第1頁
2023年ARM實驗報告新編_第2頁
2023年ARM實驗報告新編_第3頁
2023年ARM實驗報告新編_第4頁
2023年ARM實驗報告新編_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

南京郵電大學通達學院

嵌入式系統B

實驗報告

班級100023

專業通信工程(嵌入式系統開

發1

學號10002304

姓名陸海霞

實驗項目:

1、ADS下簡樸ARM匯編程序

2、熟悉LINUX開發環境

3、多線程應用程序設計

指導教師范山崗

實驗一ADS下簡樸ARM匯編程序

實驗目的:

1、熟悉ADSL2下進行匯編語言程序設計的基本流程;

2、熟悉在ADS中創建工程及編寫、編譯和運營匯編語言程序的方法;

3、熟悉AXD中各種調試功能。

實驗環境:

1、硬件:PC機。

2、軟件ADS1.2。

實驗內容:

1、在ADS中新建工程,并設立開發環境。

2、在CodeWarrior環境中編輯、編譯和鏈接匯編語言程序,并生成可執行文獻。

3、在AXD中調試匯編程序;

4、使用命令行界面編輯、編譯和鏈接匯編程序。

實驗環節:

本實驗規定在ADS環境下,編寫一個匯編程序,計算S=1+2+3……+n的累加值。

把累加結果S存入到存儲器的指定位置;在AXD中調試該程序,使用ARMulator模擬目的

機。

1、新建工程。

打開CodeWarrior,選擇File->New(project)選項,使用ARMExecutableImage模

版新建一個工程。

2、設立編譯和鏈接選項。

由于我們使用的是模擬機,設立匯編語言編譯器的模擬解決器架構為Xscale;在ARMLink

er中,選擇output選項卡并選擇Linktype為Simple類型,確認ROBase為0x8000,

修改RWBase為0x9000,

3、為當前工程添加源程序文獻。

ARM匯編程序源文獻后綴名為S大小寫均可。

保證添加入當前工程復選框選上。

4、編輯源程序代碼。

參考程序add.s:

armadd源程序

NEQU7。。;累加次數

;定義名為Adding的代碼段

oAREAAdding,CODE,READONLY

。ENTRY

ooMOVR0,#0

。MOVRl,#l

REPEATADDRO,RO,RI

6DDR1,R1,#1

CMPR1,#N

oBLEREPEAT

ooLDRR2,=RESULT

。STRRO,[R2]

HEREoBHERE

。定義名為Dataspace的數據段

AREADataspace,DATA,READWRITE

RESULTDCD0

-END

實驗中程序編寫如下圖所示:

■10002304.S

,{.},M?,國,nP,Path:D:\mywork\armadd\Ihx.i

NEQU7;

AREAAciding,CODE,READONLY

ENTRY

MOVR0,40

MOVRlz#l|

REPEATADDRO,RO,RI

ADD

CMPR1,#N

BLEREPEAT

LDRR2,=RESULT

STRR0z[R2]

HEREBHERE

AREADataspace,DATA,READURITE

RESULTDCD0

END

5、編譯匯編源代碼文獻。

右擊add.S文獻,選擇Compile,假如沒有成功會彈犯錯誤和警告窗口。

生成Q目的代碼文獻。

實驗中生成的WMM.O文獻如下圖所示:

搜索文件夾團,

irk\armadd\armaddData\DebugRel\ObjectCode

10002304.O

務會。文件

2KB

:件夾

6、編譯整個工程。

選擇Project-Make進行整個工程的編譯。可以在目錄空間查看是否生成了映像文獻

add.axfo

7、確認調試目的設立。

設立目的解決器型號。

8、運營映像文獻。

9、調試準備

在AXD中,打開各個觀測窗口,做調試準備。選擇ProcessorViewsfRegisters選

項,打開ARM寄存器顯示窗口。調整窗口大小,使得Corrent節點的R0?R2寄存器可見。

選擇ProcessorViewsTMemory選項,打開ARM存儲器顯示窗口。在StartAddre

ss輸入框中輸入準備查看的內存區域首地址0x9000。

10、調試映像文獻。

打開調試窗口。

為了便于調試,觀測各個寄存器和存儲器的變化情況。

11、單步運營程序,觀測并記錄結果。

在AXD中,選擇Execute今Step選項,或者F10鍵,單步運營程序,查看相關寄存器和存儲

器相應地址上的變化,請把每一步的結果填入下表中。

運營結果如圖所示:

喪SearchProcessorViewsSistefnViewsExecuteOptionsWindowHelp

劇明閩潮型II喻陶

?‘XScale-D:\mywork\armadd\10001304s_□Xl

L

iMOVRl,#l

7REPEATADDR0.R0.R1

ADDR1,R1Z#1

CMP

ICBLEREPEAT

LDRR2Z=RESULT

12STRRO.FRZl

EHERE

[Scale-Registers

RegisterValue15

16AREADataspace,DATAREADWRITE

3-Current{???}z

17RESULTDCD0

FrOOxOOOOOOlC

i;

l-rl0x00000008

|-r20x00009000

pr30x00000000

|-r40x00000000

分析源程序可以看出,我們的程序僅對少數幾個寄存器進行了讀寫操作。

序號執行指執行后的變化情況

令寄存器(十六進制)存儲器(十六進制)

R0R1R2PC0x9000

1MOV0x00000000Ox0000000Ox00000000X0000800x9000

R0,0004

#0

2MOVOx00000x00000X00000000x000080080x9010

RI,#000000010

1

3ADD0x000000010x00000x0000x0000800c0X9020

RO,R000100000

0,R1

4ADD0x000000X000000020x0000Ox00008010Ox9030

RI,R0010000

1,#1

5CMP0X0x000x00X000080140x9040

R1,00000(X)10000020000000

#N

6BLE0x00000x000000020x00000x000080Ox9050

REPE0001000008

AT

7ADD0X0000000x000000Ox00000xOOOO800x9060

RO,R030200000c

O,R1

注意:假如錯過記錄的時機可以選擇Fi1e-Rc]oadCurrentImage重新加載映像文

獻。

實驗思考:

1、有沒有辦法讓AXD中寄存器和存儲器單元的值直接顯示為十進制?

答:暫停ads,修改相關參數,即可顯示

同組同學:

10002201孫郡遙

10002304陸海霞

10002302祁蕾

10002308梁玉

實驗二熟悉LINUX開發環境

實驗目的:

熟悉Linux開發環境,學會基于S3c2410的Linux開發環境的配置和使用。使用L

inux的

armv41-unknown-1inux-gcc編譯,使用基于NFS方式的下載調試,了解嵌入式開發的

基本

過程。

實驗環境:

硬件:UP-NETARM2410-S嵌入式實驗平臺、PC機Pentium500以上,硬盤10G以上。

軟件:PC機操作系統REDHATLINUX9.0+MINIC0M+ARM-LINUX開發環境

實驗內容:

1、本次實驗使用RedhatLinux9.0操作系統環境,安裝ARM-Linux的開發庫及編譯

器。

2、創建一個新目錄,并在其中編寫hello,c和Makefi1e文獻。學習在Linux下的

編程和編譯過程.

3、ARM開發板的使用和開發環境的設立。

4、下載已經編譯好的文獻到目的開發板上運營。

實驗環節:

1、嵌入式交叉開發環境的建立

1)宿主機的環境搭建

選擇一種方式在宿主機上直接安裝Linux操作系統,如安裝Redllat.

下載VMWare,解壓后根據提醒對的安裝VMWare到硬盤中;

運營VMWare,根據向導創建一臺虛擬機并選擇Linux作為客戶操作系統;

根據向導安裝RedHatLinux9.0

2)虛擬機中啟動Linux操作系統

用戶名:root密碼:12345678

將Windows下的e盤設為共享目錄,則在Linux的/mnt/hgfs/目錄下就可以訪問到W

indows下的e盤了。

3)開發工具軟件的安裝

1、安裝gcc

在Linux主窗口中單擊鼠標右鍵,選擇“新建終端”命令,打開Linux命令行窗口。在目錄

/mnt/hgfs/e/Linuxv7.2/arm41—too1s/下找到gcc的安裝文獻insta11.sh并

執行它。操作命令如下:

[]#1s

[]#./insta11.sh

2、配置PATH途徑

/root/下有一個".bashProfile”文獻(由于該文獻是隱藏文獻,所以需要用“Is-a”

命令才干顯示);

用vi編輯器編輯該文獻:

[]#vi.bash_Profile

將文獻中PATH變量改為PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;

存盤后執行

口#source.bash_profi1e

以后armv41-unknown-1inux-gcc將會被自動搜索到。

4)宿主機上的開發環境配置

1、配置IP地址

實驗箱的IP地址是192.168.0.115,所以可以把主機的IP配置成192.168.0.121,

具體配置時間方法如下:

[]#ifconfigethO192.168.0.121

在Linux中選擇“Red”菜單一>“系統設立”一〉“網絡”,打開“網絡配置”窗口,雙擊

設備ethO的藍色區域,進入以太網設立界面。

2、關閉防火墻

單擊“Red”菜單一〉“系統設立”一>安全級別,打開“安全級別配置”窗口,選擇“無防火

墻”選項。

3、配置NFS

單擊“Red”菜單->系統設立-〉服務器設立->服務,在“服務配置”窗口中勾選nfs,

單擊“開始”

4、NFS設立

單擊“Red”菜單->系統設立->服務器設立->NFS服務器,打開“NFS服務器配置”窗口,

設立NFS共享。單擊增長,在“目錄”文本框中填入需要共享的途徑,在主機文本框中填入

允許進行連接的主機IP地址。選擇允許客戶對共享目錄的操作為只讀或讀寫。最后退出時

則完畢NFS配置。配置好后,界面應顯示如下圖所示:

NFS服務器。

文件(E)幫助

I…?…I,尊谷

,添加?;,巴."D幫助(H)

目錄|主機|權限

/arm2410s192.168.0.*Read/Write

至此,交叉開發環境的主機部分派置完畢。

5)目的機的信息輸出

使用超級終端介紹宿主機與實驗箱的通信。

一方面連接串口線:一端連接PC的串口(C0M1),另一端連接到UP-NETARM2410-S實驗箱

的串口。接下來建立超級終端:運營Windows系統下的“開始”-“所有程序”-“附件

“通訊”一“超級終端”,新建一個通信終端。

文件(E)編輯(日杳看(V)終端CD標簽幫助(t±>

W?lco

MnicomConrrandSunrniry

OPTIO

root的主IConpiConrrandscanbecalledbyCTRL-A<key>

MinFunclionsOiherFunclions

DialingdirectoryDrunscript(Go)....GClearScreen......

回收卻/$ASendf-i1us.......ReceivefilesRc5figureMnicom.O

/bin/conmParanvters..PAddIinefeed.Suspendminicom...

/$/Captureon/off...Ll^ngup........eXitandreset....X

asendbreak.......FinitializeM)dem...MQjiIwithnoresetQ

TerminalsellingsTrunKermitCursorkeynude...1

1ineW-apon/off..W1oca1Echoon/off..EHe1pscreen........Z

scro11Back........B

SelectfunctionorpressEnIerfornone.

WittenbyMque1vanSnoorenburgr1991-1995

SontadditionsbyJukkaLahlinen1997-2000

i18nbyArnaIdoCarva1hodeM?Io1998

6)程序的運營

打開超級終端,打開實驗箱電源開關,系統會由vivi開始引導。正常顯示時會顯示啟動信息

到“PressReturntostarttheLINUXnow,anyotherkeyforvivi",假如不

進行任何操作等待30s或按回車鍵則啟動進入Linux系統;假如按回車鍵以外的其他鍵則

進入vivi控制臺。在這里輸入boot,會引導Kernel啟動Linux系統。Linux系統啟動

完畢后,屏幕顯示:[/mnt/yaffs]

root(3>localhost:-

文件編輯查看終端CD標簽《國柄助(旦)

W?1com?tominicom2.4)0.0

OPT!Cb6:IlistoryBuffer.F-keyMeros.SearchHistoryBuffer.118n

?t的IConpiIedonJun152004.20:45:27.

[可收卻/$ATS7=45—[configruraConfigrurationsaved

/bin/ash:c1enanvsand

/$/bin/ashetransfer

Serialportsetup

M)demanddia1ingr

Screenandkeyboard

基于Linux的應用程序的開發環節

1、建立工作目錄

[root@zxtsmile]#mkdirhello

[root@zxtsmile]#cdhello

2、編寫程序源代碼

在Linux下的文本編輯器有許多,常用的是vim和Xwindow界面下的gedit等,我們在

發過程中推薦使用vim,用戶需要學習vim的操作方法,請參考相關書籍中的關于vim的

操作指南。Kdevelope、anjuta軟件的界面與vc6.0類似,使用它們對于熟悉windows

環境下開發的用戶更容易上手。

實際的hello,c源代碼較簡樸,如下:

#incIude<stdio.h>

main()

(

printf("helloworld\n");

)

我們可以是用下面的命令來編寫he11o.c的源代碼,進入hello目錄使用vi命令來編

輯代

碼:

[root@zxthe1lo]itvihe11o.c

按“i”或者“a”進入編輯模式,將上面的代碼錄入進去,完畢后按Esc鍵進入命令狀態,再

用命令“:wq”保存并退出。這樣我們便在當前目錄下建立了一個名為hello,c的文獻。

3、編寫Makefile

要使上面的hello.c程序可以運營,我們必須要編寫一個Makefi1e文獻,Makefile

文獻

定義了一系列的規則,它指明了哪些文獻需要編譯,哪些文獻需要先編譯,哪些文獻需要

重新編譯等等更為復雜的命令。使用它帶來的好處就是自動編譯,你只需要敲一個"make”

命令整個工程就可以實現自動編譯,當然我們本次實驗只有一個文獻,它還不能體現出使

用Makefile的優越性,但當工程比較大文獻比較多時,不使用Makefile幾乎是不也許

的。

下面我們介紹本次實驗用到的Makefile文獻。

CC=armv41-unknown_1inux-gcc

EXEC=he11o

OBJS=he11o.o

CFLAGS+=

LDFLAGS+=-static

all:$(EXEC)

$(EXEC):$(OBJS)

$(CC)$(LDFLAGS)-o$@$(OBJS)

clean:

—rm-f$(EXEC)*.elf*.gdb*.o

下面我們來簡樸介紹這個Makefile文獻的幾個重要部分:

CC指明編譯器

EXEC表達編譯后生成的執行文獻名稱

OBJS目的文獻列表

CFLAGS編譯參數

LDFLAGS連接參數

a11:編譯主入口

clean:清除編譯結果

與上面編寫he1lo.c的過程類似,用vi來創建一個Makefile文獻并將代碼錄入其

[root@zxthello]#viMakefi1e

4、編譯應用程序

在上面的環節完畢后,我們就可以在hell。目錄下運營"make”來編譯我們的程序了。假如

進行了修改,重新編譯則運營:

[root@zxthello]#makec1ean

[root@zxtheHo]#make

5、下載調試

在宿主PC計算機上啟動NFS服務,并設立好共享的目錄,具體配置請參照前面第一章

第四

節中關于嵌入式Linux環境開發環境的建立。在建立好NFS共享目錄以后,我們就可以進

入MINIC0M中建立開發板與宿主PC機之間的通訊了。

[root@zxthe11o]#minicom

[/mnt/yaffs]mount—tnfs-onolock192.168.0.56:/arm241Os/host

假如不想使用我們提供的源碼的話,可以再建立一個NFS共享文獻夾。如/root/share,我

們把我們自己編譯生成的可執行文獻復制到該文獻夾下,并通過MINIC0M掛載到開發板上。

[root@zxthel1o]#cphel1o/root/share

[root@zxthellominicom

[/mnt/yaffs]mount-tnfs-onolock192.168.0.56:/root/share/

host

再進入/host目錄運營剛剛編譯好的hell。程序,查看運營結果。

[/mnt/yaffs]cd/host

[/host]./hello

hellowor1d

實驗思考:

1.Makefi1e是如何工作的?其中的宏定義分別是什么意思?

答:解釋makefile如何工作:makefile是一個文本文獻,用于描述程序源代碼之間以

及程序可執行代碼與源代碼之間的依賴關系。A簡樸例子:最終編譯生成的可執行文獻ab.ou

t是由a.c和b.c共同編譯生成的,那么make文獻就要寫兩行:

ab.out:a.cb.c

gcca.cb.c-Oab.outA第一行描述了依賴關系,第二行描述了依賴關系是如何達

成的。

更復雜的例子:最終編譯生成的可執行文獻ab.out是由a.c和b.obj功能編譯生成的,而

b.obj是由bl.c和b2.c編譯而成,那么要寫好多行:Mb.out:a.cb.obj

gcca.cb.obj-oab.out^b.obj:bl.cb2.cAgcc-cbl.cb2.c-ob.

objA這就是makefi1e的工作方法。A關于宏定義,簡樸點說就是文本替換。為了方便使

用不同的編譯器或者編譯環境以及硬件環境,一些復雜的軟件使用了大量的宏定義來代替諸

如“gcc

同組同學:

10002201孫郡遙

10002304陸海霞

10002302祁蕾

10002308梁玉

實驗三多線程應用程序設計

實驗目的:

了解多線程程序設計的基本原理。

學習pthread庫函數的使用。

實驗環境:

硬件:UP-NETARM2410-S嵌入式實驗平臺,PC機Pentium500以上,硬盤40G以上,

內存大

于128M。

軟件:PC機操作系統REDHATLINUX9.0+MINICOM+ARM-LINUX開發環境

實驗內容:

讀懂pthread.c的源代碼,熟悉幾個重要的PTHREAD庫函數的使用。掌握共享鎖和信號

的使用方法。

進入/arm2410s/exp/basic/02_pthread目錄,運營make產生pthread

程序,使用NFS方

式連接開發主機進行運營實驗。

實驗環節:

1.實驗源代碼與結構流程圖

本實驗為著名的生產者-消費者問題模型的實現,主程序中分別啟動生產者線程和消費者

線程。生產者線程不斷順序地將0到1000的數字寫入共享的循環緩沖區,同時消費者線程

不斷地從共享的循環緩沖區讀取數據。流程圖如下圖所示:

主程序

淚由

本實驗具體代碼如下:

#include<stdio.h>

#inc1ude<std1ib.h>

#include<time.h>

ftinclude//pthread.h〃

#defineBUFFER_SIZE16

/*設立一個整數的圓形緩沖區*/

structprodcons{

intbuffer[BUFFER_SIZE];/*緩沖區數組*/

pthread_mutex_t1ock;/*互斥鎖*/

intreadpos,writepos;/*讀寫的位置文/

pthreadcondtnotempty;/*緩沖區非空信號*/

pthread_condtnotful1;/*緩沖區非滿信號*/

);

/*初始化緩沖區*/

voidinit(structprodcons*b)

(

pthread_mutex_init(&b->lock,NULL);

pthread_cond_init(&b->notempty,NDLL);

pthread_cond_init(&b->notfull,NULL);

b->readpos=0;

b->writepos=0;

}

/*向緩沖區中寫入一個整數*/

voidput(structprodcons*b,intdata)

(

pthread_mutexlock(&b->1ock);

/*等待緩沖區非滿*/

while((b->writepos4-1)%BUFFER_SIZE==b—>readpos)

printf("waitfornotfu1l\n〃);

pthread_condwait(&b->notfull,&b—>lock);

)

/大寫數據并且指針前移*/

b->buffer[b->writepos]=data;

b->writepos++;

if(b->writepos>=BUFFER_SIZE)b->writepos=0;

/*設立緩沖區非空信號文/

pthread_cond_signa1(&b—>notempty);

pthread_mutex_un1ock(&b->lock);

)

/*從緩沖區中讀出一個整數*/

intget(structprodcons*b)

(

intdata;

pthreadmutex_lock(&b->1ock);

/*等待緩沖區非空文/

while(b->writepos==b->readpos){

printfC'waitfornotempty\nz,);

pthread_condwait(&b->notempty,&b->lock);

)

/文讀數據并且指針前移*/

data=b->buffer[b->readpos];

b->readpos++;

if(b->readpos>=BUFFER_SIZE)b->readpos=0:

/*設立緩沖區非滿信號*/

pthread_cond_signa1(&b->notful1);

pthread_mutex_un1ock(6b->lock);

returndata;

}

^defineOVER(-1)

structprodconsbuffer;

void*producer(void*data)

into;

for(n=0;n<1000;n++){

printf("put->%dn);

put(&buffer,n);

)

put(&buffer,OVER);

printf("producerstopped!\n〃);

returnNULL;

)

void*consumer(void*data)

(

intd;

while(1){

d=get(&buffer);

if(d二二OVER)break;

printf(H%d—>get\n\d);

)

printf(〃consumerstopped!\n");

returnNULL;

intmain(void)

pthread_tth_a,th_b;

void*retval;

init(&buffer);

pthread_ereate(&th_a,NULL,producer,0);

pthread_create(&th_b,NULL,consumer,0);

/*等待生產者和消費者結束*/

pthread_join(tha,&retval);

pthread_join(th_b,&retval);

return0;

)

3.重要函數分析:

下面我們來看一下,生產者寫入緩沖區和消費者從緩沖區讀數的具體流程,生產者一方面要

獲得互斥鎖,并且判斷寫指針+1后是否等于讀指針,假如相等則進入等待狀態,等候條件

變量notfull;假如不等則向緩沖區中寫一個整數,并且設立條件變量為notempty,最后

釋放互斥鎖。消費者線程與生產者線程類似,這里就不再過多介紹了。流程圖如下:

進行消費Set)

生產者寫入共享的循環緩沖區函數PUT

voidput(structprodcons*b,intdata)

(

pthreadjnutex_1ock(&b->1ock);〃獲取互斥鎖

while((b->writepos+1)%BUFFER_SIZE==b->readpos){

〃假如讀寫位置相同

pthread_cond_wait(&b->notfu11,&b—>lock);

〃等待狀態變量6>!1。1加11,不滿則跳出阻塞

)

b->buffer[b->writepos]=data;//寫入數據

b->writepos++;

if(b—>writepos>=BUFFER_SIZE)b->writepos=0;

pthread_cond_sign

溫馨提示

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

評論

0/150

提交評論