とうふ荘の手記てき!

プログラムとか

ルネサスのマイコンをVSCodeを使ってプログラム、そしてCS+でビルド、Flash Programmerで書き込みを行う。



なんでVScodeルネサスマイコンをプログラミングするの?

f:id:tofu-so-shioaji:20190421193746p:plain

Renesasのマイコン(RXファミリなど)をプログラミングするためにはCubeSuite+(CS+)と呼ばれる統合開発環境を使うのですが、私自身、普段はVisual Studio Code(VSCode)と言われているエディターを使っています。

code.visualstudio.com

VScodeは入力補完や拡張機能、コードレンズなど多機能で、エディターとしても軽量な方です。(最近は重くなってきたかも?)

なので、プログラミング、ビルド、マイコンへの書き込みまでをVScodeから行う最低限の手順を備忘録も兼ねてまとめてみました。

ただ、私自身あまりCS+について分かっておらず、勘違いや設定漏れ等が存在する可能性が極めて高いです。その場合は指摘してもらえると幸いです。

ここではVSCodeやCS+のインストールや環境構築は省略します。

なお、今回は以下のような実行環境で実行しました。

  • Windows10
  • CS+ for CC V8.01.00
  • Rebesas Flash Programmer V 3.05.01 無償版
  • Visual Studio Code バージョン: 1.35.0

また、予め今回のディレクトリの構成を示しておきます。

フォルダ構造(ツリー)

***/Test     // プロジェクトフォルダ
│  Test.c     // ソースコード
│  Test.mtpj  // プロジェクトファイル
│ ***略***
│
├─.vscode       // VSCodeに関する設定などを保存するフォルダ
│ ***略***
│
├─DefaultBuild  // ビルドに関するデータを保管するフォルダ
│  Test.mot   // 書き込み時に用いるデータ
│ ***略***
│
└─Flash Programmer
    │  Flash Programmer   // FlashProgrammerのログ(実行時に自動作成)
    │
    └─Test              // Flash Programmeのプロジェクトフォルダ
            Test.rpj    // Flash Programmeのプロジェクトファイル
プロジェクトを作成する

まずは、CS+でプロジェクトを作成します。

この時、「プロジェクト名のフォルダを作成する」にチェックを入れておいてください。後述のビルド、書き込みはこれを前提とした設定にしています。

VSCodeで開く

プロジェクト作成のために起動したCS+は終了させ、作成したプロジェクトのフォルダを右クリックから「Open with Code」を選択して、VSCodeでフォルダを開きます。

f:id:tofu-so-shioaji:20190402204821p:plain
フォルダをVSCodeで開いた状態

左側のリストで編集したい、ファイルを選んでプログラムを行います。

C/C++言語のプログラムを行う際、C/C++拡張機能を持っていない人はソースファイルを開いた際に拡張機能を入れるよう通知が出るはずです。

VSCodeをCS+向けに設定する
文字コードの設定

VSCodeのデフォルトの文字コードは「UTF-8」ですが、CS+は「Shift-JIS」でファイルを生成します。なので、VSCode側の設定でShift-JISのコードとして読み込むようにします。

Ctrl+,と入力し、設定を開き、「ワークスペースの設定」を選択するとその設定は現在開いているフォルダ内だけに適用されます。

その状態で「encoding」と画面上部の検索窓に入力して検索すると「Files: Encoding」という設定がヒットするはずです。これを「shiftjis」に変更すると、VSCodeが「Shift-JIS」でファイルを開くようになります。

iodefine.hに手を加える

CS+のプログラムをVSCodeで開く際に困るのが、CS+特有のキーワードをコード補完機能がうまく認識してくれないことです。

iodefine.hに記述されているSYSTEMPORT0といったレジストリにアクセスするための構造体のフィールドには予測変換機能が働かないどころか、文法エラーであると認識してしまいます。

これの原因は、SYSTEMの定義に書かれている__evenacessというキーワードがRenesasのコンパイラ特有のもので、VSCodeはこれを文法ミスであると認識するようです。よって、VSCodeがこのキーワードを認識出来ないようにします。(正確にはマクロで問題のキーワードを空白として認識させます。)

「iodefine.h」の先頭部分に以下の定義を追記します。

#ifndef __RX62NIODEFINE_HEADER__
#define __RX62NIODEFINE_HEADER__
#pragma bit_order left
#pragma unpack

#ifdef _VSCODE // 追記部分
#define __evenaccess
#endif
***略***

