C++ 在加载时分配/保留具有已知地址的avr sram,以适应程序空间

C++ 在加载时分配/保留具有已知地址的avr sram,以适应程序空间,c++,c,arduino,avr,arduino-ide,C++,C,Arduino,Avr,Arduino Ide,我试图保留一些字节的sram,在加载时必须知道地址,这样才能将其装入存储空间。直到现在,我在arduino纳米板上通过将地址设置为(0x1F6)并在我所做的程序上设置为后者来测试代码是否正常 volatile byte shifty_data[3]; 要确保其在堆中不被覆盖。。。 代码运行正常,但我对此不满意,因为它与其他内核不兼容,并且可能与环境变化不兼容。 到目前为止,我一直在考虑malloc\uuuu heap\u start中的更改(由于它不是常量,而且在加载时地址未知,所以没有成功)

我试图保留一些字节的sram,在加载时必须知道地址,这样才能将其装入存储空间。直到现在,我在arduino纳米板上通过将地址设置为(0x1F6)并在我所做的程序上设置为后者来测试代码是否正常

volatile byte shifty_data[3];
要确保其在堆中不被覆盖。。。 代码运行正常,但我对此不满意,因为它与其他内核不兼容,并且可能与环境变化不兼容。 到目前为止,我一直在考虑malloc\uuuu heap\u start中的更改(由于它不是常量,而且在加载时地址未知,所以没有成功),我还研究了avr/io.h,特别是iom328p.h到RAMSTART定义,这可能会起作用,但是。。。它在systemn上似乎太低了,因为我想在上面使用硬件SPI。。。这可能是在更高级别上更好的方法,最好是在arduino文件中。
有什么想法吗?

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


现在,把东西放到SRAM中,我建议您看看。它一般处理内存部分以及如何调整它们。干杯。

是的,谢谢,我最终使用了一个全局变量,它的地址可以被安装到单独的progspace中(因此我感到困惑),因为它们在BSS上,地址在加载时就知道了