8ビットマイコンの割り込み処理・・・1バイトに収まるなら1バイトに
2022年9月1日:8ビットマイコンの割り込み処理・・・言い足りないぞ
ここ↑では、トランジスタ技術2018年5月号での記述を
「ちょっと違うけどなぁ」っと話題にしました。
この内容↓です。
「割り込み処理関数とメイン関数の両方から
アクセスされる変数はchar型にしておく」
確かに、1バイトにしておくと安全側にはなるのですが、
間違いなく割り込みを動かそうとすると、アトミック処理
(いったんn割り込み禁止にしてごそごそ)が必須です。
で、またまた何気なく古いトラ技を見ていたらの話
になります。
今度は2019年4月号。
この連載:宇宙ロケットMOMO 開発深堀り体験<2>
ブロック図を記したp.129の図1を見ると、ジャイロや
サーボの制御に8bitマイコンATmega328が乗った
Arduino Pro Miniが使われています。
p.135に制御ソフトが載っていたんで、ちょっと
追いかけてみました。
まず、目に入ったのが割り込みで処理されるであろう
変数です。
Volatileが前置されたint値(2バイト値)です。
これを使うのが0.1ms周期のタイマー割り込みの中。
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という関数で値を
出していました。
これはメイン側の処理です。
gimbal_agl_to_pwmがint値を算出して、それを
pwm_h_periodeに書く時に割り込みが入ると
どうなるか・・・
2バイト値ですので、2回に分けて値が書き込まれます。
もしその中間で割り込みが入り、なおかつ、
0x00FF → 0x0100 や 0xFFFF(-1) → 0x0001(+1)の
ような2バイトにまたがる数値の変化が発生したら、
割り込み処理での数値判定をミスするかもしれません。
しかし・・・このプログラムでは
・pwm_cntは200が最大値なんで、int値(2バイト)の
下位側しか変化しない。
・関数gimbal_abl_to_pwmが返す値は
+8~+20の範囲で1バイトの範囲内。
負にもならない。
ということで、2バイトデータと割り込み処理との競合は
大丈夫でした。
でも、もし上位バイト変化するようなint値なら
割り込み禁止にしてデータを更新して割り込み処理に
知らせるというアトミック処理が必須です。
このプログラムでは、変数が1バイトに収まるならデータの
宣言は1バイトでということにしておくと、処理も速くなるし
でエエんじゃないでしょか。
ただ、昔人間からすると、
charは符号有りか符号無しかどっちやねん?
コンパイラはどう処理するんや?
Arduino環境なら符号無しは byte やろ。
今ふうにちゃんと書くなら uint8_t、int8_t で宣言か。
こんなところが気になります。
| 固定リンク
「Arduino」カテゴリの記事
- Arduino UNO R3で周波数を計る(2025.05.16)
- Arduino UNO R3のクロック精度を1MHzパルスで確かめる(2025.04.28)
- Arduino、analogWriteは捨てちゃえ。ちゃんとしたPWMの例(2025.03.22)
- パルスジェネレータをI2C液晶で動かす(2025.01.28)
- EEPROMを使ったシリアル受信バッファ 512kバイトに増設(2024.12.26)
「割り込み処理」カテゴリの記事
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
- 最適化処理のせいで悩んだぞ 呪文volatile再び(2024.06.06)
- I2C液晶のアクセス、割り込みで処理しないようにすると(2024.04.12)
- I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの(2024.04.07)
「トランジスタ技術」カテゴリの記事
- Arduino UNO R3で周波数を計る(2025.05.16)
- トラ技原稿執筆時の注意点(2025.05.02)
- CQ ham radio 5月号に「14年ぶりに改正されたJIS規格」の記事(2025.04.26)
- 失敗は成功の母<第3回>: 同じ型名なのに内部回路が違う!?(2025.04.16)
- 「ペイル・ブルー・ドット」が読める「暗号の子」(2025.03.29)
コメント