« 「トラ技」の記事検索 | トップページ | リコーのデジカメ「GXR+S10」で »

2022年9月 1日 (木)

8ビットマイコンの割り込み処理・・・言い足りないぞ

トランジスタ技術2018年5月号を何気なく見ていたら・・・
PICマイコンの大御所「後閑 哲也」さんが、
割り込み処理に関し
  「ちょっとこれはあかんで」
という表現をされているのを見つけました。

トラ技の特集内容が
  「Python発C行き」 micro:bit&新PIC入門

Pj2

その中の第4章
  高速IoT開発!
  Cプログラミング・ダイエット(1)
  高効率コーディング  著者:後閑 哲也

その73ページ。
~~~~~~~~~~~~~~~~~~~~~~~~~~
 「割り込み処理関数とメイン関数の両方から
  アクセスされる変数はchar型にしておく

Pp1_20220901103201
~~~~~~~~~~~~~~~~~~~~~~~~~~

そうなんですが、注意点が根本的に違う~。
1バイトならokということではなく「アトミック処理」を
しなくちゃならないんです。

このブログで何度も言ってます。
  「たまにおかしくなる」、
  「見つけにくいバグを生む」。

データを1バイトにしても割り込み禁止にしてないと
ミスする例がこれ。
Arduino-UNO 割り込み処理のミスあれこれ:「cnt+n; n=0; 」での抜けを確かめる

データのバイト数に関係なく、割り込みとの競合が生じる
プログラムの組み方が存在するわけです。

※通常は
  0か1か、onかoffかのフラグ処理の1バイトなら
  割り込み禁止にしなくても大丈夫。

  1バイトのダウンカウントタイマー的な処理なら
  割り込み禁止にしなくても大丈夫。

  メイン側は割り込みが書いた1バイトのデータを
  読むだけ、あるいはその逆なら割り込み禁止に
  しなくても大丈夫。

読んで処理して書き戻す(ゼロクリアかも)処理の時に
割り込みとぶつかったらどうなるかということを考え
なければなりません。
1バイトのデータでも、割り込みとの競合を忘れては
いけません。

例では単純なカウントアップ処理でしたが、シリアル通信の
送受割り込み処理などだと、文字抜けが生じるかもしれません。

  ※シリアル割り込み、1バイトの読み書きポインタと
   1バイトの読み書きデータ数で処理すると
   アトミック処理は不要? そんなことはありません。

メモリーのデータだけじゃありません。
8bit単位でアクセスする出力ポートも、割り込みでポートを
操作していたら、メインからの操作と衝突するかもしれません。
メイン側でのアクセスは割込禁止状態でというのが基本。

  ※1bit単位でポートの操作できるマイコンがどんだけ
   ありがたいか。

スカタンなプログラムを書いたら、「たまにおかしくなる」とい
うのがやっかいなのです。

|

« 「トラ技」の記事検索 | トップページ | リコーのデジカメ「GXR+S10」で »

割り込み処理」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 「トラ技」の記事検索 | トップページ | リコーのデジカメ「GXR+S10」で »