STM32+freertos+lwip

1、初始化包括

(1)、   ETH_GPIO_Config();   //引脚配置  
       ETH_NVIC_Config();//网络中断配置
          ETH_MACDMA_Config();//MAC/DMA配置

(2)、LwIP_Init(); //LWIP初始化  :设置网络接口,初始化IP,掩码,网关等。创建TCP-IP任务,Eth_if任务。

2、应用层创建TCP任务执行do_listen函数监听消息和创建套接字建立连接通信并读取recvmbox数据(5步骤中)。

(1) 建立套接字.bind函数初始化sock中con_net的端口号,IP地址回调函数等信息。

(2)listen(sock, 5);  //在socket上进行监听 -->  err = netconn_listen_with_backlog(sock->conn, backlog);  -->do_listen -->主要做了2件事情。1、申请tcp_pcb(tcp协议控制块 Protocol Control Block)用于初始化socket->con_net->tcp-pcb部分。初始化pcb的发送接收函数等。创建接收消息的mbox。利用sock中的connet创建新的connet发送到sock->connet->acceptmbox.

(3) accept函数中,初始化好的sock添加到全局数组sockets中。

3、中断部分:检测到DMA标志后,发送消息到sem中。 

   /* Give the semaphore to wakeup LwIP task */
    (1) xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken );   

(2) Eth_if任务中的ethernetif_input( void * pvParameters )接收到消息,void ethernetif_input( void * pvParameters )函数内部low_level_input对消息进行解析并发送到tcpip_input中。

(3) tcpip_input函数中做了什么呢?  tcpip_input将数据发送到mbox

    msg->type = TCPIP_MSG_INPKT;
    msg->msg.inp.p = p;
    msg->msg.inp.netif = inp;
    if (sys_mbox_trypost(mbox, msg) != ERR_OK) 到1.2中创建的TCP-IP任务。

(4) TCP-Ip任务,对消息进行拆分解析去掉IP头部信息等。tcpip_thread任务中 --> ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);--> ip_input(p, netif);-->    tcp_input(p, inp);-->   TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);(    /* Notify application that data has been received. */)通知应用层数据保存。将消息发送到 connet->recvmbox中

(5)应用层线程调用recv函数读取该recvmbox中的数据。



©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值