打印
[技术问答]

堆栈地址分配原理,变量放RAM,small编译按data

[复制链接]
1665|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
burgessmaggie|  楼主 | 2023-5-25 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要采用small编译,这时C51是全部变量都按data! 自己不用去指定data。 变量超出80H空间,则出错,C51不会自动改成按idata或xdata等!!这时就要自己去指定idata或xdata。

把慢的变量自己去定义成idata或xdata!  这样省出空间给data。直到不出错为止。(注意,函数形参变量只能用data,不然keil会出错)

看M51文件就知道RAM分配的情况和CODE的大小!

idata可以访问00~FF全部内部RAM空间。  data后面就是idata,如果data变量在80H空间没用完,idata会紧跟其后,idata不会跳到80H开始。

变量除非data放不下,我们才去强行指定idata。idata放不下,才去强行xdata。

堆栈都是按idata来分配的,放在所有变量最后。---这就是KEIL C51自动分配堆栈的原理。

堆栈即使在80H空间内部,也是按idata来走!

如果变量太多,快占满了内部RAM,则留给堆栈的不多,虽然编译成功,但运行可能会出错!

保险起见,最好保证至少有16个字节留给堆栈,看M51文件。
原文链接:https://blog.csdn.net/wxlfreewind/article/details/125571192

使用特权

评论回复
沙发
tpgf| | 2023-6-7 13:09 | 只看该作者
Cx51编译器提供的三种编译模式SMALL,COMPACT,LARGE

使用特权

评论回复
板凳
qcliu| | 2023-6-7 13:33 | 只看该作者
SMALL模式中,所有变量都被定义在8051单片机的片内RAM中,对这种变量的访问速度最快

使用特权

评论回复
地板
drer| | 2023-6-7 13:58 | 只看该作者
采用SMALL编译模式与定义变量时指定data存储器类型具有相同效果。

使用特权

评论回复
5
coshi| | 2023-6-7 14:19 | 只看该作者
在COMPACT模式下,所有变量被定义在分页寻址的片外XRAM中,每一页片外XRAM的长度为256字节:即所有变量存储在片外XRAM的某一页中

使用特权

评论回复
6
kxsi| | 2023-6-7 14:42 | 只看该作者
采用COMPACT编译模式与定义变量时指定pdata存储器类型具有相同效果

使用特权

评论回复
7
wiba| | 2023-6-7 14:57 | 只看该作者
在程序中定义的变量,若不指定其存储区域(data、idata、xdata等),则系统自动存放到上述编译模式指定的存储区。

使用特权

评论回复
8
mmbs| | 2023-7-5 12:15 | 只看该作者
所有变量都被定义在8051单片机的片内RAM中,对这种变量的访问速度最快。

使用特权

评论回复
9
earlmax| | 2023-7-5 12:21 | 只看该作者
栈指针指向栈顶,当新的数据被推入堆栈时,栈指针会相应地减小;当数据被弹出堆栈时,栈指针会相应地增加。

使用特权

评论回复
10
robincotton| | 2023-7-5 12:49 | 只看该作者
在使用small编译选项时,编译器会优化存储变量的方式,通常将全局变量放在RAM的data段。

使用特权

评论回复
11
lzmm| | 2023-7-5 13:31 | 只看该作者
常见的做法是堆栈从高地址向低地址增长,也就是栈顶位于高地址,栈底位于低地址。

使用特权

评论回复
12
mmbs| | 2023-7-5 13:35 | 只看该作者
堆栈地址分配原理是指在程序执行过程中,如何将局部变量和函数调用所需的数据存储在内存中的堆栈区域。

使用特权

评论回复
13
hilahope| | 2023-7-5 13:40 | 只看该作者
局部变量是在函数内部声明的变量,在函数调用时为其分配内存空间。它们通常被分配在堆栈上,这意味着每当函数被调用时,都会分配一块新的内存空间给局部变量。当函数执行完毕后,这些内存空间会被释放。

使用特权

评论回复
14
mattlincoln| | 2023-7-5 13:48 | 只看该作者
全局变量在程序开始时就会被分配内存空间,并一直存在于RAM中,直到程序结束。

使用特权

评论回复
15
jkl21| | 2023-7-5 13:53 | 只看该作者
堆栈的增长方向取决于具体的架构和编译器。

使用特权

评论回复
16
benjaminka| | 2023-7-5 14:39 | 只看该作者
局部变量是在函数或代码块内定义的变量。它们在函数或代码块执行时才会被创建,并在作用域结束时释放对应的内存空间

使用特权

评论回复
17
sanfuzi| | 2023-7-5 14:43 | 只看该作者
堆栈 必须位于片内RAM中,而堆栈的长度是很重要的,实际栈长取决与不同函数的嵌套深度。

使用特权

评论回复
18
averyleigh| | 2023-7-5 14:52 | 只看该作者
堆栈地址分配和变量存储位置的具体实现可能因编译器、硬件平台和操作系统而有所不同。

使用特权

评论回复
19
51xlf| | 2023-7-5 15:02 | 只看该作者
对于特定的编译器和开发环境,请参考相关文档或手册以了解其具体的堆栈地址分配原理和变量存储位置规则。

使用特权

评论回复
20
claretttt| | 2023-7-5 16:08 | 只看该作者
在某些编译器中,可以将全局和静态变量放置在数据段(data segment)中。数据段是指用于存储全局和静态数据的一部分RAM。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

1289

帖子

1

粉丝