gpt4 book ai didi

c++ - AVR GCC 本地数组初始化

转载 作者:行者123 更新时间:2023-11-28 04:57:10 26 4
gpt4 key购买 nike

我想初始化本地(常量)数组:

void foo() {
const uint8_t arr[] = {1, 2, 3, 4, 5};
}

为了初始化,我支付了 5 个字节的全局 RAM:这 5 个常量在程序开始时被复制到 RAM 并永远留在那里。问题是为什么?当我调用函数时,编译器不能直接从 FLASH 初始化数组吗?无论如何,我不能在其他任何地方使用右侧的临时数组,它必须在 ; 之后立即销毁,但它在启动后始终存在于 RAM 中。现在我必须做类似的事情

void foo() {
static const uint8_t init_arr[] PROGMEM = {1, 2, 3, 4, 5};
uint8_t arr[5];
copy_from_prog_function(arr, init_arr, 5);
}

最重要的是,现在我什至不能让我的 arr 成为 const!

这个问题有没有更优雅的解决方案?

最佳答案

您可能知道,AVR 是一种哈佛架构——程序驻留在不同的地址空间中,数据和访问它的指令也不同。 C 没有针对不同地址空间的方法,因此您必须在此处使用编译器扩展(如这个 PROGMEM 宏)。

由于程序内存只能按字节读取(并且比 RAM 慢一点,因为它由闪存支持),编译器将从不自动将数据放在那里。另见 Data in Program Space avr-libc 文档,尤其是“关于 const 的注释”。

就是说,如果数组无论如何都是const,为什么不将它声明为static?然后编译器不会创建代码来将它复制到堆栈上,您可以直接访问它,但仍在 RAM 中。

如果您希望它驻留在程序内存中,只需像在第二个示例中那样声明它并使用 pgm_read_byte() 宏访问各个元素,无需自己复制整个数组。

按照建议by PeterJ_01 , 使用较新的 AVR 工具链,您甚至可以使用 a simpler syntax用于直接闪存访问,因此代码看起来“更好”。

关于c++ - AVR GCC 本地数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46903110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com