首页 > 其他分享 >基于S32K344+FreeRTOS的Lwip协议栈移植

基于S32K344+FreeRTOS的Lwip协议栈移植

时间:2022-09-26 11:55:41浏览次数:52  
标签:网卡 Lwip FreeRTOS 接口 sys API S32K344 以太网

环境

芯片: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

相关文章

  • FreeRTOS
    FreeRTOS新建模板小书匠一、任务1.任务状态2.中断2-1.三个重点寄存器2-2.临界区代码3.任务创建与使用3-1.创建任务3-1-1.常用宏定义3-2.退出任务3-3.开启任务调......
  • 【lwip】06-网络接口层分析
    目录前言6.1概念引入6.2网络接口层数据概念流图6.3网卡收包程序流图6.4网卡数据结构6.4.1structnetif源码6.4.2字段分析6.4.2.1网卡链表6.4.2.2网络IP6.4.2.3......
  • esp32的esp_wifi(wifi驱动库),esp_netif(网络接口) ,lwip(轻量级TCP/IP网络协议栈)是什
    .esp32的esp_wifi(wifi驱动库),esp_netif(网络接口),lwip(轻量级TCP/IP网络协议栈)是什么?三者之间有什么关系?esp_wifi驱动库用户控制wifi硬件单元;lwip是一层纯软件,轻量级......
  • 【lwip】005-lwip内核框架剖析
    目录前言5.1lwip初始化5.2内核超时5.2.1内核超时机制5.2.2周期定时机制5.2.3内核超时链表数据结构5.2.4内核超时初始化5.2.6超时的溢出处理5.2.7注册超时事件5.2.8......
  • assert failed: tcpip_send_msg_wait_sem IDF/components/lwip/lwip/src/api/tcpip.c:
    assertfailed:tcpip_send_msg_wait_semIDF/components/lwip/lwip/src/api/tcpip.c:455(Invalidmbox)assertfailed:tcpip_send_msg_wait_semIDF/components/lwip/l......
  • ESP32-S2 lwip
    I'mnotabigexpertinlwIP,butIthinkthecodeiscorrect,sinceIspenttimedebuggingitonESP32anditworksverywellthere.Ifonecodefortransmitt......
  • Windows下ESP32 环境搭建(基于esp-idf FreeRTOS)
    1.之前的尝试(失败的尝试)咸鱼买了3块ESP32开发板。背面写了NODEMCUv1.1,好像这玩意可以直接写lua,也可以刷Micropython写python,还可以用ArduinoIDE写c。我想直接用官方库......