网络主要内容测试完成
This commit is contained in:
@@ -41,13 +41,16 @@ static int check_socket_error(int sockfd);
|
||||
* timeout - 超时时间结构体指针 net_timeval *(NULL=无限等待)
|
||||
* 出口参数:readfds/writefds/exceptfds - 仅保留就绪的 Socket 位 net_fd_set *
|
||||
* 返回值:就绪的 Socket 数量(>= 0);-1 表示参数无效 int
|
||||
* 限定条件:net_init() + MX_FREERTOS_Init() 已执行;必须在 netTask 上下文中调用
|
||||
* 函数说明:1. 轮询所有 Socket,检查读/写/异常事件是否就绪
|
||||
* 2. 阻塞等待直到有事件就绪或超时
|
||||
* 3. 通过 osDelay(1) 让出 CPU,平衡实时性与 CPU 利用率
|
||||
* 限定条件:net_init() + MX_FREERTOS_Init() 已执行;可在任意任务上下文调用
|
||||
* 函数说明:1. 轮询 Socket 控制块(RAM)中的读/写/异常状态,判断事件是否就绪
|
||||
* 2. 不在此直接访问 CH395F SPI——所有 ch395f 事务统一由 netTask 的 net_poll()
|
||||
* 每 10ms 串行执行并刷新控制块状态(send_ready / readable),本函数仅做
|
||||
* RAM 读取,避免与应用任务发起的 SPI 访问竞争(见 Trap 16)
|
||||
* 3. 阻塞等待直到有事件就绪或超时
|
||||
* 4. 通过 osDelay(1) 让出 CPU,平衡实时性与 CPU 利用率(状态刷新延迟 <=10ms)
|
||||
*/
|
||||
int net_select(int nfds, net_fd_set *readfds, net_fd_set *writefds,
|
||||
net_fd_set *exceptfds, net_timeval *timeout) {
|
||||
net_fd_set *exceptfds, net_timeval *timeout) {
|
||||
uint32_t start_tick;
|
||||
uint32_t timeout_ms = 0;
|
||||
net_fd_set result_read = {0};
|
||||
@@ -70,9 +73,7 @@ int net_select(int nfds, net_fd_set *readfds, net_fd_set *writefds,
|
||||
start_tick = HAL_GetTick();
|
||||
|
||||
while (1) {
|
||||
/* 轮询所有 Socket */
|
||||
net_poll();
|
||||
|
||||
/* 仅读取 netTask 的 net_poll() 已刷新的控制块状态(无 CH395F SPI 访问) */
|
||||
ready_count = 0;
|
||||
|
||||
/* 检查哪个 Socket 有事件 */
|
||||
@@ -146,10 +147,11 @@ int net_select(int nfds, net_fd_set *readfds, net_fd_set *writefds,
|
||||
* timeout - 超时时间(毫秒) int >= 0(-1=无限等待,但本实现按 >=0 处理)
|
||||
* 出口参数:fds[i].revents - 填充实际发生的事件掩码 short
|
||||
* 返回值:就绪的 fd 数量(>= 0);-1 表示参数无效 int
|
||||
* 限定条件:net_init() + MX_FREERTOS_Init() 已执行;必须在 netTask 上下文中调用
|
||||
* 函数说明:1. 轮询所有 Socket,检查读/写/错误/挂起事件是否就绪
|
||||
* 2. 阻塞等待直到有事件就绪或超时
|
||||
* 3. 通过 osDelay(1) 让出 CPU,平衡实时性与 CPU 利用率
|
||||
* 限定条件:net_init() + MX_FREERTOS_Init() 已执行;可在任意任务上下文调用
|
||||
* 函数说明:1. 轮询 Socket 控制块(RAM)中的读/写/错误/挂起状态,判断事件是否就绪
|
||||
* 2. 不在此直接访问 CH395F SPI——状态由 netTask 的 net_poll() 每 10ms 刷新
|
||||
* 3. 阻塞等待直到有事件就绪或超时
|
||||
* 4. 通过 osDelay(1) 让出 CPU,平衡实时性与 CPU 利用率(状态刷新延迟 <=10ms)
|
||||
*/
|
||||
int net_poll_events(net_pollfd *fds, int nfds, int timeout) {
|
||||
uint32_t start_tick;
|
||||
@@ -163,9 +165,7 @@ int net_poll_events(net_pollfd *fds, int nfds, int timeout) {
|
||||
start_tick = HAL_GetTick();
|
||||
|
||||
while (1) {
|
||||
/* 轮询 */
|
||||
net_poll();
|
||||
|
||||
/* 仅读取 netTask 的 net_poll() 已刷新的控制块状态(无 CH395F SPI 访问) */
|
||||
ready = 0;
|
||||
|
||||
for (i = 0; i < nfds; i++) {
|
||||
@@ -248,7 +248,6 @@ int net_poll_events(net_pollfd *fds, int nfds, int timeout) {
|
||||
*/
|
||||
static int check_socket_readable(int sockfd) {
|
||||
net_sock_t *p_sock;
|
||||
uint16_t recv_len;
|
||||
|
||||
p_sock = net_get_sock(sockfd);
|
||||
if (NULL == p_sock) {
|
||||
@@ -260,12 +259,10 @@ static int check_socket_readable(int sockfd) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 已建立连接的 Socket 有数据可读 */
|
||||
if (NET_SOCK_STATE_ESTABLISHED == p_sock->state) {
|
||||
recv_len = ch395f_get_recv_len(sockfd);
|
||||
if (0 < recv_len) {
|
||||
return 1;
|
||||
}
|
||||
/* 已建立连接或 UDP 等有数据可读:readable 由 net_poll 在 RECV_OK 时置位、
|
||||
* net_recv_locked 读空后清零。避免应用任务直接访问 CH395F SPI(见 Trap 16) */
|
||||
if (p_sock->readable) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user