[讨论] 程序烧写进flash后不能响应中断

liuzhengbing   2007-6-12 07:33 楼主


我在用5509作开发。接着仿真器调试程序时,可以响应中断。但是如果把程序烧写进flash后,主程序可以正常运行,就是不能响应中断。我用了外部中断0和1。下面是我主程序初始化和中断设定部分:

extern Uint32 myvec;
interrupt void myIsrInt0();
interrupt void myIsrInt1();
.
.
.

void main( )
{                       
    /*初始化CSL库*/       
    CSL_init();
    /*EMIF为全EMIF接口*/
    CHIP_RSET(XBSR,0x0a01);
    /*设置系统的运行速度为144MHz*/
    PLL_config(&myConfig);
    /*初始化DSP的EMIF*/
    EMIF_config(&emiffig);

    IRQ_globalDisable();
    IRQ_setVecs((Uint32)(&myvec));
    IRQ_plug(IRQ_EVT_INT0,&myIsrInt0);
    IRQ_clear(IRQ_EVT_INT0);
    IRQ_plug(IRQ_EVT_INT1,&myIsrInt1);
    IRQ_clear(IRQ_EVT_INT1);
    .
    .
    .
}
下面是中断向量表。这是我从TI例子中找的,稍微改了一下。
    .def    _myvec
    .sect   \".vectors\"
    .ref    _c_int00
    .ref    _myIsrInt0
    .ref    _myIsrInt1
    .def    no_isr
            .vli_off


;**********************************************************************************
;        .sect \"vecTable\"
;**********************************************************************************
_myvec:

RST:            .ivec _c_int00,  USE_RETA

NMI:            .ivec no_isr            ; SINT1

INT0:           .ivec _myIsrInt0      ; SINT2

INT2:           .ivec no_isr         ; SINT3
        
TINT0:  .ivec no_isr            ; SINT4

RINT0:  .ivec no_isr            ; SINT5

RINT1:  .ivec no_isr            ; SINT6

XINT1:  .ivec no_isr            ; SINT7

SINT8:  .ivec no_isr            ; SINT8

DMAC1:  .ivec no_isr            ; SINT9

DSPINT: .ivec no_isr            ; SINT10

INT3:   .ivec no_isr            ; SINT11

RINT2:  .ivec no_isr            ; SINT12

XINT2:  .ivec no_isr            ; SINT13

DMAC4:  .ivec no_isr            ; SINT14

DMAC5:  .ivec no_isr            ; SINT15

INT1:   .ivec _myIsrInt1          ; SINT16

XINT0:  .ivec no_isr            ; SINT17

DMAC0:  .ivec no_isr            ; SINT18

INT4:   .ivec no_isr            ; SINT19

DMAC2:  .ivec no_isr            ; SINT20

DMAC3:  .ivec no_isr            ; SINT21

TINT1:  .ivec no_isr            ; SINT22

INT5:   .ivec no_isr            ; SINT23

BERR:   .ivec no_isr            ; SINT24

DLOG:   .ivec no_isr            ; SINT25

RTOS:   .ivec no_isr            ; SINT26

SINT27: .ivec no_isr            ; SINT27

SINT28: .ivec no_isr            ; SINT28

SINT29: .ivec no_isr            ; SINT29

SINT30: .ivec no_isr            ; SINT30

SINT31: .ivec no_isr            ; SINT31

        .vli_on

        .text

no_isr:   B   no_isr

cmd文件也是从TI例子中找的,稍微改动了一下。
-stack 0x400
-sysstack 0x400

-priority
-llnkrtdx.a55l
-ldrivers.a55l         /* device drivers support */
-lcsl5509x.lib
-lrts55x.lib           /* C and C++ run-time library support */
-lclki.a55l
-lrts55.lib


MEMORY
{
    PAGE 0:

        MMR     : origin = 0000000h, length = 00000c0h
        SPRAM   : origin = 00000c0h, length = 0000040h
        VECS    : origin = 0000100h, length = 0000100h
        DARAM0  : origin = 0000200h, length = 000600h
        DARAM1  : origin = 0000800h, length = 0001800h
        DARAM2  : origin = 0002000h, length = 000e000h

        SARAM0  : origin = 0010000h, length = 0005000h
        SARAM1  : origin = 0015000h, length = 0004000h
        SARAM2  : origin = 0019000h, length = 0003000h
        SARAM3  : origin = 001c000h, length = 0004000h
        SARAM4  : origin = 0020000h, length = 0004000h
        SARAM5  : origin = 0024000h, length = 0004000h
        SARAM6  : origin = 0028000h, length = 0004000h
        SARAM7  : origin = 002c000h, length = 0004000h
        SARAM8  : origin = 0030000h, length = 0004000h
        SARAM9  : origin = 0034000h, length = 0004000h
        SARAM10 : origin = 0038000h, length = 0004000h
        SARAM11 : origin = 003c000h, length = 0004000h
        SARAM12 : origin = 0040000h, length = 0004000h
        SARAM13 : origin = 0044000h, length = 0004000h
        SARAM14 : origin = 0048000h, length = 0004000h
        SARAM15 : origin = 004c000h, length = 0004000h

        CE0     : origin = 0050000h, length = 03b0000h
        CE1     : origin = 0400000h, length = 0400000h
        CE2     : origin = 0800000h, length = 0400000h
        CE3     : origin = 0c00000h, length = 03f8000h

        PDROM   : origin = 0ff8000h, length = 07f00h
    /*  VECS    : origin = 0ffff00h, length = 00100h */ /* reset vector */
}      


