打印

请问如果精简程序code长度

[复制链接]
4550|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alphal|  楼主 | 2007-3-29 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序现在编译出来有27K的code空间,(c语言,keil2,优化级别为8级),而我看别人的产品功能上差不多,我的功能多一点,但别人用at89c52就装下去了,用的是汇编语言,我很惊讶他怎么能写的那么小,虽然我的程序功能多一点,但是code空间不应该有那么大的差距的。
现在老大也发话了,要优化代码,压缩code空间,我还不知道如何下手,请各位大虾指点一下:可以通过哪些手段来精简代码长度?

相关帖子

沙发
一无所知| | 2007-3-29 11:13 | 只看该作者

我也随便说说

个人的经验感觉,通过手段来精简代码往往减不了太多的。27K的代码能减到20K就很不错的。更多的可能要从程序的设计上着手,比如说你的数据结构是否合理,算法是否能够有更优化的(这样子的话,往往代码是要大动的)。

使用特权

评论回复
板凳
alphal|  楼主 | 2007-3-29 11:28 | 只看该作者

数据结构,算法?

我们的程序主要是做控制的,没有什么复杂的数据结构和算法的,对应功能的程序设计也应该就那样,似乎精简不了,我想可能更多的要考虑语句,特别是循环语句的设计。
但我不清楚程序的哪些方面会和代码code长度有关,希望指点!

使用特权

评论回复
地板
ayb_ice| | 2007-3-29 11:29 | 只看该作者

随便说说

程序结构上下功夫...

使用特权

评论回复
5
alphal|  楼主 | 2007-3-29 11:31 | 只看该作者

程序结构?有道理

但是如何进行?

结构设计的注意点是什么?

使用特权

评论回复
6
joson| | 2007-3-29 11:35 | 只看该作者

尽量少用 switch 语句,这东东编译出来的代码较大。

使用特权

评论回复
7
alphal|  楼主 | 2007-3-29 11:44 | 只看该作者

switch不用不行哦

我们是主从设备,通信协议的解析不用switch用什么啊?if-else岂不太麻烦。

使用特权

评论回复
8
zhiwei| | 2007-3-29 12:40 | 只看该作者

哪就用指针函数啊

使用特权

评论回复
9
ayb_ice| | 2007-3-29 13:21 | 只看该作者

随便说说

  可以随便帖上一段代码来看看,大家帮助分析一下,也可以说说你的思路,看看是否最合理...

使用特权

评论回复
10
high| | 2007-3-29 13:40 | 只看该作者

keil有没有link报告?

分析报告,具体看那个模块大。针对性的改。

此外,标准库会占用的空间,占个10几k都正常。仔细鉴别

使用特权

评论回复
11
alphal|  楼主 | 2007-3-29 14:28 | 只看该作者

re:各位大虾

to zhiwei:嘿嘿,指针函数不会用,好用吗,有效吗?

to ayb_ice :贴代码,不太好办。程序就是通讯协议解析,不知道贴哪一块好,简单的不值得贴,不简单大家看的困难,引入新的麻烦,不好。

to high:link报告在哪个文件里,另外:问题的关键不是找到哪儿大,而是怎么整改。

使用特权

评论回复
12
forthlab| | 2007-3-29 16:02 | 只看该作者

也可能是程序结构问题。

估计你的程序可以有不同的实现思路,所以结果也不一样,有的相应好,代码多,有的代码共享,但相应慢,功能少。
怀疑只是从语法角度不能解决问题,可能要全部推倒重来。

使用特权

评论回复
13
alphal|  楼主 | 2007-3-29 16:57 | 只看该作者

程序结构?

结构的事情比较麻烦......

使用特权

评论回复
14
lixun00| | 2007-3-29 17:16 | 只看该作者

程序框架

使用特权

评论回复
15
happystar| | 2007-3-29 18:32 | 只看该作者

你把你现在程序运行的思路说出来

你把你现在程序运行的思路说出来,你代码大肯定是你程序整体思路的问题。光从代码入手根本解决不了多少问题的,所以把代码贴出来也没什么用处。
如果你换个思路来描述你现在这个程序框架,那么就可以省多了。

使用特权

评论回复
16
王紫豪| | 2007-3-29 19:19 | 只看该作者

如果想小的话,少用系统的标准函数!!然后优化可以用9,我都是

使用特权

评论回复
17
tj_zhaozq| | 2007-4-1 15:47 | 只看该作者

看着汇编写C

1. if ...else....替代SWITCH。 
2. do while(--i)替代 for(i);
3. 中断用的REG和非中断程序的REG RANK要不一样(USING ...),避免频繁压栈和出栈。 
4. 访问固定地址的外部数据时,好像用直接指针方式比较费代码(忘记了,不要耻笑)。
5. 适当的使用GOTO(这是单片机程序不一定非要像计算机一样忌讳GOTO)。
6. 其他的是算法上的问题了,KEIL C对不同的一些C语句编译后的速度和效率有比较大的出入。有C语句看上去很差,但速度和效率和写的好看的C语句会差很多。DO WHILE和FOR就是最好的例子(不妨试试)。

使用特权

评论回复
18
happystar| | 2007-4-1 18:06 | 只看该作者

参考意见

把标准库函数去调,自己来写。这个方法可以减少点。

使用特权

评论回复
19
ayb_ice| | 2007-4-2 07:53 | 只看该作者

