天天看點

RVDS和MDK嵌入式開發工具調試腳本編寫

最早使用的ARM開發工具是MDK 3.1,當時是為TI在DM335開發闆上移植.Net Micro Framework,由于該開發闆沒有ISP工具,是以要調試記憶體版本的TinyCLR程式,必須要預先初始化SDRAM,否則無法把程式Download到記憶體中去。幸好MDK開發工具提供了一些腳本示例,是以相對比較容易的編寫了一個初始化DM335 SDRAM的腳本,但是使用RVDS卻沒有這麼幸運。

後期考慮到開發需要,我這邊又配置了RVDS 4.0開發工具,由于一般用它調試ATMEL 的AT91的闆子,該闆子提供了ISP工具,是以調試時先打開該工具進行一遍SDRAM初始化,然後在用RVDS進行LoadImage調試,雖然有些麻煩,但也将就了。

最近在調試DM335上的wifi接口程式,奇怪的是用MDK編譯運作後,出現異常,并且單步跟蹤時,MDK工作老不正常。而同樣的程式用RVDS編譯後,下載下傳到開發闆運作,一切OK,是以我這邊隻好轉移到RVDS平台上進行開發調試了。

但是,這就出現了開頭提出的問題,沒有ISP工具,如何進行SDRAM初始化?

我同僚一直在用RVDS調試DM335,他的辦法是編寫了一個小的初始化SDRAM的程式,先用RVDS運作一遍,然後再加載實際要調試的程式。這不失為一種方法,但是我總覺得有些不友善,加上以前有寫MDK腳本的經驗,是以就希望在RVDS上編寫一個類似的腳本。

如果你在搜尋引擎搜尋“MDK腳本”關鍵字時,你會搜出很多相關文章,但是你搜尋“RVDS腳本”關鍵字時,卻沒有這麼幸運,沒有一篇文章相關介紹,是以最後沒有辦法,隻好到官方網站,檢視相關的技術文檔了。

官網腳本相關文檔的連結如下,想深入研究的朋友可以進入看一看。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0175k/Cihcbhaa.html

好了,入正題。一般寫調試腳本,無非就是聲明變量和函數,再就是對寄存器進行讀寫,然後下載下傳鏡像檔案,最後在設定一下PC指針,就可以進行調試了。是以下面就這幾個方面,比較一下MDK和RVDS腳本的異同(以DM335的調試腳本為例)。

一、變量聲明

1、  MDK

DEFINE LONG PSC;

DEFINE LONG SYSTEM;

PSC = 0x01C41000;

SYSTEM = 0x01C40000;           

2、  RVDS

      add long PSC = 0x01C41000

add long SYSTEM = 0x01C40000           

二、函數聲明

FUNC void psc_change_state(void)

{

   //…

}           

調用:

Clock_Setup();           
define /R void psc_change_state()

{

}

.           

注意:後面要有一個“.”

macro Clock_Setup()           

三、寄存器讀寫

//0 Ignore request if the state is already set as is

   if((_RDWORD(PSC+0x800+m_ID*4) & 0x1F) == m_State) return;

 

   //1 Wait for PTSTAT.GOSTAT to clear

    while(_RDWORD(PSC+0x128) & 0x1);

 

    //2 Set MDCTLx.NEXT to new state

     _WDWORD(PSC+0xA00+m_ID*4, _RDWORD(PSC+0xA00+m_ID*4) & 0xFFFFFFE0);  

_WDWORD(PSC+0xA00+m_ID*4,_RDWORD(PSC+0xA00+m_ID*4) | m_State);             
   //0 Ignore request if the state is already set as is

    if((*(long *)(PSC+0x800+m_ID*4) & 0x1F) == m_State) {  return; }

 

     //1 Wait for PTSTAT.GOSTAT to clear

  while(*(long *)(PSC+0x128) & 0x1);

         

    //2 Set MDCTLx.NEXT to new state

    *(long *)(PSC+0xA00+m_ID*4) &= 0xFFFFFFE0;

    *(long *)(PSC+0xA00+m_ID*4) |= m_State;           

四、鏡像調入

exec("LOAD C://MicroFramework//BuildOutput//ARM//MDK3.1//le//RAM//debug//DM335//bin//TinyCLR.axf INCREMENTAL");           
load/r 'C:/MF/client_v4_0_rtm/BuildOutput/ARM/RVDS4.0/le/RAM/debug/DM335/bin/tinyclr.axf'           

五、設定PC指針

PC = 0x80120000;

2、RVDS

@PC = 0x80120000;

六、腳本調用

1、  MDK(相關資料網上比較多,略)

方法一:直接在cmd視窗輸入:Run>inc c:/mf/bat/dm335.inc

方法二:通過【Tools】->【Include Commands from file】菜單調入腳本檔案,一旦運作過一次,該檔案就會在【Tools】->【Recent Commands Scripts】菜單中出現,以後調用便非常友善。