在进行移植之前,大家需要学会FreeRTOS的基本使用与无OS移植LWIP的经验,因为基于FreeRTOS移植LWIP需要准备一个FreeRTOS模板项目以及无OS移植LWIP成功的项目。
不知道什么是FreeRTOS的应该不会点开这篇博客。
没有无OS移植LWIP项目的一定要准备一个,LWIP相关文件就直接复制过来。可以点击查看我的上一篇博客来学习。
硬件与引脚连接也是看上一篇博客。
准备模板
准备一个FreeRTOS模板项目,启用计数量、消息队列

启动文件把堆栈都设置大点

LWIP文件夹
复制无OS移植LWIP项目中的LWIP文件夹,粘贴到本项目下

新建组
打开空STM32项目、新建组lwip-api、lwip-arch、lwip-netif、lwip-core、lwip-core-ipv4
lwip-arch添加cc.h、lwipopts.h、perf.h、网卡驱动文件,arch目录下新建两个文件sys_arch.h与sys_arch.c并加入分组

lwip-netif添加ethernetif.c、etharp.c、slipif.c

lwip-core添加core全部文件,lwip-core-ipv4添加core/ipv4全部文件


lwip-api添加api下的全部文件

魔术棒
添加头文件路径

Misc Control里面输入–diag_suppress=1,1295,174,167,111,128,177,550
规避部分警报

修改lwipopts.h
NO SYS 设置为0
LWIP_SOCKET与LWIP_NETCONN设置为1
新添加以下宏:
//以太网首部填充:
#define ETH_PAD_SIZE 0
//TCPIP任务以及用到的队列大小定义,默认为0所以必须要改
#define TCPIP_THREAD_STACKSIZE 512
#define TCPIP_THREAD_PRIO 1
#define TCPIP_MBOX_SIZE 1024
#define DEFAULT_RAW_RECVMBOX_SIZE 1024
#define DEFAULT_UDP_RECVMBOX_SIZE 1024
#define DEFAULT_TCP_RECVMBOX_SIZE 1024
#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__
#define NO_SYS 0
#define LWIP_SOCKET 1
#define LWIP_NETCONN 1
#define MEM_ALIGNMENT 4
#define MEM_SIZE 10*1024
#define TCP_SND_BUF 4000
#define TCP_MSS 1000
#define ETHARP_DEBUG LWIP_DBG_ON
#define ICMP_DEBUG LWIP_DBG_ON
//新加部分
#define ETH_PAD_SIZE 0
#define TCPIP_THREAD_STACKSIZE 512
#define TCPIP_THREAD_PRIO 1
#define TCPIP_MBOX_SIZE 1024
#define DEFAULT_RAW_RECVMBOX_SIZE 1024
#define DEFAULT_UDP_RECVMBOX_SIZE 1024
#define DEFAULT_TCP_RECVMBOX_SIZE 1024
#endif /* __LWIPOPTS_H__ */
修改sys_arch.h
实现部分要求的类型以及函数定义(部分用宏定义代替)
LWIP要求实现的类型有三个:sys_sem_t(信号量)、sys_mbox_t(邮箱)、sys_thread_t(任务),其实还有一个互斥量也要实现,但是可以通过设置宏LWIP_COMPAT_MUTEX为1,使得互斥量等价于信号量。
这里信号量、邮箱、任务分别用FreeRTOS的信号量、消息队列与任务来实现。
LWIP还要我们实现一些函数,部分过于简单的函数直接在这个头文件里面用宏定义代替。
#ifndef __SYS_ARCH_H__
#define __SYS_ARCH_H__
#define LWIP_COMPAT_MUTEX 1
#include "FreeRTOS.h"
#include "queue.h"
#include "semphr.h"
#include "task.h"
typedef xSemaphoreHandle sys_sem_t;
#define SYS_SEM_NULL NULL
#define sys_sem_valid(sema) ((*sema)!=NULL)
#define sys_sem_set_invalid(sema) ((*sema)=NULL)
typedef xQueueHandle sys_mbox_t;
#define SYS_MBOX_NULL NULL
#define sys_mbox_valid(mbox) ((*mbox)!=NULL

最低0.47元/天 解锁文章
1873

被折叠的 条评论
为什么被折叠?



