« きゃ~ ピピちゃんの着陸場所 | トップページ | こども向けの本がおもしろい 『押す図鑑 ボタン』 »

2023年3月 1日 (水)

8ビットマイコンの割り込み処理・・・1バイトに収まるなら1バイトに

2022年9月1日:8ビットマイコンの割り込み処理・・・言い足りないぞ
ここ↑では、トランジスタ技術2018年5月号での記述を
「ちょっと違うけどなぁ」っと話題にしました。

この内容↓です。
 「割り込み処理関数とメイン関数の両方から
  アクセスされる変数はchar型にしておく」

Pp1_20220901103201

確かに、1バイトにしておくと安全側にはなるのですが、
間違いなく割り込みを動かそうとすると、アトミック処理
(いったんn割り込み禁止にしてごそごそ)が必須です。

で、またまた何気なく古いトラ技を見ていたらの話
になります。
今度は2019年4月号
Tr1904  

この連載:宇宙ロケットMOMO 開発深堀り体験<2>

ブロック図を記したp.129の図1を見ると、ジャイロや
サーボの制御に8bitマイコンATmega328が乗った
Arduino Pro Miniが使われています。

Tr1904a

p.135に制御ソフトが載っていたんで、ちょっと
追いかけてみました。
T11a_20230301162201

まず、目に入ったのが割り込みで処理されるであろう
変数です。
Volatileが前置されたint値(2バイト値)です。

T11b  

これを使うのが0.1ms周期のタイマー割り込みの中

T11c

pwm_cntがアップカウンタで、200になったら
出力ピンをHにしてゼロクリア。
そして、pwm_cntがpwm_h_periodeになったら
出力ピンをLにという制御。
200がPWM周期でpwm_h_periodでPWMの
パルス幅を決めています。
pwm_cntはこの割り込みの中だけで使われて
いるようなので、割り込みとの競合は問題なし。

比較するデータpwm_h_periodはどうかと追いかけ
ますと、gimbal_agl_to_pwmという関数で値を
出していました。
これはメイン側の処理です。

T11d

gimbal_agl_to_pwmがint値を算出して、それを
pwm_h_periodeに書く時に割り込みが入ると
どうなるか・・・

2バイト値ですので、2回に分けて値が書き込まれます。
もしその中間で割り込みが入り、なおかつ、
0x00FF → 0x01000xFFFF(-1) → 0x0001(+1)の
ような2バイトにまたがる数値の変化が発生したら、
割り込み処理での数値判定をミスするかもしれません。

しかし・・・このプログラムでは
  ・pwm_cntは200が最大値なんで、int値(2バイト)の
   下位側しか変化しない。
  ・関数gimbal_abl_to_pwmが返す値は
   +8~+20の範囲で1バイトの範囲内。
   負にもならない。

ということで、2バイトデータと割り込み処理との競合は
大丈夫でした。
でも、もし上位バイト変化するようなint値なら
割り込み禁止にしてデータを更新して割り込み処理に
知らせるというアトミック処理が必須です。

このプログラムでは、変数が1バイトに収まるならデータの
宣言は1バイトでということにしておくと、処理も速くなるし
でエエんじゃないでしょか。

ただ、昔人間からすると、
  char符号有り符号無しかどっちやねん?
     コンパイラはどう処理するんや?
  Arduino環境なら符号無しは  byte やろ。
  今ふうにちゃんと書くなら uint8_tint8_t で宣言か。
こんなところが気になります。

|

« きゃ~ ピピちゃんの着陸場所 | トップページ | こども向けの本がおもしろい 『押す図鑑 ボタン』 »

Arduino」カテゴリの記事

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

トランジスタ技術」カテゴリの記事

コメント

コメントを書く



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




« きゃ~ ピピちゃんの着陸場所 | トップページ | こども向けの本がおもしろい 『押す図鑑 ボタン』 »