This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:如何确定热启动与冷启动对全局变量初始化的影响?

Guru**** 2952510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/948411/compiler-how-do-you-determine-the-effect-of-warm-vs-cold-start-on-global-variable-initialization

工具/软件: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 进行冷启动初始化。 这种情况消除了热启动初始化的机制。

这种理解是否正确? 在哪里可以找到有关此行为的更多资源?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    编译器无法识别热启动和冷启动之间的区别。  在此帖子中、我假设执行从 编译器随附的编译器 RTS 库中的函数_c_int00开始。

    我进一步假设您使用 COFF ABI 进行构建、而不是使用较新的 EABI。 COFF ABI 是编译器的默认值、虽然这种情况有所变化、但仍比 EABI 更广泛地使用。

    所有这些情况、请参阅文章 "未初始化的静态对象未在 COFF 中设置为零"。  您将了解到、对于您在帖子中显示的特定示例、启动代码不会将变量 globB 和 globC 初始化为0。

    有关更多详细信息、请在 C28x 编译器手册中搜索 标题为 "系统初始化"的子章节。

    谢谢、此致、

    乔治