嵌入式 -中斷

微處理器體系結構

基本概念

  1. 關於彙編語言
  • 彙編語言是機器執行指令的另一種形式,每條彙編語句對應一條機器指令,彙編語言要翻譯成 二進制代碼才能給微處理器執行。
  • 用 C 語言編寫的程序在編譯時一條語句可能被轉換成多條微處理器能執行的機器指令。
  • 不同系列的微處理器有不同的彙編語言;同一系列微處理器彙編語言一致。
  1. 關於微處理器的內部寄存器
  • 通用寄存器:存放處理器正在計算的值
  • 專用寄存器
    1)程序計數器
    用來跟蹤微處理器要執行的下一條指令的地址。
    2)堆棧指針
    用來存放微處理器通用堆棧的棧頂地址。

常見的彙編指令

  1. 存/取數據——MOVE(左邊得到右邊的值
  • MOVE R3,R2
    讀取R2的值,複製到R3中
  • MOVE R5,(iTemperature)
    讀取內存中iTemperature的值,複製到R5中
  • MOVE R5, iTemperature
    讀取內存中iTemperature的地址,複製到R5中
  1. 算術運算和位運算
    一般情況下,微處理器是在累加器(accumulateor)中做算術運算,但大多數微處理器都能在任一寄存器中進行標準算術運算和位運算。如:
  • ADD R7,R3
  • NOT R4
  1. 跳轉指令 —— JUMP
    它使程序指針無條件地跳到跳轉指令中的跳轉標記處繼續執行。例如:
    ADD R1,R2
    JUMP NO_ADD
    MORE_ADDITION:
    ADD R1,R3 ; 這兩條語句被跳過
    ADD R1,R4
    NO_ADD:
    MOVE (xyz),R1
    4、條件跳轉指令 —— JCOND
    **指令在某個條件爲真時才發生跳轉。**例如:
    SUBTRACT R1,R5
    JCOND ZERO, NO_MORE
    .
    .
    .
    NO_MORE:
    .
    .
    .
  2. 堆棧訪問指令 —— POP, PUSH
    PUSH是將數據項壓入堆棧,並調整堆棧指針指向被壓入的數據項。
    POP指令則相反,在獲取棧頂數據後調整數據指針。
    PUSH 寄存器;將一個寄存器中的數據入棧
    POP 寄存器;出棧,用一個寄存器接收出棧的數據
  3. 函數或程序調用指令 —— CALL/RETURN
    執行call指令一般都會把後面的指令地址壓棧,例子中是把MOVE指令的地址壓棧;執行return指令,自動彈出棧頂的指令地址。
    CALL ADD_EN_UP
    MOVE (xyz),R1
    .
    .
    ADD_EM_UP:
    ADD R1, R3
    ADD R1, R4
    ADD R1, R5
    RETURN
    在這裏插入圖片描述
  • MOVE 是把右邊的值給到左邊
  • ADD 是左邊的值獲得右邊的值,返回的結果是左邊ADD的值
  • SUBTRACT 是用右邊的值減去左邊的值獲得結果

中斷基礎知識

定義

中斷是從一個硬件信號開始的,微處理器提供專門的引腳 IRQ 用於判斷什麼時候需要什麼樣的中斷服務。
在這裏插入圖片描述

操作

當微處理器檢測到某個中斷請求時,就會停止當前的指令執行順序,把下一條要執行的指令地址壓入堆棧,馬上跳轉到中斷程序(interrupt routine)。

中斷程序

中斷程序是一個用戶程序,它主要負責處理中斷請求信號產生後的一些事務,它們通常是一些緊急事務。例如,串口芯片從外部設備接收到字符。有時中斷程序還要一些其它事務,如重啓微處理器的中斷檢測硬件。
中斷程序又稱爲中斷處理程序(interrupt handler)或中斷服務程序(Interrupt Service Routine)。
中斷程序的最後一條指令是RETURN。當程序執行到RETURN時,微處理器就從堆棧中取出下一條要執行的指令的地址,從該地址繼續執行指令

共享數據問題

需求

中斷程序會與其它任務代碼通信,這時,它們必須共享一個或多個變量來實現它們之間的通信。

特徵

中斷程序和任務代碼共享了數據

解決方法

使用中斷禁止

解決共享數據問題的一個簡單而實用的方法是在任務代碼使用共享數據時禁止中斷。

原子的 和 臨界區

程序中不能被中斷的部分代碼稱爲「原子的」。
共享數據問題的更精確的表述:中斷程序和任務代碼共享數據且使用共享數據的任務代碼不是原子的。
臨界區:是指必須是「原子的」以保證系統正常運轉的指令的集合。

volatile關鍵字

volatile的作用:警告編譯器所標明的變量可能因爲中斷程序或其它編譯器不知道的原因而發生變化。

中斷延遲

定義

中斷延遲是指系統響應一箇中斷需要花費的時間。
中斷延遲也是一個不太容易測試的性能參數,它受程序運行環境和條件的影響,是多個因素的組合。

影響中斷延遲的因素

1)中斷(或者所有中斷)被禁止的最長時間。
2)任意一個優先級更高(相對於正在討論的中斷)的中斷的中斷程序的執行時間。
3)微處理器停止當前任務、保存必要的信息以及執行中斷程序中的指令需要花費的時間。
4)從中斷程序保存上下文到完成一次響應需要的時間。

中斷延遲測試與評估

中斷延遲的測試與評估通常有以下兩種方法: 1)編寫代碼,然後測量其執行過程所花費的時間。 2)計算統計不同類型的指令及數量,通過查閱微處理器文檔,找出每種類型的指令的執行時間,再計算總的執行時間。