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.

求救,DSP28335进入ILLEGAL_ISR了,如何找到问题?

TI工程你好:

我的DSP28335程序运行一段时间进入了ILLEGAL_ISR ,查找了很久没有找到原因。

(1)进入ILLEGAL_ISR的原因有哪一些?

(2)在原有程序增加点灯的代码,程序就不会进入ILLEGAL_ISR 了,增加点灯的代码影响了什么?

(3)在线仿真进入ILLEGAL_ISR后,如何定位到哪一行代码出问题?(CPU寄存器的值可以知道)

CPU寄存器的值如下:

ACC 0 XAR2 0000C39E XAR7 0000C3DE DP 309
P 0 XAR3 0000C3A0 PC 33BD4D SP 043C
XT 0000C35E XAR4 0000C35E RPC 33A7D8 IER 985
XAR0 0000C41E XAR5 0000C31E ST0 00D0 IFR 804
XAR1 0000C33E XAR6 0000C3BE ST1 CA1B DBGIER 0

  • 您可以参考帖子:e2echina.ti.com/.../12826
    如果有问题可以继续讨论。
  • 感谢大神的回复:
    我的问题比较复杂:(FLASH中运行,版本CC3.3,win7 64位)
    (1)堆栈溢出方便,我把RAM0和RAM1合并当做.stack使用还是跳到ILLEGAL_ISR中,应该不是堆栈不够。
    (2)之前的版本都能正常运行,增加了一段温度采集代码后才出现跳到ILLEGAL_ISR,温度采集代码在程序中没有运行。增加简单点灯也打破某种平衡,程序就不会进入ILLEGAL_ISR 了,增加点灯的代码影响了什么?
    (3)你帮我看看CMD是否有问题?(数据和程序空间我在使用时有互换)
    具体如下:

    MEMORY
    {
    PAGE 0: /* Program Memory */
    /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */

    ZONE0 : origin = 0x004000, length = 0x001000 /* XINTF zone 0 */
    RAML0 : origin = 0x008000, length = 0x002000 /* on-chip RAM block L0 */
    RAML1 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L1 */
    RAML2 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L2 */
    //RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */
    ZONE6 : origin = 0x0100000, length = 0x100000 /* XINTF zone 6 */
    ZONE7A : origin = 0x0200000, length = 0x00FC00 /* XINTF zone 7 - program space */
    FLASHH : origin = 0x300000, length = 0x008000 /* on-chip FLASH */
    FLASHG : origin = 0x308000, length = 0x008000 /* on-chip FLASH */
    FLASHF : origin = 0x310000, length = 0x008000 /* on-chip FLASH */
    FLASHE : origin = 0x318000, length = 0x008000 /* on-chip FLASH */
    FLASHD : origin = 0x320000, length = 0x008000 /* on-chip FLASH */
    FLASHC : origin = 0x328000, length = 0x008000 /* on-chip FLASH */
    FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */
    FLASHA : origin = 0x338000, length = 0x007F80 /* on-chip FLASH */
    CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
    BEGIN : origin = 0x33FFF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */
    CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */
    OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */
    ADC_CAL : origin = 0x380080, length = 0x000009 /* ADC_cal function in Reserved memory */

    IQTABLES : origin = 0x3FE000, length = 0x000b50 /* IQ Math Tables in Boot ROM */
    IQTABLES2 : origin = 0x3FEB50, length = 0x00008c /* IQ Math Tables in Boot ROM */
    FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 /* FPU Tables in Boot ROM */
    ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */
    RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */
    VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */

    PAGE 1 : /* Data Memory */
    /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
    /* Registers remain on PAGE1 */

    BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */
    RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */
    RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
    /*RAML4 : origin = 0x00C000, length = 0x001000*/ /* on-chip RAM block L1 */
    RAML3L4 : origin = 0x00B000, length = 0x002000 /* on-chip RAM block L1 */ /*mohq Combining L3L4*/
    RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
    RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
    RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */
    ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */
    //FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */
    }

    /* Allocate sections to memory blocks.
    Note:
    codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code
    execution when booting to flash
    ramfuncs user defined section to store functions that will be copied from Flash into RAM
    */

    SECTIONS
    {

    /* Allocate program areas: */
    .USER_CODG : > FLASHG PAGE = 0
    .cinit : > FLASHA PAGE = 0
    .pinit : > FLASHA, PAGE = 0
    .text : > FLASHA PAGE = 0
    codestart : > BEGIN PAGE = 0
    ramfuncs : LOAD = FLASHD,
    RUN = RAML0,
    LOAD_START(_RamfuncsLoadStart),
    LOAD_END(_RamfuncsLoadEnd),
    RUN_START(_RamfuncsRunStart),
    PAGE = 0

    csmpasswds : > CSM_PWL PAGE = 0
    csm_rsvd : > CSM_RSVD PAGE = 0

    /* Allocate uninitalized data sections: */
    .stack : > RAMM1 PAGE = 1
    .ebss : > RAML3L4 PAGE = 1
    .esysmem : > RAMM1 PAGE = 1

    /* Initalized sections go in Flash */
    /* For SDFlash to program these, they must be allocated to page 0 */
    .econst : > FLASHA PAGE = 0
    .switch : > FLASHA PAGE = 0

    /* Allocate IQ math areas: */
    IQmath : > FLASHC PAGE = 0 /* Math Code */
    IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD

    /* Uncomment the section below if calling the IQNexp() or IQexp()
    functions from the IQMath.lib library in order to utilize the
    relevant IQ Math table in Boot ROM (This saves space and Boot ROM
    is 1 wait-state). If this section is not uncommented, IQmathTables2
    will be loaded into other memory (SARAM, Flash, etc.) and will take
    up space, but 0 wait-state is possible.
    */
    /*
    IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
    {

    IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)

    }
    */

    FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD

    /* Allocate DMA-accessible RAM sections: */
    DMARAML4 : > RAML3L4, PAGE = 1
    DMARAML5 : > RAML5, PAGE = 1
    DMARAML6 : > RAML6, PAGE = 1
    DMARAML7 : > RAML7, PAGE = 1

    /* Allocate 0x400 of XINTF Zone 7 to storing data */
    ZONE7DATA : > ZONE7B, PAGE = 1

    /* .reset is a standard section used by the compiler. It contains the */
    /* the address of the start of _c_int00 for C Code. /*
    /* When using the boot ROM this section and the CPU vector */
    /* table is not needed. Thus the default type is set here to */
    /* DSECT */
    .reset : > RESET, PAGE = 0, TYPE = DSECT
    vectors : > VECTORS PAGE = 0, TYPE = DSECT

    /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
    .adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD

    }
  • 检查下您在使用温度采集时是够调用的DELAY_US()函数,该函数需要运行在RAM.
  • 感谢回复,我的温度采集函数没有使用DELAY_US(),程序查表法测算温度,用了浮点变量的简单加减乘除。
  • 你可以在仿真模式下,看看仿真器的窗口中,Illegal_ISR从什么地方进去
  • 你好,能否指导下怎么看ILLEGAL_ISR从什么地方进去的?看CPU寄存器吗?