第一篇:ARM 2017年復習題總結
ARM 2017年復習題總結
簡答題
什么是嵌入式操作系統?
答:嵌入式系統是以應用為中心,以計算機技術為基礎,軟/硬件可裁減,功能。可靠性,成本,體積,功耗要求嚴格的專用計算機系統。
與通用計算機相比,嵌入式系統有哪些特點? 答:(1).嵌入式系統通常是面向特定應用的;
(2).嵌入式系統是將計算機技術,半導體技術和電子技術與各行各業的具體應用相結合的后的產物,是一門綜合技術學科;
(3).嵌入式系統和具體應用有機的結合在一起,它的升級換代也是和具體產品同步進行的,因此嵌入式產品一旦進入市場,就有較長的生命周期;
(4).為了提高執行速度和可靠性,嵌入式系統中的軟件一般都固化在存儲器芯片或單片機本身中,而不是存儲于磁盤等載體中;
(5).嵌入式系統本身不具有自主開發能力,即使設計完成以后用戶通常也不能對其中的程序功能進行修改,必須有一套開發工具和環境才能進行開發。
ARM處理器有幾種尋址方式,說明各種尋址的方式。答:
立即尋址:操作數直接放在指令中。例如:ADD R0,R0,#0x3f ;R0←R0+0x3f 寄存器尋址:操作數放在寄存器中。例如:ADD R0,R1,R2
;R0←R1+R2 寄存器間接尋址:操作數在內存,以寄存器中的值作為操作數的地址。例如:LDR R0,[R1]
;R0←[R1] 基址加偏移量尋址(基址變址尋址):基址寄存器的內容與指令中的偏移量相加形成操作數的有效地址
例如:LDR R0,[R1,#4] LDR R0,[R1,R2] ;R0←[R1+R2]
;R0←[R1+4] 多寄存器尋址:一條指令可以完成多個寄存器值的傳送。例如: LDMIA R0,{R1,R2,R3,R4} 12] 堆棧尋址:堆棧是一種數據結構,按先進后出(First In Last Out,FILO)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。例如:STMFD R13!,{R0,R4-R12,LR} LDMFD R13!,{R0,R4-R12,PC}
/ 17
;R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+舉例介紹嵌入式處理器有哪幾類?
答:1.嵌入式微處理器(Embedded Microprocessor Unit,EMPU);
2.嵌入式微控制器;(Embedded Microcontroller Unit,EMCU)
3.嵌入式DSP處理器(Embedded Digital Signal Processor,EDSP);
4.嵌入式片上系統(Embedded System on Chip,EsoC); 什么是立即數?請簡要描述立即數在使用時有什么注意要點。
立即數,主要是指尋址時直接在指令中出現的數,在使用時注意(1)立即數前需要加#(2)ARM指令只有32位長,立即數在指令中占12位存儲空間,ARM用這12位空間8位表示有效數字-基數B,4位表示譯為的數M,按照把B循環右移M*2位,構造成一個新的32位的數,其它位補0,所以在使用立即數時,要注意其是否合法。請問BL指令跳轉時LR寄存器保存的是什么內容?并請簡述原因。
BL跳轉時,LR中保存的是執行BL跳轉指令的下一條指令的地址,考慮流水線的情況,即當前的PC-4。LR用來在需要返回程序時從LR中還原程序執行的位置繼續執行。ARM內核有多少個寄存器,請列舉出這些寄存器的名字和數量。
ARM有37個寄存器,(1)未分組寄存器:R0-R7,共8個;(2)分組寄存器R8-R14,其中FIQ模式下有單獨的一組R8-R12共5個,另外6種模式共用一組R8-R12,共5個,USR和SYS模式共用一組R13-R14,共2個,另外5種模式下各有獨自的一組R13-R14,共10個;(3)程序計數器PC即R15寄存器,共1個;(4)狀態寄存器CPSR,和5個備份狀態寄存器SPSR,共6個;ARM總計37個寄存器。
ARM通用寄存器中,有3個寄存器有特殊功能和作用,請寫出它們的名字和作用。(6分)R13:SP棧指針寄存器,用來保存程序執行時的棧指針位置;R14:LR返回鏈接寄存器,用來保存程序執行BL指令或模式切換時的返回原程序繼續執行的地址;R15:PC程序計數器,保存程序執行的當前地址。
ARM的CPSR寄存器的位定義如圖所示,試簡述各位的功能。(8分)
3***6543210NZCV標志位含義 保留IFTM[4-0]
N N=1 表示運算的結果為負數;N=0 表示運算的結果為正數或零 Z Z=1 表示運算的結果為零;Z=0 表示運算的結果為非零 C C=1 表示有進位,C=0 表示沒有進位 V V=1 表示符號位溢出,V=0 表示結果沒有溢出 Q 在ARM vTE/J 架構支持,指示DSP 指令是否溢出
J 僅ARM 5TE/J 架構支持,J = 1 表示處理器處于Jazelle 狀態 I I=1 表示禁止IRQ F F=1 表示禁止FIQ T 僅ARM xT 架構支持,T = 0 表示處理器處于ARM 狀態,T=1 表示處理器處于Thumb 狀態
什么是偽指令和偽操作?在ARM匯編中有哪幾種偽 指令?
/ 17
答:在ARM匯編語言程序中有些特殊助記符,這些助記符與一般指令的助記符的不同之處在于沒有相對應的操作碼或者機器碼,通常稱這些特殊指令助記符偽指令,他們多完成的操作成為偽操作;
在ARM匯編中,有如下幾種偽指令:
(1)符號定義偽指令;
(2)數據定義偽指令;
(3)匯編控制偽指令;
(4)信息報告偽指令;
(5)宏指令及其他偽指令。
如何定義寄存器列表,試舉一個使用寄存器列表的例子,要求實現4個字的內存復制。答:
AREA
EXAMPLE1,CODE,READONLY
ENTRY LDR
R0,=0XFF
;把地址0XFF賦給R0
LDR
R5,=0X0F
;把地址0X0F賦給R5 START PBLOCK
RLIST
{R1-R4}
;把R1-R4定義為PBLOCK LDMIA
R0,PBLOCK
;把R0為首地址的內存4個字單元裝載至R1到R4中 STMIA
R5,PBLOCK
;把R1到R4的值依次存至R5為首地址的內存字單元 STOP
B
STOP
;死循環
END
如何定義一個宏,宏與子程序的區別是什么? 答:宏的格式為:
MARCO和MEND [$標號]
宏名
[$參數1,$參數2…..] 指令序列 MEND
MARCO表示一個宏定義的開始,MEND表示一個宏的結束,MARCO和MEND前呼后應可以將一段代碼定義為一個整體,又稱宏,然后在程序中就可以在程序中通過宏的名稱及參數調用該段代碼。
宏指令可以重復使用,這一點的使用方式與子程序有些相似,子程序可以節省存儲空間,3 / 17
提供模塊化的程序設計。但使用子程序機構時需要保存/恢復現場,從而增加了系統的開銷,因此,在代碼傳遞的參數較多并且比較短時,可以使用宏代替子程序,宏在被調用的地方展開。
ARM匯編中如何定義一個段,段有幾種屬性?
答:AREA用于定義一個代碼段,數據段,或者特定屬性的段。
段的幾種屬性如下:
READONLY表示只讀屬性;
READWRITE表示本段可讀寫;
CODE定義代碼段;
DATA定義數據段;
ALIGN=表達式的對齊方式為2的表達式次方;;
COMMON:定義一個通用段,這個段不包含用戶代碼和數據。
在一個匯編源文件中如何包含另一個文件中的內容?
答:通常可以使用GET/INCLUDE指令,在某源文件中定義一些宏指令,用MAP和FIELD定義結構化數據結構類型,用EQU定義常量的符號名稱,然后用GET/INCLUDE將這個源文件包含到其他源文件中。
1.ARM7TDMI采用了幾級流水線工作方式,簡要說明。答:三級
1、取指令
2、譯碼
3、執行
2.ARM9采用了幾級流水線工作方式,簡要說明。
答:五級流水線工作方式,1.取指2.指令譯碼3.執行4.數據存儲訪問5.寫寄存器 3.哈佛體系結構和馮諾依曼體系結構有何不同。
答:哈佛體系結構的兩套地址總線和數據總線是分開的,馮諾依曼體系結構是復用的。1.簡述ARM發生異常時,ARM核心會自動做哪些事情?從異常返回時,我們要做哪些事情?
當異常產生時, ARM core: 拷貝 CPSR 到 SPSR_
改變處理器狀態進入 ARM 狀態 改變處理器模式進入相應的異常模式 設置中斷禁止位禁止相應中斷(如果需要)保存返回地址到 LR_
/ 17
設置 PC 為相應的異常向量 返回時, 異常處理需要: 從 SPSR_
Note:這些操作只能在 ARM 態執行.2.用ARM匯編指令寫出實現64位加法和64位減法的代碼段,使用的寄存器請自行分配。假定低32位數存放在r0和r1里面,高32位數存放在r2和r3里面。加法:
ADDS r0, r0, r1 //加S是因為要讓這個操作影響標志位
ADC r2, r2, r3 //ADC是帶進位的加法,如果上一條指令產生進位則一起加進來 減法:
SUBS r0, r0, r1 //加S是因為要讓這個操作影響標志位 SBC r2, r2, r3 // SBC是帶進位的減法指令
3.請列舉ARM處理器的模式和異常,并說明各個發生異常時ARM處理器所處的模式 異常: Reset Data Abort FIQ IRQ Prefetch Abort SWI Undefined instruction 處理器模式
User : 非特權模式,大部分任務執行在這種模式?
FIQ : 當一個高優先級(fast)? 中斷產生時將會進入這種模式
IRQ : 當一個低優先級(normal)中斷產生時將會進入這種模式?
Supervisor? :當復位或軟中斷指令執行時將會進入這種模式
Abort : 當存取異常時將會進入這種模式?
Undef :? 當執行未定義指令時會進入這種模式
System : 使用和User模式相同寄存器集的特權模式? 4.FIQ的什么特點使得它處理的速度比IRQ快? 1)FIQ優先級比IRQ高,不會被中斷
2)FIQ有自己的專屬寄存器:r8~r12,不用對通用寄存器入棧保護,可以加快速度 3)FIQ位于異常向量表的末尾0x1c,故無需跳轉,可以在這里直接放置異常處理函數 5.什么指令可以放在中斷向量表?
/ 17
跳轉指令,給PC賦值的指令 B,LDR,MOV 6.ARM處理器 中斷向量表位于存儲器的什么位置? 默認:0x0 也可以配置成:0Xffff0000 7.下列 ARM 指令將做什么? a)LDRH r0,[r1,#6] b)LDR r0, =0x999 a:將r1寄存器的值加上6,然后把以這個值為地址的內存單元里的值取半字(低16位)賦給r0 b:將立即數0x999賦給r0,注意這是一個偽指令 8.SWP 指令的優勢是什么?用來實現什么功能?
功能:在寄存器和存儲器之間,由一次存儲器讀和一次存儲器寫組成的原子操作。完成一個字節或字的交換??梢杂脕韺崿F信號量 9.專業名詞解釋
RISC
(Reduce Instruct Set Computer);
IP
(Intellectual Property);
ISR
(Interrupt Servers Routine)JTAG
(Join Test Active Group)
IDE
(Integrate Development Environment)RTOS(實時操作系統); CISC(復雜指令集); Kernel(內核)
Scheduler(調度)non-preemptive(非搶先式)
初始化代碼直接對ARM微處理器內核及硬件控制器編程,多采用匯編語言編程,初始化代碼一般應包含如下典型任務:(1)定義程序入口點(2)設置異常向量;(3)初始化存儲器系統;(4)初始化堆棧指針寄存器;(5)初始化臨界I/O設備;(6)初始化C代碼的運行環境;(7)改變處理器的運行模式和狀態;
/ 17
(8)使能中斷;(9)進入C代碼運行
選擇題
1.ARM 屬于 RISC 架構
2.ARM 指令集是 32位寬,Thumb 指令集是16位寬的。3.ARM 指令集是4字節對齊,Thumb 指令集是2字節對齊的 4.復位后,ARM處理器處于SVC模式,ARM狀態
5.ARM處理器總共37個寄存器,System模式下使用17個寄存器,SVC模式下使用18個寄存器。
6.ARM處理器中優先級別最高的異常為RESET,FIQ,IRQ異??梢杂脕硐鄳袛?7.ARM數據處理指令中有效的立即數是(ACEGH)
[A] 0X00AB0000
[B] 0X0000FFFF [C ] 0XF000000F [D ] 0X08000012 [E] 0X00001F80 [F] 0XFFFFFFFF [G] 0 [H] 0XFF000000 8.ATPCS規定中,推薦子函數參數最大為4 個 9.ATPCS規定中,棧是滿減
10.在ARM匯編編程,寄存器有多個別名,通常PC是指R15,LR 是指R14,SP是指R13 11.CPSR寄存器中反映處理器狀態的位是T位 12.下面屬于ARM 子程序調用指令的是BL 13.ARM7屬于馮.諾依曼結構,ARM9屬于哈佛結構。14.ARM7是3級流水線,ARM9是5級流水線。
15.ARM中可以訪問狀態寄存器的指令是MRS,能夠訪問內存的指令是LDR 16.下面哪種操作系統最方便移植到嵌入式設備中(D)
[A] DOS [B] UNIX [C ] WINDOWS XP [D ]LINUX 17.以下哪項關于SRAM和DRAM的區別是不對(A)
(A)SRAM比DRAM慢
(B)SRAM比DRAM耗電多(C)DRAM存儲密度比SRAM高得多
(D)DRM需要周期性刷新
18.下面哪種嵌入式操作系統很少用于手機終端設備上(CE)
(A)Symbian
(B)WinCE
(C)uc/os 19.S3C2410采用的是ARM920T核心
20.下面哪點不是嵌入式操作系統的特點(C)A.內核精簡 B.專用性強
C.功能強大
D.高實時性
(D)linux(E)VxWorks 21.NAND FLASH和NOR FLASH的敘述正確的是(D)A.NOR的讀速度比NAND稍慢一些
B.NAND的寫入速度比NOR慢很多
/ 17
C.NAND的擦除速度遠比NOR的慢 22.MMU的作用有(AB)
D.大多數寫入操作需要先進行擦除操作
[A] 內存保護
[B] 地址轉換 [C ] 加快存取速度 [D ] 安全保密 [E] 內存分配 23.以下屬于DMA特點的有(BC)
[A] 占用CPU
[B] 占用總線 [C ] 不占用CPU [D ] 不占用總線 24.以下哪種方式不屬于文件系統的格式(B)(A)FAT
1.在ARM體系結構中,要從主動用戶模式(User)切換到超級用戶模式(Supervisor),采用何種方法?先修改程序狀態備份寄存器(SPSR)到對應的模式,再更新CPU狀態
2.嵌入式系統加電或復位后,所有的 CPU 通常都從某個由 CPU 制造商預先安排的地址上取指令。例如:對于S3C2410來說,Boot Loader會映射到0x00000000地址處。
3.CPSR中的低8位稱為控制位,下列不屬于控制位的是【A】。A、N
B、I
C、F
D、T 4.ARM中可以訪問狀態寄存器的指令是MRS,能夠訪問內存的指令是LDR。5.下列條件碼中表示不相等的是NE。EQ 相等 NE 不相等
CS/HS 無符號數大于或等于 CC/LO 無符號數小于 MI 負數 PL 正數或零 VS 溢出 VC 沒有溢出 HI 無符號數大于
LS 無符號數小于或等于 GE 有符號數大于或等于
LT 有符號數小于
GT 有符號數大于
LE 有符號數小于或等于
AL 任何 無條件執行(指令默認條件)NV 任何 從不執行(不要使用)6.CPSR中的低8位稱為控制位,其中I位等于1表示禁止IRQ中斷。
7.ARM微處理器支持7種工作模式。其中,除用戶模式之外的其余6種稱為特權模式,在這6種之中,除系統模式之外的其余5種又稱為異常模式。8.下列ARM指令中,可用于滿遞增堆棧操作的是STMIB。9.ARM偽指令中,可用于大范圍地址讀取的是LDR。10.同CISC相比,下面哪一項不屬于RISC處理器的特征?!綝】
A、采用固定長度的指令格式,指令規整、簡單、基本尋址方式有2~3種。B、減少指令數和尋址方式,使控制部件簡化,加快執行速度。
C、數據處理指令只對寄存器進行操作,只有加載/存儲指令可以訪問存儲器,以提高指令的執行效率,同時簡化處理器的設計。
/ 17
(B)DOS
(C)NTFS
(D)Ext D、RISC處理器都采用哈佛結構
11.以下敘述中,不符合RISC指令系統特點的是【B】。A、指令長度固定,指令種類少
B、尋址方式種類豐富,指令功能盡量增強 C、設置大量通用寄存器,訪問存儲器指令簡單 D、選取使用頻率較高的一些簡單指令
12.下面關于ARM處理器的體系結構描述哪一個是錯誤的?!綛】 A、三地址指令格式
B、所有的指令都是多周期執行 C、指令長度固定 D、Load-Store結構
1.相對于ARM指令集,Thumb指令集的特點是【D】。A、指令執行速度快
B、16位指令集,可以得到密度更高的代碼,對于需要嚴格控制成本的設計非常有意義 C、Thumb模式有自己獨立的寄存器
D、16位指令集,代碼密度高,加密性能好
2.在ARM寄存器結構中,棧指針使用R13寄存器。
3.32位體系結構的ARM處理器有7種不同的處理器工作模式,和6個主要用來標識CPU工作狀態和程序運行狀態的狀態寄存器。
4.在下列ARM處理器的各種模式中,只有用戶模式不可以自由地改變處理器的工作模式。5.在ARM的匯編程序中,ADR、ADRL、LDR、NOP等被稱為偽指令。
填空題
1.常見的ARM處理器內核有ARM7、ARM9和【ARM11】等。2.按總線所傳送的信息類型,總線分為【地址總線】、【數據總線】和【控制總線】。3.GPIO的中文全稱是【通用輸入/輸出口】。
4.ARM處理器有兩種狀態,分別是【ARM】和【Thumb】。5.計算機結構分為【馮·諾依曼】結構和【哈佛】結構。
6.ARM處理器支持的數據類型中,字節為【8】位、半字為【16】位、字為【32】位。7.ARM體系結構版本中V【4】版架構是目前應用最廣的ARM體系架構,ARM7、【ARM9】都采用該架構。
8.常用的嵌入式操作系統有【嵌入式Linux】、【VxWords】等。9.ARM嵌入式系統主要由【嵌入式硬件】、【嵌入式軟件】和【開發工具】構成。10.S3C2410 支持兩種引導方式,分別是【Nor-Flash】啟動方式、【Nand-Flash】啟動方式。11.一個嵌入式系統由3部分組成,分別是【嵌入式硬件】、【嵌入式軟件】和【開發工具】。
判斷題:
1、所有的電子設備都屬于嵌入式設備。(F)
2、馮諾依曼體系將被哈佛總線所取代。(F)
3、嵌入式開發不需要硬件支持。(F)
/ 17
4、移植操作系統時需要修改操作系統中與處理器直接相關的程序。F
5、USB2.0的最大通信速率為12MB。(F)
6、嵌入式開發需要專門的軟件和硬件設備。(T)
編程題
;例三:ADR偽指令 AREA adrlabel1, CODE, READONLY
ENTRY
start
BL func
B.LTORG func
ADR R0, start
ADR R1, DataArea
;ADR R2, DataArea+4300
ADRL R3, DataArea+4300
MOV PC, LR DataArea
SPACE 8000
END
;例五:利用跳轉表實現程序跳轉
AREA Jump, CODE, READONLY num EQU 2
ENTRY start
MOV R0, #0
MOV R1, #3
MOV R2, #2
BL arithfunc
B.arithfunc
CMP R0, #num
MOVHS PC, LR
ADR R3, JumpTable
LDR PC, [R3,R0,LSL #2] JumpTable
DCD DoAdd
DCD DoSub DoAdd
ADD R0, R1, R2
MOV PC, LR
/ 17
DoSub
SUB R0, R1, R2
MOV PC, LR
END
3、存儲器從0x400000開始的100個單元中存放著ASCII碼,編寫程序,將其所有的小寫字母轉換成大寫字母,對其它的ASCII碼不做變換。
MOV R0,#0x400000
MOV R1,#0 LP
LDRB R2,[R0,R1]
CMP R2,#0x61
BLO NEXT
CMP R2,#0x7B;0x61---0x7A為小寫字母的ASC
SUBLO R2,R2,#0x20
STRBLO R2,[R0,R1] NEXT
ADD R1,R1,#1
CMP R1,#100
BNE LP
8、編寫一簡單ARM匯編程序段,實現1+2+…+100的運算。
MOV R2,#100
MOV R1,#0 LOOP
ADD R1,R1,R2 ;R1中為累加和
SUBS R2,R2,#1 ;R2控制循環
BNE LOOP
4、編寫程序,比較存儲器中0x400000和0x400004兩無符號字數據的大小,并且將比較結果存于0x400008的字中,若兩數相等其結果記為0,若前者大于后者其結果記為1,若前者小于后者其結果記為-1。
MOV R0,#0x400000
LDR R1,[R0] ;取第1個數
LDR R2,[R0,#4] ;取第2個數
CMP R1,R2 ;兩個數相比較
MOVHI R1,#1 ;R1大
MOVLO R1,#-1 ;R1小
MOVEQ R1,#0 ;兩個數相等
STR R1,[R0,#8]
7、編寫一程序,存儲器中從0x400200開始有一個64位數。(1)將取反,再存回原處;(2)求其補碼,存放到0x400208處。
LDR R0,=0x400200
LDR R2,=0xFFFFFFFF
LDR R1,[R0] ;取低32位數
EOR R1,R1,R2 ;取反
/ 17
STR R1,[R0] ;存低32位反碼
ADDS R1,R1,#1 ;又加1為求補
STR R1,[R0,#8] ;存低32位補碼
LDR R1,[R0,#4] ;取高32位數
EOR R1,R1,R2 ;取反
STR R1,[R0,#4] ;存高32位反碼
ADC R1,R1,#0 ;高32位求補
STR R1,[R0,#12] ;存高32位補碼
例七:匯編語言與C/C++的混和編程 項目名:Example7.mcp 文件名:Example7_asm.s 文件名:Example7_c.c ——————————————————————————————————————— AREA Asm_C, CODE, READONLY
ENTRY
LDR SP,=0x4000
IMPORT __main
BL __main
B.END ——————————————————————————————————————— #include
1、寫一條ARM 指令,分別完成下列操 作: a)r0 = 16
MOV R0,#16 b)r0 = r1 / 16(帶符號的數字)
MOV R0,R1,ASR,#4 c)r1 = r2 * 3
MUL R1,R2,#3 d)r0 =-r0
RSB R0,R0,#0
2、寫幾條ARM 指令,使能IRQ中斷 MRS R0,CPSR BIC R0,R0,#0x80 MSR SPSR,R0
3、編寫程序,將存儲器從0x400000開始的200個字節的數據,傳送到0x400800開始的區域。
AREA copy,CODE,READONLY
ENTRY START
MOV R0, #0x400000
/ 17
LDR R1, =0x400800
MOV R7,#200 LOOP
LDRB R2, [R0], #1
STRB R2, [R1], #1
SUBS R7, R7, #1
BNE LOOP
STOP
B STOP
END
4、編寫一程序,查找存儲器從0x400000開始的100個字中為0的數目,將其結果存到0x400190中。
AREA zero,CODE,READONLY
ENTRY START
MOV R0, #0x400000
MOV R1, #0
MOV R7, #100 LOOP
LDR R2, [R0], #4
CMP R2, #0
BNE NEXT
ADD R1, R1, #1 NEXT
SUBS R7, R7, #1
BNE LOOP
STR R1, [R0]
END
5、用匯編語言編寫程序讀取存儲器0x40003100地址上的數據,將數據加1,若結果小于10則使用STR指令把結果寫回原地址,若結果大于等于10,則把0寫回原地址。答:
COUNT EQU 0x40003100
;定義一個變量,地址為0x40003100
AREA Example2,CODE,READONLY;聲明代碼段Example2
ENTRY
;標識程序入口
CODE32
;聲明32位ARM指令 START LDR R1,=COUNT
;R1 <= COUNT
MOV R0,#0
;R0 <= 0
STR R0,[R1]
;[R1] <= R0,即設置COUNT為0 LOOP LDR R1,=COUNT
LDR R0,[R1]
;R0 <= [R1]
ADD R0,R0,#1
;R0 <= R0 + 1
CMP R0,#10
;R0與10比較,影響條件碼標志
/ 17
MOVHS R0,#0
;若R0大于等于10,則此指令執行,R0 <= 0
STR R0,[R1]
;[R1] <= R0,即保存COUNT
B LOOP
END
7、如何實現128位數的減法,請舉例說明。AREA
EXAMPLE2,CODE,READONLY
ENTRY START
SUBS
R5,R5,R9
SBCS
R4,R4,R8
SBCS
R3,R3,R7
SBCS
R2,R2,R6 STOP
B
STOP
END
8、將存儲器中起始地址地址0X10處的4個字數據移動到地址0X20處。
AREA
EXAMPLE2,CODE,READONLY
ENTRY LDR
R0,=0X10
;把地址0X10賦給R0 LDR
R5,=0X20
;把地址0X20賦給R5 START LDMIA
R0,{R1-R4}
;把R0為首地址的內存單元中的值依次賦給,;R1到R4,每次賦完一次值,R0自動加1
STMIA
R5,{R1-R4}
;把R1到R4的值依次賦給以R5為首地址的內存單元中,R5每次自動加1 STOP
B
STOP
;死循環 END
9參考CPSR寄存器中各標志位的含義,使處理器處于系統模式。
AREA
EXAMPLE2,CODE,READONLY
ENTRY START MOV
R0,#0X1F
;給R0賦值,2進制為11111 MSR
CPSR_c,R0
;把CPSR的條件位置1 STOP B
STOP
;死循環
END
10用跳轉指令實現兩段程序間的來回切換。
/ 17
AREA
EXAMPLE5
,CODE,READONLY ENTRY BL X
;跳到a對R0,R1,賦值 START
CMP
R0,R1
;比較R0,R1的值
BNE Y
;不等跳轉到b
BEQ STOP
;相等時跳轉到STOP X MOV
R0,#3
;對R0,R1賦值
MOV
R1,#2 MOV
R15,R14
;返回 Y ADD
R1,R1,#1
;R1自加1 B
START
;跳轉到START STOP
B
STOP
;死循環
END
11字符串拷貝子程序,將r1指向的字符串拷貝到r0指向的地方,字符串以0作結束標志
AREA
SCopy, CODE, READONLY
EXPORT strcopy strcopy
;r0 points to destination string
;r1 points to source string
LDRB
r2, [r1],#1
;load byte and update address
STRB
r2, [r0],#1
;store byte and update address;
CMP
r2, #0
;check for zero terminator
BNE
strcopy
;keep going if not
MOV
pc,lr
;Return
END 12求兩個數的最大值,并將最大值放R0寄存器
AREA MAX,CODE,READONLY ENTRY START MOV R1, #0x16 M0V
R2, #0x17 CMP R1, R2
MOVMI R0, R2 MOVPL R0, R1 STOP
B
STOP
END
13循環實現數的遞減,即每次減1。最終結果為0時退出循環。
/ 17
AREA MAX,CODE,READONLY ENTRY START
MOV R0, #10 LOOP SUBS R0, R0, #1 BNE LOOP STOP
B
STOP
END
14改下列C程序段代碼為ARM匯編程序段代碼。void gcd(int a, int b){ while(a!=b)
if(a>b)
a=a-b;
else
b=b-a;}
AREA MAX,CODE,READONLY ENTRY gcd CMP R0, R1 BEQ STOP BLT Less SUB R0, R0, R1 B STOP Less SUB R1, R1, R0 STOP
B
STOP
End
15分別編寫一個函數和一個宏,實現字符串的復制。
MACRO
COPY
$P1,$P2
;定義一個宏
$P1 DCB
“HELLO”
;分配一個字節的空間,并初始化為一個字符串 $P2 DCB
“WORLD!”
;同上
LDR
R0,=$P1
;把P1的首地址加載到R0
LDR
R6,=$P2
;把P2的首地址加載到R1
LDRIA
R0,[R1-R5]
;
STRIA
R6,[R1-R5]
;
MEND
AREA
COPY,CODE,READONLY
/ 17
ENTRY START
COPY STR1,STR2
;調用宏
B
START
;死循環
END
/ 17
第二篇:實習總結-嵌入式ARM
實訓總結
班級 卓越1301姓名***
通過這段時間的學習使我學到了很多知識,并且了解到ARM的應用以及對開發板的應用,為以后的學習奠定了一定的基礎。
嵌入式系統一般定義為以應用為中心、以計算機技術為基礎,軟硬件可裁剪,應用系統對功能、可靠性、成本、體積、功耗和應用環境有特殊要求的專用計算機系統。是將應用程序、操作系統和計算機硬件集成在一起的系統這是從技術角度。從系統角度上是設計完成復雜功能的硬件和軟件,并使其緊密耦合在一起的計算機系統。
廣義上講,凡是帶有微處理器的專用軟硬件系統都可稱為嵌入式系統。如各類單片機和DSP系統。這些系統在完成較為單一的專業功能時具有簡潔高效的特點。但由于他們沒有操作系統,管理系統硬件核軟件的能力有限,在實現復雜多任務功能時,往往困難重重,甚至無法實現。從狹義上講,我們更加強調那些使用嵌入式微處理器構成獨立系統,具有自己操作系統,具有特定功能,用于特定場合的嵌入式系統。
嵌入式的應用也比較廣泛涉及軍事國防、工業控制、消費電子和網絡。在家用方面更是數字電視、信息家電、智能玩具、手持通訊、存儲設備的核心。
在ARM指令集中了解到ARM的尋址方式以及它的的特性,具有高效、快速的特點,還有Thumb指令集具有靈活、小巧的特點。
在這次實訓中做了兩個項目,一個是LED燈,實現LED燈的點亮是比較簡單的,通過查找手冊可以很快的了解到要使用的寄存器和方法,另一個項目是DS18B20這個比較復雜,除了要掌握對寄存器的使用,還要對了解對串口的初始化,讀寫字節等等。
感謝這次實訓,通過這次的實訓項目,使我大體了解制作項目的步驟,了解了嵌入式技術的掌握是需要一個過程的。實事求是的說,嵌入式技術的全面掌握是有相當難度的,通過積累和動手總會有收獲的,從實驗中也明白了一個大的項目并不是一個人可以完成的,團隊協作很重要。
姓名:***
年級:卓越1301
2014-7-5
第三篇:ARM實訓總結
《嵌入式系統工程訓練》實驗報告
一、實驗目的1、鞏固嵌入式系統硬件結構的基本應用
2、鞏固嵌入式系統程序編制的基本方法
3、了解嵌入式系統的工程設計要點
4、了解嵌入式系統的開發平臺要點
5、學習μC/OS-II在ARM7上的移植
6、學習μC/OS-II嵌入式實時操作的基本原理與應用
7、運用所學內容完成一個基于操作系統的小課題
二、實訓內容
1、熟練掌握LPC2210開發板的使用
2、基本了解嵌入式系統的工程設計一般方法
3、學習μC/OS-II在ARM7上的移植
4、學習μC/OS-II嵌入式實時操作基本概念、基本運用
5、結合課程內容與μC/OS-II運用完成一個小課題
三、實訓條件(環境)
1、LPC2210開發板
2、PC機
3、ADS1.2集成開發環境
4、μC/OS-II實時操作系統
四、學習內容
1、LPC2210硬件內容
2、μC/OS-II嵌入式實時操作內容
3、嵌入式系統的工程設計內容
五、小課題:μC/OS-II在IIC上的應用
六、實訓總結
這兩周我們在原本ARM的學習基礎上以μC/OS-II嵌入式實時操作系統展開了實訓。主要內容是如何將嵌入式實時操作系統μC/OS-II移植到ARM7體系結構上,并將一直代碼應用到具體的基于ARM7核的微控制器上。
對于這些天的所學到的內容,我稍稍的寫了點心得,都是一些很基本的東西。首先把實驗書上系統的例程序先跑了一遍,稍微了解一下板子的功能,熟悉下實驗流程。先移例子,按照要求把source文件夾放在了softwareucos-II文件夾下,在這個文件夾下,存放得是系統移植的例子,其中有三個文件夾arm_pc,source,lpc2100是和系統移植相關的。當一個任務一旦建立,系統為這個任務配備了任務控制塊且在任務就緒表中進行了就緒登記,這個任務就進入就緒態準備運行。一個任務可以通過調用OSTaskDel()返回到睡眠態,或通過調用該函數讓另一個任務進入睡眠態,進入睡眠態的任務它的的任務控制塊被剝奪,調用OSStart()可以啟動多任務。OSStrart()函數運行進入就緒態的優先級最高的任務。
下載到目標板上的固態存儲器指定地址當中,比如flash,EEPROM, ROM等等在程序執行之前,根據某些
描述文件,將需要讀寫數據的部分讀出放入動態存儲器比如RAM當中,然后程序從ROM開始執行或者有時為了提高程序的運行速度,也可以將所有的程序(有一些root的部分除外,以后會提及)通過一個描述文件放入指定的RAM當中,然后程序從RAM開始執行,但是這樣會耗費大量的動態存儲器,所以大部分程序會取折中的方法,將需要快速運行的部分和要讀寫的部分放入RAM中(一般讀固態存儲器的過程和動態存儲器的過程是一樣的,但是寫就不同了,所以讀寫的部分一定要放到RAM中),而只讀的部分和對速度要求不是那么高的部分放入固態存儲器同時ARM結構的異常向量表規定放在地址為0x00000000開始的地址空間上,而一般的CPU為了提高異常相應速度,會將這個向量段remap到其他的RAM當中,所以在描述文件當中必須精確指定異常向量跳轉程序的地址到remap的地方在application程序執行前,還需要由一些文件描述application程序執行的環境比如系統工作時鐘,總線頻率現在一般嵌入式編程語言為C,C 等 主程序中首先進行了操作系統初始化,然后創建了一個任務,最后啟動了多任務運行環境。太簡單了。再往下看創建的任務子函數TaskStart(),在這個函數中又創建了。了解到在啟動多任務環境前需要至少創建一個任務,我想TaskStart()任務就應該是這個原因放在了 OSStart()之前。
中斷級任務調度,和任務級調度。我的理解是當發生中斷時,操作系統內核判斷此時是否有更高優先級的就緒任務,有的話進行任務調度。任務級調度就是當前任務在執行過程中主動執行任務調度,將權力交給內核。
但是這個中斷是怎么產生的呢,我又看到了時鐘節拍的概念,時鐘節拍(clock tick):P67頁中說道時鐘節拍是特定的周期性中斷。有兩種作用:這種周期性的定時中斷一來為內核提供一個時間標準,例如某個任務要延時多長時間,可以通過紀錄這種中斷來完成(中斷的時間是已知的,但應當是可更改的),二 為任務切換提供了時間片,任務之間的調度是按時完成的,就是在一個時鐘節拍后來進行P68-P69中的圖形說明了這一點。以前不明白每個任務是一個死循環,在每個程序中都有一個OSTimeDly(),這個函數是將任務掛起,將控制權交給內核,內核進行任務調度,從就續的任務中找到優先級最高的任務執行,這是一種調度。那么當一個低優先級任務在執行時,如果在等待一個信號,可能要等很長時間,那么內核不能一直在這里等待這個信號的到來,別的高優先級任務可能已經就緒,那么就需要進行任務調度,何時調度呢?這時就應該是時鐘節拍所起到的作用,每一個時鐘節拍到達后進入中斷處理函數,進行任務調度。
所以總的理解應當是內核在每個時鐘節拍到來時進行一次任務調度,這是大前提,使每個任務都有相同的權利執行相同的時間。有時個別任務在一個時鐘節拍內早已完成,這時需要向內核提前交權,讓內核進行任務調度。
第四篇:ARM學習心得
ARM linux學習心得(zt)
2008-08-13 13:55
由于很多人總問這個問題,所以這里做一個總結文檔供大家參考。
這里必須先說明,以下的步驟都是針對Linux系統的,并不面向WinCE。也許你會注意到,現在做嵌入式的人中,做linux研究的人遠比做WinCE的人多,很多產家提供的資料也是以linux為主。我一直很難理解,其實WinCE的界面比linux的界面好看多了,使用起來也很方便,更為重要的是,WinCE的開發和Windows下的開發基本一樣,學起來簡單得多,但是學linux或者使用linux做嵌入式的人就是遠比WinCE多。在和很多工作的人交流時我了解到,他們公司從沒考慮使用WinCE,因為成本高,都是使用linux進行開發。我讀研究生的的實驗室中也沒有使用WinCE的,大都研究linux,也有少部分項目使用vxwork,但是就沒有聽說過使用WinCE的,原因就是開源!當然現在WinCE6.0聽說也開源,不過在成本和資源上linux已經有了無人能擋的優勢。與此相對應的是,越來越多的電子廠商已經開始使用linux開發產品。舉個例子,Google近期開發的智能手機操作系統Android其實就是使用linux-2.6.23內核進行改進得到的。
第一,學習基本的裸機編程。
對于學硬件的人而言,必須先對硬件的基本使用方法有感性的認識,更必須深刻認識該硬件的控制方式,如果一開始就學linux系統、學移植那么只會馬上就陷入一個很深的漩渦。我在剛剛開始學ARM的時候是選擇ARM7(主意是當時ARM9還很貴),學ARM7的時候還是保持著學51單片機的思維,使用ADS去編程,第一個實驗就是控制led。學過一段時間ARM的人都會笑這樣很笨,實際上也不是,我倒是覺得有這個過程會好很多,因為無論做多復雜的系統最終都會落實到這些最底層的硬件控制,因此對這些硬件的控制有了感性的認識就好很多了
學習裸機的編程的同時要好好理解這個硬件的構架、控制原理,這些我稱他為理解硬件。所謂的理解硬件就是說,理解這個硬件是怎么組織這么多資源的,這些資源又是怎么由cpu、由編程進行控制的。比如說,s3c2410中有AD轉換器,有GPIO(通用IO口),還有nandflash控制器,這些東西都有一些寄存器來控制,這些寄存器都有一個地址,那么這些地址是什么意思?又怎么通過寄存器來控制這些外圍設備的運轉?還有,norflash內部的每一個單元在這個芯片的內存中都有一個相應的地址單元,那么這些地址與剛剛說的寄存器地址又有什么關系?他們是一樣的嗎?而與norflash相對應的nandflash內部的儲存單元并不是線性排放的,那么s3c2410怎么將nandflash的地址映射在內存空間上進行使用?或者簡單地說應該怎么用nandflash?再有,使用ADS進對ARM9行編程時都需要使用到一個初始化的匯編文件,這個文件究竟有什么用?他里面的代碼是什么意思?不要這個可以嗎?
諸如此類都是對硬件的理解,理解了這些東西就對硬件有很深的理解了,這對以后更深一步的學習將有很大的幫助,如果跳過這一步,我相信越往后學越會
覺得迷茫,越覺得這寫東西深不可測。因為,你的根基沒打好。
不過先聲明一下,本人并沒有使用ADS對ARM9進行編程,我是學完ARM7后直接就使用ARM9學linux系統的,因此涉及使用ADS對ARM9進行編程的問題我很難回答^_^,自己去研究研究吧。
對于這部分不久將提供一份教程,這個教程中的例程并不是我為我們所代理的板子寫的,是我在我們學院實驗室拿的,英培特為他們自己的實驗箱寫的,不過很有借鑒意義,可以作為一份有價值的參考。
第二,使用linux系統進行一些基本的實驗。
在買一套板子的時候一般會提供一些linux的試驗例程,好好做一段時間這個吧,這個過程也是很有意義的,也是為進一步的學習積累感性認識,你能想象一個從沒有使用過linux系統的人能學好linux的編程嗎?好好按照手冊上的例程做一做里面的實驗,雖然有點娃娃學走路,有點弱智,但是我想很多高手都會經歷這個過程。
在這方面我們深藍科技目前沒有計劃提供相應的例程,主要是開發板的提供商會提供很豐富的例程,我們不做重復工作,只提供他們沒有的、最有價值的東西給大家。
第三,研究完整的linux系統的的運行過程。
所謂完整的linux系統包括哪些部分呢?
三部分:bootloader、linux kernel(linux內核)、rootfile(根文件系統)。那么這3部分是怎么相互協作來構成這個系統的呢?各自有什么用呢?三者有什么聯系?怎么聯系?系統的執行流程又是怎么樣的呢?搞清楚這個問題你對整個系統的運行就很清楚了,對于下一步制作這個linux系統就打下了另一個重要的根基。介紹這方面的資料網上可以挖掘到幾噸,自己好好研究吧。第四,開始做系統移植。
上面說到完整的linux有3部分,而且你也知道了他們之間的關系和作用,那么現在你要做的便是自己動手學會制作這些東西。
當然我不可能叫你編寫這些代碼,這不實現。事實上這個3者都能在網下載到相應的源代碼,但是這個源代碼不可能下載編譯后就能在你的系統上運行,需要很多的修改,直到他能運行在你的板子上,這個修改的過程就叫移植。在進行移植的過程中你要學的東西很多,要懂的相關知識也很多,等你完成了這個過程你會發現你已經算是一個初出茅廬的高手了。
在這個過程中如果你很有研究精神的話你必然會想到看源代碼。很多書介紹你
怎么閱讀linux源代碼,我不提倡無目的地去看linux源代碼,用許三多的話說,這沒有意義。等你在做移植的時候你覺得你必須去看源代碼時再去找基本好書看看,這里我推薦一本好書倪繼利的《linux內核的分析與編程》,這是一本針對linux-2.6.11內核的書,說得很深,建議先提高自己的C語言編程水平再去看。
至于每個部分的移植網上也可以找到好多噸的資料,自己研究研究吧,不過要提醒的是,很多介紹自己經驗的東西都或多或少有所保留,你按照他說的去做總有一些問題,但是他不會告訴你怎么解決,這時就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保證能解決你的問題,因為我未必遇到過你的問題,不過我相信能給你一點建議,也許有助你解決問題。
這一步的最終目的是,從源代碼的官方主頁上(都是外國的,悲哀)下載標準的源代碼包,然后進行修改,最終運行在板子上。
盜用阿基米德的一句話:“給我一根網線,我能將linux搞定”。
第五,研究linux驅動程序的編寫。
移植系統并不是最終的目的,最終的目的是開發產品,做項目,這些都要進行驅動程序的開發。
Linux的驅動程序可以說是五花八門,linux2.4和linux2.6的編寫有相當大的區別,就是同為linux2.6但是不同版本間的驅動程序也有區別,因此編寫linux的驅動程序變都不是那么容易的事情,對于最新版本的驅動程序的編寫甚至還沒有足夠的參考資料。那么我的建議就是使用、移植一個不算很新的版本內核,這樣到時學驅動的編程就有足夠的資料了。
這部分的推薦書籍可以參考另一篇文章《推薦幾本學習嵌入式linux的書籍》。第六,研究應用程序的編寫。
做作品做項目除了編寫驅動程序,最后還要編寫應用程序?,F在的趨勢是圖形應用程序的開發,而圖形應用程序中用得最多的還是qt/e函數庫。我一直就使用這個函數庫來開發自己的應用程序,不過我希望你能使用國產的MiniGUI函數庫。盜用周杰倫的廣告詞就是“支持國產,支持MiniGUI”。MiniGUI的編程比較相似Windows下的VC編程,比較容易上手,效果應該說是相當不錯的,我曾使用過來開發ARM7的程序。不過MiniGUI最大的不好就是沒有像qtopia這樣的圖形操作平臺,這大大限制了他的推廣,我曾經幻想過與北京飛漫公司(就是MiniGUI的版權擁有者)合作使用MiniGUI函數庫開發像qtopia這樣的圖形操作平臺,不過由于水平有限這只能是幻想了,呵呵。
完成這一步你基本就學完了嵌入式linux的全部內容了。
還有一個小小的經驗想和大家分享。我在學習嵌入式linux的過程中很少問人,客觀原因是身邊的老師、同學師兄都沒有這方面的高手,主觀原因是我不喜歡問人,喜歡自己研究解決問題。這樣做有個好處,就是可以提高自己解決問題的能力,因為做這些東西總有很多問題你難以理解,別人也沒有這方面的經驗,也不是所有問題都有人給你答案,這時必須要自己解決問題,這樣,個人的解決問題能力就顯得非常關鍵了。因此我的建議就是一般的問題到網上搜索一下,確實找不到答案了就問問高手,還是不行了就自己去研究,不要一味去等別人幫你解決問題。
記住,問題是學習的最好機會。
第五篇:arm心得.
心得體會(許晶)
本次實習時間是一周,我們組所選的題目是直流電動機轉速控制設計,其要求有:硬件部分要求在LPC2100系列ARM的最小系統的基礎上,設計通過按鍵控制直流電動機速度的驅動電路,要求通過LPC2100內置的PWM發生器控制直流電動機;并將電動機速度通過串口送至PC機。軟件部分要求設計以上功能的脫機運行程序,并在試驗室調試通過。我負責的是硬件部分。首先我將系統分為兩部分。一是電動機控制驅動電路;二是ARM最小系統。在電動機驅動中,直流電機控制使用了H橋驅動電路,控制口線為P0.21、P0.22。在ARM最小系統中,分為5部分:電源電路、復位電路、JTAG接口電路、RS232串口電路、時鐘電路。
在制作原理圖中,我查閱了實驗指導書和課本。我所選用的是2114板子。因為LPC2114是基于一個支持實時仿真和跟蹤的16/32位ARM7TDMI-STM CPU的微控制器,并帶有128/256 k字節(kB)嵌入的高速Flash存儲器。128位寬度的存儲器接口和獨特的加速結構使32位代碼能夠在最大時鐘速率下運行。對代碼規模有嚴格控制的應用可使用16位Thumb模式將代碼規模降低超過30%,而性能的損失卻很小。
在這個過程中,我注意到了許多問題。通過最小系統的制圖,我對一些問題逐漸了解,不像剛開始學習一樣,感覺什么也不懂,硬裝知識。我畫了5部分,這幾個部分讓我對書上的內容更加深了學習。如:時鐘電路中,我就把時鐘系統和晶體振蕩兩節課程,重新學習。
而在軟件設計中,在我的搭檔編程完之后,我也對程序進行了研究。在主程序中,我們用的是i、j表示速度與方向,正轉為“+”、反轉為“—”;最小速度為1,最大速度為4。先讓電機正向慢慢的加速,加到正傳的最大速后,在按下就變成反轉,然后在依次加速,往返循環,直至沒有按鍵按下。所運用的是,調節PWM的占空比就能達到電機的速度調節。
我們組在硬件中遇到的問題并不多,主要是在畫各部分原理圖時找器件很不熟練,不能很快的找到。這說明我不經常用軟件。其實這個軟件制圖很方便,各種器件幾乎都能找到,找不到時也可以在上面畫圖。
軟件中,程序在編譯正確后,下載方面出現了許多問題,如連接不上;不能生成hex文件等。其實這些問題,都是因為我們對軟件不熟悉所造成的。在我們多次調試、鏈接之后,終于完成。
經過一周實習,是我對ARM系統有了更深刻的認識。因為前期大家都找工作的原因,我并沒有特別認真的學習,而這次的實習,可以讓我重新再次拿起課本,認真學習。并且使我感觸最深的是,由于嵌入系統的廣泛應用,我應該更好的去學習它、掌握它。像掌握辦公自動化一樣,成為必不可少的技術。