Files
STM32F4-Base/App/task/net_task.c

133 lines
3.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称Network Application Task
* 模块功能CH395F 协议栈初始化 + 轮询 + TCP/UDP 业务处理
* 与 net_socket.h 配合,在 FreeRTOS 独立任务中运行
* 适用平台STM32F407ZGTx + CH395F
* 作者:王建锋
* 创建日期2026-07-19
* 修改记录:
* v1.0 2026-07-19 王建锋 创建初始版本
* v1.1 2026-07-19 王建锋 migrate from freertos.c StartNetTask
* v1.2 2026-07-21 王建锋 网络初始化移入本任务net_init + TCP 监听)
*/
#include <string.h>
#include "net_task.h"
#include "cmsis_os.h"
#include "net_socket.h"
#include "net_select.h"
#include "ch395f.h"
#include "ch395f_test.h"
#define DBG_TAG "[NET_TASK]"
#include "dbg_log.h"
static uint8_t s_net_buf[1500];
/*
* 函数功能:网络任务初始化
* 入口参数:无
* 返 回 值0 - 成功,-1 - 失败
* 限定条件CH395F 协议栈已初始化
* 函数说明:创建 TCP Server 监听 Socket注册回调等
*/
int net_task_init(void)
{
DBG_INFO("net_task_init");
return 0;
}
/*
* 函数功能:网络任务主函数
* 入口参数arg - FreeRTOS 传入参数(未使用)
* 返 回 值:无
* 函数说明:启动后先调用 net_init 初始化 CH395F 协议栈,创建 TCP 监听,
* 再进入轮询循环处理网络事件
*/
void net_task_func(void const *arg)
{
(void)arg;
osDelay(2000);
/* ==================== CH395F 协议栈初始化 ==================== */
DBG_INFO("=== Network Init ===");
if (net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") == 0) {
DBG_INFO("net init: OK");
uint8_t mac[6];
ch395f_get_mac_addr(mac);
DBG_INFO("MAC: %02X:%02X:%02X:%02X:%02X:%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
ch395f_set_phy(CH395F_PHY_100M_FULL);
HAL_Delay(3000);
uint8_t phy = ch395f_get_phy_status();
DBG_INFO("PHY: %s",
(phy == CH395F_PHY_100M_FULL) ? "100M FULL" :
(phy == CH395F_PHY_100M_HALF) ? "100M HALF" :
(phy == CH395F_PHY_10M_FULL) ? "10M FULL" :
(phy == CH395F_PHY_10M_HALF) ? "10M HALF" :
(phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN");
} else {
DBG_ERROR("net init: FAIL");
}
/* ==================== TCP Server Echo 测试 ==================== */
{
int listen_sock = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
DBG_INFO("TCP listen socket: %d", listen_sock);
struct net_sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = NET_AF_INET;
serv_addr.sin_port = net_htons(8080);
serv_addr.sin_addr.s_addr = NET_INADDR_ANY;
if (net_bind(listen_sock, (struct net_sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
DBG_INFO("TCP bind: OK (port 8080)");
} else {
DBG_ERROR("TCP bind: FAIL");
}
if (net_listen_locked(listen_sock, NET_TCP_SERVER_MAX_CLIENTS) == 0) {
DBG_INFO("TCP listen: OK (max_clients=%d)", NET_TCP_SERVER_MAX_CLIENTS);
} else {
DBG_ERROR("TCP listen: FAIL");
}
}
DBG_INFO("netTask: started, processing messages");
/* ==================== 主轮询循环 ==================== */
for (;;) {
net_poll();
net_process_messages();
#ifdef ENABLE_PHASE4_TESTS
for (int i = 1; i < 8; i++) {
net_sock_t *p_sk = net_get_sock(i);
if (p_sk == NULL || p_sk->state != NET_SOCK_STATE_ESTABLISHED) {
continue;
}
int n = net_recv_sock(p_sk, s_net_buf, sizeof(s_net_buf), NET_MSG_DONTWAIT);
if (n > 0) {
net_send_sock(p_sk, s_net_buf, n);
}
}
#endif
#ifdef ENABLE_PHASE5_TESTS
ch395f_phase5_tests();
#endif
#ifdef ENABLE_PHASE7_TESTS
ch395f_phase7_tests();
#endif
osDelay(10);
}
}