如何使用 GCC 初始化静态变量

How not to initialise a static variable with GCC

提问人:Andrew Goedhart 提问时间:5/15/2023 最后编辑:Jonathan LefflerAndrew Goedhart 更新时间:5/16/2023 访问量:176

问:

我正在用 C++ 编写一个微型。我需要一个静态变量才能在重置后生存。

该对象用于保存有关重置原因的更多详细信息。我不能保证在重置时可以将其记录到闪存中,因此我需要在重置后记录它。

我可以使用指针常量并手动分配一个未在段文件中提供给链接器的 ram 块。并进行就地初始化。

但是我想知道是否有一种在 gcc 中使用属性或类似东西的方法可以让我避免静态变量的静态初始化。这使得它在我使用的不同微处理器之间更具可移植性,因为我不必手动摆弄内存映射。

当显式分配对象时,我需要标准对象构造函数才能工作。

C++ GCC 静态初始化

评论

5赞 pmacfarlane 5/15/2023
您可以创建一个存储在 RAM 中但不是 或 的一部分的新部分,该部分不会被启动代码触及。它是什么微观?其中一些具有持久的暂存器寄存器,这些寄存器在复位后仍然有效。.data.bss
0赞 pmacfarlane 5/15/2023
如果您可以在将该部分复制到 RAM 之前读取所需的变量,则甚至可能不需要单独的部分。我在最近的一个 STM32 项目中做到了这一点,它很好。.data
2赞 nielsen 5/15/2023
这回答了你的问题吗?C、跳过初始化静态数组
0赞 Andrew Goedhart 5/15/2023
我实际上有几个:STM、GD、ESP ....这就是为什么我试图避免手动使用内存映射的原因。此外,该块大约有 80 个字节,因为它包含故障前函数调用的堆栈跟踪,因此它不适合暂存器寄存器。
1赞 Andrew Goedhart 5/15/2023
C++ 代码和 GCC 似乎提出了一些其他问题,使“no init”只是解决方案的一部分。我使用的代码是 C++,如果类变量的初始化与声明内联完成并且没有在类上引发 init 属性,则生成的代码似乎存在问题,显式调用构造函数以初始化类失败并出现垃圾。如果将初始化移动到构造函数初始化列表,则它们被正确构造。

答: 暂无答案