国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于FTP的多片C66xx系列網(wǎng)絡(luò)動態(tài)加載

2021-10-20 12:29張開生孟愛權(quán)
火控雷達技術(shù) 2021年3期
關(guān)鍵詞:寄存器啟動程序

張開生 汪 慧 孟愛權(quán)

(西安電子工程研究所 西安 710100)

0 引言

對于嵌入式芯片而言,Boot就是自啟動,在DSP的調(diào)試階段,可執(zhí)行的代碼文件(.out)存放在安裝了TI開發(fā)環(huán)境CCS所在的計算機上,在線連接仿真器調(diào)試時,由仿真器將可執(zhí)行代碼load到DSP的內(nèi)存中運行并調(diào)試。但軟件成熟后,需要將用戶的可執(zhí)行代碼存放在片外Flash或者別的設(shè)備(GMAC/PCIE/SRIO加載方式)中,系統(tǒng)上電后將可執(zhí)行代碼自動加載到內(nèi)存中,實現(xiàn)可執(zhí)行代碼的上電自動運行,這一過程就是通常所說的自啟動或者Boot[1]。

片外的Flash分為NAND Flash和NOR Flash兩種,其中在DSP和FPGA加載過程中常用的是NOR Flash,因為NOR Flash和普通的內(nèi)存訪問方式類似,可以支持隨機訪問,這使它既具有支持XIP(eXecute In Place,即芯片內(nèi)執(zhí)行)的特性,又具備像普通RAM一樣執(zhí)行程序的能力,因此NOR Flash是自啟動代碼的絕佳載體。

本文將對DSP的加載過程和方式進行簡要介紹,重點闡述多核器件的啟動流程、啟動方式選擇、啟動文件格式生成和文件內(nèi)容,提出基于網(wǎng)絡(luò)FTP的動態(tài)加載方式,詳細闡述了多片網(wǎng)絡(luò)動態(tài)加載的實現(xiàn)步驟。

1 啟動流程

對于TI的C66xx系列DSP而言,無論是單核加載還是多核加載,均是DSP上電/系統(tǒng)復(fù)位后所有核的PC指針指向RBL代碼,RBL是在芯片出廠的時候就已固化到芯片內(nèi)部NOR Flash中的一段程序,程序起始地址為0x20B0_0000。無論對于單核DSP還是多核DSP而言,在上電/系統(tǒng)復(fù)位后所有核同時從地址0x20B0_0000運行片內(nèi)的RBL(Rom Bootloader)程序[2],但從核(多核DSP中定義Core0為主核,其余為從核)的RBL在判斷核ID號不為0后進入等待狀態(tài),等待Core0發(fā)送啟動地址BOOT_MAGIC_ADDRESS和核間IPC中斷,從核收到核間中斷后將PC指針指向啟動地址并開始執(zhí)行程序[3]。

而主核的RBL通過讀取寄存器DEVSTAT寄存器的值判斷啟動模式,根據(jù)啟動方式進行接口初始化和CPU時鐘PLL的配置,同時根據(jù)啟動方式?jīng)Q定是否進行數(shù)據(jù)搬移,如果需要進行數(shù)據(jù)搬移,如SPI加載,就需要將SPI Flash中的可執(zhí)行程序加載到DSP的相應(yīng)內(nèi)存中,如果不需要搬移,就直接跳轉(zhuǎn)到外接NOR Flash的起始地址(如EMIF16加載時外接的NOR Flash地址0X7000_0000)執(zhí)行[4]。

RBL程序執(zhí)行的流程如圖1所示,Core0執(zhí)行的RBL負責將用戶程序加載到合適的存儲位置(例如:L2、片內(nèi)共享存儲、DDR、EMIF RAM空間),然后Core0執(zhí)行用戶程序。

圖1 DSP自啟動流程

在某些啟動方式的加載過程中,加載啟動之前需要預(yù)留L2最后0XD23F字節(jié)空間(0X0087_2DC1 ~0X0087_FFFF約53KB)[1],這段保留空間作為RBL程序執(zhí)行時的堆棧、配置、參數(shù)存儲空間,在用戶程序加載起來之后(CPU開始執(zhí)行_c_int00)就可以使用,如果用戶需要使用這段預(yù)留的空間,必需將一些未初始化的變量在.cmd內(nèi)存配置文件中進行定義。

用戶程序啟動后的主程序入口地址固定指向_c_int00函數(shù),而_c_int00是C/C++程序初始化代碼的入口地址,其主要功能是完成建立C程序的運行環(huán)境,為進入main()函數(shù)進行系統(tǒng)初始化,因此它是芯片運行支持庫中的一個重要函數(shù)。DSP上電時,由RBL負責引導(dǎo)至_c_int00,_c_int00主要完成以下工作:

