问题汇总
- 【已解决待验证】Openocd debug
- 【已解决】关于usb转串口你永远可以相信[Zadig](https://zadig.akeo.ie/)
- 【已解决】openocd无法连接电脑
- 【转】Windows环境下用Jlink调试ESP32
- 【已解决】jlink连接问题
- 【未解决】-- Detecting C compiler ABI info - failed
- 【实践】Python环境配置
- 【已解决】section `.dram0.bss' will not fit in region `dram0_0_seg'
- 【已解决】vscode启动openocd之后,按debug键后的问题 -> telnet
- 【存疑】IRAM0 segment data does not fit
- `idf.py menuconfig`
- vTaskList的使用
- heap_caps_malloc与malloc
- 跑在外部ram的变量与任务
- 【概念】链接文件相关
- 【实践】有意思的宏
- 【实践】正则表达式
- 【实践】Windows
- 【实践】Linux(Ubuntu)
- 【实践】vscode
- esp-idf入门
- 【未解决】在jtag trace时的问题
- 【实践】性能优化
- ESP32系列
-
【已解决】关于usb转串口你永远可以相信Zadig
-
无论PL2303还是其他
-
-
唯一要注意的是不要找错usb设备,把键盘鼠标的usb驱动刷了,不然哭都不知道怎么哭
-
-
-
【已解决】openocd无法连接电脑
JTAG端口和GPIO冲突,修复后ok。
-
【转】Windows环境下用Jlink调试ESP32
-
【已解决】jlink连接问题
zadig-2.7.exe ->Option->List All Devices->select(Interface 0)->Replace Driver->OK
提示的问题是ram溢出了,manucofig文件配废了,用beyondcompare对比修复
应该是电脑的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
去打印了vTaskList
和vTaskGetRunTimeStats
#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
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函数之前,需要仔细考虑应用程序的需求和可用的内存资源,以确保选择正确的内存分配函数。
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
来控制代码是否需要被编译
。
#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__)
-
[转载]宏函数间接层的意义:宏中宏
在宏定义中使用__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