历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2018年12月03日 | STM32双堆栈及其在uC/OS-II中的使用

2018-12-03 来源:eefocus

说明:里面可能有不少错误的观念,希望大家发现后及时的纠正。


首先了解一下双堆栈的知识,下面的图片来自《Cortex-M3权威指南》,有点枯燥,但还是要看的。


1

2

3  

345

4

5

6

789

101112

1314


总结:


1.系统复位后默认使用的是MSP,复位后的状态是特权级线程状态,在这个状态下是允许修改寄存器CONTROL[1](见上面的图片)的。进入到用户特权以后就不能修改这些寄存器了。


2.用户特权的情况(也就是用户建立的非中断服务程序)下可以使用MSP或PSP,特权模式(中断服务程序)只能使用MSP。


3.还有很重要的一条就是.假如在用户模式下使用的是PSP,那么寄存器的数值被保存到任务堆栈的空间,进入中断程序后就开始使用MSP,如果还有一个高优先级的中断难么就继续的使用MSP,在程序推出最后一级中断的时候就用用户堆栈恢复寄存器。


下面以uCOS-II为例进行说明:


首先建立一个堆栈  OS_STK   AppTaskStartStk[1024]  //32位


STM32是向下生长的满栈,初始化堆栈后(在没有使用PSP以前,一直使用的是MSP)。

                 |     ....        | AppTaskStartStk[0]
                 |-----------------|
                 |     ....        | AppTaskStartStk[1]
                 |-----------------|
                 |     ....        |
                 |-----------------|       |---- 任务切换时PSP
    Low Memory   |     ....        |       |
                 |-----------------|       |    |---------------|      |----------------|
        ^        |       R4        |  <----|----|--OSTCBStkPtr  |<-----|   (OS_TCB *)   |
        ^        |-----------------|            |---------------|      |----------------|
        ^        |       R5        |            |               |         OSTCBHighRdy
        |        |-----------------|            |---------------|
        |        |       R6        |            |               |
        |        |-----------------|            |---------------|
        |        |       R7        |            |               |
        |        |-----------------|            |---------------|
        |        |       R8        |                 Task's
        |        |-----------------|                 OS_TCB
        |        |       R9        |
        |        |-----------------|
        |        |      R10        |
      Stack      |-----------------|
      Growth     |      R11        |
       = 1       |-----------------|
        |        |    R0 = p_arg   |  <-------- 异常时的PSP (向下生长的满栈)
        |        |-----------------|
        |        |       R1        |
        |        |-----------------|
        |        |       R2        |
        |        |-----------------|
        |        |       R3        |
        |        |-----------------|
        |        |       R12       |
        |        |-----------------|
        |        |       LR        |  
        |        |-----------------|
        |        |    SP = task    | AppTaskStartStk[1022]
        |        |-----------------|
        |        |      xPSR       | AppTaskStartStk[1023]
    High Memory  |-----------------|                                       


第一次执行PendSV中断之前,已经初始化PSP = 0 ,进入中断前使用的是MSP,所以自动入栈的寄存器的数值是保存在了系统堆栈里面,由于是第一次执行,不需要手动保存PSP和{R4-R11}到任务堆栈里面,然后从任务堆栈空间中取出数据到寄存器{R4-R11}中,退出中断的时候设置LR的位2,保证退出中断的时候使用PSP,恢复剩下的寄存器(这些寄存器的数值是自动入栈的)的数值,最后就进入到了任务里面,在执行任务程序的时候,使用的是PSP,有需要入栈的数,就会进入到任务堆栈里面。现在分两种情况进行考虑,


(1)有一个高优先级的中断要执行,那么自动入栈的寄存器数值会保存到当前任务的堆栈里面,进入到中断服务程序以后就开始使用MSP(剩下的的寄存器如果需要保存的话,会由编译器自动的生成相应的汇编代码,保存到系统堆栈,而不是任务堆栈),如后还有更高优先级的中断,那么就会一直使用MSP。


