太多的 if else 语句,如果 "index" 变量逻辑每次循环递增 1,是否可以优化它?

Too many if else statements, can it be optimized given the "index" variable logic is incrementing by 1 every loop?

在我的嵌入式系统中, 当系统 运行ning 时,以下 C 代码将通过一个永远的 while 循环在 main 中调用。 有没有更好的方法来优化下面的C代码,使其没有 遍历所有 if else 语句。我在想有没有更好的方法 使代码 运行 更快,因为“index”在每个循环中递增 1。“index” 从 0 开始,递增到 7,然后重置回 0。它处于 重复模式。

优化的原因是下面的代码需要运行每 几微秒。

示例代码如下: 注意有些值是虚构的。

void main(1)
{
    static int index = 0;

    while (1) {
        if (index == 0) {
            valueA = 0.88;
            valueB = 0.88;
            PID.A0 = 0.0012 * 15;
            PID.A1 = -0.001 * 15;
            index++;
        }
        else if (index == 1) {
            valueA = 0.87;
            valueB = 0.87;
            PID.A0 = 0.0012 * 8;
            PID.A1 = -0.001 * 8;
            index++;
        }
        else if (index == 2) {
            valueA = 0.86;
            valueB = 0.86;
            PID.A0 = 0.0012 * 6;
            PID.A1 = -0.001 * 6;
            index++;
        }
        else if (index == 3) {
            valueA = 0.83;
            valueB = 0.83;
            PID.A0 = 0.0012 * 5;
            PID.A1 = -0.001 * 5;
            index++;
        }
        else if (index == 4) {
            valueA = 0.79;
            valueB = 0.79;
            PID.A0 = 0.0012 * 3;
            PID.A1 = -0.001 * 3;
            index++;
        }
        else if (index == 5) {
            valueA = 0.73;
            valueB = 0.73;
            PID.A0 = 0.0012 * 2;
            PID.A1 = -0.001 * 2;
            index++;
        }
        else if (index == 6) {
            valueA = 0.71;
            valueB = 0.71;
            PID.A0 = 0.0012 * 1;
            PID.A1 = -0.001 * 1;
            index++;
        }
        else if (index == 7) {
            valueA = 0.68;
            valueB = 0.68;
            index = 0;
        }
    }           // end of while()
}

您可以通过查找来简化逻辑 table:

void main(1)
{
    static int index = 0;

    struct {
        double valueA;
        double valueB;
        double PID_A0;
        double PID_A1;
    } values[] = {
        { 0.88, 0.88, 0.0012 * 15, -0.001 * 15 },
        ...
        { 0.68, 0.68, 0, 0 }
    };

    while (1) {
        valueA = values[index].valueA;
        valueB = values[index].valueB;
        if (index != 7) {
            PID.A0 = values[index].PID_A0;
            PID.A1 = values[index].PID_A1;
            index++;
        } else {
            index = 0;
        }
    }
}

我的第一个倾向是查找 table,如 @dbush 的回答中所述,但您也可以选择手动展开循环,从而完全消除条件 index 变量:

while (1) {
    valueA = 0.88;
    valueB = 0.88;
    PID.A0 = 0.0012 * 15;
    PID.A1 = -0.001 * 15;

    valueA = 0.87;
    valueB = 0.87;
    PID.A0 = 0.0012 * 8;
    PID.A1 = -0.001 * 8;

    valueA = 0.86;
    valueB = 0.86;
    PID.A0 = 0.0012 * 6;
    PID.A1 = -0.001 * 6;

    valueA = 0.83;
    valueB = 0.83;
    PID.A0 = 0.0012 * 5;
    PID.A1 = -0.001 * 5;

    valueA = 0.79;
    valueB = 0.79;
    PID.A0 = 0.0012 * 3;
    PID.A1 = -0.001 * 3;

    valueA = 0.73;
    valueB = 0.73;
    PID.A0 = 0.0012 * 2;
    PID.A1 = -0.001 * 2;

    valueA = 0.71;
    valueB = 0.71;
    PID.A0 = 0.0012 * 1;
    PID.A1 = -0.001 * 1;

    valueA = 0.68;
    valueB = 0.68;
}           // end of while()