[开发工具]

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

[复制链接]
楼主: laoxu
手机看帖
扫描二维码
随时随地手机跟帖
Jim12345| | 2016-6-13 15:19 | 显示全部楼层
建议研究一下register file架构和LD/ST结构

使用特权

评论回复
laoxu|  楼主 | 2016-6-14 07:30 | 显示全部楼层
本帖最后由 laoxu 于 2016-6-15 07:43 编辑
dongshan 发表于 2016-6-13 15:15
自主个毛线,就是PIC的。

内核和PIC的不同,应该是AVR和PIC的混血儿,在构架上增加了类同AVR的R0~R7多累加器,可加快程序运行。

使用特权

评论回复
laoxu|  楼主 | 2016-6-14 07:41 | 显示全部楼层
Jim12345 发表于 2016-6-13 14:43
再分析一下楼主编译的代码可以看到:
主程序生成150条指令+115条banksel指令,banksel优化后只有4条,实际 ...

我仔细分析了编译后的代码,感觉最大的问题是编译器 数据(变量)存储的结构 安排不合理,引起库的精炼度不足(俺估计了一下,代码已很难有大的提升)。

在此 数据(变量)存储的结构 安排 下,指针操作烦嗦尽占代码,极其不合理。

只有重新考虚安排  数据(变量)存储的结构 ,编译质量才会大幅提高。

使用特权

评论回复
laoxu|  楼主 | 2016-6-14 07:54 | 显示全部楼层
不单纯是 banksel指令 优化的问题。

后来的 指针操作 分析,我就不贴图了,已不好意思再多评论了。

你想想,V1, V2指令集,只支持唯一且单一的256字节内RAM指针寻址,结果编译器搞成高大尚的全功能指针,弄了一大堆无用的代码(就算考虑今后的V3指令集),但起码现在得优化掉,目前是一点也不加以优化,俺只能呵呵了~~~

使用特权

评论回复
laoxu|  楼主 | 2016-6-14 08:21 | 显示全部楼层
本帖最后由 laoxu 于 2016-6-14 14:59 编辑

俺对  数据(变量)存储的结构 安排,建议如下,仅供参考:

1.  增加对 变量 赋值 的人工页面指定,不指定 默认 第0页,这样,主程序能减少代码,加快运行速度。
2.  增加对 中断程序的 的人工页面指定,不指定 默认 第0页,如指定了,中断程序中的所有局部变量 ,都放在 指定页,这样,可减少变量保护,加速中断处理。
3.  充许利用 指针,其实 ChipON单片机的 LD,ST这两条变址寻址指令,挺高效的,能提高数据传输速度,目前的编译器,没有很好的利用,基本上都用直接寻址+banksel指令, 尽管后期可优化掉 banksel指令,但是,我情愿优先使用 千锤百练的精简库(很少有不确定的BUG), 而不愿意靠后期随机的优化(程序越长,出现BUG的概率越高),这个道理就不用多说了吧。
4.  充分有效用足 R0~R7 ,  对V2版本要 充分有效用足 RAM(70H~7FH) 这个区域。
5.  同一变量在RAM中的存放要连续, 有利于读写,不易出错。
6.  如有可能的话, 最好能提供混合编译(C+汇编), 不过,对编译器要求更高,需提供完整的 调用和返回参数、接口的详细游戏规则。



使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ssmm1228 + 1 很给力!
linqing171| | 2016-6-14 22:16 | 显示全部楼层
变量传递的规范每个编译器都不一样,大型程序和小型程序也不应该一样. memory modal 应该可以设置. 比如iar就有多个选项.
这家的没有用过, 前几年看过很多mcu, 总结就是要么仿51, 要么仿pic. 这个既然又没有乘法指令, 又有bank 很可能是类pic的了. pic的硬件栈等很多硬伤, 做跑马灯很合适.
debug和release只是project的两个编译选项, 调用的同一个编译器, 如果参数包括define都相同,结果是一致的.  至少vc等都是这样.
不说Gcc, il mdk4上也是O0~O3, 建议用的也是O2, 希望做编译器的参考一下, O3允许有风险. 但是O2的代码密度要尽量上来.

