日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【ARM】Tiny4412裸板编程之异常

發(fā)布時間:2024/4/24 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【ARM】Tiny4412裸板编程之异常 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 開發(fā)環(huán)境
    • 02. 概述
    • 03. ARM處理器模式
    • 04. 異常類型
    • 05. 異常處理
      • 5.1 異常處理偽代碼
      • 5.2 復(fù)位異常
      • 5.3 未定義指令異常
      • 5.4 軟中斷異常
      • 5.5 預(yù)取異常
      • 5.6 數(shù)據(jù)異常
      • 5.7 外部中斷異常
      • 5.8 快速中斷異常
    • 06. FIQ 與 IRQ 比較
    • 07. 附錄

01. 開發(fā)環(huán)境

  • 開發(fā)板:Tiny4412SDK標(biāo)準(zhǔn)版 「Tiny4412 SDK 1506」
  • 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
  • 平臺:Ubuntu 20.04

02. 概述

  • CPU 在執(zhí)行當(dāng)前程序的過程中因硬件或軟件的原因插入了另一段程序運(yùn)行的過程。
  • 硬件引起的中斷不可預(yù)測,隨機(jī)性。
  • 軟中斷:事先在程序中安排特殊指令,CPU 執(zhí)行到該類指令時,轉(zhuǎn)去執(zhí)行相應(yīng)的一段預(yù)先安排好的程序,然后再返回來執(zhí)行原來的程序。

03. ARM處理器模式

B1.3.1 ARM processor modes

04. 異常類型

常用的有以下幾種異常:

  • 復(fù)位異常(Reset)
  • 數(shù)據(jù)異常(Data Abort)
  • 快速中斷異常(FIQ)
  • 外部中斷異常(IRQ)
  • 預(yù)取異常(Prefetch Abort)
  • 軟中斷異常(SWI)
  • 未定義異常(Undefined interrupt)

B1.8.1 Exception vectors and the exception base address

05. 異常處理

5.1 異常處理偽代碼

R14_<exception_mode> = return link SPSR_<exception_mode> = CPSR CPSR[4:0] = exception mode number CPSR[5] = 0 /*進(jìn)入 ARM 狀態(tài)*/ If <enception_mode> == reset or FIQ thenCPSR[6] = 1 /*屏蔽快速中斷 FIQ*/CPSR[7] = 1 /*屏蔽外部中斷 IRQ*/ PC = exception vector address

5.2 復(fù)位異常

當(dāng)處理器復(fù)位引腳有效時,系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行,復(fù)位異常中斷通常用于系統(tǒng)上電和系統(tǒng)復(fù)位兩種情況。

步驟

  • 設(shè)置異常中斷向量表

  • 初始化數(shù)據(jù)棧和寄存器

  • 初始化存儲系統(tǒng),如系統(tǒng)中的 MMU

  • 初始化關(guān)鍵的 I/O 設(shè)備

  • 使能中斷

  • 處理器切換到合適的模式

  • 初始化C變量,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行

處理偽代碼

R14_svc = UNPREDICTABLE value SPSR_svc = UNPREDICTABLE value CPSR[4:0] = 0B10011 /*進(jìn)入特權(quán)模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 態(tài)*/ CPSR[6] = 1 /*禁止快速中斷*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff0000 ElsePC = 0x00000000

5.3 未定義指令異常

當(dāng) ARM 處理器執(zhí)行協(xié)處理器指令時,它必須等待一個外部協(xié)處理器答應(yīng)后,才能真正執(zhí)行這條指令。若協(xié)處理器沒有響應(yīng),則發(fā)生未定義指令異常。未定義指令異常可用于在沒有物理協(xié)處理器的系統(tǒng)上,對協(xié)處理器進(jìn)行軟件仿真,或通過軟件仿真實現(xiàn)指令集擴(kuò)展。

步驟

  • 將仿真程序入口地址鏈接到向量表中未定義指令異常中斷入口處(0x00000004 或 0xffff0004),并保存原來的中斷處理程序

  • 讀取該未定義指令的 bits[27:24],判斷其是否是一條協(xié)處理器指令。如果 bits[27:24]值為 0b1110 或 0b110x,則該指令是一條協(xié)處理器指令;否則由軟件仿真實現(xiàn)協(xié)處理器功能,可以通過 bits[11:8] 來判斷要仿真的協(xié)處理器功能(類似于 SWI 異常實現(xiàn)機(jī)制)

  • 如果不仿真該未定義指令,則程序跳轉(zhuǎn)到原來的未定義指令異常中斷的中斷處理程序行

處理偽代碼

r14_und = address of next instruction after the undefined instruction SPSR_und = CPSR CPSR[4:0] = 0b11011 /*進(jìn)入未定義指令模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 狀態(tài)*/ /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff00004 ElsePC = 0X00000004

5.4 軟中斷異常

這是一個由用戶定義的中斷指令(SWI)。該異常由執(zhí)行 SWI 指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作指令。在實時操作系統(tǒng)中可以通過該機(jī)制實現(xiàn)系統(tǒng)功能調(diào)用。

處理偽代碼

r14_svc = address of next instruction after the SWI instruction SPSR_und = CPSR CPSR[4:0] = 0b10011 /*進(jìn)入特權(quán)模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 態(tài)*/ /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff000C ElsePC = 0x0000000C

5.5 預(yù)取異常

預(yù)取異常是由系統(tǒng)存儲器報告的。當(dāng)處理器預(yù)取的指令的地址不存在,或者該地址不允許當(dāng)前指令訪問(權(quán)限不夠)時,將產(chǎn)生預(yù)取異常。

