修复了网络参数的保存逻辑
This commit is contained in:
@@ -27,6 +27,7 @@ extern osEventFlagsId_t sys_evtHandle;
|
||||
#define SYS_EVT_STORAGE_READY (1u << 1) /* defaultTask:FTL/FatFS 挂载完成 */
|
||||
#define SYS_EVT_FTP_READY (1u << 2) /* ftpTask:lftpd_start 完成 */
|
||||
#define SYS_EVT_TIMESYNC_READY (1u << 3) /* timeSyncTask:首次时间同步完成 */
|
||||
#define SYS_EVT_NET_RECONFIG (1u << 4) /* UI:请求立即应用新网口配置(netTask 消费后重建网络) */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -24,6 +24,20 @@
|
||||
#define DBG_TAG "[NET_TASK]"
|
||||
#include "dbg_log.h"
|
||||
|
||||
/*
|
||||
* 函数功能:"立即应用网口配置"平台回调(注册给 net_cfg)
|
||||
* 入口参数:无
|
||||
* 返回值:无
|
||||
* 限定条件:UI 保存成功后经 net_cfg_request_apply() 调用(任意任务上下文)
|
||||
* 函数说明:只置事件位;真正的重建在主循环内完成(CH395F SPI 归 netTask 独占,
|
||||
* UI 不得直接操作)
|
||||
*/
|
||||
static void net_reconfig_request_cb(void) {
|
||||
if (sys_evtHandle != NULL) {
|
||||
(void)osEventFlagsSet(sys_evtHandle, SYS_EVT_NET_RECONFIG);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:CH395F 协议栈一次性初始化(两种构建模式共用)
|
||||
* 入口参数:无
|
||||
@@ -96,6 +110,10 @@ int net_stack_bring_up(void) {
|
||||
(phy == CH395F_PHY_10M_HALF) ? "10M HALF" :
|
||||
(phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN");
|
||||
|
||||
/* 网络已重建完成、对外可用:递增代次号,通知各 TCP 服务(FTP/对时/远程显示)
|
||||
* 旧 Socket 已随芯片复位失效、应重建监听 */
|
||||
net_generation_inc();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -142,10 +160,26 @@ void net_task_func(void const *arg) {
|
||||
osEventFlagsSet(sys_evtHandle, SYS_EVT_NET_READY);
|
||||
}
|
||||
|
||||
/* 注册"立即应用网口配置"回调:UI 保存成功后经 net_cfg_request_apply() 触发 */
|
||||
net_cfg_set_apply_cb(net_reconfig_request_cb);
|
||||
|
||||
DBG_INFO("netTask: started (single-socket mode)");
|
||||
|
||||
/* ==================== 主轮询循环 ==================== */
|
||||
for (;;) {
|
||||
/* UI 保存网口配置后请求立即应用:在此重建网络(新 IP/掩码/网关/MAC)。
|
||||
* 重建完成后代次号已递增,各 TCP 服务据此重建监听;期间连接会断开(预期)。 */
|
||||
if (sys_evtHandle != NULL
|
||||
&& (osEventFlagsGet(sys_evtHandle) & SYS_EVT_NET_RECONFIG) != 0u) {
|
||||
(void)osEventFlagsClear(sys_evtHandle, SYS_EVT_NET_RECONFIG);
|
||||
DBG_INFO("netTask: apply new net config (re-init)");
|
||||
if (net_stack_bring_up() == 0) {
|
||||
(void)osEventFlagsSet(sys_evtHandle, SYS_EVT_NET_READY);
|
||||
} else {
|
||||
DBG_ERROR("netTask: re-init FAIL");
|
||||
}
|
||||
}
|
||||
|
||||
net_poll();
|
||||
net_process_messages();
|
||||
osDelay(1);
|
||||
|
||||
@@ -114,6 +114,9 @@ void time_sync_task(void *argument) {
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
/* 记录本次监听对应的网络代次;代次变化(网络重建)则放弃旧监听重建 */
|
||||
uint32_t gen = net_get_generation();
|
||||
|
||||
int ls = time_sync_open_listener();
|
||||
if (ls < 0) {
|
||||
DBG_ERROR("time_sync: open listener FAIL, retry later");
|
||||
@@ -126,10 +129,19 @@ void time_sync_task(void *argument) {
|
||||
do {
|
||||
conn = net_accept(ls, NULL, NULL);
|
||||
if (conn < 0) {
|
||||
if (net_get_generation() != gen) {
|
||||
net_close(ls); /* 网络重建:旧监听失效,回外层重建 */
|
||||
break;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(200));
|
||||
}
|
||||
} while (conn < 0);
|
||||
|
||||
if (conn < 0) {
|
||||
DBG_INFO("time_sync: network re-init, relisten");
|
||||
continue;
|
||||
}
|
||||
|
||||
time_sync_handle_conn(conn);
|
||||
/* conn(单连接模式下即 ls)已被 net_close 释放,下次循环重建监听 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user