CPU是計算機/微控制器的核心,進行算數/邏輯運算
MCU?
MicroController Unit 微控制器是一個完整的計算機系統,在單個芯片上包含了處理器、存儲器和所有的外設IO模塊。
MCU包含了什麼?
- CPU
- Input/Output interface
- Peripherals
- RAM 用於數據存儲
- ROM 用於程序存儲, EPROM, EEPROM或 Flash Memory
MCU的特點
- 體積小
- 低成本
- 低功耗
- 高可靠性
- 大量型號和設計方案
ARM處理器的分類
從ARM v7之後,ARM處理器按照應用特徵分類,分爲以下三類:
- A系列 —— Application Processor —— 高性能多媒體<手機等>
- R系列 —— Real-time Controller —— 實時響應<無人機等>
- M系列 —— Micro-Controller —— 嵌入式
微控制器的內部結構
CPU
上圖中右邊就是之前概念CPU的實際表達ALU 運算邏輯單元。
運算邏輯單元完成邏輯和數學的運算
兩個輸入數據 —— A和B
一個指令 —— OP,要對A和B做什麼運算
輸出數據 —— Result和Flags(標誌位)
怎麼理解標誌位
如果給ALU下面幾種運算
A+B = C
如果這個ALU是一個4 bit的運算單元,則當計算加法時,可能會出現C大於15(0x1111),這時會出現溢出標誌位用來表示計算結果是否溢出。
A>B ?
CPU在做比較的話,實際上是做了A-B的運算,而我們想要的結果實際上就是負數標誌,同樣也是在標誌位中體現。
問題:ALU計算得到的結果要存在哪裏呢? —— 寄存器
寄存器組
寄存器是由電路實現的保存數據的單元。
在CPU中,有一個寄存器就是用來專門保存ALU計算後的標誌位,每條指令所能影響的狀態位是不一樣的,這類寄存器被稱爲程序狀態寄存器(PSR寄存器),還有被稱爲CCR寄存器,
這個寄存器中到底要存哪些狀態信息?
不同的芯片,對應的狀態信息也有所區別,但是一般而言都要包括以下幾個標誌:
- Z 上一個運算得到了0的結果
- N 上一個運算得到了一個負數
- O 上一個運算溢出了
- C 上一個運算出現了進位
在CPU的設計當中,下圖中這樣的寄存器可以有若干個。
- 寄存器用於臨時保存/獲取操作數
- 任何CPU都包含了若干個通用/專用寄存器
- 寄存器的數目和位寬是衡量CPU的重要指標
CPU內部的寄存器個數有限,其實是無法滿足程序的要求,因此出現了下圖的結構
上圖中的Data Memory不再是CPU的組成部分,對Memory的訪問要比對寄存器的訪問慢很多
地址與存儲器的關係
如果要訪問CPU外部的Data Memory,如何實現?
對於存儲器,其結構如下:
上圖中的0x0003這個地址存的數據就是0x44
類比一下,一定意義上來說,程序的存儲也是這個概念。
指令集
堆棧
棧是一段連續的存儲器空間
堆棧按照後入先出的工作方式
只能從/向堆棧的頂部加入或取出數據
按照這個邏輯,我們現在還缺少一個片外的存儲器,用來給堆棧用。我們需要有一個類似指針的東西,指明從某個位置開始的存儲器作爲堆棧來使用。
堆棧空間和變量空間是使用同一端存儲空間
- 變量空間從低地址向搞地質劃分(例如C語言編程時聲明的全局變量)
- 堆棧空間從高地址向低地址增長
這就帶來一個新的問題:
存儲器的空間是有限的,當某個時間點,堆棧達到一個衝突點的時候,出現了堆棧溢出。
堆?
堆是一個進程開啓之後,系統分配給它的空間,一般這個空間是全局的,系統中所有動態分配的對象(比如指針)都是在這個空間上分配的。
堆裏的數據是有數據結構的,其空間佔用是不連續的。在沒有OS的嵌入式系統中,通常不使用堆。
通常,我們把上圖中紅色框中的寄存器稱爲寄存器組,也可以稱爲編程模型。
中斷
中斷與輪詢
輪詢:
- 週期連續地檢查外部事件是否發生
- 消耗大量CPU的處理事件
- 需要和其他功能代碼結合
- 由於CPU需要處理其他事件,可能丟失關鍵事件
中斷:
用硬件來判斷是否發生外部事件並通知CPU
專用的中斷服務程序來處理事件
中斷是一個需要CPU立即處理的內部或外部事件
內部事件
- 定時器時間到
- AD變換結束
- …
外部事件 - 按鍵動作
- 發生外部通信
中斷:
- 適用於處理響應要求非常高的事件
- 適用於處理持續時間非常短的事件
- 適用於低功耗的應用
- 程序設計複雜
中斷允許/禁止
- 全局中斷控制
時鐘/復位
存儲器
外設
ARM體系結構
32bit MCU Register File (ARM Cortex M)