1. 程式人生 > 其它 >學校嵌入式期末考試複習

學校嵌入式期末考試複習

目錄

目錄分值分佈複習題選擇題填空題判斷題PPTCISC和RISC比較ARM發展歷史位元組大小端little/big endian(必考)ARM指令處理器工作模式暫存器數量是否越多越好?(必考)當前程式狀態暫存器(CPSR)流水線架構指令簡介定址方式立即數定址暫存器定址暫存器移位定址暫存器間接定址基址定址相對定址普通Load/Store指令的定址批量Load/Store指令的定址堆疊操作定址基本指令加法指令與減法指令乘法指令除法指令邏輯操作指令移位操作指令比較操作指令位元組交換指令測試指令分支指令AT&T彙編C和彙編混合程式設計GPIOGPIO特性GPIO應用PWM的佔空比序列和並行通訊(必考)

同步通訊和非同步通訊UARTI2C匯流排I2C匯流排術語I2C----傳輸控制I2C----資料格式ADC基本過程ADC主要效能指標感測器感測器定義感測器分類即熱飲水機

分值分佈

PPT40分

書上作業6-8分

實驗20分-前4個10分,後4個10分

暫存器數量是否越多越好?最少15分

複習題

選擇題

1.下列哪個表述不正確( )。

A.ARM是一個公司的名稱 B.ARM是對一類微處理器的統稱

C.ARM是一種技術的名字 D.ARM是一款晶片的名稱

2.下面哪點不是嵌入式作業系統的特點( )。

A.核心精簡 B.專用性強 C.功能強大 D.高實時性

3.下面哪點不是嵌入式作業系統的特點( )。

A.實時性 B.不可定製 C.微型化 D.可移植性

4.在ARM中,一個字指的是( )位。

A.8 B.16 C.32 D.64

5.以下敘述中,不符合RISC 特徵的是( )。

A.指令長度固定,種類少

B.定址方式豐富,指令功能儘量增強

C. 設定大量通用暫存器,訪問儲存器指令簡單

D.選取使用頻率較高的指令

DCBCB

6.以下敘述中,不符合RISC特徵的是( )。

A.流水線每週期前進一步

B.更多通用暫存器

C. 指令長度不固定,執行需要多個週期

D.獨立的Load和Store指令完成資料在暫存器和外部儲存器之間的傳輸

7.以下敘述中,不符合CISC 特徵的是( )。

A.指令長度不固定,執行需要多個週期

B.可以直接訪問記憶體

C.容易實現指令執行流水線

D.指令數量非常多

8.ARM處理器的工作模式有( )種。

A.5 B.6 C.7 D.8

9.在ARM中,雙字指的是( )位。

A.16 B.32 C.64 D.128

10.在下列ARM處理器模式中,( )模式有自己獨立的R8~R14暫存器。

A.FIQ B.User C.IRQ D.Abort

CCCCA

11.按照ARM過程呼叫標準(ATPCS), 棧指標使用的是( )暫存器。

A.R12 B.R13 C.R14 D.R15

12.按照ARM過程呼叫標準(ATPCS), LR使用的是( )暫存器。

A. R12 B.R13 C.R14 D.R15

13.下列CPSR暫存器標誌位的作用說法錯誤的是( )。

A.N:負數 B.Z:零 C.C:借位 D.V:進位

14.ARM指令集和Thumb指令集分別是( )的。

A.16位,8位 B.32 位,16位 C.32位,32位 D.16位,16位

15.儲存一個32bit數0x12345678到2000H~2003H四個位元組單元中,若以大端模式儲存,則2000H儲存單元的內容為( )。

A.0x12 B.0x34 C.0x56 D.0x78

BCDBA

17.ADD RO,R1,#5屬於( )定址方式。

A.立即定址 B.多暫存器定址 C.暫存器直接定址 D.相對定址

18.ADD RO,R1,R2屬於( )定址方式。

A.立即定址 B.多暫存器定址 C.暫存器直接定址 D.相對定址

20.指令“LDMIA RO!,{R1, R2, R3, R4}”的定址方式為( )。

A.立即定址 B.暫存器間接定址 C.多暫存器定址 D.堆疊定址

ACC

21.對暫存器R1的內容乘以8的正確指令是( )。

A.LSR R1,3

B.LSL R1,#3

C. MOV R1,R1,LSL #3

D. MOV R1,R1,LSR #3

22.下面指令執行後,改變R1暫存器內容的指令是( )。

A.TST R1,#2

B.ORR R1,R1,R1

C.CMP R1,#2

D.EOR R1,R1,R1

23.裝置連線中,符合IIC協議的裝置連線的序列連線線為( )。

A.SCL和RTX

B.RTX和RCX

C.SCL和SDA

D.SDA和RCX

24.在IIC匯流排中,當SCL訊號線為高電平,SDA訊號線上的電平由高電平變為低電平,說明( )。

A. 傳輸出錯 B. Start 訊號 C. Stop訊號 D.傳輸了1bit的0

25.計算機系統中的四級儲存器,其存取速度從高到底的順序是( )。

