2

私はマイクロコントローラーの C プログラミングの初心者であり、ネストされたループの使用に関していくつかの問題に直面しています。以下は、私の C コードにあるサンプル コンストラクトです。問題点は後述

// I am trying to ramp down the while loop
while (i>= stop_value)
{
    step_value = default_value;
    R32(a particular register, content_register);
    if (content_register = a_set_value)
    {
        if( step_value <= step_max)
        {
            step_value = step_value +1;
            i=start_value;
            continue;
        }
        if(step_value =step_max)
        {
            // do something;
            break;
        }
    }
    WR32(a particular register, content_reset_register); // resetting the register
    i=i-1;
}

基本的に、私は次のことをしようとしています: stop_value に達するまでループをランプダウンし、ランプダウン中に特定のレジスタを読み取ります。レジスタに定義済みの値がある場合は、step_value<= step_max かどうかを確認します。step_value < step_max の場合、continue ステートメントを使用して while ループをリセットし、i を初期開始値に設定します。この時点で、step_value はデフォルトのステップ値ではなく、最新の値である必要があります。step_value を default_value に初期化するため、上記のコードが step_value に対して完全に正しくないことは理解しています。 step_value?) しかし、step_value が私の step_max と等しい場合は、何かを実行してから中断します (この部分は機能します!)。また、

したがって、最新の step_value で while ループを効果的にリセットしたいのですが、step_value が step_max 未満の場合、レジスタの内容はリセットされますか? 返信ありがとうございます。

4

2 に答える 2

1

次の代替案の少なくとも 1 つが適用されると仮定します。

まずC言語=では、割り当てられた値を返し、その値が と等しくない場合に true を想定する代入があります0。したがって、== 代わりにすべての if ステートメントで使用する必要が=あります (1 つのステップで if ステートメントで != 0 を割り当ててチェックすることが望ましい動作でない限り - しかし、その場合でも、2 つのステップでこれを行うことをお勧めしますより良い保守性)、つまり代わりに

if (content_register = a_set_value)
    {
            // your code
    }

私は言うだろう

content_register = a_set_value;
if (content_register!=0)
    {
            // your code
    }

何をチェックしているのかをより明確にするために。

Second、 if (そして2nd でstep_value==step_max適切に使用している場合)、両方の IF が実行されますが、これはあなたが望むものではありません。だからあなたはあなたが代わりに意味したと思います。==if<<=

3 番目に、私たちのチャットから、ループが外部スレッドからのレジスタ変更を待っているという情報を得ました。この場合、ループは単純にレジスタのリセットが速すぎます。同期を検討するか、少なくともレジスタをリセットした後にスレッド スリープを追加して、他のスレッドがレジスタを変更できるようにします。

これを変更して、動作するかどうかを確認します。

于 2013-04-09T15:36:21.680 に答える
1

このコードでは:

   if( step_value <= step_max)
    {
        step_value = step_value +1;
        i=start_value;
        continue;
    }
    if(step_value =step_max)
    {
        // do something;
        break;
    }

到達できない場合の2番目。<= をチェックしてから、continue でループの最後までスキップしています。

上記のロジックから:

次に、step_value<= step_max かどうかを確認します。step_value < step_max の場合、continue ステートメントを使用して while ループをリセットし、i を初期開始値に設定します。

そのコードはおそらく次のようになります。

   if( step_value < step_max)
    {
        step_value = step_value +1;
        i=start_value;
        continue;
    }
    ...

次に、2 番目の if を評価できます。これにより、到達不能なコードや if ステートメント内の代入に夢中になるようなコンパイラ警告が生成されるはずです。コンパイラの警告を有効にして、聞いてください!

于 2013-04-09T16:39:32.903 に答える