打印

救急!!keil中怎样只让某个文件使用浮点库编译

[复制链接]
3000|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sjgsjg|  楼主 | 2007-3-30 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家救救急!!!,我原有几十K的控制程序(仅定点运算)加了一个浮点运算的子程序(该子程序单独位于新加的一文件内)后ram需求突然大增达到600多了,而我单独编译这两部分时分别为200与90多个,以前重来没有这种需求,不知怎样才能让这两个部分一起编译时的ram需求达到单独编译这两部分时相同数量的效果?
按我我原来的想法,总的RAM应更小,因为那个新加的浮点子程序用的都是局部变量



相关帖子

沙发
ayb_ice| | 2007-3-30 10:46 | 只看该作者

随便说说

  这与库没有任何关系,编译器会自动选择必须用到的程序...

使用特权

评论回复
板凳
xwj| | 2007-3-30 10:51 | 只看该作者

编译器能优化的,你先检查是否有未调用的程序和变量

以及别的数据类型生命是否正确

使用特权

评论回复
地板
computer00| | 2007-3-30 11:02 | 只看该作者

没道理.库是共用的,有一处用,就已经加载了。

使用特权

评论回复
5
xwj| | 2007-3-30 11:11 | 只看该作者

库的RAM是动态的,ROM是只链接使用到的子程序,而且会公用

所以不是哪里使用错了的话 不会大于单独编译的总和的

使用特权

评论回复
6
ayb_ice| | 2007-3-30 11:31 | 只看该作者

随便说说

  看来大家对库不是很了解啊,可以自己建个库测试一下我说的是否是对的...

使用特权

评论回复
7
sjgsjg|  楼主 | 2007-3-30 11:49 | 只看该作者

我是这样子使用的

在我使用这个子程序之前已是一个完整的工程,编译后的ram量为200.3个RAM,
然后再在工程中加入一个只含有一个浮点运算子程序的文件,这个子程序也于工程单独编译过的,只用了几十个RAM,当加入这个子程序后一起编译时(只在原主程序中加了一条调用该子程序的测试语句)就冒出ram不够的错误,提示已用ram 500多个了,谢谢各位的帮助,我再看看会不会是因为已超过256个的内部ram数量而停止覆盖分析了,我试试将变量定位到xdata区试试

使用特权

评论回复
8
xwj| | 2007-3-30 11:53 | 只看该作者

注意:LZ说的是 RAM 占用多的问题,而不是ROM占用多

至于lS说的:
  这与库没有任何关系,编译器会自动选择必须用到的程序... 

我也赞同了这一点:
  ROM是只链接使用到的子程序,而且会公用的


LZ自己检查下程序是否有错误嵌套或多重递归,这样用到的RAM是无法覆盖的;
在就是是否有未调用的程序和变量,对于未调用的程序和变量,编译器是不会做覆盖分析和优化的

这集中情况编译后都会有提示和警告的

使用特权

评论回复
9
sjgsjg|  楼主 | 2007-3-30 11:56 | 只看该作者

多问一下,能否指定一个文件中的函数局部变量存储地址范围?

比如将该文件内的函数局部变量存储地址范围定在xdata:0x000~0x0ff区域内
?

使用特权

评论回复
10
xwj| | 2007-3-30 12:10 | 只看该作者

你声明变量加上xdata 就行了

C下可以绝对定位任意段的地址,但不建议这样做

使用特权

评论回复
11
sjgsjg|  楼主 | 2007-3-30 12:31 | 只看该作者

申明的局部变量可加xdata,但库函数自己产生的中间变量没法

那些能申明的局部变量可以加xdata,但库函数自己的中间变量没法指定空间
比如xdata float a,b,c;
a=34.567;
b=3.14;
在c=sin(a)*b的运算过程,会运用很多临时中间变量,
在只有一个文件的工程中可以指定工程memory model为Large:variables in XDATA来指定所有的变量位于xdata空间内,但现在是与其它文件一起编译,我只想这一个文件的临时变量定位在xdata内,其它的ram存储空间仍然不变,有没有办法实现?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