そして、Ctrl+Shift+Pでコマンドパレットを開き、「C/C++」等を入力すると、「edit configurations(JSON)」が候補に出てくるので、それを選択して、C/C++のプロパティを設定するファイル「c_cpp_properties.json」を開きます。

このファイルに_VSCODEを定義し、IntelliSense実行時のみ、キーワードを無視し、コンパイラがビルドする際は無視しないようにします。

***略***
 "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "_VSCODE"
            ],
***略***

これで、レジストリへアクセスする構造体の入力補完が使えるようになります。

f:id:tofu-so-shioaji:20190402213341j:plain
入力補完機能

インクルードパスを追加

CS+のライブラリが読み込まれるようにインクルードパスを追加します。

設定は同じく「c_cpp_properties.json」に設定します。

***略***
"includePath": [
                "${workspaceFolder}/**",
                "{CS+のインストール先}/Renesas Electronics/CS+/CC/CC-RX/V3.01.00/include"
            ],
***略***

Windowsでは一般的な「\(バックスラッシュ)」はディレクトリの区切り文字としては使用できません。「/」か「\\」に置き換えます。

ビルドをVSCcodeから実行できるようにする

VSCodeには作業を自動実行するためのタスクという機能があります。同じくCtrl+Shift+Pでコマンドパレットを開き、「Tasks」と入力すると、「タスクの構成(Configure Task)」が候補に出てくるのでそれを選択してから「テンプレートからtaks.jsonを生成」→「others」を選択し「tasks.json」を開きます。

最初に設定ファイルを作成した際のテンプレートは「Hello」と表示するコマンドを実行するだけなので消してしまっても問題ありません。代わりに以下のように記述します。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build", // ビルドタスク
            "type": "shell",
            "command": "{CS+のインストール先}\\Renesas Electronics\\CS+\\CC\\CubeSuite+.exe",
            "args": [   // 引数指定
                "/bb",   // ビルドを実行
                "${workspaceRoot}\\${workspaceRootFolderName}.mtpj",    // プロジェクトファイル(.mtpj)をディレクトリから指定する
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
 ]
}

これは、CubeSuite+.exeをコマンドラインから引数をつけて実行するタスクです。group以下の設定によりこのタスクがビルドタスクであると認識されます。

(後述しますが、Ctr+Shift+Bのショートカットでビルドタスクは実行できます。)

実行の際、${workspaceRoot}はプロジェクトフォルダまでの完全なパスに置換されます。

${workspaceRootFolderName}はプロジェクトフォルダ名に置換されます。

commandでCubeSuite+.exeファイルが存在するディレクトリを指定します。

プロジェクトの新規作成時、プロジェクトフォルダ名とプロジェクト名を一致させておくことが前提です。

タスクを作成したら、Ctrl+Shift+Bでビルドタスクを実行します。成功すると以下のように表示されます。

f:id:tofu-so-shioaji:20190402223617j:plain
ビルド成功時のコンソール

VSCode内の左側のエクスプローラーからも「DefaultBuild」フォルダが作成され、.motファイルも生成できているのが確認出来ると思います。

Flash ProgrammerでVSCodeからでも書き込めるようにする

VSCodeでプログラミングを行い、ビルドの実行もVSCodeから行えるようになりました。最後にマイコンmotファイルを書き込む操作もVSCodeから呼び出せるようにします。

まず、Renesas Flash Programmerを開いて、新規プロジェクトを作成し、マイコンの選択、(Flash Programmerにおける)プロジェクト名の決定とディレクトリの指定、マイコンとの通信方式と周波数を指定し、初回の通信を行います。

今回は、CS+のプロジェクトフォルダ内に「Flash Programmer」というフォルダを作成し、その中にCS+のプロジェクト名と同一名のプロジェクトを作成することにします。(プロジェクトを作成する際に指定したディレクトリにプロジェクト名のフォルダが作成されるようです。)

また、初回の通信が終わった後に開く画面で、使用するmotファイルを選択し、プロジェクトを保存したらFlash Programmerは閉じてしまっても大丈夫です。

f:id:tofu-so-shioaji:20190609010453j:plain
Flash Programmerの新規プロジェクト作成画面の一例

tasks.jsonをコマンドパレットやエクスプローラーから開いて、以下のように設定を追加します。

"label": "Flash",を含む一連の設定が追加部分です。

