高中生
最后登录1970-1-1
在线时间 小时
注册时间2018-7-5
|
本帖最后由 zx568073531 于 2019-8-12 17:42 编辑
很早之前就在关注野火的Lwip+FreeRTOS了,本人之前用lwip都是跑裸机,也用了tftp或者http来通过网口升级固件,
最近野火的lwip+FreeRTOS书籍和源码放出之后,就对其做了很多测试,效果确实很稳定,同时我在项目上原来遇到个问题
是因为用Eth库发现的问题,我以为 火哥应该会把这个问题解决,这个问题是 如果在初始化硬件时候,网口没有插入网线
的情况下,会一直在Eth初始化库里面等待 PHY读取到是否插入网线,耗费时间并且等超时之后在插入网线 网口和网络协议
依然无法使用。
在跑裸机的时候,没办法必须等,但是有了操作系统之后,问题就比较简单了,可以创建一个函数,循环读取PHY芯片
是否连接上了网口没有就 延时阻塞个 一段时间 再去读取是否有插入,有插入在来唤起所有关于网络的任务。
具体是这样做的:
uint8_t TCPIP_Init(void)
{
ip4_addr_t ipaddr;
ip4_addr_t netmask;
ip4_addr_t gw;
HAL_StatusTypeDef ETH_STATUS;
memset(&gnetif,0,sizeof(struct netif));
ETH_STATUS = Bsp_Eth_Init();
if (ETH_STATUS != HAL_OK)
{
return 1;
}
tcpip_init(NULL, NULL);
/* IP addresses initialization */
/* USER CODE BEGIN 0 */
#ifdef USE_DHCP
ip_addr_set_zero_ip4(&ipaddr);
ip_addr_set_zero_ip4(&netmask);
ip_addr_set_zero_ip4(&gw);
#else
IP4_ADDR(&ipaddr,IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3);
IP4_ADDR(&netmask,NETMASK_ADDR0,NETMASK_ADDR1,NETMASK_ADDR2,NETMASK_ADDR3);
IP4_ADDR(&gw,GW_ADDR0,GW_ADDR1,GW_ADDR2,GW_ADDR3);
#endif /* USE_DHCP */
/* USER CODE END 0 */
/* Initilialize the LwIP stack without RTOS */
/* add the network interface (IPv4/IPv6) without RTOS */
netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);
/* Registers the default network interface */
netif_set_default(&gnetif);
if (netif_is_link_up(&gnetif))
{
/* When the netif is fully configured this function must be called */
netif_set_up(&gnetif);
}
else
{
/* When the netif link is down this function must be called */
netif_set_down(&gnetif);
}
return 0;
}
然后主程序是这样做的 :
void AppCread(void *arg)
{
xTaskCreate((TaskFunction_t )Link_Cheack, /* 任务入口函数 */
(const char* )"Link_Cheack",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )(configMAX_PRIORITIES - 11), /* 任务的优先级 */
(TaskHandle_t* )&xLinkCheakTask);/* 任务控制块指针 */
if(pdPASS != xReturn)
for(;;);
}
static void Link_Cheack(void *arg)
{
vTaskDelay(30);
while(1)
{
/* 初始化协议栈和网口 */
if(TCPIP_Init() == 0)
{
/* UDP发送任务 */
Udp_Application();
/* Tftp任务*/
Tftp_Application_Create();
/* 插入了网线那么初始化网络 */
vTaskDelete(xLinkCheakTask); //删除当前任务
/* 切换任务 */
}
else
{
/* 没检测到,可以做自己想做的代码 */
}
vTaskDelay(500);
}
}
这个是以太网优化的,可能很多大哥都可能知道这个问题,小弟只不过为不知道的同学,学习一下。
tftp的程序我就后面再传了。
tftp.rar
(6.22 KB, 下载次数: 304)
|
|