fix(vd960DBN): 修复 SocketSend 后重启 — RecvBuf 用错 + 栈溢出
root cause:
1. iot_mqtt_handle_sock_int 的 CONNECT 处理调了
WCHNET_ModifyRecvBuf(_iot_wchnet_buf), 覆盖了 WCHNET 原生的
SocketRecvBuf, 导致后续 SocketSend 时 DMA 访问非法内存 → hard fault
2. uint8_t tmp[RECE_BUF_LEN](1152B) 在中断栈上, 叠加调用链
可能撑爆 2KB 栈
fix:
1. net_srv.c WCHNET_HandleSockInt: 保留 SocketRecvBuf + KeepLive,
其余事件委托给 iot_mqtt_handle_sock_int
2. iot_mqtt_handle_sock_int: 移除 ModifyRecvBuf(已在 wrapper 处理)
3. tmp[1152] 改为 static (移到 BSS, 省 1152B 栈)
This commit is contained in:
@@ -581,11 +581,16 @@ uint8_t i;
|
||||
// IoT MQTT mode — delegate all socket events to iot_mqtt_srv
|
||||
// (2026-07-23 修复: 旧 mqtt_connect/mqtt_data_manage 与 IoT 栈抢 socket, 致双 CONNECT → broker 踢线 → 频繁 initialize)
|
||||
if (g_sub_code_enable.iot_enable) {
|
||||
#if KEEPLIVE_ENABLE
|
||||
if (intstat & SINT_STAT_CONNECT) {
|
||||
#if KEEPLIVE_ENABLE
|
||||
WCHNET_SocketSetKeepLive(socketid, ENABLE);
|
||||
}
|
||||
#endif
|
||||
WCHNET_ModifyRecvBuf(socketid, (uint32_t)SocketRecvBuf[socketid], RECE_BUF_LEN);
|
||||
PRINT("TCP Connect Success (MQTT IoT)\n");
|
||||
}
|
||||
if (intstat & SINT_STAT_DISCONNECT || intstat & SINT_STAT_TIM_OUT) {
|
||||
PRINT("TCP Disconnect/Timeout (MQTT IoT)\n");
|
||||
}
|
||||
iot_mqtt_handle_sock_int(socketid, intstat);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user