我正在 VSCode 下使用带有 PlatformIO 的 ESP-WROOM32D,它使用默认的 xtensa32 工具链。 我当前的项目涉及将一个库移植到这种架构中,并且 C 语言中的源文件编译得很好,无需任何改动。
然而,在运行时我经常遇到堆栈溢出错误或大师冥想崩溃。经过一番反复试验,我发现这是因为这个库在堆栈上创建了这样的大型结构:
#define BITBUF_ROWS 25
typedef bitrow_t bitarray_t[BITBUF_ROWS];
/// Bit buffer.
typedef struct bitbuffer {
uint16_t num_rows; // Number of active rows
uint16_t bits_per_row[BITBUF_ROWS]; // Number of active bits per row
uint16_t syncs_before_row[BITBUF_ROWS]; // Number of sync pulses before row
bitarray_t bb; // The actual bits buffer
} bitbuffer_t;
bitbuffer_t bits = {0}; // this gets created on stack
我完全理解这个小型架构上堆栈的限制,在我自己的代码中,我在需要这样的结构时使用 malloc
。
显然,我可以修改第三方库,用适当的 malloc
/free
对替换堆栈上的所有隐式分配,但这有两个缺点:首先,它很乏味,其次这意味着我必须维护自己的库副本。
这就是为什么我想知道这个工具链是否可以实现这些:
#pragma
头文件之前放置一个 #including
指令,以便编译器自动分配在这些头文件中声明的结构体最后一个可以使用 static
关键字,但这会稍微改变变量的语义。和第三点一样,它也有已经提到的相同问题,因为它在库中创建了一个更改,我每次升级它时都必须跟踪。
显然,第一有我的好处,但我在文档中找不到任何明显的东西。
非常感谢您对此的帮助。