静态变量未初始化为给定值

时间:2020-03-11 13:30:21

标签: c embedded static-variables variable-initialization

我有一个 static “ init”变量,可以在启动时运行一次功能(RTOS),但是它似乎初始化为一个随机值。如果删除 static 标记,则一切正常。 (除了很明显的问题,即它每遍都要运行init函数。)谁能提供更多有关为什么这种方法行不通或实现此目的更好方法的见解?

示例代码:

void ManageStructures()
{
    // Variable declarations/definitions
    static uint8_t StructInitialized;
    // Have also tried "static uint8_t StructInitialized = 0", neither worked

    // Function prototypes
    void InitStruct();

    if (!StructInitialized)
    {
        StructInitialized= 1;
        InitStruct();
    }
    Test = StructInitialized;

编辑:对于信息不足,我深表歉意。这是针对一家公司的,我正在努力保持在我们公共信息政策的范围之内。 MCU是使用“ Ac6 STM32 MCU GCC”工具链的STM32F7系列。我不熟悉编译器操作,因此可能需要更长的时间才能找到与编译器或makefile相关的问题的答案。

编辑:显然这是编译器或链接器脚本的问题,而不是我的代码的问题。话虽这么说,也很清楚我需要深入了解工具链,链接程序脚本和编译器,然后才能深入了解此问题。一旦我变得足够熟悉,可以提出宝贵的反馈意见或自己回答,我将回到这个问题。谢谢大家的反馈和指导!

1 个答案:

答案 0 :(得分:7)

嵌入式系统通常以“最小启动”代码运行,这意味着它们在启动期间从不初始化.bss.data。这意味着,如果您编写类似static int foo = 42;的代码,则将编译代码,但永远不会设置变量。

这不是标准的C编译器,因此通常在创建项目时会从IDE中获得一个选项,以选择“最小”或“标准”启动。

这可能在于您的工具链附带的所谓的“ CRT”(C运行时),而不是RTOS。如果您从程序的实际启动位置(复位向量)而不是main()的起始位置开始执行程序,则将可以准确地看到CRT可以做什么和不可以做什么。

不幸的是,调试器通常使用“虚拟化模式”,因为默认情况下,嵌入式系统程序员如今已被认为完全没有能力。这意味着它们在main()处静默插入一个断点并一直运行到该点。为了调试CRT,您可能必须“取消静音”调试器。