自己在測試c6455dsp的一個fft庫函數的例程中,發現了一些dsp內存分配的問題,現歸納總結如下:
1. DSP中cmd文件的段數據類型
.cinit :用來存放程序中的變量初值和常量值。
.const :存放程序中的字符常量、浮點常量和用const聲明的常量。
.text :用來存放程序代碼。
.bss :為程序中的全局和靜態變量保留空間。
.far :為程序中用far聲明的全局和靜態變量保留空間。
.stack :為程序系統堆棧保留空間,用於保存返回地址、函數間的參數傳遞、存儲局部變量和保存中間結果。
.sysmem用於程序中的malloc、calloc和realoc函數動態分配內存空間。
2. cmd文件中的內存分配問題
如下圖是截取c6455dsp的內存分配地址空間映射圖。
圖1 內部RAM地址映射
圖2 外部DDR2內存(512M)地址映射
對照上圖,在cmd文件中,我共開辟了四塊內存,L2為2M(字節),CACHE_L1P為32k, CACHE_L1D為32k, DDR2為512M,如下圖所示。
注意:cmd中內存的分配一定要是按照dsp內部的實際物理地址來寫的。
圖3 cmd文件內存分配圖
我剛剛開始遇到的問題是,我嘗試把所有的dsp系統運行所需內存段放在DDR2(因為DDR2足夠大,哈哈)中,結果在編譯的時候,遇到了問題,說是內存驗證不通過,后來我自己經過反復嘗試,發現.cinit、.text、.stack和.const這些內存區域是不能分配在DDR2外部的,目前還不知道具體原因。其它的內存區域可以分配在DDR2中,程序能正常運行。另外注意:將上述關鍵數據盡量放在內部IRAM中,否則容易出錯。