打印
[开发工具]

探讨一下ChipON---IDE编译代码低效的原因

[复制链接]
楼主: laoxu
手机看帖
扫描二维码
随时随地手机跟帖
21
laoxu|  楼主 | 2016-6-12 15:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
测试了一下指针操作:
  long La, Lb, Lc;
  long *p, *p1;
  ......
  p = &La;
  p1 = &Lb;
  Lc = *p + *p1;


编译结果超级长,无用功很多,最后结尾调用不存在的 CALL        #0xfff ,CALL        #0xffe  ,CALL        #0xffd  地址,更搞不清了!
个人认为,随便优化一下,程序长度便能缩短一大半。

编译结果如下,

                                           ;        op : GET_VALUE_AT_ADDRESS
                                           ;        .line        23; "../main.c"        Lc = *p + *p1;

000f40   6d03     SET        0x3, 5                       BANKSEL        r0x1008
000f41   0e95     MOVZ        R0, 0x95                    MOVZ        R0, r0x1008
000f42   6d03     SET        0x3, 5                       BANKSEL        STK01
000f43   518b     MOV        0x8b, R0                     MOV        STK01, R0
000f44   6d03     SET        0x3, 5                       BANKSEL        r0x1009
000f45   0e96     MOVZ        R0, 0x96                    MOVZ        R0, r0x1009
000f46   6d03     SET        0x3, 5                       BANKSEL        STK00
000f47   518c     MOV        0x8c, R0                     MOV        STK00, R0
000f48   9800     MOV        R0, #0                       MOV        R0,# 0x00
                                                   PAGESEL        __gptrget4
000f49   d1b1     CALL        #0x1b1                      CALL        __gptrget4
                                                   PAGESEL        $
000f4a   6d03     SET        0x3, 5                       BANKSEL        r0x100E
000f4b   519e     MOV        0x9e, R0                     MOV        r0x100E, R0
000f4c   6d03     SET        0x3, 5                       BANKSEL        STK00
000f4d   508c     MOV        R0, 0x8c                     MOV        R0, STK00
000f4e   6d03     SET        0x3, 5                       BANKSEL        r0x100F
000f4f   519d     MOV        0x9d, R0                     MOV        r0x100F, R0
000f50   6d03     SET        0x3, 5                       BANKSEL        STK01
000f51   508b     MOV        R0, 0x8b                     MOV        R0, STK01
000f52   6d03     SET        0x3, 5                       BANKSEL        r0x1010
000f53   519c     MOV        0x9c, R0                     MOV        r0x1010, R0
000f54   6d03     SET        0x3, 5                       BANKSEL        STK02
000f55   508a     MOV        R0, 0x8a                     MOV        R0, STK02
000f56   6d03     SET        0x3, 5                       BANKSEL        r0x1011
000f57   519b     MOV        0x9b, R0                     MOV        r0x1011, R0
                                           ;        op : GET_VALUE_AT_ADDRESS
000f58   6d03     SET        0x3, 5                       BANKSEL        r0x100B
000f59   0e98     MOVZ        R0, 0x98                    MOVZ        R0, r0x100B
000f5a   6d03     SET        0x3, 5                       BANKSEL        STK01
000f5b   518b     MOV        0x8b, R0                     MOV        STK01, R0
000f5c   6d03     SET        0x3, 5                       BANKSEL        r0x100D
000f5d   0e99     MOVZ        R0, 0x99                    MOVZ        R0, r0x100D
000f5e   6d03     SET        0x3, 5                       BANKSEL        STK00
000f5f   518c     MOV        0x8c, R0                     MOV        STK00, R0
000f60   6d03     SET        0x3, 5                       BANKSEL        r0x100C
000f61   0e9a     MOVZ        R0, 0x9a                    MOVZ        R0, r0x100C
                                                   PAGESEL        __gptrget4
000f62   d1b1     CALL        #0x1b1                      CALL        __gptrget4
                                                   PAGESEL        $
