【學習筆記】嵌入式三級

嵌入式系統

CPU:

  • 範圍: 4、8、32、64位
  • 特點
    • 支持實時處理
    • 低功耗
    • 結構可擴展
    • 集成了測試電路
  • 嵌入式處理器分類
    • 按指令集:CISC複雜指令集和RISC精簡指令集(arm);
    • 按存儲機制:哈佛結構和馮.諾依曼結構
      • 哈佛結構是一種程序指令儲存和數據儲存分開的存儲器結構,
        • ARM7 馮.諾依曼結構,3級流水線
      • 馮·諾依曼結構是一種將程序指令存儲器和數據存儲器合併在一起的存儲器結構
        • ARM9 5級流水線
    • 按軟硬件技術複雜度:低端、中端、高端系統
    • 字長:8、16、32、64
    • cortex-M3是哈佛結構。
  • 主要使用:ARM、DSP、FPGA
  • 嵌入式最小硬件系統:嵌入式處理器、時鐘電路、電源電路、復位電路、存儲器和調試測試接口

開發過程

需求分析與規格說明、系統設計、構件設計、系統集成與測試

JTAG

  • 大多數嵌入式CPU、DSP、FPGA都支持JTAG標準
  • 該標準中規定的TAP接口具有5根信號線:TCK、TMS、TDI、TDO、TRST。

ARM/Advanced RISC Machines

  • ARM11後改名Cortex,並分爲A、R、M三個系列

    • A:面向尖端的基於虛擬內存的操作系統和用戶應用
    • R:實時系統
    • M微控制器
  • AMBA總線規範

    • AMBA是ARM公司公佈的總線協議,用於連接和管理片上系統中功能模塊的開放標準和片上互連規範。
    • AMBA總線協議——先進微控制器總線結構(Advanced Microcontroller Bus Architecture)(一種開放式總線結構)
    • AMBA是ARM公司發佈的總線協議,用於連接和管理片上系統(SoC)中功能模塊的開放標準和片上互連規範
    • 從1995的AMBA1.0到目前的AMBA4.0共四個版本
    • ARM7採用AMB1 ,ARM9採用AMBA2
    • 外圍總線:GPIO、UART、SPI、I2C、USB、AD/DA、
  • 單週期工作、採用加載/存儲指令訪問內存、指令流水線技術

  • ARM共有37個寄存器,包括31個通用寄存器和6個狀態寄存器,所有的通用寄存器均爲32位結構,既可以存放數據也可以存放地址。

  • R0-R15 通用寄存器,32位

    • R13 堆棧指針SP; (也可以用作通用數據寄存器)
    • R14程序鏈接寄存器 LR;
    • R15 程序計數器PC
  • 處理器可以工作在3個模式下

    • ARM狀態:32位指令(復位進入)
      • 處理器進行異常處理的時候,從異常向量地址開始執行,自動進入ARM狀態
    • Thunb和Thumb-2狀態Thunb狀態是ARM執行16位指令,新的Thumb-2內核技術兼有16位和32位指令長度。
      • 關外部中斷:CPSID I
      • 開外部中斷:CPSIE I
    • 調試狀態
    • 注:通過BX指令ARM狀態和Thumb狀態是可以互相切換的。
  • 採用系統總線和外圍總線兩層結構構成片上系統

    • 系統總線:連接高帶寬快速組件。
    • 外圍總線:低速外圍組件、速度不高的外部接口,包括定時器、並行接口和串行接口。
  • 7種異常以及相應優先級:復位RESET、未定義指令UND、軟件中斷SWI、指令預取中止PABT、數據訪問中止DABT、外部中斷請求IRQ、快速中斷。

  • CPSR:當前程序狀態寄存器,包含條件標誌位、中斷禁止位、當前處理器模式標誌位及其他控制和狀態位。

  • 大端模式:數據高位保存在低地址,數據低位保存在高地址。
    小端模式:數據高位保存在高地址

  • ARM處理器片內程序存儲器通常使用SRAM

USB:

  • 熱拔插
  • USB2.0 採用半雙工差分方式 4根信號線
  • USB2.0速度爲480Mb/s,USB3.0速度爲640Mb/s
  • USB OTG的作用是可以擺脫主機完成點對點通訊,實現沒有主機下從設備的之間的數據傳送。

