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.

TMS320F28388D: 在Debug时,M4核在运行时会出现程序跑飞

Part Number: TMS320F28388D


你好,

我目前使用28388D自制板并使用自建工程去实现M4核的Ethernet和EtherCAT功能,现目前已经实现了EthernetEtherCAT的正常通信,但有一个现象是,当我在CCS中Debug时,执行网口和EtherCAT通信时,M4核在运行大概10分钟左右(时间不确定)后,会出现程序跑飞现象:Break at address "0x162e" with no debug information available, or outside of program code.

如果不使用EtherCAT通信时,程序长时间能正常运行,但当执行EtherCAT通信后,过一会就会程序跑飞。

我当前想法是不是因为stack内存不够或者其他内存不够导致的,但在编译过程没有出现相关提示,之前是有出现过stack空间不够的情况,但会在程序一开始运行时M4会进入了FaultISR,后面增加stack空间至0x200,就没这个问题了。

我目前还没法找到问题的原因,请工程师们给点指导意见

  • 会出现程序跑飞现象:Break at address "0x162e" with no debug information available, or outside of program code.

    有进行暂停等操作吗?程序会停止运行吗?方便截个图看一下吗?

    但当执行EtherCAT通信后,过一会就会程序跑飞。

    跑飞后PC指针指向哪里?程序停在哪里?

  • 就是暂停操作后,显示的Break at address "0x162e" with no debug information available, or outside of program code.

    每次跑飞pc指针都是在上图红框的地址上,有时候是0x162e或者是0x162c。

    map文件内存分配

    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      CMBANK0_RESETISR      00200000   00000008  00000006  00000002  RWIX
      CMBANK0_SECTOR0       00200008   00003ff8  00001138  00002ec0  RWIX
      CMBANK0_SECTOR1       00204000   00004000  00000000  00004000  RWIX
      CMBANK0_SECTOR2       00208000   00004000  00000000  00004000  RWIX
      CMBANK0_SECTOR3       0020c000   00004000  00000000  00004000  RWIX
      CMBANK0_SECTOR4       00210000   00010000  0000c788  00003878  RWIX
      CMBANK0_SECTOR5       00220000   00010000  00000000  00010000  RWIX
      CMBANK0_SECTOR6       00230000   00010000  00000000  00010000  RWIX
      CMBANK0_SECTOR7       00240000   00010000  00000000  00010000  RWIX
      CMBANK0_SECTOR8       00250000   00010000  00000000  00010000  RWIX
      CMBANK0_SECTOR9       00260000   00010000  00000000  00010000  RWIX
      CMBANK0_SECTOR10      00270000   00004000  00000000  00004000  RWIX
      CMBANK0_SECTOR11      00274000   00004000  00000000  00004000  RWIX
      CMBANK0_SECTOR12      00278000   00004000  00000000  00004000  RWIX
      CMBANK0_SECTOR13      0027c000   00004000  00000000  00004000  RWIX
      C1RAM                 1fffc000   00002000  000013f8  00000c08  RWIX
      C0RAM                 1fffe000   00002000  00000158  00001ea8  RWIX
      BOOT_RSVD             20000000   00000800  00000000  00000800  RWIX
      S0RAM                 20000800   00003800  00002140  000016c0  RWIX
      S123RAM               20004000   0000aa00  0000991a  000010e6  RWIX
      S3RAM_PARA            2000ea00   00001600  000015e0  00000020  RWIX
      E0RAM                 20010000   00004000  00000000  00004000  RWIX
      CPU1TOCMMSGRAM0       20080000   00000800  00000110  000006f0  RWIX
      CPU1TOCMMSGRAM1       20080800   00000800  00000000  00000800  RWIX
      CMTOCPU1MSGRAM0       20082000   00000800  00000624  000001dc  RWIX
      CMTOCPU1MSGRAM1       20082800   00000800  00000000  00000800  RWIX
      CPU2TOCMMSGRAM0       20084000   00000800  00000110  000006f0  RWIX
      CPU2TOCMMSGRAM1       20084800   00000800  00000000  00000800  RWIX
      CMTOCPU2MSGRAM0       20086000   00000800  00000110  000006f0  RWIX
      CMTOCPU2MSGRAM1       20086800   00000800  00000000  00000800  RWIX
    
    
    SEGMENT ALLOCATION MAP
    
    run origin  load origin   length   init length attrs members
    ----------  ----------- ---------- ----------- ----- -------
    00200000    00200000    00000006   00000006    r-x
      00200000    00200000    00000006   00000006    r-x .resetisr
    00200160    00200160    000002a0   000002a0    r--
      00200160    00200160    000002a0   000002a0    r-- .const.1
    00200400    00200400    00000d40   00000d40    r--
      00200400    00200400    00000140   00000140    r-- .vftable
      00200540    00200540    00000848   00000848    r-- .const.2
      00200d88    00200d88    000003b8   000003b8    r-- .cinit
    00210000    00210000    0000c788   0000c788    r-x
      00210000    00210000    0000c788   0000c788    r-x .text
    1fffc000    1fffc000    000013f8   00000000    rw-
      1fffc000    1fffc000    00000a00   00000000    rw- .stack
      1fffca00    1fffca00    000009f8   00000000    rw- .data
    1fffe000    00200008    00000158   00000158    r-x
      1fffe000    00200008    00000158   00000158    r-x .TI.ramfunc
    20000800    20000800    00002140   00000000    rw-
      20000800    20000800    00002000   00000000    rw- .sysmem
      20002800    20002800    00000140   00000000    rw- .vtable
    20004000    20004000    0000991a   00000000    rw-
      20004000    20004000    0000991a   00000000    rw- .bss
    2000ea00    2000ea00    000015e0   00000000    rw-
      2000ea00    2000ea00    000015e0   00000000    rw- LOCALRAMS3_PARA
    20080000    20080000    00000110   00000000    rw-
      20080000    20080000    00000110   00000000    rw- MSGRAM_CPU1_TO_CM
    20082000    20082000    00000624   00000624    rw-
      20082000    20082000    00000624   00000624    rw- MSGRAM_CM_TO_CPU1
    20084000    20084000    00000110   00000000    rw-
      20084000    20084000    00000110   00000000    rw- MSGRAM_CPU2_TO_CM
    20086000    20086000    00000110   00000000    rw-
      20086000    20086000    00000110   00000000    rw- MSGRAM_CM_TO_CPU2
      
      .stack     0    1fffc000    00000a00     UNINITIALIZED
                      1fffc000    00000004     rtsv7M4_T_le_eabi.lib : boot_cortex_m.c.obj (.stack)
                      1fffc004    000009fc     --HOLE--
    
    .vtable    0    20002800    00000140     UNINITIALIZED
                      20002800    00000140     driverlib_cm.lib : interrupt.obj (.vtable)
    
    .sysmem    0    20000800    00002000     UNINITIALIZED
                      20000800    00000010     rtsv7M4_T_le_eabi.lib : memory.c.obj (.sysmem)
                      20000810    00001ff0     --HOLE--

  • 就是暂停操作后,显示的Break at address "0x162e" with no debug information available, or outside of program code.

    暂停之前程序的运行正常吗?有尝试过再恢复运行吗?以及相应的现象?

    如果不使用EtherCAT通信时,程序长时间能正常运行,但当执行EtherCAT通信后,过一会就会程序跑飞。

    也就是说程序不暂停的话就不会跑飞?我这样理解正确吗?

    看起来PC指向了Boot ROM中。

  • 暂停之前程序的运行正常吗?有尝试过再恢复运行吗?以及相应的现象?

    暂停之前已经跑飞了,跑飞后以太网和EtherCAT都无法连接了,我在主函数while循环有一个计数器也不执行了,所以判断跑飞了,然后点暂停就停在0x162e地址上。

    也就是说程序不暂停的话就不会跑飞?我这样理解正确吗?

    不是的,是运行一段时间自动跑飞了,今天继续测又没有这种现象了,这种跑飞现象是偶发性的,有时候不使用EtherCAT通信,只有以太网通信也会出现。

  • 能否提供下工程的更多细节?

  • EtherCAT通信使用了cia402协议栈,在CM核使用了PDI中断和SYNC0中断进行数据传送,SYNC0中断触发CM到CPU1的IPC0中断,在CPU1的IPC0中断中会将EtherCAT的数据传给CPU1,且在这个IPC0中断中又触发了CPU1到CM的IPC0中断,并将CPU1数据传给CM,再通过PDI中断发送给主站。

    Ethernet通信使用的是UDP协议例程,开了两个端口号,在这两个端口号的接收中断回调函数中分别使用IPC1和IPC2与CPU1进行数据传送,在使用以太网通信过程中,两个接收中断周期分别为500ms和62.5us。

    在CCS的Debug模式下,三个核开始全速运行,自制板通过网线与电脑的调试界面进行以太网通信,此时代码正常运行,然后再通过网线与TwinCAT进行通信时,CM就跑飞了,此时以太网和EtherCAT都无法正常工作。

  • 好的,我跟进过去了

  • 好的,感谢!

    我想知道CCS是否有相关的工具或者方法能够定位CM代码是从哪跳转到地址0x162e

  • 一并跟进过去了

  • 你好,麻烦你帮我跟进一下。

    在最新的测试发现,即使我不使用ECAT和Enet通信,在CM中的while循环上原本进行了ESC寄存器读写操作,当我将其注释掉的时候,程序就不跑飞了,是随机发生的,所以我在想是否是因为堆栈空间不够导致的。

    我在查看手册发现可以通过-entry_hook来检查栈空间是否溢出,但不知道如何操作,能否指导一下该如何检查堆栈空间是否溢出?

  • 好的,我跟进过去了