LWIP带freeRTOS系统移植笔记

以正点原子学习视频为基础的文章

LWIP带freeRTOS系统移植

准备资料/工程

1、lwIP例程1 lwIP裸机移植  工程  ,   作为基础工程  改名为LWIP_freeRTOS_yizhi工程

2、lwIP例程6 lwIP_FreeRTOS移植  工程

3、freeRTO源码  

 打开https://www.freertos.org/网址下载FreeRTOS源码包

省出麻烦的细节移植,直接使用1、2  两个工程移植

  在   lwIP例程6 lwIP_FreeRTOS移植 工程中   

1、取出 Middlewares\FreeRTOS  把FreeRTOS系统源文件移植到

2、取出  Drivers\SYSTEM    delaysysusart.c文件  移植到

3、取出 \User  FreeRTOSConfig.h文件  移植到

LWIP_freeRTOS_yizhi工程中

在工程中新建分组

LWIP_freeRTOS_yizhi工程作为基础工程

分组1:Middlewares/FreeRTOS_CORE

Middlewares\FreeRTOS 当前文件夹下的全部c文件

分组2:Middlewares/FreeRTOS_PORT

1、Middlewares\FreeRTOS\portable\MemMang   的 heap_4.c文件

2、Middlewares\FreeRTOS\portable\RVDS\ARM_CM4F port.c文件

添加头文件路径

1、Middlewares\FreeRTOS\include

2、Middlewares\FreeRTOS\portable\RVDS\ARM_CM4F

移植支持lwip的freeRTOS系统文件

http://savannah.nongnu.org/projects/lwip/

网址下载lwIP源码包和contrib包

1、在 contrib-2.1.0\ports\freertos 取得sys_arch.c / .h  

2、移植到  LWIP_freeRTOS_yizhi工程中  Middlewares/lwip/arch

并在工程中,添加到分组和添加包含路径

修改配置文件

 1,修改lwipopts.h

