【ESP32】问题汇总 更新中

问题汇总

  • 【已解决待验证】Openocd debug

Unable to start debugging.Unexpected GDB output from command"-interpreter-exec console"target remot:3333"".Remote communication error. Target disconnected.:Connection reset by peer

  • 【已解决】关于usb转串口你永远可以相信Zadig

  • 无论PL2303还是其他

  • 在这里插入图片描述

  • 唯一要注意的是不要找错usb设备,把键盘鼠标的usb驱动刷了,不然哭都不知道怎么哭

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 【已解决】openocd无法连接电脑

openocd服务

JTAG端口和GPIO冲突,修复后ok。

在这里插入图片描述

zadig-2.7.exe ->Option->List All Devices->select(Interface 0)->Replace Driver->OK

  • 【未解决】-- Detecting C compiler ABI info - failed

在这里插入图片描述

在这里插入图片描述

提示的问题是ram溢出了,manucofig文件配废了,用beyondcompare对比修复

  • 【已解决】vscode启动openocd之后,按debug键后的问题 -> telnet

在这里插入图片描述

应该是电脑的telnet服务没开
关于telnet测试 👇
www.telnet.org 👇

telnet towel.blinkenlights.nl
telnet freechess.org 5000
telnet telehack.com
telnet bbs.newsmth.net 
telnet bbs.fudan.edu.cn

【存疑】IRAM0 segment data does not fit

"Does not fit"在这里的意思是指划分数据所采用的方法或模型不适合该数据集。也可以理解为数据无法被准确地归类或划分。
GPT说的,就是RAM不够了。。。可能吧

idf.py menuconfig

【这里】

vTaskList的使用

Enable FreeRTOS trace facility
Component config > FreeRTOS > Kernel > CONFIG_FREERTOS_USE_TRACE_FACILITY
Enable display of xCoreID in vTaskList
Component config > FreeRTOS > Kernel > CONFIG_FREERTOS_USE_TRACE_FACILITY > CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS

如下是使用了外部MALLOC_CAP_SPIRAM去打印了vTaskListvTaskGetRunTimeStats

#if (configUSE_STATS_FORMATTING_FUNCTIONS == 1) && (configUSE_TRACE_FACILITY == 1)
                char *pbuffer = ((char *)heap_caps_malloc(1024 * 1, MALLOC_CAP_SPIRAM));
                vTaskList(pbuffer);
                printf("\r\n%s\r\n", pbuffer);
                free(pbuffer);
#endif
#if (configGENERATE_RUN_TIME_STATS == 1) && (configSUPPORT_DYNAMIC_ALLOCATION == 1) && (configUSE_STATS_FORMATTING_FUNCTIONS == 1)
                char *mypbuffer = ((char *)heap_caps_malloc(1024 * 1, MALLOC_CAP_SPIRAM));
                vTaskGetRunTimeStats(mypbuffer);
                printf("%s", mypbuffer);
                free(mypbuffer);
#endif
  • heap_caps_malloc与malloc

ESP-IDF是一个基于ESP32和ESP8266的开发框架,它提供了一些内存管理函数,包括heap_caps_malloc和malloc。它们的主要区别在于:
内存分配方式:malloc函数从默认的堆中分配内存,而heap_caps_malloc函数从可配置的堆中分配内存。可配置的堆是一块特定的内存区域,可以通过调用heap_caps_init函数来初始化。
内存大小限制:malloc函数可以分配任意大小的内存块,但是heap_caps_malloc函数只能分配在配置的堆大小内的内存块。如果需要分配更大的内存块,则需要使用heap_caps_malloc_ext函数。
内存对齐:heap_caps_malloc函数可以指定所需的内存对齐方式,而malloc只能保证4字节对齐。
内存类型:heap_caps_malloc函数可以分配特定类型的内存,例如DMA、内核等类型的内存。
使用heap_caps_malloc函数的优势在于,它可以更好地管理内存,提高系统的稳定性和可靠性。同时,它还可以提供更多的内存分配选项,例如对齐方式和内存类型等。但是,使用heap_caps_malloc函数也有一些条件:
需要事先初始化可配置的堆。
可配置的堆的大小是有限的,必须根据应用程序的需求进行合理的配置。
heap_caps_malloc函数的执行速度可能比malloc函数慢,因为它需要更多的内存管理操作。
因此,在使用heap_caps_malloc函数之前,需要仔细考虑应用程序的需求和可用的内存资源,以确保选择正确的内存分配函数。

  • 跑在外部ram的变量与任务

  • 变量

char *pbuffer = ((char *)heap_caps_malloc(1024 * 1, MALLOC_CAP_SPIRAM));
  • 任务

