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

时间:2016-02-01 23:54:54

标签: c arm embedded cortex-m

我正在尝试编写代码,将一些值作为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值大且可能无限大。我不知道这个的原因以及如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

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

你应该写

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

我想由于UB而导致的第二个循环正在重置/更改i的值,该值是sum数组声明后的第一个声明/分配的变量。