热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

STM32双堆栈及其在uC/OS-II中的使用

STM32双堆栈及其在uCOS-II中的使用说明:里面可能有不少错误的观念,希望大家发现后及时的纠正。首先了解一下双堆栈的知识,下面的图片来自《Cortex-M3权威指南》,有点枯燥,但还
STM32双堆栈及其在uC/OS-II中的使用

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

     首先了解一下双堆栈的知识,下面的图片来自《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      |-----------------|

  http://blog.sina.com.cn/s/blog_98ee3a930100ymvd.html  
推荐阅读
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • QBlog开源博客系统:Page_Load生命周期与参数传递优化(第四部分)
    本教程将深入探讨QBlog开源博客系统的Page_Load生命周期,并介绍一种简洁的参数传递重构方法。通过视频演示和详细讲解,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
author-avatar
咖喱2502894907
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有