随便说说

  标准库都是专家写的,效率是很高的,就算是比自定义的要大些,也不可能大出这么多代码,肯定是程序结构的问题...
建议使用SMALL...

使用特权

评论回复
20
high| | 2007-4-2 11:23 | 只看该作者

for exp(ads1.2):

1.比如自己实现printf,会比标准库的省些。因为可以裁减,不用浮点运算之类的。所以不用或者少用标准库。

2.优化选项for space.


下面报告显示,整体40多k, 库占了10多k.

Image component sizes
      Code    RO Data    RW Data    ZI Data      Debug   Object Name
       780          0          0          0       2956   OS_MEM.o
     10904          0          1        488      25932   M500AuC.o
      1404          0          0          0       4372   OS_MBOX.o
      2304          0          0          0       5988   OS_Q.o
       156         64          0          0          0   anon$$obj.o
       628          0          0          0       1956   OS_TIME.o
       184          0          0        292        256   Startup.o
         0         27          0          0        652   version.o
      2788          0          0          0      12944   OS_FLAG.o
       788          0          0          8       6660   RDIO.o
       272          0          0        128        292   Os_cpu_a.o
        60          0          0          4       2532   print.o
      4572       1176          0       8448      13540   main.o
       648          0          0          4      18616   Os_cpu_c.o
       840          0          0          2       8896   PC.o
      1840         32          0         68       8028   target.o
      2404          0          0          0       5756   OS_TASK.o
       536          0          0          0        220   IRQ.o
      3068        264          0       4884      11828   OS_CORE.o
------------------------------------------------------------------------
     34176       1563          1      14326     131424   Object Totals
------------------------------------------------------------------------
      Code    RO Data    RW Data    ZI Data      Debug   Library Member Name
        72          0          0          0         60   classify.o
       164          0          0          0         84   strcmp.o
       268          0          0          0        136   stkheap1.o
       108          0          0          0         84   f2d.o
        16          0          0          0         68   llcmpu.o
        80          0          0          0        104   kernel.o
        72          0          0          0         68   rt_memclr.o
        92          0          0          0         84   rt_memclr_w.o
        68          0          0          0         96   _fptrap.o
        16          0          0          0          0   callvia.o
       568          0          0          0        168   dunder.o
         8          0          0          0         60   printf1.o
       156          0          0          0         92   retnan.o
         4          0          0          0         76   _no_redirect.o
        68          0          0          0        100   _sprintf.o
       724          0          0          0        100   strftime.o
        16          0          0          0         68   llneg.o
      2276          0          0          0        568   btod.o
         8          0          0          0         60   ferror.o
         8          0          0          0         68   use_no_semi.o
        16          0          0          0         68   llcmpge.o
        68          0          0          0         84   dcheck.o
       108          0          0          0         88   dflt.o
        16          0          0         96         68   libspace.o
        76          0          0          0         76   strlen.o
        68          0          0          0         68   rtsdiv10.o
       108          0          0          0         88   fflt.o
        88          0          0          0         76   dtoi.o
        32          0          0          0         84   rt_raise.o
       184          0          0          0         60   rt_memcpy.o
        44          0          0          0         72   llushr.o
       172          0          0          0        132   trapv.o
        44        360          0          0         80   lc_time_c.o
       240        148          0          0        104   bigflt0.o
       280        299          0          0         84   defsig.o
      1432          0          0          0        200   _fp_disp.o
       168          0          0        228        140   rand.o
        56          0          0          0         88   _printf.o
        20          0          0          0         76   _sputc.o
       220          0          0          0         60   __main.o
       112          0          0          0         84   rt_memcpy_w.o
        24          0          0          0         80   rt_fp_status_addr.o
        68          0          0          0        100   sprintf.o
        48          0          0          0         68   rtudiv10.o
      2348          0          0          0        160   __vfpntf.o
        20          0          0          0         80   exit.o
       360          0          0          0        120   except.o
        44         28          0          0         80   lc_numeric_c.o
        68          0          0          0         88   __raise.o
        28          0          0          0         60   fcheck1.o
        64          0          0          0         80   istatus.o
        16          0          0          0         68   lladdlu.o
        24          0          0          0         60   rt_memset.o
       184          0          0          0        136   lib_init.o
       704          0          0          0        128   dmul_mull.o
        28          0          0          0         80   fpinit.o
       216          0          0          0         68   rt_sdiv.o
       164          0          0          0         96   lludiv10.o
       196          0          0          0         68   rt_udiv.o
------------------------------------------------------------------------
     12948        835          0        324       5644   Library Totals
------------------------------------------------------------------------
      Code    RO Data    RW Data    ZI Data      Debug   Library Name
       160          0          0          0        136   m_t_pu.l
      2480          0          0          0       1264   f_t_p.l
     10308        835          0        324       4244   c_t__un.l
  ------------------------------------------------------------------------
     12948        835          0        324       5644   Library Totals
    ------------------------------------------------------------------------

================================================================================


      Code    RO Data    RW Data    ZI Data      Debug   


     47124       2398          1      14650     137068   Grand Totals

================================================================================


    Total RO  Size(Code + RO Data)                49522 (  48.36kB)

    Total RW  Size(RW Data + ZI Data)             14651 (  14.31kB)

    Total ROM Size(Code + RO Data + RW Data)      49523 (  48.36kB)

================================================================================


Translation to Intel 32 bit Hex format successful.

使用特权

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

本版积分规则

112

主题

473

帖子

1

粉丝