(目标:需要,符合带操作系统的配置文件

因为基础工程是用的裸机移植作为基础,所以这个文件是用在裸机上的;所以需要更改找到stm提供的库文件相关文件

FW_F4_V1.26.0\Projects\STM32469I_EVAL\Applications\LwIP \LwIP_HTTP_Server_Netconn_RTOS\Inc\  路径下的lwipopts.h替换本实验的Middlewares\lwip\arch   lwipopts.h文件

ps:FW_F4_V1.26.0   stm官方资料包         

修改TCPIP的优先级 此处没有实际的定义,所以改成5 如下

2、修改cc.h

(目标:注释掉重复的变量

typedef int sys_prot_t”代码注销

3,修改lwip_comm.c/.h

(目标:删除lwip_periodic_handle函数和修改lwip_comm_init 函数

1、删除 lwIP 轮询函数 lwip_periodic_handle

2、修改 lwip_comm_init 函数

 直接移植好的工程  后期源码分析;路径: Middlewares\lwip\arch

 4,修改ethernetif.c/h

(目标:修改为带操作系统的网卡驱动

 修改low_level_init函数

修改 ethernetif_input函数

  直接移植好的工程  后期源码分析;路径: Middlewares\lwip\arch

1、创建任务ethernetif_input任务;

该任务获取二值信号量,判断是否接收到数据

然后在中断函数中释放;

2、ethernetif_input  的相关中断  信号量释放

释放二值信号量,就是为了重复的操作

 5,修改ethrnet.c 

(目标:修改中断优先级;修改中断优先级,必须归FreeRTOS内核管理

  直接移植好的工程  后期源码分析;路径: Drivers\BSP\ETHERNET

优先级为6  子优先级0

相关中断函数

6、修改文件stm32f407xx.h

此处是跟freeRTOS系统有关;

把无符号删除,直接改为4

7、修改文件stm32f4xx_it.c

屏蔽如下函数,因为存在重复定义

1、SVC_Handler

2、PendSV_Handler

3、SysTick_Handler

8、修改文件malloc.h 修改SRAM内存大小

9、新建freertos_demo.c/.h文件:

User分组下,新建freertos_demo.c/.h文件、

freertos_demo.c:创建任务

freertos_demo.h:声明入口函数

现在直接从好完成的工程中 移植   路径:\User     后续源码解析

10、main文件

现在直接从好完成的工程中 移植   路径:\User     后续源码解析

探索者/电机板三处不一样需要修改

1、PHY复位引脚不一样    探索者:PA  8     电机开发板 PA4

2、探索者pyh芯片:YT8512C          电机开发板芯片:PHY_TYPE

3、mac地址不一样

LWIP带FreeRTOS操作系统的启动流程

启动流程的原理,基本上和裸机移植的启动原理流程一样;除了裸机只能使用RAW限制外;

只不过添加了系统,触发不一样而已。比如二值信号量、创建任务等

1、函数 void tcpip_init(tcpip_init_done_fn initfunc, void *arg)

..\..\Middlewares\LWIP\src\api\tcpip.c  

/*** @ingroup lwip_os* Initialize this module:* - initialize all sub modules* - start the tcpip_thread** @param initfunc a function to call when tcpip_thread is running and finished initializing* @param arg argument to pass to initfunc*/
void
tcpip_init(tcpip_init_done_fn initfunc, void *arg)
{lwip_init();tcpip_init_done = initfunc;tcpip_init_done_arg = arg;if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) {  //创建一个邮箱LWIP_ASSERT("failed to create tcpip_thread mbox", 0);}
#if LWIP_TCPIP_CORE_LOCKINGif (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {   //创建一个互斥锁LWIP_ASSERT("failed to create lock_tcpip_core", 0);}
#endif /* LWIP_TCPIP_CORE_LOCKING */sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);//创建一个线程
}

2、函数tcpip_thread  任务

..\..\Middlewares\LWIP\src\api\tcpip.c

/*** The main lwIP thread. This thread has exclusive access to lwIP core functions* (unless access to them is not locked). Other threads communicate with this* thread using message boxes.** It also starts all the timers to make sure they are running in the right* thread context.** @param arg unused argument*/
static void
tcpip_thread(void *arg)
{struct tcpip_msg *msg;LWIP_UNUSED_ARG(arg);LWIP_MARK_TCPIP_THREAD();LOCK_TCPIP_CORE();if (tcpip_init_done != NULL) {tcpip_init_done(tcpip_init_done_arg);}while (1) {                          /* MAIN Loop */LWIP_TCPIP_THREAD_ALIVE();/* wait for a message, timeouts are processed while waiting */TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg);  //获取一个消息  阻塞if (msg == NULL) {LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));LWIP_ASSERT("tcpip_thread: invalid message", 0);continue;}tcpip_thread_handle_msg(msg);//判断消息类型   递交网络层   IP层	还是arp层}
}

3、添加网卡

..\..\Middlewares\LWIP\src\api\tcpip.c

函数一样

4、tcpip_inpkt函数

/*** Pass a received packet to tcpip_thread for input processing** @param p the received packet* @param inp the network interface on which the packet was received* @param input_fn input function to call*/
err_t
tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
{
#if LWIP_TCPIP_CORE_LOCKING_INPUTerr_t ret;LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_inpkt: PACKET %p/%p\n", (void *)p, (void *)inp));LOCK_TCPIP_CORE();ret = input_fn(p, inp);UNLOCK_TCPIP_CORE();return ret;
#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */struct tcpip_msg *msg;LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);if (msg == NULL) {return ERR_MEM;}msg->type = TCPIP_MSG_INPKT;msg->msg.inp.p = p;msg->msg.inp.netif = inp;msg->msg.inp.input_fn = input_fn;  //构建消息if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {//用邮箱发送消息memp_free(MEMP_TCPIP_MSG_INPKT, msg);return ERR_MEM;}return ERR_OK;
#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组网技术知识点

1.port-isloate enable命令用于实现两个接口之间的二层数据隔离,三层数据互通。 2.交换机最多支持4096个VLAN,编号为1-4094 3.display bfd session all:查看BFD会话状态是否UP 4.RJ45通过双绞线连接以太网; AUI端口&#xff1…

Linux系统:进程程序替换以及相关exec接口

本节重点 理解进程替换的相关概念与原理掌握相关程序替换接口程序替换与进程创建的区别程序替换的注意事项 一、概念与原理 进程程序替换是操作系统中实现多任务和资源复用的关键机制,允许进程在运行时动态加载并执行新程序。 1.1 定义 进程程序替换是指用新程…

从此,K8S入门0门槛!

前言 当你想要入门K8S的时候,往往会被各种概念搞的晕乎乎的,什么API Server,Scheduler,Controller manager,Etcd,Pod,Kubelet,kube-proxy,deployment…… 哪怕你使用了…

[Python开发] 如何用 VSCode 编写和管理 Python 项目(从 PyCharm 转向)

在 Python 开发领域,PyCharm 一直是广受欢迎的 IDE,但其远程开发功能(如远程 SSH 调试)仅在付费版中提供。为了适应服务器部署需求,很多开发者开始将目光转向更加轻量、灵活且免费扩展能力强的 VSCode。本篇文章将详细介绍,从 PyCharm 转向 VSCode 后,如何高效搭建和管理…

处方流转平台权限控制模块设计(基于RBAC模型)

这是基于笔者的一些经验设计并加以完善的方案,仅供参考。 处方流转平台权限控制模块设计(基于RBAC模型) 1. 需求分析 处方流转平台需要严格的权限控制,确保: 患者隐私数据保护处方开具、审核、调配、发药等流程的合…

基于BM1684X+RK3588的智能工业视觉边缘计算盒子解决方案

智能工业视觉边缘计算终端技术方案书‌ ‌1. 产品概述‌ 1.1 产品定位 面向工业自动化场景的高性能AI视觉处理设备集成BM1684X(8TOPS INT8)AI加速芯片 RK3588(6TOPS NPU)异构计算支持工业级多相机接入、实时缺陷检测、高精度定…

软件工程中的 QFD

: 软件工程中的 QFD 在软件工程领域,随着市场竞争的加剧和用户需求的日益复杂,如何有效地将用户需求转化为软件产品,成为软件开发团队面临的重要挑战。而质量功能部署(Quality Function Deployment,QFD)作为一种强大的工具,为这一问题提供了有效的解决方案。 一、QF…

Vue2基础速成

一、准备工作 首先下载vue2的JavaScript库,并且命名为vue.min.js 下载链接:https://cdn.jsdelivr.net/npm/vue2(若链接失效可去vue官网寻找) CTRLS即可下载保存 文件目录结构 二、使用操作原生DOM与使用VUE操作DOM的便捷性比较…

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(14):かもしれません (~た・~ない)ほうがいいです

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(14):かもしれません &(~た・~ない)ほうがいいです 1、前言(1)情况说明(2)工程师…

传统银行服务和 区块链支付无缝融合的一种解决方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…

基于深度学习的毒蘑菇检测

文章目录 任务介绍数据概览数据处理数据读取与拼接字符数据转化标签数据映射数据集划分数据标准化 模型构建与训练模型构建数据批处理模型训练 文件提交结果附录 任务介绍 本次任务为毒蘑菇的二元分类,任务本身并不复杂,适合初学者,主要亮点…

时间给了我们什么?

时间给了我们什么? ​春秋易逝,青春难留,转瞬之间已过半百。 ​过往中,有得有失,这就是人生。 ​一日三餐四季,日起日落里,成就了昨天、今天和明天,在历史长河中,皆是…

软件工程国考

软件工程-同等学力计算机综合真题及答案 (2004-2014、2017-2024) 2004 年软工 第三部分 软件工程 (共 30 分) 一、单项选择题(每小题 1 分,共 5 分) 软件可用性是指( &#xff09…

数据结构*栈

栈 什么是栈 这里的栈与我们之前常说的栈是不同的。之前我们说的栈是内存栈,它是JVM内存的一部分,用于存储局部变量、方法调用信息等。每个线程都有自己独立的栈空间,当线程启动时,栈就会被创建;线程结束&#xff0c…

IntelliJ IDEA 保姆级使用教程

文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…

HTTP 快速解析

一、HTTP请求结构 HTTP请求和响应报文由以下部分组成(以请求报文为例): 请求报文结构: 请求行:包含HTTP方法(如GET/POST)、请求URL和协议版本(如HTTP/1.1,HTTP/2.0&…

【AI学习】李宏毅新课《DeepSeek-R1 这类大语言模型是如何进行「深度思考」(Reasoning)的?》的部分纪要

针对推理模型,主要讲了四种方法,两种不需要训练模型,两种需要。 对于reason和inference,这两个词有不同的含义! 推理时计算不是新鲜事,AlphaGo就是如此。 这张图片说明了将训练和推理时计算综合考虑的关系&…

Kotlin Flow流

一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头(数据源)和几个水杯(数据接收者): 普通 Flow(冷流):每个水杯来接水时,都要重新打开水龙头从…

【嵌入式Linux】基于ARM-Linux的zero2平台的智慧楼宇管理系统项目

目录 1. 需求及项目准备(此项目对于虚拟机和香橙派的配置基于上一个垃圾分类项目,如初次开发,两个平台的环境变量,阿里云接入,摄像头配置可参考垃圾分类项目)1.1 系统框图1.2 硬件接线1.3 语音模块配置1.4 …

Linux运维中常用的磁盘监控方式

在Linux运维中,磁盘监控是一项关键任务,因为它能帮助我们预防磁盘空间不足或性能问题导致的服务中断或数据丢失。让我们来看看有哪些常用的磁盘监控方法吧! 1. 查看磁盘使用情况(df命令) df命令用于显示文件系统的…