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

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

Note

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

Show/hide構文

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

Show/hide使用法

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

void __disable_irq(void); は割り込みをディセーブルにします。

Show/hide戻り値

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

Show/hide

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

Show/hide制約条件

--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 内の割り込みフラグが変更されることはありません。

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0491EJ
Non-ConfidentialID081711