工具/软件:TI C/C++编译器
作为我使用 MathWorks Embedded Coder 和 Polyspace 软件验证工具的一部分、我经常遇到与热启动与冷启动对全局变量初始化的影响相关的问题。 以下是一个示例:
int globa = 2; int globb;%默认为零(根据 ANSI C 标准 int globC);%默认为零(根据 ANSI C 标准 int main(){ globC = 5; 返回0; }
我很清楚、全局变量 C 在所有情况下都将被正确初始化、因为它在 main 中被显式初始化。 但是、对于另外两个、这一点不太清楚。 根据 TMS320C2x 编译器用户指南、我了解_c_int0 ()函数会在启动过程中将所有显式初始化的数据从.cinit 复制到.bss、前提是链接器在运行时具有选项-c 来自动初始化。 这意味着从_c_int0()重新启动的热启动将使用-c link 选项初始化 globa。
在指南的第5.7节中、我们将告诉您如何使用链接器命令文件将.bss 段显式初始化为零。 通过链接器将.bss 归零并使用选项-c、我假设这将在全局变量 B 的热启动和冷启动时进行初始化。 如果没有链接器归零、则只有加载程序提供的全局变量 B 初始化、并且仅用于冷启动。
最后、使用-cr 选项的链接器只会对 globB 和 globC 进行冷启动初始化。 这种情况消除了热启动初始化的机制。
这种理解是否正确? 在哪里可以找到有关此行为的更多资源?