あかんやん「Microchip Studio」
AVRマイコンのポート操作、I/Oマクロとして以下のように記述したとき
#define PA0_H (PORTA |= (1 << PA0)) // PA0 Hに
#define PA0_L (PORTA &= ~(1 << PA0)) // PA0 Lに
以前の「Atmel Studio」では「SBI」「CBI」命令に展開されて
最速の実行コードが生成されていました。
※Arduino UNO R3でも同じ
新しいPC(win11マシン)にインストールして使い始めた
「Microchip Studio」でも同じだと思ってたら、ポート
への出力がエラい遅いんです。
展開されたアセンブラのソースを見ると、
Hへの制御は「IN, OR, OUT」と、
Lへの制御は「IN, AND, OUT」と。
この3命令に展開されています。
単純に実行が遅れるだけでなく、割り込み処理の中と
メイン側で同じポートへのアクセスがあると、相互の競合が
発生します。
メイン側では「割り込み禁止・割り込み再開」を
指示しなくちゃならないので、よけいに遅くなってしまいます。
コンパイラのオプション指定で変化するんだろうと考え
ているのですが、どこを触れば良いのか探し出せてません。
困ったぞ!
※その後・・・おそらく解決
「ALT-F7」でプロジェクトのプロパティを出し、
「GNU Cコンパイラ」のオプティマイズを変更。
初期設定が-Og:デバッグ時の設定になっていました。
-O1, -O2, -O3, -Osのどれでも「SBI」「CBI」に
展開してくれるようになりました。
一件落着!! よかったゾ。
あとはMPLAB@Snapの扱い。
Microchip Studio内からの書き込み操作じゃなく、
別のツールを使うか・・・
※関連
2019年3月25日:割り込みで処理させるwordデータの扱い
この中で示しているポートのH/L操作、
#define PB5_H (sbi(PORTB,PORTB5))
#define PB5_L (cbi(PORTB,PORTB5))
ここでの「sbi()」「cbi()」そのものが、こんな具合に
「SFR &= ~b」「SFR |= b」なっているのです。
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
wiring_private.hの中で定義
この1命令でビット操作ができるのはアドレス0x00~0x1Fまでの
32バイトの区間にあるものだけ。
AVRマイコンのアーキテクチャではむちゃ貴重なエリア
なのです。
| 固定リンク
「Help me! (助けて!)」カテゴリの記事
- あかんやん「Microchip Studio」(2025.06.13)
- Microchip StudioでMPLAB@Snapが動かない(2025.06.12)
- オムロンのタイマー「H7ET-FBV」のGATE入力回路はどうなっているの?(2025.04.24)
- 2.0mmピッチの電線対電線接続用コネクタ(2024.12.11)
- この「テープ」は何という名前?(2024.10.01)
「AVRマイコン」カテゴリの記事
- その後のMPLAB@Snap(2025.07.16)
- あかんやん「Microchip Studio」(2025.06.13)
- Microchip StudioでMPLAB@Snapが動かない(2025.06.12)
- AVRマイコンAT90S1200を使ったデジタル時計(2024.06.02)
- 数値をBCD出力(表示)するルーチン #3(2024.05.03)
コメント