天天看點

【學習筆記】嵌入式三級嵌入式系統彙編

目錄:

  • 嵌入式系統
    • CPU:
    • 開發過程
      • JTAG
    • ARM/Advanced RISC Machines
      • USB:
      • S3C2410
    • 實時作業系統
      • **uC/OS-IIS**
      • VxWorks
      • Linux
      • Linux與Unix
      • Android
    • 開源嵌入式作業系統
      • GUN開發工具
      • UART通用異步收發器
      • Soc
      • RS-232 RS-485
    • 網絡
      • 以太網
      • 路由器
      • CAN總線
    • 存儲器
    • 其他
  • 彙編
    • ARM的六大類指令集---LDR、LDRB、LDRH、STR、STRB、STRH
      • LDR指令LDR指令的格式為:
      • LDRB指令
      • LDRH指令
      • LDM指令:
      • STR指令STR指令的格式為:
      • STRB指令STRB指令的格式為:
      • STRH指令STRH指令的格式為:
      • STM指令:
      • BL

嵌入式系統

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

繼續閱讀