S3C2410

  • 是三星公司基於ARM920T核的
  • 中高檔32位嵌入式微處理器
  • 哈佛
  • 高速組件採用AHB總線,低速外設接口採用APB總線,通過AHB總線連接
  • 電源管理模塊有四種模式:正常模式、慢速模式、空閒模式、和掉電模式

實時操作系統

  • 強實時嵌入式操作系統(us,ms):VxWorks、pPOS、uC/OS-II
  • 微內核結構的嵌入式操作系統:Symbian VxWorks QNX uC/OS-II iOS
  • 7個特徵:異步IO和中斷處理能力、任務切換時間和中斷延遲時間的確定、優先級中斷和調度、搶佔式調度、內存鎖定、連續文件、同步。
  • 任務時限
    • 截止時間:任務開始至此那個時間到任務必須完成的時間間隔
    • 任務執行預設時間:無中斷響應情況下任務最快執行時間
  • 響應時間:中斷延遲時間和任務切換時間
  • 實時指標:響應時間、吞吐量、生存時間
  • 引導/自舉 ->引導(加載)程序:加電自檢、外設存在自檢、內存地址映射、初始化外圍設備、內存尋址定位、加載並啓動操作系統。

uC/OS-IIS

  • 搶佔式實時操作系統
  • 允許中斷嵌套,可達255層
  • 基本不包含設備驅動程序,只是一個純內核。
  • 64個任務(保留8個任務給系統,用戶編寫的應用程序最多可以有56個任務)
  • 每個任務的優先級不用,不支持時間片輪詢。
  • 保護任務之間共享數據和提供任務之間的通信
    • 利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITCAL()來關閉中斷和打開中斷;
    • 利用函數OSSchedLock()和OSSchedUnlock對任務調度函數上鎖和開鎖;
    • 利用信號量、互斥信號量、郵箱和消息隊列進行任務間通信
  • 內核提供:任務調度,任務間通訊與同步,任務管理,時間管理和存儲管理
  • OSTaskCreat()創建函數
  • OSStart()啓動多任務調度
  • OSSemCreate OSMutexCreate OSMboxCreate OSQCreate 事件控制塊創建
  • 一些系統文件
    • OS_CPU_C.C - 創建任務的自用棧空間、定義用戶接口的hook原型
    • OS_CORE.C - 核心調度代碼,包括系統初始化、啓動多任務調度開始運行、任務創建管理與調度、TCB初始化、就緒表初始化、ECB初始化、任務事件就緒表、空閒任務
    • OS_MEM.C - 內存管理,包括創建分區,獲得存儲塊
    • OS_TASK.C - 任務管理,包括改變一個任務的優先級、創建或者刪除一個任務,恢復一個被掛起的任務
  • 調度的三個條件
    • 所有的中斷服務程序均已經執行完畢
    • 調度沒有被禁止
    • 任務就緒表中查找到的最高優先級任務的優先級比當前運行任務的優先級高
  • 任務間通信:信號量、互斥信號量、郵箱、消息隊列、
  • 狀態:休眠、就緒、運行、掛起、被中斷

VxWorks

  • 搶佔式實時操作系統
  • 大型商用操作系統,不屬於開源操作系統

