gpt4 book ai didi

c - 定位 RAM 变量的 ROM 地址

转载 作者:行者123 更新时间:2023-12-02 09:11:44 24 4
gpt4 key购买 nike

我想知道是否有办法获取用于为 RAM 变量提供初始值的 ROM 地址?给定一个语句static uint32_t foo = 0x12345678;,初始值0x12345678以ROM的形式存在于某处,作为&foo处的初始值。在某个时间点,我希望能够将 foo 的值重置为其初始状态。

我可以创建第二个变量 const static uint32_t initial_foo = 0x12345678; 来使用,但这将使存储该用例的变量所需的 ROM 数据空间增加一倍。

从 RAM 开头的偏移量 &foo(或者更具体地说是 &_srelocate,请参阅下面的链接器脚本)是否可以与 ROM 空间中的符号之一可靠地相关?

ARM/GNU C 链接器 v 6.3.1 脚本的选定部分如下。

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
SEARCH_DIR(.)

/* Memory Spaces Definitions */
MEMORY
{
rom (rx) : ORIGIN = 0x00400000, LENGTH = 0x00100000
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000
}

/* The stack size used by the application. NOTE: you need to adjust according to your application. */
__stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 0x3000;
__ram_end__ = ORIGIN(ram) + LENGTH(ram) - 4;

SECTIONS
{
.text :
{
. = ALIGN(4);
_sfixed = .;
KEEP(*(.vectors .vectors.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)
*(.rodata .rodata* .gnu.linkonce.r.*)
*(.ARM.extab* .gnu.linkonce.armextab.*)

/* Support C constructors, and C destructors in both user code
and the C library. This also provides support for C++ code. */
. = ALIGN(4);
KEEP(*(.init))
. = ALIGN(4);
__preinit_array_start = .;
KEEP (*(.preinit_array))
__preinit_array_end = .;

. = ALIGN(4);
__init_array_start = .;
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
__init_array_end = .;

. = ALIGN(0x4);
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*crtend.o(.ctors))

. = ALIGN(4);
KEEP(*(.fini))

. = ALIGN(4);
__fini_array_start = .;
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
__fini_array_end = .;

KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*crtend.o(.dtors))

. = ALIGN(4);
_efixed = .; /* End of text section */
} > rom

/* .ARM.exidx is sorted, so has to go in its own output section. */
PROVIDE_HIDDEN (__exidx_start = .);
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > rom
PROVIDE_HIDDEN (__exidx_end = .);

. = ALIGN(4);
_etext = .;

.relocate : AT (_etext)
{
. = ALIGN(4);
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);
. = ALIGN(4);
_erelocate = .;
} > ram

/* .bss and stack sections removed */

. = ALIGN(4);
_end = . ;
}

最佳答案

不要使用一个 RAM 变量 type foo = value;,只需创建一个变量 const type foo = value; 并确保它在 ROM 中分配(应该是如果变量具有静态存储持续时间的情况)。然后根据需要手动将其复制到RAM。这样,该值仅在 ROM 中存储一次; ROM 变量的初始值设定项不单独存储。

这样您就不会浪费任何内存,也不必担心以某种方式通过 .rodata 搜索初始值设定项值,这是相当有问题的做法。

关于c - 定位 RAM 变量的 ROM 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51307767/

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