DSP的GEL文件介紹

gel文件中主要包含PLL, DDR的初始化,具體你可以打開gel文件看看。

 

在CCS環境下調試時,在load程序之前可以選擇運行gel文件,這樣在你的應用程序中就不需要再次進行PLL及DDR的初始化。

在CCS環境下也可以不用gel文件,此時需要在程序運行起來後在應用程序中初始化PLL及DDR等,但是需要注意的是由於DDR未被初始化,所以此時的代碼不能放在DDR。

在脫離CCS環境調試時,在加載程序前需要保證PLL及DDR初始化。

 

GEL文件中主要是對芯片的初始化。

注意:GEL文件在CCS啓動後常駐內存,在仿真器和目標系統上電的時候起到初始DSP的作用。在上電後再改變GEL文件將不會對DSP產生影響。

 

1、GEL文件的改變

使用CCS Setup工具,可以爲在系統配置中的每一個處理器指定一個啓動GEL文件。當CCS啓動時,GEL文件加載到PC機的內存中,如果定義了StartUp()函數則執行該函數。在CCS(V2.3或更早版本),主機和目標板的初始化工作都在Startup()函數中執行。但對於支持Connect/Disconnect的CCS,這樣的GEL文件有可能沒有正確執行,因爲CCS啓動時和目標處理器是斷開的。當Startup()函數試圖訪問目標處理器時會出錯。一個新的回調函數OnTargetConnect()來執行目標處理器的初始化工作。

2、GEL回調函數

(1)Startup()函數

如果指定的GEL文件中包含Startup()函數,當CCS啓動時執行Startup()函數。支持Connect/Disconnect的CCS啓動時,Startup()函數中不包括訪問目標處理器的代碼,目標處理器由回調函數OnTargetConnect()來初始化。

推薦:

建立基本的CCS內存映射關係(不需要訪問目標處理器);任何不需要訪問目標處理器的基本初始化。

不推薦:

Get_Reset()(該函數通過仿真器復位目標處理器);通過GEL_BreakPtAdd()設置斷點;GEL_TextOUT()和GET_OpenWindow(),因爲StartUp()執行時CCS的任何控制窗口還沒有打開。

不支持Connect/Disconnect的CCS GEL文件中的StartUp()函數:

StartUp()

{

setup_memory_map();

GEL_Reset();

init_emif();

}

支持Connect/Disconnect的CCS GEL文件中的StartUp()函數:

StartUp()

{

setup_memory_map();

}

(2)OnTargetConnect()函數

推薦:

絕對最小的系統初始化處理,保證CCS在目標處理器上處於一種可信賴的狀態。例如:禁止看門狗時鐘、DSP復位結束。

每一次和目標處理器建立連接時都調用OnTargetConnect()函數。

OnTargetConnect()

{

// place critical target initialization steps here

GEL_Reset();

init_emif();

}

對某些平臺,必須調用GEL_Reset()函數使得CCS處於一種“Good”狀態,可以通過測試來確定是否需要調用GEL_Reset()函數。應該儘可能的降低GEL startup functions複雜度——包括減少GEL_Reset()的調用。

(3)OnPreFileLoaded()函數

在加載program/symbol(.out)文件之前該回調函數執行。在該函數中執行另外的目標處理器初始化操作以保證程序可以加載和調試是一個好的選擇。

OnPreFileLoaded()

{

FlushCache();

IER = 0;

IFR = 0;

init_emif();

}

(4)OnReset() 函數

當目標處理器復位後該函數被調用。如果需要每次重新啓動程序,設計了軟復位,GEL_Restart()在此處調用。

OnReset(int nErrorCode)

{

init_emif();

}

(5)OnRestart() 函數

當程序復位時調用該函數。

 

OnRestart(int nErrorCode )

{

 

GEL_TextOut("Turn off cache segmentn");

*(int *)0x1848200 = 0;

*(int *)0x1848204 = 0;

*(int *)0x1848208 = 0;

*(int *)0x184820c = 0;

GEL_TextOut("Disable EDMA eventn"); */

*(int *)0x01A0FFA8 = 0;

*(int *)0x01A0FFB4 = 0;

*(int *)0x01A0FFB8 = 0XFFFFFFFF;

*(int *)0x01A0FFE8 = 0;

*(int *)0x01A0FFF4 = 0;

*(int *)0x01A0FFF8 = 0xFFFFFFFF;

IER = 0;

IFR = 0;

}

3、存儲器映射

CCS存儲器映射告訴調試器目標處理器的哪些存儲區域可以訪問哪些不能訪問。CCS存儲器映射一般在StartUp()函數種執行。

(1)GEL_MapAdd()函數

該函數添加一個存儲區域到存儲區映射中。

(2)GEL_MapOn()和GEL_MapOff()函數

可以調用GEL_MapOn() or GEL_MapOff()來打開或關閉存儲區映射。當存儲區映射關閉時,CCSStudio假定可以訪問所有的存儲區空間。

(3)GEL_MapReset()函數

GEL_MapReset()函數清除所有的存儲區映射。沒有存儲區映射時,缺省設置是所有的存儲區空間都不能訪問。

4、儘量避免使用GEL初始化

可以考慮在GEL文件中使用GEL_MapAdd()建立存儲區映射以准許CCS可以調試,但是不在GEL文件中執行外設設置例如:EMIF寄存器初始化、看門狗禁止。

因爲GEL語法和C兼容,inif_emif()函數可以在.c文件中實現,和應用程序鏈接在一起。但是要注意以下幾點:

使用“volatile”來保證變量不被優化。例如:

*(volatile int *)EMIFA_SDRAMTIM = 0x00000618;

在編譯調試過程中避免在GEL文件中進行外設設置,當到達了最終程序時,需要一個智能加載軟件從FLASH或主機加載程序對EMIF進行設置,然後通過(E)DMA或memcpy()拷貝程序/數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章