freeRTOS支持
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user