找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 4845 | 评论数: 18 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-9-16 17:00

正文摘要:

用STC8H3K32S2这个单片机芯片,技术手册里写着RAM是128字节, 但是编译时发现超过110字节就会报错, 难道技术手册错了?

回复

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

谢谢大佬!这几天我也查了一些资料,大概都明白了。
ID:879348 发表于 2022-9-19 15:08
需要堆栈用于调用程序,局部变量,中断处理
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写程序。
ID:188720 发表于 2022-9-19 08:02
cjjdemon 发表于 2022-9-17 22:37
放idata也行,idata也比较小呀,xdata就很大了哦,实际上不会慢多少的。

使用xdata的话,还需要把AUXR的EXTRAM设为0,这个只要在初始化的时候设置一次就好了吧?不用每次调用xdata都专门调用一次EXTRAM=0吧?
ID:612392 发表于 2022-9-17 22:37
红烧鱼头 发表于 2022-9-17 10:07
这样好像会变慢?为什么不推荐用 idata 呢?

放idata也行,idata也比较小呀,xdata就很大了哦,实际上不会慢多少的。
ID:1034262 发表于 2022-9-17 20:59
楼主可以通过*.m51文件查看具体的变量安排。
STC8H3K系列的内存遵守标准51的架构要求,直接寻址(也可简介寻址)的SRAM是低128字节,高128字节只能间接寻址(idata),扩展的xdata有3072个字节。
ID:807591 发表于 2022-9-17 11:19
红烧鱼头 发表于 2022-9-17 10:07
这样好像会变慢?为什么不推荐用 idata 呢?

确实速度差一点,优先用完idata 没问题
ID:188720 发表于 2022-9-17 10:09
wkman 发表于 2022-9-17 09:54
基础性常识问题啊,堆栈指针之类的,要动态占用部分 data区,要留下足够的空间

好吧,基本功不行
ID:188720 发表于 2022-9-17 10:07
cjjdemon 发表于 2022-9-17 09:58
编译的时候,程序选large,这样就会优先放xdata啦

这样好像会变慢?为什么不推荐用 idata 呢?
ID:188720 发表于 2022-9-17 09:59
qq624353765 发表于 2022-9-17 09:19
不要把全局变量放在data中,data内存都当作堆栈内存,主要用于局部变量和压栈变量的使用,其他内存都放在id ...

好的,我已经把全局变量放在idata里了,编译通过了。
再请教一下 :我看有人说RAM的高128字节是特殊功能寄存器,但是idata就是RAM的高128字节吧?不冲突吗?
ID:612392 发表于 2022-9-17 09:58
编译的时候,程序选large,这样就会优先放xdata啦
ID:433219 发表于 2022-9-17 09:54
基础性常识问题啊,堆栈指针之类的,要动态占用部分 data区,要留下足够的空间
ID:526108 发表于 2022-9-17 09:19
不要把全局变量放在data中,data内存都当作堆栈内存,主要用于局部变量和压栈变量的使用,其他内存都放在idata或xdata中
ID:188720 发表于 2022-9-17 08:41
yzwzfyz 发表于 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个 ...

我算了下,全局变量占用50字节左右,剩下的70字节都是系统占用了吗?!
ID:188720 发表于 2022-9-17 08:35
yzwzfyz 发表于 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个 ...

我算了下,定义的全局变量占50多字节,系统占用的有将近70字节这么多吗?!
ID:123289 发表于 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个了。
如果你用汇编写程序,则没有这个问题,RAM由你规划使用。
ID:624769 发表于 2022-9-16 21:30
你看看你打框的上面一行 超出了0x26个字节,所以,成功编译的只有111字节。所以,原代码,你总共要用data,大约166字节。

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

Powered by 单片机教程网

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