TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Part Number:TMS320F28388D

你好,

我目前使用28388D自制板并使用自建工程去实现M4核的Ethernet和EtherCAT功能,现目前已经实现了Ethernet和EtherCAT的正常通信,但有一个现象是,当我在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,就没这个问题了。

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

Yale Li:

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

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

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

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

,

TFTMing:

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

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

map文件内存分配

MEMORY CONFIGURATIONnameoriginlengthusedunusedattrfill
-------------------------------------------------------------------CMBANK0_RESETISR00200000000000080000000600000002RWIXCMBANK0_SECTOR00020000800003ff80000113800002ec0RWIXCMBANK0_SECTOR100204000000040000000000000004000RWIXCMBANK0_SECTOR200208000000040000000000000004000RWIXCMBANK0_SECTOR30020c000000040000000000000004000RWIXCMBANK0_SECTOR400210000000100000000c78800003878RWIXCMBANK0_SECTOR500220000000100000000000000010000RWIXCMBANK0_SECTOR600230000000100000000000000010000RWIXCMBANK0_SECTOR700240000000100000000000000010000RWIXCMBANK0_SECTOR800250000000100000000000000010000RWIXCMBANK0_SECTOR900260000000100000000000000010000RWIXCMBANK0_SECTOR1000270000000040000000000000004000RWIXCMBANK0_SECTOR1100274000000040000000000000004000RWIXCMBANK0_SECTOR1200278000000040000000000000004000RWIXCMBANK0_SECTOR130027c000000040000000000000004000RWIXC1RAM1fffc00000002000000013f800000c08RWIXC0RAM1fffe000000020000000015800001ea8RWIXBOOT_RSVD20000000000008000000000000000800RWIXS0RAM200008000000380000002140000016c0RWIXS123RAM200040000000aa000000991a000010e6RWIXS3RAM_PARA2000ea0000001600000015e000000020RWIXE0RAM20010000000040000000000000004000RWIXCPU1TOCMMSGRAM0200800000000080000000110000006f0RWIXCPU1TOCMMSGRAM120080800000008000000000000000800RWIXCMTOCPU1MSGRAM0200820000000080000000624000001dcRWIXCMTOCPU1MSGRAM120082800000008000000000000000800RWIXCPU2TOCMMSGRAM0200840000000080000000110000006f0RWIXCPU2TOCMMSGRAM120084800000008000000000000000800RWIXCMTOCPU2MSGRAM0200860000000080000000110000006f0RWIXCMTOCPU2MSGRAM120086800000008000000000000000800RWIXSEGMENT ALLOCATION MAPrun originload originlengthinit length attrs members
--------------------- ---------- ----------- ----- -------
00200000002000000000000600000006r-x00200000002000000000000600000006r-x .resetisr
0020016000200160000002a0000002a0r--0020016000200160000002a0000002a0r-- .const.1
002004000020040000000d4000000d40r--00200400002004000000014000000140r-- .vftable00200540002005400000084800000848r-- .const.200200d8800200d88000003b8000003b8r-- .cinit
00210000002100000000c7880000c788r-x00210000002100000000c7880000c788r-x .text
1fffc0001fffc000000013f800000000rw-1fffc0001fffc00000000a0000000000rw- .stack1fffca001fffca00000009f800000000rw- .data
1fffe000002000080000015800000158r-x1fffe000002000080000015800000158r-x .TI.ramfunc
20000800200008000000214000000000rw-20000800200008000000200000000000rw- .sysmem20002800200028000000014000000000rw- .vtable
20004000200040000000991a00000000rw-20004000200040000000991a00000000rw- .bss
2000ea002000ea00000015e000000000rw-2000ea002000ea00000015e000000000rw- LOCALRAMS3_PARA
20080000200800000000011000000000rw-20080000200800000000011000000000rw- MSGRAM_CPU1_TO_CM
20082000200820000000062400000624rw-20082000200820000000062400000624rw- MSGRAM_CM_TO_CPU1
20084000200840000000011000000000rw-20084000200840000000011000000000rw- MSGRAM_CPU2_TO_CM
20086000200860000000011000000000rw-20086000200860000000011000000000rw- MSGRAM_CM_TO_CPU2.stack01fffc00000000a00UNINITIALIZED1fffc00000000004rtsv7M4_T_le_eabi.lib : boot_cortex_m.c.obj (.stack)1fffc004000009fc--HOLE--.vtable02000280000000140UNINITIALIZED2000280000000140driverlib_cm.lib : interrupt.obj (.vtable).sysmem02000080000002000UNINITIALIZED2000080000000010rtsv7M4_T_le_eabi.lib : memory.c.obj (.sysmem)2000081000001ff0--HOLE--

,

Yale Li:

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

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

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

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

看起来PC指向了Boot ROM中。

,

TFTMing:

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

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

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

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

,

Yale Li:

我已经咨询了相关工程师:

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1281566/tms320f28388d-sometimes-pc-pointed-to-boot-rom-region-after-running-ethercat-and-ethernet-about-10-minutes

,

TFTMing:

好的,谢谢

,

Yale Li:

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

,

TFTMing:

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都无法正常工作。

,

Yale Li:

好的,我跟进过去了

,

TFTMing:

好的,感谢!

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

,

Yale Li:

一并跟进过去了

,

TFTMing:

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

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

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

,

Yale Li:

好的,我跟进过去了

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28388D: 在Debug时,M4核在运行时会出现程序跑飞
分享到: 更多 (0)