000f63   6d03     SET        0x3, 5                       BANKSEL        r0x1012
000f64   519f     MOV        0x9f, R0                     MOV        r0x1012, R0
000f65   6d03     SET        0x3, 5                       BANKSEL        STK00
000f66   508c     MOV        R0, 0x8c                     MOV        R0, STK00
000f67   6d03     SET        0x3, 5                       BANKSEL        r0x100A
000f68   5197     MOV        0x97, R0                     MOV        r0x100A, R0
000f69   6d03     SET        0x3, 5                       BANKSEL        STK01
000f6a   508b     MOV        R0, 0x8b                     MOV        R0, STK01
000f6b   6d03     SET        0x3, 5                       BANKSEL        r0x1009
000f6c   5196     MOV        0x96, R0                     MOV        r0x1009, R0
000f6d   6d03     SET        0x3, 5                       BANKSEL        STK02
000f6e   508a     MOV        R0, 0x8a                     MOV        R0, STK02
000f6f   6d03     SET        0x3, 5                       BANKSEL        r0x1008
000f70   5195     MOV        0x95, R0                     MOV        r0x1008, R0
                                           ;        op : +
000f71   6d03     SET        0x3, 5                       BANKSEL        r0x1011
000f72   509b     MOV        R0, 0x9b                     MOV        R0, r0x1011
000f73   6d03     SET        0x3, 5                       BANKSEL        r0x1008
000f74   2095     ADD        R0, 0x95                     ADD        R0, r0x1008
000f75   6d03     SET        0x3, 5                       BANKSEL        r0x100B
000f76   5198     MOV        0x98, R0                     MOV        r0x100B, R0
000f77   6d03     SET        0x3, 5                       BANKSEL        r0x1010
000f78   509c     MOV        R0, 0x9c                     MOV        R0, r0x1010
000f79   6d03     SET        0x3, 5                       BANKSEL        r0x100D
000f7a   5199     MOV        0x99, R0                     MOV        r0x100D, R0
000f7b   6d03     SET        0x3, 5                       BANKSEL        r0x1009
000f7c   0e96     MOVZ        R0, 0x96                    MOVZ        R0, r0x1009
000f7d   7003     JNB        0x3, 0                       JNB        PSW, 0
000f7e   ff10     INC        R0                           INC        R0
000f7f   7203     JNB        0x3, 2                       JNB        PSW, 2
000f80   cf83     JMP        #0xf83                       JMP        _00006_DS_
000f81   6d03     SET        0x3, 5                       BANKSEL        r0x100D
000f82   2199     ADD        0x99, R0                     ADD        r0x100D, R0
                                           _00006_DS_
000f83   6d03     SET        0x3, 5                       BANKSEL        r0x100F
000f84   509d     MOV        R0, 0x9d                     MOV        R0, r0x100F
000f85   6d03     SET        0x3, 5                       BANKSEL        r0x100C
000f86   519a     MOV        0x9a, R0                     MOV        r0x100C, R0
000f87   6d03     SET        0x3, 5                       BANKSEL        r0x100A
000f88   0e97     MOVZ        R0, 0x97                    MOVZ        R0, r0x100A
000f89   7003     JNB        0x3, 0                       JNB        PSW, 0
000f8a   ff10     INC        R0                           INC        R0
000f8b   7203     JNB        0x3, 2                       JNB        PSW, 2
000f8c   cf8f     JMP        #0xf8f                       JMP        _00007_DS_
000f8d   6d03     SET        0x3, 5                       BANKSEL        r0x100C
000f8e   219a     ADD        0x9a, R0                     ADD        r0x100C, R0
                                           _00007_DS_
000f8f   6d03     SET        0x3, 5                       BANKSEL        r0x100E
000f90   509e     MOV        R0, 0x9e                     MOV        R0, r0x100E
000f91   6d03     SET        0x3, 5                       BANKSEL        r0x1013
000f92   51a0     MOV        0xa0, R0                     MOV        r0x1013, R0
000f93   6d03     SET        0x3, 5                       BANKSEL        r0x1012
000f94   0e9f     MOVZ        R0, 0x9f                    MOVZ        R0, r0x1012
000f95   7003     JNB        0x3, 0                       JNB        PSW, 0
000f96   ff10     INC        R0                           INC        R0
000f97   7203     JNB        0x3, 2                       JNB        PSW, 2
000f98   cf9b     JMP        #0xf9b                       JMP        _00008_DS_
000f99   6d03     SET        0x3, 5                       BANKSEL        r0x1013
000f9a   21a0     ADD        0xa0, R0                     ADD        r0x1013, R0
                                           ;        op : INLINEASM

                                           .code
