44B0 中斷分析(二)

admin @ 2014-03-25 , reply:0

1.文件描述和準備
        本文將試圖講述44B0X處理器處理中斷的具體過程,如果讀者的中斷執行不正常,請確保 FLASH 中燒錄了立宇泰 ARMSys's BootLoader for Linux V1.2,同時ADS開發環境中的RO Base為0x0c0008000,RW Base為0xc5f0000。
本文採用的44BINIT.s的自敘為:
; *******************************************************
; * NAME    : 44BINIT.S          *
; * Version : 10.April.2000         *
; * Description:           *
; * C start up codes          *
; * Configure memory, Initialize ISR ,stacks     *
; * Initialize C-variables          *
; * Fill zeros into zero-initialized C-variables   *
; *******************************************************
 
本程序以系統的Timer0中斷為例,中斷初始化程序如下:
void initial_time0(void)
{
  rINTCON=0x5;        //Non-vectored,IRQ enable,FIQ disable
  rINTMOD=0x0;        //All=IRQ mode
  rINTMSK=~(BIT_TIMER0 | BIT_GLOBAL);
 
    pISR_TIMER0=(int)Timer_ISR;
 
  rTCFG0=0x000000ff;//定時器0預分頻值設置為255 MCLK=32M
  rTCFG1=0x00000004;//定時器0分割值設置為32
  //最小周期約250us
  rTCNTB0=400;//約10ms中斷周期
  rTCON=0x0000000a;//
  rTCON=0x00000009;//1001 自動重載,並啟動定時器0
  Uart_Printf("\nTimer0 interrupter initialized!");
}
 
中斷服務程序如下:
void __irq Timer_ISR(void)
{
  rI_ISPC=BIT_TIMER0;
  globalcnt++;
}
 
2.調試程序裝載后
AXD裝載AXF調試文件后,暫時不運行,PC指針指示在b ResetHandler處,用右鍵菜單中的Disassembly,可以看出初始地址實際上指示在0x0c008000,即ADS中設置的RO Base,表示程序即將從0x0c008000開始運行。 
 
 
  
 
3.非矢量模式下的執行過程
經過以上準備工作,單擊【運行】兩次后 Timer0 中斷髮生,通過事先設置好的斷點捕捉中斷,所有圖中的紅點即為運行前設置的斷點:
⑴PC->0x0c008000 轉到 PC->0x00000018 處,即轉到 Flash 中執行Bootloader的代碼 
 
⑵ PC->0x00000018 轉到 PC->0x0c000018處,即又跳回到SDRAM中
 
⑶ PC->0x0c000080處執行的是IsrIRQ中斷識別程序 
 
⑷ 識別程序段執行完后,轉到用戶的中斷服務程序Timer_ISR( )入口 
  
 
4.矢量模式下的執行過程
OPTION.s中有_IRQ_BASEADDRESS   EQU   0xc000000;
在44BINIT中有如下定義:
^ (_IRQ_BASEADDRESS+0x100)
……
HandleTIMER0  # 4
……
猜測地址HandleTIMER0=_IRQ_BASEADDRESS+0x134=0x0c000134,下面來看看猜想對不對。
改rINTCON=0x1進行矢量中斷過程的觀察,重新裝載程序,再單擊【運行】兩次后,Time0中斷產生:
⑴ Timer0 中斷產生,跳轉到中斷矢量地址 0x00000060,而不是跳轉到 IRQ中斷入口0x00000018,這就是非矢量中斷和矢量中斷的本質區別。 
 
⑵ 再跳轉到0x00000334,注意還是在Flash中,因此還得歸功於Bootloader 黑體所選程序是類似宏調用HandlerTIMER0 HANDLER HandleTIMER0 產生的代碼,由於這是在 Flash 中,所以不可能是調試時下載進去的。(不相信可以把44BINIT.s中的宏HandlerTIMER0  HANDLER HandleTIMER0註釋掉試試。) 
 
執行完0x00000348處的指令后,執行步驟⑶。
 
⑶ 好,Bootloader完成使命后,跳轉到用戶的Timer_ISR( ),入口地址為0x0c0087d4 
 
在44B.h中有定義
#define pISR_TIMER0  (*(unsigned *)(_IRQ_BASEADDRESS+0x134))//0x54)),可看出pISR_TIMER0和44B0INIT.h中定義的HandleTIMER0指向地址是一樣的,都指向0x0c000134。

下圖即pISR_TIMER0=(int)Timer_ISR;已經生效的明證。 
  
 
【心得】不管是何種中斷模式,如果中斷總是沒有執行,則可以在FLASH中的中斷分支表的相應項目上設置斷點,再然後靈活運用STEPIN、STEPOUT、STEP等控制程序流程,以觀察問題的根源。 在彙編級代碼中設置斷點,需要用到右鍵菜單中的【Set PC】,設置完后,不要忘記改回初始的PC值。
 
本人能力有限,不到之處,請大家諒解和指導!




[admin via 研發互助社區 ] 44B0 中斷分析(二)已經有1027次圍觀

http://cocdig.com/docs/show-post-42735.html