第三章 ADSP-BF609 開發板
3.2 ADSP-BF609 韌體
3.2.1 開發環境
ADI 在 ADSP-BF60X 系列的開發板推出的同時也推出一套新的軟體開發工 具交叉核心嵌入式系統(cross core embedded system: CCES), CCES 的推出出是 為了支援新一代的 DSP 產品,ADSP-BF60X 系列,因為先前的整合開發環境 (integrated development environment: IDE)無法支援雙核心的架構,所以需要新的 開發工具。CCES 不僅能用來開發 ADSP-BF60X 系列,更可以向下相容於較早期 的開發板,如 ADSP-BF548。如圖 3.5 所示,CCES 是一款支援 Blackfin DSP 的 IDE 的交叉平台開發架構,開發人員能在主機平台使用 CCES 開發 C/C++語言的 韌體。其中 CCES 包含程式的編譯、轉譯、鏈結以及載入等等。如圖 3.6 所示[6],
在 CCES 的環境中,首先會將數個原始程式檔案(如 C file、assembly file)透過編 譯器(compiler)轉換成二位碼(binary code)的物件檔案(object file: DOJ),接著透過 鏈結器(linker)將函式庫、鏈結描述文件(linker description file: LDF)與 DOJ 檔將三 者通通結合在一起,並包裝成執行檔(executable file),最後再藉由載入器(loader) 嵌入至開發板的記憶體內。
圖 3.5、交叉平台開發架構示意圖
18
圖 3.6、CCES 將程式載入至開發板的流程圖[6]
圖 3.7、CCES 偵錯環境
隨著 IDE 的革新,為了讓開發者能更加輕鬆的開發軟體和韌體,CCES 新增 了偵錯環境如圖 3.7 所示。與前一版本的 IDE 相比,在偵錯方面,CCES 能在 DSP 運作的同時進行偵錯,如圖 3.7 中的(1),在新版的 IDE 可以使用中斷點與逐步偵 錯,一個步驟一個步驟的逐步運行程式,再搭配監看視窗隨時觀察參數的變化,
這有利於開發者的演算法邏輯推斷與偵錯速度,有利於軟、韌體的開發效率。記 憶體方面,CCES 也新增了許多記憶體觀察工具,如圖 3.7 中的(2),CCES 增加 了圖像視窗(show window),show window 能在編譯的過程中,把記憶體中的影像 資料顯示在 IDE 中,其中更能支援多種不同未經處理的影像資料(raw data)的解 碼,使開發者能判斷、確認記憶體中的參數使否與開發者的邏輯一致。
19
圖 3.8、LDF 檔案中記憶體配置過程示意圖[6]
記憶體的配置對於 DSP 的開發十分重要,CCES 也支援使用者自行客製化 自己的 LDF,對於不同程式所需要的記憶體大小及位址都可以讓開發者自行規 劃、配置,如圖 3.8 所示,例如要規劃位於 L1 資料記憶體區段中的子區段,可 依據圖 3.4 中記憶體位址的分佈,規劃其起始位置(如 0×FF80 0000)至結束位置 (如 0×FF80 3FFF),並可為此區段命名為 MEM_L1_DATA_A 的資料記憶體空間,
之後此區段即可令開發者任意使用有關於程式資料的存取。而如要規劃位於 L1 指令記憶體,同樣依據圖 3.8 的記憶體分佈作指令記憶體空間的規劃[6],像是 MEM_L1_CODE 為指令記體區段中的一小區段,空間大小為 0×FFA0 0000 至 0×FFA0 BFFF。
ADSP-BF609 的記憶體可分為三個部分:L1、L2、L3,對於兩個核心來說,
L1 各自獨立,無法互相存取;L2 與 L3 則是共享記憶體空間,兩個核心皆可以 對 L2、L3 存取資料,然而為了防止兩個核心同時存取同一個記憶體位置產生存 取衝突,CCES 創建專案時自動生成兩個記憶體存取相關的文件,app_cplbtab.c 和 app.ldf,這兩個文件是針對記憶體空間與存取進行規劃、配置,其中 app.ldf 就 是上文敘述的鏈結描述文件,而 app_cplbtab.c 則是負責管理當前核心可以存取 的記憶體位置,以及存取的方式,如圖 3.9 所示,這是一段核心對 128MB 的記 憶體空間存取之規劃。CACHE_MEM_MODE 與 CPLB_DNOCACHE 是對於 cache 的開關;CPLB_READONLY_ACCESS 表示該區段的記憶體對於核心來說只能讀
20
取 不 能 寫 入 , 若 強 行 對 其 寫 入 則 會 產 生 緩 存 保 護 後 備 緩 衝 區 (cacheability protection lookaside buffers: CPLBs)的錯誤。以圖 3.9 之內容所表示,該核心可以 任意存取 0x00000000 至 0x05000000 的記憶體區段內的資料,而 0x06000000 至 0x07000000 該核心只能讀取資料不能寫入,若強行對其寫入則會產生 CPLBs 的 錯誤。若要讓該核心存取 0x06000000 至 0x07000000 的記憶體區段則須把 CPLB_READONLY_ACCESS 改成 CACHE_MEM_MODE 或 CPLB_DNOCACHE,
如圖 3.10 所示。
圖 3.9、app_cplbtab.c 文件內對核心可存取的記憶體位置之控制
圖 3.10、修改後的 app_cplbtab.c 文件
{0x00000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x01000000, (ENUM_DCPLB_DATA_16MB | CPLB_DNOCACHE)}, {0x02000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x03000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x04000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x05000000, (ENUM_DCPLB_DATA_16MB | CPLB_DNOCACHE)},
{0x06000000, (ENUM_DCPLB_DATA_16MB | CPLB_READONLY_ACCESS)}, {0x07000000, (ENUM_DCPLB_DATA_16MB | CPLB_READONLY_ACCESS)},
{0x00000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x01000000, (ENUM_DCPLB_DATA_16MB | CPLB_DNOCACHE)}, {0x02000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x03000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x04000000, (ENUM_DCPLB_DATA_16MB | CACHE_MEM_MODE)}, {0x05000000, (ENUM_DCPLB_DATA_16MB | CPLB_DNOCACHE)}, {0x06000000, (ENUM_DCPLB_DATA_16MB | CPLB_DNOCACHE)}, {0x07000000, (ENUM_DCPLB_DATA_16MB | CPLB_DNOCACHE)},
21
圖 3.11、記憶體配置文件鏈結示意圖[6]