A. 主存,Cache,暫存器,輔存

B. Cache,暫存器,主存,輔存

C.暫存器,Cache, 主存,輔存

D.暫存器,主存,Cache,輔存

CDCBC

26.ARM處理器的CPSR的主要作用是( )。

A.檢查當前指令執行的正確與否。

B.糾正當前指令執行的結果。

C.產生影響或控制某些後續指令所需的標誌。

D.決定CPU是否繼續工作

27.指令定址方式通常是尋找( )的方式。

A.操作碼 B.運算元 C.I/O 埠 D.記憶體單元

28.計算機系統中,中斷向量通常是指( )。

A.中斷服務程式的入口地址 B.終端的優先順序

C.終端發生的先後順序 D.中斷的型別編號

29.在堆疊操作定址方式中,ARM處理器共支援( )種定址方式。

A.一 B.二 C.三 D.四

30.通常意義上的感測器包含了敏感元件和( )兩個組成部分。

A.放大電路 B.採集電路 C.轉換元件 D.濾波元件

CBADC

31.若將計算機比喻成人的大腦,那麼感測器則可比喻為人的( )。

A.眼睛 B.感覺器官 C.手 D.面板

32.在石油化工領域中,需要對輸油管道實時檢測是否破損或者洩露。可以使用的感測器有( )。

A.溫度感測器 B.光敏電阻 C.聲音感測器 D. 金屬探測儀

33.在監測金庫、倉庫、古建築防止挖牆、打洞、爆破燈破壞行為時,應該使用的感測器有( )。

A.聲音感測器 B.應變式感測器 C.光敏感測器 D.溫度感測器

BCB

填空題

15空考5個

1.嵌入式處理器按照功能可以分為4大型別:分別是MPU、( )、DSP、( )。

2.在ARM的暫存器中,用於儲存程式呼叫返回地址的暫存器是( )。

3.在ARM的暫存器中,用於儲存堆疊地址的是( )。

4.在同樣的傳輸頻率下,序列通訊與並行通訊,更快的是( )。

5.在IIC匯流排中,接收者收到一個完整位元組以後,需要傳送一個( )訊號確認。

1.MCU、SoC 2.R14 3.R13 4.並行 5.ACK

6.在AD轉換中,量化過程有( )和( )兩種方法。

7.在AD轉換中,通常按( )、( )、量化和編碼四個步驟進行。

8.導體或半導體在受到外界力的作用時,產生機械變形,機械變形導致其阻值變化,這種因形變而使阻值發生變化的現象稱為( )。

9.能夠感受規定的被測量並按照一定規律轉換成可用輸出訊號的器件和裝置,通常由( )和( )組成。

6.舍入法、截斷 7.取樣、保持 8.應變效應 9.敏感元件、轉換元件

判斷題

7分

× 1.ARM11,指的是ARM的第11個版本。

2.在ARM彙編和c語言混合程式設計中,C語言可以調用匯編語言編寫的函式。

× 3.在ARM彙編和C語言混合程式設計中,組合語言不可以呼叫C語言函式。

4.根據ATPCS標準,應儘可能使函式的引數控制4個以下。

× 5.根據ATPCS標準,C函式的引數不能超過4個。

× 6.Thumb指令集和ARM指令集可以互相呼叫。

× 7.Thumb-2指令集是Thumb指令集的升級版。

× 8.在IIC 匯流排中,使用片選訊號來確定與哪一個裝置發起通訊。

9.IIC是同步序列資料匯流排。

10.在SPI匯流排中,使用片選訊號來確定與哪一個裝置發起通訊。

× 11.SPI協議屬於非同步通訊。

12.GPIO只能輸出高電平或低電平,不能輸出一個“0.5”的電平。

× 13.GPIO只能輸出高電平或低電平,故只能控制LED燈的亮滅,不能使LED保持在一個“0.5” 亮度的狀態。

14.通過配置GPIO的工作狀態,可以避免GPIO口由於短路被燒壞。

× 15.將數字訊號轉換成模擬訊號的電路是AD轉換器。

實驗5.點燈

for (;;) {
for (i = 0; i < 50; i++) {
delay(20);
// 滅->亮,每次+5
(0,250)
// 亮->滅,每次-5
(250,0)
// 綠燈
(1,259)
}
}

實驗6.按鍵

press release double

需要用兩次按鍵來判斷

// old 上一次按鍵狀態 
// new 這次按鍵狀態
// old == new說明兩次按鍵狀態不變
old != new
if (new == 1) {
release;
} else {
press;
}

// 0.5s內實現double
if(count == 50) {
if(release >= 2) {
double;
}
}

PPT

CISC和RISC比較

考選擇題,例:以下不是CISC/RISC的特點是?

CISCRISC
指令數量 非常多 <100
執行時間 變化
指令長度 變化 1~15B 固定 4B
定址模式 直接訪問記憶體 不能直接訪問記憶體
流水線 非常難 容易

ARM發展歷史

考選擇題

ARM是一家公司,