0001b1   a800     XOR        R0, #0              
0001b2   7203     JNB        0x3, 2              
0001b3   c1b8     JMP        #0x1b8              
0001b4   a880     XOR        R0, #0x80           
0001b5   7203     JNB        0x3, 2              
0001b6   c1da     JMP        #0x1da              
0001b7   c1f6     JMP        #0x1f6              
0001b8   6d03     SET        0x3, 5              
0001b9   528b     MOV        R1, 0x8b            
0001ba   508c     MOV        R0, 0x8c            
0001bb   5186     MOV        0x86, R0            
0001bc   6d03     SET        0x3, 5              
0001bd   6503     CLR        0x3, 5              
0001be   7086     JNB        0x86, 0            
0001bf   6d03     SET        0x3, 5              
0001c0   f708     LD        R0, [R1]            
0001c1   6d03     SET        0x3, 5              
0001c2   518a     MOV        0x8a, R0            
0001c3   ff11     INC        R1                  
0001c4   6d03     SET        0x3, 5              
0001c5   6503     CLR        0x3, 5              
0001c6   7086     JNB        0x86, 0            
0001c7   6d03     SET        0x3, 5              
0001c8   f708     LD        R0, [R1]            
0001c9   6d03     SET        0x3, 5              
0001ca   518b     MOV        0x8b, R0            
0001cb   ff11     INC        R1                  
0001cc   6d03     SET        0x3, 5              
0001cd   6503     CLR        0x3, 5              
0001ce   7086     JNB        0x86, 0            
0001cf   6d03     SET        0x3, 5              
0001d0   f708     LD        R0, [R1]            
0001d1   6d03     SET        0x3, 5              
0001d2   518c     MOV        0x8c, R0            
0001d3   ff11     INC        R1                  
0001d4   6d03     SET        0x3, 5              
0001d5   6503     CLR        0x3, 5              
0001d6   7086     JNB        0x86, 0            
0001d7   6d03     SET        0x3, 5              
0001d8   f708     LD        R0, [R1]            
0001d9   c1f6     JMP        #0x1f6              
0001da   d208     CALL        #0x208            
0001db   6d03     SET        0x3, 5              
0001dc   518a     MOV        0x8a, R0            
0001dd   0d8b     INCJZ        0x8b              
0001de   078c     DEC        0x8c               
0001df   0b8c     INC        0x8c               
0001e0   d208     CALL        #0x208            
0001e1   6d03     SET        0x3, 5              
0001e2   5189     MOV        0x89, R0            
0001e3   0d8b     INCJZ        0x8b              
0001e4   078c     DEC        0x8c               
0001e5   0b8c     INC        0x8c               
0001e6   d208     CALL        #0x208            
0001e7   6d03     SET        0x3, 5              
0001e8   5188     MOV        0x88, R0            
0001e9   0d8b     INCJZ        0x8b              
0001ea   078c     DEC        0x8c               
0001eb   0b8c     INC        0x8c               
0001ec   d208     CALL        #0x208            
0001ed   6d03     SET        0x3, 5              
0001ee   5187     MOV        0x87, R0            
0001ef   508a     MOV        R0, 0x8a            
0001f0   518a     MOV        0x8a, R0            
0001f1   5089     MOV        R0, 0x89            
0001f2   518b     MOV        0x8b, R0            
0001f3   5088     MOV        R0, 0x88            
0001f4   518c     MOV        0x8c, R0            
0001f5   5087     MOV        R0, 0x87            
0001f6   0008     CRET
0001f7   a800     XOR        R0, #0              
0001f8   7203     JNB        0x3, 2              
0001f9   c1fe     JMP        #0x1fe              
0001fa   a880     XOR        R0, #0x80           
0001fb   7203     JNB        0x3, 2              
0001fc   c208     JMP        #0x208              
0001fd   c20c     JMP        #0x20c              
0001fe   6d03     SET        0x3, 5              
0001ff   528b     MOV        R1, 0x8b            
000200   508c     MOV        R0, 0x8c            
000201   5186     MOV        0x86, R0            
000202   6d03     SET        0x3, 5              
000203   6503     CLR        0x3, 5              
000204   7086     JNB        0x86, 0            
000205   6d03     SET        0x3, 5              
000206   f708     LD        R0, [R1]            
000207   c20c     JMP        #0x20c              
000208   6d03     SET        0x3, 5              
000209   528c     MOV        R1, 0x8c            
00020a   508b     MOV        R0, 0x8b            
00020b   d20d     CALL        #0x20d            
00020c   0008     CRET                    
00020d   530a     MOV        0xa, R1            
00020e   5102     MOV        0x2, R0            
00020f   dfff     CALL        #0xfff            
000210   5130     MOV        0x30, R0            
000211   ffff     NOPZ                    
000212   ffff     NOPZ                    
000213   dffe     CALL        #0xffe            
000214   5137     MOV        0x37, R0            
000215   ffff     NOPZ                    
000216   ffff     NOPZ                    
000217   dffd     CALL        #0xffd            
000218   511c     MOV        0x1c, R0            
000219   ffff     NOPZ                    
00021a   ffff     NOPZ                    
00021b   0008     CRET                    


