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:
感谢分享!