1)定義系統(tǒng)棧.stack,并初始化棧指針,配置相關(guān)寄存器;

2)初始化全局變量(.cinit),從.cinit段將初始化數(shù)據(jù)拷貝到.bss段中相應(yīng)的變量;

3)若使用C++,還會完成全局對象構(gòu)造(.pinit);

4)調(diào)用main函數(shù)運行C程序;

5)當main函數(shù)return時,調(diào)用exit函數(shù);

當_c_int00函數(shù)執(zhí)行完畢之后,即完成了為C語言的準備工作,系統(tǒng)就轉(zhuǎn)到C語言的main()函數(shù)。

另外如果程序在鏈接文件.cmd中采用-c選項,則編譯鏈接后的可執(zhí)行程序會將全局變量的初始化放在_c_int00()函數(shù)中進行,在此函數(shù)中會調(diào)用_auto_init(CINIT)函數(shù),將.cinit段的內(nèi)容拷入.bss中相應(yīng)的變量中,此過程是在系統(tǒng)上電后進入main()函數(shù)之前執(zhí)行的;如果程序在鏈接時采用-cr選項,則編譯后的可執(zhí)行程序中全局變量需要使用loader進行初始化,這種方法一般用于在JTAG調(diào)試時,CCS即為loader。

2 啟動方式選擇

DSP芯片在上電復(fù)位過程中通過采樣鎖存13個引腳BOOTMODE[12:0]/GPIO[13:1]的狀態(tài)值到芯片內(nèi)部DEVSTAT寄存器[5],采樣鎖存時序如圖2所示,RBL程序獲取啟動模式后,執(zhí)行相應(yīng)的加載流程,用戶程序加載完成后這些GPIO配置引腳就可以作為普通輸入輸出引腳使用。

圖2 啟動模式采樣鎖存時序

在RESETFULL信號拉高前后12個時鐘周期內(nèi),GPIO配置管腳的值會被DSP采樣鎖存,鎖存的值存儲在芯片內(nèi)部地址為0x02620020的DEVSTAT寄存器中,在片內(nèi)RBL啟動加載流程時,RBL通過讀取DEVSTAT寄存器的值決定執(zhí)行相應(yīng)的加載程序,例如選擇啟動方式為EMIF啟動時,需在芯片復(fù)位上升沿期間將GPIO[15:0]管腳值設(shè)置為0X1821,選擇I2C啟動時管腳值為0X160D,設(shè)置的管腳值可以在DEVSTAT寄存器中查看,在調(diào)試過程中,可以在CCS中點擊“System Reset”后,通過修改DEVSTAT寄存值,選擇不同的啟動方式/強制軟件引導(dǎo)加載,而不用每次通過硬件修改/上電復(fù)位等選擇啟動方式。

DSP的啟動方式可以分為以下三種方式[6]。

1)No Boot啟動方式,相關(guān)的外設(shè)設(shè)備為EMIF,用戶代碼存放在EMIF Flash,RBL檢測到啟動方式為No Boot后,RBL執(zhí)行直接跳轉(zhuǎn)到EMIF Flash空間首地址,然后由Core0直接讀取并執(zhí)行用戶程序;

2)Host Boot啟動方式,相關(guān)的設(shè)備有PCIE/GMAC/SRIO,用戶程序由另外的設(shè)備通過上述接口搬移到相應(yīng)的存儲位置,搬移完成后由Core0跳轉(zhuǎn)并執(zhí)行用戶程序;

3)Slave Boot啟動方式,相關(guān)的設(shè)備有EMIF/SPI/I2C/UART,用戶的可執(zhí)行程序以boot table格式存放在芯片的片外Flash中(從首地址開始存放),加載過程中由RBL初始化Flash接口,RBL程序通過啟動接口將用戶程序搬移到指定地址,然后Core0跳轉(zhuǎn)到用戶程序的_c_int00函數(shù)處,由Core0向從核發(fā)送IPC中斷,啟動從核。

3 加載文件解析

用TI的編程工具CCS(Code Composer Studio)編譯連接生成后綴為.out可執(zhí)行文件,此目標文件格式被稱作通用目標文件格式(Common Object File Format,COFF)。COFF文件是按照模塊化思想對程序進行管理的,它的最小單位稱為段(Section)。段是占據(jù)一個連續(xù)空間的代碼塊或者數(shù)據(jù)塊,與其他段一起映射到存儲器內(nèi)。但各個段是分開的,各有功能特色。對于C語言文件,編譯器生成的代碼段分配在.text段中,全局變量和靜態(tài)變量分配在.bss段中,而局部變量或寄存器變量分配到.stack段,還有其他段和自定義段,可以查詢TI的有關(guān)文檔。