是一種技術(Advanced RISC Machine),

是一系列處理器的統稱,

是某一款晶片(×)

是一系列晶片

ARM的不同系列

ARM有8個版本

ARM10中的10指的是它的版本

位元組大小端little/big endian(必考)

理解大小端位元組序

三種題型

解答題

位元組序,簡單來說,就是指的超過一個位元組的資料型別在記憶體中儲存的順序. 那麼就很明顯了,像char這樣的型別,肯定不存在位元組序的問題了。

大端位元組序:高位位元組資料存放在低地址處,低位資料存放在高地址處;

小段位元組序:高位位元組資料存放在高地址處,低位資料存放在低地址處;

什麼是高地地址

在記憶體中,棧是向下生長的,以char arr[4]為例,(因為char型別資料只有一個位元組,不存在位元組序的問題)依次輸出每個元素的地址,可以發現,arr[0]的地址最低,arr[3]的地址最高

什麼是高低位

給一個十進位制整數,123456,很明顯左邊的是高位,右邊的是低位。計算機也是這樣認為的。給一個16進位制數,0x12345678,以位元組為單位,從高位到低位依次是 0x12、0x34、0x56、0x78。

8位為一個位元組,16進位制的兩位其實是2個4位組合起來,合起來就是16進位制的兩位表示1個位元組

將高地地址和高低位對應。

一個整形佔4個位元組,給一個整形資料0x12345678,如果是大端儲存,儲存格式如下:

如何判斷當前系統是大端還是小端呢?

一個數0x12345678存放在一個4位元組空間裡

如果我們可以得到 1 在記憶體中儲存的第一個位元組,那麼我們就可以知道當前系統是大端儲存還是小端儲存了。

寫程式碼判斷是大端儲存還是小端儲存。(5分)

#include <stdio.h>
int main()
{
int a = 1;
char pc = *(char*)(&a);
if (pc == 1) {
printf("第一個位元組為1,小端儲存\n");
} else {
printf("第一個位元組為0,大端儲存\n");
}
return 0;
}

選擇題

例:將223344寫入記憶體,告訴你,如果大端,那麼從某個地址讀出來的資料是什麼。

ARM指令

ARM中位元組是什麼?半字是什麼?字是什麼?雙字是什麼?

Byte:8 bits

Halfword: 16 bits (2 byte)

Word :32 bits (4 byte)

Doubleword:64-bits(8byte)(Cortex-A處理器)

兩條指令集分別是多少位?

ARM 指令集(32-bit)

Thumb 指令集(16-bit )

處理器工作模式

給出工作模式名字,選擇工作模式的概念

有7個基本工作模式:

名稱概念
User 非特權模式,大部分任務執行在這種模式
FIQ 當一個高優先順序(fast) 中斷產生時將會進入這種模式
IRQ 當一個低優先順序(normal) 中斷產生時將會進入這種模式
Supervisor 當復位或軟中斷指令執行時將會進入這種模式
Abort 當存取異常時將會進入這種模式
Undef 當執行未定義指令時會進入這種模式
System 使用和User模式相同暫存器集的特權模式

另外Cortex-A特有模式:

名稱概念
Monitor 是為了安全而擴展出的用於執行安全監控程式碼的模式,也是一種特權模式

哪一種模式獨有的暫存器最多?

FIQ模式

這張圖至少考15分

在ARM中,堆疊暫存器要使用的是?

R13

CPSR的作用是?

當前程式狀態暫存器

R0-R12 通用暫存器
R13 堆疊暫存器
R14 連結暫存器
R15 PC程式計數器
CPSR 當前程式狀態暫存器
SPSR 程式狀態儲存暫存器

每個狀態下,最多隻可見18個暫存器

暫存器數量是否越多越好?(必考)

不是.

  1. 儲存現場。現在作業系統都是多執行緒的,在發生執行緒切換時,必須儲存所有通用暫存器,重新載入新執行緒上下文中的所有暫存器,這無疑會增加執行緒資源開銷。

  2. 資料處理指令機器碼格式。要重新設計指令系統。 重新編排新的指令格式的話,那麼原有的格式就不能平滑的使用了。當前每個CPU核心同一時間只能處理1-2條運算指令,而彙編的命令又不是很多,所以過多的暫存器也是沒有意義的。

當前程式狀態暫存器(CPSR)

條件碼標誌N、Z、C、V分別指什麼?

N = Negative result from ALU

Z = Zero result from ALU

C = ALU operation Carried out or borrow

V = ALU operation Overflowed

標誌位含 義
N 負或小於。當用兩個補碼錶示的帶符號數進行運算時,N=1表示運算的結果為負數;N=0表示運算的結果為正數或零
Z 零。 Z=1表示運算的結果為零,Z=0表示運算的結果非零。
C 進位或借位擴充套件。 可以有4種方法設定C的值: -加法運算(包括CMP):當運算結果產生了進位時(無符號數溢位),C=1,否則C=0。 -減法運算(包括CMP):當運算時產生了借位時(無符號數溢位),C=0,否則C=1。 -對於包含移位操作的非加/減運算指令,C為移出值的最後一位。 -對於其它的非加/減運算指令,C的值通常不會改變。
V 溢位標誌。 可以有2種方法設定V的值: -對於加減法運算指令,當運算元和運算結果為二進位制的補碼錶示的帶符號數時,V=1表示符號位溢位 -對於其它的非加/減運算指令,V的值通常不會改變。

