有没有办法在堆上自动分配结构?

时间:2021-05-17 15:41:42

标签: c memory esp32

我正在 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 对替换堆栈上的所有隐式分配,但这有两个缺点:首先,它很乏味,其次这意味着我必须维护自己的库副本。

这就是为什么我想知道这个工具链是否可以实现这些:

  1. 给编译器一个参数,让它自动在堆上分配结构
  2. #pragma 头文件之前放置一个 #including 指令,以便编译器自动分配在这些头文件中声明的结构体
  3. 在结构定义上添加一个“存储说明符”,使其在堆上自动分配
  4. 在变量声明上添加一个“存储说明符”,使其在堆上自动分配

最后一个可以使用 static 关键字,但这会稍微改变变量的语义。和第三点一样,它也有已经提到的相同问题,因为它在库中创建了一个更改,我每次升级它时都必须跟踪。

显然,第一有我的好处,但我在文档中找不到任何明显的东西。

非常感谢您对此的帮助。

0 个答案:

没有答案