这个问题是关于嵌入式控制器的。 我想在内存中初始化一个const数组。但是当我将这个数组存储在内存中时,我想将它存储在特定的位置,比如说0x8000。这样我想占用一些代码,以便后者在运行时我可以删除它部分并将其用于我自己的其他目的。 基本上我想要这样做:
const unsigned char dummy_string[] = "This is dummy string";
但是dummy_string
的地址应该在我的手中。就像我可以分配我想要的任何地址一样。
答案 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; }