Vector Table中斷向量表,存放中斷服務程式的入口地址

流水線

選擇、填空。

影響流水線的因素?

互鎖、跳轉

PC暫存器指向正被取指的指令,而非正在執行的指令

架構

Thumb2指令集不是Thumb(16-bit)指令集的升級版

指令簡介

選擇題寫一條程式碼來選擇正確的結果

選擇題寫一段程式碼,裡面有的指令+s,也有的沒有加,判斷結果。{S}決定指令執行是否影響CPSR

實驗題寫程式

ARM指令在彙編程式中用助記符表示,一般ARM指令的助記符格式為:

/**
<opcode>操作碼
{<cond>}決定指令執行的條件域
{S}決定指令執行是否影響CPSR
<Rd>目的暫存器
<Rn>第一個運算元,必須為暫存器
{<operand2>}第二個運算元
*/
<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

ARM指令語法格式中,< >中的內容是必須的,而{ }中的內容是可選的。

CPSR:

條件碼速查表

不用記,考試會給出,但需要知道是做什麼的,不要現場學習,可能來不及

每種條件碼可用兩個字元表示,這兩個字元可以新增在指令助記符的後面和指令同時使用。

例如,跳轉指令B可以加上字尾EQ變為BEQ表示“相等則跳轉”,即當CPSR中的Z標誌置位時發生跳轉。

Z置位就是Z=1,Z清零就是Z=0

1.ARM指令條件碼字首的作用:

ARM指令可以通過新增適當的條件碼字首來達到條件執行的目的。

這樣可以提高程式碼密度,減少分支跳轉指令數目,提高效能;

比如:

CMP r3,#0 ---比較r3和0

BEQ skip ---相等就跳到skip

ADD r0,r1,r2 ---不相等就執行 r0 = r1 + r2

skip

……

看看加字尾簡化後的樣子:

CMP r3,#0 ---比較r3和0

ADDNE r0,r1,r2 ---加了NE字尾,不相等就執行r0 = r1 + r2

2.預設情況下,資料處理指令不影響條件碼標誌位,但可以選擇通過新增“S”來影響標誌位。

CMP不需要增加“S”就可以改變相應的標誌位。

1)、什麼是標誌位?

即條件碼標誌位,就是程式執行的條件,每執行完一個指令條件標誌位就會改變;

是前面“ARM暫存器詳解“裡面講到的CPSR:

CPSR程式狀態暫存器剖析

1.高4位:NZCV

N 置1:結果是負數;

Z 置1:結果是0;

C 置1:結果完成或借位

V 置1:結果溢位

2)、加S怎樣影響標誌位?

如:SUBS r3,r3,#0 ---r3 = r3 - 0

BEQ skip ---如果相等就跳轉

注:這個S的意義是:執行SUB後如果不相等的話,CPSR的Z清0(置1),按照這個條

件再繼續執行下面的。而CMP是預設可以改變標誌位的,就不需要加S。

3.處理器如何知道根據指令來更改對應的條件標誌位呢?

這裡說的單指資料處理指令,其他指令的話不需要運算就不需要改變CPSR的標誌位;

示例1:

ADD r0, r1, r2 ; r0 = r1 + r2, 不更新標誌位

ADDS r0, r1, r2 ; r0 = r1 + r2, 字尾S表示更新標誌位

ADDCSS r0, r1, r2 ; If C 標誌為1,則執行r0 = r1 + r2, 且更新標誌

CMP r0, r1; CMP指令肯定會更新標誌.

定址方式

給一條指令問是什麼定址方式

立即數定址

立即定址指令中的操作碼欄位後面的地址碼部分即是運算元本身,即資料就包含在指令當中,取出指令也就取出了可以立即使用的運算元(這樣的數稱為立即數)。

立即數可表示為常數表示式。在立即數定址方式中,規定這個立即數必須是一個8位的常數通過迴圈右移偶數位得到。ARM只提供了12位來放資料,其中8位是用來記錄數值的,另外4位放移位的位數,以此來形成一個立即數。

例如:

 SUBS R0,R0,#1 ; R0減1,結果放入R0

 MOV R0,#0x800 ; 將立即數0x800裝入R0暫存器

立即數以“#”開頭,16進位制數在“#”後加“0x”或 “&”表示。

暫存器定址

Rm——暫存器方式。在暫存器方式下,運算元即為暫存器的數值。運算元的值在暫存器中,指令中的地址碼欄位指出的是暫存器編號,指令執行時直接取出暫存器值來操作。

例如:

MOV R1,R2 ; 將R2的值存入R1

SUB R0,R1,R2 ; 將R1的值減去R2的值,結果儲存到R0

