基于TMS320C6678 的多核DSP 上電加載技術
在視頻檢測、醫療影像及紅外圖像快速跟瞄系統應用中,越來越復雜的二維、三維甚至四維的圖像處理,需要并行化的處理系統,并能夠運行復雜的算法。要實現這些復雜的系統,高端FPGA+高性能DSP是目前普遍采用的方案,而單個DSP的性能已發展至極限,所以解決復雜的并行算法,多核DSP是現在發展的全新方向,其中多核DSP的根加載技術是其難點之一。
本文引用地址:http://www.j9360.com/article/226799.htmTI公司推出的DSP芯片TMS320C6678(C6678)具有8個內核的高性能DSP,每個內核工作頻率均達1 GHz.
其支持的Boot 模式有SPI、I2C、EMAC、SRIO 和并口Emif16 NOR-FLASH.其中Emif16 NOR-FLASH模式是不用上位機參與、比較簡單、獨立成系統的一種,大多獨立DSP系統采用該方式。
網上能搜索到關于C6472和C6678零星一些加載資料,都是借助于第三方轉換工具,太過于籠統。下面是針對C6678 的并口Emif16NOR-FLASH的上電加載作詳細的探討。
1 C6678 的上電加載過程
所謂上電加載(上電自舉),即是當DSP復位后,正常運行用戶程序之前運行的一段小程序,就像PC機的BIOS 一樣。多核加載同單核加載區別很大,不但要負責主核的加載而且還有其他核的加載與激活。C6678的Emif16 NOR-FLASH 可以直接執行程序(XIP)(這與C641x系列DSP不同),其上電加載過程示于圖1.
上電復位后,DSP 首先運行固化在片上ROM 位于地址0x20b00000 的程序,稱為片上Loader,片上Loader根據DSP硬件管腳狀態,判斷用戶采用的Boot模式以跳轉到相應模式的二級加載程序。如圖1的Emif16 NOR-FLASH 模式中,運行片上Loader 后,PC 指針直接指向NOR-FLASH 首地址0×70000000 并開始執行FLASH 上的二級Loader 程序,二級Loader 存儲在FLASH 開始地址0×70000000~0×70000400 的范圍內。從0×70000400開始保存應用程序的根表數據(即被燒燒寫到FLASH中的應用程序的數據)。二級Loader的功能是將保存在FLASH中的Core0~Core7的根表數據搬移到DSP相應的地址段內,搬移完后,二級Loader 程序PC 指針跳到Core0的主程序入口地址_c_int00處,開始執行Core0的應用程序。在Core0 的應用程序開始加有使其他核激活運行的代碼(這也是有別于單核的特殊之處),至此整個多核加載就此完成。事實上,如果你的應用程序很小,且運行速度要求不高,圖1中的2、3和4過程都可以不要,只要把應用程序的原始代碼數據燒寫到FLASH從0×70000000 開始的位置,上電正常運行即可(這在C641x 上是不行的),如此DSP 的許多高性能就體現不出來,且多核工程大多采用嵌入式sysbios工程,占用存儲器比較大,所以正常的Boot過程必須采用圖1所示的二級加載過程。

從圖1 中看出,一個完整多核加載過程,開發者需要做的是二級加載器Loader 的編寫、FLASH 中映像文件的產生、FLASH燒寫器的編寫,主核對各輔助核的觸發代碼的編寫(被加載的應用程序不在本范圍內)。
2 多核映像文件的組成與產生
映像文件就是用戶要燒寫到外部FLASH上的全部數據文件,它是由二級加載器Loader的代碼數據(在文件前部)和應用程序的根表(Boot Table)數據(文件后部)的合成數據文件。單核和多核的二級Loader 都一樣,區別就是后部的根表數據。根表是應用程序的所有代碼和數據以在片上占用的地址來分段存儲的數據包,包的第一個4 B 是main()函數的入口地址_C_int00,后面由若干數據段組成,每個段前4 B為該段數據的字節長度Byte_count_x(x 為段序號),接著4 B Address_x 為該段在片上的存儲地址,后面是Byte_count_x個字節的具體數據Data_x.所有數據段結束后是4個字節0作為根表的結束標記。該根表格式如表1所示。每一個段的數據字節數可能不是4的整數倍,根表中數據區就在后面添0按4 B的整數倍向上取整,故整個根表文件字節數必是4的整數倍。
根表數據產生很簡單,由應用程序最終生成的Out文件,通過ccs自帶工具hex6x.exe選擇不同的參數而產生,產生的文件即是根表文件,可以選擇生成二進制文件或文本文件,本研究采用二進制。其產生命令為(app為應用程序名,app.out為ccs產生的連接文件):
hex6x -boot -b -e _c_int00 -order L -memwidth=32 -romwidth=32 -o app.bin app.out
app.bin為產生的二進制根表文件,將二級Loader程序的二進制代碼加到根表文件的頭部即是app 應用程序的映像文件。

多核的映像文件是由二級加載器Loader和多個核應用的根表合并而成的文件。多個核對應多個獨立的工程,并由CCS 產生多個out 文件,再由hex6x.exe 產生各核的根表文件。后對Core0 的根表文件先去掉末尾4 個0字節,再將各輔助核的根表文件的開始的入口地址_C_int00和末尾4個0字節去掉,加到Core0被去掉了末尾字節的根表文件后,然后再將每個核的_C_int00當成一個4字節的數據段來保存到上面的合成文件的后面,而各_C_int00在片上的存放地址即為各核的專門固定地址Boot Magic Address,如Core1 的Boot Magic Ad-dress 為0x1187fffc,Core2 為0x1287fffc,…,Core7 為0x1787fffc.所有根表數據段構成后,再將4個0字節作為結尾標志加到文件的最后,這樣合并后的根表文件如表2所示。同樣,將二級Loader的代碼數據加到該文件頭部即形成多核的映像文件。由hex6x 生成的單核根表文件到合成映像文件的產生,全是文件操作,可以用一般的C語言工具,甚至Matlab等工具都可以完成。

評論