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

时间:2015-01-05 05:19:00

标签: c arrays embedded const

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

const unsigned char dummy_string[] = "This is dummy string";

但是dummy_string的地址应该在我的手中。就像我可以分配我想要的任何地址一样。

3 个答案:

答案 0 :(得分:4)

使用pragma语句将变量放入指定的内存部分。然后使用链接器命令脚本在所需地址处找到指定的内存部分。

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

在源代码中使用#pragma DATA_SECTION。

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

然后在链接器.cmd文件中执行类似的操作。

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

SECTIONS
{
    ...
    .my_section    : {} > FLASH
    ...
}

如果FLASH中有多个部分,那么首先列出.my_section可能会保证它位于FLASH的开头。或许你应该定义一个特别命名的MEMORY区域,例如MYFLASH,它只包含.my_section。阅读链接器命令手册,了解有关如何在特定地址查找部分的更多信息。

答案 1 :(得分:1)

便携式方法是使用指针来设置地址

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

  strcpy(p, dummy_string);

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

的内容
  int data __attribute__((address (0x1234)));

答案 2 :(得分:0)

从C和/或C ++开始,就像你在问题中写的那样。可能会添加extern以覆盖C ++的const - 是 - static - 默认情况下的规则。

然后你需要使用一个链接器指令(也许是.ld文件)来强制该符号到代码flash / ROM中的特定地址。

或者,你可以假设构建过程之外的东西编程内存,你的代码只是访问它。然后你可以做类似的事情:

inline const unsigned char* dummy_string() { return (const unsigned char*)0x8000; }