硬汉嵌入式论坛

 找回密码
 立即注册
查看: 368|回复: 6
收起左侧

[以太网] STM32H7适配lwip在监听netif->flags一直为0

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2025-8-14 19:36:12 | 显示全部楼层 |阅读模式
STM32H750芯片一直lwip, 使用netif_add_ext_callback注册回调监听网口的状态变化, 回调中输出的netif->flags参数一直是0不会变化, 但是在netif_invoke_ext_callback函数前后打印flags的参数是有变化的, 并且 netif 指针指向的地址都是同一个地址, 输出的值却不相同

// 注册回调函数如下
void NetStatusCallback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args)
{
    struct netif *netifFind = netif_find("st0");
    if (netif != NULL) {
        printf("==Test== NetStatusCallback netif = 0x%x, netif->flags = 0x%x, netifFind = 0x%x, netifFind->flags = 0x%x, flags_copy = 0x%x\r\n",
            netif, netif->flags, netifFind, netifFind->flags);
    } else {
        printf("==Test== NetStatusCallback netif is NULL\r\n");
    }
}

NETIF_DECLARE_EXT_CALLBACK(netifCallback);
netif_add_ext_callback(&netifCallback, NetStatusCallback);

日志如下:
netif_invoke_ext_callback: callback = 0xc00375e1, netif = 0x2400fc00, netif->flags = 0x2f
==Test== NetStatusCallback netif = 0x2400fc00, netif->flags = 0x0
==Test== netif_invoke_ext_callback inner: callback = 0xc00375e1, netif = 0x2400fc00, netif->flags = 0x2f


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-8-16 09:06:04 | 显示全部楼层
帮顶,没测试过这个,可以考虑直接定时读取PHY的状态寄存器看看,比如网线插拔什么的,不知道这个回调是不是返回的这个状态。
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-8-18 11:39:19 | 显示全部楼层
找到问题了使用的是liteos-m内核, liteos-m内核中扩展了netif结构体导致lwip和内核中扩展的netif结构体差了4个字节导致没有对齐成员变量错位导致的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-8-19 08:37:01 | 显示全部楼层
eMaskTh 发表于 2025-8-18 11:39
找到问题了使用的是liteos-m内核, liteos-m内核中扩展了netif结构体导致lwip和内核中扩展的netif结构体差了 ...

谢谢告知最终原因
回复

使用道具 举报

0

主题

57

回帖

57

积分

初级会员

积分
57
发表于 2025-8-19 08:49:42 | 显示全部楼层
eMaskTh 发表于 2025-8-18 11:39
找到问题了使用的是liteos-m内核, liteos-m内核中扩展了netif结构体导致lwip和内核中扩展的netif结构体差了 ...

有点没看明白,请问是 liteos-m内核修改了netif结构体的定义吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-8-20 08:32:25 | 显示全部楼层
bricle 发表于 2025-8-19 08:49
有点没看明白,请问是 liteos-m内核修改了netif结构体的定义吗

这个对齐问题,大概率是设置了lwip使用ram缓存空间配置MPU Stongly order或者Device模式
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-8-21 09:29:27 | 显示全部楼层
bricle 发表于 2025-8-19 08:49
有点没看明白,请问是 liteos-m内核修改了netif结构体的定义吗

openharmony liteos-m内核中的netif.h扩展了lwip的部分结构
liteos_m/components/net/lwip-2.1/porting/include/lwip/netif.h

https://gitee.com/openharmony/ke ... nclude/lwip/netif.h

#define netif_find netifapi_netif_find_by_name

#if LWIP_DHCPS
#define LWIP_NETIF_CLIENT_DATA_INDEX_DHCP   LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, \
                                            LWIP_NETIF_CLIENT_DATA_INDEX_DHCPS
#endif

#define linkoutput      linkoutput; \
                        void (*drv_send)(struct netif *netif, struct pbuf *p); \
                        u8_t (*drv_set_hwaddr)(struct netif *netif, u8_t *addr, u8_t len); \
                        void (*drv_config)(struct netif *netif, u32_t config_flags, u8_t setBit); \
                        char full_name[IFNAMSIZ]; \
                        u16_t link_layer_type
#include_next <lwip/netif.h>
#undef linkoutput
#if LWIP_DHCPS
#undef LWIP_NETIF_CLIENT_DATA_INDEX_DHCP
#endif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 23:53 , Processed in 0.042972 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表