3 移植LwIP协议栈
首先从官网下载LwIP-1.4.1源码,然后在软件工程中添加LwIP相关目录,工程结构如图3所示。LwIP_src目录下是LwIP源码,实现基本的LwIP协议功能。LwIP_port目录下的文件主要实现了LwIP协议栈与系统的接口,ethernetif.c文件实现LwIP协议和以太网驱动的接口,sys_arch.c文件(位于arch目录下)实现LwIP协议和操作系统的接口。
ethernetif.c主要功能是初始化 MAC 相关工作环境、初始化 DMA 描述符链表。实现LwIP最底层的发送和接收一帧数据的函数。
sys_arch.c文件包含了LwIP要用到的必要的基于FreeRTOS机制的函数,主要有创建线程函数sys_thread_new,创建信号量函数sys_sem_new,创建邮箱函数sys_mbox_new等。这些函数需要对FreeRTOS的API做简单的封装,如sys_thread_new函数的本质是调用xTaskCreate来实现创建线程。
APP目录属于应用层的文件。netconf.c文件实现LwIP协议栈的初始化并开启DHCP服务器,tcp_echoclient.c 文件实现指定的通讯协议任务。
stm32f429_eth.c,stm32f429_phy.c由ST公司官方提供,属于以太网标准库,用于实现ETH外设的配置,包括GPIO 初始化,RMII、 SMI 接口初始化,MAC 控制器工作环境配置,PHY 状态获取等。lwip freertos
4 网络通讯测试
测试DHCP服务器软件流程如图4所示,首先硬件初始化,初始化系统时钟、GPIO引脚、以太网ETH模块、串口等;然后创建FreeRTOS任务,指定任务优先级,栈大小;启动FreeRTOS调度,至此以后系统开始轮询调度任务。
在DHCP任务中首先执行LwIP_Init函数初始化 LwIP 协议栈,设置ip地址、子网掩码、网关;添加以太网设备;设置以太网设备为默认网卡;启动网卡;设置链路回调函数,用于获取链路状态。然后以250ms的周期查询DHCP的状态,当 DHCP 状态为DHCP_START 时,启动 DHCP 功能, LwIP 会向 DHCP 服务器申请分配 IP 请求。当 DHCP 状态为 DHCP_WAIT_ADDRESS 时,先判断IP 地址是否为 0,如果不为 0 说明已经有 IP 地址, 将停止DHCP 功能;如果IP 地址总是为 0,就需要判断超时时间,并响应超时错误。
使用网线把网络模块和电脑连入同一个路由器,保证路由器可以提供 DHCP 服务器功能。打开串口调试助手,为系统上电,可以看到在使能 DHCP 功能后,能够动态获取 的IP 地址,用电脑ping这个地址可以ping通,说明基于FreeRTOS和LwIP协议的DHCP功能调试成功。
TCP是一种可靠的、面向连接的通信协议,建立连接时需要通过“三次握手”建立连接。本文基于LwIP的socket编程接口实现TCP协议网络通讯,电脑作为客户端,网络模块作为服务器,TCP软件流程如图4所示,初始化软件流程与DHCP相同,区别是是创建的任务是TCP任务:创建socket套接字;调用bind函数绑定套接字的地址和端口号;调用listen函数客户端的连接请求;调用accept函数,确立连接;通过recv、send函数接收发送数据,与客户端通讯。在网络调试助手中确定客户端和服务器的IP和端口号,输入一行内容,可回显服务器的响应,即将输入内容打印出来,证明TCP通讯正常。
5 结语
在嵌入式操作系统和网络协议栈百花齐放的今天,选择一种简单实用的网络通讯方式能够很大的提高产品的可靠性和质量。本文基于开源免费,移植简单的FreeRTOS和LwIP协议栈,为嵌入式设备提供一种新的实现网络通讯功能的设计流程,具有一定的参考价值。
参考文献
[1]李少杰,马晓辉.基于FreeRTOS和LwIP的SNTP设计[J].单片机与嵌入式系统应用,2013(09).
[2]谢鹏程.基于STM32和FreeRTOS的独立式运动控制器设计与研究[D].广州:华南理工大学,2012(05).
[3]余晓光.基于实时操作系统FreeRTOS的Lwip协议的移植研究[D].昆明:昆明理工大学,2013(04).
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-35742-2.html
长长中国军人的血性劲儿
你们觉得可笑不
丑得我不要不要的作