打印

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

[复制链接]
3109|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xdpk|  楼主 | 2008-11-28 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xdpk|  楼主 | 2008-11-28 15:55 | 只看该作者

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

使用特权

评论回复
板凳
xplore| | 2008-11-28 16:07 | 只看该作者

一些偶用的优化方法

1.把编译器优化全部打开
2.改用compact模式,尽量别用large模式,除非有什么必须用large模式的。
3.keil 的51, 连接器是有优化功能的,打开。
4.如上都还不行的话, 把一些类似模块的源文件合并,这样便于编译器优化,有时候这样会有很大效果。

5.如上还不行的话,就自己修改代码吧,一般不超出太多的话都能优化成功的。

使用特权

评论回复
地板
corn51| | 2008-11-28 17:18 | 只看该作者

尽量减少浮点运算。

使用特权

评论回复
5
xdpk|  楼主 | 2008-11-30 18:21 | 只看该作者

好的,试试。

使用特权

评论回复
6
xwj| | 2008-11-30 18:30 | 只看该作者

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

先想法消除所有的警告再说

使用特权

评论回复
7
xdpk|  楼主 | 2008-12-1 11:16 | 只看该作者

警告不影响使用。

使用特权

评论回复
8
xdpk|  楼主 | 2008-12-1 11:41 | 只看该作者

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

4楼:

尽量减少浮点运算。 

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

使用特权

评论回复
9
xdpk|  楼主 | 2008-12-1 11:44 | 只看该作者

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

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

先想法消除所有的警告再说 

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

 

使用特权

评论回复
10
ejack| | 2008-12-1 12:16 | 只看该作者

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

使用特权

评论回复
11
xdpk|  楼主 | 2008-12-1 13:49 | 只看该作者

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

我的观点:不同意使用reentrant。我没说明白,9楼是这个意思吗?

使用特权

评论回复
12
emailli| | 2008-12-1 15:35 | 只看该作者

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

尽量采用调用同一个函数来实现预算,这样可以节省很多空间。

将相同的计算公式 做成函数。

通过传递系数的方式计算。

你需要的是一些优化代码的方法,仅仅通过编译优化是不够的。


使用特权

评论回复
13
xdpk|  楼主 | 2008-12-1 17:09 | 只看该作者

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

使用特权

评论回复
14
yezhenyu| | 2008-12-1 20:54 | 只看该作者

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

确有立杆见影的效果,真是爽极了,C语言的精髓就是算法,随便瞎扯几句。

使用特权

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

本版积分规则

10

主题

41

帖子

0

粉丝