RTOS - Multitask
收錄於 : 關於Ameba的一百篇
續前篇 : RTOS - context switch-svc
1. svc_handler :
"msr psr, ip" => "msr psr
program status register
activate : 多了 isb
拿掉在此實驗也是可以的
2. hackpad
embedded 2016
3. psp
程式中, 用 usertasks[] 來儲存目前 task 的 task;
可以這樣寫是因為 r0 在 ARM 架構, 是 function 一開始的參數, 同時也是回傳值.
所以也就是 在 activate() -> syscall() -> svc_handler()
r0 為 stack push 後的 pointer 值
usertasks[current_task] = activate(usertasks[current_task]);
(1) 是否可以在 main(), 直接 usertasks[current_task] = __get_PSP() ?
在 svc_handler() , r0 回傳值是 push 後的. 但因為用 stmdb, psp 值並不會改變.
所以 回傳值 和 PSP 位置相差 9 * 4bytes = 36 bytes
而我們在 activate 需要得到 lr 值 (EXC_RETURN), 所以指摽得用 r0
// save user state
"mrs r0, psp \n\t"
"stmdb r0!, {r4, r5, r6, r7, r8, r9, r10, r11, lr} \n\t"
(2) 中斷後不是 會把 值 pop 出來嗎?其中包含 r0 呀
pop 動作是在 EXC_RETURN 時, 也就是要做到 activate 時才會動作
stack 狀態 : 參考 上述 hackpad
執行結果:
程式: github source
續前篇 : RTOS - context switch-svc
1. svc_handler :
"msr psr, ip" => "msr psr
program status register
activate : 多了 isb
拿掉在此實驗也是可以的
2. hackpad
embedded 2016
3. psp
程式中, 用 usertasks[] 來儲存目前 task 的 task;
可以這樣寫是因為 r0 在 ARM 架構, 是 function 一開始的參數, 同時也是回傳值.
所以也就是 在 activate() -> syscall() -> svc_handler()
r0 為 stack push 後的 pointer 值
usertasks[current_task] = activate(usertasks[current_task]);
(1) 是否可以在 main(), 直接 usertasks[current_task] = __get_PSP() ?
在 svc_handler() , r0 回傳值是 push 後的. 但因為用 stmdb, psp 值並不會改變.
所以 回傳值 和 PSP 位置相差 9 * 4bytes = 36 bytes
而我們在 activate 需要得到 lr 值 (EXC_RETURN), 所以指摽得用 r0
// save user state
"mrs r0, psp \n\t"
"stmdb r0!, {r4, r5, r6, r7, r8, r9, r10, r11, lr} \n\t"
(2) 中斷後不是 會把 值 pop 出來嗎?其中包含 r0 呀
pop 動作是在 EXC_RETURN 時, 也就是要做到 activate 時才會動作
stack 狀態 : 參考 上述 hackpad
執行結果:
程式: github source
留言
張貼留言