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参数里面。

cpp 复制代码
    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地址,网关等信息。

cpp 复制代码
netif_add(&stm32_netif, &ipaddr, &netmask, &gateway, NULL, &ethernetif_init, &ethernet_input);
netif_set_default(&stm32_netif);
netif_set_up(&stm32_netif);
  1. 如果需要DHCP获取IP,则启动dhcp client。
cpp 复制代码
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。

cpp 复制代码
#define ETH_PAD_SIZE  0 //从2改为0
相关推荐
偶像你挑的噻1 小时前
11-Linux驱动开发-I2C子系统–mpu6050简单数据透传驱动
linux·驱动开发·stm32·嵌入式硬件
强化学习与机器人控制仿真3 小时前
RSL-RL:开源人形机器人强化学习控制研究库
开发语言·人工智能·stm32·神经网络·机器人·强化学习·模仿学习
bai5459363 小时前
STM32 PWM驱动LED呼吸灯
stm32·单片机·嵌入式硬件
坚果派·白晓明7 小时前
通过开源鸿蒙终端工具Termony完成Make 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
坚果派·白晓明8 小时前
通过开源鸿蒙终端工具Termony完成Talloc 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
btzhy9 小时前
STM32单片机:基本定时器应用:单脉冲模式(STM32L4xx)
stm32·单片机·嵌入式硬件·基本定时器应用:单脉冲模式
文sir.11 小时前
温湿度采集系统(stm32+mqtt+Onenet云平台+esp8266)
stm32·单片机·嵌入式硬件·mqtt·onenet·云平台·esp8266
DIY机器人工房11 小时前
嵌入式面试题:你有没有用过直接基于TCP协议,不借助HTTP、MQTT这类上层协议的项目经历?
stm32·单片机·嵌入式硬件·面试题·diy机器人工房
坚果派·白晓明11 小时前
通过开源鸿蒙终端工具Termony完成PCRE2 命令行工具构建过程深度解读
openharmony·开源鸿蒙·开源软件termony
编程小白菜12313 小时前
STM32L051单片机485Ymode升级后程序不能正常运行问题
stm32·嵌入式硬件