乐鑫技术交流
直播中

李春梅

7年用户 1771经验值
私信 关注
[问答]

ESP-TLS内存问题求解

我是 ESP32 的新手,偶然发现了一个让我整日/整夜都无法入睡的问题:我试图让 esp_tls 库正常工作并尝试按照示例进行操作,但发现内存中有些东西乱七八糟:

我想连接到 https 服务器并使用示例代码 like_tls

= esp_tls_conn_http_new(WEB_URL, &cfg);

但在那之后,由于写/读回调的地址非法,代码崩溃了。这让我在 esp_tls.c 中添加了一些行,比如
代码:全选
    /* Connect to host */
    if (esp_tls_conn_new_sync(&url[u.field_data[UF_HOST].off], u.field_data[UF_HOST].len,
                     get_port(url, &u), cfg, tls) == 1) {
printf( "DEEP UNDER 3. tls = %p, read = %p, write = %pn", tls, tls->read, tls->write );                        
                return tls;                                                
    }
    return NULL;

函数调用后tls指针不变,但结构内容被完全覆盖:
代码:全选
DEEP UNDER 3. tls = 0x3ffba908, read = 0x400d29f8, write = 0x400d2998


并在调用 tls = esp_tls_conn_http_new(WEB_URL, &cfg); 返回时
代码:全选
A. tls struct. tls = 0x3ffba908, read = 0x0, write = 0x0


ESP32 到底是什么可以再次用 0 覆盖结构?这两个 printf 实际上被称为分开的 2 个语句!

我添加了对 heap_caps_check_integrity_all 的调用,但没有成功。我创建了具有大量内存的任务:
    xTaskCreate(&wpa2, "wpa2", 4096*4, NULL, 5, NULL);

然后我向 esp_tls.c/esp_tls.h 添加了一个函数,看看是否有助于澄清问题,但情况变得更糟:

添加到 esp_tls.c
代码:全选
struct esp_tls * t1( struct esp_tls *tls )
{
    printf( "t1 tls = %p, read = %pn", tls, tls->read );
    tls->read = 0xababab;
    printf( "t1 tls = %p, read = %pn", tls, tls->read );

    return tls;
}

在我的调用函数中:
代码:全选
    struct esp_tls t_, *t;
    memset( &t_, 0, sizeof(esp_tls_t));
    t = &t_;
heap_caps_check_integrity_all( true );
    t = t1( t );
heap_caps_check_integrity_all( true );
    printf( "After t1 tls = %pn", t );
    printf( "After t1 tls = %p, read = %pn", t, t->read );
   
终端显示令人费解的
代码:全选
t1 tls = 0x3ffc9c50, read = 0x0
t1 tls = 0x3ffc9c50, read = 0xababab
After t1 tls = 0x3ffc9c50
After t1 tls = 0x3ffc9c50, read = 0x0

这里的“我的”记忆发生了什么?为什么在返回 main 时库中设置的值会被覆盖?


更多回帖

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