2012-03-27 126 views
0

我有關於上下文切換的內聯彙編指令的另一個問題。此代碼可能工作,但我不知道在100%,所以我提交此代碼的專業人士的計算器;-)使用ARM內聯彙編的上下文切換

我編譯使用gcc(無優化)的arm7TDMI。在某些時候,代碼必須執行上下文切換。

/* Software Interrupt */ 
/* we must save lr in case it is called from SVC mode */ 
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr") 
// Note : code = 0x23 

當我檢查編譯後的代碼,我得到這樣的結果:

svc 0x00000023 

誰編碼這個寫道:「我們必須拯救LR」,但在編譯的代碼,我不知道我之前的人看到任何被保存的痕跡。

我認爲代碼可能是錯的原因是,再進一個復位異常和代碼執行的最後一件事一個是上下文切換一段時間運行的程序......

回答

0

__asm__聲明列出lr作爲破碎的寄存器。這意味着如果編譯器需要,它將保存寄存器。由於你沒有看到任何保存,我認爲你可以假定編譯器沒有使用該寄存器(至少在你的測試用例中)。

0

我認爲應該在用戶模式下調用SWI指令。如果這是對的。此指令後,ARM的模式切換到SVC模式。那麼ARM內核會執行將CPSR複製到SPSR_svc中的複製操作,並將LR複製到LR_svc中。這應該用於保存用戶模式cpu的上下文以從svc模式返回。如果你的svc異常處理程序使用lr就像調用另一個函數一樣,那麼lr寄存器應該被要求保存,就像在模式更改之間使用堆棧一樣。我想在你寫這樣的人之前先談談這種情況。