使用特权

评论回复
22
Jim12345| | 2016-6-12 15:28 | 只看该作者
首先赞一下楼主是个有心人!
我也用这个程序编译了一下,实际使用程序空间为1232字,具体见附件。楼主的2146字实际是因为没有优化,注意到我的附图中BANKSEL前出的部分,没有汇编代码的实际都是优化掉了。


造成这个现象的原因多样化,一方面没有开优化,一方面对于int/long型的加法有ADDC/SUBC效率能提高不少,KF8 V1内核不带乘法和除法也增加了代码长度。

使用特权

评论回复
23
wxmcu| | 2016-6-12 15:30 | 只看该作者
他们家编译器没那么不堪,楼主那段代码编译后banksel 98%都被优化了。大家可以自己去试试。

2016-06-12_15.28.10.jpg (101.11 KB )

2016-06-12_15.28.10.jpg

使用特权

评论回复
24
Jim12345| | 2016-6-12 15:33 | 只看该作者
本帖最后由 Jim12345 于 2016-6-12 15:46 编辑

       我们的内核有V1版本和V2版本,V1只针对4K word及以下, V2针对8Kword及以下(多bank选择时仍然一条指令完成,增加硬件乘法和除法),一般情况这么小的内存(flash、RAM)容量芯片主要是做控制用的,一般没有考虑复杂的数学计算,编译器也就没在计算上做特别的优化,如浮点、long型支持都效率不高,结构体的支持也不是很全面,这些都需要在V3指令集上改进了,但复杂数学-运算我们更倾向于用高位处理器来实现 :-),8位MCU的特点还是在控制和她的高可靠性。

       不过还是很赞楼主用一个特别的程序把8位MCU的短板都揭示出来了,确实不适合复杂的数学-运算啊。

使用特权

评论回复
25
laoxu|  楼主 | 2016-6-12 15:54 | 只看该作者
V1 和 V2 指今集相差不大(仅V2增加了一个附加的硬件乘法和除法器),希望V3指令集上有所改进了,不指望高大尚,下面几条应重点考虑。

1.  增加带CY的的加减法指令,能有效提高运算速度和优化代码。
2.  有些重点之重点的特殊寄存器(例如PSW)必须做到每页都有镜像,能不分页操作,这样,能提速不少。
3.  增加最基本的查表指令,能从程序存储器中直接读数据,不要像现在这样,数据表中的常量,需要在程序中对变量一一赋值,极占程序容量。
4.  其他的,想到再补充吧。

使用特权

评论回复
26
laoxu|  楼主 | 2016-6-12 15:58 | 只看该作者
本帖最后由 laoxu 于 2016-6-12 15:59 编辑

不改进的话,那怕一个汇编的高手,用汇编编程,都会感到犹如**筋,食之无味。

使用特权

评论回复
27
Jim12345| | 2016-6-12 16:03 | 只看该作者

1.  增加带CY的的加减法指令,能有效提高运算速度和优化代码。
==========================
非常正确!!

2.  有些重点之重点的特殊寄存器(例如PSW)必须做到每页都有镜像,能不分页操作,这样,能提速不少。
=============================
这个从V2开始,PSW及70-7F的RAM都是这样处理的;
3.  增加最基本的查表指令,能从程序存储器中直接读数据,不要像现在这样,数据表中的常量,需要在程序中对变量一一赋值,极占程序容量。
=================================
应该都提供一个库文件,能够查16位的表。可能编译器还没有添加,很快会提供一个应用笔记。


很谢谢你的建议。

使用特权

评论回复
28
laoxu|  楼主 | 2016-6-12 16:04 | 只看该作者
Jim12345 发表于 2016-6-12 15:28
首先赞一下楼主是个有心人!
我也用这个程序编译了一下,实际使用程序空间为1232字,具体见附件。楼主的214 ...

我使用默认值编译的,请问优化开关在哪设置?

使用特权

评论回复
29
laoxu|  楼主 | 2016-6-12 16:11 | 只看该作者
wxmcu 发表于 2016-6-12 15:30
他们家编译器没那么不堪,楼主那段代码编译后banksel 98%都被优化了。大家可以自己去试试。 ...

