我的项目是使用一个带有LAN9303的自定义板。它的目的是,网络设置(IPS+DHCP ON/OFF +主机名)可以改变,并且它打算运行几个月,没有任何重新启动。它有一个按钮,它应该重置整个网络接口并将设置返回到工厂默认值。因此,我想重新初始化堆栈,甚至进行PHY的硬件重置。对于第一次启动,来自MHC的生成代码初始化堆栈,然后启动基于伯克利API的Web服务器。为了在按钮按下后进行完全重置,我使用这样的状态机:-FixSTyStest:If(TCPIPSHSTACKSTATUS()= =就绪)然后下一个状态。-准备好:如果我有一个按钮按下事件,然后是下一个状态。-WaITyByPro改变:在5秒之后的下一个状态。-STOPH-http:Server:去初始化HTTP服务器,它使用伯克利API。下一个状态。-DEVALILI
ti:IF(TCPIPSISTACKSTATUS()= =就绪),然后TCPIPSISTACKE DENEXPRARIALIZE()和下一个状态-PHYRESRESE:做一个硬件PHY重置。下一个状态。-初始化:TCPIPPSSTACKILIALIALIZE()。下一个状态。- WITITY初始化:IF(TCPIPSISTACKSTATUS()= =就绪)然后下一个状态。-STARTHOSTHTPXServer:初始化使用伯克利API的HTTP服务器。到就绪状态。这是迄今为止完美的工作。甚至重复。网络下降,再次出现(我可以看到堆栈中的调试消息),在此之后Web服务器再次工作。但是,有时TCPIPSISTACKDEDIALIALIZE()在消息“堆删除失败”时失败了!,它是在TCPIPpStaskKiStaskAd()中创建的。调试显示,从TCPIPpHeAPuxIn.c返回的TyTCPIPHeAPPDELTEET()正在返回TCPIPHSTACKHEAPAPRESURIN使用。它是这样做的,因为HDCPT和GT;HEAPSTART和HDCPT和GT HeAPUn单元是0,BthdCDCP-和GT HeAPHead和HDCPT-&G. HeAPHead & Gt;单位不是0。在此之后,NexTcPipStaskIpIrimalIZE()在“堆创建失败,类型:1”时失败。我不知道它何时发生以及为什么会发生。例如,重启可能工作超过20次,然后突然失败。而且很少在第一次尝试时失败。但是,如果你试图保持Web服务器忙,或者如果网络几乎每隔5秒重启一次,就更可能发生。你知道为什么这种方法有时会失败,尽管它通常起作用吗?我忘了停止/去初始化某事还是忘记等待某个状态?----PIC32 MZ2048 EFM144使用MiHealthV2.02.00 BMPLAB V3.55 XC32 V1.42TCPIP堆栈模块(配置MHC)在定制BOADLAN9303上:堆配置默认为MHC,并使用内部堆。只有一个较大的RAM大小(81920)被赋予,并且动态分配调试被打开。我的代码不积极地使用网络,只有Web服务器和协调模块自己使用它。
以上来自于百度翻译
以下为原文
My project is using a custom board with a LAN9303. It is intended that the network settings (IPs + DHCP on/off + hostname) can be changed and also it is intended to be running for months without any restart. It has a push button, which should reset the whole network interface and return the settings to factory default. Therefore, I want to reinitialize the stack, and even do a hardware reset of the PHY.
For the first start the generated code from MHC initializes the stack, and I start a Berkeley API based web server. For doing the full reset after a button press I am using a state machine like this:
-
FIRST_START: If (
TCPIP_STACK_Status() == READY) then next state.
-
READY: If I had a button press event, then next state.
-
WAIT_BEFORE_CHANGE: after 5 seconds next state.
-
STOP_HTTP_SERVER: Deinitialize the HTTP server, which uses the Berkeley API. Next state.
-
DEINITIALIZE: If (
TCPIP_STACK_Status() == READY) then
TCPIP_STACK_Deinitialize() and next state.
-
PHY_RESET: Do a hardware PHY reset. Next state.
-
INITIALIZE:
TCPIP_STACK_Initialize() with changed
TCPIP_HOSTS_CONFIGURATION. Next state.
-
WAIT_INITIALIZED: If (
TCPIP_STACK_Status() == READY) then next state.
-
START_HTTP_SERVER: Initialize the HTTP server, which uses the Berkeley API. Go to
READY state.
This works perfectly so far. Even repeatedly. Network goes down, and comes up again (I can see the debug messages from the stack) and after this the web server is working again.
However, sometimes the
TCPIP_STACK_Deinitialize() fails with the message
"Heap Delete fail!", which is created in
TCPIP_STACK_KillStack(). Debugging revealed that
_TCPIP_HEAP_Delete() from tcpip_heap_internal.c is returning
TCPIP_STACK_HEAP_RES_IN_USE. It is doing this because
hDcpt->_heapStart and
hDcpt->_heapUnits are 0, but
hDcpt->_heapHead and
hDcpt->_heapHead->units are not 0. After this, the next
TCPIP_STACK_Initialize() fails with
"Heap creation failed, type: 1".
I don't really know when and why it happens. E.g. the restart might work for more than 20 times and then suddenly fail. And very seldom it even fails on the first attempt. But it seems to occur more likely if you try to keep the web server busy or if you do the network restarts nearly every 5 seconds.
Do you have any idea, why this approach fails sometimes, although it usually seems to work?
Do I forget to stop/to deinitialize something or forget to wait for a certain state?
--------
PIC32MZ2048EFM144 on custom board
LAN9303 using MII
H
ARMony v2.02.00b
MPLAB v3.55
XC32 v1.42
TCPIP Stack modules (configured with MHC):
const TCPIP_STACK_MODULE_CONFIG TCPIP_STACK_MODULE_CONFIG_TBL [] =
{
{TCPIP_MODULE_IPV4, 0},
{TCPIP_MODULE_ICMP, 0}, // TCPIP_MODULE_ICMP
{TCPIP_MODULE_ARP, &tcpipARPInitData}, // TCPIP_MODULE_ARP
{TCPIP_MODULE_UDP, &tcpipUDPInitData}, // TCPIP_MODULE_UDP
{TCPIP_MODULE_TCP, &tcpipTCPInitData}, // TCPIP_MODULE_TCP
{TCPIP_MODULE_DHCP_CLIENT, &tcpipDHCPInitData}, // TCPIP_MODULE_DHCP_CLIENT
{TCPIP_MODULE_ANNOUNCE, &tcpipAnnounceInitData}, // TCPIP_MODULE_ANNOUNCE
{TCPIP_MODULE_DNS_CLIENT, &tcpipDNSClientInitData}, // TCPIP_MODULE_DNS_CLIENT
{TCPIP_MODULE_NBNS, &tcpipNBNSInitData}, // TCPIP_MODULE_NBNS
{TCPIP_MODULE_BERKELEY, &tcpipBerkeleyInitData}, // TCPIP_MODULE_BERKELEY
{ TCPIP_MODULE_MANAGER, &tcpipHeapConfig }, // TCPIP_MODULE_MANAGER
// MAC modules
{TCPIP_MODULE_MAC_PIC32INT, &tcpipMACPIC32INTInitData}, // TCPIP_MODULE_MAC_PIC32INT
};
Heap Configuration is default from MHC and using an internal heap. Only a larger RAM Size (81920) was given and Dynamic allocation Debug was turned on.
My code does not actively use the network, only the web server and the Harmony modules are using it on its own.