应用的要求是像电脑那样可以设置是否自动获取IP,
在rtconfig.h
文件中启用DHCP
,系统启动后可以获得路由器分配的IP,网络通讯功能应用正常。
因为在网络初始化过程中tcpip_init_done_callback()
函数内是根据判断LWIP_DHCP是否为1来选择执行
dhcp_start()或者
netif_set_up(),
我尝试了修改此处不让其执行
dhcp_start()`
即初始化时使用固定IP,这样启动后是机器预设的IP,网络通讯功能也正常。
然后在设置启用DHCP的应用处理中去执行dhcp_start()
,跟踪发现没有获得新的IP,并且还能使用原来的ip进行通讯,这样运行约几十秒后ethernetif
的ip、gw、netmask
都变成0,网络连接随之中断。
那么应该怎样进行运行中改变DHCP
的操作呢?请各位高人指点!
2.“这样运行约几十秒后ethernetif的ip、gw、netmask都变成0,”
原因是DHCP服务认为你的IP已经超过有效期,所以会清零。修改有效期,可以避免。
谢谢idonotknow指点,
今天又重新测试(代码没改)的结果是多数时候改变设置为DHCP变得有效了,但也出现像昨天那样失败的时候,可能是昨天测试不仔细的原因。所以确定路由的dhcp是开启的,但不知道为什么会出现有时失败的情况。
然后测试: “启用DHCP->间隔十几秒->关闭DHCP->…”
这样反复改变设置几次后会死机,反复的次数不定,一般在十次以内。
跟踪发现是执行dhcp_create_msg()
中的LWIP_ASSERT("dhcp_create_msg:dhcp->p_out==NULL",dhcp->p_out==NULL)
处不满足dhcp->p_out==NULL
的条件检查而被程序强制钉在此处,并且发现总是在第二次执行到这个地方时出错
第一次是应用线程设置启用DHCP时调用dhcp_start()后,执行线程为应用线程;
第二次是随后又立即执行到此处,执行线程为系统的tcpip线程;
难道是不允许除tcpip之外的其它线程调用dhcp_start()
吗?