




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、-. z.把DSP TMS320F28*的程序段從flash復(fù)制到ram中運(yùn)行翻譯自TI應(yīng)用手冊SPRAAU8摘要這個(gè)應(yīng)用報(bào)告和相關(guān)的代碼提供了一種把編譯后的程序段從TMS320F28*的flash復(fù)制到ram的功能,這樣可以提高代碼的運(yùn)行速度。這個(gè)解決方案在直接啟動(dòng)之后,進(jìn)入c_int00 C語言代碼運(yùn)行之前實(shí)現(xiàn)此功能。本應(yīng)用報(bào)告中所討論的工程容和源代碼可以從以下網(wǎng)址下載:-s.ti./sc/techlit/spraau8.zip1.引言:在許多應(yīng)用中,代碼的執(zhí)行速度是至關(guān)重要的。例如在醫(yī)療,監(jiān)控,電機(jī)控制等等一些對時(shí)間有嚴(yán)格要求的終端設(shè)備。許多應(yīng)用使用TMS320F28* DSCs是因?yàn)樗?/p>
2、的置flash儲存器。置flash是TMS320F28*的一個(gè)優(yōu)勢,因?yàn)樗沟迷O(shè)計(jì)者不需要外接flash來儲存代碼。使用部flash缺點(diǎn)是訪問Flash需要等待狀態(tài),這使得程序的運(yùn)行變慢。在大多數(shù)應(yīng)用中,這不是一個(gè)問題。其他一些應(yīng)用中可能會為了獲得最高的運(yùn)行速度要求無等待狀態(tài)。部RAM存儲器具有零等待狀態(tài),它是易失性存儲器。所以,引導(dǎo)的初始化代碼段不可以存儲在此存儲器中?,F(xiàn)在提供的解決方案,使得設(shè)計(jì)者能夠在運(yùn)行時(shí)把被編譯器初始化的代碼段從flash復(fù)制到ram里,獲得最大的運(yùn)行速度。這使代碼執(zhí)行從多達(dá)15個(gè)等待狀態(tài)的提升到0等待狀態(tài)。另一種解決方案是只將*些函數(shù)從Flash復(fù)制到RAM。詳見:
3、Running an Application from Internal Flash Memory on the TMS320F28* DSP(SPRA958)。這種方法應(yīng)該使用在大多數(shù)使用C2000 DSC的應(yīng)用上,其他要求嚴(yán)格的時(shí)序和連續(xù)的零等待狀態(tài)的應(yīng)用程序應(yīng)采用這里提出的解決方案。編寫匯編程序來完成代碼從Flash到RAM的復(fù)制。該匯編代碼在復(fù)位向量后調(diào)用c_int00之前執(zhí)行。這保證了在c_int00調(diào)用mian之前完成復(fù)制。有一些工程比擬小,可以把所有初始化了的段都復(fù)制到ram。然而,其他一些工程的初始化了的段比所有的部ram還要大。這些工程可能不可以把所有的初始化了的段都復(fù)制到r
4、am,但是用這種方法復(fù)制其中一局部段。2.編譯的代碼段:編譯器生成的包含代碼和數(shù)據(jù)的多個(gè)局部,稱為段。這下段被分為兩個(gè)不同的組:初始化了的和沒被初始化的,初始化的局部是由所有的代碼,常量和初始化表組成的。下表列出了由編譯器產(chǎn)生的初始化段。初始化段段名容限制.cinit顯式初始化的全局變量和靜態(tài)變量表代碼.const顯式初始化的全局和靜態(tài)的const變量和字符串常量不超過64K長度.econst長調(diào)用的常量數(shù)據(jù)中的任何地方.pinit全局對象的構(gòu)造函數(shù)表代碼.switchswitch語句產(chǎn)生的表代碼或者數(shù)據(jù).te*t可執(zhí)行代碼和常數(shù)代碼沒初始化的段是由未初始化的變量,堆棧和malloc產(chǎn)生的存。
5、下表列出了由編譯器產(chǎn)生的沒初始化段。沒初始化段段名容限制.bss全局和靜態(tài)變量不超過64K長度.ebss長調(diào)用的全局或靜態(tài)變量數(shù)據(jù)中的任何地方.stack堆棧空間不超過64K長度.sysmemmalloc函數(shù)產(chǎn)生的存不超過64K長度.esysmemfar_malloc函數(shù)產(chǎn)生的存數(shù)據(jù)中的任何地方一旦編譯器生成的這些段,連接器會從各個(gè)源文件中取出這些段,并結(jié)合它們來創(chuàng)立一個(gè)輸出文件。連接器命令文件 d就是用來告訴連接器去哪里找這些段的。初始化段必須分配到非易失性存儲器,如flash/ ROM,當(dāng)電源被撤除時(shí),程序不會消失。未初始化的段可以被分配到RAM中,因?yàn)樗鼈兪窃诖a執(zhí)行期間被初始化的。關(guān)于
6、更多編譯段和連接的信息,請參見:TMS320C28* Assembly LanguageTools Users Guide (SPRU513) 和 the TMS320C28* Optimizing C/C+ piler Users Guide(SPRU514)。儀器TI提供了多個(gè)例子顯示如何使用器命令文件分配編譯段。其中一個(gè)就是Running an Application from Internal Flash Memory on the TMS320F28* DSP (SPRA958)。此應(yīng)用文檔提供的例子,演示了使用基于RAM和Flash的工程的器命令文件。3.軟件:本應(yīng)用文檔相關(guān)的代碼
7、文件,包括修改后的版本的CodeStartBranch.asm文件和非DSP/BIOS工程用的文件DSP28*_SectionCopy_nonBIOS.asm,由the C/C+ Header Files and Peripheral E*amples提供。每個(gè)TMS320F28*處理器都提供了現(xiàn)成的連接器命令文件。提供的例如工程演示了如何使用這些文件。本應(yīng)用文檔以TMS320F2808為例。該軟件獨(dú)立存放于F28*_Flash_to_Ram文件夾中。代碼使用的來自the C/C+ Header Files and Peripheral E*amples的幾個(gè)文件,經(jīng)過了Code poser
8、Studio 3.3和F28*代碼生成工具B3版本的測試。3.描述:一般的程序流程是這樣子的:code_start-wd_disable-copy_sections-c_int00-mian。這個(gè)軟件流程比標(biāo)準(zhǔn)的軟件流程僅僅多了調(diào)用復(fù)制代碼段函數(shù)。標(biāo)準(zhǔn)的軟件流程:code_start-wd_disable-c_int00-mian。程序開場和關(guān)閉看門狗:code_start 和wd_disable 的運(yùn)行代碼由DSP28*_CodeStartBranch.asm文件提供。上電后,code_start正常執(zhí)行,因?yàn)樗环峙浣oFlash的引導(dǎo)地址的0*3F7FF6。詳見:Running an Ap
9、plication from Internal Flash Memory on the TMS320F28* DSP(SPRA958)plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0 .ref copy_sections .global code_start * * Function: codestart
10、section * * Description: Branch to code starting point * .sect codestart code_start: .if WD_DISABLE = 1 LB wd_disable ;Branch to watchdog disable code .else LB copy_sections ;Branch to copy_sections .endif WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0 .ref copy_sections .global code_start
11、* Function: codestart section* Description: Branch to code starting point* .sect codestartcode_start: .if WD_DISABLE = 1 LB wd_disable ;Branch to watchdog disable code .else LB copy_sections ;Branch to copy_sections .endif這個(gè)函數(shù)從the C/C+ Header Files and Peripheral E*amples提供的CodeStartBranch.asm文件修改而來
12、,只是第二個(gè)調(diào)用用copy_sections代替了_c_int00。這個(gè)調(diào)用僅僅在WD_DISABLE為0時(shí)執(zhí)行。 上面的代碼,WD_DISABLE 被設(shè)置為1。這使得wd_disable運(yùn)行。wd_disable的代碼如下:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o * * Function: wd_disable * * Description: Disables the watchdog timer * .
13、if WD_DISABLE = 1 .sect wddisable wd_disable: SETC OBJMODE ;Set OBJMODE for 28* object code EALLOW ;Enable EALLOW protected register access MOVZ DP, #7029h6 ;Set data page for WDCR register MOV 7029h, #0068h ;Set WDDIS bit in WDCR to disable WD EDIS ;Disable EALLOW protected register access LB copy_
14、sections ;Branch to copy_sections .endif * Function: wd_disable* Description: Disables the watchdog timer* .if WD_DISABLE = 1 .sect wddisablewd_disable: SETC OBJMODE ;Set OBJMODE for 28* object code EALLOW ;Enable EALLOW protected register access MOVZ DP, #7029h6 ;Set data page for WDCR register MOV
15、 7029h, #0068h ;Set WDDIS bit in WDCR to disable WD EDIS ;Disable EALLOW protected register access LB copy_sections ;Branch to copy_sections .endif這要求看門狗在copy_sections和c_int00函數(shù)運(yùn)行期間被除能,否則,看門狗可能會在進(jìn)入main之前超時(shí)。這個(gè)函數(shù)也是從the C/C+ Header Files and Peripheral E*amples提供的CodeStartBranch.asm文件修改而來,只是用copy_secti
16、ons代替了_c_int00。Copy_sections:DSP28*_SectionCopy_nonBIOS.asm文件提供了copy_sections的代碼,第一次運(yùn)行到這里,看門狗是關(guān)閉的,段已經(jīng)準(zhǔn)備好被復(fù)制,段大小被存放在累加器,裝載地址放在*AR6中,執(zhí)行地址放在*AR7中,這個(gè)功能例子如下:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o MOVL *AR5,#_te*t_size ; Store Sect
17、ion Size in *AR5 MOVL ACC,*AR5 ; Move Section Size to ACC MOVL *AR6,#_te*t_loadstart ; Store Load Starting Address in *AR6 MOVL *AR7,#_te*t_runstart ; Store Run Address in *AR7 LCR copy ; Branch to Copy MOVL *AR5,#_te*t_size ; Store Section Size in *AR5 MOVL ACC,*AR5 ; Move Section Size to ACC MOVL
18、*AR6,#_te*t_loadstart ; Store Load Starting Address in *AR6 MOVL *AR7,#_te*t_runstart ; Store Run Address in *AR7 LCR copy ; Branch to Copy段的大小,裝載開場標(biāo)志,執(zhí)行開場標(biāo)志都由連接器產(chǎn)生,這是在存分配 -器命令文件一節(jié)討論。在地址和段長度都被存放好之后,copy程序被調(diào)用來確定段是否被編譯器產(chǎn)生,這由檢測累加器是否為0來確定。plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy
19、copy HYPERLINK l # o print print HYPERLINK l # o copy: B return,EQ ; Return if ACC is Zero (No section to copy) RPT AL ; Copy Section From Load Address to | PWRITE *AR7, *AR6+ ; Run Address return: LRETR ; Return copy: B return,EQ ; Return if ACC is Zero (No section to copy) RPT AL ; Copy Section Fr
20、om Load Address to | PWRITE *AR7, *AR6+ ; Run Addressreturn: LRETR ; Return如果累加器為0,程序會返回到調(diào)用前的地址,如果累加器不為0,有段需要被復(fù)制。這用上面所示的PWRITE指令來實(shí)現(xiàn),PWRITE復(fù)制*AR6指向的存儲器的容到*AR7指向的容。在這里,就是復(fù)制裝載代碼的地址的容到運(yùn)行代碼的地址。這樣,一直到累加器為0,完成整個(gè)段的復(fù)制,當(dāng)所有段都被復(fù)制完,程序就會跳到c_int00,如下:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy
21、 copy HYPERLINK l # o print print HYPERLINK l # o LB _c_int00 ; Branch to start of boot.asm in RTS library LB _c_int00 ; Branch to start of boot.asm in RTS library到這里,C語言環(huán)境被建立,main是可進(jìn)去的。完整的copy_sections程序請參見相關(guān)文件夾中的DSP28*_SectionCopy_nonBIOS.asm。存分配 - 連接命令文件 d:如第二節(jié)所述,連接命令文件 d是用來告訴連接器怎么分配編譯器產(chǎn)生的段的。The
22、C/C+ Header Files and Peripheral E*amples提供了標(biāo)準(zhǔn)的連接命令文件 d。相關(guān)代碼文件中提供了三個(gè)器命令文件用于配置存分配。 F280*_nonBIOS_flash d F281*_nonBIOS_flash d F2833*_nonBIOS_flash d每個(gè)文件一般都用一樣的方法編寫,只是在存儲器方面有很小的一些差異特殊設(shè)備。連接命令文件 d的Memory局部是根據(jù)設(shè)備的存空間來連接編譯好的段的。詳情參見具體控制器的數(shù)據(jù)手冊。下表展示TMS320F2808的存儲器映射:TMS320F28*系列控制器置RAM,可以被分配為一個(gè)單獨(dú)的段,或者更多的段,因?yàn)?/p>
23、它是連續(xù)的存儲器映射。如上圖所示,F(xiàn)2808有映射到存儲器空間的L0,L1和H0 SARAMs,允許生成一個(gè)大的存塊,這個(gè)塊可以被CMD文件的MEMORY局部如下定義:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o RAM_H0L0L1 : origin = 0*008000, length = 0*004000 /* on-chip RAM */ RAM_H0L0L1 : origin = 0*008000, le
24、ngth = 0*004000 /* on-chip RAM */其余的也可以定義在MEMORY局部,完整的存分配,請參見相關(guān)文件中的CMD文件。器命令文件的第二局部是SECTIONS。這是實(shí)際編譯器把段連接到的存儲區(qū)。所有DSP28*_CodeStartBranch.asm 和 DSP28*_SectionCopy_nonBIOS.asm的段都被裝載到flash中運(yùn)行,這局部如下所示分配:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPER
25、LINK l # o codestart : BEGIN_FLASH, PAGE = 0 /* Used by file CodeStartBranch.asm */ wddisable : FLASH_AB, PAGE = 0 /* Used by file CodeStartBranch.asm */ copysections : FLASH_AB, PAGE = 0 /* Used by file SectionCopy.asm */ codestart : BEGIN_FLASH, PAGE = 0 /* Used by file CodeStartBranch.asm */wddis
26、able : FLASH_AB, PAGE = 0 /* Used by file CodeStartBranch.asm */copysections : FLASH_AB, PAGE = 0 /* Used by file SectionCopy.asm */其他被初始化的段被下載到flash,但是在ram中運(yùn)行。這是通過load和run指令來實(shí)現(xiàn)。下面展示一個(gè)例子:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o
27、 .te*t : LOAD = FLASH_AB, PAGE = 0 /* Load section to Flash */ RUN = RAM_H0L0L1,PAGE = 0 /* Run section from RAM */ LOAD_START(_te*t_loadstart), RUN_START(_te*t_runstart), SIZE(_te*t_size) .te*t : LOAD = FLASH_AB, PAGE = 0 /* Load section to Flash */ RUN = RAM_H0L0L1,PAGE = 0 /* Run section from RAM
28、 */ LOAD_START(_te*t_loadstart), RUN_START(_te*t_runstart), SIZE(_te*t_size)為了獲得與一個(gè)段相關(guān)聯(lián)的特定地址,如上所示,使用了LOAD_START, RUN_START, 和SIZE指令。這些指令的地址和大小在DSP28*_SectionCopy_nonBIOS.asm文件使用到,用以在復(fù)制過程中指向正確的地址。DSP28*_SectionCopy_nonBIOS.asm把這些值創(chuàng)立為全局變量,如以下圖所示plain HYPERLINK l # o view plain view plain HYPERLINK l #
29、 o copy copy HYPERLINK l # o print print HYPERLINK l # o .global _cinit_loadstart, _cinit_runstart, _cinit_size .global _const_loadstart, _const_runstart, _const_size .global _econst_loadstart, _econst_runstart, _econst_size .global _pinit_loadstart, _pinit_runstart, _pinit_size .global _switch_load
30、start, _switch_runstart, _switch_size .global _te*t_loadstart, _te*t_runstart, _te*t_size .global _cinit_loadstart, _cinit_runstart, _cinit_size.global _const_loadstart, _const_runstart, _const_size.global _econst_loadstart, _econst_runstart, _econst_size.global _pinit_loadstart, _pinit_runstart, _p
31、init_size.global _switch_loadstart, _switch_runstart, _switch_size.global _te*t_loadstart, _te*t_runstart, _te*t_size測試?yán)樱禾峁┑睦缭赥MS320F2812,TMS320F2808,TMS320F28335eZdsp開發(fā)板上進(jìn)展了測試。板子上LED的閃爍可以從視覺上證實(shí)程序是否正確運(yùn)行。下面的程序是基于F2808eZdsp評估板設(shè)計(jì)和測試的。同樣的,這種方法可以用于其他eZdsp開發(fā)板。Code poser Studio環(huán)境:1.使用USB線連接F2808eZdsp開發(fā)板到
32、PC,接上電源線給板子供電。2.翻開Code poser Studio,設(shè)置F2808 eZdsp 仿真器。3.翻開和編譯E*ample_280*_Flash_to_RAM_nonBIOS.pjt。4.下載.out文件到芯片的flash中。5.調(diào)試程序debug。6.運(yùn)行程序run。在eZdsp電路板上的LED應(yīng)閃爍,表示程序正在運(yùn)行。應(yīng)用:現(xiàn)有的Flash應(yīng)用程序可以很容易地通過移植相關(guān)代碼文件來實(shí)現(xiàn)此功能。根本的移植步驟如下:1.用DSP28*_CodeStartBranch.asm替換CodeStartBranch.asm。2.在工程中添加DSP28*_SectionCopy_nonBI
33、OS.asm文件。3.用特殊生成的CMD文件代替現(xiàn)有的CMD文件。這個(gè)根本步驟不適用于一些特殊情況,比方用戶自己定義的段,等應(yīng)用例子:為了演示的應(yīng)用程序集成的過程,在C280*,C2801*C / C +頭文件和外設(shè)例如的E*ample_2808_Flash.pjt中使用以下步驟移植。1.下載安裝C280*, C2801* C/C+ Header Files and Peripheral E*amples。2.如上所述連接板,翻開工程文件。3.刪除工程中的DSP280*_CodeStartBranch.asm文件,在工程中添加DSP28*_CodeStartBranch.asm文件。4.在工程
34、中添加DSP28*_SectionCopy_nonBIOS.asm文件。5.刪除工程中的cmd文件,在工程中添加F280*_nonBIOS_flash d文件。6.把DSP280*_usDelay.asm中的.sect ramfuncs改為.te*t,使DSP28*_usDelay在被分配在.test段中。7.刪除DSP280*_SysCtrl.c文件中的#pragma CODE_SECTION(InitFlash, ramfuncs);。使得InitFlash( )函數(shù)被分配到.test而不是ramfuncs。8.刪除E*ample_280*Flash.c文件中的#pragma CODE_SECTION(epwm1_timer_isr, ramfuncs);和#pragma CODE_SECTION(epwm2_timer_isr, ramfuncs);。使得中斷效勞函數(shù)被分配到.test而不是ramfuncs。9.刪除E*ample_280*Flash.c文件中的MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);和InitFlash(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 助動(dòng)車維修技術(shù)交流考核試卷
- 機(jī)器視覺與圖像處理技術(shù)考核試卷
- 智能儀器儀表項(xiàng)目規(guī)劃考核試卷
- 醫(yī)用針灸貼的種類和使用建議考核試卷
- 供應(yīng)鏈數(shù)字化轉(zhuǎn)型案例與啟示考核試卷
- 木紋設(shè)計(jì)與加工考核試卷
- 苗圃白蟻防治合同范本
- 留置權(quán)合同范本
- 業(yè)擴(kuò)報(bào)裝培訓(xùn)課件
- 8.3 摩擦力(共28張) 2024-2025學(xué)年人教版物理八年級下冊
- 《完善中國特色社會主義法治體系》課件
- 2025版 高考試題分析-數(shù)學(xué)-部分4
- 湘教版三年級美術(shù)下冊教案全冊
- 重癥監(jiān)護(hù)-ICU的設(shè)置、管理與常用監(jiān)測技術(shù)
- 2024版高一上冊語文模擬試卷
- 法律顧問服務(wù)投標(biāo)方案(完整技術(shù)標(biāo))
- 知道網(wǎng)課智慧樹《哲學(xué)導(dǎo)論(湖南師范大學(xué))》章節(jié)測試答案
- 防止員工集體離職合同
- 加油站合作協(xié)議書
- 福建省廈門市2023屆高三二模語文試題(解析版)
- Office辦公軟件理論知識考核試卷
評論
0/150
提交評論