如果系統(tǒng)中不包含 MMU,指令預(yù)取異常中斷處理程序只是簡單地報告錯誤并退出;若包含 MMU,引起異常的指令的物理地址被存儲到內(nèi)存中。

處理偽代碼

r14_svc = address of the aborted instruction + 4 SPSR_und = CPSR CPSR[4:0] = 0b10111 CPSR[5] = 0 /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff000c ElsePC = 0x0000000c

5.6 數(shù)據(jù)異常

數(shù)據(jù)異常是由存儲器發(fā)生數(shù)據(jù)中止信號,它由存儲器訪問指令 Load/Store 產(chǎn)生。

當(dāng)數(shù)據(jù)訪問指令的目標(biāo)地址不存在,或者該地址不允許當(dāng)前指令訪問(權(quán)限不夠)時,將產(chǎn)生數(shù)據(jù)訪問中止異常。

產(chǎn)生數(shù)據(jù)訪問中止異常時,寄存器的值修改規(guī)則

  • r14 的值只與發(fā)生數(shù)據(jù)異常的指令地址有關(guān),與 PC 值無關(guān)

  • 如果指令中沒有指定基址寄存器回寫,則基址寄存器的值不變

  • 如果指令中指定了基址寄存器回寫,則寄存器的值和具體芯片的 Abort Models 有關(guān),由芯片的生成商指定

  • 如果指令只加載一個通用寄存器的值,則通用寄存器的值不變

  • 如果是批量加載指令,則寄存器中的值不可預(yù)知

  • 如果指令加載協(xié)處理器寄存器的值,則被加載寄存器的值不可預(yù)知

處理偽代碼

r14_abt = address of the aborted instruction + 8 SPSR_abt = CPSR CPSR[4:0] = 0b10111 CPSR[5] = 0 /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff0010 ElsePC = 0x00000010

5.7 外部中斷異常

當(dāng)處理器的外部中斷請求引腳有效,而且 CPSR 的寄存器的 I 控制位被清除時,處理器產(chǎn)生外部中斷請求異常中斷。系統(tǒng)中各外設(shè)通過該異常中斷請求處理服務(wù)。

處理偽代碼

r14_abt = address of the next instruction to be executed + 4 SPSR_irq = CPSR CPSR[4:0] = 0b10010 /*進(jìn)入特權(quán)模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 狀態(tài)*/ /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff0018 ElsePC = 0x00000018

5.8 快速中斷異常

當(dāng)處理器的外部快速中斷請求引腳有效,而且 CPSR 的 F 控制位被清除時,處理器產(chǎn)生外部快速中斷請求異常中斷。

處理偽代碼

r14_abt = address of the next instruction to be executed + 8 SPSR_fiq= CPSR CPSR[4:0] = 0b10001 /*進(jìn)入FIQ模式*/ CPSR[5] = 0 CPSR[6] = 1 CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff001c ElsePC = 0x0000001c

06. FIQ 與 IRQ 比較

相同點

都只是普通中斷:

當(dāng)我們程序定義了該中斷,并且在程序運(yùn)行的時候產(chǎn)生了 IRQ/FIQ 中斷,則此時的芯片運(yùn)行過程:①中斷處理器利用IRQ請求線來告訴ARM,②ARM切換到 IRQ/FIQ 模式運(yùn)行

不同點

FIQ 速度快,IRQ 速度慢,主要原因:

  • FIQ模式提供了更多的寄存器,r8-r14 和 SPSR,而 IRQ 模式只有 r13-r14 和 SPSR,這就意味著在ARM的IRQ模式下,中斷處理程序自己要保存R8到R12這幾個寄存器,然后退出中斷處理時程序要恢復(fù)這幾個寄存器,而FIQ模式由于這幾個寄存器都有banked寄存器,模式切換時CPU自動保存這些值到banked寄存器,退出FIQ模式時自動恢復(fù),所以這個過程FIQ比IRQ快.不要小看這幾個寄存器,ARM在編譯的時候,如果你FIQ中斷處理程序足夠用這幾個獨(dú)立的寄存器來運(yùn)作,它就不會進(jìn)行通用寄存器的壓棧,這樣也省了一些時間。
  • FIQ 比 IRQ 有更高優(yōu)先級,如果 FIQ 和 IRQ 同時產(chǎn)生,那么 FIQ 先處理。
  • 在symbian系統(tǒng)里,當(dāng)CPU處于FIQ模式處理FIQ中斷的過程中,預(yù)取指令異常,未定義指令異常,軟中斷全被禁止,所有的中斷被屏蔽。所以FIQ就會很快執(zhí)行,不會被其他異常或者中斷打斷,所以它又比IRQ快了。而IRQ不一樣,當(dāng)ARM處理IRQ模式處理IRQ中斷時,如果來了一個FIQ中斷請求,那正在執(zhí)行的IRQ中斷處理程序會被搶斷,ARM切換到FIQ模式去執(zhí)行這個FIQ,所以FIQ比IRQ快多了。
  • 另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。寫過完整匯編系統(tǒng)的都比較明白這點的差別,18只能放一條指令,為了不與1C處的FIQ沖突,這個地方只能跳轉(zhuǎn),而FIQ不一樣,1C以后沒有任何中斷向量表了,這樣可以直接在1C處放FIQ的中斷處理程序,由于跳轉(zhuǎn)的范圍限制,至少少了一條跳轉(zhuǎn)指令。
  • 07. 附錄

    6.1 ARM? Architecture Reference Manual ARMv7-A and ARMv7-R edition

    總結(jié)

    以上是生活随笔為你收集整理的【ARM】Tiny4412裸板编程之异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。