(2) 如果此时有一个高优先级的任务需要执行,那么xPSR, PC, LR, R12, R0-R3自动的由硬件保存到当前任务的堆栈里面,然后PSP和{R4-R11}需要手工的入栈。


假如在执行低优先级任务的过程中有两个数据压栈了。那么进入PendSV中断后保存寄存器的结果如下:


   |     ....        | AppTaskStartStk[0]
                 |-----------------|
                 |     ....        | AppTaskStartStk[1]
                 |-----------------|
                 |     ....        |
                 |-----------------|       |---- 任务切换时PSP
    Low Memory   |     ....        |       |
                 |-----------------|       |    |---------------|      |----------------|
        ^        |       R4        |  <----|----|--OSTCBStkPtr  |<-----|   (OS_TCB *)   |
        ^        |-----------------|            |---------------|      |----------------|
        ^        |       R5        |            |               |         OSTCBHighRdy
        |        |-----------------|            |---------------|
        |        |       R6        |            |               |
        |        |-----------------|            |---------------|
        |        |       R7        |            |               |
        |        |-----------------|            |---------------|
        |        |       R8        |                 Task's
        |        |-----------------|                 OS_TCB
        |        |       R9        |
        |        |-----------------|
        |        |      R10        |
      Stack      |-----------------|
      Growth     |      R11        |
       = 1       |-----------------|
        |        |    R0 = p_arg   |  <-------- 异常时的PSP (向下生长的满栈)
        |        |-----------------|
        |        |       R1        |
        |        |-----------------|
        |        |       R2        |
        |        |-----------------|
        |        |       R3        |
        |        |-----------------|
        |        |       R12       |
        |        |-----------------|
        |        |       LR        |  
        |        |-----------------|
        |        |    SP = task    |

        |        |-----------------|
        |        |      xPSR       |

        |        |-----------------|

        |        |  0x11111111     |

        |        |-----------------|
        |        |  0x22222222     |

High Memory      |-----------------|


推荐阅读

史海拾趣

Advanced Thermal Products Inc公司的发展小趣事

随着技术的不断积累,ATP公司开始加大产品创新的力度。他们推出了一系列具有竞争力的热管理产品,不仅满足了市场对于高效散热的需求,还凭借其优异的性能赢得了客户的青睐。同时,公司积极拓展市场,与多家电子设备制造商建立了长期合作关系,产品广泛应用于手机、电脑、服务器等领域。

First Silicon Co., Ltd公司的发展小趣事

随着全球电子市场的不断扩张,First Silicon公司意识到单一市场已无法满足其长远发展需求。于是,公司制定了全球化战略,通过设立海外研发中心、生产基地和销售网络,实现了从研发、生产到销售的全球化布局。这一战略不仅有效降低了公司的运营成本,还极大地提升了其品牌影响力和市场份额。在全球化进程中,First Silicon还积极与当地企业开展合作,共同推动电子技术的进步和应用。

Coherent Inc公司的发展小趣事

尽管电子行业竞争激烈,市场变化莫测,但Coherent Inc.始终保持着坚定的前行步伐。公司不断适应市场变化,调整战略方向,积极应对各种挑战。同时,公司也注重与合作伙伴的紧密合作,共同推动激光技术的创新和应用。这种坚定前行的态度,使得Coherent Inc.在电子行业中始终保持着领先的地位。

这五个故事只是Coherent Inc.发展历程中的一部分,但它们足以展示公司在电子行业中的崛起和发展。通过不断的探索、创新、收购与整合,以及坚定的前行态度,Coherent Inc.已经成为了激光技术领域的佼佼者,为电子行业的发展做出了重要贡献。

BRIGHT公司的发展小趣事

除了无线耳机和太阳能领域,BRIGHT公司还在健康技术领域取得了重要的突破。他们成功筹集了60万美元的资金,用于推动健康技术的持续增长和扩张。这笔资金使得BRIGHT公司能够在其成功的基础上,进一步研发和推广基于科学的认知健康解决方案。他们的产品,如40赫兹灯,无需医生处方即可普遍使用,为广大消费者提供了更加便捷和科学的健康管理方式。