#define STACK_SIZE (3 * 1024)
EXT_RAM_ATTR StackType_t external_static_stack[STACK_SIZE];
StaticTask_t external_ram_task_TCB;
xTaskCreateStatic(external_ram_task, "external_ram_task", STACK_SIZE, NULL, 3, external_static_stack, &external_ram_task_TCB)
  • 【概念】链接文件相关

  • .ld文件

    在这里插入图片描述
    PROVIDE 是一个链接脚本的关键字,用于指定特定的符号或变量在编译链接时应该放在哪个地址。在链接脚本中, PROVIDE 的语法格式为:
    PROVIDE symbol_name = symbol_location;
    其中 symbol_name 为符号或变量的名字,symbol_location 为该符号或变量的地址。使用 PROVIDE 可以确保在链接时为特定的符号或变量分配正确的地址,从而实现可靠的链接。

  • 【实践】有意思的宏

  • 条件宏

#define APP_STREAM_LOG#define APP_STREAM_LOG 1都是预处理指令用来定义一个宏,但是它们的使用方式有所不同。
#define APP_STREAM_LOG是将APP_STREAM_LOG这个宏定义为一个没有值的宏,意味着在代码中每次出现APP_STREAM_LOG都会被替换为一个空值。这种方式通常用于宏的开关,可以通过注释或者取消注释这个#define语句来控制宏的使用或者关闭
#define APP_STREAM_LOG 1则将APP_STREAM_LOG这个宏定义为一个有值的宏,其值为1。这种方式常用于开启或关闭编译时的某些特性或功能。如果在代码中需要使用这个宏,则必须判断它的值是否为1或者是否有定义。
#if和#ifdef是用来控制代码的编译条件指令,它们的使用方式如下:
#if的作用是当括号内的表达式求值为真(非0)的时候,编译器编译#ifdef#if类似,它的作用是判断某个宏是否已经被定义。如果宏已经被定义,则编译括号内的代码。
因此,当使用#define APP_STREAM_LOG时,可以通过#ifdef APP_STREAM_LOG#ifdef APP_STREAM_LOG 1来判断宏是否被定义,可以使用#if APP_STREAM_LOG#if APP_STREAM_LOG == 1来控制代码是否需要被编译

  • ONCE()

#define ONCE_prv(fun, line)               \
    do                                    \
    {
                                          \
        static int __once_flag##line = 0; \
        if (!__once_flag##line)           \
        {
                                      \
            __once_flag##line = 1;        \
            fun;                          \
        }                                 \
    } while (0)
#define ONCE_min(fun, line) ONCE_prv(fun, line)
#define ONCE(fun) ONCE_min(fun, __LINE__)
#include <assert.h>

// 连接标识符(非字符串连接成非字符串,字符串连接成字符串)
#define __JOIN(x,y) x##y

// 将参数转换成字符(x长度小于5,否则会溢出)
#define __CHAR(x)   #@x

// 将x变成字符串(如果x是宏也不展开)
#define __S(x)   #x

// 将x变成T字符串(如果x是宏也不展开)
#define __ST(x)   _T(#x)

// 将x变成字符串(如果x是宏,展开)
#define _S(x)   __S(x)

// 将x变成字符串(如果x是宏,展开)
#define _ST(x
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32是一款高性能、低功耗的Wi-Fi和蓝牙双模无线通信芯片。它具有丰富的功能和灵活的配置选项,广泛应用于物联网、智能家居、智能穿戴设备等领域。 ESP32 API文手册是一本详细介绍ESP32芯片应用程序接口的技术文档。它以文语言编写,为开发者提供了全面的参考资料,帮助他们快速了解和使用ESP32芯片的各种功能和特性。 这本手册包含了ESP32芯片的所有重要功能和模块,包括Wi-Fi、蓝牙、GPIO、串口通信、时钟管理、文件系统等。它详细介绍了每个功能模块的使用方法、相关API函数的参数和返回值等重要信息。 通过阅读ESP32 API文手册,开发者可以了解ESP32芯片的各种功能组件的工作原理和使用方法。他们可以通过查阅手册的相关章节和示例代码来解决问题、调试程序,提高开发效率和代码质量。 此外,ESP32 API文手册还提供了一些常见问题和解决方案,以及一些建议和最佳实践供开发者参考。它是开发ESP32应用程序的重要工具之一,能够帮助开发者充分发挥ESP32芯片的潜力,实现各种应用场景的需求。 总的来说,ESP32 API文手册是一本重要的技术文档,为开发者提供了丰富的资料和指导,帮助他们更好地使用ESP32芯片开发各种物联网应用。通过阅读和学习这本手册,开发者可以快速上手、高效开发,并在实际应用取得良好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值