0

我正在尝试保留一些 sram 字节,其中地址必须在加载时知道,以便它可以安装到 PROGSPACE 中。到现在为止,我通过将地址设置为(0x1F6),然后在我做的程序上设置地址,在 arduino nano 板上通过一个棘手的分配测试了我的代码

volatile byte shifty_data[3];

确保它不会在堆中被覆盖......代码工作正常,但我对此不满意,因为它与其他内核不兼容,并且可能与环境变化不兼容。到目前为止,我已经考虑了 malloc __heap_start 的更改(没有成功,因为它不是恒定的,并且我认为在加载时地址未知),我还查看了 avr/io.h,特别是通过 RAMSTART 在 iom328p.h定义,这可能有效,但是......它在systemn上似乎太低了,因为我想在它上面使用硬件SPI......而且它可能是在更高级别执行此操作的更好方法,最好是在arduino文件中。有任何想法吗?

4

1 回答 1

1

我不太确定你在这里问什么,但我相信你误解了两件重要的事情。程序空间与 SRAM 是分开的。它们位于两个不同的地址总线中。由于这种分离[使其成为修改后的哈佛架构],AVR 实际上提供了将数据从程序空间复制到 RAM 的指令。然后,任何全局声明的变量都将驻留在 SRAM 的 .bss 部分或 .data 部分中[这实际上是 C 标准的一部分]。__do_copy_data和___do_clear_bss最终可执行文件的部分负责[它们自动添加到 .init4 部分]。您可以使用编译器标志覆盖此机制,但是,每个全局变量的地址从程序开始执行时就已知[在闪存之外发生的事情,而不是 SRAM]。

现在,将东西放入 SRAM,我建议您查看avr-libc 手册中的此页面。它一般处理内存部分以及如何调整它们。干杯。

于 2014-02-11T04:17:42.140 回答