在 C(AVR 编程)中是否有一种简单的方法来选择变量应该存储在 RAM 还是 ROM 中并通过所有代码处理它?

Is there an easy way in C (AVR programming) to choose if a variable should be stored in RAM or ROM and handle it through all the code?

我发现自己在很多情况下都应该在 ROM 而不是 RAM 中存储一个数组或一组结构。然后我检查所有代码并进行更改,例如添加 PROGMEM、pgm_read_word()、pgm_read_byte()。这是一项艰巨的任务,尤其是在编写了大约 4000 行代码之后。

有什么技巧可以让这件事变得更容易吗?

您应该考虑使用 GCC 的 named address spaces 功能。 GCC 4.7 中为 AVR 启用了此功能,因此您必须确保使用的是 GCC 4.7 或更高版本。这将允许您向编译器指定您的变量所在的内存space,以及您的指针指向的内存space。然后您可以使用常规 C 语法访问变量,而不是使用像 pgm_read_byte.

这样的函数

注意:从 GCC 4.9.2 开始,命名地址 spaces 仅在 GNU C 编译器中受支持, Arduino IDE 使用的 C++ 编译器。