对于KEILC51来说,明明DATA空间有空余却报不够用,如何解决?
如何让链接器使用这空间,绝对定位太麻烦,它的地址分配逻辑还需要什么特殊的说明吗?部分变量加idata,data只有128字节空间 ayb_ice 发表于 2023-4-24 16:17
部分变量加idata,data只有128字节空间
这个我知道,项目中XDATA/IDATA都使用很多,关键是一个工程分成若干个独立C文件,明明有足够的DATA RAM空间,因为链接顺序问题空着却报错DATA空间不足。 makesoft 发表于 2023-4-24 16:39
这个我知道,项目中XDATA/IDATA都使用很多,关键是一个工程分成若干个独立C文件,明明有足够的DATA RAM空 ...
不可能是这原因,去掉未调用的函数,这些会当成类似中断函数来处理,会战胜变量空间 ayb_ice 发表于 2023-4-24 16:45
不可能是这原因,去掉未调用的函数,这些会当成类似中断函数来处理,会战胜变量空间 ...
链接时候使用了REMOVEUNUSED控制项,从道理上来说应该是没有影响的,毕竟没有使用的函数是不参与LX51链接的。 makesoft 发表于 2023-4-24 16:50
链接时候使用了REMOVEUNUSED控制项,从道理上来说应该是没有影响的,毕竟没有使用的函数是不参与LX51链接 ...
REMOVEUNUSED这个用法是对的,可以看MAP文件,看看具体变量是怎么分配的 谢谢,不想找了,估计是什么控制项没有找到。
在memory model 使用large,不想着那点效率了 本帖最后由 datouyuan 于 2023-4-25 10:56 编辑
方法1:
COMM_485.c定义的data变量达47字节。
将其中不小于29字节定义为idata。
方法2:
将除COMM_485.c外的其它文件中的idata删除。
楼主应尽量少用idata。只有数组才适合用idata。
可以试着把某个段控制在24个字节之内。
0x20是位访问区,这就是一条分割线。
链接时,如果一个段,可以放到0x08-0x1f 这块空间,就放进去,放不进去,就只好往后放。
看你的map,其实部分分配成idata的数据,如果去掉idata属性,是可以链接到0x08-0x1f这里的。 keil C51,有5种基本数据类型:bdata、 data、 idata、 xdata、 code,前4种是内存的定义,楼主说的不够估计是data, data是直接寻址,只能访问内部低128字节,高128字节要用idata定义,间接访问,还可以定义xdata访问扩展内存。 datouyuan 发表于 2023-4-25 10:48
方法1:
COMM_485.c定义的data变量达47字节。
将其中不小于29字节定义为idata。
对于一个优秀的编译链接软件,我认为所有的变量覆盖和使用不应该是按照项目中文件来组织,而是应该整个项目来统筹考虑,一个项目中某个使用了大量的变量二另外一个文件使用的变量比较少,都是正常的,毕竟我们的项目组织中的文件是按照功能来分类的。
所以说因为某个文件变量使用的多不能和其他文件进行均衡处理,那只能说编译器链接器还是有很大的改进空间的。 linnjing 发表于 2023-4-25 11:07
可以试着把某个段控制在24个字节之内。
0x20是位访问区,这就是一条分割线。
链接时,如果一个段,可以放到 ...
为了降低DATA使用量,已经把很多内容放在IDATA空间了,并且在链接器定位做了声明,从楼主位可以看出来,IDATA空间已经被定义在了80-ff之间,若不定义,链接器会默认为00-ff空间都是idata空间的。 coody 发表于 2023-4-25 11:30
keil C51,有5种基本数据类型:bdata、 data、 idata、 xdata、 code,前4种是内存的定义,楼主说的不够估 ...
做了N年开发,这个问题认知的很清晰,谢谢您的参与。
这是我一个项目的ram。
如项目使用字节数小于128,keil将全部分配在DATA(0~127)区,而忽视idata声明。
这项目使用了163.6个字节,所以会有一部分变量分配在idata(128~255)区。
对几个全局数组使用了idata声明,是希望keil将它们分配在最后,使以后添加的全局变量可以分配在DATA(0~127)区。
不使用idata声明,keil自动分配的效果也很好,不一定会上述效果差。
IDATA空间已经被定义在了80-ff之间
应该改回00-ff。
我就奇怪,用了idata声明,0~127区间没用完,128之后就开始用了。
页:
[1]