摘要 以TMS320VC5402為例,探討一種綜合運(yùn)用C語言、數(shù)據(jù)文件及GEL語言的Flash編程新方法。該方法完全采用C語言編寫燒寫程序,解決了指針不能訪問高端Flash的問題;把引導(dǎo)表作成數(shù)據(jù)文件,可實(shí)現(xiàn)大引導(dǎo)表的分批次加載;通過GEL程序控制C程序執(zhí)行,較好地體現(xiàn)了Flash編程的流程。 關(guān)鍵詞 TMS320VC5402 Flash 引導(dǎo)表 通用擴(kuò)展語言 GEL 引 言
這里提出的Flash編程方法完全采用C語言編寫燒寫程序,運(yùn)用函數(shù)地址訪問高端Flash,借助數(shù)據(jù)文件將引導(dǎo)表加載到數(shù)據(jù)空間。GEL(General Extension Lan—guage,通用擴(kuò)展語言)作為一種程序擴(kuò)展語言,被廣泛用于調(diào)試及程序運(yùn)行環(huán)境的定制。這里將GEL語言運(yùn)用于Flash編程,可以控制C程序在數(shù)據(jù)加載完成后執(zhí)行燒寫過程,從而實(shí)現(xiàn)大引導(dǎo)表的燒寫。 1 DSP開發(fā)板及Flash存儲(chǔ)器 筆者使用的DSP開發(fā)板上有1片TMS320VC5402通用DSP芯片、1片SST39VF4O0A存儲(chǔ)芯片(Flash)、鍵盤和液晶顯示器等。其中Flash容量為256 K字(1字一16位),組織為128個(gè)扇區(qū)或8個(gè)塊。為充分發(fā)揮Flash容量大的特點(diǎn),本系統(tǒng)在硬件上將Flash空間的映射設(shè)計(jì)為:在上電自舉過程中,F(xiàn)lash空間的Ox04000~0X0FFFF映射到數(shù)據(jù)空間的Ox4000~0xFFFF;上電自舉完成后,整個(gè)Flash空間0x00000~0x3FFFF映射到程序空間的0x80000~0xBFFFF,即映射到了TMS320VC5402的擴(kuò)展程序空間,處于高地址,因此稱為“高端Flash”。由此可知,對(duì)系統(tǒng)進(jìn)行應(yīng)用開發(fā)時(shí),F(xiàn)lash總是表現(xiàn)為高端Flash。 2 Flash編程流程
![]() 2.1 生成引導(dǎo)表 通過Hex轉(zhuǎn)換工具,將用戶程序qq.out文件轉(zhuǎn)換成十六進(jìn)制形式的ASCII碼流文件(ASCII—Hex格式文 qq.out
一O qq.a(chǎn)SC ?。?轉(zhuǎn)換成qq.a(chǎn)sc*/
2.2 轉(zhuǎn)換成數(shù)據(jù)文件
CCS支持的數(shù)據(jù)文件的第一行為文件頭信息,格式為: 幻數(shù)數(shù)據(jù)格式起始地址 頁類型 數(shù)據(jù)塊大小 其后是文件內(nèi)容,每行表示一個(gè)數(shù)據(jù)。其中幻數(shù)固定為“1651”,數(shù)據(jù)格式可以選擇“1”(十六進(jìn)制整型)、“2”(十進(jìn)制整型)、“3”(十進(jìn)制長整型)、“4”(十進(jìn)制浮點(diǎn)型)。
由于Flash空間映射到TMS320VC5402程序空間的Ox8OOOO~OxBFFFF,故實(shí)際編寫程序時(shí)使用的Flash空間的地址均需偏移0x80000。例如,F(xiàn)lash空間的0x5555地址單元實(shí)際上為0x85555。 正如前面所介紹的,雖然高端Flash囊括了整個(gè)Flash空間,但是對(duì)于C54x系列芯片,其C語言指針的寬度為16位,只能訪問64 K字范圍(0x0000~0xFFFF)之內(nèi)的存儲(chǔ)空間,而不能訪問高端Flash(Ox80000~OxBFFFF)。 參考文獻(xiàn)[3]討論了用C語言指針不能訪問C54x系列DSP擴(kuò)展程序空間的問題,提出了用函數(shù)名代替指針來訪問擴(kuò)展程序空間的方法,并給出了可供C程序調(diào)用的pfunc ext.1ib庫。這一方法本質(zhì)上是將函數(shù)名代表的程序空間地址(20位)傳送到4o位的累加器,進(jìn)行累加器尋址,因此使用該庫恰好可以解決指針不能訪問高端Flash的問題。庫中以下兩個(gè)函數(shù)是有用的: int PFUNC_ wordRead(PFUNC addrProg); 為應(yīng)用pfunc_ext.1ib庫,需定義一些函數(shù),并在命令文件中為這些函數(shù)所在的自定義代碼段分配段地址,以使這些函數(shù)的函數(shù)名指向Flash特定的地址單元。例如,可以編寫一個(gè)C程序源文件,定義一個(gè)空函數(shù)FLASH一5555以指向0x85555: #pragma CODE—SECTION(FLASH一5555,”bigpointer”) Flash的其他地址可依此方法得到,pfunc—ext.1ib庫的具體說明見參考文獻(xiàn)E3-1。下面應(yīng)用pfuncext.1ib庫編寫了Flash擦除和編程的3個(gè)基本函數(shù)flash—erase()、flash_word_write()、flashserial—write(),分別完成Flash擦除、字編程和連續(xù)編程。其中連續(xù)編程只是循環(huán)調(diào)用了字編程函數(shù)。擦除和字編程的流程分別如圖2和圖3所示。擦除函數(shù)的代碼如下:
unsigned int flash_ erase(PFUNC addr,unsigned type){
//OxAA一>*(0x85555) ...
...
![]() 有了這些基本函數(shù),就可以在主函數(shù)中完成Flash的燒寫。下面的主函數(shù)實(shí)現(xiàn)將引導(dǎo)表燒寫進(jìn)Flash。 void main(){ ...
asm(”program2:”); //連續(xù)編程 ...
例中采用了塊擦除的方式。MEM—BASE是多次加載引導(dǎo)表的緩沖區(qū)起始地址,為與數(shù)據(jù)文件qq—dat1.dat中文件頭對(duì)應(yīng),應(yīng)保證MEM—BASE指向0x4000。其方法類似于上述函數(shù)名的地址分配(使用#pragma DATA—SECTION偽指令)。最后完成字編程,使Bootloader上電時(shí)得以在數(shù)據(jù)空間的0xFFFF處讀取引導(dǎo)表在數(shù)據(jù)空間的起始地址,例中為0x4000。為使主函數(shù)正確執(zhí)行,需借GEL語言的運(yùn)行調(diào)試功能,由此設(shè)計(jì)的GEL程序真正體現(xiàn)了Flash燒寫的流程。GEL程序流程如圖4所示,部分代碼如下: menuitem ”PROGRAMMING”;
{
GEL_Load(”ProgramFlash.out”); ...
GEL Go(program1);//執(zhí)行連續(xù)編程 ...
GEL程序在C程序每次執(zhí)行前設(shè)定正確的環(huán)境變量并初始化緩沖區(qū)。例如,數(shù)據(jù)文件的長度usercode—length1就是需要根據(jù)實(shí)際的數(shù)據(jù)文件長度進(jìn)行設(shè)定的環(huán)境變量;而在進(jìn)行連續(xù)編程之前,需要GEL程序重新加載M EM _ BASE緩沖區(qū)。
![]() 3 運(yùn)行結(jié)果
參考文獻(xiàn)
|
聯(lián)系客服