Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Arduinoの割り込み許可/禁止関数(interrupts/noInterrupts)はそれぞれのボード固有の命令の読み替えをしてくれている

割り込み許可はinterrupts関数、割り込み禁止はnoInterrrupts関数。
というわけで……余計な最適化を阻止したいなら
割り込み禁止と許可の関数でサンドイッチ。

noInterrupts(); //割り込み禁止

// ...ここに割り込み禁止な内容を

interrupts(); //用が済んだらコンパイラさんにお知らせしましょう。

ボードごとに実際つかってる関数は違う

実は上記の関数はそれぞれのターゲットボードで使う関数のラッパーです。
実際の定義はボードごとのarduino.hに記述されておりAVR系だと

#define interrupts() sei()
#define noInterrupts() cli()

esp8266系だと

#define interrupts() xt_rsil(0)
#define noInterrupts() xt_rsil(15)

STM32なら

#define interrupts() __enable_irq()
#define noInterrupts() __disable_irq()

といった具合で読み替えが行われます。

プロジェクトが未来永劫 Arduino mega系ボードでしか使わないなら、AVR専用関数を使うってのも手です。
とはいえ……折角Arduinoを使ってるわけなので移植性は可能な限り守ったほうが後々幸せになれる……とボクは思います。