zx568073531 发表于 2019-7-6 10:19:20

Lwip+FreeRTOS 做的socket.TFTP远程升级固件(和程序优化)

本帖最后由 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的程序我就后面再传了。


想讲你知 发表于 2019-7-6 11:06:44

cool

zx568073531 发表于 2019-7-6 13:37:38

想讲你知 发表于 2019-7-6 11:06
cool

谢谢,:lol

fire 发表于 2019-8-7 17:19:23

送你一个优秀图章。

zx568073531 发表于 2019-8-12 17:23:07

fire 发表于 2019-8-7 17:19
送你一个优秀图章。

哇、谢谢火哥:lol

agoodog 发表于 2020-10-27 19:39:49

本帖最后由 agoodog 于 2020-10-27 20:24 编辑

顶顶顶顶

agoodog 发表于 2020-10-27 19:40:36

请问这个socket支持热插拔网线吗?

zx568073531 发表于 2020-12-8 16:50:10

agoodog 发表于 2020-10-27 19:40
请问这个socket支持热插拔网线吗?

只要初始化成功 ETH之后,支持热拔插网线的
页: [1]
查看完整版本: Lwip+FreeRTOS 做的socket.TFTP远程升级固件(和程序优化)