記錄一下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告訴編譯器這個變數是易變的,必須每次使用都即時的去改變量的記憶體中讀取,...