可重入中斷

2021-08-16 10:10:39 字數 818 閱讀 9280

一、目的

對於arm9來說,進入irq後,會禁用irq,這個時候,即使有更高優先順序的中斷觸發,也是要等該中斷退出後才能響應,是不可重入的。本文旨在介紹可以被高優先順序中斷打斷的中斷程式,亦即可重入中斷。

二、原理

要做到可重入,必須開啟被禁用的中斷。但開啟後要面臨乙個問題,就是lr是會被中斷自動設定的,lr會被破壞,cpsr也是會被自動備份到cpsr_irq裡面去,cpsr_irq也會被破壞,所以,這兩個要先儲存到棧裡面去先,然後退出前恢復。老版本的r12用作ip,為了相容,也把它壓入棧。所以,備份工作就完成了。

然後是啟用中斷,根據apcs約定,r0~r3是臨時暫存器,是呼叫者不儲存的,所以,他們可能會被修改,所以也需要儲存。所以,有兩種方案來恢復現場:

a.儲存到當前模式的棧裡,再開中斷,結束後恢復;

b.開中斷,都儲存到另外的乙個模式的棧裡面,中斷者恢復,這個模式需要能設定cpsr;

三、實現

這裡僅對b方案進行實現,彙編**如下所示:

area interrupt, code, readonly

import c_func

sub lr, lr, #4

stmfd sp!, lr

mrs lr, spsr

stmfd sp!,

msr cpsr_c, #0x1f

stmfd sp!,

bl c_func

ldmfd sp!,

msr cpsr_c, #0x92

ldmfd sp!,

msr spsr, lr

ldmfd sp!, ^

可重入函式 可重入核心

可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...

可重入核心 可重入函式

可重入核心在ulk 深入理解linux核心 中的定義是指若干個程序可以同時在核心態下執行,也就是說多個程序可以在核心態下併發執行核心 在單處理器上,只能實現 微觀上的序列,巨集觀上的並行,即任意時刻,只有乙個進 正執行,其他程序處於阻塞或者等待狀態。這裡的可重入,是指可以多個程序進入核心,並不是重複...

可重入 不可重入

在任務執行期間捕捉到訊號並對其進行處理時,程序正在執行的指令序列就被訊號處理程式臨時中斷。如果從訊號處理程式返回,則繼續執行程序斷點處的正常指令序列,從重新恢復到斷點重新執行的過程中,函式所依賴的環境沒有發生改變,就說這個函式是可重入的,反之就是不可重入的。眾所周知,在程序中斷期間,系統會儲存和恢復...