在
x86 process switch 系列後, 我嘗試實作 arm cm3 的 process switch, 基本原理是一樣的, 不過 stack 處理可讓我傷透腦筋, 也才有
x86 process switch implementation (1.5) - save/restore in real mode 這篇, 算是意外的收穫, 腦筋只要動, 還是想得出方法。
不過這篇是在還沒想到之前寫的, 完成後固然開心, 但這不是在 arm cm3 的作法, 實際上的作法有點不同 (類似 1.5 那篇)。但是這方法很容易理解, 還是值得說明一下, 來看看沒有保存 stack 的作法。
source code:
https://github.com/descent/stm32f4_prog
git commit b78cb69ce5b61421d0ea865939a983930e1f3fea
一樣有兩個 stack frame (L94 ~ L102, L104 ~ L112), 保存 r0~r3, r12, lr, pc, psr, L33 ~ L53 把 lr, pc, psr, 設定好即可。在 int_isr 只要輪由切換 stack_frame_a, stack_frame_b 的位址到 sp 即可, 如何, 很簡單吧?
在 int_isr return 時, 會根據 stack frame pc 這欄位而跳到那裡執行。執行 svc 0 時, 會把下一個位址紀錄在 stack frame pc 這欄位。這是基本原理。
中斷時 stack 變化請參考 arm cortex-m3: 嵌入式系統設計入門 p9-2。lr 的值可參考 arm cortex-m3: 嵌入式系統設計入門 p9-7。
疑!你沒打算說明阿? 當然阿! 書上有的東西我幹嘛再打一次。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。