如何在内存中的特定地址初始化const数组?

par*_*dya 7 c arrays embedded const

这个问题是关于嵌入式控制器.我想在内存中初始化一个const数组.但是当我将这个数组存储在内存中时,我想将它存储在特定的位置,比如说0x8000.这样我想占用一些代码,以便后者在运行时我可以删除它部分并将其用于我自己的其他目的.基本上我想要这样做:

const unsigned char dummy_string[] = "This is dummy string";
Run Code Online (Sandbox Code Playgroud)

但是地址dummy_string应该在我的手中.就像我可以指定我想要的任何地址.

kkr*_*mbo 5

使用pragma语句将变量放入命名的内存部分。然后,使用链接器命令脚本将命名的内存段定位在所需的地址。

我浏览了一些MSP430文档,我认为它可能会像这样工作...

在源代码中,使用#pragma DATA_SECTION。

#pragma DATA_SECTION(dummy_string, ".my_section")
const unsigned char dummy_string[] = "This is dummy string";
Run Code Online (Sandbox Code Playgroud)

然后在链接器.cmd文件中执行以下操作。

MEMORY
{
    ...
    FLASH    : origin = 0x8000, length = 0x3FE0
    ...
}

SECTIONS
{
    ...
    .my_section    : {} > FLASH
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果在FLASH中有多个节,则可能首先列出.my_section可以保证它位于FLASH的开头。或者,也许您应该定义一个特别命名的MEMORY区域,例如MYFLASH,它将仅包含.my_section。阅读链接器命令手册,以获取有关如何在特定地址定位节的更多信息。


Sev*_*eux 1

可移植的方式是使用指针来设置地址

  const unsigned char dummy_string[] = "This is dummy string";
  unsigned char* p = (unsigned char*)0x1234;

  strcpy(p, dummy_string);
Run Code Online (Sandbox Code Playgroud)

非可移植方式是使用编译器/平台特定指令来设置地址。例如,对于 AVR 上的 GCC,可以使用类似的东西

  int data __attribute__((address (0x1234)));
Run Code Online (Sandbox Code Playgroud)