使用特权

评论回复
laoxu|  楼主 | 2016-6-16 07:23 | 显示全部楼层
ChipON---IDE 数据冲空问题,测试程序如下,超级简单!


//主函数
void main()
{ char a;
  a = P0;
  P0= a*10;
}
//中断函数
void int_fun() __interrupt
{ char a;
  a = P1;
  P1= a*20;
}


编译结果显示,两个函数未加保护的同时调用 CALL        __mulchar, 引起冲突。
如将 变量改为 long 型,再多几个运算,两个函数 中,遍地都是 相同地址的变量,如何用?
中断入口仅保护 R0, R1, PSW, PCH , 连 BANK 都不保护,俺彻底服了。


建议 编译器能 改进成支持 混合汇编(至少中断程序能用纯汇编写),最起码也要 将内嵌汇编,升级到能支持标号。


使用特权

评论回复
laoxu|  楼主 | 2016-6-16 08:52 | 显示全部楼层
咬文嚼字 看了几遍 KF8CC 用户使用注意手册,看到下列文字心头一热,变通使用方法找到了?

在汇编代码中要访问寄存器和全局变量时只需在变量名前加下划线”_”
例: a=P0;
    P0=P1;
    P1=a;
以上C代码可以使用以下嵌入汇编实现
__asm  
    MOV R2,_P0
    MOV _a,R2
    MOV R2,_P1
    MOV _P0,R2
    MOV R2,_a
    MOV _P1,R2
__endasm;

结果一测试,傻眼,在变量名前加下划线”_” ,无法编译,直接出错,ChipON---IDE 不支持。

使用特权

评论回复
laoxu|  楼主 | 2016-6-16 10:08 | 显示全部楼层
总算试出来了,要设置全局变量,在变量名前加下划线”_” ,能编译通过。

现在凑合着,能用插入汇编,编写中断程序了,只是,不支持标号,是个**烦~~~

使用特权

评论回复
yanyanyan168| | 2016-6-16 10:44 | 显示全部楼层
关注中,楼主改用汇编了??         

使用特权

评论回复
laoxu|  楼主 | 2016-6-16 11:01 | 显示全部楼层
yanyanyan168 发表于 2016-6-16 10:44
关注中,楼主改用汇编了??

哪个方便用哪个~~~

最好能支持 C+ASM 混合编程,使用灵活方便。

使用特权

评论回复
lingjun1982| | 2021-8-26 10:28 | 显示全部楼层
laoxu 发表于 2016-6-12 10:07
通过下载,安装 ChipON---IDE集成开发环境,编写极简单的程序测试,发现 2K的程序存储器装不下,得改 4K的 ...

楼主,你好!
我在使用KF8A100ENG,datasheet上写的FLASH是16K的,但是在IDE里显示的是8K的,我看你之前把FLASH从2K修改为4K,请问是怎么修改的?
另外,我的程序里面的计算比较多,FLASH的容量明显不足,请问在程序设计(数值的计算)上有什么可以改善的地方吗?
感谢!

使用特权

评论回复
树上的小鸟| | 2021-8-26 16:29 | 显示全部楼层
lingjun1982 发表于 2021-8-26 10:28
楼主,你好!
我在使用KF8A100ENG,datasheet上写的FLASH是16K的,但是在IDE里显示的是8K的,我看你之前 ...

IDE里面显示的8K是8K Word(一个Word等于2Byte)

使用特权

评论回复
单片小菜| | 2021-9-1 09:25 | 显示全部楼层
楼主是高手,研究的这样深入,向楼主学习。

使用特权

评论回复
这个界面还是很友好的。不错,不错的。

使用特权

评论回复
fcccc| | 2021-9-10 12:38 | 显示全部楼层
学习了

使用特权

评论回复
chenqianqian| | 2021-9-10 18:15 | 显示全部楼层
毕竟是自己开发的,需要时间优化。

使用特权

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

本版积分规则