大家好,
我目前想在CM实现以太网UDP通信,参考Ti例程enet_lwip_udp,我自己新建了一个CM工程,把例程的原文件都移植到我建的工程里,并按照例程的包含路径都设置了一遍,然后编译进行调试,先运行CPU1然后运行CM,发现CM直接进入了FaultISR的死循环里,查看错误寄存器BUSFAULTFLG中的M4BUSFAULT位为1,M4BUSFAULTADDR值为0x1FFFBFFC,就是M4的总线错误,但是没法找到原因。我直接使用Ti例程enet_lwip_udp时能正常实现网口通信,不会出现这样的问题。
然后我使用断点进行准确排查,发现当程序运行到在ethernet.c文件中的函数Ethernet_InitConfig * Ethernet_initInterface( Ethernet_InitInterfaceConfig interfaceConfig )并执行(void)memset(&Ethernet_device_struct, 0, sizeof(Ethernet_Device));语句时,就会直接进入FaultISR死循环,因为我是直接移植的enet_lwip_udp例程代码,所以上述代码可以在例程中找到。
参考这篇问答,我将.stack空间增加到16k也无法解决,而且我也没有明白在.map文件怎么看出是stack内存溢出的,希望能帮忙解答一下
下面是我自建CM工程中的.map文件内容(由于公司内网,没法直接把文件发出来):
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
002001b0 002001b0 00000080 00000080 r--
002001b0 002001b0 00000080 00000080 r-- .cinit
00200400 00200400 00000140 00000140 r--
00200400 00200400 00000140 00000140 r-- .vftable
00210000 00210000 00005154 00005154 r-x
00210000 00210000 00005154 00005154 r-x .text
1fffc000 1fffc000 00000100 00000000 rw-
1fffc000 1fffc000 00000100 00000000 rw- .stack
1fffe000 00200130 0000007c 0000007c r-x
1fffe000 00200130 0000007c 0000007c r-x .TI.ramfunc
20000800 20000800 00000140 00000000 rw-
SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.resetisr
* 0 00200000 00000006
00200000 00000006 startup_ccs.obj (.resetisr:ResetISR)
.cinit 0 002001b0 00000080
002001b0 0000003c (.cinit..data.load) [load image, compression = lzss]
002001ec 0000000c (__TI_handler_table)
002001f8 00000008 (.cinit..bss.load) [load image, compression = zero_init]
00200200 00000008 (.cinit..vtable.load) [load image, compression = zero_init]
00200208 00000008 (.cinit.LOCALRAMS3_PARA.load) [load image, compression = zero_init]
00200210 00000020 (__TI_cinit_table)
.vftable 0 00200400 00000140
00200400 00000140 startup_ccs.obj (.vftable)
.vtable 0 20000800 00000140 UNINITIALIZED
20000800 00000140 interrupt.obj (.vtable)
.stack 0 1fffc000 00000100 UNINITIALIZED
1fffc000 00000004 rtsv7M4_T_le_v4SPD16_eabi.lib : boot_cortex_m.c.obj (.stack)
1fffc004 000000fc --HOLE--
17:35
然后对比enet_lwip_udp例程中的map文件
.stack 0 1fffc000 00000800 UNINITIALIZED
1fffc000 00000004 rtsv7M4_T_le_eabi.lib : boot_cortex_m.c.obj (.stack)
1fffc004 000007fc --HOLE--
发现我的.stack只有100h,而例程的有800h长度,不知道是不是这里出现了问题,希望能帮忙解答一下。