嵌入式Linux學習記錄之中斷

2021-10-09 09:44:10 字數 2258 閱讀 8928

記錄一下2020未來的廣交大的linux學習過程--簡化筆記

中斷向量偏移 

一般arm從0x0000 0000 位址開始執行,對於stm32設定連線首為0x8000 000。

如果**一定要從0x8000 000開始執行,需要告訴soc核心。也就是設定中斷向量偏移。設定scb的vtor暫存器為新的中斷向量表起始位址即可。

nvic中斷控制器

nvic就是中斷管理,使能和關閉指定的中斷,設定中斷優先順序

中斷服務函式的編寫

中斷服務函式就是中斷要做的事情。

cortex-a7中斷系統

1、cortex-a中斷向量表

cortex-a中斷向量表有8個中斷向量,重點是irq中斷,需要使用者自己定義

2、中斷向量偏移

裸機歷程都是從0x878 000 00 開始的,因此要設定中斷向量偏移。

3、gic中斷控制器

同nvic一樣,gic用於管理cortex-a中的中斷,gic提供了開關中斷,設定中斷優先順序

4、imx6u中斷號

不同的中斷有不同的中斷號,最多1020個中斷訊號

sgi : id0~5 

ppi : id16~31 

spi : id31~1019   按鍵中斷、串列埠中斷    p184

6ull   128個中斷

5、中斷服務函式的編寫

乙個是irq中斷服務函式的編寫,另乙個就是在irq中斷服務函式裡面去查詢並執行的具體的外設中斷服務函式。

中斷實驗編寫

1、編寫按鍵中斷歷程

key0使用uart1_cts這個io,編寫uart1_cts的中斷**

2、修改start.s

新增中斷向量表,編寫復位中斷服務函式和irq中斷服務函式

編寫復位中斷服務函式,內容如下:

關閉i.d cache 和mmu

1、設定處理器9種工作模式下對應的sp指標。使用中斷必須設定irq模式下的sp指標。索性直接設定所有模式下的sp指標。

2、清除bss段。

3、跳到c函式(main函式)

3、cp15協處理器

mrc: 將 cp15 協處理器中的暫存器資料讀到 arm 暫存器中。

mcr: 將 arm 暫存器的資料寫入到 cp15 協處理器暫存器中。

mrc 就是讀 cp15 暫存器,mcr 就是寫 cp15 暫存器,mcr 指令格式如下:

mcr p15, , , , ,

mrc p15, 0 , r0 , c0 , c0 , 0

開啟corzhogn'udantex-a7參考手冊到105頁,找到sctlr暫存器,也就是系統控制暫存器。此暫存器bit0用於開啟和關閉mmu,bit1對齊控制位,bit2控制d cache的開啟和關閉,bit11用於控制分支**,bit12用於控制icache。

將新的中斷向量表首位址寫入cp15協處理器的vbar暫存器

mrc p15, 0, r0, c12,c0,0    //讀取vbar暫存器

mcr p15, 0, r0, c12,c0,0    //寫vbar暫存器

irq中斷服務函式

mrc p15, 4, r1, c15, c0, 0 // 從cp15的c0暫存器內的值到r1暫存器中 

讀取cp15的cbar暫存器。cbar暫存器儲存了gic控制器的暫存器組首位址。gic暫存器組偏移0x1000~0x1fff為gic的分發器。0x2000~0x3fff為cpu介面段。

**中,r1暫存器儲存著gic控制器的cpu介面端基位址。讀取cpu介面段的gicc_iar暫存器的值儲存到r0暫存器中。可以從gicc_iar的bit9~0讀取中斷id,讀取中斷id的目的就是得到對應的中斷處理函式。

system_irqhandler就是具體的中斷處理函式,此函式有乙個引數,為gicc_iar暫存器的值。

system_irqhandler處理完具體的中斷以後,需要將對應中斷id的值寫入gicc_eoir暫存器裡面

6ull  gpio中斷設定

1、先設定gpio的中斷觸發方式,就是gpio_icr1或icr2暫存器。觸發方式有低電平、高電平、上公升沿和下降沿。我們設定key0=uart1_cts為下降沿觸發。

2、設定gpio對應的中斷,設定gpio_imr暫存器

3、處理完中斷後,需清除中斷標誌位,就是清除gpio_isr暫存器相應的位。

gpio_isr暫存器寫1清零。

gic配置

1、使能相應的中斷id。gpio1_io18對應的中斷id位67+32=99

2、設定中斷優先順序

3、註冊gpio1_io18的中斷處理函式

嵌入式中斷

interrupt double compute area double radius 這個函式有太多的錯誤了,以至讓人不知從何說起了 1 isr 不能返回乙個值。如果你不懂這個,那麼你不會被雇用的。2 isr 不能傳遞引數。如果你沒有看到這一點,你被雇用的機會等同第一項。3 在許多的處理器 編譯器...

嵌入式linux中斷淺解

本文簡單理一下嵌入式linux對於arm系列soc的中斷管理。我將嵌入式linux的中斷分為了3個級別,分別是 1.cpu級 嵌入式linux只使用了arm的irq中斷,當發生乙個irq時,cpu會自動執行0x00000018 低端向量模式 或0xffff0018 高階向量模式 處的指令,此處一般放...

嵌入式學習記錄

1.volatile volatile是宣告該變數是易變的,編譯器把常用的值放在暫存器裡了,所以用的時候,直接在暫存器裡取上一次用的值了 可是因為這個變數是易變的,所以可能這有暫存器的優化處理會帶來錯誤,因此加上volatile告訴編譯器這個變數是易變的,必須每次使用都即時的去改變量的記憶體中讀取,...