c - 静态变量未初始化为零

标签 c memory embedded

我正在使用 STVD IDE 和 COSMIC 编译器在 stm8s 微 Controller 上开发嵌入式应用程序。

我正在尝试定义一个 static bool 变量,以使用它仅执行一次代码片段。意外的是,变量once 没有初始化为FALSE0。虽然我明确地初始化了它。这是我的代码片段:

uint32_t crc32_buffer(void)
{
    static bool once = FALSE;
    uint32_t crc = 0;

    if(!once)
    {
        calcTable();
        crc = 10;
        once = TRUE;
    }

    return crc;
}

当我尝试检查物理内存位置时,我发现每次进入新的调试 session 后(甚至在硬件重启 Controller 之后)和运行应用程序本身之前,内存地址 0x80具有相同的值 0x14

如果我修改代码以在变量初始化后将 FALSE 分配给 once:

once = FALSE;

内存位置更改为包含 0x00。然后,如果我退出这个调试 session ,然后重新修改代码以删除这行代码并开始一个新的调试 session ,我发现内存位置 0x80 又变成了 0x14在运行应用程序之前。

我不明白什么可以阻止编译器将变量初始化为0。我不明白什么可以在运行应用程序之前将 0x14 写入内存位置。

如果内存位置 0x80 被访问(读/写),我尝试设置一个断点,但应用程序直到到达代码中的 if 语句才停止片段。

UPDATE-2

正如许多人指出的启动程序,我不使用默认的启动代码。但是,我使用的是自定义的。 当我使用标准启动代码而不是我使用的自定义启动代码时,在 main() 函数开始执行之前,内存位置被设置为 0。自定义启动代码不是这种情况。 因此,当我定义一个新的 static 变量并将其显式初始化为 FALSE 时,此初始化只会发生在 main() 之前的启动代码中>,对吧?

最佳答案

如果您阅读 this storage duration reference你会看到静态存储持续时间

the value stored in the object is initialized only once, prior to main function

所以你必须让在main之前运行的启动代码先运行。一旦 main 函数被调用,值应该已经被初始化。

关于c - 静态变量未初始化为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060802/

相关文章:

c - C 中遍历链表时出现段错误?

mysql - 如何让 mysql MEMORY ENGINE 存储更多数据?

c - 如何从 Newlib 在 GCC 中实现 printf?

linux - squashfs 文件可以删除吗?

c++ - 有没有一种在 C++ 中创建 "split object"的好方法?

c - 将结构写入二进制文件,从文件中读取,存储在缓冲区中,打印缓冲区

c - 提高在 C 中写入大量小文件的吞吐量

c - 如何为需要多次输入的 C 程序编写 Bash 脚本?

memory - 为什么 OCaml 需要创建自己的堆来进行垃圾回收?

c++ - 我需要取消分配 vector 中的对象指针吗?