野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12889|回复: 7

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

[复制链接]
发表于 2019-7-6 10:19:20 | 显示全部楼层 |阅读模式
本帖最后由 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, 下载次数: 289)

回复

使用道具 举报

发表于 2019-7-6 11:06:44 | 显示全部楼层
cool
回复

使用道具 举报

 楼主| 发表于 2019-7-6 13:37:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2019-8-7 17:19:23 | 显示全部楼层
送你一个优秀图章。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-12 17:23:07 | 显示全部楼层
fire 发表于 2019-8-7 17:19
送你一个优秀图章。

哇、谢谢火哥
回复 支持 反对

使用道具 举报

发表于 2020-10-27 19:39:49 | 显示全部楼层
本帖最后由 agoodog 于 2020-10-27 20:24 编辑

顶顶顶顶
回复

使用道具 举报

发表于 2020-10-27 19:40:36 | 显示全部楼层
请问这个socket支持热插拔网线吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-8 16:50:10 | 显示全部楼层
agoodog 发表于 2020-10-27 19:40
请问这个socket支持热插拔网线吗?

只要初始化成功 ETH之后,支持热拔插网线的
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-23 21:27 , Processed in 0.032583 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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