请教一下W806的程序优化技巧,我的代码之前是运行在cortex M4内核单片机上的,168M下妥妥跑完,主要是跑语音算法,但是同样代码移植到W806上连原算法的一半都跑不到,我尝试将代码中部分const型参数表和样本转为普通的单精度float或char型存储,并将程序中一些从数组中调用的参数转为固定值,情况有所好转,但也只跑完了一半任务。
目前所有程序只是在连接CKLINK的仿真状态下运行,我不知道这是否有一定关系,然后芯片没有挂外部FLASH或PSRAM,所有运行变量也都去掉const属性,代码优化等级到O3,程序都是在芯片内部跑,另外我检查了CPU的cache控制寄存器,是处于打开状态
根据现象我觉得应该可能的原因是CPU的指令和数据存取速度跟不上,或浮点运算器本身耗时过长,
当前项目完成了底层外设的移植,并已和算法内核完成对接,只苦于没有完成运算任务,希望能指点下是否还有优化空间,比如是否要将代码段或数据指定到特定的内存区域,或者其他什么方式可以提升运行效率的。非常感谢
你的这个分析是很有道理的,确实是这样的,你可以去除调试器跑一下,虽然开启了cache,关于你的想法将代码段放到RAM中是可行的,但是需要考虑你得RAM是否能够容纳这么大的代码段,可以将部分函数放到RAM中执行以达到加快执行效率,如果可以的话能否放出代码,看看能到否帮你优化下
优化有很多方法,主要是看你代码的结构以及指令的类型:
如果你代码有较多的地址访问,读取常量数据,那么将代码复制到 RAM 中会有很大的速度提升。 这地地址访问是编译时产生的,比如复杂结构体的使用,将造成大量的间接地址的访问。
如果你代码有大量的计算,特别是浮点计算,以及三角函数等高级代数的计算,那么在一些算法下,想办法,把算法改造成定点整数的算法,这样使速度会加快。 如果代码中,有大量的超函数计算,那么可以考虑查表法,不用调用系统的函数库。
另外就是代码指令优化,分析代码中重复运行比较高的段落,将此段落编为汇编代码,然后手动优化汇编代码,完成代码指令的优化。
使用多种方法,可以达到提升程序运行速度与效率。