手臂皮质 m4 中的随机行为和无限循环

random behavior and infinite looping in arm cortex m4

我正在尝试编写代码以从 uart 获取一些值作为占空比并将它们写入 pwm 输出以驱动 6 个电机。

PWM_Init();
UART_Init();
char x;
uint32_t y;
uint32_t sum[6]={0,0,0,0,0,0};
uint32_t i,j,k;
while(1)
{
    for(k = 0 ; k < 7 ; k++)
    {
        sum[k] = 0;
    }
    //////////////// 
    for(i=0; i<7; i++)
    {
        for(j = 0 ; j < 3 ; j++)
        {
            x = UART_InChar();
            y = (x -'0') * pow(10,2-(j));
            sum[i] += y;
        }
    }
    //////////////////
    PWMPulseWidthSet(PWM1_BASE, PWM_OUT_0,5000 - sum[0]);
    PWMPulseWidthSet(PWM1_BASE, PWM_OUT_1,5000 - sum[1]);
    PWMPulseWidthSet(PWM1_BASE, PWM_OUT_2,5000 - sum[2]);
    PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5,5000 - sum[3]);
    PWMPulseWidthSet(PWM1_BASE, PWM_OUT_6,5000 - sum[4]);
    PWMPulseWidthSet(PWM1_BASE, PWM_OUT_7,5000 - sum[5]);
}

在调试第二个 for 循环时超过 7 并继续 运行 有时 i 值很大,甚至可能是无穷大。我不知道这是什么原因以及如何解决这个问题。

你的 i 循环是 UB 因为你正在越界寻址你的数组。 sum 数组是 6 个元素宽。这意味着索引从 0 开始到 5

你应该写

for(k = 0 ; k < sizeof(sum)/sizeof(sum[0]) ; k++)
{
    sum[k] = 0;
}

我猜,由于 UB,第二个循环是 resetting/changing i 的值,即 sum 之后的第一个 declared/allocated 变量数组声明。