0

システム内の外部ハードウェアと通信するコードがあります。外部ハードウェアによって送信されたイベントに従って、Cソースの状態が変化します。システムの起動中にいくつかのハンドシェイクが発生し、ハンドシェイクに基づいていくつかの情報を他のモジュールに送信する必要があります。コールバックにいくつかのグローバル変数を設定しましたが、外部ハードウェアがいくつかのイベントを2回送信しているため、一部のコールバックが2回呼び出されていることがわかります。これにより、グローバル変数の情報が破損します。

 int global_value = 0;
 int eventcb()
 {
    if (some condition)
          global_value = 1;
    else if (some condition)
          global_value = 2;
    else
          global_value = 0;
 }

上記のコードが初めてglobal_value=1と呼ばれるとき、たとえば; 次回コールバックが呼び出されたとき、条件は存在しないため、global_valueは0になります。このコールバックが呼び出された回数を追跡するために別のグローバル変数を使用したくない、またはファイルベースのアプローチ(作成ファイルシステム内のファイル)。この状況に対処するための最適な方法はありますか?イベントを1回だけ送信するように外部ハードウェアを制御することはできません。

4

2 に答える 2

0

キューを実装できます。コールバックごとに、global_valueとその他のパラメーター(たとえば、コールバックを識別するためのコールバックIDなど)を持つコールバックデータを作成できます。global_valueの現在のコンシューマーは、キューからデータを選択して使用し、キューからアイテムを消去できます。global_valueオブジェクトからデータを読み取っているある種のコンシューマーがいると思います。

于 2012-07-23T14:40:08.863 に答える
0
int global_value = -1;
 int eventcb()
 {
    if (some condition && (global_value != -1) )
          global_value = 1;
    else if (some condition && (global_value != -1) )
          global_value = 2;
    else
          global_value = 0;
 }

基本的に、グローバルが初期状態にある場合にのみ、状態遷移を変更します。

もちろん、ifステートメントに条件を追加して、すべての状態遷移が適切にカバーされていることを確認できます。

于 2012-07-23T14:44:07.547 に答える