楊宣兵 , 陳 明, 彭 義
(1. 湖南理工學(xué)院 信息與通信工程學(xué)院, 湖南 岳陽(yáng) 414006; 2. 岳陽(yáng)千盟電子公司, 湖南 岳陽(yáng) 414000)
TI 公司的TMS320F28335 DSP具有32位TMS320C28X CPU和FPU處理器, 片上FLASH、SARAM以及外設(shè)相比 TMS320F2812有了進(jìn)一步的擴(kuò)展和增強(qiáng), 它是目前控制領(lǐng)域中的先進(jìn)處理器, 在電機(jī)控制、變頻器、不間斷電源以及電力線通信等系統(tǒng)中應(yīng)用越來(lái)越廣泛. 一般而言, DSP系統(tǒng)工作過(guò)程為: 通過(guò)AD采樣外部信號(hào), DSP對(duì)AD采樣數(shù)據(jù)完成實(shí)時(shí)信號(hào)處理, 一般包括數(shù)字濾波、FFT運(yùn)算等, 同時(shí)根據(jù)運(yùn)算的結(jié)果產(chǎn)生控制信號(hào). 在系統(tǒng)設(shè)計(jì)完成后, 程序需要固化在片上 FLASH, 一般而言, CPU對(duì)FLASH的訪問(wèn)至少需要5個(gè)以上的等待周期, 這在實(shí)際的實(shí)時(shí)處理系統(tǒng)中是絕對(duì)不允許的, 因此需要系統(tǒng)在上電時(shí)通過(guò)TI 的Bootloader將固化在片上FLASH上的程序加載到RAM中并在RAM中運(yùn)行, 實(shí)現(xiàn)零等待, 使代碼運(yùn)行最有效率. 本文分析代碼運(yùn)行過(guò)程, 實(shí)現(xiàn)將片上FLASH中應(yīng)用程序加載到片上RAM中運(yùn)行方法.
在進(jìn)行軟件設(shè)計(jì)之前, 首先要了解TMS320F28335 DSP運(yùn)行過(guò)程. 當(dāng)系統(tǒng)上電復(fù)位后, 程序到復(fù)位向量0x3FFFC0位置開(kāi)始程序執(zhí)行, 在復(fù)位向量處根據(jù)向量?jī)?nèi)容跳轉(zhuǎn)到片上ROM里面的Boot ROM位置執(zhí)行初始化引導(dǎo)函數(shù)InitBoot, InitBoot完成對(duì)芯片的初始化, 并調(diào)用模式選擇函數(shù)SelectBootMode來(lái)確定引導(dǎo)模式, 選擇Jump to FLASH模式. 程序退出BOOT轉(zhuǎn)向FLASH中0x33FFF6處執(zhí)行程序, 用戶需要在0x33FFF6開(kāi)始程序的設(shè)計(jì). 系統(tǒng)從復(fù)位開(kāi)始到轉(zhuǎn)向FLASH過(guò)程如圖1所示.
圖1 系統(tǒng)從上電到FLASH入口流程
在開(kāi)發(fā)基于TMS320F28335 DSP應(yīng)用系統(tǒng)時(shí), 在開(kāi)發(fā)調(diào)試階段用戶程序加載和執(zhí)行都在RAM中, 用戶代碼執(zhí)行流程如圖2所示.
圖2 程序調(diào)試階段運(yùn)行流程
在應(yīng)用程序調(diào)試成功后, 將程序固化在FLASH, 在上電時(shí)將FLASH中程序加載RAM, 并在RAM中運(yùn)行. 用戶代碼執(zhí)行流程如圖3所示.
圖3 程序加載運(yùn)行流程
在DSP2833x_CodeStartBranch.asm模塊中包含了code_start和wd_disable流程. 上電后code_start流程應(yīng)加載到存儲(chǔ)空間的0x33FFF6 FLASH處, 在此處安排跳轉(zhuǎn)指令到wd_disable流程, 完成watchdog的禁止, 然后調(diào)用copy_sections函數(shù)完成用戶應(yīng)用程序代碼從FLASH到RAM的移植過(guò)程. 因此code_start,wd_disable和copy_sections要求在加載和運(yùn)行于FLASH中. 需要將DSP2833x_CodeStartBranch.asm模板代碼作相應(yīng)調(diào)整, 主要表現(xiàn)為以下幾點(diǎn):
① 將code_start流程中LB _c_int00修改為L(zhǎng)B copy_sections;
② 將wd_disable流程中 .text 修改為.sect “wddisable”, 主要原因是.text段會(huì)移植到RAM中運(yùn)行, 而wd_disable流程必須代碼搬移之前執(zhí)行, 因此必須在FLASH中執(zhí)行, 將自定義已初始化段wddisable加載和運(yùn)行定位于FLASH中;
③ 將wd_disable流程中LB _c_int00修改為L(zhǎng)B copy_sections;
④ 需要將sectionCopy.asm模塊添加到工程中來(lái), 至此完成代碼搬移代碼的準(zhǔn)備工作;
⑤ 因?yàn)橄到y(tǒng)調(diào)試完畢, 所以可執(zhí)行代碼都應(yīng)該加載在 FLASH, 此時(shí)需要將 DSP2833x_usDelay.asm模塊中_DSP28x_usDelay子程序加載和運(yùn)行在“ramfuncs”段修改為加載在FLASH中, 而運(yùn)行在RAM中,即將 .sect “ramfuncs” 修改為 .text 就行;
⑥ 因?yàn)镕LASH的配置函數(shù)InitFlash( )必須加載和固化在FLASH, 而運(yùn)行必須在RAM中, 因此可以將模塊DSP2833x_SysCtrl.c的pragma CODE_SECTION(InitFlash, “ramfuncs”)去掉, 即直接把此函數(shù)定位在.text段, 而在系統(tǒng)上電時(shí)把.text段搬移到片內(nèi)RAM中執(zhí)行.
CMD文件完成存儲(chǔ)空間的配置并告訴鏈接器將輸出段鏈接到物理存儲(chǔ)器的位置, 指定各輸出段的加載和運(yùn)行地址. 下面是 MEMORY部分幾個(gè)重要的區(qū)域, 主要完成程序的固化, 加載和運(yùn)行. 下面給出鏈接器命令文件(.cmd文件)的存儲(chǔ)器配置命令MEMORY和輸出段加載和運(yùn)行定位命令SECTIONS的部分內(nèi)容如下:
因?yàn)樵谟脩舸a從 FLASH搬移到片內(nèi) RAM 之前, 程序的運(yùn)行必須在非易失性存儲(chǔ)器(即TMS320F28335 DSP的FLASH ), 因此codestart、wddisable以及copysections必須加載和運(yùn)行于FLASH中, 其他的已初始化段加載在FLASH中而運(yùn)行在片上RAM中, 因此對(duì)這些段的加載和運(yùn)行必須指定不同的存儲(chǔ)空間, 如上面給出的F28335_nonBIOS_flash.cmd文件中.text段所示.
我們?cè)陂_(kāi)發(fā)基于DSP的無(wú)線感應(yīng)通信器項(xiàng)目中, 首先完成軟件在RAM中仿真調(diào)試, 然后將2DPSK調(diào)制的DSP應(yīng)用程序燒寫(xiě)到FLASH, 斷開(kāi)仿真器與DSP硬件系統(tǒng)的連接, 將DSP系統(tǒng)上電, 系統(tǒng)自動(dòng)完成應(yīng)用程序上電啟動(dòng)和向RAM的搬移并在片內(nèi)RAM中運(yùn)行, 通過(guò)示波器觀察調(diào)制信號(hào)輸出與調(diào)試階段一致, 達(dá)到相應(yīng)要求.
本文給出了TMS320F28335 DSP應(yīng)用程序在片內(nèi)RAM高速運(yùn)行的移植方法, 并在項(xiàng)目開(kāi)發(fā)中驗(yàn)證了方法的可行性, 在實(shí)際項(xiàng)目開(kāi)發(fā)的后期階段具有重要的實(shí)際意義. 另外, 也要注意, 如果應(yīng)用程序較大,片內(nèi)RAM空間除去作為數(shù)據(jù)存儲(chǔ)空間外, 不足以把所有的應(yīng)用程序從FLASH移植到片內(nèi)的RAM, 就可以考慮將適時(shí)性要求較高的代碼進(jìn)行移植運(yùn)行, 或者外部擴(kuò)展高速的片外RAM.
[1]寧改娣. DSP控制器原理及應(yīng)用[M]. 第2版. 北京: 科學(xué)出版社, 2009
[2]TI. TMS320x2833x, 2823x BOOT ROM Reference Guide(Literature Number: SPRU963A),2007-Revised 2008
[3]TI. Copying Compiler Sections From Flash to RAM on the TMS320F28xxx DSCs(Literature Number: SPRAAU8), 2008
[4]孫中禹. 數(shù)字信號(hào)處理器TMS320F2812的片內(nèi)FLASH應(yīng)用程序設(shè)計(jì)[J]. 電子元器件應(yīng)用, 2009(12): 28~30