注意:第1個是目的暫存器,然後是第一運算元暫存器,最後是第二運算元暫存器。

暫存器移位定址

暫存器移位定址是ARM指令集特有的定址方式。當第2個運算元是暫存器移位方式時,第2個暫存器運算元在與第1個運算元結合之前,選擇進行移位操作。

例如:

 MOV R0,R2,LSL #3 ; R2的值左移3位,結果放入R0,即是R0=R2×8

 ANDS R1,R1,R2,LSL R3 ; R2的值左移R3位,與R1相與,結果放入R1

暫存器間接定址

指令中的地址碼給出的是一個通用暫存器的編號,所需的運算元儲存在儲存器指定地址的儲存單元中,即暫存器是運算元的地址指標。用於間接定址的暫存器必須用[ ]括起來。

例如:

 LDR R1,[R2] ;將以R2的值作為地址的儲存器中的資料傳送到R1中。

基址定址

基址定址方式就是將暫存器的內容與指令中給出的地址偏移量相加,從而得到運算元的有效地址

例如:

 LDR R2,[R3,#0x0C] ; 讀取R3+0x0C 地址上的 儲存單元的內容,放入R2

帶自動變址的前變址定址。

例如:

 LDR R0,[R1, #4]! ;R0 ← [R1+4], R1 ← R1+4

 “!”符號表明指令在完成資料傳送後應該更新基址暫存器。ARM的這種自動變址不消耗額外的時間。

後變址定址:基址加偏移定址。基址不帶偏移作為傳送的地址,傳送後自動變址。

例如:

 LDR R0,[R1],#4 ;R0 ← [R1], R1 ← R1+4

 這裡沒有“!”符號,只使用立即數偏移作為基址暫存器的修改量。這條指令是將暫存器R1的內容作為運算元的有效地址,從該地址取得運算元存入暫存器R0 中,然後將 R1 的內容自增4 。

相對定址

相對定址和基址變址定址方式類似,以程式計數器PC的當前值作為基地址,指令中的地址標號作為偏移量,將兩者相加之後得到運算元的有效地址。

例如以下程式段中的跳轉指令採用了相對定址:

BL SUBR1 ;呼叫到SUBR1子程式,BL是帶連結跳轉

BEQ LOOP ;條件跳轉到LOOP標號處

LOOP MOV

SUBR …

普通Load/Store指令的定址

1,暫存器間接定址:

LDR|STR {<cond>} {B} {T} <Rd>, [Rm]

2,基址變址定址:

LDR|STR {<cond>} {B} {T} <Rd>, [Rm, ±<addressing_mode>]

注:B為載入位元組資料,T為可選後綴。若指令有T,那麼即使處理器在特權模式下,儲存系統也將訪問看成是在使用者模式下進行的。T在使用者模式下無效。

批量Load/Store指令的定址

批量Load/Store指令將一片連續記憶體單元的資料載入到通用暫存器組中或將一組通用暫存器的資料儲存到記憶體單元中。

它的定址模式產生一個記憶體單元的地址範圍,指令暫存器和記憶體單元的對應關係滿足這樣的規則,即編號低的暫存器對應於記憶體中低地址單元,編號高的暫存器對應於記憶體中的高地址單元。

語法格式如下:

LDM|STM{<cond>} <addressing_mode><Rn>{!},<register><^>

舉例:

LDMIA R0, {R1,R2,R3,R4} ;也可以寫成

LDMIA R0, {R1-R4} ; R1 ← [R0], R2 ← [R0 + 4] ; R3 ← [R0 + 8], R4 ← [R0 + 12]

從R0中儲存的地址依次取數存放到R1,R2,R3,R4

LDMIA 中的 I 是 increase 的縮寫,A 是 after 的縮小,LD載入(load)的意思

LDMIA R1!,{R0,R4-R12};

R1後面的感嘆號“!”表示會自動調節 R1裡面存的指標

所以整句話意思是任務棧R1的儲存地址由低到高,將R1儲存地址裡面的內容手動載入到 CPU 暫存器 R0,R4-R12裡

STMIA R0!, {R1-R7} ;將R1~R7的資料儲存到R0所指向的儲存器中,R0的值之後增加,增長方向為向上增長,類似C語言中的i++

ST是store,儲存

STMIB R0!, {R1-R7} ; R0的值先增加,後將R1~R7的資料儲存到R0所指向的儲存器中,增長方向為向上增長,類似C語言中的++i

STMDA R0!, {R1-R7} ;將R1~R7的資料儲存到R0所指向的儲存器中,R0的值之後增加,增長方向為向下增長,類似C語言中的i--

STMDA R0!, {R1-R7} ; R0的值先減少,後將R1~R7的資料儲存到R0所指向的儲存器中,增長方向為向下增長,類似C語言中的--i

堆疊操作定址

堆疊是一個按特定順序進行存取的儲存區,操作順序為“ 後進先出”。堆疊定址是隱含的,它使用一個專門的暫存器(堆疊指標)指向一塊儲存區域(堆疊),指標所指向的儲存單 元是堆疊的棧頂。根據不同的定址方式,將堆疊分為以下4種。

(1)滿堆疊:堆疊指標指向棧頂元素。

(2)空堆疊:堆疊指標指向第一個可用元素。

(3)遞減棧:堆疊向記憶體地址減小的方向生長。

(4)遞增棧:堆疊向記憶體地址增加的方向生長。

滿堆疊和空堆疊對比

遞減棧和遞增棧對比

根據堆疊的不同種類,將其定址方式分為以下4種

(1)滿遞減FD(Full Descending)

(2)空遞減ED(Empty Descending)

(3)滿遞增FA(Full Ascending)

(4)空遞增EA(Empty Ascending)

例如:

滿遞減堆疊:STMFD SP!,{R1-R7,LR} ;將R1~R7、LR入棧

空遞減堆疊:LDMFD SP!,{R1-R7,LR} ;資料出棧放入 R1~ R7、LR

基本指令

加法指令與減法指令

給出一個公式寫出ARM彙編

指令格式:

// S是重新整理程式狀態暫存器CPSR的標誌
<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
<opcode>{<cond>}{S}<Rd>,<Rn>,#立即數

給出程式,問,R0,R1分別是多少

有些指令後面加了s,有些沒有,就影響後面的指令,可能執行,可能不執行

加、減法指令舉例:

ADD R5,R9,R0 ; 加法,R5 ←R9+R0

ADDS R1,R1,#1 ; R1 ←R1+1

SUB R4,R1,R0 ; 減法,R4 ←R1-R0

SUBS R0, R0,#1 ; R0 ←R0-1;a = a – 1;

SUBS R2, R1,R2 ; R2 ←R1-R2

RSB R3,R1,#0xFF00 ; R3=0xFF00-R1

RSBS R1,R2,R2,LSL #2 ; R1=(R2<<2) – R2 = R2 * 3

RSBS R5,R2,#0x80 ; 反減法R5=0x80-R2

乘法指令

32 位乘法運算使用乘法指令MUL;32 位乘加運算使用乘法指令MLA;32位乘減運算使用乘減指令MLS。

指令格式:

MUL {<cond>}{S}<Rd>,<Rn>,<operand2>
MUL/MLS {<cond>}{S}<Rd>,<Rn>,<operand2>,<operand3>

其中,Rd和Rn均為32位帶符號數或無符號數

指令示例:

MUL R0,R1,R2 ;R0=R1*R2
MLA R0,R1,R2,R3 ; R0=R1*R2+R3
MLS R4,R5,R6,R7 ;R4=R7-(R5*R6)

除法指令

無符號除法運算使用UDIV;帶符號除法運算使用SDIV 指令。

指令格式:

SDIV/UDIV Rd,Rm,Rs
SDIV/UDIV Rd,Rm

其中:

Rd—目標暫存器,也可存放被除數;

Rm—存放被除數的暫存器;

Rs—存放除數的暫存器。

注意:這是2條32位運算指令,結果是一個32位的資料,儲存在目標暫存器中。如果不能被整除,餘數將丟失。

除法指令應用舉例:

SDIV R0,R5,R7 ; 帶符號除法,R0=R5/R7

UDIV R8,R2,R3 ; 無符號除法,R8=R2/R3

邏輯操作指令

兩個操作物件“相與”使用指令AND;兩個操作物件“相或”使用指令ORR;兩個操作物件 “異或”使用指令EOR;對暫存器按位清0 使用指令BIC;對暫存器進行“非或”使用指令 ORN,即先對第2 操作物件進行“非”操作,然後和第1操作物件進行“或”操作。

指令格式:

<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

選擇題,下面哪條指令可以使R1的值×8

邏輯操作指令舉例:

AND R8,R4,#0x80 ; R4 與0x80,結果放在R8中

ANDS R0,R0,#0x01 ; R0=R0 與0x01,取出最低位資料

ORR R6,#0x40 ; R6 或0x40,結果放在R6中

ORR R0,R0,#0x0F ; 將R0 的低4 位置1

EOR R9,R6,R5 ; R6和R5進行異或,結果放在R9中

EOR R1,R1,#0x0F ; 將R1的低4 位取反

EORS R0,R5,#0x01 ; 將R5和0x01 進行邏輯異或 ; 結果儲存到R0,並影響標誌位

AND R5,R6 ; R5與R6,結果放在R5 中

BIC R1,R1,#0x1 ; 將R1的第1位清零,其他位不變

BIC R1,R2,R3 ; 將R3的反碼和R2 相邏輯“與”,結果儲存到R1中

ORN R6,R7,R14 ; 把R14先求非,然後或R7,結果放在R6中

移位操作指令

考2-4分

LSL:邏輯左移(Logical Shift Left),暫存器中字的低端空出的有效位補0。

LSR:邏輯右移(Logical Shift Right),暫存器中字的高階空出的有效位補0。

ASR:算術右移(Arithmetic Shift Right)算術移位的物件是帶符號數,在移位過程中必須保持 運算元的符號位不變。若源運算元為正,則字的高階空出的有效位補0;若源運算元為負數,則 字的高階空出的有效位補1。

ROR:迴圈右移(Rotate Right),從字的最低端移出的有效位依次填入空出字的高階有效位。

RRX:帶擴充套件位的迴圈右移(Rotate Right Extended),按運算元所指定的數量向右迴圈移位, 空位用原來C 標誌位填充。

比較操作指令

不會改變暫存器的值,只會影響標誌位。

兩個操作物件的比較操作使用指令CMP,兩個操作物件的取反比較操作使用指令CMN。

CMP/CMN{條件} 運算元1,運算元2

CMP 指令用於把一個暫存器的內容和另一個暫存器的內容或立即數進行比較,同時更新 CPSR(Current Program Status Register,程式狀態暫存器)中條件標誌位的值。

CMN 指令用於把一個暫存器的內容和另一個暫存器的內容或立即數取反後進行比較,同時更新CPSR 中條件標誌位的值。

例如:

CMP R1,R0 ; 將暫存器R1 的值與暫存器R0 的值相減,並根據結果設定CPSR 的標誌位

CMP R1,#100 ; 將暫存器R1 的值與立即數100 相減,並根據結果設定CPSR 的標誌位

位元組交換指令

考6分

這些指令用來在一個32 位的字內實現位元組交換,交換的結果使源字的大端或小端的格式發 生變化。一個32位的字在大端和小端之間轉換使用指令REV;一個16位的半字在大端和小端 之間轉換使用指令REV16;把16位的帶符號半字轉換成相反格式的32位帶符號字使用指令 REVSH;位翻轉使用指令RBIT。

指令格式:

REV/REV16/REVSH/RBIT 目標暫存器,源暫存器

用於大小端轉換

REV Rd, Rn ; Rd = rev(Rn) 在字中反轉位元組序

REV16 Rd, Rn ; Rd = rev16(Rn) 在半字中反轉位元組序

指令舉例,其中R5 中資料是0x0A0B0504。

REV.W R3,R5 ; 對R5 實現32 位轉換,結果是R3=0x04050B0A

REV16.N R7,R5 ; 對R5 實現16 位轉換,結果是R7=0x0B0A0405

REVSHS R0,R5 ; 把R5 低16 位帶符號交換擴充套件,結果R0=0x00000405 ;重新整理標誌

RBIT R4,R5 ; 翻轉R5,結果寫入暫存器R4,R4=0x20A0D050

測試指令

不考寫程式碼,只需要知道幹了什麼

TST 指令用於把一個暫存器的內容和另一個暫存器的內容或立即數進行按位的“與”運算,不儲存運算結果但會根據運算結果更新CPSR 中條件標誌位的值。運算元1 是要測試的資料,運算元2 是一個位掩碼。該指令一般用來檢測是否設定了特定的位。

TEQ 指令用於把一個暫存器的內容和另一個暫存器的內容或立即數進行按位的“異或”運算,不儲存運算結果但會根據運算結果更新CPSR中條件標誌位值。該指令通常用於比較運算元1和運算元2是否相等。

指令格式:

TST/TEQ{條件}運算元1,運算元2

分支指令

沒有分支指令的程式碼效率更高

在ARM中有兩種方式可以實現程式的跳轉,一種是使用分支指令直接跳轉,另一種則是直接向PC暫存器賦值實現跳轉。 分支指令有以下三種:

分支指令B;

Branch : B{<cond>} label

帶連結的分支指令BL;

Branch with Link : BL{<cond>} subroutine_label

帶狀態切換的分支指令BX。

Branch with Reg : BLX{<cond>} Register

分支指令——B指令,該指令跳轉範圍限制在當前指令的±32M位元組地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:

例如:

B WAITA ; 跳轉到WAITA標號處

AT&T彙編

前四個實驗考10分

.global _ start偽操作用於申明全域性標號_start,即程式的入口地址。相當於C語言的main();

svc 0指令的作用是執行Linux服務呼叫命令終止程式,返回linux終端。

C和彙編混合程式設計

彙編可以訪問C語言全域性變數、可以呼叫C語言函式。

C語言可以調用匯編函式

如果C語言函式有6個引數,怎麼傳引數?

分開傳參。前四個用暫存器R0,R1,R2,R3,剩下兩個放在遞減棧中。

編譯連結
彙編 as 如果可執行程式的入口是彙編,使用LD,如果是C語言的類函式使用gcc
C語言 gcc

GPIO

GPIO特性

GPIO口在復位後為了安全起見,一般會設定為輸入模式。如果將PA0口配置為輸出,且輸入為高電平“1”,那麼就容易造成短路,將PA0燒壞。

點LED燈是輸出模式,給LED提供的是脈衝寬度調製(PWM)。

讀按鍵是輸入模式。

GPIO應用

後四個實驗考一個

按鍵消抖

delay()

定時器中斷

PWM的佔空比

佔空比:就是輸出的PWM中,高電平保持的時間與該PWM的時鐘週期的時間之比

序列和並行通訊(必考)

書上作業6-8分。序列通訊與並行通訊的概念?同步通訊與非同步通訊的概念及區別?

序列通訊與並行通訊的概念?

序列通訊是指計算機與I/O裝置之間資料傳輸是按順序依次一位接一位進行傳送。通常資料在一根資料線或一對差分線上傳輸。

並行通訊是指計算機與I/O裝置之間通過多條傳輸線交換資料,資料的各位同時進行傳送。

同步通訊與非同步通訊的概念及區別?

同步通訊是指資料傳送是以資料塊(一組字元)為單位,字元與字元之間、字元內部的位與位之間都同步。

  1. 以資料塊為單位傳送資訊。

  2. 在一個數據塊內,字元與字元間無間隔。

  3. 因為一次傳輸的資料塊中包含的資料較多,所以接收時鐘和傳送時鐘嚴格同步,通常要有同步時鐘。

非同步通訊是指資料傳送是以字元為單位,字元與字元之間的傳送完全是非同步的,位與位之間的傳送基本上是同步的。

  1. 以字元為單位傳送資訊。

  2. 相鄰兩字元間的間隔是任意長。

  3. 因為一個字元中的波特位長度有限,所以需要的接收時鐘和傳送時鐘只要相近就可以。

  4. 字元間非同步,字元內部各位同步。

在一個總線上如果掛了多個裝置,CPU如何決定是與哪個裝置通訊?

  1. 編址

  2. 片選

同步通訊和非同步通訊

UART

I2C匯流排是同步,有時鐘。

IIC(Inter-Integrated Circuit)匯流排。又寫作I2C、I2C。

SPI匯流排也是同步。

只有2根訊號線,如何判別是與哪一個IIC裝置通訊?

7-bit或者10-bit作為地址

I2C匯流排

I2C匯流排術語

Transmitter-----傳送者。

Receiver-----接收者。

Master-----主裝置。產生時鐘,發起通訊,傳送命令,結束通訊的裝置。

Slave-----從裝置。監聽匯流排,並被主裝置編址的裝置。

Multi-Master-----多主裝置。允許在一個總線上掛接多個主裝置。

Arbitration-----仲裁。

Bus Signals-----匯流排訊號。也就是SDA和SCL。當匯流排是空閒的時候,兩根訊號線都是高電平。

I2C----傳輸控制

I2C匯流排,當SCL訊號線為高電平的時候,SDA訊號線的電平發生變化:

Start——開始傳輸,當SDA由高變低的時候。

Stop——停止傳輸,當SDA由低變高的時候。

I2C----資料格式

每個位元組在SDA訊號線上都是8-bit長。相對於傳送的7bit,多出的1bit用來確定方向(是讀還是寫)。

每個位元組傳輸完成後都由接收者傳送一個確認位(ACK)。

SPI匯流排是同步的,有一個SCLK用來同步。

ADC基本過程

A/D轉換器(ADC)

模數轉換電路是將輸入連續變化的模擬訊號轉換為與其成正比的數字訊號量輸出。在進行AD轉換的時候,通常需按取樣、保持、量化、編碼四個步驟進行。

保持。模擬訊號經取樣後,得到一系列樣值脈衝。取樣脈衝寬度一般是很短暫的,在下一個取樣脈衝到來之前,應暫時保持所得的樣值脈衝幅度,以便進行轉換。因此,在取樣電路之後須加保持電路。

量化。輸入的模擬電壓經過取樣保持後,得到的是階梯波。而該階梯波仍是一個可以連續取值的模擬量,但n位數字量只能表示2^n個數值。因此,用數字量來表示連續變化的模擬量時就有一個類似於四捨五入的問題。

編碼。將量化後的離散量用相應的二進位制碼錶示的過程。

ADC主要效能指標

解析度是表示數字量變化一個相鄰的數碼(例如從1到2)所需要輸入模擬電壓的變化量。

例如一個8位ADC模組的解析度為滿刻度電壓的1/256。如果滿刻度電壓位5V,那麼該ADC可分辨5/256即約20mv的電壓變化。

感測器

石化企業輸油管道、儲油罐等壓力容器的破損和洩露檢測。使用壓力、聲音感測器。

汽車怎麼檢測碰撞?使用加速度感測器。

感測器定義

感測器由敏感元件和轉換元件組成。

感測器分類

應變式感測器

應變效應。導體或半導體在受到外界力的作用時,產生機械變形,機械變形導致其阻值變化,這種因形變而使阻值發生變化的現象稱為應變效應。

應變式數顯扭矩扳手、振動式地音入侵探測器

壓阻式感測器

壓阻效應。單晶矽材料在受到應力作用後,其電阻率發生明顯變化,這 種現象被稱為壓阻效應。

電渦流式感測器

金屬探測、電磁爐、探傷

熱電式感測器

即熱飲水機

5分

設計要求:

可以放出20℃、45℃、75℃和100℃四種溫度的水。

可以選擇一次放出200ml或350ml的水。

缺水提醒。

實時顯示溫度。