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