1 引言
在極低譜密度,,高頻譜利用率的大容量
如果DSP 的程序小于1K 字節(jié),那么上述ROM 啟動機制已經(jīng)可以完成程序的加載,。然而事實上大部分DSP 的程序會大于1K 字節(jié),,這時就需要創(chuàng)建一個特定啟動程序來完成更多代 碼的加載。該特定啟動程序又被稱作二級bootloader,。
在需要二級bootloader 的程序中,,這段特定啟動代碼通常駐留在ROM 存儲器的起始位 置以便在DSP 復位后能自動被加載到內(nèi)存地址0 處。當1K 字節(jié)代碼被加載完畢后,,CPU 開始從地址0 處執(zhí)行,,也就是執(zhí)行二級bootloader 的內(nèi)容,。二級bootloader 的功能就是將程序的剩余部分拷貝到內(nèi)存中。
2 啟動方法的設(shè)計與實現(xiàn)
采用二級bootloader 的DSP 啟動方法的實現(xiàn)大體分為四步:配置存儲器,;編寫 secondary bootloader 代碼,;編譯程序,轉(zhuǎn)換目標文件的格式,;將程序燒寫進Flash,。圖1 為實施該啟動方法的硬件平臺示意圖,其中DSP 的型號選擇C6416,,F(xiàn)lash 的型號選擇 AM29LV800B。
2.1 配置存儲器
2.1.1 定義存儲器分區(qū)
為了實現(xiàn)使用二級bootloader 的ROM 啟動,,需要將Flash 劃分為FLASH_BOOT, FLASH_REST 兩個區(qū),。這兩個區(qū)分別存儲由on-chip bootloader 拷貝的程序段和由secondary bootloader 拷貝的程序段。對于BIOS 程序,,Memory 段的定義在MEM(Memory Section Manager)對象里,。對于非BIOS 程序,Memory 段定義在linker command file 中,。一個C6416 的Memory 段定義的例子如下所示:
2.1.2 COFF 段的定位
DSP 程序是以COFF 段的形式在內(nèi)存中存放的,。一個COFF 段就是一個代碼或數(shù)據(jù)塊, 它在內(nèi)存中占據(jù)連續(xù)空間,。COFF 段分為自定義段,,初始化段和未初始化段三種。COFF 段可 以有各種屬性,,其中l(wèi)oad 屬性和run 屬性跟DSP 啟動有密切關(guān)系,。Load 屬性指明段的存儲 地址,run 屬性指明段的執(zhí)行地址,。二級bootloader 負責將所有的段從load 地址拷貝到run 地址,。例如:
.text: LOAD= FLASH, RUN= IRAM
表示代碼段.text 被存儲在flash 中,DSP 啟動時二級bootloader 將該段拷貝到IRAM 中,。
2.2 編寫Secondary bootloader 代碼
對于C6416,,外部存儲器接口(EMIF)需要正確配置以后才可以訪問外部存儲器件。在這 項工作完成后,,二級bootloader 應(yīng)該將所 有的初始化段從它們的load 地址拷貝到run 地址,, 之后再跳轉(zhuǎn)到_c_int00,也即是程序入口點,。Secondary Bootloader 用匯編語言編寫,,因 為此時C 環(huán)境尚未建立。
二級bootloader 必須知道所有初始化段的大小,,在Flash 中存儲的位置以及應(yīng)該被加 載到何處才能進行正確的拷貝,。事實上,,二級bootloader 通過讀取段拷貝表獲得上述信息。 本文第三部分詳細說明了有關(guān)段拷貝表的內(nèi)容,。完成二級bootloader 代碼的編寫后,,應(yīng)將它添加入工程,與工程的其他代碼一同編譯鏈接生成.out 文件,。
2.3 轉(zhuǎn)換目標文件的格式
編譯鏈接生成的是.out 格式文件,,然而Flash 一般接收的是ASCII 格式的文件。CCS 附帶的工具hex conversion utility 可將.out 文件轉(zhuǎn)換為ASCII 格式的.hex 文件,,Hex6x 以命令行文件的形式執(zhí)行,。Hex 命令行文件中,首先指明輸入文件(.out),,輸出文件的格式和ROM 的大小及類型,,以及哪些段需要被放在ROM 中。一個Hex 命令行文件的例子如下所示(注釋內(nèi)容用“/*”和“*/”括起):
2.4 將程序燒寫進Flash
將2.3 節(jié)生成的ASCII 文件燒寫進Flash 可以使用CCS 自帶的FlashBurn 工具,。 FlashBurn 是一個帶圖形界面的軟件,,它首先將一個稱作FlashBurn Target Component (FBTC) 的程序下載到DSP 內(nèi)存中,通過與FBTC 的實時數(shù)據(jù)交換完成對Flash 的擦除編程等操作,。 針對不同的硬件(DSP,,F(xiàn)lash 型號)修改FBTC 是該方法的關(guān)鍵。所需修改處包括Flash 的基地址,,大小,,及讀寫命令字等。
3 段拷貝表
二級bootloader 使用一個段拷貝表(section copy table)進行段的拷貝,。段拷貝表包 含每個需要拷貝的段的必要信息,,如段的load 地址,段的run 地址,,段的大小,。段拷貝表被插入在secondary bootloader 的末尾。
生成段拷貝表的方法有兩種:
1) 使用 hex conversion utility 的-boot 選項 在2.3 節(jié)中我們討論了程序文件格式的轉(zhuǎn)換和hex 命令行文件,,事實上Code Composer Studio 自帶的工具hex conversion utility 提供了一種更為方便的生成段拷貝表的方法,, 只要在hex 命令行文件中使用一些特殊的選項即可。特殊的選項有–boot, ?bootorg 和 –bootsection,,這三個選項的含義分別如下:
-boot 使用該選項時hex conversion utility 將自動轉(zhuǎn)換所有初始化段的格式
-bootorg 指明段拷貝表的地址
-bootsection 指明二級bootloader 所在的段的名稱
2) 使用 linker 選項(LOAD_START,RUN_START,SIZE)
涉及段拷貝表的生成的有三個選項:LOAD_START,RUN_START 和SIZE,,可分別獲得一個段的駐留地址,運行地址和大小,。例如下列代碼可獲得text 段的駐留地址(存于_text_ld_start 中),,運行地址(_text_rn_start)和段的大小(存于_text_size)
.text : load = FLASH_REST, run = IRAM
LOAD_START(_text_ld_start),
RUN_START(_text_rn_start),
SIZE(_text_size)
4 結(jié)束語
本文針對在極低譜密度,,高頻譜利用率的大容量無線傳輸技術(shù)研究中C6000 系列DSP 的應(yīng)用程序大于1K 字節(jié)的情況,,提出了一種使用二級bootloader 從Flash 啟動DSP 的方法,。 該方法可應(yīng)用于采用了C6000 系列DSP 的嵌入式系統(tǒng)中,不需要額外的Flash 編程器,,具有 廣泛的適用性,。
本文作者創(chuàng)新點:在二級bootloader 中引入段拷貝表用以控制程序加載過程,并利用 CCS 自身的編譯功能獲取段拷貝表的內(nèi)容,,該方法可提高效率且準確性高,。