Embedded 如何编写在填充的BSS段中放置全局/静态的Rust代码?

Embedded 如何编写在填充的BSS段中放置全局/静态的Rust代码?,embedded,rust,startup,bare-metal,Embedded,Rust,Startup,Bare Metal,我正在尝试在Rust中编程裸机嵌入式系统。在C启动代码中通常要做的一件事是零初始化任何全局或静态未初始化变量的BSS段 然而,在Rust中,我无法理解如何创建任何全局或静态未初始化变量(即使使用safecode)。换句话说,我不知道如何编写任何Rust代码,以便编译器用一些东西填充BSS段 我试过 static BSS_Data: i32 = unsafe { core::mem::uninitialized() }; ……但编译器拒绝了它 是否有任何方法可以编写锈代码(不安全或其他方式),从

我正在尝试在Rust中编程裸机嵌入式系统。在C启动代码中通常要做的一件事是零初始化任何全局或静态未初始化变量的BSS段

然而,在Rust中,我无法理解如何创建任何全局或静态未初始化变量(即使使用
safe
code)。换句话说,我不知道如何编写任何Rust代码,以便编译器用一些东西填充BSS段

我试过

static BSS_Data: i32 = unsafe { core::mem::uninitialized() };
……但编译器拒绝了它


是否有任何方法可以编写锈代码(
不安全
或其他方式),从而导致填充BSS段?在完全用Rust编写的任何程序中,是否保证BSS段始终为空?

BSS段的目的是加速所有静态存储持续时间变量(值为零)的初始化。但也要保存NVM,因为在flash中保存所有值为
0
的x字节,然后将它们逐个复制到RAM中是没有意义的

问题的解决方案可能是声明一个静态变量并显式地将其初始化为零。因为所有静态存储持续时间为零的变量都会在
.bss
中结束

这样做的一个副作用是,所有未初始化的静态存储持续时间变量也会出现在
.bss
中。因为在C语言中(以及从C派生/受C启发的语言中),有一个要求,即如果程序员没有显式初始化具有静态存储持续时间的变量,则必须将其初始化为零

例如,C11标准6.7.9正式规定了这一点:

如果没有指定具有静态或线程存储持续时间的对象 显式初始化,然后:
-如果它具有指针类型,则为 初始化为空指针
-如果它有算术类型,则为 初始化为(正或无符号)零



zero为任何全局或静态未初始化变量初始化BSS段-您想要哪个?如果希望将其初始化为零,则将其初始化为零。也就是说,您必须编写任何代码,将值从闪存复制到RAM中。这就是裸机的意思。我对生锈一无所知,但你不能声明一个静态变量并将其初始化为零吗?这将迫使它在.bss中分配。@Lundin如果您在代码中将其初始化为零,它将进入数据段。@Shepmaster如果您以前做过裸机编程,您将知道您将bss段归零不仅是为了您的代码,也是为了其他人为您的系统编写的代码。无论如何,这个问题不是关于如何或是否初始化变量,而是关于是否可以使用Rust将数据放入BSS段。@Verax那么您的.BSS段的工作方式与世界上所有其他的.BSS段不同。奇怪。拥有一个.bss的初衷就是加速零初始化。那么,你能证明在Rust中会发生这种情况吗?@Shepmaster任何语言标准都没有规定链接器的行为。不要求必须存在
.bss
段。类似地,语言标准也没有指定静态存储持续时间变量的初始化方式。