| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 网上商城 | 芯片价格参考 | 留言 | 论坛 | 网络协议 | 驱动设计 | 购买指南-HowtoBuy | 
您现在的位置: FPGA开发板&SOPC开发板-嵌入式控制研究室 >> ARM >> ARM进阶 >> 文章正文 用户登录 新用户注册
[组图]44B0 中断分析(二)         ★★★ 【字体:
44B0 中断分析(二)
作者:佚名    文章来源:互联网    点击数:    更新时间:2006-9-26

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值。
 
本人能力有限,不到之处,请大家谅解和指导!

文章录入:fengfeiyi    责任编辑:fengfeiyi 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    从Flash和SRAM中触发中断的过…
    S3C44B0 调试笔记-BIOS
    44B0 中断分析(一)
    44B0的初始化程序的理解
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)