[C51]RAM开销及堆栈大小,keil工具

为方便介绍下面图片节选自文章: 

MCS51 数据存储器(RAM)_片内基本ram的地址范围-CSDN博客  

 

对于标准51的RAM是256字节,只有0x00-0x7F是数据存储器,因此用户数据和堆栈都在此区域

上电默认使用第0组工作寄存器组,其他组除非自己配置使用,否则不使用,其所在内存空间也可以任意使用。

在没有任何程序的情况下,51初始化后启用第0组工作寄存器,用户可用RAM从0x08开始,并且此时用户没有设置变量,故C51编译器自动设置堆栈指针SP=0x07(堆栈指针指向堆栈顶部,压栈时先自增再压栈,故要存放数据在0x08,则需SP=0x07)

下面给出在keil上如何查看

新建空白51工程

main文件只有空白的main函数

接下来先编译,然后点击仿真查看汇编,

堆栈初始化一般在main函数前,

找到汇编中的main函数,然后往上找SP,可以看到编译器为其设置为0x07

接下来观察设置变量后堆栈指针的变化

再次点击退出仿真

编写程序,编译,仿真

此时用户定义了一个字节的数据a,存放在了08H,故堆栈设置为08H

继续定义变量,但这次的变量定义成动态局部变量

可以看到堆栈往后移动了一位,但是对C语言熟悉的会发现一个问题,就是b不是动态局部变量吗,那么根据C语言的标准,b应该是创建在堆栈中,随着函数的结束释放掉,但是这里的b占用的是固定的地址,这是C51与标准C不同的地方,在C51中所有的变量都存放在静态区,一直占用固定地址内存空间。

 那么问题来了,如果程序比较大,设置的变量很多,那么可用于堆栈的内存是不是变得很小,答案是肯定的,但是可以通过将变量存放在外部RAM,避免内部RAM被过度使用,可以通过data  xdata关键字来自己分配,也可以将keil配置成默认使用外部RAM(前提是具有外部RAM)

此时编译查看堆栈,SP=0x07

a,b分别存放在外部RAM的0x0000和0x0001地址中。

到这里我们已经知道如何查看自己的程序堆栈指针起始值是多少,因此可以计算堆栈大小了

大小M=堆栈最大地址0x7F-堆栈起始SP初始值。

到此解决了如何计算堆栈可用大小问题。

值得注意的是,20H-2FH可用于位寻址,当设置有bit位变量时,变量会存放在这个区域,因此堆栈会设置在位变量之后,大小超出20H-07H的数组也会放在位变量之后

 

剩下的问题就是设计的程序会使用多大的堆栈空间,比如函数调用,中断等,我们的可用堆栈大小允许我们的程序有几层嵌套?这个先不写了,有兴趣的可以看看下面的文章 

51单片机堆栈深入剖析 - Bingoo&Echo - 博客园 (cnblogs.com)

相关推荐

  1. Keil C51 汉字显示 BUG 解决方案

    2024-01-24 23:46:01       22 阅读
  2. android c++打印堆栈

    2024-01-24 23:46:01       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-24 23:46:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-24 23:46:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-24 23:46:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-24 23:46:01       20 阅读

热门阅读

  1. ABAP ME28 ME2M 增加展示字段增强

    2024-01-24 23:46:01       32 阅读
  2. python基础教程九 抽象三(函数参数续)

    2024-01-24 23:46:01       31 阅读
  3. C++ inline 关键字有什么做用?

    2024-01-24 23:46:01       32 阅读
  4. 【远程工作系列一】如何找远程工作

    2024-01-24 23:46:01       38 阅读
  5. 概念杂记--到底啥是啥?(数据库篇)

    2024-01-24 23:46:01       35 阅读
  6. 汇编中的标签与C语言的函数对比与区别

    2024-01-24 23:46:01       42 阅读
  7. 哪些编程语言和领域最适合应用AIGC技术?

    2024-01-24 23:46:01       29 阅读
  8. git常用命令汇总

    2024-01-24 23:46:01       32 阅读
  9. 基于区块链的算力并网交易平台研究报告(2023)

    2024-01-24 23:46:01       32 阅读
  10. 服务器部署模型访问前端页面

    2024-01-24 23:46:01       31 阅读
  11. ubuntu nginx+rtmp配置及简单测试

    2024-01-24 23:46:01       31 阅读