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.

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。

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

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

  • 加大堆栈试一下。

  • 我试了下,还是不行,下面是我的.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,问题就解决了。

  • 感谢分享!