最簡潔的中斷現場保護

2021-07-14 17:36:41 字數 1974 閱讀 8889

閱讀韋老師的中斷現場保護和恢復**,感覺下面紅色部分的**似乎用不到,因為恢復現場的時候,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...