(1)多重迴圈拆成單層迴圈,減少迴圈層數;
例如,雙重迴圈內乙個cycle只使用了乙個乘法器,拆成單層迴圈後,乙個cycle可使用2個乘法器,充分利用dsp乘法器資源,同時運算速度也會加快;
(2)迴圈次數少的放在外層迴圈,迴圈次數多的放在記憶體迴圈;
(3)二維陣列的二重迴圈:二維陣列的行迴圈放在外層迴圈,列迴圈放在內層迴圈;
(4)避免迴圈內部的乘除運算:迴圈內部的乘除運算盡量移到迴圈外部以及用加法替代;
(1)記憶體拷貝:memcpy
memcpy(array_dst,array_src,sizeof(array_src));
#pragma data_align(array, 8); // 8位元組對齊(低3位全為0)
void dspf_sp_blk_move(const float * x, float *restrict y, const int n);
(2)記憶體清零:memset
memset(array,0,sizeof(array));
注意:記憶體清零並不多餘,因為某些編譯器在分配空間時,記憶體預設值並不為0;此外,memset 函式只能用於賦0值,其他的值則會出錯。3、
(1)printf 等除錯函式
printf 函式或其它除錯函式的占用時間為ms級,且具備最高的系統優先順序,不響應中斷,對於**執行有嚴重影響,且占用大量時間,除錯時應去除此類函式。
(2)移位運算代替乘除運算
1、profile clock工具
(1)依次選擇 run—>clock—>enable;
(2)run—>clock—>setup(手動/自動清零);
(3)雙擊右下角時鐘週期計數欄(cpu cycle count)清零;
(4)在程式之間設定斷點,執行至第乙個斷點,清零,執行至第二個斷點,記錄cpu cycle count值;
缺點:時鐘計數 cycle count 資料不準確,比實際情況的要大。2、tscl、tsch暫存器
#include unsigned int cycleoverhead;
// 啟動**效能計數
long long tbefore, tafter,toverhead;
tscl = 0;
tsch = 0;
tbefore = _itoll(tsch, tscl);
tafter = _itoll(tsch, tscl);
cycleoverhead = tafter - tbefore; //暫存器讀取延時校準
tbefore = _itoll(tsch, tscl);
delay(10);
tafter = _itoll(tsch, tscl);
toverhead = tafter - tbefore - cycleoverhead;
printf("duration is %lld us (cpu frequency:300mhz)\n", toverhead/300);
3、硬體測試方法
(1)在待測程式前加led點亮程式,在待測程式後加led燈滅程式;
(2)執行程式,使用示波器測量led引腳的電平變化,通過示波器的週期測量或者利用游標來測量待測程式時間;
DSP優化經驗一
restrict的作用就是限制乙個指針對一塊記憶體的訪問,進一步說就是如果一塊記憶體區域通過乙個受限制指標訪問,那麼它就不能通過另乙個受限指標訪問。引入restrict的目的是確保同一塊記憶體上沒有其它引用,讓編譯器更好地優化指令,生成更有效的彙編 把 pragma must iterate 放在迴...
DSP中斷總結
c55x支援32個isr。有些isr可以由軟體或硬體觸發,有些只能由軟體觸發。當cpu同時收到多個硬體中斷請求時,cpu會按照預先定義的優先順序對它們做出響應和處理。2 響應中斷請求。cpu必須響應中斷。如果是可遮蔽中斷,響應必須滿足某些條件。如果是不可遮蔽中斷,則cpu立即響應。3 準備進入中斷服...
優化系列 之DSP優化方法
date 2019 2 18 1 參考 ti dsp tms320c66x學習筆記之dsp優化經驗 2 dsp介紹和特點 dsp是英文digital signal process的簡稱,即數字訊號處理器,dsp晶元內部採用程式和資料分開的哈佛結構,具有特殊的dsp指令和不同的功能單元,實現多級流水操...