找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2655|回复: 2
打印 上一主题 下一主题
收起左侧

关于UCOS模拟堆栈的理解 二

[复制链接]
跳转到指定楼层
楼主
       前面说了一下模拟堆栈的由来和实际的意义。总结为一句话:实际需要,有KEIL编译器自动分配存储空间,实现函数重入。该堆栈和Proteus没有关系。

2 系统堆栈(CPU寄存器)
       系统堆栈是单片机中的关键组成部分。也叫硬件堆栈或常规堆栈。是单片机进入中断的时候用到的,单片机一旦遇到中断请求,就会去处理中断,处理完后再回来处理主程序,这样就涉及到了一个问题,单片机要保存中断之前的信息,以便处理中断后能够回到主程序中,单片机会在响应中断前,把单片机现在的指针地址(也就是处理完要返回的地址),以及一些必要的数据压入堆栈(没有这些数据,单片机处理完中断后就无法确定主程序的状态)。该过程称为现场保存。

          堆栈是一种执行“先入后出”算法的数据结构。是在内存中的一个存储区域,数据一个一个顺序地存入(也就是“压入—PUSH”)这个区域之中。有一个地址指针(堆栈指针)总指向最后一个压入堆栈的数据所在的存储单元,存放这个地址指针的寄存器就叫做堆栈指示器。

  

      开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减1。这个过程叫做“弹出POP”。如此就实现了先入后出的原则。 MCS-51的堆栈是向上生成的(即向地址增加的方向),堆栈指针SP的初始值称为栈底。


3 任务堆栈

堆栈作用的就是用来保存变量,从实质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务从“出生”到“消亡”的整个过程,具体就是分析任务的建立,运行,挂起几种状态中任务堆栈的变化情况。


        目前假设系统运行着一个由用户创建的用以完成打印工作的任务TPrint。TPrint最初通过OSTaskCreate()函数创建,在该函数中与任务堆栈有关的第一段代码是大家比较熟悉的函数OSTaskStkInit(),这个函数是在uCOS移植过程中必须实现的,其作用是“初始化堆栈”,其实就是预先在RAM中的一块区域中把任务将来运行开始时CPU寄存器应处的状态(正确值)准备好,之后,任务第一次被内核调度器调度运行时,将这些准备好的数据(寄存器的值)推到CPU的寄存器中,如果数据设计的合理,CPU便会按照我们预先设计好的思路运行。

堆栈结构.png (91.64 KB, 下载次数: 140)

堆栈结构.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:983641 发表于 2023-8-30 21:17 | 只看该作者
很好的资料。虽然看不懂。
回复

使用道具 举报

板凳
ID:1040201 发表于 2023-9-11 10:45 | 只看该作者
还没有学到这里,后面可能需要,先顶一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表