Linux

  • 主要由用戶進程、OS服務組件和Linux系統內核組成

  • Linux內核主要由5個系統組成,進程調度、內存管理、虛擬文件系統、網絡接口、進程間通信。
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nCo8gY8w-1570630080541)(en-resource://database/1294:1)]

  • Bootloader的工作步驟:

    • 初始化處理器及外設的硬件資源配置
    • 建立內存空間的映射關係,使能MMU,將系統的外存和內存地址變換激活,爲最終調用操作系統內核做好準備
    • 裝載操作系統映像到內存
    • 對Flash存儲器編程
    • 運行操作系統
    • 傳遞系統啓動參數
    • 命令行解析和輸入輸出控制

Linux與Unix

  • Unix之父:Dennis MacAlistair Ritchie (丹尼斯·裏奇)(C語言之父)
  • Linux是以Unix爲原型的一種“類Unix”的操作系統
  • Linux與Unix兩者源碼是完全不相同
  • 函數和命令的功能處理結果、函數名稱和參數大體相同
  • Unix的行命令、驅動程序和應用程序在Linux上能夠運行。
  • Linux運行效率沒有Unix高

Android

  • 是一種以Linux爲基礎的半開放源代碼操作系統,主要用於移動便攜設備
  • 如果使用不同的軟件開發包,則使用的編程語言也不同

開源嵌入式操作系統

uCLinux 、RTLinux 、uC/OS-IIS

GUN開發工具

  • GCC編譯器
  • GDB調試工具
  • 要對某應用程序進行調試,則在編譯該應用程序時,要在編譯命令中加入參數**-g**
  • 通用公共許可協議
  • 生成a.out文件

UART通用異步收發器

  • RS-232:無法消除共模干擾,通訊距離15m左右
  • RS-485:差分信號傳輸方式,強抗共模干擾,距離1200m

Soc

  • 分類:專用和通用;通用中,包含多核和單核。
  • 按製作工藝分類:定製芯片和現場可編程芯片。
  • 包含電路:數字電路、模擬電路、數字/模擬混合電路、射頻電路

RS-232 RS-485

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-e1ij39b0-1570630080543)(en-resource://database/1322:1)]

網絡

  • 無線方式接入互聯網的技術:
    • 無線局域網 (WLAN 或WiFi)/必須在安裝有接入點(AP、熱點、WiFi)
    • GPRS移動電話網
    • 3G移動電話網
  • IP
    • 地址分類:A、B、C三個基本類,D(組播地址)和E(備用地址)
    • C類地址範圍192.0.0.1-223.255.255.254,第1、2、3字節爲網絡地址,第4字節爲主機地址(最多254臺計算機),適用小規模的局域網。
  • WLAN(無線局域網)
    • 無線局域網的主要通信協議:IEEE 802.11(俗稱WiFi)
      • 802.11n
    • 傳輸速率:11Mbps、54Mbps、108Mbps

以太網

  • 集線器或交換機爲中心構成。
  • 以太網數據幀:前導碼(7字節)、幀起始定界符(1字節)、目的MAC地址(6字節)、源MAC地址(6字節)、類型/長度
  • 以太網是實現LAN(Local Area Network)的一種技術,它允許嵌入式系統連接到一個LAN中,並可通過使用網關經Internet連接到外部世界
  • 以太網的主要目的是向LAN發送和從LAN接收以太網幀
  • 在TCP/IP協議族中,不包括以太網協議,可以理解它爲TCP/IP中的網絡接口層(物理層和數據鏈路層),爲TCP/IP中的上層協議(比如:IP協議和ARP協議)提供服務

路由器

  • 工作在網絡層,遵循IP協議把異構網絡互相連接起來
  • 功能:網絡互連、數據處理、網絡管理

CAN總線

  • Controller Area Network(控制器局域網絡 )
  • 抗干擾能力強、傳輸距離遠、適應於多主系統,廣泛應用於汽車、船舶等
  • 傳輸時,高位在前,低位在後
  • 傳輸線採用雙絞線,這樣使每根線上的干擾均等,通過差分,即可完全消除共模干擾
  • 僅需兩根線,CANH和CANH相連,CANL和CANL相連
    CAN_H-CAN_L < 0.5V 時候爲隱性的,邏輯信號表現爲"邏輯1"- 高電平
    CAN_H-CAN_L > 0.9V 時候爲顯性的,邏輯信號表現爲"邏輯0"- 低電平
  • S3C2440和S3C2410均沒有CAN控制器,則要外加CAN控制器和CAN收發器。可選用串行SPI接口的CAN控制器,也可選用並行接口的CAN控制器作爲CAN總線控制器接口

存儲器

  • 半導體存儲器芯片的存儲容量取決於該芯片的地址總線的條數數據總線的位數
  • 存儲器帶寬與存儲器總線的工作頻率有關,也與數據線的位數和每個總線週期的傳輸次數有關
  • 系統正在運行的程序的大部分數據和代碼存放在**主存儲器(內存)**中
  • 系統尚未運行的程序的大部分數據和代碼存放在外部存儲器
  • 對於內存而言,1KB=1024B;對於外存(磁盤、U盤)容量而言,1KB=1000B。
  • 分類
    • 按照存取特性分爲:RAM和ROM
    • 按照物理位置分爲:片內存儲器和片外存儲器以及外部存儲器
    • 按照存儲信息的類型分爲:程序存儲區和數據存儲器
  • Cache
    • 高速緩衝區
    • 規模較小,但速度很高的存儲器
    • 通常由SRAM(Static Random Access Memory 靜態存儲器)組成
    • 它是位於CPU與內存間的一種容量較小但速度很高的存儲器
  • FLASH
    • Flash閃存有兩大類,*或非型(NOR Flash)和與非型(NAND Flash)
    • 或非以字節爲單位進行隨機存取,存儲在裏面的程序可以被CPU執行。與非以頁爲單位進行存取,速度較前者慢。
      • 與非門讀出程序或數據時,是先將其預存入RAM,然後才被使用的。雖然速度較慢,但是其壽命,容量成本等方面有很大優勢,常用的U盤、數碼相機基本都是NAND Flash
      • NOR Flash ROM的特點是以字節爲單位隨機存儲,寫入和擦除速度慢
      • NAND Flash ROM以頁(行)爲單位隨機存取,在容量、使用壽命和成本方面有較大優勢
  • RAM
    • RAM - 高速讀取, DRAM - 高集成度(易丟失)
    • RAM 通常又有DRAM和SRAM之分,SRAM較DRAM電路複雜,但是速度更快,高速緩衝區(cache)就是典型的SRAM,SRAM的複雜決定了它做不大,一般最大幾十K
    • FRAM - 鐵電隨機存取存儲器,MRAM - 磁性隨機存取存儲器(兩者都爲隨機存儲器是非易失性存儲器)不屬於半導體存儲器
      • MRAM:非易失性,擁有SRAM的高速存取能力,以及DRAM的高集成度
      • FRAM:非易失性、高速隨機讀寫
    • NOR RAM(以字節爲單位隨機存儲)、NAND RAM(以行/頁爲單位隨機存儲)
  • DDR
    • DDR - dual data rate - 雙倍數據速率
    • DDR2 - 使原來DDR可預取讀取2位變成可預取讀取4位或8位,把DDR的數據傳輸速率又提升了兩倍或四倍

其他

  • 一個漢字佔兩個字節
  • 漢字編碼國家標準 GB2312 GB18030
    • GB2312 國際字符集中包含3755個一級常用漢字和3008個二級常用漢字,682個圖形符號
    • GB18030 字符集與國際標準UCS/Unicode字符集基本兼容,採用雙字節編碼表示漢字。
    • UCS/Unicode在表示漢字時有兩種不同的編碼方案。
  • 我國有線數字有線電視和衛星電視傳輸時採用的壓縮編碼標準是MPEG-2.
  • ASCII字符集共有128個字符,包括96個可打印字符和32個控制字符。
  • 圖像數據量=圖像水平分辨率圖像垂直分辨率像素深度/8
  • 觸摸屏
    • 電阻式:硬屏、專用硬筆寫字
    • 電容式 :多點觸摸、滑動操作

彙編

ARM的六大類指令集—LDR、LDRB、LDRH、STR、STRB、STRH

— LDR 字數據加載指令— LDRB 字節數據加載指令— LDRH 半字數據加載指令— STR 字數據存儲指令— STRB 字節數據存儲指令— STRH 半字數據存儲指令

LDR指令LDR指令的格式爲:

LDR{條件} 目的寄存器,<存儲器地址>
LDR指令用於從存儲器中將一個32位的字數據傳送到目的寄存器中。該指令通常用於從存儲器中讀取32位的字數據到通用寄存器,然後對數據進行處理。當程序計數器PC作爲目的寄存器時,指令從存儲器中讀取的字數據被當作目的地址,從而可以實現程序流程的跳轉。
指令示例:

  • LDR R0,[R1];
    將存儲器地址爲R1的字數據讀入寄存器R0。
  • LDR R0,[R1,R2] ;
    將存儲器地址爲R1+R2的字數據讀入寄存器R0。
  • LDR R0,[R1,#8];
    將存儲器地址爲R1+8的字數據讀入寄存器R0。
  • LDR R0,[R1,R2] ! ;
    將存儲器地址爲R1+R2的字數據讀入寄存器R0,並將新地址R1+R2寫入R1。
  • LDR R0,[R1,#8] !;
    將存儲器地址爲R1+8的字數據讀入寄存器R0,並將新地址R1+8寫入R1。
  • LDR R0,[R1],R2 ;
    將存儲器地址爲R1的字數據讀入寄存器R0,並將新地址R1+R2寫入R1。
  • LDR R0,[R1,R2,LSL#2]! ;
    將存儲器地址爲R1+R2×4的字數據讀入寄存器R0,並將新地址R1+R2×4寫入R1。
  • LDR R0,[R1],R2,LSL#2 ;
    將存儲器地址爲R1的字數據讀入寄存器R0,並將新地址R1+R2×4寫入R1。

LDRB指令

LDRB指令的格式爲:LDR{條件}B 目的寄存器,<存儲器地址>
LDRB指令用於從存儲器中將一個8位的字節數據傳送到目的寄存器中,同時將寄存器的高24位清零。該指令通常用於從存儲器中讀取8位的字節數據到通用寄存器,然後對數據進行處理。當程序計數器PC作爲目的寄存器時,指令從存儲器中讀取的字數據被當作目的地址,從而可以實現程序流程的跳轉。
指令示例:

  • LDRB R0,[R1] ;
    將存儲器地址爲R1的字節數據讀入寄存器R0,並將R0的高24位清零。
  • LDRB R0,[R1,#8] ;
    將存儲器地址爲R1+8的字節數據讀入寄存器R0,並將R0的高24位清零。

LDRH指令

LDRH指令的格式爲:LDR{條件}H 目的寄存器,<存儲器地址>
LDRH指令用於從存儲器中將一個16位的半字數據傳送到目的寄存器中,同時將寄存器的高16位清零。該指令通常用於從存儲器中讀取16位的半字數據到通用寄存器,然後對數據進行處理。當程序計數器PC作爲目的寄存器時,指令從存儲器中讀取的字數據被當作目的地址,從而可以實現程序流程的跳轉。
指令示例:

  • LDRH R0,[R1] ;
    將存儲器地址爲R1的半字數據讀入寄存器R0,並將R0的高16位清零。
  • LDRH R0,[R1,#8] ;
    將存儲器地址爲R1+8的半字數據讀入寄存器R0,並將R0的高16位清零。
  • LDRH R0,[R1,R2] ;
    將存儲器地址爲R1+R2的半字數據讀入寄存器R0,並將R0的高16位清零。

LDM指令:

L的含義仍然是LOAD,即是Load from memory into register。雖然貌似是LDR的升級,但是,千萬要注意,這個指令運行的方向和LDR是不一樣的,是從左到右運行的。該指令是將內存中堆棧內的數據,批量的賦值給寄存器,即是出棧操作;其中堆棧指針一般對應於SP,注意SP是寄存器R13,實際用到的卻是R13中的內存地址,只是該指令沒有寫爲[R13],同時,LDM指令中寄存器和內存地址的位置相對於前面兩條指令改變了。

  • LDMFD SP! , {R0, R1, R2}
    實際上可以理解爲: LDMFD [SP]!, {R0, R1, R2}意思爲:
    把sp指向的3個連續地址段(應該是3*4=12字節(因爲爲r0,r1,r2都是32位))中的數據拷貝到r0,r1,r2這3個寄存器中去。

STR指令STR指令的格式爲:

STR{條件} 源寄存器,<存儲器地址>
STR指令用於從源寄存器中將一個32位的字數據傳送到存儲器中。該指令在程序設計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。
指令示例:

  • STR R0,[R1],#8 ;
    將R0中的字數據寫入以R1爲地址的存儲器中,並將新地址R1+8寫入R1。
  • STR R0,[R1,#8] ;
    將R0中的字數據寫入以R1+8爲地址的存儲器中。

STRB指令STRB指令的格式爲:

STR{條件}B 源寄存器,<存儲器地址>
STRB指令用於從源寄存器中將一個8位的字節數據傳送到存儲器中。該字節數據爲源寄存器中的低8位。
指令示例:

  • STRB R0,[R1] ;
    將寄存器R0中的字節數據寫入以R1爲地址的存儲器中。
  • STRB R0,[R1,#8] ;
    將寄存器R0中的字節數據寫入以R1+8爲地址的存儲器中。

STRH指令STRH指令的格式爲:

STR{條件}H 源寄存器,<存儲器地址>
STRH指令用於從源寄存器中將一個16位的半字數據傳送到存儲器中。該半字數據爲源寄存器中的低16位。
指令示例:

  • STRH R0,[R1] ;
    將寄存器R0中的半字數據寫入以R1爲地址的存儲器中。
  • STRH R0,[R1,#8] ;
    將寄存器R0中的半字數據寫入以R1+8爲地址的存儲器中

STM指令:

S的含義仍然是STORE,與LDM是配對使用的,其指令格式上也相似,即區別於STR,是將堆棧指針寫在左邊,而把寄存器組寫在右邊。

  • STMFD SP!, {R0}
    同樣的,該指令也可理解爲: STMFD [SP]!, {R0}意思是:把R0保存到堆棧(sp指向的地址)中。

BL

子程序調用
子程序返回調用程序指令 MOV PC,LR

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章