嵌入式技术论坛
直播中

LL-LING宁

8年用户 1322经验值
擅长:电源/新能源
私信 关注
[问答]

为什么用RT-Thread+STM32F407ZGT6+ESP8266获取文件时会出错呢

rt-thread studio 2.1.0 + rtthread 4.0.3 + STM32F407ZGT6 + ESP8266

http ota 需使用https, 在setting中启用 mbedtls 支持

1.jpg

在获取文件时出现如下错误

2.jpg

回帖(8)

张辉

2022-9-15 14:20:44
确认一下用pc浏览器能成功下载
举报

LL-LING宁

2022-9-15 14:20:56
1、PC浏览器https可以成功下载,将下载后的文件通过ymodem可正常升级
2、MCU通过http OTA下载是没有问题的
3、添加NTP,模拟RTC后,MCU https 问题依旧。

1.jpg
举报

张辉

2022-9-15 14:21:16
0x7200错误是一个常见错误,是因为空间不足导致的。
1.jpg


举报

LL-LING宁

2022-9-15 14:21:30
打开mbedtls调试信息,显示mbedtls的交互是正常的,如下:
1.jpg
但此处出现[E/at.skt.esp] no memory receive buffer(2824).错误。

举报

张辉

2022-9-15 14:21:46
也需要增加线程栈的大小。
举报

张辉

2022-9-15 14:21:57
这个就是 at socket 的问题了,0x7200是 mbedtls 的报错。
recv_buf = (char *) rt_calloc(1, bfsz);
    if (recv_buf == RT_NULL)
    {
        LOG_E("no memory receive buffer(%d).", bfsz);
        /* read and clean the coming data */
        while (temp_size < bfsz)
        {
            if (bfsz - temp_size > sizeof(temp))
            {
                at_client_obj_recv(client, temp, sizeof(temp), timeout);
            }
            else
            {
                at_client_obj_recv(client, temp, bfsz - temp_size, timeout);
            }
            temp_size += sizeof(temp);
        }
        return;
    }
2K 多的空间都没有办法申请?这问题就有点大了。
举报

LL-LING宁

2022-9-15 14:22:16
初始化完成后 HEAP_BEGIN = 0X20001FC8, HEAP_END = 0X20020000,动态堆约120K (407的片内RAM是128K,如下图)
1.jpg
另写了小程序,连续rt_calloc地址:

rt_size_t bfsz = 2824;   //上速出错时,需要分配的大小
ptr =  rt_calloc(1, bfsz);
可成功分配40个内存块(40*2824 = 约110K),分配第41个时出错
则证明上面展示的代码处,已经分配不大2K大小的连续内存,可能是RAM几乎被全部占用,或全被碎片占用,分配不到2K的连续空间。
举报

张辉

2022-9-15 14:22:32
建议小内存分配算法更换为其他的内存算法,如果问题推进到内存管理算法的问题,这也不太合理。内存回收策略是在 idle 线程里合并相邻的内存块。
再更换内存算法无果后,建议查到其他方面的问题;比如:
是不是在添加 mbedtls 后剩余的 raw 空间太小,可以考虑优化 mbedtls 的空间占用;
处理其他线程 malloc 逻辑是否合理,是否有内存泄露的情况;
如果都没有问题,建议更换资源更大的芯片。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分