2011-09-27 13 views
6

現在、我々はAVRマイクロコントローラ(Ansi C89標準のみ)のプログラム方法を学習しています。含まれているドライバの一部は、スケジューリング、すなわち異なる速度でタスクを実行するヘッダーです。 「各タスクは、静的なローカル 変数を使用することにより、自身の状態を維持しなければならない。」状態を維持するためにvoid *が使用されています...(Cプログラミング)

:私の質問は、ドキュメントからの引用で行うことです

実際にはどういう意味ですか?彼らは状態を維持するために関数にvoid*を渡すようですが、それを使用しないでください?私はこれを収集し、ファイル内のコードを見てみると

は、彼らが何を意味するかです:

{.func = led_flash_task, .period = TASK_RATE/LED_TASK_RATE, .data = 0} 
/* Last term the pointer term */ 

しかし、それは唯一のスケジューラとして機能し、アレイ内の上記のパラメータを使用して実行機能があります。次に関数led_flash_task

static void led_flash_task (__unused__ void *data) 
{ 
    static uint8_t state = 0; 

    led_set (LED1, state); /*Not reall important what this task is */ 
    state = !state; /*Turn the LED on or off */ 
} 

ヘッダ

#define __unused__ __attribute__ ((unused)) 

からのものであり、void *dataの通過は、タスクの状態を維持することを意味しますか?これは何を意味していますか?

感謝 - あなたは__unused__コンパイラマクロから見ることができるようにあなたの助け

答えて

5

のためのパラメータが未使用です。通常、これは、メソッドが特定のシグネチャ(割り込みハンドラ、新しいスレッドなど)と一致する必要があるために行われます。void * func(void * data)のような署名があるpthreadライブラリのケースを考えてみましょう。あなたはデータを使用しても使用しなくてもかまいませんが、コンパイラが不平を言うと__unused__マクロを固執すると、コンパイラに何をしているのかを知らせる警告が表示されなくなります。

静的変数は、静的変数はメソッド呼び出しからメソッド呼び出しに変更されないので、変数は呼び出し間で保持され、したがって状態を保持します(C++ 11ではスレッドセーフのみ)。

+0

+1スレッドセーフです。このconStraintと、uC上のマルチスレッドOSがあれば、そのようなすべてのモジュールのトップに大規模なバナーを含めることにします: '静的な状態を維持する - 複数のスレッドから呼び出されてはいけません'。 –

1

参照してください: 未使用 この属性は、変数に添付、変数はおそらく未使用であることを意味していることを意味します。 GCCはこの変数に対して警告を生成しません。

1

ステートは、ローカル静的変数で管理する必要があります。あなたの例では

static uint8_t state = 0; 

:staticキーワードで関数内で宣言された変数を意味

これはタスクに渡されるパラメータとは関係ありません。この例では使用されません。

関連する問題