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应该在我的手中.就像我可以指定我想要的任何地址.
使用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。阅读链接器命令手册,以获取有关如何在特定地址定位节的更多信息。
可移植的方式是使用指针来设置地址
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)