請教一下W806的程序優化技巧,我的代碼之前是運行在cortex M4內核單片機上的,168M下妥妥跑完,主要是跑語音算法,但是同樣代碼移植到W806上連原算法的一半都跑不到,我嘗試將代碼中部分const型參數表和樣本轉為普通的單精度float或char型存儲,並將程序中一些從數組中調用的參數轉為固定值,情況有所好轉,但也只跑完了一半任務。
目前所有程序只是在連接CKLINK的仿真狀態下運行,我不知道這是否有一定關系,然後芯片沒有掛外部FLASH或PSRAM,所有運行變量也都去掉const屬性,代碼優化等級到O3,程序都是在芯片內部跑,另外我檢查了CPU的cache控制寄存器,是處於打開狀態
根據現象我覺得應該可能的原因是CPU的指令和數據存取速度跟不上,或浮點運算器本身耗時過長,
當前項目完成了底層外設的移植,並已和算法內核完成對接,只苦於沒有完成運算任務,希望能指點下是否還有優化空間,比如是否要將代碼段或數據指定到特定的內存區域,或者其他什麼方式可以提升運行效率的。非常感謝
你的這個分析是很有道理的,確實是這樣的,你可以去除調試器跑一下,雖然開啟了cache,關於你的想法將代碼段放到RAM中是可行的,但是需要考慮你得RAM是否能夠容納這麼大的代碼段,可以將部分函數放到RAM中執行以達到加快執行效率,如果可以的話能否放出代碼,看看能到否幫你優化下
優化有很多方法,主要是看你代碼的結構以及指令的類型:
如果你代碼有較多的地址訪問,讀取常量數據,那麼將代碼複制到 RAM 中會有很大的速度提升。 這地地址訪問是編譯時產生的,比如複雜結構體的使用,將造成大量的間接地址的訪問。
如果你代碼有大量的計算,特別是浮點計算,以及三角函數等高級代數的計算,那麼在一些算法下,想辦法,把算法改造成定點整數的算法,這樣使速度會加快。 如果代碼中,有大量的超函數計算,那麼可以考慮查表法,不用調用系統的函數庫。
另外就是代碼指令優化,分析代碼中重複運行比較高的段落,將此段落編為匯編代碼,然後手動優化匯編代碼,完成代碼指令的優化。
使用多種方法,可以達到提升程序運行速度與效率。