keil:p89c668,在Large模式下,代码大小为64k。请问怎么优化?

[复制链接]
4249|13
 楼主| xdpk 发表于 2008-11-28 14:23 | 显示全部楼层 |阅读模式
keil:单片机为p89c668,在Large模式下编译通过,代码大小已大于64k。由于程序升级的需要,必须精简代码。各位高手:请问有哪几条路径可以走?
 楼主| xdpk 发表于 2008-11-28 15:55 | 显示全部楼层

自己顶一下!感觉:数据处理运算很多。

  
xplore 发表于 2008-11-28 16:07 | 显示全部楼层

一些偶用的优化方法

1.把编译器优化全部打开<br />2.改用compact模式,尽量别用large模式,除非有什么必须用large模式的。<br />3.keil&nbsp;的51,&nbsp;连接器是有优化功能的,打开。<br />4.如上都还不行的话,&nbsp;把一些类似模块的源文件合并,这样便于编译器优化,有时候这样会有很大效果。<br /><br />5.如上还不行的话,就自己修改代码吧,一般不超出太多的话都能优化成功的。
corn51 发表于 2008-11-28 17:18 | 显示全部楼层

尽量减少浮点运算。
 楼主| xdpk 发表于 2008-11-30 18:21 | 显示全部楼层

好的,试试。

  
xwj 发表于 2008-11-30 18:30 | 显示全部楼层

64k是65536,还有1001字节的空间

先想法消除所有的警告再说
 楼主| xdpk 发表于 2008-12-1 11:16 | 显示全部楼层

警告不影响使用。

  
 楼主| xdpk 发表于 2008-12-1 11:41 | 显示全部楼层

我的程序中没有浮点运算。乘除法运算比较多。

4楼:<br /><br />尽量减少浮点运算。&nbsp;<br /><br />************我的程序中没有浮点运算。乘除法运算比较多。****<br />&nbsp;<br />
 楼主| xdpk 发表于 2008-12-1 11:44 | 显示全部楼层

增加reentrant,警告消除,代码变大!

6楼:&nbsp;64k是65536,还有1001字节的空间&nbsp;<br /><br />先想法消除所有的警告再说&nbsp;<br /><br />***********<br />***&nbsp;WARNING&nbsp;L15:&nbsp;MULTIPLE&nbsp;CALL&nbsp;TO&nbsp;SEGMENT<br />&nbsp;&nbsp;&nbsp;&nbsp;SEGMENT:&nbsp;?PR?SWITCHALLBECKON?PANEL_DISP<br />&nbsp;&nbsp;&nbsp;&nbsp;CALLER1:&nbsp;?C_C51STARTUP<br />&nbsp;&nbsp;&nbsp;&nbsp;CALLER2:&nbsp;?PR?UART_RECV?PANEL_DISP<br />我的程序编译出来就这3个警告,但是程序可以正常下载运行。但是我觉得有这些警告会使程序存在bug。从字面上看是它的意思是我程序中接受函数UART_RECV()多调用了analogAllBeckon()、switchAllBeckon()。<br />因为51的普通函数是不可重入的,变量放在固定的地址,两个函数同时运行时,就会修改同一个变量,从而导致结果错误。于是我在analogAllBeckon()、switchAllBeckon()函数后面加了void&nbsp;analogAllBeckon()reentrant{//All&nbsp;Analog&nbsp;data&nbsp;beckon使程序消除了警告。这种方法是表明函数是可被多哥任务调用而不修改函数里边的变量值,以此来实现函数的重入性。<br />关于reentrant的使用Keil的官方论坛上有详细的讨论.<br />Andy&nbsp;Neil(官方工程师)建议&quot;Are&nbsp;you&nbsp;sure&nbsp;that&nbsp;you&nbsp;really&nbsp;need&nbsp;to&nbsp;make&nbsp;everything&nbsp;reentrant?...A&nbsp;reading&nbsp;of&nbsp;the&nbsp;Keil&nbsp;app&nbsp;notes&nbsp;&&nbsp;knowledgebase&nbsp;articles&nbsp;on&nbsp;this&nbsp;subject&nbsp;showed&nbsp;that&nbsp;it&nbsp;was&nbsp;not&nbsp;necessary.&nbsp;&quot;由于每一次调用被reentrant声明的函数都要把函数的参数和内部变量压栈,所以很容易使堆栈区溢出,S52只有256Bytes的data段,一个简单的函数如果有一个参数三个内部变量,则需要压栈4字节以上,这还不包括函数调用堆栈.reentrant其实并不是适合低端的单片机,keil论坛上有人说对于那些有KB以上RAM的单片机reentrant才适合.**********<br />我的代码改用reentrant后,代码量增大。<br /><br />&nbsp;<br />
ejack 发表于 2008-12-1 12:16 | 显示全部楼层

回9楼:严重的方向性错误。

  
 楼主| xdpk 发表于 2008-12-1 13:49 | 显示全部楼层

10楼: 回9楼:严重的方向性错误。

我的观点:不同意使用reentrant。我没说明白,9楼是这个意思吗?
emailli 发表于 2008-12-1 15:35 | 显示全部楼层

把乘除运算尽量用一个函数来实现

尽量采用调用同一个函数来实现预算,这样可以节省很多空间。<br /><br />将相同的计算公式&nbsp;做成函数。<br /><br />通过传递系数的方式计算。<br /><br />你需要的是一些优化代码的方法,仅仅通过编译优化是不够的。<br /><br /><br />
 楼主| xdpk 发表于 2008-12-1 17:09 | 显示全部楼层

谢谢12楼的建议,感觉不错。继续修改。

  
yezhenyu 发表于 2008-12-1 20:54 | 显示全部楼层

嘿嘿俺就用12L的方法节省了好几K的ROM空间

确有立杆见影的效果,真是爽极了,C语言的精髓就是算法,随便瞎扯几句。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部