建议楼主再仔细阅读CPU手册,内存分布。 其它不说,单说CPU的内部256字节的RAM: 1、R0-R7占用(8个)、辅助备用R0-R7占用(24个)、位寻位占用(16个),堆栈用(与子程序嵌套层次有关,函数结果传递有关),剩余可以自由使用。 2、如果用汇编写程序,可以自己精确规划这256个空间。 3、如果用C写程序,则由编译平台帮你规划处理,空浪费大。平台一般从30H-80H开始规划,另外函数的返回结果也用堆栈传递,如果结果复杂、数据量大,很快就不够用了。 楼上提议用IDATA、XDATA都对,但对楼主来说,最重要的,还是【仔细阅读CPU手册,弄清内存分布。】 |
1,只要代码不是汇编写的,改idata基本就是几秒钟的事情,申明变量处,加idata字段即可,程序压更不用动。 2,不管你换啥芯片,只要还是51核,终究只有128data,去掉通用寄存器要用的8-32个字节,加上临时扩展变量要用的若干字节,自己能随意支配的data,说到底也就80多,了不起100出头了。 |
qq624353765 发表于 2022-9-10 09:34 看来只能换芯片,要改在idata工作量太大,其中4K的程序是别人给我的。 |
dreamjack 发表于 2022-9-9 20:24 加在xdata里没问题,但是占用太多空间了8K的flsah放不下,看来只能换芯片了。 |
188610329 发表于 2022-9-9 18:29 用到87就报警了,若要申明其他的数据在idata里,我放弃治疗了,因为其中4K的程序是别人提供的。 |
coody_sz 发表于 2022-9-9 17:50 数组和变量我试过设定在xdata里,但是编译后的占用内存太多了,看来只能换芯片了。 |
DATA只有128字节,这128字节还要被单片机占用一部分,IDATA才是256字节,DATA是IDATA前128字节 |
低128是data(可省略),高128字节和SFR地址相同,要加idata修饰 |
munuc_w 发表于 2022-9-9 17:00 我也想转用一部分到xdata里去,但是转过去的部分会占用800多字节,这多出的字节刚好把我存取数据flash位置复用,我一但写上数据,就会覆盖程序数据 ![]() 现在是搞不明白C8051F330里写着有256个data可以用,就是系统占用一半,也应该还有128的吧?但我实际编译到87以上就报警。网上百度过但都是让我换个大flash的芯片,就是想搞明白为何在用到87以上就报警。 |
将部分数组,变量前面,加上xdata,使变量实用外部RAM,不是占用内部RAM |
256ram中 data只有128,其中通用寄存器最少需要用8,实际能被你用的最多120,其他的ram必须用idata申明。 |
有数组的优先放xdata |
DATA部分使用的太多了,这部分系统也要使用的,把数据移到PDATA里一部分就可以了。 |