标题: STC8H单片机的RAM好像不能全部使用,难道技术手册错了?大家又遇到过吗 [打印本页]

作者: 红烧鱼头    时间: 2022-9-16 17:00
标题: STC8H单片机的RAM好像不能全部使用,难道技术手册错了?大家又遇到过吗
用STC8H3K32S2这个单片机芯片,技术手册里写着RAM是128字节,
但是编译时发现超过110字节就会报错,

难道技术手册错了?

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

1663318747895.jpg

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

1663318816001.jpg

作者: 188610329    时间: 2022-9-16 21:30
你看看你打框的上面一行 超出了0x26个字节,所以,成功编译的只有111字节。所以,原代码,你总共要用data,大约166字节。
作者: yzwzfyz    时间: 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个了。
如果你用汇编写程序,则没有这个问题,RAM由你规划使用。
作者: 红烧鱼头    时间: 2022-9-17 08:33
188610329 发表于 2022-9-16 21:30
你看看你打框的上面一行 超出了0x26个字节,所以,成功编译的只有111字节。所以,原代码,你总共要用data, ...

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

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

1663374767701.jpg

作者: 红烧鱼头    时间: 2022-9-17 08:35
yzwzfyz 发表于 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个 ...

我算了下,定义的全局变量占50多字节,系统占用的有将近70字节这么多吗?!
作者: 红烧鱼头    时间: 2022-9-17 08:41
yzwzfyz 发表于 2022-9-17 08:06
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。
比如:系统用了30个,你就只能用98个 ...

我算了下,全局变量占用50字节左右,剩下的70字节都是系统占用了吗?!
作者: 624353765    时间: 2022-9-17 09:19
不要把全局变量放在data中,data内存都当作堆栈内存,主要用于局部变量和压栈变量的使用,其他内存都放在idata或xdata中
作者: wkman    时间: 2022-9-17 09:54
基础性常识问题啊,堆栈指针之类的,要动态占用部分 data区,要留下足够的空间
作者: cjjdemon    时间: 2022-9-17 09:58
编译的时候,程序选large,这样就会优先放xdata啦
作者: 红烧鱼头    时间: 2022-9-17 09:59
qq624353765 发表于 2022-9-17 09:19
不要把全局变量放在data中,data内存都当作堆栈内存,主要用于局部变量和压栈变量的使用,其他内存都放在id ...

好的,我已经把全局变量放在idata里了,编译通过了。
再请教一下 :我看有人说RAM的高128字节是特殊功能寄存器,但是idata就是RAM的高128字节吧?不冲突吗?
作者: 红烧鱼头    时间: 2022-9-17 10:07
cjjdemon 发表于 2022-9-17 09:58
编译的时候,程序选large,这样就会优先放xdata啦

这样好像会变慢?为什么不推荐用 idata 呢?
作者: 红烧鱼头    时间: 2022-9-17 10:09
wkman 发表于 2022-9-17 09:54
基础性常识问题啊,堆栈指针之类的,要动态占用部分 data区,要留下足够的空间

好吧,基本功不行
作者: szb314    时间: 2022-9-17 11:19
红烧鱼头 发表于 2022-9-17 10:07
这样好像会变慢?为什么不推荐用 idata 呢?

确实速度差一点,优先用完idata 没问题
作者: coody_sz    时间: 2022-9-17 20:59
楼主可以通过*.m51文件查看具体的变量安排。
STC8H3K系列的内存遵守标准51的架构要求,直接寻址(也可简介寻址)的SRAM是低128字节,高128字节只能间接寻址(idata),扩展的xdata有3072个字节。

作者: cjjdemon    时间: 2022-9-17 22:37
红烧鱼头 发表于 2022-9-17 10:07
这样好像会变慢?为什么不推荐用 idata 呢?

放idata也行,idata也比较小呀,xdata就很大了哦,实际上不会慢多少的。
作者: 红烧鱼头    时间: 2022-9-19 08:02
cjjdemon 发表于 2022-9-17 22:37
放idata也行,idata也比较小呀,xdata就很大了哦,实际上不会慢多少的。

使用xdata的话,还需要把AUXR的EXTRAM设为0,这个只要在初始化的时候设置一次就好了吧?不用每次调用xdata都专门调用一次EXTRAM=0吧?
作者: yzwzfyz    时间: 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写程序。

作者: wufa1986    时间: 2022-9-19 15:08
需要堆栈用于调用程序,局部变量,中断处理
作者: 红烧鱼头    时间: 2022-9-20 07:59
yzwzfyz 发表于 2022-9-19 08:51
1、编译器一般会从30H开始规划RAM的使用,这样你只能用30H-7FH。
2、系统会根据程序中,子程序调用的深度 ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1