找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8H单片机的RAM好像不能全部使用,难道技术手册错了?大家又遇到过吗

[复制链接]
跳转到指定楼层
楼主
用STC8H3K32S2这个单片机芯片,技术手册里写着RAM是128字节,
但是编译时发现超过110字节就会报错,

难道技术手册错了?

1663318747895.jpg (151.23 KB, 下载次数: 75)

1663318747895.jpg

1663318816001.jpg (5.94 KB, 下载次数: 80)

1663318816001.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-9-16 21:30 来自手机 | 只看该作者
你看看你打框的上面一行 超出了0x26个字节,所以,成功编译的只有111字节。所以,原代码,你总共要用data,大约166字节。
回复

使用道具 举报

板凳
ID:123289 发表于 2022-9-17 08:06 | 只看该作者
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个了。
如果你用汇编写程序,则没有这个问题,RAM由你规划使用。
回复

使用道具 举报

地板
ID:188720 发表于 2022-9-17 08:33 | 只看该作者
188610329 发表于 2022-9-16 21:30
你看看你打框的上面一行 超出了0x26个字节,所以,成功编译的只有111字节。所以,原代码,你总共要用data, ...

可是我减少了一个字节的全局变量,编译就通过了啊

1663374767701.jpg (5.67 KB, 下载次数: 78)

1663374767701.jpg
回复

使用道具 举报

5#
ID:188720 发表于 2022-9-17 08:35 | 只看该作者
yzwzfyz 发表于 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个 ...

我算了下,定义的全局变量占50多字节,系统占用的有将近70字节这么多吗?!
回复

使用道具 举报

6#
ID:188720 发表于 2022-9-17 08:41 | 只看该作者
yzwzfyz 发表于 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个 ...

我算了下,全局变量占用50字节左右,剩下的70字节都是系统占用了吗?!
回复

使用道具 举报

7#
ID:526108 发表于 2022-9-17 09:19 | 只看该作者
不要把全局变量放在data中,data内存都当作堆栈内存,主要用于局部变量和压栈变量的使用,其他内存都放在idata或xdata中
回复

使用道具 举报

8#
ID:433219 发表于 2022-9-17 09:54 | 只看该作者
基础性常识问题啊,堆栈指针之类的,要动态占用部分 data区,要留下足够的空间
回复

使用道具 举报

9#
ID:612392 发表于 2022-9-17 09:58 | 只看该作者
编译的时候,程序选large,这样就会优先放xdata啦
回复

使用道具 举报

10#
ID:188720 发表于 2022-9-17 09:59 | 只看该作者
qq624353765 发表于 2022-9-17 09:19
不要把全局变量放在data中,data内存都当作堆栈内存,主要用于局部变量和压栈变量的使用,其他内存都放在id ...

好的,我已经把全局变量放在idata里了,编译通过了。
再请教一下 :我看有人说RAM的高128字节是特殊功能寄存器,但是idata就是RAM的高128字节吧?不冲突吗?
回复

使用道具 举报

11#
ID:188720 发表于 2022-9-17 10:07 | 只看该作者
cjjdemon 发表于 2022-9-17 09:58
编译的时候,程序选large,这样就会优先放xdata啦

这样好像会变慢?为什么不推荐用 idata 呢?
回复

使用道具 举报

12#
ID:188720 发表于 2022-9-17 10:09 | 只看该作者
wkman 发表于 2022-9-17 09:54
基础性常识问题啊,堆栈指针之类的,要动态占用部分 data区,要留下足够的空间

好吧,基本功不行
回复

使用道具 举报

13#
ID:807591 发表于 2022-9-17 11:19 | 只看该作者
红烧鱼头 发表于 2022-9-17 10:07
这样好像会变慢?为什么不推荐用 idata 呢?

确实速度差一点,优先用完idata 没问题
回复

使用道具 举报

14#
ID:1034262 发表于 2022-9-17 20:59 | 只看该作者
楼主可以通过*.m51文件查看具体的变量安排。
STC8H3K系列的内存遵守标准51的架构要求,直接寻址(也可简介寻址)的SRAM是低128字节,高128字节只能间接寻址(idata),扩展的xdata有3072个字节。
回复

使用道具 举报

15#
ID:612392 发表于 2022-9-17 22:37 | 只看该作者
红烧鱼头 发表于 2022-9-17 10:07
这样好像会变慢?为什么不推荐用 idata 呢?

放idata也行,idata也比较小呀,xdata就很大了哦,实际上不会慢多少的。
回复

使用道具 举报

16#
ID:188720 发表于 2022-9-19 08:02 | 只看该作者
cjjdemon 发表于 2022-9-17 22:37
放idata也行,idata也比较小呀,xdata就很大了哦,实际上不会慢多少的。

使用xdata的话,还需要把AUXR的EXTRAM设为0,这个只要在初始化的时候设置一次就好了吧?不用每次调用xdata都专门调用一次EXTRAM=0吧?
回复

使用道具 举报

17#
ID:123289 发表于 2022-9-19 08:51 | 只看该作者
1、编译器一般会从30H开始规划RAM的使用,这样你只能用30H-7FH。
2、系统会根据程序中,子程序调用的深度,预留堆栈的数量,又用掉一些。
3、函数在返回数据时,也会用堆栈传递结果,再用掉一些。
4、你的#INCLUDE  “??”,函数中,也会规划掉一些RAM。
……,以上你不易计算清楚,系统用70个以上很正常。

另外,你在10#楼的疑问,回复你一下:
对于256字节的RAM芯片,高端的128个RAM(80-FFH)与特殊寄存器的地址(80-FFH)的确是重复的!!!
CPU为了防止冲突,对此区间的访问作出区分规定:
高端的128个RAM(80-FFH)必须用【间接访问指令】读取,
而对特殊寄存器则采用【直接访问指令】读取。
如果你精通汇编,这一点就清楚了!
而对于低端的RAM(0-7FH)则随便你用哪种方式访问。
当你用C写程序时,编译器会替你注意的,但需要你知它:变量放在哪!
编译器会将你的C程序,编译成汇编,并注意到【访问指令】用直接还是间接。

STC在特殊寄存器上做了大量的文章,扩充了许多标准51没有东东,乃至用满了80-FFH特殊寄存器地址,还不够!
于是STC人又在XRAM区域,取出部分地址,用作【扩展特殊寄存器】,对此,标准的编译方式无法作出区分的,写程序时,需要你按STC的CPU说明来写。
这也是,有些程序在不同芯片之间不能通用的原因之一。也是为什么要用#INCLUDE将芯片型号,告诉编译器的原因之一。
以上希望能帮到你。如果你想在单片机上成为高手,必须精通汇编,即使用你不用它,而用C写程序。
回复

使用道具 举报

18#
ID:879348 发表于 2022-9-19 15:08 | 只看该作者
需要堆栈用于调用程序,局部变量,中断处理
回复

使用道具 举报

19#
ID:188720 发表于 2022-9-20 07:59 | 只看该作者
yzwzfyz 发表于 2022-9-19 08:51
1、编译器一般会从30H开始规划RAM的使用,这样你只能用30H-7FH。
2、系统会根据程序中,子程序调用的深度 ...

谢谢大佬!这几天我也查了一些资料,大概都明白了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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