This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
代码:参考stareware中的bootloader编写boot代码,相当于SPL阶段(CPU执行区域为0x402F0400+)。
在代码中加入DMTimer,开启中断,发现cpu进入0x20094,同样的代码,编写在u-boot阶段,就是执行在0x80000000区域,则可以正常进入中断。
从状态看,中断已经触发,像是没有找到相应的中断子程序,但是我已经注册过中断,在u-boot阶段可以正常使用也可以证明这一点, 目前不清楚原因为什么?
注册中断子程序通过数组 fnRAMVectors[]; 参考stareware中的interrupt.c。
我试了下,还是不行,下面是我的.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 */
}
补偿一些信息,方便您进行判断,进入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阶段使用的时候也没看到有什么设定的地方。 期待您的回复,如果需要,我可以提供联系方式,如果您需要源码,也请告知,必要时也可提供,谢谢!
AM335X_StarterWare_02_00_01_01\system_config\armv7a\am335x\cgt\exceptionhandler.asm 有对中断向量表的处理。
感觉不像是中断配置的问题。
boot的.asm文件(bl_init.asm)是直接跳转到main,没有进行中断向量表的设定。默认的init.asm中是先设定中断向量表,然后进的main。然后,我对着改了一下bl_init.asm,问题就解决了。