当前位置: 首页 > news >正文

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

相关文章:

  • springboot中使用Elasticsearch
  • 物流自动化移动机器人|HEGERLS三维智能四向穿梭车助力优化企业供应链
  • go语言-字符串处理的常用函数
  • 微服务架构中的关键组件:Dubbo、Nacos、Feign 和 Eureka
  • 【Spark系列5】Dataframe下常用算子API
  • springboot整合rabbitmq,及各类型交换机详解
  • SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)
  • Go语言学习踩坑记
  • MacOS安装JDK+Maven+Idea插件+nvm等
  • 记录element-plus树型表格的bug
  • 重写Sylar基于协程的服务器(5、IO协程调度模块的设计)
  • Http请求Cookie失效问题
  • Visual Studio 2022 查看类关系图
  • 分享一个WPF项目
  • MongoDB的索引与索引字段的顺序
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 08.Android之View事件问题
  • DOM的那些事
  • SpingCloudBus整合RabbitMQ
  • 百度小程序遇到的问题
  • 笨办法学C 练习34:动态数组
  • 大数据与云计算学习:数据分析(二)
  • 高程读书笔记 第六章 面向对象程序设计
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端设计模式
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 在weex里面使用chart图表
  • 如何用纯 CSS 创作一个货车 loader
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (16)Reactor的测试——响应式Spring的道法术器
  • (31)对象的克隆
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一) springboot详细介绍
  • (一)SpringBoot3---尚硅谷总结
  • (转)VC++中ondraw在什么时候调用的
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .sdf和.msp文件读取
  • .stream().map与.stream().flatMap的使用
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例