环境
芯片:S32K344
系统:FreeRTOS
Lwip外部接口
Lwip提供了三种编程接口,分别为RAW/Callback API 、NETCONN API、SOCKET API。它们的易用性从左到右依次提高,而执行效率从左到右依次降低。
-
RAW/Callback API
内核回调型的API,既支持裸机又支持OS。且OS下使用,对比另外两种API,可以提高应用程序执行效率、节省内存开销(本次移植使用RAW/Callback API)。
-
NETCONN API
基于操作系统的IPC机制,需要OS支持。对比另外两种API,简化了编程工作,避免了内核程序和网络程序之间的数据拷贝。
-
SOCKET API
套接字编程,需要OS支持。具有更好的易用性,编写的程序可读性好,便于维护,方便移植到其他操作系统中。
FreeRTOS下Lwip任务模型
-
网卡接口任务()
网卡接收任务用来接收来自网络
的数据报文,触发接收中断,通过释放信号量或消息入队形式通知以太网接口任务。
-
以太网接口任务
以太网接口任务平时处于阻塞状态,等待信号量或者消息,待消息产生,将报文传递给low_level_input(),在其中调用netif->input处理(协议栈tcpip_input())。发包则是由netif->output交由etharp_output()制作数据包,调用low_level_output()(调用网卡发包函数)发送出去。
-
Lwip协议栈任务
协议栈任务提供收发接口,用来封装,拆解报文。
-
应用程序任务
应用层只关注以太网报文中的数据,用来实现HTTP、FTP、TFTP等应用层协议。
Lwip移植
Lwip源代码移植
拷贝lwip-2.1.2源码到工程Source/Middleware/TCPIP/中,如图所示。
网卡接口层
网卡配置收发中断
网卡配置接收中断触发方式,方便实时接收数据报文,通知以太网接口任务。
hal_eth_rx_callback()接收回调函数
hal_eth_rx_callback()接收到报文后,通过信号量或者消息队列通知以太网接口任务。
以太网接口层移植
以太网接口ethernetif.c文件用来将网卡收发链接到协议栈,并创建了以太网接口任务,用于接收以太网数据报文。
low_level_init()函数
low_level_init()函数主要用来初始化网卡,创建信号量或消息队列等操作。
ethernetif_init()函数
ethernetif_init()函数主要用来配置netif结构,并调用low_level_init()进行网卡初始化,创建以太网接口任务,为其分配1024大小的栈空间,任务优先级由OSIF计算分配。
ethernetif_interface_init()函数
ethernetif_interface_init()作为初始化入口函数,由tcpip_init()函数调用。其主要功能就是初步配置netif结构体,并绑定ethernetif_init()初始化函数和tcpip_input()协议栈入口函数。
low_level_input()函数
low_level_input()函数无需修改。
low_level_output()函数
low_level_output()函数主要修改网卡发送函数。
PoolRecvTaskHandler()函数
PoolRecvTaskHandler()函数就是本节所介绍的以太网接口任务,它用于从网卡收报文,并将报文向上传递给lowe_level_input()函数,最后由Lwip协议栈进行处理。其平时处于阻塞状态,当信号量或消息队列释放或者有数据产生时,报文得以向上传递。
操作系统模拟层移植(sys_arch.c)
模拟层sys_arch.c文件主要是为操作系统和Lwip协议栈之间提供一个接口桥梁。不同的操作系统有不同的消息队列,信号量,互斥锁,线程接口,只需要修改模拟层的这些接口即可达到移植的目的。
3.4.1 IPC结构体和任务定义
消息队列
sys_mbox_init()消息队列初始化
sys_mbox_new()创建消息队列
sys_mbox_free()删除消息队列
sys_mbox_post()消息入队
sys_mbox_post_to_front()消息入队头
sys_mbox_trypost()消息尝试入队
sys_arch_mbox_fetch()消息出队
sys_arch_mbox_tryfetch()消息尝试出队
信号量
sys_sem_new()创建信号量
sys_arch_sem_wait()等待信号量
sys_sem_signal()释放信号量
sys_sem_free()删除信号量
互斥锁
sys_mutex_new()创建互斥锁
sys_mutex_lock()上锁
sys_mutex_unlock()解锁
sys_mutex_free()删除互斥锁
任务
sys_thread_new()创建新任务
sys_thread_delete()删除任务
sys_arch_protect()进入临界区保护
sys_arch_unprotect()推出临界区保护
Lwip配置文件
per.h文件
per.h文件用来控制性能测试,不使用此功能,直接定义为空即可。
cc.h文件
cc.h文件都是与CPU和编译器相关。
lwipopts.h文件
选择API接口
ARP配置
DHCP配置
IP配置
ICMP配置
TCP配置
UDP配置
内存配置
pbuf配置
状态配置
Debug配置
报文检测配置
其他配置
用户配置
本工程使用OSIF创建任务,用到了任务表统一创建,用宏LWIP_USING_OSIF_FUNC进行条件编译。
触发调试中断需要宏“BKPT_ASM”来触发调试中断,S32K344芯片是Cortex-M7架构,需要包含s32_core_cm7.h,本工程需要在device_registers.h文件中包含含s32_core_cm7.h文件。
标签:网卡,Lwip,FreeRTOS,接口,sys,API,S32K344,以太网 From: https://www.cnblogs.com/shuoguoleilei/p/16730394.html