2013年9月7日 星期六

作業系統之前的程式 for stm32f4discovery (4) - two stack

cm3 有 3 種工作模式, 開機位於 2。
  1. handle mode + privileged
  2. thread mode + privileged
  3. thread mode + unprivileged

雖然我英文不行, 但我實在被中文字困惑, 還是把這個術語的英文找出來, 閱讀整段英文對我來說並不容易, 但只記點單字倒還不是問題。

2.2 Privileged access and user access
Code can execute as privileged or unprivileged. Unprivileged execution limits or excludes access to some resources. Privileged execution has access to all resources.

Handler mode is always privileged. Thread mode can be privileged or unprivileged.

Thread mode is privileged out of reset, but you can change it to user or unprivileged by clearing the CONTROL[0] bit using the MSR instruction. User access prevents:

  • use of some instructions such as CPS to set FAULTMASK and PRIMASK
  • access to most registers in System Control Space (SCS).

When Thread mode has been changed from privileged to user, it cannot change itself back to privileged. Only a Handler can change the privilege of Thread mode. Handler mode is always privileged.

ref: Cortex-M3 TM Revision: r1p1 Technical Reference Manual 2.2

以上和本主題都無關, 我把主題放在這之後, 厲害吧!

這隻程式主要是使用 cm3 的 2 個 stack, 解釋使用 msp, psp 時, 這兩個 stack 如何變化。

two_stack.S
 1 # use msp, psp 2 stack
 2 
 3 .equ STACK_TOP, 0x20000800
 4 .text
 5 .global _start
 6 .code 16
 7 .syntax unified
 8 _start:
 9   .word STACK_TOP, start
10   .type start, function @ let lsb to 1
11   .word int_isr+1
12   .word int_isr+1
13   .word int_isr+1
14   .word int_isr+1
15   .word int_isr+1
16   .word int_isr+1
17   .word int_isr+1
18   .word int_isr+1
19   .word int_isr+1
20   .word int_isr+1 @ svc isr
21   .word int_isr+1
22   .word int_isr+1
23   .word int_isr+1
24   .word int_isr+1
25   .word int_isr+1
26   .word int_isr+1
27   .word int_isr+1
28 
29 start:
30   mrs r0, control @ read control to r0
31 
32   movs r0, #10
33 
34   ldr sp, =#msp_stack_top @ msp
35 
36   push {r0}
37 
38   ldr r0, =#psp_stack_top
39   msr psp, r0
40 
41   mov r0, #0x3
42   msr control, r0
43 
44   mrs r0, control
45 
46   push {r0}
47 
48   svc 0
49 
50 deadloop:
51   nop
52   b deadloop
53 
54 int_isr:
55   nop
56   movs r1, #0xf
57   push {r1}
58   bx lr
59 
60 .data
61 .space  0x200, 0
62 psp_stack_top:
63 
64 .space  0x400, 0
65 msp_stack_top:

34   ldr sp, =#msp_stack_top @ msp
開機時就會設定 msp, 不過這裡再設定一次

38   ldr r0, =#psp_stack_top
39   msr psp, r0
設定 psp

41   mov r0, #0x3
42   msr control, r0
從這裡之後, 藉由設定 control register, 會使用 psp, 並進入 thread/unprivileged mode。

before svc 0 (current is user access (thread/unprivileged) & use psp)

control        0x3    3 '\003'
msp 0x200005fc 0x200005fc
psp 0x200001fc 0x200001fc

after svc 0

control        0x1    1 '\001'
msp 0x200005fc 0x200005fc
psp 0x200001d8 0x200001d8

觀察 stack 變化, 使用 svc 跳到中斷常式後, 會 push 暫存器到 psp, 而在中斷常式會使用 msp 操作 stack。

在 L58 離開中斷常式後, psp 也回到原來值。

control        0x3    3 '\003'
msp            0x200005f8    0x200005f8
psp            0x200001fc    0x200001fc

再來的 stack 操作也是以 psp 為主。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。