連接器生成的可執(zhí)行COFF文件(后綴為.out),含有一些定位符號和文件頭等信息,這些信息能夠被仿真器識別,仿真器可以從COFF文件中提取有用的程序,并把提取的程序加載到DSP的L2 SRAM。但是,如果我們采用FLASH、PCI或SRIO等加載時,COFF文件中的一些信息不能被識別,而且由于含有的無效信息較多,COFF文件比較大,因此,我們應(yīng)該對COFF文件進行提取和精簡處理。這就需要用到TI提供的十六進制轉(zhuǎn)換工具(Hex6x.exe),該轉(zhuǎn)換工具可以把COFF文件轉(zhuǎn)換成需要的格式。

為了使RBL從Flash加載時知道搬移的目的地址和數(shù)據(jù)大小,需要將用戶的.out文件轉(zhuǎn)換成RBL能夠識別使用的Boot Table格式(后綴.dat);用戶程序固化燒寫的過程就是將用戶的.out文件通過工具鏈轉(zhuǎn)換成Boot Table格式的.dat文件,然后將.dat文件固化到Flash中。轉(zhuǎn)化工具鏈中主要用到的有:

首先利用Hex轉(zhuǎn)換工具hex6x.exe將.out文件和.rmd轉(zhuǎn)換為.btbl文件;其次利用mergebtbl工具將多個.out文件生成的對應(yīng)的.btbl文件合成成一個.btbl文件;最后利用bconvert64x.exe和b2ccs.exe兩個工具,將文件.btbl轉(zhuǎn)換為最終燒寫到Flash中的.dat文件。TI提供的轉(zhuǎn)換工具的可執(zhí)行程序和源碼位于軟件安裝包“X: imcsdk_2_01_02_05 oolsoot_loaderiblsrcutil”路徑下,使用者可以根據(jù)實際需要對轉(zhuǎn)換工具進行修改,例如官方b2i2c.exe支持的最大文件長度為0X20000個字節(jié),如果最終生成的.dat文件超出該長度,需要用戶修改宏定義的文件上限大小,否則會出現(xiàn)文件燒寫長度不夠的情況,導(dǎo)致程序加載失敗。

最終生成的.dat文件的Boot Table由3個部分組成:首先是包含32bit的程序入口地址(_c_int00的地址);其次是Boot Table的核心部分,也是占據(jù)文件大小最大的部分,該部分由若干個文件段組成,每個文件段第一個32bit是段字節(jié)數(shù)(需要搬移的字節(jié)長度4n),第二個是段文件搬移的目的地址,緊接著是n個需要搬移的數(shù)據(jù),Boot Table文件格式如圖3所示[7-8]。

圖3 Boot Table文件格式

RBL在搬運Boot Table格式的用戶程序時,按照格式不斷地讀取和搬移段數(shù)據(jù),當讀取到搬移段字節(jié)數(shù)為0(接收標識)時,則PC指針跳轉(zhuǎn)到Boot Table最開始指定的32位頭地址(_c_int00函數(shù)地址),Core0開始執(zhí)行用戶程序。

4 多片DSP網(wǎng)絡(luò)動態(tài)加載

在本項目中,由于系統(tǒng)中需要使用16片TI 6678,如果采用傳統(tǒng)的仿真器進行程序固化,那么在調(diào)試和程序燒寫過程中需要重復(fù)且頻繁地燒寫用戶程序.dat文件到片外Flash,為減輕程序更新操作的復(fù)雜減少更新時間,本文提出一種基于PowerPC的FTP服務(wù)器的動態(tài)加載方法,該方法的系統(tǒng)硬件架構(gòu)如圖4所示,本系統(tǒng)由4塊DSP板卡組成,每塊板卡中搭載4個DSP芯片,每個DSP芯片的網(wǎng)絡(luò)接口與板上的網(wǎng)絡(luò)交換芯片相連,4個DSP板卡的16個6678芯片與中心控制板的網(wǎng)絡(luò)通過交換芯片進行互聯(lián),基于交換芯片的網(wǎng)絡(luò)互聯(lián)機制為網(wǎng)絡(luò)加載提供物理通路。

圖4 多片網(wǎng)絡(luò)加載硬件架構(gòu)

