10.113 __disable_irq コンパイラ組み込み関数

このコンパイラ組み込み関数は、IRQ 割り込みをディセーブルにします。

通常、このコンパイラ組み込み関数は、CPSR で I ビットを設定することによって、IRQ 割り込みをディセーブルします。ただし、M プロファイルの場合は、例外マスクレジスタ(PRIMASK)が設定されます。

構文

int __disable_irq( void );
void __disable_irq( void );

使用法

int __disable_irq( void ); は、割り込みを無効にし、それ以前に IRQ 割り込みマスクが PSR に持っていた値を返します。
void __disable_irq( void ); は割り込みをディセーブルにします。

戻り値

int __disable_irq( void ); は、IRQ 割り込みが無効にされる以前に IRQ 割り込みマスクが PSR に持っていた値を返します。

void foo(void)
{
    int was_masked = __disable_irq();
    /* ... */
    if (!was_masked)
        __enable_irq();
}

制約条件

--cpu=7 でコンパイルする場合は、 int __disable_irq( void ); はサポートされません。これは、一般的な ARMv7 アーキテクチャと ARMv7 A、R、M の各プロファイルとの例外処理モデルの違いによるものです。つまり、--cpu=7 でコンパイルする場合、コンパイラは、すべての ARMv7 プロセッサで動作する命令シーケンスを生成することはできないため、 int __disable_irq( void ); はサポートされません。 void __disable_irq( void ); 関数プロトタイプを --cpu=7 で使用することはできます。
以下の例に、ARMv7-M と ARMv7-R 間のコンパイルの違いを示します。
/* test.c */
 void DisableIrq(void)
{
  __disable_irq();
}

 int DisableIrq2(void)
{
  return __disable_irq();
}
armcc -c --cpu=Cortex-M3 -o m3.o test.c
  DisableIrq
    0x00000000:  b672      r.    CPSID    i
    0x00000002:  4770      pG    BX       lr
  DisableIrq2
    0x00000004:  f3ef8010  ....  MRS      r0,PRIMASK
    0x00000008:  f0000001  ....  AND      r0,r0,#1
    0x0000000c:  b672      r.    CPSID    i
    0x0000000e:  4770      pG    BX       lr
armcc -c --cpu=Cortex-R4 --thumb -o r4.o test.c
  DisableIrq
    0x00000000:  b672      r.    CPSID    i
    0x00000002:  4770      pG    BX       lr
  DisableIrq2
    0x00000004:  f3ef8000  ....  MRS      r0,APSR ; formerly CPSR
    0x00000008:  f00000080 ....  AND      r0,r0,#0x80
    0x0000000c:  b672      r.    CPSID    i
    0x0000000e:  4770      pG    BX       lr
すべての場合において、__disable_irq コンパイラ組み込み関数を実行できるのは、特権モード、つまり非ユーザモードの場合のみです。このコンパイラ組み込み関数をユーザモードで実行しても、CPSR 内の割り込みフラグが変更されることはありません。
関連する参考文書
10.117 __enable_irq コンパイラ組み込み関数
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.