物联网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

物联网LWIP网络开发 LWIP网卡设计原理11.3 lwIP移植和裁剪_第1张图片

Key Option

物联网LWIP网络开发 LWIP网卡设计原理11.3 lwIP移植和裁剪_第2张图片

//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

物联网LWIP网络开发 LWIP网卡设计原理11.3 lwIP移植和裁剪_第3张图片

/** 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 */

你可能感兴趣的:(lwIP网络,lwip,网络)