使用finsh 进行ota成功,线程里开ota失败

发布于 2020-07-29 09:45:50

我使用finsh控制台进行http_ota正常,放在线程中就卡在64%失败,请问这是为什么呢?

这是软件包升级函数:

void http_ota(uint8_t argc, char **argv)
{
    if (argc < 2)
    {
        rt_kprintf("using uri: " HTTP_OTA_URL "\n");
        http_ota_fw_download(HTTP_OTA_URL);
    }
    else
    {
        http_ota_fw_download(argv[1]);
    }
}
/**
 * msh />http_ota [url]
*/
MSH_CMD_EXPORT(http_ota, Use HTTP to download the firmware);

这是我的线程:

void update_thread_entry(void *parameter)
{

    while(1)
    {
        http_ota_fw_download(PKG_HTTP_OTA_URL);
    }
    
}

int update(void)
{
    update_thread = rt_thread_create("update_thread",update_thread_entry,RT_NULL,2048,3,10);
    if(update_thread != RT_NULL) rt_thread_startup(update_thread);
    return RT_EOK;
}
//INIT_APP_EXPORT(update);
MSH_CMD_EXPORT(update, Use HTTP to download the firmware);

使用finsh升级成功:
http_2.png

使用自己线程升级失败:
http1.png

查看更多

关注者
0
被浏览
431
Cfly
Cfly 认证专家 2020-07-30

我一般是这样实现的:
1.使用EasyFlash做变量的存储:URL地址、OTA使能标志
2.接收到OTA命令后,保存URL地址并将OTA标志使能,然后重启程序
3.启动后检查OTA标志是否使能,使能则其他多余的线程皆不创建,只创建与OTA关联的
4.OTA抓取文件重试多次,如果多次都失败或者抓取成功,OTA标志清0,然后重启
5.系统正常运行,如果是要连接云平台的话,每次连接成功都会上报当前软件版本。或者与上位机通信的话,上位机可以看到版本来判断有没有升级成功
6.由用户端查看升没升级成功来判断要不要再发升级指令

3 个回答
李子成
李子成 2020-07-29

可以看看这个帖子有可能有用。我当时是这个原因。你可以试试https://club.rt-thread.org/ask/question/423631.html

sgf201
sgf201 认证专家 2020-07-29

修改线程中升级的开始时间,排除启动开始的固定时间内通信模组工作还不稳定

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览