Files
STM32F4-Base/App/task/net_task.c
2026-08-24 16:16:18 +08:00

108 lines
3.3 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 监听)
* v1.3 2026-07-22 王建锋 单连接模式重构,增加大文件/边界/KeepAlive 测试
*/
#include <string.h>
#include "net_task.h"
#include "cmsis_os.h"
#include "net_socket.h"
#include "net_select.h"
#include "ch395f.h"
#define DBG_TAG "[NET_TASK]"
#include "dbg_log.h"
/* 网络初始化完成标志(供 ch395f_test_task 等外部任务等待) */
volatile uint8_t g_net_ready = 0;
/*
* 函数功能CH395F 协议栈一次性初始化(两种构建模式共用)
* 入口参数:无
* 返 回 值0 - 成功,-1 - 失败
* 函数说明net_init → MAC 打印 → PHY 强制 100M 全双工 → 置 g_net_ready。
* NET 层模式由 netTask 调用;硬件层模式(阶段 1~5netTask 不创建,
* 由 ch395fTestTask 调用后独占 CH395F。
*/
int net_stack_bring_up(void)
{
DBG_INFO("=== Network Init ===");
if (net_init("192.168.1.100", "255.255.255.0", "192.168.1.1") != 0) {
DBG_ERROR("net init: FAIL");
return -1;
}
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");
g_net_ready = 1;
return 0;
}
/*
* 函数功能:网络任务初始化
* 入口参数:无
* 返 回 值0 - 成功,-1 - 失败
* 限定条件CH395F 协议栈已初始化
* 函数说明:创建 TCP Server 监听 Socket注册回调等
*/
int net_task_init(void)
{
DBG_INFO("net_task_init");
return 0;
}
/*
* 函数功能:网络任务主函数
* 入口参数arg - FreeRTOS 传入参数(未使用)
* 返 回 值:无
* 函数说明:启动后先调用 net_stack_bring_up() 初始化 CH395F 协议栈,
* 再进入轮询循环处理网络事件。
* 仅 NET 层测试模式(阶段 6~10会创建本任务
* 硬件层模式下 netTask 不创建CH395F 由 ch395fTestTask 独占。
*/
void net_task_func(void const *arg)
{
(void)arg;
osDelay(2000);
if (net_stack_bring_up() != 0) {
for (;;) {
osDelay(1000);
}
}
DBG_INFO("netTask: started (single-socket mode)");
/* ==================== 主轮询循环 ==================== */
for (;;) {
net_poll();
net_process_messages();
osDelay(10);
}
}