Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
netdev
drv_eth_以太网驱动
10
nucleo-stm32h743 bsp SAL网卡无法重新初始化
发布于 2023-08-07 10:43:47 浏览:521
订阅该版
我的开发板是nucleo-stm32h743,有线以太网驱动用的是 `D:\rt-thread-gitee_master\bsp\stm32\libraries\HAL_Drivers\drv_eth.c`。 开启了SAL、NetDev组件,这个驱动使用起来是OK的,电脑能ping通开发板。 我看驱动源码里面初始化网卡调用的是`eth_device_init(&(stm32_eth_device.parent), "e0");` 我现在遇到业务需求,需要在不重启的情况下,重新初始化网卡,我尝试调用 `eth_device_deinit(&(stm32_eth_device.parent))`然后`delay 1`秒再重新调用 `eth_device_init(&(stm32_eth_device.parent), "e0")`, 但是经过测试发现不行,终端直接卡住了,电脑也无法ping通开发板了。
查看更多
3
个回答
默认排序
按发布时间排序
bigfanofRTOS
2023-08-07
有啥好写的,一边凉快去!
补充:卡住这个问题原因找到了,调用eth_device_deinit函数后,里面会调用sal_socket.c里面的sal_netdev_cleanup。源码的本意是循环搜索socket_table.sockets,找不到了就退出,找到了就继续循环,这个sal_netdev_cleanup应该是等待创建的socket主动close掉,我的终端卡住原因应该是socket没有关闭,所以那个socket_table里面的socket没有被删除,导致sal_netdev_cleanup无法退出。 我以为eth_device_deinit这个函数的本意就是反初始化,没想到它还要等待socket资源的释放。 那么在特殊应用场景下,有没有方法能直接重新初始化网卡呢?这个eth_device_deinit里面要是能自动释放socket资源就好了。 ps:我的最终目的是动态修改mac地址,看官方提供的驱动ethernetif.c里面的初始化函数 ```c struct netif* p_g_netif = NULL; rt_err_t eth_device_init_with_flag(struct eth_device *dev, const char *name, rt_uint16_t flags) { struct netif* netif; #if LWIP_NETIF_HOSTNAME #define LWIP_HOSTNAME_LEN 16 char *hostname = RT_NULL; netif = (struct netif*) rt_calloc (1, sizeof(struct netif) + LWIP_HOSTNAME_LEN); #else netif = (struct netif*) rt_calloc (1, sizeof(struct netif)); #endif if (netif == RT_NULL) { rt_kprintf("malloc netif failed\n"); return -RT_ERROR; } /* set netif */ dev->netif = netif; dev->flags = flags; /* link changed status of device */ dev->link_changed = 0x00; /* avoid send the same mail to mailbox */ dev->rx_notice = 0x00; dev->parent.type = RT_Device_Class_NetIf; /* register to RT-Thread device manager */ rt_device_register(&(dev->parent), name, RT_DEVICE_FLAG_RDWR); /* set name */ netif->name[0] = name[0]; netif->name[1] = name[1]; /* set hw address to 6 */ netif->hwaddr_len = 6; /* maximum transfer unit */ netif->mtu = ETHERNET_MTU; /* set linkoutput */ netif->linkoutput = ethernetif_linkoutput; /* get hardware MAC address */ rt_device_control(&(dev->parent), NIOCTL_GADDR, netif->hwaddr); rt_kprintf("read mac:\n"); rt_kprintf("0x%02x\n",netif->hwaddr[0]); rt_kprintf("0x%02x\n",netif->hwaddr[1]); rt_kprintf("0x%02x\n",netif->hwaddr[2]); rt_kprintf("0x%02x\n",netif->hwaddr[3]); rt_kprintf("0x%02x\n",netif->hwaddr[4]); rt_kprintf("0x%02x\n",netif->hwaddr[5]); p_g_netif = netif; #if LWIP_NETIF_HOSTNAME /* Initialize interface hostname */ hostname = (char *)netif + sizeof(struct netif); rt_sprintf(hostname, "rtthread_%02x%02x", name[0], name[1]); netif->hostname = hostname; #endif /* LWIP_NETIF_HOSTNAME */ /* if tcp thread has been started up, we add this netif to the system */ if (rt_thread_find("tcpip") != RT_NULL) { #if LWIP_VERSION_MAJOR == 1U /* v1.x */ struct ip_addr ipaddr, netmask, gw; #else /* >= v2.x */ ip4_addr_t ipaddr, netmask, gw; #endif /* LWIP_VERSION_MAJOR == 1U */ //@@ // #if !LWIP_DHCP ipaddr.addr = inet_addr(RT_LWIP_IPADDR); gw.addr = inet_addr(RT_LWIP_GWADDR); netmask.addr = inet_addr(RT_LWIP_MSKADDR); // #else // IP4_ADDR(&ipaddr, 0, 0, 0, 0); // IP4_ADDR(&gw, 0, 0, 0, 0); // IP4_ADDR(&netmask, 0, 0, 0, 0); // #endif netifapi_netif_add(netif, &ipaddr, &netmask, &gw, dev, eth_netif_device_init, tcpip_input); } void set_dns(uint8_t dns_num, char* dns_server); set_dns(0, RT_LWIP_GWADDR); return RT_EOK; } ``` 里面是通过netif指针将mac传递给了lwip,我定义了全局指针p_g_netif指向netif,企图在应用层通过p_g_netif->hwaddr[0] = 0x11这样的方式修改mac,但是发现不行,直接就ping不通了。 网上搜了下RTT怎么改mac,结果是这样的,但是我没有找到netdev_set_macaddr这个API ![捕获.PNG](https://oss-club.rt-thread.org/uploads/20230807/074d49d745d8cad2d7276e932a36ffb5.png.webp)
xiaorui
认证专家
2023-08-07
小睿手办 https://item.taobao.com/item.htm?id=674889867009
为啥要重启网卡呢?且还需要重新调用最上面的Init,这样会重复注册。 如果仅是重新初始化emac,可以参考PHY驱动里面发现速率改变后的操作就行。
红枫
认证专家
2023-08-07
这家伙很懒,什么也没写!
驱动中open和close没实现,你可以增加实现,然后通过open、close实现重启网卡。或是在control中增加RESET命令,实现网卡复位重启。
撰写答案
登录
注册新账号
关注者
0
被浏览
521
关于作者
bigfanofRTOS
有啥好写的,一边凉快去!
提问
7
回答
49
被采纳
0
关注TA
发私信
相关问题
1
netdev.h头文件不能被其他c文件包含,否则报错
2
mqtt pipe 里面使用到了dfs, socket 是怎么关联起来dfs的?
3
netdev中link_down和internet_down怎么解决?
4
ETHIF_LINK_PHYUP和ETHIF_LINK_AUTOUP有什么用
5
netdev 网卡 挂载W5500
6
netdev网卡回调函数在internetup时不会触发
7
多网卡情况下如果做到哪个网卡优先通信
8
ifconfig ,netdev等 功能bug,死机
9
netdev设备状态标志位异常,无法上线?
10
HC32F460 AT设备 发送数据就崩溃
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部