【问题标题】:allocate/reserve avr sram with known address at load time to fit into progspace在加载时分配/保留具有已知地址的 avr sram 以适应 progspace
【发布时间】:2014-02-11 03:11:11
【问题描述】:

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

volatile byte shifty_data[3];

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

【问题讨论】:

    标签: c++ c arduino avr arduino-ide


    【解决方案1】:

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

    现在,将东西放入 SRAM,我建议你看看 this page on the avr-libc manual。它一般处理内存部分以及如何调整它们。干杯。

    【讨论】:

    • 是的,谢谢,我最终使用了一个全局变量,它的地址可以放入 progspace 女巫是分开的(因此我很困惑),因为它们在 BSS 上,所以地址在加载时是已知的
    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2021-10-10
    • 2015-11-02
    相关资源
    最近更新 更多