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



留言

熱門文章