2017-12-29 22 views
0

私は私のSTM32F4ベースボードにFreeRTOSを使用している、と私は理解し、適用が容易キューやセマフォとタスク間の通信について読みます。STM32 - 複数のタスクからI/Oを読む

しかし、ドキュメンテーションに、私は例えば、異なるタスクから同じメソッドを呼び出すことが安全である場合についての情報を見つけることができません:

void DefaultTask(void const * argument) 
{ 
    uint8_t pin = 10; 
    uint16_t analog = ADC_GetAnalog(pin); 
    uint32_t encoder = Encoder_GetCount(1); 
} 

void SecondTask(void const * argument) 
{ 
    uint8_t pin = 14; 
    uint16_t analog = ADC_GetAnalog(pin); 
    uint32_t encoder = Encoder_GetCount(2); 
} 

ADC_GetAnalog:

uint16_t ADC_GetAnalog(uint8_t PinNumber) 
{ 
    if((PinNumber >=1)&&(PinNumber<=18)) 
    { 
     return ADC_Pin[PinNumber].AnalogValue; 
    } 
    else 
     return 0; 
} 

私はまた、(その増分を中断/ htim#のプロパティCNTをデクリメント)私のシステムで複数のエンコーダを持っている、とも異なるタスクから、ADCと同じラインでのreadメソッドを呼び出します。

uint32_t Encoder_GetCount(uint8_t encoder_num) 
{ 
    volatile __IO uint32_t count = 0; 
    switch(encoder_num) 
    { 
    case 1: 
     count = htim1.Instance->CNT; 
     break; 
    case 2: 
     count = htim3.Instance->CNT; 
     break; 
    case 3: 
     count = htim5.Instance->CNT; 
     break; 
    default: 
     break; 
    } 

    return (uint32_t)count; 
} 

今日、私はこの方法を使用しますが、それは最高の(安全な)方法だかどうかを知りたいと思います!

+0

関数はリエントラントであるかどうか、あなたは、本質的に求めているとして、再入可能性やスレッドの安全性の概念は、あなたが上に読むことができるトピックです。 – rjp

答えて

1

は、それだけでそれらを書いていない、ものを読んでいると同時に呼び出すことができ、あなたの機能を表示されます。だからあなたは行くのが良いです。たとえあなたが物事を書いていたとしても、それがローカル変数なら、それはいいです(それぞれのタスクはそれ自身のコピーを持ちます)。

グローバル変数を書くとき、または特定の周辺機器に書き込むときに同期に注意する必要があります。 、シリアルフラッシュチップ、2つのタスクで同時に使用する必要はありません)。それに対処する1つの方法は、単にセマフォ/ミューテックスを使用する方法です。可能であれば(可能であれば)このペリフェラルにアクセスするタスクは1つしかないことが望ましいです。クリーンな設計がメンテナンス可能なシステムにとって重要です。

1

機能によって異なります。異なるタスクからそれらを呼び出すことが安全である必要がありますので

あなたの機能は、すべてのグローバル変数を変更しません。

たとえば、グローバル変数に書き込む関数があるとしたら、 2番目のコールは、最初のコールによって加えられた変更を上書きします。バッファを使用してデータを送信する場合、タスクは両方とも同じバイトを送ることができます(タイミングに依存します)。あなたが提供したものから

+0

素晴らしい!これらの共有メソッドで変数を読み込むだけですが、他のメソッドもありますが、この場合はセマフォを使用しました。 –

関連する問題