HCH Co公司的发展小趣事

背景:随着全球对环境保护和可持续发展的重视程度不断提高,HCH Co公司积极响应号召,开始了绿色转型之路。公司致力于开发环保型电子产品和绿色生产技术,以减少对环境的影响。

发展:通过不断的技术创新和生产工艺的改进,HCH Co公司成功推出了一系列环保型电子产品,如可回收材料制成的外壳、低功耗的显示屏等。同时,公司还加强了废弃电子产品的回收和再利用工作,实现了资源的循环利用。绿色转型不仅提升了公司的社会形象,也为公司的长期发展注入了新的动力。

百佳(BAIJIA)公司的发展小趣事

随着国内市场的逐渐饱和,百佳公司开始将目光投向国际市场。他们积极参与国际展览和交流活动,与国际同行建立广泛的合作关系。通过拓展国际市场,百佳公司的产品不仅赢得了更多海外客户的青睐,也为企业带来了更广阔的发展空间。

问答坊 | AI 解惑

揭秘开幕式的灯光投影控制系统

在北京奥运会开幕式盛典中,五彩斑斓如梦如幻的灯光无疑是贯穿始终的灵魂。尤其是最后点火仪式中,李宁在一条灯光打出的虚拟卷轴跑道上“飞”过的情形,让人叹为观止。这一切,都有赖于灯光投影控制系统发挥的重要作用。       ...…

查看全部问答>

《单片机智能化产品C语言设计实例详解》源码

目录: 第1章 MCS51单片机及单片机程序C51 1.1 单片机的基本知识1 1.1.1 MCS51单片机的基本组成1 1.1.2 80C51的基本特征2 1.1.3 80C51的引脚定义及功能3 1.1.4 80C51的内部结构4 1.1.5 80C51的存储器配置和寄存器6 1.2 汇编语言与C语言8 1 ...…

查看全部问答>

第四届全国大学生电子设计竞赛获奖作品选编1999

本帖最后由 paulhyde 于 2014-9-15 09:03 编辑 超星图书下载 [ 本帖最后由 nantangren 于 2009-4-18 20:21 编辑 ]  …

查看全部问答>

新春快乐,万事如意

新春快乐,万事如意…

查看全部问答>

232转485口,出现奇怪问题

有一个终端设备A,是232接口,接一个232转485的转换器,把232信号转成485的信号,然后这个485线接一个485转232的转换器,把485信号转成232信号,然后和电脑相接,按说这样和设备直接接到电脑上的效果是一样的,但就是不能通讯,请问哪里的问题?转换 ...…

查看全部问答>

做网络安全还是STB

有经验的前辈能不能说说是做网络安全还是STB的前景比较好?…

查看全部问答>

急,我的电脑怎么装系统装不上啊!高手们帮帮忙

我的电脑以前也是XP的系统,然后老是出现自动重启,我重新装系统,装一半就卡在那里了.高手们快点帮帮我,…

查看全部问答>

香水救命啊,Jlink和STLink都遇到的下载问题

编译OK用J Link下载 DOWNLOADING  FILES通过,然后PROGRAMING FLASH就永远不会出来了,IAR就死在这里了用 ST Link相同情况J Link偶尔会报错,说写入CPU的 不是MSP就是MPS寄存器错误这是昨天新建 ...…

查看全部问答>

STM32中AD转换怎样用外部脉冲上升沿触发?

  用的红牛开发板,现在用TIM3 CH3来捕获外部脉冲上升沿然后进入TIM3的中断,现在想用这个外部脉冲的上升沿控制AD转换,所以我现在想将AD用TIM3的中断来触发,不知道可否实现···   还是直接将用外部脉冲的上升沿控制AD转换??我不知 ...…

查看全部问答>