公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

XMC实验分享之八十七: Cortex M的Stack Pointer

XMC实验分享之八十七: Cortex M的Stack Pointer

User12775
Level 5
Level 5
First solution authored First like received

接着上贴的话题继续聊,


有的工程师知道Cortex M内核有两个Stack Pointer, 有的不知道. 知道这两个Stack Pointer的也不一定对他们各自的特点完全掌握. 本贴简单分享下.


先概述下:

  1. MSP, PSP是两个物理上独立的寄存器, 通过SP或者R13能访问到其中一个,通过MSP, PSP的名字两者都可以访问

  2. 同一时刻内核使用其中之一作为Stack Pointer

  3. Handler模式永远使用MSP, Thread模式可以使用MSP,也可以使用PSP,由CONTROL寄存器来控制

  4. 复位后所有的Cortex M内核使用MSP, 处于Thread模式

  5. PSP一般用于RTOS隔离内核与用户任务(内核使用MSP, 用户任务使用PSP)

  6. 使用PSP不是强制的, 只是为隔离提供方便, 即使是有RTOS的应用, 也可以选择不使用PSP.

  7. Flash的第一个Word是MSP的初始值, 复位后硬件会将其装入MSP, PSP需要用户程序初始化. 因为硬件就配置好了初始的Stack Pointer. 所以Cortex M的启动程序完全可以使用C语言来编写.


某些工具生成的启动文件有装载MSP的语句, 纯属多余,可放心大胆删除掉.

/* ================== START OF VECTOR ROUTINES ============================= */

    .align    1
    .thumb

/* Reset Handler */
    .thumb_func
    .globl  Reset_Handler
    .type   Reset_Handler, %function
Reset_Handler:
    ldr sp,=__initial_sp

#ifndef __SKIP_SYSTEM_INIT
    ldr  r0, =SystemInit
    blx  r0
#endif


0 点赞
1085 次查看
2 评论