8ビットマイコンの割り込み処理・・・言い足りないぞ
トランジスタ技術2018年5月号を何気なく見ていたら・・・
PICマイコンの大御所「後閑 哲也」さんが、
割り込み処理に関し
「ちょっとこれはあかんで」
という表現をされているのを見つけました。
トラ技の特集内容が
「Python発C行き」 micro:bit&新PIC入門
その中の第4章
高速IoT開発!
Cプログラミング・ダイエット(1)
高効率コーディング 著者:後閑 哲也
その73ページ。
~~~~~~~~~~~~~~~~~~~~~~~~~~
「割り込み処理関数とメイン関数の両方から
アクセスされる変数はchar型にしておく」
~~~~~~~~~~~~~~~~~~~~~~~~~~
そうなんですが、注意点が根本的に違う~。
1バイトならokということではなく「アトミック処理」を
しなくちゃならないんです。
このブログで何度も言ってます。
「たまにおかしくなる」、
「見つけにくいバグを生む」。
データを1バイトにしても割り込み禁止にしてないと
ミスする例がこれ。
Arduino-UNO 割り込み処理のミスあれこれ:「cnt+n; n=0; 」での抜けを確かめる
データのバイト数に関係なく、割り込みとの競合が生じる
プログラムの組み方が存在するわけです。
※通常は
0か1か、onかoffかのフラグ処理の1バイトなら
割り込み禁止にしなくても大丈夫。
1バイトのダウンカウントタイマー的な処理なら
割り込み禁止にしなくても大丈夫。
メイン側は割り込みが書いた1バイトのデータを
読むだけ、あるいはその逆なら割り込み禁止に
しなくても大丈夫。
読んで処理して書き戻す(ゼロクリアかも)処理の時に
割り込みとぶつかったらどうなるかということを考え
なければなりません。
1バイトのデータでも、割り込みとの競合を忘れては
いけません。
例では単純なカウントアップ処理でしたが、シリアル通信の
送受割り込み処理などだと、文字抜けが生じるかもしれません。
※シリアル割り込み、1バイトの読み書きポインタと
1バイトの読み書きデータ数で処理すると
アトミック処理は不要? そんなことはありません。
メモリーのデータだけじゃありません。
8bit単位でアクセスする出力ポートも、割り込みでポートを
操作していたら、メインからの操作と衝突するかもしれません。
メイン側でのアクセスは割込禁止状態でというのが基本。
※1bit単位でポートの操作できるマイコンがどんだけ
ありがたいか。
スカタンなプログラムを書いたら、「たまにおかしくなる」とい
うのがやっかいなのです。
| 固定リンク
「割り込み処理」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 8ビットマイコンの割り込み処理・・・1バイトに収まるなら1バイトに(2023.03.01)
- 8bitマイコンにも16bitのメモリ読み書き命令があった(2022.10.14)
- 何度も言うぞ! Arduino(8bitマイコン)の割り込みには気をつけろ!(2022.10.11)
- ロータリーエンコーダーのチャタリング波形(2022.09.11)
コメント