google-site-verification: google3bd66dd162ef54c7.html
fc2ブログ

VSCode for Arduino でCPUのレジスタを指定するとエラーになる問題

◆まえがき
このところ VSCode-Arduino をいじっています。便利なところも多いのですが、以下の2項目でエラー (Intellisense が指摘する問題) が出て困っています。
 1) CPU内のレジスタを呼び出すと未定義エラーが出る
 2) PROGMEM機能を使うとエラーが出る

これらは処理能力アップのために重要な機能です。もしまともに使えないなら VSCode 自体の使用を止めざるを得ないと思っています。

この記事では、上記1)項のCPUの内部レジスタの呼び出しで発生するエラーについて、その状態と回避策についてまとめてみます。

なお、環境は、OS:Windows10 Pro 21H1、Arduino IDE 1.8.13、VSCode 1.59.0、Arduino for Visual Studio Code 0.5.3 。記事の内容は現時点のもので今後のバージョンアップで状況は変わってくる可能性があります。

【追記】
この問題は設定に問題があったために発生していたものでした。詳しくは8月15日の記事を参照ください。

◆状況
CPUのレジスタを直接叩くコードを書くと、VSCodeから、「レジスタ名が未定義」と指摘される。

例:IOポートを操作した場合
ポート名がエラーになる
これはLチカをポートの直接操作でやっているプログラムです。PORTB と PB5 が未定義と指摘されています。

いろいろ調べて見ると、ポートのレジスタ以外にADコンバーターやタイマーカウンタなどもダメで、マイコンチップ内のハードウエアレジスタへのアクセスは全部ダメみたいです。

話がややこしくなるのですが、こういうエラーが出ていてもコンパイラは正常に通ります。コンパイルは Arduino IDE でやっていて、こちらの環境ではハードウェアのレジスタ名は定義されているので当然でしょう。なおこのあたりの話は、Arduino よもやま話-3 (予約語の定義はどこ?) で触れています。

◆対策
対策方法をネットで調べてみると、
1)エディタで修正
c_cpp_propatiees.jsonの defines の項に、 "__AVR_ATmega328P__", を追加するとOKになるそうです。つまり下記のように赤字部をエディタを使って追加します。

  "defines": [
   "__AVR_ATmega328P__",
   "F_CPU=16000000L",
   ・・・・
このファイルを保存すればすぐにエラーが出なくなります。動的に監視しているようで、すばらしい!

この対策はインストールの時に参考にさせていただいたGarretlabさんのページの「Intellisenseの設定を行う」の項に書かれていたのですが、意味が良く判っていませんでした。

他には、StackOverflowのこちらの情報情報も参考になりました。

2)C/C++ configurationから追記
前項の方法以外に、プリプロセッサの定義に以下のように書き加えてもOKみたいです。
VSCodeの画面から__AVE_ATmega328P__ を設定
Arduino のボードの種類を指定しているのでCPUの種類は判っているはずです。だったらここに自動的に反映してくれても良さそうなものですが、なぜかそうはなっていないみたいです。

ひょっとしたら、マイコンチップ内のハードウエアレジスタのような野蛮なものは触らせない、という意思が背後にあるのかも知れません。

◆追加処置
上記のように "__AVR_ATmega328P__" を追記することで一旦エラーは出なくなります。しかし残念なことに、コードの Verify あるいは UpLoad を実行すると元に戻ってしまい、またエラーが出るようになります。

この対策としては、Arduino extension の拡張機能の設定の、Arduino:Disable Intelli Sense Auto Gen の項目にチェックを付けることで上書きを防止できます。
Disable Auto Gen

しかしこれをやると、c_cpp_propatiees.json が自動作成されなくなるので、VSCode がまともに動作しなくなるようです。一旦自動生成させてからここのチェックを付ける、あるいは同じ内容のファイルをどこかからコピペして持ってくるなどの対応が必要になりそうです。

◆まとめ
対策をあれこれ書いていますが、正直言って対症療法で根本対策にはなっていないと思います。こんな問題点を引きずりながら使うくらいなら、Arduino IDE でプログラムを書いてた方が幸せだと思います。

なお、何か間違いやもっと良い対策などがあれば、コメントでご指摘いただくと幸いです。

次回の記事では PROGMEM を使うとエラーが出る問題について触れてみたいと思います。
カレンダー
07 | 2021/08 | 09
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。
記事の内容のご利用は読者の自己責任でお願いします。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード