1. 程式人生 > >DSP從flash複製程式碼到ram去出現錯誤;

DSP從flash複製程式碼到ram去出現錯誤;

#pragma CODE_SECTION(QF_run, "ramfuncs");

 

移植完qp後,一旦使用經過程式碼複製過的函式後,立刻出現錯誤。

經過上網查詢後發現主函式未新增MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); 導致使用函式時找不到記憶體地址,於是報錯。

 

 

 

 

http://www.ti.com.cn/product/cn/tms320c28345

 

http://blog.csdn.net/cherishlei/article/category/1251317

 

1.DSP reset後執行的起始地址是多少?

0x3FFFC0

2.模擬器燒寫程式的步驟是?

根據cmd檔案把程式燒到指定位置,然後執行。

3.DSP的Flash啟動過程是什麼?

首先硬體配置GPIO84~87上拉為1,即處於Flash啟動過程。當DSP復位後,會從復位向量0x3FFFC0處取得復位向量,並跳轉到InitBoot處開始執行,InitBoot會讀GPIO84~87的值發現全為1判斷為Flash啟動方式。然後會跳到0x33FFF6處執行。在CCS5.2工程的cmd檔案中有如下程式碼:

MEMORY
{
PAGE 0 :
   BEGIN       : origin = 0x33FFF6, length = 0x000002     /* Boot to M0 will go here                      */

...
}

SECTIONS
{...

codestart           : > BEGIN       PAGE = 0

...}

即表示把codestart段放到0x33FFF6位置處,檔案“DSP2833x_CodeStartBranch.asm”中有codestart段的定義,實際上codestart段只是包含了一個跳轉指令,是程式跳轉到_c_int00處,_c_int00在boot.asm in RTS library中有定義,_c_int00的程式碼最終會呼叫c的main函式,之後就是main函式的執行。

4.F28335如何燒寫程式碼到flash中並執行?

首先使用新增C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_common\cmd\F28335.cmd。此檔案即為配置程式碼到flash中的TI官方配置檔案。

然後參考C:\ti\controlSUITE\device_support\f2833x\v133\DSP2833x_examples_ccsv4\flash_f28335。新增以下程式碼:

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);將一些在記憶體中執行的程式碼從flash複製到記憶體中,然後程式才能正常執行。

5.寫好的程式碼再ram中能正常執行但是燒寫到flash中後,函式DSP28x_usDelay()不能正常執行為什麼?

因為在DSP2833x_usDelay.asm中有.sect "ramfuncs",即把該函式定義在段"ramfuncs"中, 而此段需要在記憶體中執行,故需要使用函式

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);將ramfuncs段複製到記憶體中然後執行。只算以這樣設計是因為函式DSP28x_usDelay()精準執行對執行速度有要求故必須放在段"ramfuncs"中。參考:http://blog.sina.com.cn/s/blog_9388c4140100vs0r.html

6.cmd中以下程式碼如何解釋?

   ramfuncs   : LOAD = FLASHD, 
                         RUN = RAML0, 
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         PAGE = 0

第1行表示該段的裝載在PAGA0的FLASHD中
第2行表示該段的執行地址在PAGE0的RAML0中
LOAD_ START(_RamfuncsLoadStart)令編譯器建立了一個變數RamfuncsLoadStart,該變數指向段ramfuncs的裝載地址的首地址(LOAD_ START為編譯偽指令,請見CCS的幫助文件);
LOAD_ START(_RamfuncsLoadEnd)令編譯器建立了一個變數RamfuncsLoadEnd,該變數指向段ramfuncs的裝載地址的末地址(LOAD_ END為編譯偽指令,請見CCS的幫助文件);
LOAD_ START(_RamfuncsRunStart)令編譯器建立了一個變數RamfuncsRunStart,該變數指向段ramfuncs的執行地址的首地址(LOAD_ START為編譯偽指令,請見CCS的幫助文件);
從第1和2行可以看出,段ramfuncs中的函式DSP28x_usDelay()的裝載地址和執行地址是不同的,本程式中裝載在Flash的塊FLASHD中,而在SARAM L0中執行,這只是目標,實際執行時DSP並不會自動將Flash中的程式碼拷貝到SARAM中,因此需要手動新增程式碼來完成。
在C函式中,為了使用變數RamfuncsLoadStart、RamfuncsLoadEnd和RamfuncsRunStart,必須先宣告,本工程在檔案DSP2833x_GlobalPrototypes.h中做了如下宣告:
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
然後就可以使用了。在Main.c中,使用MemCopy()函式將段ramfuncs中的函式DSP28x_usDelay()的程式碼從裝載地址RamfuncsLoadStart—RamfuncsLoadEnd拷貝到RamfuncsRunStart開始的SARAM空間中。之後在程式執行時,只要呼叫DSP28x_usDelay()函式,都會自動地指向SARAM中相應的函式入口地址,這一點是自動完成的。MemCopy()函式原型在MemCopy.c中,DSP2833x_GlobalPrototypes.h宣告。

7.如何將一個函式放到ram中執行?

參考TI公司標頭檔案中自帶InitFlash函式,這些函式會以CODE_SECTION申明。如:#pragma CODE_SECTION(InitFlash, "ramfuncs");