具體加載過程為:在每個DSP外掛的Flash中固化統(tǒng)一的一個小的用戶程序,該程序在上電后由Flash自動加載到共享存儲區(qū)的前128KB空間(0x0C000000-0X0C020000該空間在正常用戶程序中作為數(shù)據(jù)接收緩存用,在動態(tài)加載階段作為加載程序執(zhí)行的運行空間),由Core0實現(xiàn)每個芯片的時鐘、DDR、網(wǎng)絡(luò)初始化,其余7個核處于Idle狀態(tài),程序中根據(jù)槽位號和DSP節(jié)點號為每個DSP芯片設(shè)置一個固定的網(wǎng)絡(luò)IP地址(例如:192.168.0.1---192.168.0.16),網(wǎng)絡(luò)地址設(shè)定完畢后啟動TCP客戶端線程,等待運行于中心控制板的TCP服務(wù)器啟動;16個 DSP中實際需要運行的用戶程序首先利用工具鏈將.out文件轉(zhuǎn)換成對應(yīng)的.dat文件存放到PowerPC的FTP服務(wù)器上,每個芯片的用戶程序以文件名區(qū)分,例如dsp1.dat,dsp2.dat……dsp16.dat,中心控制板在上電啟動后,從FTP服務(wù)器中按照文件名依次讀取DSP的用戶程序,同時根據(jù)確定的IP地址利用TCP協(xié)議將DSP程序從FTP服務(wù)器中傳輸?shù)紻SP芯片,DSP接收到文件后,判斷接收最后字節(jié)是否是Boot Table文件結(jié)束標識(32位全0),如果數(shù)據(jù)流中沒有結(jié)束標識則繼續(xù)接收,如果出現(xiàn)結(jié)束標識,則認為程序文件傳輸完畢,Core0將接收到的數(shù)據(jù)文件按照Boot Table文件格式,首先獲取32位頭地址(用戶程序_c_int00函數(shù)地址),然后根據(jù)Boot Table文件格式將用戶程序搬移到指定地址,Core0搬移完成后,將_c_int00地址寫入到從核L2的最后4字節(jié)(0x1X87FFFC,X為核號),依次向從核發(fā)送IPC中斷啟動從核,然后Core0跳轉(zhuǎn)到_c_int00地址執(zhí)行,至此,整個DSP芯片的用戶程序?qū)崿F(xiàn)了從中心控制板的FTP服務(wù)器到DSP芯片內(nèi)執(zhí)行的過程。針對加載過程中的地址空間劃分,在RBL階段由片內(nèi)固化程序占用L2空間最后54字節(jié),在動態(tài)加載程序執(zhí)行時,僅占用所有存儲空間中共享存儲區(qū)前128KB空間,該128KB空間用于程序的代碼段、常量段、向量端、堆棧段等程序執(zhí)行段,在程序加載完成后,共享區(qū)占用的128KB存儲空間在跳轉(zhuǎn)到用戶程序時被全部交給用戶程序使用,即整個程序加載完成后用戶程序可以使用DSP芯片的所有存儲空間。

5 結(jié)束語

本文詳細介紹了TI C66XX系列多核啟動的流程和加載方式,分析了加載文件格式,提出將用戶程序上傳到FTP服務(wù)器實現(xiàn)用戶程序在線動態(tài)加載,該方式同傳統(tǒng)的仿真器單個燒寫的方式相比,顯著提高了程序更新的效率,同時由于在每個DSP的Flash固化的程序全部一致,因此系統(tǒng)內(nèi)的4塊DSP板卡無需固定槽位,每個DSP上電后的屬性和地位由槽位號和節(jié)點號確定,提高硬件板卡的通用性,這種加載方式對于提高開發(fā)效率,縮短產(chǎn)品研發(fā)周期,具有非常重要的工程實踐意義。

猜你喜歡
寄存器啟動程序
給Windows添加程序快速切換欄
《悅讀·家》暨“悅讀·家@萬家”活動啟動
試論我國未決羈押程序的立法完善
飛思卡爾單片機脈寬調(diào)制模塊用法研究
移位寄存器及算術(shù)運算應(yīng)用
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
電啟動機的正確使用
俄媒:上合組織或9月啟動擴員
美啟動對我金屬絲網(wǎng)托盤的反傾銷反補貼損害調(diào)查等
独山县| 荣昌县| 石楼县| 沽源县| 仁怀市| 天等县| 江都市| 图木舒克市| 富源县| 富裕县| 辰溪县| 莎车县| 金湖县| 嘉禾县| 呼图壁县| 诸暨市| 武陟县| 新安县| 中牟县| 正安县| 汝南县| 郑州市| 吉林省| 阿拉尔市| 犍为县| 盖州市| 松潘县| 黄石市| 玉龙| 沂水县| 武强县| 广州市| 青河县| 灵山县| 朔州市| 邹平县| 察隅县| 新乐市| 澎湖县| 大名县| 牙克石市|