首页 > 解决方案 > 有没有办法在堆上自动分配结构?

问题描述

我正在使用带有 PlatformIO 的 VSCode 下的 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关键字来实现,但这会稍微改变变量的语义。和第三点一样,它也有同样的问题,因为它在库中创建了一个更改,我每次升级它时都必须跟踪它。

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

非常感谢您对此的帮助。

标签: cmemoryesp32

解决方案


推荐阅读