解决办法:使用该方式,non_cacheable_data改成mcal_data_no_cacheable,__attribute__ (( section (".mcal_data_no_cacheable"), aligned(8) ))即可;
原因:首先,我们先理解什么时候会给什么变量赋初值:
①data段的变量指的是已初始化的全局变量,静态局部变量也是data段
②在启动阶段会对data和bss段进行初始化,如图,
③如上图紫色部分,赋值内容部分由rom_start(变量初值存储在rom的起始地址)、rom_end(变量初值存储在rom的结束地址)、ram_start(变量ram地址)决定,最终存储这些指针的地址在__INIT_TABLE,实际如下图
④如③所示,最终第②步中对data段赋初值,其中对no_cacheable_data段赋初值,只会对_non_cacheable_data_start__ ~ _non_cacheable_data_end__ 这一段地址赋值
⑤non_cacheable_data包含mcal_data_no_cacheable和其它部分,当你把变量定义在non_cacheable_data段时,实际是把变量初值定义在_non_cacheable_data_end__ 之后,这样在②时不会把初值赋予该变量。