freeRTOS支持

This commit is contained in:
2026-07-19 13:09:06 +08:00
parent 4eb728583b
commit 9ed4c22022
63 changed files with 45898 additions and 507 deletions

View File

@@ -160,6 +160,24 @@ int net_poll(void)
break;
}
/* 诊断:每 3 秒打印一次全局中断状态位和 Socket 状态
* 注意:不要在此处读取 per-socket 中断状态ch395f_get_sock_int_status
* 会清除中断标志),避免破坏后续正常处理流程 */
static uint32_t s_last_diag = 0;
uint32_t now_diag = HAL_GetTick();
if ((now_diag - s_last_diag >= 3000) || s_last_diag == 0)
{
s_last_diag = now_diag;
uint16_t cur_int = ch395f_get_glob_int_status_all();
DBG_INFO("GINT=0x%04X", cur_int);
for (int di = 0; di < NET_MAX_SOCKETS; di++)
{
DBG_INFO(" s%d: in_use=%d state=%d rl=%d",
di, g_net_socks[di].in_use, g_net_socks[di].state,
g_net_socks[di].state == NET_SOCK_STATE_ESTABLISHED ? ch395f_get_recv_len((uint8_t)di) : 0);
}
}
if (int_status & CH395F_GINT_STAT_PHY_CHANGE)
{
uint8_t phy = ch395f_get_phy_status();
@@ -396,7 +414,23 @@ int net_listen(int sockfd, int backlog)
return -1;
}
/* 配置 CH395F Socket */
/* 多连接模式:先为数据 Socket 设置协议类型、源端口和独立缓冲区块
* 必须在监听话筒 Socket OPEN+LISTEN 之前配置,确保 CH395F 的
* 自动分配机制能扫描到所有可用 Socket
* CH395F 根据源端口匹配、协议类型 TCP、状态 CLOSED 查找可用 Socket */
for (int ds = NET_TCP_SERVER_DATA_SOCK_START; ds < NET_MAX_SOCKETS; ds++)
{
uint8_t base = (uint8_t)(ds * 4);
ch395f_set_send_buf((uint8_t)ds, base, 2);
ch395f_set_recv_buf((uint8_t)ds, base + 2, 2);
/* 按 CH395F 手册 9.2.6 节顺序:先设源端口,再设协议类型 */
ch395f_set_sour_port((uint8_t)ds, sock->local_port);
ch395f_set_proto_type((uint8_t)ds, CH395F_PROTO_TYPE_TCP);
}
/* 最后配置监听 Socket 并启动监听 */
ch395f_set_send_buf((uint8_t)sockfd, 0, 2);
ch395f_set_recv_buf((uint8_t)sockfd, 2, 2);
ch395f_set_proto_type(sockfd, CH395F_PROTO_TYPE_TCP);
ch395f_set_sour_port(sockfd, sock->local_port);
status = ch395f_open_socket(sockfd);
@@ -410,20 +444,6 @@ int net_listen(int sockfd, int backlog)
/* 启动 TCP 监听 */
ch395f_tcp_listen(sockfd);
/* 多连接模式:为数据 Socket 设置协议类型和源端口(不 OPEN
* Socket 4-7 默认无收发缓冲,需在此分配
* CH395F 根据这些信息在客户端连接时自动分配空闲 Socket */
for (int ds = NET_TCP_SERVER_DATA_SOCK_START; ds < NET_MAX_SOCKETS; ds++)
{
if (ds >= 4)
{
ch395f_set_send_buf((uint8_t)ds, 28, 2);
ch395f_set_recv_buf((uint8_t)ds, 30, 2);
}
ch395f_set_proto_type((uint8_t)ds, CH395F_PROTO_TYPE_TCP);
ch395f_set_sour_port((uint8_t)ds, sock->local_port);
}
sock->state = NET_SOCK_STATE_LISTENING;
return 0;