{
    ***略***
    "tasks": [
        {
            "label": "Build", // ビルドタスク
            []
        },
        {
            "label": "Flash", // マイコンへの書き込み
            "type": "shell",
            "command": "{Flash Programmerのインストール先})\\Renesas Electronics\\Programming Tools\\Renesas Flash Programmer V3.05\\RFPV3.exe",
            "args": [   // 引数を指定
                "/silent",   // GUI非表示で起動
                "${workspaceRoot}\\Flash Programmer\\${workspaceRootFolderName}\\${workspaceRootFolderName}.rpj", // プロジェクトファイルが存在するディレクトリ
                "/log",  // ログを保存する
                "Flash Programmer/Flash Programmer.log", // ログを保存する場所
            ],
         }
    ]
}

"command"ではFlash Programmerがインストールされているディレクトリと、その中にある実行ファイルRFPV3.exeをフルパスで指定します。

また、RFPV3.exeを実行する際の引数リストargsFlash Programmerのプロジェクトファイルを指定しています。

今回は{CS+のプロジェクトとフォルダ}\\Flash Programmer\\{CS+プロジェクトと同一名のフォルダ}\\{CS+プロジェクトど同一名のFPのプロジェクトファイルのようになっています。

あえて、このように制約を課すことで、設定ファイルをコピペするだけで使えるようにします。

次にCtrl+Shift+Pでコマンドパレットを呼び出し、「Tasks」と入力して「タスクの実行」→「Flash」→「タスクの出力をスキャンせずに続行」を選択すると、コマンドが実行されます。

しかし、RFPV3.exeはほとんど実行結果を出力しないため、うまく行ったのかすごくわかりにくいです。そこでタスク作成時に設定しておいた、ログを読みに行きます。

f:id:tofu-so-shioaji:20190609015054j:plain
Flashタスクの実行結果。すごく分かりにくい。

タスクを実行してから暫く待つと「Flash Programmer」フォルダ内にFlash Programmer.logというログファイルが現れているはずです。これを開くと、Flash Programmerの実行結果がわかります。

f:id:tofu-so-shioaji:20190609015920j:plain
Flash Programmerのログファイルの例

以上で、無事にVSCodeだけでルネサスマイコンにプログラミングをして、コンパイルと書き込みまですることができました。

設定のまとめ

設定方法のみを以下にまとめます。

フォルダ構造(ツリー)

***/Test     // プロジェクトフォルダ
│  Test.c     // ソースコード
│  Test.mtpj  // プロジェクトファイル
│ ***略***
│
├─.vscode       // VSCodeに関する設定などを保存するフォルダ
│ ***略***
│
├─DefaultBuild  // ビルドに関するデータを保管するフォルダ
│  Test.mot   // 書き込み時に用いるデータ
│ ***略***
│
└─Flash Programmer
    │  Flash Programmer   // FlashProgrammerのログ(実行時に自動作成)
    │
    └─Test              // Flash Programmeのプロジェクトフォルダ
            Test.rpj    // Flash Programmeのプロジェクトファイル

.vscode/settings.json

{
    "files.encoding": "shiftjis"
}

iodefine.h

***略***
#ifndef __RX62NIODEFINE_HEADER__
#define __RX62NIODEFINE_HEADER__
#pragma bit_order left
#pragma unpack

#ifdef _VSCODE // 追記部分
#define __evenaccess
#endif
***略***

.vscode/c_cpp_properties.json

***略***
"includePath": [
                "${workspaceFolder}/**",
                "D:/Program Files (x86)/Renesas Electronics/CS+/CC/CC-RX/V3.01.00/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "_VSCODE"
            ],
***略***

.vscode/tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build", // ビルドタスク
            "type": "shell",
            "command": "{CS+のインストール先}\\Renesas Electronics\\CS+\\CC\\CubeSuite+.exe",
            "args": [   // 引数指定
                "/bb",   // ビルドを実行
                "${workspaceRoot}\\${workspaceRootFolderName}.mtpj",    // プロジェクトファイル(.mtpj)をディレクトリから指定する
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "Flash", // マイコンへの書き込み
            "type": "shell",
            "command": "{Flash Programmerのインストール先}\\Renesas Electronics\\Programming Tools\\Renesas Flash Programmer V3.05\\RFPV3.exe",
            "args": [   // 引数を指定
                "/silent",   // GUI非表示で起動
                "${workspaceRoot}\\Flash Programmer\\${workspaceRootFolderName}\\${workspaceRootFolderName}.rpj", // プロジェクトファイルが存在するディレクトリ
                "/log",  // ログを保存する
                "Flash Programmer/Flash Programmer.log", // ログを保存する場所
            ],
         }
    ]
}