mbed InterruptIn はネストするか
答: デフォルトではしない
ARMのNVIC (Nested Vector Interrupt Controller) は名前の通りネスト可能ですが、実行中の処理よりも優先順位が高いものだけがネストします(ネストとは割り込み処理中にさらに割り込みが発生すること)。
mbed の場合、優先度を設定するAPIはないため、全割り込みは同一優先順位となり、他の割り込みがネストすることはありません (ライブラリ側でやってる場合を除く)。
優先度をつけるには
もし優先順位をつけてネスト可能にする場合、CMSIS(ARM規定のAPI群)のAPI (NVIC_SetPriority()) を使えば可能です。ただ、このAPIを使うためには、mbedのどのAPIでどんな割り込みを設定しているかを把握している必要があります (mbed 側のコードを全部読む必要がある)。
Cortex-M0 の NVIC の割り込みの優先の仕組み
優先順位は0から3までの4段階あり、0が最も優先です。
デフォルトでは全ての割り込みが0に設定されているので、相互に割り込みがネストすることはなく、通常処理が動いている間だけ割り込みが発生します。
また、通常処理についても、__disable_irq() を呼ぶと一時的に優先度0のコードになり、割り込みが発生しなくなります。__enable_irq() で元の優先度に戻ります。
外部ピン変化割り込みで情報が失われるケース
割り込み発生から、次の割り込みまでの間に2回ピン変化が起こると、2つめの変化による割り込み情報は失われます。
ある割り込みを優先した場合、その割り込みと同じ優先度の割り込み(その割り込み自身を含む)の処理時間だけ考えればいいことになります。
関連エントリー
- mbed のフレームワークの温度感 mbed の API 経由でできる以上のことをやろうとする場合、結局 mbed 側で何をやっているか (どのAPIでどのレジスタが変更される...
- 割込みと WFI 命令を使った sleep の実装 mruby で Raspberry Pi の GPIO をいじるというやつで、sleep をビジーループにしていたのがどうしてもひっかかって...
- BLE Nano (nRF51822)、waitForEvent ( sd_app_evt_wait() ) 中に予期せず WDT が発動する場合 ぐっすり寝てると犬に噛まれて殺される。 BLE で接続を維持しつつ、waitForEvent ( sd_app_evt_wait() ) で...
- BLE Nano + mbed の ADC の基準電圧 BLE Nano + mbed での ADC の基準電圧は VDD の 1/3 になっています。当然ながら VDD が変動するケースではこの...
- LPC11U35 の mbed ローカル開発環境構築 秋月でLPC11U35 が乗っているボードを買った。うっかり3枚買っていた。EA LPC11U35 QuickStart Board と互換...