TI中文支持网
TI专业的中文技术问题搜集分享网站

AM3352: 发生DMTIMER 中断时,CPU进入0x20094

Part Number:AM3352

    代码:参考stareware中的bootloader编写boot代码,相当于SPL阶段(CPU执行区域为0x402F0400+)。

             在代码中加入DMTimer,开启中断,发现cpu进入0x20094,同样的代码,编写在u-boot阶段,就是执行在0x80000000区域,则可以正常进入中断。

    从状态看,中断已经触发,像是没有找到相应的中断子程序,但是我已经注册过中断,在u-boot阶段可以正常使用也可以证明这一点, 目前不清楚原因为什么?

注册中断子程序通过数组  fnRAMVectors[];    参考stareware中的interrupt.c。

Nancy Wang:

请问目前IRQSTATUS是什么状态?是在中断函数处打断点就会异常吗?

,

MENGDONG FENG:

请问目前IRQSTATUS是什么状态? DMTIM的IRQSTATUS=2     是在中断函数处打断点就会异常吗?不是,我在中断函数内打断点,没有进入中断函数

,

Nancy Wang:

加大堆栈试一下。

,

MENGDONG FENG:

我试了下,还是不行,下面是我的.cmd文件,(注释是之前的设置)

/****************************************************************************///-stack 0x0008 /* SOFTWARE STACK SIZE */   注释//-heap 0x2000 /* HEAP AREA SIZE */     注释-stack 0x0FF8 /* SOFTWARE STACK SIZE */-heap 0x2000 /* HEAP AREA SIZE */-e Entry/* Since we used 'Entry' as the entry-point symbol the compiler issues a *//* warning (#10063-D: entry-point symbol other than "_c_int00" specified: *//* "Entry"). The CCS Version (5.1.0.08000) stops building from command *//* line when there is a warning. So this warning is suppressed with the *//* below flag. */

–diag_suppress=10063

/* SPECIFY THE SYSTEM MEMORY MAP */

MEMORY{ IRAM_MEM : org = 0x402F0400 len = 0x1FBFF /* RAM */}

/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */

SECTIONS{ .init : { bl_init.obj (.text) } load > 0x402F0400

.text : load > IRAM_MEM /* CODE */ .data : load > IRAM_MEM /* INITIALIZED GLOBAL AND STATIC VARIABLES. */ .bss : load > IRAM_MEM /* UNINITIALIZED OR ZERO INITIALIZED */ /* GLOBAL & STATIC VARIABLES. */ RUN_START(bss_start) RUN_END(bss_end) .const : load > IRAM_MEM /* GLOBAL CONSTANTS */ .cinit : load > IRAM_MEM // .stack : load > 0x4030FFF0 /* SOFTWARE SYSTEM STACK */  注释 .stack : load > 0x4030F000 /* SOFTWARE SYSTEM STACK */

}

,

MENGDONG FENG:

补偿一些信息,方便您进行判断,进入0x20094后的寄存器数值。  INTCPS->INTC_SIR_IRQ=0X45(69,DMTIMER3中断编号,数值正确), Core Registers->COSR=0X40000192,(ARM处于IRQ模式),IRQ_Registers中的SPSR_IRQ=0X40000011F,R13=0X4030EFE8,R14=0X402FEC38,这几个不清楚具体含义是什么,不过可以确定中断产生了,INTPC已经开始处理中断了,但是没有跳转到中断子程序,我看手册中的汇编,基本上走到跳转那一步了,跳转那步没怎么看懂….,但是在代码中就是在数组  fnRAMVectors[]中注册即可,目前也不理解为什么在数组中注册就行行了(感觉是一个普通数组  void (*fnRAMVectors[NUM_INTERRUPTS])(void);),不理解CPU是如何知道从这个数组中获取中断子程序的地址,所以我怀疑这个数组是不是还需要进行设定,从而让CPU知道从这个地方获取中断子程序地址,不过我在u-boot阶段使用的时候也没看到有什么设定的地方。  期待您的回复,如果需要,我可以提供联系方式,如果您需要源码,也请告知,必要时也可提供,谢谢!

,

Nancy Wang:

AM335X_StarterWare_02_00_01_01\system_config\armv7a\am335x\cgt\exceptionhandler.asm 有对中断向量表的处理。

感觉不像是中断配置的问题。

,

MENGDONG FENG:

感谢,问题已经找到,成功解决了,谢谢

,

Nancy Wang:

方便分享一下是哪里的问题吗?

,

MENGDONG FENG:

boot的.asm文件(bl_init.asm)是直接跳转到main,没有进行中断向量表的设定。默认的init.asm中是先设定中断向量表,然后进的main。然后,我对着改了一下bl_init.asm,问题就解决了。

,

Nancy Wang:

感谢分享!

赞(0)
未经允许不得转载:TI中文支持网 » AM3352: 发生DMTIMER 中断时,CPU进入0x20094
分享到: 更多 (0)