本文主要說明了在uboot中新增fiq中斷時遇到的問題以及對應的解決辦法。
問題:
一、發生fiq中斷之後處理器做了哪些事情?
發生中斷之後arm處理器需要處理完當前的指令,然後自動完成以下事情:
1.將當前程式狀態暫存器cpsr儲存到fiq模式下的備份程式狀態暫存器spsr_fiq之中(執行中斷返回時其逆過程不能自動完成)。
2.將程式計數器pc(r15)值減4存入fiq模式下的鏈結暫存器r14_fiq之中(也就是lr)。
3.將pc的值強制改為ox0000001c(異常向量表中fiq的入口位址),並跳轉到該位址執行。
說明:1.arm處理器定義了undefined_instruction(0x00000004)、software_interrupt(0x00000008)、prefetch_abort(0x0000000c)、data_abort(0x00000010)、irq(0x00000018)、fiq(0x0000001c)等幾種異常,當異常發生時,晶元會自動完成上述操作並跳轉到相應的位址去執行,其中晶元上電後自動跳轉至0x00000000這個位址執行,一般會在這些異常的位址處存放跳轉指令,以實現後續的操作。
1其中start_code為啟動**。_start: b start_code
2ldr pc, _undefined_instruction
3ldr pc, _software_interrupt
4ldr pc, _prefetch_abort
5ldr pc, _data_abort
6ldr pc, _not_used
7ldr pc, _irq
8 ldr pc, _fiq
二、跳轉至異常向量表後需要做那些事情?
處理器將pc強制指向0x0000001c之後,再次跳轉至_fiq標號處,接下來使用者需要編寫程式完成以下事情:
1.計算程式的返回位址。因為arm9採用5級流水線結構,且程式的執行階段處在流水線的第3級,那麼pc始終指向正在執行指令的下兩條指令處,也就是正在執行的指令位址為pc-8(程式向高位址方向執行)。由於fiq發生時處理器會處理完正在執行的指令,這時pc值也被更新,也就是pc=pc+4,然後處理器自動將pc值減4存入r14_fiq暫存器之中。程式返回的位址應該是fiq發生時正在處理的指令的下一條指令處,所以將r14_fiq中的位址減4就是程式應該返回的位址。
2.根據需要,有選擇地儲存暫存器lr(使用bl指令時會更改該值)、r0-r12(均為通用暫存器,若被更改則無法恢復至fiq發生前的狀態,一般將這些暫存器的值進行入棧保護,這就要求事先在啟動**中設定fiq模式的堆疊)。
4.在執行完中斷處理函式之後,需要將lr、r0-r12出棧恢復。
5.將lr的值傳遞給pc,跳轉至fiq發生時的下一條指令(使用subs pc, lr, #0的目的是為了將spsr_fiq中的值恢復至cpsr中)。
1三、中斷處理函式的位置?處理器在上電之後跳轉至啟動**處執行,按順序進行相關暫存器及外設的初始化工作。在arch\arm\lib\board.c的board_init_r( )函式的末尾開啟fiq中斷,此時處理器的初始化工作已經完成且已處於c語言環境。fiq:
2 subs lr, lr, #4
3 stmfd sp!,
4bl roger_test
5 ldmfd sp!,
6 subs pc, lr, #0
u boot中新增命令
看下ping命令實現的例子 檔案common cmd net.c static int do ping cmd tbl t cmdtp,int flag,int argc,char const argv printf host s is alive n argv 1 return 0 u boot ...
U boot中mtdparts命令新增
在自己開發板的配置標頭檔案下面新增如下幾條語句就可以用kernel代替你的具體分割槽表,下面語句沒有其他的作用,就是為了方便你不用記那些位址範圍,省去了不少事情。在在arch arm lib board.c 中for 前面新增run command mtdparts default 0 define...
在U boot 1 3 4中新增加命令
前言 qljt跟u boot的makefile裡面開發商相對應 qljt2440是我開發板的名字 原理 每個命令都有乙個命令結構體 struct cmd tbl s 去定義它。cmd為要呼叫的命令函式!name為該命令名字串,不要用 括起來,不要與現有函式同名。在u boot裡面有這樣的巨集 def...