物联网LWIP网络开发 LWIP网卡设计原理11.3 lwIP移植和裁剪
·
lwIP移植和裁剪上
lwIP源码目录结构
+---src
| +---api
| +---apps
| | \---mqtt
| +---core
| | +---ipv4
| | \---ipv6
| +---include
| | +---lwip
| | | +---apps
| | | +---priv
| | | \---prot
| | +---netif
| | | \---ppp
| | \---posix
| | \---sys
| \---netif
| \---ppp
\---system
+---arch
\---OS
带操作系统移植
网卡驱动
lwip
ethernetif
//跟我们硬件(STM32->ETH)相关的,最终要完成外设初始化
err_t ethernetif_init(struct netif *netif);
//以太网底层数据接收的任务
void ethernetif_input(void const * argument);
/*
nerif结构体里面有个 link_callback
*/
//这是一个task,是需要不断去检测,网线状态(link状态)
void ethernetif_set_link(void const *argument);
//当link状态发生改变时,下面的代码会进行回调
void ethernetif_update_config(struct netif *netif);
//提供给用户代码,当用户需要监听link状态时,我们自己实现这个函数接口
void ethernetif_notify_conn_changed(struct netif *netif);
//这个lwIP内核,时间基准,已HAL库的systick的时基为准
u32_t sys_jiffies(void);
u32_t sys_now(void);
操作系统
sys_arch
sys_arch.h
//CMSIS 再不断发展,目前出现多个版本,我们在移植的时候,就需要关系,使用哪一个版本
//在lwIP里面使用到操作系统 任务创建 消息队列 信号量 互斥锁 这个时候要和CMSIS保持一致
#if (osCMSIS < 0x20000U)
#define SYS_MBOX_NULL (osMessageQId)0
#define SYS_SEM_NULL (osSemaphoreId)0
typedef osSemaphoreId sys_sem_t;
typedef osSemaphoreId sys_mutex_t;
typedef osMessageQId sys_mbox_t;
typedef osThreadId sys_thread_t;
#else
#define SYS_MBOX_NULL (osMessageQueueId_t)0
#define SYS_SEM_NULL (osSemaphoreId_t)0
typedef osSemaphoreId_t sys_sem_t;
typedef osSemaphoreId_t sys_mutex_t;
typedef osMessageQueueId_t sys_mbox_t;
typedef osThreadId_t sys_thread_t;
#endif
#ifdef __cplusplus
}
#endif
sys_arch.c
//任务创建 消息队列 信号量 互斥锁
sys_mbox
sys_sem
sys_mutex
sys_thread_new
配置选项
lwipopt
/* STM32CubeMX Specific Parameters (not defined in opt.h) ---------------------*/
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/
/*----- WITH_RTOS enabled (Since FREERTOS is set) -----*/
#define WITH_RTOS 1
opt
#if !defined NO_SYS || defined __DOXYGEN__
#define NO_SYS 0
#endif
lwIP移植和裁剪下
General Setting

Key Option

//lwIP内部有两个内存管理机制,其实就是针对一个数组进行动态管理
#if !defined MEMP_MEM_MALLOC || defined __DOXYGEN__
#define MEMP_MEM_MALLOC 0
#endif
//内存堆的大小,当我们开辟的socket比较多时,这个内存堆大小就是扩大
#if !defined MEM_SIZE || defined __DOXYGEN__
#define MEM_SIZE 1600
#endif
/*
------------------------------------------------
---------- Internal Memory Pool Sizes ----------
lwIP内部自己是的内存池相关的大小配置(TCP UDP IP 首部)
有很多地方在使用内存池,用户在使用的时候,我不需要动
------------------------------------------------
*/
重点关注
/*
链路检测使能
一定要在cubemx里面进行使能,除了这个使能之外,还有一些回调机制处理,cube会协助我们自动生成的
*/
#if !defined LWIP_NETIF_LINK_CALLBACK || defined __DOXYGEN__
#define LWIP_NETIF_LINK_CALLBACK 0
#endif
/*
socket选项使能
------------------------------------
---------- Socket options ----------
当我们使用socket接口时,尤其使用setsockopt,我们必须要进行socket配置
------------------------------------
*/
Debug

/** Debug level: ALL messages*/
#define LWIP_DBG_LEVEL_ALL 0x00
/** Debug level: Warnings. bad checksums, dropped packets, ... */
#define LWIP_DBG_LEVEL_WARNING 0x01
/** Debug level: Serious. memory allocation failures, ... */
#define LWIP_DBG_LEVEL_SERIOUS 0x02
/** Debug level: Severe */
#define LWIP_DBG_LEVEL_SEVERE 0x03
#if !defined LWIP_DBG_MIN_LEVEL || defined __DOXYGEN__
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
#endif
//在使能debug之后,我需要自己进行宏定义
/*
#define LWIP_DEBUG
*/
#ifdef LWIP_DEBUG
#ifndef LWIP_PLATFORM_DIAG
#error "If you want to use LWIP_DEBUG, LWIP_PLATFORM_DIAG(message) needs to be defined in your arch/cc.h"
#endif
#define LWIP_DEBUGF(debug, message) do { \
if ( \
((debug) & LWIP_DBG_ON) && \
((debug) & LWIP_DBG_TYPES_ON) && \
((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
LWIP_PLATFORM_DIAG(message); \
if ((debug) & LWIP_DBG_HALT) { \
while(1); \
} \
} \
} while(0)
#else /* LWIP_DEBUG */
#define LWIP_DEBUGF(debug, message)
#endif /* LWIP_DEBUG */
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)