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