STM32F407移植OpenHarmony笔记8

继上一篇笔记,成功开启了littlefs文件系统,能读写FLASH上的文件了。
今天继续研究网络功能,让控制台的ping命令能工作。


轻量级系统使用的是liteos_m内核+lwip协议栈实现网络功能,需要进行配置开启lwip支持。

lwip的移植分为两部分,一部分是sys_arch用于适配rtos,这部分liteos_m已经实现了,
相关代码在:/kernel/liteos_m/components/net/lwip-2.1/porting/src

另一部分则是网卡驱动的适配,这部分代码适配起来和其它平台基本一样。
自己写一个ethernetif.c,在里面实现ethernetif_init,完成网卡初始化。
并定义一个struct netif实例,指定一些参数(如下),具体代码可以抄官方demo。

netif->name[0] = 'e';
netif->name[1] = 'n';
netif->output = etharp_output;
netif->linkoutput = low_level_output;

网卡驱动的大概流程:

ethernetif_init由lwip在添加网卡的时候调用,初始化底层ETH模块;
然后创建一个线程和信号量,用于接收ETH的数据 ;
在接收线程里等待信号量,在ETH中断里发送信号量,唤醒接收线程;
接收线程调用low_level_input读取ETH数据放入pbuf中,并返回这个pbuf;
最后将pbuf丢给netif->input处理,这个函数在/third_party/lwip/src/netif/ethernet.c里面。
当协议栈要发送数据时,它会调用low_level_output,数据放在pbuf参数里面。

    struct pbuf *p;struct netif *netif = (struct netif *)&stm32_netif;for (;;){if (osSemaphoreAcquire(ethSemaphore, osWaitForever) == osOK){do {p = low_level_input(netif);if (p != NULL){if (netif->input(p, netif) != ERR_OK){pbuf_free(p);}}} while (p != NULL);}}

这里简单记录一下lwip的初始化过程:

1. 在内核初始化完成之后,调用tcpip_init(NULL, NULL);初始化lwip。

2. 然后调用netif_add向lwip添加网卡,指定默认IP地址,网关等信息。

netif_add(&stm32_netif, &ipaddr, &netmask, &gateway, NULL, &ethernetif_init, &ethernet_input);
netif_set_default(&stm32_netif);
netif_set_up(&stm32_netif);

3. 如果需要DHCP获取IP,则启动dhcp client。

dhcp_start(&stm32_netif);
dhcp_supplied_address(&stm32_netif); //判断DHCP状态

lwip的初始化就完成了。


抄完代码就开始编译调试,可以看到eth初始化的一些日志,然后ifconfig命令也能用了。
但是却发现ping不通其它IP,还要继续调试,找找原因。

 经过一番研究,最后发现在/kernel/liteos_m/components/net/lwip-2.1/porting/include/lwip/lwipopts.h
这里面定义了ETH_PAD_SIZE=2,导致lwip数据解析错位,要把它改为0。

#define ETH_PAD_SIZE  0 //从2改为0

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

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

相关文章

计算机图形学 实验

题目要求 1.1 实验一:图元的生成:直线、圆椭区域填充 你需要完成基本的图元生成算法,包括直线和椭圆。 在区域填充中,要求你对一个封闭图形进行填充。你需要绘制一个封 闭图形(例如多边形),并选…

HTTP和HTTPS区别!

http 是我们几乎天天都要打交道的东西,相关知识点有点多,所以也有不少面试必问的点,这里做了一些整理,帮且大家树立完整的 http 知识体系,对面试官说 so easy HTTP 的特点和缺点 特点:无连接、无状态、灵…

网络时间协议NTP工作模式

单播服务器/客户端模式 单播服务器/客户端模式运行在同步子网中层数较高层上。这种模式下,需要预先知道服务器的IP地址。 客户端:运行在客户端模式的主机(简称客户端)定期向服务器端发送报文,报文中的Mode字段设置为3(客户端模式)。当客户端接收到应答报文时,客户端会…

MATLAB拟合正态分布(附完整代码和数据)

使用MATLAB拟合正态分布的主要步骤是: 输入样本数据 使用变量x保存样本数据,例如: x [1.2, 3.4, 2.1, 0.5, 4.3]; 调用正态分布的最大似然估计函数 使用normfit函数来完成正态分布的参数的最大似然估计: [mu_hat,sigma_hat] normfit(x); normfit函数会返回正态分布位置…

查看自己电脑是arm还是x64(x86)

linux 参考: https://liuweiqing.blog.csdn.net/article/details/131783851 uname -a如果输出是 x86_64,那么你的系统是 64 位的 x86 架构(通常我们称之为 x64)。如果输出是 armv7l 或者以 arm 开头的其他值,那么你的…

FS【2】:CAT-Net

文章目录 前言AbstractIntroductionMethodsProblem DefinitionNetwork OverviewMask Incorporated Feature ExtractionCross Masked Attention TransformerSelf-Attention ModuleCross Masked Attention ModulePrototypical Segmentation Module Iterative Refinement Framewor…

使用 IDEA 开发一个简单易用的 SDK

目录 一、什么是 SDK 二、为什么要开发 SDK 三、开发 SDK 的详细步骤 四、导入 SDK 进行测试 附:ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义:软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…

【2024年美国大学生数学建模竞赛】F题完整解析(问题分析、数学模型、实现代码、参考论文)

减少非法野生动物贸易的综合数据驱动项目 写在前面摘要1、问题重述1.1、问题背景:1.2、问题描述: 1.3子问题详述:1. 客户选择:2. 项目适应性和支持:3. 客户资源和权力需求:4. 项目影响分析:5. 成…

爬虫(二)使用urllib爬取百度贴吧的数据

下一期我就不用urllib来抓取数据了,因为urllib现在已经很少人用,大部分人用得是requests,requests也是基于底层urllib的一个模块。 首先我先来讲一下关于如何使用动态的UA! 动态UA就是指在自己创建的一个列表里随机选择一个UA当做…

centOS/Linux系统安全加固方案手册

服务器系统:centos8.1版本 说明:该安全加固手册最适用版本为centos8.1版本,其他服务器系统版本可作为参考。 1.账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险。 操作步骤  使用命令 userdel <用户名> 删除不必要的账号。  使用命令 passwd…

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll 2024/2/2 10:48 https://blog.csdn.net/feinifi/article/details/132548556 Could not locate cudnn_ops_infer64_8.dll. Please make sure it is in your library path!解决办法 安装cuDNN c:\faster-whisper-…

芯片设计公司ERP管理生产流程:从设计到制造的全面优化

随着科技的飞速发展&#xff0c;芯片设计公司在整个电子产业链中的地位日益重要。为了提高生产效率、降低成本&#xff0c;许多芯片设计公司选择引入ERP(企业资源计划)管理系统来优化生产流程。本文将详细介绍芯片设计公司如何利用ERP管理生产流程。 一、ERP系统概述 ERP系统是…