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,             
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,             
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,             
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,             
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,             
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                  


Jim12345 发表于 2016-6-12 15:28

首先赞一下楼主是个有心人!
我也用这个程序编译了一下,实际使用程序空间为1232字,具体见附件。楼主的2146字实际是因为没有优化,注意到我的附图中BANKSEL前出的部分,没有汇编代码的实际都是优化掉了。


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

wxmcu 发表于 2016-6-12 15:30

他们家编译器没那么不堪,楼主那段代码编译后banksel 98%都被优化了。大家可以自己去试试。

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的短板都揭示出来了,确实不适合复杂的数学-运算啊。

laoxu 发表于 2016-6-12 15:54

V1 和 V2 指今集相差不大(仅V2增加了一个附加的硬件乘法和除法器),希望V3指令集上有所改进了,不指望高大尚,下面几条应重点考虑。

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

laoxu 发表于 2016-6-12 15:58

本帖最后由 laoxu 于 2016-6-12 15:59 编辑

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

Jim12345 发表于 2016-6-12 16:03


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

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


很谢谢你的建议。

laoxu 发表于 2016-6-12 16:04

Jim12345 发表于 2016-6-12 15:28
首先赞一下楼主是个有心人!
我也用这个程序编译了一下,实际使用程序空间为1232字,具体见附件。楼主的214 ...

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

laoxu 发表于 2016-6-12 16:11

wxmcu 发表于 2016-6-12 15:30
他们家编译器没那么不堪,楼主那段代码编译后banksel 98%都被优化了。大家可以自己去试试。 ...

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

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

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

EthanHen 发表于 2016-6-12 16:17

laoxu 发表于 2016-6-12 16:04
我使用默认值编译的,请问优化开关在哪设置?

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

Jim12345 发表于 2016-6-12 16:19

配置项选择release模式(不要选择debug模式),开O3优化,如图

laoxu 发表于 2016-6-12 16:24

我能熟练运用 汇编,编写 AVR, PIC,以及台系的那些 类PIC 的单片机,但是,ChipON单片机,由于少了些关键的指令,感觉编写起来有点吃力,我相信,ChipON公司的那些同行,也应该有同感,希望 ChipON 的 V3内核,能越做越好。

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

gbbfbaa 发表于 2016-6-12 16:30

laoxu 发表于 2016-6-12 16:11
优秀的编译器,没那么好搞的!

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

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

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是库,现在看来,这个库可以用手写优化一下。{:titter:}

laoxu 发表于 2016-6-12 16:36

EthanHen 发表于 2016-6-12 16:17
你看一下,是构建了release还是debug??在上面的工具栏中可以选择,默认是构建release,优化效率会提高 ...

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

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

laoxu 发表于 2016-6-12 16:37

Jim12345 发表于 2016-6-12 16:19
配置项选择release模式(不要选择debug模式),开O3优化,如图

谢谢
我试试!

laoxu 发表于 2016-6-12 16:50

Jim12345 发表于 2016-6-12 16:19
配置项选择release模式(不要选择debug模式),开O3优化,如图

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

我没找到。

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

laoxu 发表于 2016-6-12 16:52

配置项选择release模式,第一次程序能编译,现在又不能编译了(程序没变)。


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

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

**** Build Finished ****

laoxu 发表于 2016-6-12 16:55

配置项改为 debug模式,程序就能编译,再改回release模式, 又不能编译了。

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版本都做不到吧?没有硬件的支持(指令集中没有相关指令),神仙也做不到~~~ {:titter:}
页: 1 [2] 3 4
查看完整版本: 探讨一下ChipON---IDE编译代码低效的原因