zoukankan      html  css  js  c++  java
  • Cortex-M3双堆栈MSP和PSP+函数栈帧

    为了防止几百年以后找不到该文章,特此转载

    ------------------------------------------------开始转载---------------------------------------------------------------------------------------------------

    什么是栈?
    在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。
    栈的作用?
    局部变量内存的开销,函数的调用都离不开栈。

    了解了栈的概念和基本作用后我们来看M3的双堆栈
    cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。
    MSP的含义是Main_Stack_Pointer,即主栈
    PSP的含义是 Process_Stack_Pointer,即任务栈
    SP:SP是堆栈指针,指向最后一个被压入元素的地址。
    M3的压栈和弹栈过程:
    压栈:SP先自减4,然后将待压入的数据存放到SP所指的地址
    弹栈:从SP指针所指的地址读出数据,然后SP指针自增4。
    为什么压栈SP自减,弹栈SP自增呢?这是因为M3内核堆栈生长方向是向下的。为什么压栈和弹栈分别是减4加4呢?这是因为M3是32bit的内核。
    M3内核何时使用MSP何时使用PSP?
    M3双堆栈的意思是有两个堆栈,但是任何时刻只能使用其中之一。那什么时候使用MSP,什么时候使用PSP呢?也就是说SP寄存器中的值在某一时刻到底是使用MSP的值还是PSP的值?这是根据CONTROL寄存器的bit1来决定的。当CONTROL的bit1为0使用MSP(默认方式);当CONTROL的bit1为1使用PSP。

     

    总结:CONTROL的bit1为0,SP = MSP
    CONTROL的bit1为1,SP = PSP
    M3复位后处于线程模式特权级,默认使用MSP。
    通过配置CONTROL寄存器的bit1位就可以决定SP使用MSP还是PSP。
    在裸机开发中,CONTROL的bit1始终是0,也就是说裸机开发中全程使用程MSP,并没有使用PSP。在执行后台程序(大循环程序)SP使用的是MSP,在执行前台程序(中断服务程序)SP使用的是MSP。
    在OS开发中,当运行中断服务程序的时候CONTROL的bit1是0,SP使用的是MSP;当运行线程程序的时候CONTROL的bit1是1,SP使用的是PSP。
    ————————————————
    版权声明:本文为CSDN博主「zhaodong1102」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zhaodong1102/article/details/105514284/

    -----------------------------------------------结束转载---------------------------------------------------------------------------------------------------

    看下图,提出我的问题==》 汇编启动文件内定义了栈大小,对应这个栈,会在哪些场景下被使用呢?

    根据上面转载的博客,我的理解是:

    裸机工程,全程使用MSP,这里对应的栈肯定就是MSP(因为没跑RTOS,其他地方不会再自定义栈了)。发生中断、 函数调用等,都是用的这个栈。

    RTOS上,当运行中断服务程序的时候,使用的是MSP,应该对应的就是这个栈;而当运行线程程序的时候,使用的是PSP,PSP会指向自己定义的任务栈,所以在任务内进行函数调用,会入栈至自定义的任务栈。

    刚进入main函数后,不同的RTOS,应该还是有些区别:

    1.RT-Thread内会重定义main,用户使用的main入口是main线程,所以在这个main入口函数内调用函数时,栈指针SP指向的是PSP,即会入栈至main的任务栈内。

    2.FreeRTOS内未重定义main,用户使用的main入口就是原生从汇编刚跳转出来的main入口,若在这个main入口函数内调用函数,

           且多任务相关代码还未跑起来时,CONTROL的bit1应该如上图所示,是复位后的缺省值,即会使用MSP,即该汇编启动文件内的栈。

    一句话,启动文件内的设置的栈对应的就是MSP指向的栈, MSP、PSP分别会在哪些场景下被使用呢,如上所述。

    部分验证思路:

    对于进入任务栈的情况,可以打印下任务栈数组,结合函数栈帧的知识一起分析,加深理解。

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    asp:时间的计算
    彻底理解position与anchorPoint
    关于写代码的一些心得总结2014-12-28 23:49:39
    C#如何将线程中的代码抛到主线程去执行
    pac 文件使用到的javascript函数
    webview改变网页宽度
    iOS按钮长按
    ios 页面滑入滑出
    UILable自适应frame
    制作静态库文件(.a文件)
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/13021869.html
Copyright © 2011-2022 走看看