メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

すべての割り込みを無効にする (-routine-disable-interrupts -routine-enable-interrupts)

割り込みを無効にして再度有効にするルーチンの指定

説明

このオプションは Bug Finder 解析のみに影響します。このオプションは、MATLAB® コードまたは Simulink® モデルから生成されたコードでは使用できません。

現在のものを除き、すべてのタスクと割り込みを無効にするルーチンと、それらを再度有効にするルーチンを指定します。

このオプションに指定するルーチンは、次のすべてに優先して無効にします。

つまり、解析では、無効にするルーチンと有効にするルーチンの間にある演算本体はアトミックで、まったく割り込むことはできないと見なされます。

オプションの設定

ユーザー インターフェイス (デスクトップ製品のみ): プロジェクト コンフィギュレーションでは、このオプションは [マルチタスキング] ノードで使用できます。同時に有効にしなければならない他のオプションについては、依存関係を参照してください。

ユーザー インターフェイス (Polyspace Platform、デスクトップ製品のみ): プロジェクト コンフィギュレーションでは、このオプションは [マルチタスキング] ノードの [静的解析] タブにあります。同時に有効にしなければならない他のオプションについては、依存関係を参照してください。

コマンド ラインとオプション ファイル: -routine-disable-interrupts オプションおよび -routine-enable-interrupts オプションを使用します。コマンド ライン情報を参照してください。

このオプションを使用する理由

Bug Finder 解析では、データ レースの欠陥を調査する際に、この情報が使用されます。たとえば、次のコードでは、関数 disable_all_interrupts は、関数 enable_all_interrupts が呼び出されるまで、すべての割り込みを無効にします。taskisr1 および isr2 が同時実行される場合でも、演算 x=0 または x=1 が演算 x++ に割り込むことはできません。データ レースの欠陥は生じません。

int x;

void isr1() {
   x = 0;
}

void isr2() {   
   x = 1;                                                                                                   
}

void task() {
   disable_all_interrupts();
   x++;
   enable_all_interrupts();
}

設定

既定値なし

  • [無効にするルーチン] に、すべての割り込みを無効にするルーチンを入力します。

  • [有効にするルーチン] に、すべての割り込みを再度有効にするルーチンを入力します。

関数名を入力するか、一覧から選択します。

  • をクリックしてフィールドを追加し、関数名を入力します。

  • をクリックして、コード内の関数の一覧を表示します。その一覧から関数を選択します。

依存関係

デスクトップ製品のユーザー インターフェイスでこのオプションを有効にするには、最初にオプション [マルチタスクを手動で構成] を選択します。

ヒント

  • 割り込みを無効にすることによる保護は、クリティカル セクションによる保護とは概念的に異なります。

    Polyspace® マルチタスキング モデルでは、コードの 2 つのセクションをクリティカル セクションによって "相互に" 保護するには、それらを同じクリティカル セクション内に組み込まなければなりません。つまり、2 つのセクションは、同じロック関数とロック解除関数の呼び出しの間に配置しなければなりません。

    たとえば、次のようにクリティカル セクションを使用するとします。

    void isr1() {
       begin_critical_section();
       x = 0;
       end_critical_section();
    }
    
    void isr2() {                                                                                                          
       x = 1;
    }
    
    void task() {
       begin_critical_section();
       x++;
       end_critical_section();
    }
    この場合、演算 x++isr1 の演算 x=0 から保護されますが、isr2x=1 からは保護されません。関数 begin_critical_section"すべての割り込み" を無効にした場合は、x++ よりも前でこれを呼び出すことで、この演算は正しく保護されます。

    一般に、割り込みを無効にして再度有効にする場合はコード内でルーチンのペアを 1 つ使用しますが、クリティカル セクションを実装するロック関数とロック解除関数の場合は多くのペアを使用する可能性があります。

  • 割り込みを無効にするルーチンや有効にするルーチンは関数でなければなりません。たとえば、関数のようなマクロを次のように定義するとします。

    #define disable_interrupt() interrupt_flag=0
    マクロ disable_interrupt() は、割り込みを無効にするルーチンとして使用できません。

  • このオプションは、非プリエンプタブル割り込みのセクションをプリエンプタブルにするために使用できます。割り込みのセクションのみをプリエンプタブルにするには、そのセクションの前にすべての割り込みを有効にするルーチンを呼び出し、セクションが完了してからすべての割り込みを無効にする、別のルーチンを呼び出します。

    たとえば、ルーチン isr() を割り込みとして指定すると、既定で非プリエンプタブルになります。ただし、isr() 内では、すべての割り込みを有効にするルーチンを呼び出すと、その呼び出しに続くセクションが、すべての割り込みを無効にする別のルーチンを呼び出すまで、プリエンプタブルになります。

    void isr() {
       x++; //Nonpreemptable
       enable_all_interrupts(); //Routine enabling interrupts
       y++; //Preemptable
       disable_all_interrupts(); //Routine disabling interrupts
       z++; //Nonpreemptable
    }

コマンド ライン情報

パラメーター: -routine-disable-interrupts | -routine-enable-interrupts
既定値なし
値: function_name
例 (Bug Finder): polyspace-bug-finder -sources file_name -routine-disable-interrupts atomic_section_begins -routine-enable-interrupts atomic_section_ends
例 (Bug Finder Server): polyspace-bug-finder-server -sources file_name -routine-disable-interrupts atomic_section_begins -routine-enable-interrupts atomic_section_ends

バージョン履歴

R2017a で導入