版本 2f57dbb3ecf7b860dd26736152f3a13170aa2b72
rtenv-plus
HackPad 共筆<https://embedded2014.hackpad.com/Rtenv-plus-0VHEYKBpr3D>
_
組員
楊震 / <Omar002<https://github.com/Omar002/rtenv-plus/>
_>
丁士宸 / <Stanley Ding<https://github.com/StanleyDing/rtenv>
_>
程政罡 / <marktwtn<https://github.com/marktwtn/rtenv-plus>
_>
李昆憶 / <LanKuDot<https://github.com/LanKuDot/rtenv-plus>
_>
鄭聖文 / <Shengwen<https://github.com/shengwen1997/>
_>
作業系統架構
Context Switch
activate
- 功能: 將部分 general-purpose registers push 到 Main Stack 中保存,再將 Process Stack 中的所存的值 pop 到部分 general-purpose registers。
.. code-block:: c
activate:
41 /* save kernel state */
42 mrs ip, psr
43 push {r4, r5, r6, r7, r8, r9, r10, r11, ip, lr}
44
45 /* switch to process stack pointer */
46 msr psp, r0
47 mov r0, #3
48 msr control, r0
49
50 /* load user state */
51 pop {r4, r5, r6, r7, r8, r9, r10, r11, lr}
52 pop {r7}
53
54 bx lr
指令介紹:
mrs Rd, PSR
及msr PSR, Rd
:Rd 為 general-purpose registers,PSR 為 program status registers。mrs Rd, PSR
可以將 PSR 的值寫到 Rd,而msr PSR, Rd
則是將 Rd 值寫到 PSR 裡。運作:
- L42,43:將
psr
(process status register) 的值保存到ip
(r12) 裡,然後一同 push 到 main stack 裡。 - L46:將
r0
所帶的值寫入到psp
(process stack pointer),注意呼叫 activate 所放的參數就是該 task 之 task_control_block 中 stack 的 address。 - L47,48:將
control
register 的值設為 3,藉此可以將 stack pointer 轉為指向 process stack (使 sp 值為 psp)。所以藉由sp
可以存取其 stack 的內容。 - L51:將
user_thread_stack
的 register 依序 pop 到 r4~r11 及lr,也是為何user_thread_stack
的前9個 register 設計為 r4~r10、fp、_lr。 - L52:再將
user_thread_stack
的_r7
pop 到r7
,達成傳遞 syscall 的功能。 - 所以除了 r0~r3 及 ip、sp、pc、cpsr 之外,都被換成 user-mode 的 register 了。
- L42,43:將
硬體驅動原理
USB OTG</embedded/OTG>
_