Trap21定案部分窗口重通告机制:N-7改非阻塞RX读强制排空至空,netcmd日志入库
This commit is contained in:
@@ -278,6 +278,23 @@ void net_generation_inc(void) {
|
||||
* 3. 处理连接/断开/数据接收/发送完成/超时等事件,更新 Socket 状态机
|
||||
* 4. RECV 中断为电平触发,每次 net_poll() 只处理一批中断,避免主循环饿死
|
||||
*/
|
||||
#if defined(NET_BENCH_CMD_LOG)
|
||||
/* Bench:芯片命令序列日志(2026-09-22 Trap 21 精确定位;netTask 上下文)。
|
||||
* 每个真实 SPI 命令点一行:tag=命令类别(P=poll全局中断 R=recv S=send C=close
|
||||
* A=accept L=listen N=connect U=relisten M=其他),fd=socket,t=FreeRTOS tick,
|
||||
* d=距上一条命令的 tick 间隔,x=结果/中断状态。台架专用,实验后回退。 */
|
||||
static uint32_t s_bench_prev_tick = 0U;
|
||||
static uint8_t s_bench_prev_valid = 0U;
|
||||
|
||||
static void net_bench_cmd_log(char tag, int sock, int detail) {
|
||||
uint32_t now = (uint32_t)xTaskGetTickCount();
|
||||
uint32_t delta = (s_bench_prev_valid != 0U) ? (now - s_bench_prev_tick) : 0U;
|
||||
s_bench_prev_tick = now;
|
||||
s_bench_prev_valid = 1U;
|
||||
DBG_INFO("netcmd: %c fd=%d t=%u d=%u x=%d", tag, sock, now, delta, detail);
|
||||
}
|
||||
#endif
|
||||
|
||||
int net_poll(void) {
|
||||
/* 本次轮询累计发生的事件数(连接/断开/接收/发送/超时各计 1) */
|
||||
int event_count = 0;
|
||||
@@ -310,6 +327,14 @@ int net_poll(void) {
|
||||
/* 读取全局中断状态(2 字节):读操作本身会清除 CH395F 中断并使其拉高 INT#,
|
||||
* 若此后仍有新中断,CH395F 会再次拉低 INT#,由下一次 net_poll() 处理 */
|
||||
int_status = ch395f_get_glob_int_status_all();
|
||||
#if defined(NET_BENCH_CMD_LOG)
|
||||
/* 仅状态跳变时记(电平型 RECV_OK 会每 poll 重复,全记会冲爆日志) */
|
||||
static uint16_t s_bench_last_glob = 0xFFFF;
|
||||
if (int_status != s_bench_last_glob) {
|
||||
s_bench_last_glob = (uint16_t)int_status;
|
||||
net_bench_cmd_log('P', -1, (int)int_status);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 无有效中断(读到的状态为 0),提前退出 */
|
||||
if (int_status == 0) {
|
||||
@@ -330,6 +355,14 @@ int net_poll(void) {
|
||||
|
||||
/* 读取该 Socket 的中断状态寄存器(SINT) */
|
||||
uint8_t sock_int = ch395f_get_sock_int_status(i);
|
||||
#if defined(NET_BENCH_CMD_LOG)
|
||||
static uint8_t s_bench_last_sint[NET_MAX_SOCKETS] = { 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF };
|
||||
if (sock_int != s_bench_last_sint[i]) {
|
||||
s_bench_last_sint[i] = sock_int;
|
||||
net_bench_cmd_log('p', i, (int)sock_int);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 连接建立事件:交给状态机处理(监听态/客户端/数据 Socket 分别处理) */
|
||||
if (sock_int & CH395F_SINT_STAT_CONNECT) {
|
||||
@@ -497,6 +530,18 @@ void net_process_messages(void) {
|
||||
break;
|
||||
}
|
||||
|
||||
#if defined(NET_BENCH_CMD_LOG)
|
||||
{
|
||||
char bench_tag = (msg.type == NET_MSG_RECV) ? 'R' :
|
||||
(msg.type == NET_MSG_SEND) ? 'S' :
|
||||
(msg.type == NET_MSG_CLOSE) ? 'C' :
|
||||
(msg.type == NET_MSG_ACCEPT) ? 'A' :
|
||||
(msg.type == NET_MSG_LISTEN) ? 'L' :
|
||||
(msg.type == NET_MSG_CONNECT) ? 'N' : 'M';
|
||||
net_bench_cmd_log(bench_tag, msg.sockfd, (int)msg.result);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* 结果回传:成功=字节数/描述符;失败=具体错误码(如 NET_ERR_WOULDBLOCK)。
|
||||
* 注意消息体按值拷入队列——调用方看不到 netTask 对 msg 的修改,结果只能搭
|
||||
* 通知值这趟车带回;**整个 32 位都是结果**(若压入序列号等高 16 位标签,
|
||||
@@ -2387,6 +2432,9 @@ static int alloc_socket(void) {
|
||||
* 3. 连接成功后使能 KeepAlive 并触发 NET_EVENT_CONNECTED 回调
|
||||
*/
|
||||
static void handle_connect_event(net_sock_t *p_sock) {
|
||||
#if defined(NET_BENCH_CMD_LOG)
|
||||
net_bench_cmd_log('a', (int)p_sock->ch395_sock, 0);
|
||||
#endif
|
||||
if (p_sock->state == NET_SOCK_STATE_LISTENING) {
|
||||
/* 单连接:收到 CONNECT 中断 = 自身有连接到达,转为 ESTABLISHED */
|
||||
DBG_INFO("sock%d standalone accept", p_sock->ch395_sock);
|
||||
@@ -2434,6 +2482,9 @@ static void handle_connect_event(net_sock_t *p_sock) {
|
||||
* 3. 触发 NET_EVENT_DISCONNECTED 回调
|
||||
*/
|
||||
static void handle_disconnect_event(net_sock_t *p_sock) {
|
||||
#if defined(NET_BENCH_CMD_LOG)
|
||||
net_bench_cmd_log('d', (int)p_sock->ch395_sock, 0);
|
||||
#endif
|
||||
int sockfd = (int)(p_sock - s_net_socks);
|
||||
|
||||
if (p_sock->state == NET_SOCK_STATE_LISTENING) {
|
||||
@@ -2510,6 +2561,9 @@ static void handle_send_event(net_sock_t *p_sock) {
|
||||
* 4. 触发 NET_EVENT_TIMEOUT 回调
|
||||
*/
|
||||
static void handle_timeout_event(net_sock_t *p_sock) {
|
||||
#if defined(NET_BENCH_CMD_LOG)
|
||||
net_bench_cmd_log('x', (int)p_sock->ch395_sock, 0);
|
||||
#endif
|
||||
if (p_sock->state == NET_SOCK_STATE_CONNECTING) {
|
||||
/* TCP Client 连接超时 */
|
||||
DBG_ERROR("sock%d CONNECT TIMEOUT", p_sock->ch395_sock);
|
||||
|
||||
Reference in New Issue
Block a user