如何在Rust中的特定内存区域声明静态变量?

如何在Rust中的特定内存区域声明静态变量?,rust,embedded,lld,Rust,Embedded,Lld,我有一个静态常数,我想把它放在我的MCU的一个特定内存区域,这个程序是用Rust为ARM stm32m4 MCU编写的 在我的测试用例中,我定义了如下变量: #[link_section = ".device_info"] static DEVINFO: &'static str = "This is in the correct place no?"; 在我的memory.x文件中,我指定了: 内存 { 闪存:org=0x08000000,len=15k 设备信息:org=0x080

我有一个静态常数,我想把它放在我的MCU的一个特定内存区域,这个程序是用Rust为ARM stm32m4 MCU编写的

在我的测试用例中,我定义了如下变量:

#[link_section = ".device_info"]
static DEVINFO: &'static str = "This is in the correct place no?";
在我的
memory.x
文件中,我指定了:

内存
{
闪存:org=0x08000000,len=15k
设备信息:org=0x08003C00,len=1k
EEPROM:org=0x08004000,len=16k
……其他
}
部分{
.设备信息:{
*(.设备信息);
.=对齐(4);
}>设备信息
}在.text之后插入;
这会生成,但当我检查输出文件时,我想找到位于
0x8003c00
的文本
“这是否在正确的位置?”
,但当我使用此文本搜索时:

arm none eabi objdump target/thumbv7em none eabihf/debug/binaryfile-s | rg-C4
它将此作为输出:

8001b80 401b0008 2B0000000 6b1b0008 15000000@…+…k。。。。。。。
8001b90 59010000000000000000000000000000000年。。。。。。。。。。。。。。。
8001ba0 696e6465 78206f75 74206f66 20626f75指数超出bou
8001bb0 6E6473A 20746865 206c656e 20697320 nds:透镜为
8001bc0 54686973 20697320 696e2074 68652063这在c中
8001bd0 6f727265 63742070 6c616365 206e6f3f正确的位置号?
8001be0 4e6f2076 616c6964 20666972 6d776172无效
8001bf0 65737372 632f6c69 622e7273 e01b0008 essrc/lib.rs。。。。
8001c00 12000000 f21b0008 0a000000 ac000000。。。。。。。。。。。。。。。。
编译时如何将字符串存储在
8003c00
?或者有什么价值


基本上,最后,我想在那个特定位置存储一个更大的结构,因为这是我的引导加载程序,我想稍后从我的应用程序代码中读取该结构的值。

静态str的值仍然只是一个指针,所以您只在
.device\u info
部分存储一个地址,而不是它所指向的数据。要在此处存储实际值,可以使用:

#[link_section = ".device_info"]
static DEVINFO: [u8; 32] = *b"This is in the correct place no?";

你们在地址0x8003c00有什么?每个机会的值
8001bc0
?好吧,先生,我有c01b0008,但那是由于我的耐力…对。因此,您的代码只在flash中存储指针,而不是实际的字符串。我对Rust一无所知,但在C语言中,你可以使用
const char str[]=“这是正确的位置,不是吗?”
而不是
const char*str=…
。谢谢你,至少我知道没有其他错误,Rust对于创建任意长度的数组不是很宽容的,但这是另一个问题,正如lundin所说,指向字符串的指针存储在该位置。这是个问题吗?您还必须在该位置存储一个字节数组
[u8]
。一个问题可能是字符串的长度(不是
\0
终止)以及编码(Rust在默认情况下使用UTF-8)