我正在使用包含cortex-M4處理器的EK-LM4F120XL開發板。我也使用GCC-ARM-none-eabi作爲工具鏈。強制函數在進行函數調用之前恢復所有寄存器
我正在建立一個小型的愛好項目,它慢慢變成了一個操作系統。其中一個重要部分是我需要切換寄存器來切換進程。這發生在一箇中斷內部,這個特定的處理器確保所有的臨時寄存器(r0-r3,r12,lr)被推送到進程堆棧。因此,爲了繼續,我需要將r4-r11和SP的內容寫入內存中,我需要加載新進程的r4-r11,加載它的堆棧指針並返回。另外,lr值包含有關被中斷的進程的一些信息,所以我也需要來自該寄存器的信息。
所有這些工作,因爲我在彙編寫它。我將彙編函數直接鏈接到中斷,所以我完全可以控制寄存器發生了什麼。 C和內聯彙編的組合不起作用,因爲編譯器通常會將一些寄存器推送到堆棧,這是致命的。但操作系統正在不斷增長,環境變化也在不斷增長:現在還有一些需要改變的全局變量等等。所有這些在彙編中都是可行的,但是它成爲一個痛苦:程序集很難讀取和調試。所以我想要一個C/Assemlby組合。基本上我正在尋找類似這樣的東西:
void contextSwitch(void){
//Figure out what the next process will be
//Change every variable that needs changing
// Restore register state to the moment of interrupt. The following function will not return in the sense that it will end the interrupt.
swapRegisters(oldProc, newProc);
}
然後在彙編中只寫入swapRegisters。有沒有辦法做到這一點?我的解決方案是最好的解決方案嗎?
您正在編寫一個操作系統內核。這真的很難,尤其是中斷驅動程序。我不確定任何人都可以通過博客做什麼,甚至不知道你確切的問題是什麼。 –
你的意思是我的問題不清楚? – Cheiron
您的內核條目可以將所有寄存器保存到內存中,所以C端只需操作內存。出口然後恢復它。入口/出口處於組裝狀態。 – Jester