SECTIONS
{
        .vectors  : {} > VECS  PAGE 0        /* interrupt vector table */
        .cinit   : {} > SARAM0 PAGE 0
        .text    : {} > SARAM1 PAGE 0

        .stack   : {} > DARAM1 PAGE 0
        .sysstack: {} > DARAM1 PAGE 0
        .sysmem  : {} > DARAM2 PAGE 0
        .cio     : {} > DARAM2 PAGE 0
        .data    : {} > DARAM2 PAGE 0
        .bss     : {} > DARAM2 PAGE 0
        .const   : {} > DARAM2 PAGE 0

        .csldata:  {} > DARAM1   PAGE 0
        /*dmaMem:   {} > DARAM0 PAGE 0*/
}

请高手指点一下,是不是还要设定其他的东西,或者哪里写得有问题,谢谢!! 本帖最后由 dontium 于 2015-1-23 13:24 编辑

回复评论 (14)



请问ivpd寄存器应该怎么初始化呀,就是说具体应该怎么写这个语句。文档不是说上电后自动初始化为0xffff么。谢谢
本帖最后由 dontium 于 2015-1-23 13:24 编辑
点赞  2007-6-14 00:48
带着仿真器运行时,上电后我看到寄存器ivpd里面的值是0xffff,
等执行到这句话   IRQ_setVecs((Uint32)(&myvec));  后
ivpd的值就变成了0x0001了,那是不是说明这句话就已经设定了ivpd的值了,不需要再设定了。
点赞  2007-6-14 01:49
>>但是如果把程序烧写进flash后,主程序可以正常运行,就是不能响应中断。
这句话不太明白,你是直接在flash上运行程序,还是做了一个bootloader把flash中的程序载入到DSP内部运行?
点赞  2007-6-14 02:33
我是把程序烧进flash后,脱离仿真器,上电让dsp自己运行。我觉得应该是 boot后dsp自动把flash中的程序载入到DSP内部运行。
点赞  2007-6-14 03:27
你烧进flash的数据是如何生成的?
5509 DSP有好多种启动方式,不知道你选择的是哪一种,

2.3.1 Direct Execution From External Asynchronous Memory

2.3.2 Parallel EMIF Boot Mode
点赞  2007-6-14 04:34
我使用的是 parallel emif boot(16-bit asynchronous memory) 模式 的启动方式
下面是我的将.out文件转化为.hex文件的cmd文档的内容
-boot
-v5510:2
-parallel16
-e _c_int00
-a
-map wavelet.map
-o wavelet.hex
-memwidth 16
-romwidth 16
-datawidth 16
wavelet.out
我以前烧写过小的程序,里面是没有中断的,脱离仿真器运行也是没有问题的。我就是用的上面所写的cmd文档,将.out文件转化为.hex文件。
点赞  2007-6-15 01:25
这样做BOOT应该没有问题。
那只能查查为什么不能响应中断了。
首先看看BOOT之后,VECS    : origin = 0000100h, length = 0000100h,这段地址里面是否是正确的中断向量表。IPVD 寄存器的值是否正确。
点赞  2007-6-15 04:24
我看了一下觉得
VECS    : origin = 0000100h, length = 0000100h,这段地址里面的中断向量表
是没有问题的,对应的中断服务程序的入口地址都是对的。
在带着仿真器运行时 ivpd的值为0x0001,不知道这个是不是对的。
点赞  2007-6-15 08:51
把仿真器连上,但是不load out文件,选择debug->reset CPU。这是CPU处于reset状态,察看PC寄存器地址应该在0xff8000,选择file->load symbols->load symbols only,然后选择out文件,这样只载入符号定义,便于调试,然后按F5开始运行,若提示没有加载程序,也不理它,直接运行,这样就会从flash中加载程序。可以通过设置硬件断点于入口地址,这样你就可以单步调试从flash启动之后的程序,看看一切是否和直接load一样。
点赞  2007-6-15 09:29
我按照你说的方法试了,没看到两者的程序有什么不同呀。
点赞  2007-6-16 03:35
按照上述方法可以直接调试从flash复制到内部内存后的程序。你说从flash启动之后不能响应中断,因此得找出不能响应中断的原因。在程序执行之后,检查IVPD, IFR, IER, INTM等中断相关的寄存器,检查中断向量表是否设置正确。
点赞  2007-6-16 04:16
我用你说的方法又检查了一下,发现IFR0的值是不同的,load programm时显示0x0004
load symbols only时,复位后显示0x0004,进入主程序后显示是0x0000,就不再改变了。这样该怎么办???
点赞  2007-6-19 03:57
如果产生了中断请求,则IFR相应bit会变为1,由于从flash启动之后,IFR始终为0,这说明没有中断请求。你能说明一下你是如何触发中断的么。
点赞  2007-6-19 06:56
谢谢大家的帮忙,你提供的方法很有效。我的问题已经解决了。把这几句话
   IRQ_plug(IRQ_EVT_INT0,&myIsrInt0);
    IRQ_clear(IRQ_EVT_INT0);
    IRQ_plug(IRQ_EVT_INT1,&myIsrInt1);
    IRQ_clear(IRQ_EVT_INT1);
删了就好了,我觉得可能是和中断相量表的设定冲突了。
点赞  2007-6-20 01:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复