【问题标题】:How to get array of function pointers to stop putting functions into RAM on ARM Cortex M0 and GCC如何获取函数指针数组以停止将函数放入 ARM Cortex M0 和 GCC 上的 RAM
【发布时间】:2021-12-07 05:30:04
【问题描述】:

我正在使用 ARM GCC 10.2.1 20201103 并且内存不足,因为我有一个函数数组(下面的简短示例)并且 GCC 将数组(或者可能是函数)放入 RAM 而不是 .text。

代码如下所示:

static int16_t* (*func_arr[])(int16_t) = {
    func1,
    func2,
    func3,
    func4,
};

我尝试过使用 attribute((section ("text")))、"static"、"const",但无论如何我都会收到此消息:

motor6.elf section `._user_heap_stack' will not fit in region `RAM'

对于我添加到数组中的每个函数,我都会额外耗尽 32 个字节左右的内存,这让我认为这些函数本身正在被放入 RAM,尽管我不确定。

有人有想法吗?

【问题讨论】:

  • so make it const.. the functions themselves 不,函数 pointers 被放入 RAM。
  • static 影响该变量/数组(标签)的范围或可见性。它只能在该文件或该函数中使用,具体取决于它在文件中的位置,它不会使其成为常量,也不会将其移动到 .text 或 .rodata 中。如果您想将其从 .data 移动到 .text 或 .rodata 中,则无论是否带有静态的 const 都是您想要的。

标签: gcc linker arm function-pointers


【解决方案1】:

创建变量const 让编译器将其放入只读内存中。

static int16_t *(*const func_arr[])(int16_t) = {
    func1,
    func2,
    func3,
    func4,
};

【讨论】:

  • 感谢您的建议。我已经尝试过——同样的故事——每次我向列表中添加一个函数时,我的 RAM 都会多出 32 个字节。
【解决方案2】:

我列出的每个函数都使用静态数据。因此,对于我添加到列表中的每个函数,该数量的静态数据都添加到了 RAM 部分。解决这个问题只是意味着列表中引用的函数需要将其数据声明为 const static 而不仅仅是 static。

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2015-09-15
    相关资源
    最近更新 更多