优秀的编译器,没那么好搞的!

总要一步一个脚印,慢慢成长,ChipON---IDE编译器,总体感觉,人机界面,操作上都做的不错。

至于优化率,到达到 98% ? 太夸张了吧? 神仙也做不到吧~~~

使用特权

评论回复
30
EthanHen| | 2016-6-12 16:17 | 只看该作者
laoxu 发表于 2016-6-12 16:04
我使用默认值编译的,请问优化开关在哪设置?

你看一下,是构建了release还是debug??在上面的工具栏中可以选择,默认是构建release,优化效率会提高一些。

使用特权

评论回复
31
Jim12345| | 2016-6-12 16:19 | 只看该作者
配置项选择release模式(不要选择debug模式),开O3优化,如图

使用特权

评论回复
32
laoxu|  楼主 | 2016-6-12 16:24 | 只看该作者
我能熟练运用 汇编,编写 AVR, PIC,以及台系的那些 类PIC 的单片机,但是,ChipON单片机,由于少了些关键的指令,感觉编写起来有点吃力,我相信,ChipON公司的那些同行,也应该有同感,希望 ChipON 的 V3内核,能越做越好。

ChipON 单片机,外围丰富,价格便宜,总体性能不错,很适合做些小产品。

使用特权

评论回复
33
gbbfbaa| | 2016-6-12 16:30 | 只看该作者
laoxu 发表于 2016-6-12 16:11
优秀的编译器,没那么好搞的!

总要一步一个脚印,慢慢成长,ChipON---IDE编译器,总体感觉,人机界面, ...

那位仁兄提到的banksel 的句子基本被优化了98%

使用特权

评论回复
34
Jim12345| | 2016-6-12 16:31 | 只看该作者
linqing171 发表于 2016-6-12 14:16
000f30   6d03     SET        0x3, 5                       BANKSEL        r0x1000
000f31   508d     M ...

long+long是直接编译的,long*long和long/long是库,现在看来,这个库可以用手写优化一下。

使用特权

评论回复
35
laoxu|  楼主 | 2016-6-12 16:36 | 只看该作者
EthanHen 发表于 2016-6-12 16:17
你看一下,是构建了release还是debug??在上面的工具栏中可以选择,默认是构建release,优化效率会提高 ...

我现在用的是 debug,但切换到 release,没法编译,显示 ALL

另外,我的理解是,debug模式,比 release模式,代码长约 256字节(装载DEBUG监控代码),其他的优化率,应该不会有啥大的出入。

使用特权

评论回复
36
laoxu|  楼主 | 2016-6-12 16:37 | 只看该作者
Jim12345 发表于 2016-6-12 16:19
配置项选择release模式(不要选择debug模式),开O3优化,如图

谢谢
我试试!

使用特权

评论回复
37
laoxu|  楼主 | 2016-6-12 16:50 | 只看该作者
Jim12345 发表于 2016-6-12 16:19
配置项选择release模式(不要选择debug模式),开O3优化,如图

请问一下,你这个 设置 页面,如何打开?

我没找到。

现在配置项选择release模式,编译结果没什么缩短。

使用特权

评论回复
38
laoxu|  楼主 | 2016-6-12 16:52 | 只看该作者
配置项选择release模式,第一次程序能编译,现在又不能编译了(程序没变)。


****项目335配置Release的构建****

make -k all
make: Nothing to be done for `all'.

**** Build Finished ****

使用特权

评论回复
39
laoxu|  楼主 | 2016-6-12 16:55 | 只看该作者
配置项改为 debug模式,程序就能编译,再改回release模式, 又不能编译了。

使用特权

评论回复
40
laoxu|  楼主 | 2016-6-12 17:00 | 只看该作者
Jim12345 发表于 2016-6-12 16:03
1.  增加带CY的的加减法指令,能有效提高运算速度和优化代码。
==========================
非常正确!!

2.  这个从V2开始,PSW及70-7F的RAM都是这样处理的;
--------------------------------------------------------------------------------
这是个好消息,用汇编就方便很多,不用来回切换bank



3.  增加最基本的查表指令,能从程序存储器中直接读数据,不要像现在这样,数据表中的常量,需要在程序中对变量一一赋值,极占程序容量。
=================================
应该都提供一个库文件,能够查16位的表。可能编译器还没有添加,很快会提供一个应用笔记。

V1, V2版本都做不到吧?没有硬件的支持(指令集中没有相关指令),神仙也做不到~~~

使用特权

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

本版积分规则