學校嵌入式期末考試復習


目錄

分值分布

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的特點是?

  CISC RISC
指令數量 非常多 <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]的地址最高

wKiom1jBDvDgbq6LAAAqLv0kL6U770.png

什么是高低位

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

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

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

一個整形占4個字節,給一個整形數據0x12345678,如果是大端存儲,存儲格式如下:

wKioL1jBDvHxKgXuAAAlza50CKM916.png

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

一個數0x12345678存放在一個4字節空間里

img

img

如果我們可以得到 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寫入內存,告訴你,如果大端,那么從某個地址讀出來的數據是什么。

image-20210605121101761

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分

image-20210605123022952

在ARM中,堆棧寄存器要使用的是?

R13

CPSR的作用是?

當前程序狀態寄存器

   
R0-R12 通用寄存器
R13 堆棧寄存器
R14 鏈接寄存器
R15 PC程序計數器
CPSR 當前程序狀態寄存器
SPSR 程序狀態保存寄存器

每個狀態下,最多只可見18個寄存器

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

不是.

  1. 保存現場。現在操作系統都是多線程的,在發生線程切換時,必須保存所有通用寄存器,重新加載新線程上下文中的所有寄存器,這無疑會增加線程資源開銷。

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

當前程序狀態寄存器(CPSR)

image-20210605124529275

條件碼標志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:

image-20210605124529275

條件碼速查表

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

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

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

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

image-20210605154517317

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——寄存器方式。在寄存器方式下,操作數即為寄存器的數值。操作數的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執行時直接取出寄存器值來操作。

image-20210605160911111

例如:

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中。

image-20210605161128376

基址尋址

基址尋址方式就是將寄存器的內容與指令中給出的地址偏移量相加,從而得到操作數的有效地址

例如:

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

image-20210605161233931

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

例如:

 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

image-20210605162205414

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)遞增棧:堆棧向內存地址增加的方向生長。

滿堆棧和空堆棧對比

image-20210605162354698

image-20210605162601277

遞減棧和遞增棧對比

image-20210605162708350

根據堆棧的不同種類,將其尋址方式分為以下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) 在字中反轉字節序

image-20210605171025444

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

image-20210605171039499

指令舉例,其中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終端。

image-20210605172536079

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的時鍾周期的時間之比

image-20210605190029560

串行和並行通信(必考)

書上作業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由低變高的時候。

image-20210605192923286

I2C----數據格式

每個字節在SDA信號線上都是8-bit長。相對於發送的7bit,多出的1bit用來確定方向(是讀還是寫)。

每個字節傳輸完成后都由接收者發送一個確認位(ACK)。

image-20210605193354040

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的水。

缺水提醒。

實時顯示溫度。

image-20210605163400821




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM