« Microchip StudioでMPLAB@Snapが動かない | トップページ | 遠くから「モールス」音が聞こえてきた »

2025年6月13日 (金)

あかんやん「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コンパイラ」のオプティマイズを変更。
Opt11
初期設定が-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マイコンのアーキテクチャではむちゃ貴重なエリア
なのです。

 

|

« Microchip StudioでMPLAB@Snapが動かない | トップページ | 遠くから「モールス」音が聞こえてきた »

Help me! (助けて!)」カテゴリの記事

AVRマイコン」カテゴリの記事

コメント

コメントを書く



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




« Microchip StudioでMPLAB@Snapが動かない | トップページ | 遠くから「モールス」音が聞こえてきた »