c - C 静态变量初始化问题

标签 c embedded

我的静态变量遇到了一个问题,该变量在程序启动时采用随机值,并且未初始化为 0,因为我希望它能正常工作。

我首先有这个功能 文件1:

void setInput()
{
    /*.... Code ...*/
    sysUpdate(SysOutput.u16_state);
    
    /*.... Code ...*/
}

它在另一个中调用 sysUpdate 函数 文件2:

bool sysUpdate(uint16 state)
{
    static uint32 u32_Counter = 0;
    
    if (Condition)
    {
        u32_Counter += 30;
        if (u32_Counter > 30000)
        {
            u32_Counter = (uint32)0;
            /*.... Code ...*/
        }
    }

    /*.... Code ...*/
}

问题是我的 u32_Counter 尽管将其初始化为 0,但仍采用随机值,并且我的条件第一次始终为真。

您知道这个问题的原因吗?

感谢您的帮助。

更新: 此问题是由另一个静态数组的边界写出引起的。这就是导致问题的原因:

static uint8 state[xNUMBER][yNUMBER]; 
const uint8 state1[xNUMBER][yNUMBER] = {{0, 1, 0, 0}, {1, 0, 0, 0},{1, 1, 1, 1}}; 
const uint8 state2[xNUMBER][yNUMBER] = {{0, 1, 1, 1}, {1, 1, 0, 0},{1, 1, 1, 1}}; 
length = sizeof(state)/sizeof(state[0][0]);
for(i = 0; i < length; i++)
{
    for (j = 0; j < length; j++)
    {
        if(condition)
        {
            state[i][j] = state1[i][j];
        }
        else           
        {
            state[i][j] = state2[i][j];
        }
    }
}

最佳答案

除非您的环境严重损坏,否则u32_Counter的初始值保证为0

一个可能的解释是这个全局变量被显示问题的测试之前执行的代码覆盖。

您可以尝试通过查看映射文件或符号列表及其地址(使用 nmobjdump 实用程序)来进行调查,以了解变量或数组是什么放置在 u32_Counter 之前。缓冲区溢出可能会导致您观察到的情况。

您可以将定义移到函数之外,以便可以在执行初始代码期间的不同时间打印 u32_Counter 的值。然而,如果您这样做,问题可能会消失,因为变量可能会放置在数据段中的不同位置,因此不再被覆盖,但其他一些变量可能会被覆盖,并且副作用可能会移动到其他地方。即使只是删除 = 0 初始值设定项也可能会产生这种效果。

如果您有一个具有监视功能的调试器,请在此变量上设置一个监视点以跟踪它的修改位置和方式。

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

相关文章:

C Xcode问题

python - 将 Quartz 2d python 演示移植到纯 Core Graphics C

c - 使用函数对数组进行排序

embedded - MAC 地址有多独特

gcc - 如何用arm gcc生成符号表

c++ - GCC --gc-sections 和寻找符号依赖

c - 在作用域的开头声明 C89 局部变量?

c - 如何将函数的定义传递给其他函数,以便其他函数在 C 语言中调用它?

c - 当我在 RL_ARM 中使用 TCP 函数时出现 undefined symbol

c - 将函数指针表的索引与表内容同步