閱讀韋老師的中斷現場保護和恢復**,感覺下面紅色部分的**似乎用不到,因為恢復現場的時候,lr的內容早就放在堆疊裡面,並且要推送到pc了,我把下面**的紅色部分去掉,做實驗,可以順利進出中斷,可見這幾句話對中斷現場的保護和恢復沒起到作用的,修改後的**我用藍色字型標出,是保護現場需要的最小系統。順便提一下,arm中的pc暫存器並不是代表當前執行的指令位址,而是取指位址,因為arm採取流水線技術,同乙個時間pc在取指,pc-4在解碼,pc-8在執行,如果中斷發生,正在執行的指令要執行完,這是原子操作,不可打斷的,然後才跳入0x00000018(中斷向量入口pc),所以如果要恢復現場,就必須跳回剛剛執行的指令的下一條指令,也就是pc-4,我們的lr暫存器起到的作用就是連線作用,什麼連線呢?中斷發生瞬間的pc值記錄到lr中,以便於中斷處理完後能恢復到下一條指令去,這就是中斷處理前與處理後的連線關係。通過上述討論,我們發現,
sub lr,lr,#4 可以這樣替換:
sub lr,pc,#4,我用實驗驗證了一下,兩者完全等價。
原來的**:
handleirq: @handleirq開始的**用於處理中斷
sub lr,lr,#4 @計算中斷處理完畢後的返回位址
s***b sp!, @儲存使用到的暫存器
ldr lr,=int_return @設定呼叫isr即eint_handle函式後的返回位址
ldr pc,=eint_handle @呼叫中斷服務函式,在interrupt.c中
int_return:
ldmia sp!,^ @中斷返回,^表示將spsr的值複製到cpsr
修改後的**:
handleirq: @handleirq開始的**用於處理中斷
sub lr,lr,#4 @計算中斷處理完畢後的返回位址
s***b sp!, @儲存使用到的暫存器
bl eint_handle @呼叫中斷服務函式,在interrupt.c中
ldmia sp!,^ @中斷返回,^表示將spsr的值複製到cpsr
也可以是:
handleirq: @handleirq開始的**用於處理中斷
sub lr,pc,#4 @計算中斷處理完畢後的返回位址
s***b sp!, @儲存使用到的暫存器
bl eint_handle @呼叫中斷服務函式,在interrupt.c中
ldmia sp!,^ @中斷返回,^表示將spsr的值複製到cpsr
117 描述函式呼叫的現場保護和現場恢復
首先進入主函式,系統為主函式開闢乙個棧幀,依次入棧 x 10 佔4位元組 y 20 佔4位元組 z 0 佔4位元組 執行到z fun x,y 呼叫子函式fun,開闢子函式fun的棧幀,先將y的值賦值給b,b 20入棧,然後將x的值賦值給a,a 10入棧,然後將主函式的棧底指標入棧,然後將主函式z f...
最簡潔的堆排序實現
public class sort heapsort arr for int i 0 i arr.length i public static void heapdown int array,int parent,int length array parent temp public static ...
最簡潔的kafka開發例項
1.如何啟動kafka?2.如何通過 實現生產者例子 3.如何通過 實現消費者例子?1.啟動kafka。啟動zookeeper server 用 是為了能退出命令列 bin zookeeper server start.sh config zookeeper.properties 啟動kafka s...