热门标签 | 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  
推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
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社区 版权所有