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写程序。 |
cjjdemon 发表于 2022-9-17 22:37 使用xdata的话,还需要把AUXR的EXTRAM设为0,这个只要在初始化的时候设置一次就好了吧?不用每次调用xdata都专门调用一次EXTRAM=0吧? |
红烧鱼头 发表于 2022-9-17 10:07 放idata也行,idata也比较小呀,xdata就很大了哦,实际上不会慢多少的。 |
楼主可以通过*.m51文件查看具体的变量安排。 STC8H3K系列的内存遵守标准51的架构要求,直接寻址(也可简介寻址)的SRAM是低128字节,高128字节只能间接寻址(idata),扩展的xdata有3072个字节。 |
红烧鱼头 发表于 2022-9-17 10:07 确实速度差一点,优先用完idata 没问题 |
wkman 发表于 2022-9-17 09:54 好吧,基本功不行 ![]() |
cjjdemon 发表于 2022-9-17 09:58 这样好像会变慢?为什么不推荐用 idata 呢? |
qq624353765 发表于 2022-9-17 09:19 好的,我已经把全局变量放在idata里了,编译通过了。 再请教一下 :我看有人说RAM的高128字节是特殊功能寄存器,但是idata就是RAM的高128字节吧?不冲突吗? |
编译的时候,程序选large,这样就会优先放xdata啦 |
基础性常识问题啊,堆栈指针之类的,要动态占用部分 data区,要留下足够的空间![]() |
不要把全局变量放在data中,data内存都当作堆栈内存,主要用于局部变量和压栈变量的使用,其他内存都放在idata或xdata中 |
yzwzfyz 发表于 2022-9-17 08:06 我算了下,全局变量占用50字节左右,剩下的70字节都是系统占用了吗?! |
yzwzfyz 发表于 2022-9-17 08:06 我算了下,定义的全局变量占50多字节,系统占用的有将近70字节这么多吗?! |
128个RAM中,系统需要用一部分,但你无法知道系统是如何规划RAM的。 比如:系统用了30个,你就只能用98个了。 如果你用汇编写程序,则没有这个问题,RAM由你规划使用。 |
你看看你打框的上面一行 超出了0x26个字节,所以,成功编译的只有111字节。所以,原代码,你总共要用data,大约166字节。 |