あかんやん「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マイコンのアーキテクチャではむちゃ貴重なエリア
なのです。























最近のコメント