将MCUXpresso与NXP MKL02Z16VFM4结合使用以供参考。
当我声明这样的结构时
typedef struct {
uint8_t DATA :8;
} myStruct;
myStruct xxx __attribute__ ((section ("xyz")));
存储器中的位置用随机字符填充。处理器是小端序,所以当我试图访问这个地址时,我会得到那些随机字符和我写入结构的数据。
//At address 0x1FFFFE84 : BD84D1E4
xxx.DATA = 0xAA; //Assign some numbers to struct
//Now, 0x1FFFFE84 : BD84D1AA
我可以使用memset来清除内存,但我想知道为什么在声明结构时内存中会填充这些随机字符。
您已经在xyz
节中明确定位了xxx
-编译器和默认启动代码不知道该节,因此不需要像默认的bss
段那样明确零初始化。对于大多数易失性内存技术,内存在通电时具有不确定性的内容-因此在这种情况下显然是随机的。
如果您希望私有部分的初始化为零,则需要在链接器脚本和/或启动代码中明确添加。然而,围绕结构的未使用内存的内容或其中的任何对齐填充都是不相关的,并且显式地将其清除为某个已知值在很大程度上是不必要的。
结构变量,但实际上是ANY变量,在代码中使用之前需要初始化。访问(读取(未初始化的数据会导致未定义的行为,这意味着编译器无法以可预测的方式运行。
大多数编译器都设置为0未初始化的变量,但其他一些编译器(例如,一些嵌入式编译器(没有。这就是为什么你会看到随机值。