1. 程式人生 > >第06課 中斷控制器

第06課 中斷控制器

第6課 中斷體系結構

1. ARM中斷體系結構 

       7種工作模式

       異常

2. S3C2440中斷體系結構

       中斷處理過程

       相關暫存器

       原始碼分析

7種工作模式

每種工作模式有:

 不同的暫存器

 不同的許可權 (配合mmu)

 不同的觸發條件

  1. 上電後位於 svc
  2. 發生中斷,IRQ模式

中斷

比如你在家裡看電視,怎麼知道有客人來

  1. (查詢)每過5分鐘去看看有沒有人來
  2. (中斷)客人按門鈴

程式想知道key被按下

  1. 查詢
  2. 中斷,中斷是一種異常,(資料訪問中止是一種異常,未定義指令中止也是一種異常)

發生異常之後

  1. CPU進入異常模式,比如中斷模式,或者取址異常模式,相當於切換暫存器
  2. PC指標=異常入口(固定)

比如要轉入中斷模式,PC指標會指向0x18 HandleIRQ,0x18,0x08這些地址就叫做異常入口

每個模式都有一組暫存器,有的共用,有的不共用每組獨有的暫存器稱謂備份暫存器。

模式轉換過程中

  1. 保護現場。

儲存非備份暫存器,恢復的時候,恢復儲存的內容即可。

怎麼用中斷,什麼“中斷”

設定中斷,初始化,使能中斷

  1. 中斷髮生 保護現場
  2. 中斷處理 分便中斷源,進行不同的處理,清理中斷
  3. 恢復現場

中斷至少涉及5個方面得暫存器

  1. 使能/禁止暫存器;
  2. 分辨中斷源的狀態暫存器;
  3. 設定中斷條件的暫存器;(比如高低電平,上下跳邊沿觸發)
  4. 引腳設定即硬體相關的設定
  5. 優先順序暫存器

從晶片手冊上的介紹

SUB子 SRC源 PND等待

SUB下一級 MASK遮蔽->遮蔽暫存器

SRCPND顯然也是狀態暫存器,使得中斷源等待處理

MASK另一個遮蔽使能暫存器

Priority優先順序暫存器

INTPND看哪些中斷源還在等待

MODE 模式暫存器

IRQ FIQ直接送到CPU去

書上有詳細介紹

看一個程式首先看makefile

可以看出有四個檔案

接下來看程式碼

一上電跳轉到 Reset

可以看出每個異常向量相隔四個位元組,一般處理不在這四個位元組之內,所以用跳轉命令跳轉到別處。

比如說跳轉到Reset對應的程式

設定棧指標才能呼叫C函式,關看門狗等等

HandleUndef:

b    HandleUndef

此處為死迴圈,還沒進行處理

最後要設定總中斷I位使能

每個模式的r13記載著每個模式的棧指標。

通過給cpsr暫存器複製,進入中斷模式

進入每個模式的時候,要事先設定好棧指標

ldr sp, =3072

0xd2的值的意思可以在下表尋找

M0~M4代表不同的工作模式

I F位是全域性中斷,快中斷設定。

比如說一開始0xd2-----1101 0010禁止所有的中斷及快中斷

中斷初始化

INTMSK 使能中斷源中斷

發生中斷:

硬體

  1. 進入中斷模式,切換暫存器,其中最重要一個暫存器還有一個sp暫存器
  2. pc=IRQ入口地址

軟體:

sub lr,lr, #4

計算返回地址,當前lr值減去4,有ARM架構決定

  1. b handle IRQ 計算返回地址“被中斷處”的地址
  2. 儲存現場 暫存器
  3. 呼叫處理函式
  1. 分辨中斷
  2. 處理
  3. 清除
  1. 恢復被中斷程式

中斷服務程式

INTOFSET中斷源服務程式,判斷哪個按鍵按下

 ENTPND是中斷等待暫存器意味著正在處理中斷,清到可中斷狀態

最後跳轉PC回到中斷前程式位置。