/Test_you

電子工作やプログラミングなど、やってみたことのメモ

NyARToolkit for Processing を Windows で動かしてみた

久しぶりに、NyARToolkit の サンプルプログラムを動かしてみました
Processing3 と Processing4 の両方で動作しましたが、Processing4 の方がトラブルが少なかったので、そちらをメインに紹介していきます

NyARToolkit はマーカーベースのARを手軽に作れるライブラリです
サイト: GitHub - nyatla/NyARToolkit-for-Processing: NyARToolkit for Processing
使用例: nyartoolkit - YouTube

1. 環境(Processing4 の場合)

  1. Windows 11 Pro: 23H2
  2. Processing: 4.3
  3. Processing用ライブラリ
    • Video Library for Processing 4: 2.2.2 (GStreamer: 1.20.3)
    • NyARToolkit for processing: v3.0.10
  4. カメラ: ノートPC内蔵カメラ

2. 注意事項

Windowsの場合、Processing.exe を配置するフォルダ、スケッチブックの場所には、日本語を含まないようにします。日本語を含むとライブラリを見つけられず、エラーが発生します
詳細はこちら > Processing Video Library 問題まとめ #processing - Qiita

デフォルトだと、スケッチブックの場所が「ドキュメント」になるため、修正が必要です
メニューの ファイル > 設定 を選択し、スケッチブックの場所を変更します

3. ライブラリのインストール

3-1. Video Library for Processing 4

メニューの スケッチ > ライブラリ > Mange Libraries... を選択
Video Library for Processing 4 を選択して、Install を押下する
※ライブラリをインストールしたら、一度 Processing を終了して、再度起動します

3-2. NyARToolkit for processing

Releases · nyatla/NyARToolkit-for-Processing · GitHub から、nyar4psg.zip をダウンロード

ファイルを解凍し、スケッチブックの場所/libraries 以下に配置する

4. カメラ入力の確認

Video Library のサンプルを実行して、カメラ画像が表示できるか確認します
メニューより ファイル > サンプル... を選択、Javaサンプルのダイアログから
ライブラリ > Video Library for Processing 4 > Capture > GettingStartedCapture
をダブルクリックして、サンプルを開きます
サンプルを実行して、カメラ画像が表示されたらOKです

5. マーカーの準備

NyARToolkit のライブラリに同梱されているマーカーを印刷しておきます
NyARToolkitを格納した場所/data/pattHiro.pdfというファイルです
※マーカーの周囲には白い部分が必要です。黒い部分ピッタリで切ると、うまく認識できません

6. NyARToolkitのサンプルプログラム実行

Javaサンプルのダイアログから
Contributed Libraries > nyar4psg > simpleLite
のサンプルを開いて実行します。カメラにマーカーを見せると、マーカー上に青い箱が表示されます
これでサンプルプログラムの動作が確認できました

7. Processing 3 の場合

下記の環境で、サンプルプログラムの動作は確認できましたが、いくつか対処が必要でした

7-1.環境

  1. Windows 11 Pro: 23H2
  2. Processing: 3.5.4
  3. Processing用ライブラリ
    • Video Library for Processing 3: 2.0 (GStreamer: 1.16.2)
    • NyARToolkit for processing: v3.0.6

7-2.注意事項

※いずれも、正確な所は分からないので、推測になります

  • NyARToolkitのバージョンを v3.0.6 にする

    • NyARToolkitの v3.0.10 以降は Java11 でコンパイルされているためか、Processing 3.5.4(Java8が同梱) ではエラーになりました
  • Processing 3 の場合、Video Library for Processing 3: 2.0 を使用します

  • カメラの初期化処理を修正

void setup() {
   size(640, 480);

   String[] cameras = Capture.list();

   //=========== ここから ==============
   //カメラに接続できるまでカメラデバイス一覧を取得
   while (cameras.length == 0) {
      cameras = Capture.list();
   }
   //=========== ここまで ==============
   
   if (cameras == null) {
      println("Failed to retrieve the list of available cameras, will try the default...");
      cam = new Capture(this, 640, 480);
void setup() {
   size(640,480,P3D);
   colorMode(RGB, 100);
   println(MultiMarker.VERSION);
   //=========== ここから ==============
   String[] cameras = Capture.list();
   
   //カメラに接続できるまでカメラデバイス一覧を取得
   while (cameras.length == 0) {
      cameras = Capture.list();
   } 
   cam = new Capture(this, 640, 480, cameras[0]);
   //=========== ここまで ==============
   
   //=========== コメントアウト ==============
   //cam=new Capture(this,640,480);
   nya=new MultiMarker(this,width,height,"../../data/camera_para.dat",NyAR4PsgConfig.CONFIG_PSG);
   nya.addARMarker("../../data/patt.hiro",80);
   cam.start();

7-3.実行結果

8. まとめ

  • Processing3 と Processing4 で NyARToolkit のサンプルプログラムの動作を確認しました
  • 現状だと Processing4 がお勧めです。Processing3 はいくつか対処が必要でした
  • どちらの場合でも、フォルダ名に日本語を使わないように注意しましょう

最後に、NyARToolkit のコミット履歴を見たのですが、2023年に更新があって驚きました(初回コミットは2009年)。長期にわたってメンテ頂いている製作者の方に感謝します

9. 参考にした情報

9-1. Processing Video Library 関係

9-2. Java のバージョンに関するトラブル

e2studioでコマンドラインからスタック情報を出力してみた

はじめに

e2studio V7.7.0 で追加されたスタック解析のヘッドレスアプリケーションを使用し、RXマイコンを対象に、コマンドラインからスタック情報の出力を試してみました1。その結果、スタック情報をCSVファイルとして取得できました

e2studio 7.7.0 Release Note より抜粋

使用環境

  • e2studio V7.8.0
  • Renesas CCRX v3.05.00
  • Windows 11 Pro 22H2

e2studioのスタック解析について

  1. e2studioには、各関数が使用するスタックサイズを表示する機能「スタック解析ビュー2」があります。表示形式は「ツリー構造」と「表形式」の2種類から選択できます

    種類 表示
    ツリー構造
    表形式

    注意: スタックサイズの合計は、メニューから「呼び出し先/元関数の合計を表示」を選択すると、各関数の横に(8)のように表示されます

  2. コマンドラインから出力されるスタック情報は「表形式」のCSVファイルです

事前準備

1.スタック使用量情報ファイルの出力設定

  1. ビルド時に、スタック使用量情報ファイル(.sni)を出力するよう設定します
    プロジェクトのプロパティを開き、「C/C++ビルド>設定>ツール設定>Linker>その他」を選択し、「スタック使用量情報ファイルを出力する(-stack)」をチェックします
  2. ビルドして、スタック使用量情報ファイル(.sni)の出力を確認します
    補足:ビルド結果(.abs)と同じフォルダに保存されます

2.Headless Buildの準備

以下の手順は「VS Codeで、RXマイコンの e2studio プロジェクトをビルドする 」と同様です

  1. 「e2studioのインストールフォルダ/eclipse/e2studio.ini」を同じフォルダにコピーし、「eclipse.ini」という名前に変更します

  2. 日本語の文字化けを防ぐため、eclipseの表示言語を英語に変更します
    具体的には「elipcse.ini」の先頭に以下の2行を追加します

     -nl
     en_US
    

コマンドラインからスタック情報を出力する

  1. コマンドプロンプトを開きます。スタック使用量情報ファイル(.sni)が保存されているフォルダに移動し、以下のコマンドを実行します

     e2studioのインストールフォルダ\eclipse\eclipsec.exe -nosplash -application stackanalysis.application -calculateMaxStackSizeInclude=Callee -ccInput=スタック情報解析ファイル名(*.sni)
    

    注意:"スタック使用量情報ファイル名"には実際のファイル名を指定してください

  2. コマンドを実行すると、"スタック使用量情報ファイル名_StackAnalysis.csv"という名前のCSVファイルが出力されます

     作業フォルダ>C:\Renesas\e2_studio\eclipse\eclipsec.exe -nosplash -application stackanalysis.application -calculateMaxStackSizeInclude=Callee -ccInput=test.sni
     Analyzing...
     + Output: test_StackAnalysis.csv
     Analysis completed
    

  3. CSVファイルの中身は、スタック解析ビューの表形式データになります

スタック解析のコマンドライン引数

stackanalysis.applicationコマンドライン引数の説明は下記の通りです

Usage: eclipsec.exe [-nosplash] -application stackanalysis.application
[-ccInput=file1[,file2] [,file3] ...] [-userLB=file1[,file2] [,file3] ...] [-calculateMaxStackSizeInclude=[Callee|Caller]]

-nosplash: Prevents the splash screen from being shown.
-ccInput=file1[,file2] [,file3] ...: Input files of CCRX/CCRL project - SNI file absolute paths
-userLB=file1[,file2] [,file3] ...: User library file - CSV files
-calculateMaxStackSizeInclude=[Callee|Caller]
If the option doesn't exist, don't calculate stack size in tree
-calculateMaxStackSizeInclude=Callee: Calculate stack size including callees
-calculateMaxStackSizeInclude=Caller: Calculate stack size including callers

主な引数は次の通りです

  1. -ccInput:スタック使用量情報ファイル(.sni)を指定します
  2. -calculateMaxStackSizeInclude:スタックサイズの合計を出力するために必須の指定です
    • Caller指定:呼び出し元関数との合計を表示
      上位のノードより、下位の関数にスタックサイズを加算して表示します
    • Callee指定:呼び出し先関数との合計を表示
      末端のノードより、下位の関数中最大のスタックサイズを上位の関数に加算して表示します
    • オプションを指定しない:スタックサイズの合計を表示しません
    Caller指定 Callee指定 オプションを指定しない
    _PowerON_Reset_PC ( 4 ) _PowerON_Reset_PC ( 452 ) _PowerON_Reset_PC
    __INITSCT ( 28 ) __INITSCT ( 24 ) __INITSCT
    __INIT_IOLIB ( 24 ) __INIT_IOLIB ( 120 ) __INIT_IOLIB
    _main ( 40 ) _main ( 448 ) _main
    _printf ( 60 ) _printf ( 412 ) __Printf

まとめ

e2studioで、コマンドラインからスタック情報をCSVファイルとして出力できることを確認しました。GUIでも同様の操作が可能ですが、スタック情報の解析を自動化したい場合には、活用できそうです


  1. e2studio V7.7.0では、コマンドラインだけでなく、ビルド設定でもスタック情報を出力できるようになりましたが、スタックサイズの合計が出力されないため、利用しずらいです。これは、コマンドライン-calculateMaxStackSizeIncludeのオプションを指定しない場合と同じ挙動に見えます
  2. スタック解析ビューの詳細は、e2studioのヘルプで「e2studio ユーザーガイド>ビルドに関する機能>スタック解析>スタック解析ビューの使用方法」を参照してください

e2studio(GCC for RX)で、Unityによる単体テストを試してみた

先日、Renesasのアプリケーションノートに従い「e2studio(GCC for RX)で、CUnitによる単体テストを試してみた」をやりましたが、今回はテストフレームワーク Unity で同じことを試しました。結果、CUnitと同様にテストできました


1. 環境

  • Windows 10 Pro: バージョン 21H2、ビルド 19044.2130
  • e2studio: 2022-07 (64bit版)
  • コンパイラ: GCC for Renesas RX 8.3.0.202202
  • Unity: 2.5.2
  • テスト環境:RX Simulator

2. テスト対象プロジェクトを作成する

  • ファイル > 新規 > Renesas C/C++ Project > Renesas RX より、プロジェクトを新規作成
    • テンプレートはGCC for Renesas RX C/C++ Executable Projectを選択
    • この記事では、プロジェクト名をSampleUnityとしています
  • Select toolchain, device & debug settingsのダイアログで下記に設定し「次へ」を押下
    • ツールチェーン: GCC for Renesas RX
    • ツールチェーン・バージョン: 8.3.0.202202
    • ターゲット・デバイス: 任意(ここでは:RX600 > RX610 > RX610 - 144pin > R5F56107VxFP)
    • Hardware Debug構成を生成: チェックを外す
    • Debug構成を生成: チェックを入れる(「RX Simulator」を選択)
  • Select Coding Assistant Settingsのダイアログで「終了」をクリック

3. Unityの導入 と 準備

  • GitHub - ThrowTheSwitch/Unity: Simple Unit Testing for Cから、ソースをダウンロード
  • Unityの/srcフォルダにある unity_internals.hunity.cunity.h を、作成したプロジェクトの/srcフォルダにコピー

  • /generateフォルダに下記ファイルを sbrk.c として作成
    詳細理解していませんが、putchar や printf を使う場合、この関数が必須のようでした

// 本コードは、Renesasのアプリケーションノートから変更なし
// - putchar や printf を使うには、この sbrk 関数が必要なようだ。関数がない場合、次のエラーが出た
//   collision in (null): pc ffe83663 heap 00001018 stack 0000015c
// - Unityはテスト結果の出力に putchar を使うので、この関数定義は必須
void* sbrk(int incr)
{
    extern char end; /* Set by linker. */
    static char * heap_end;
    char * prev_heap_end;

    if (heap_end == 0) heap_end = &end;

    prev_heap_end = heap_end;
    heap_end += incr;

    return (void *)prev_heap_end;
}

3. テスト対象コードの追加

  • /srcフォルダにテスト対象ソース source.hsource.c を追加
// 本コードは、Renesasのアプリケーションノートから変更なし
#ifndef SOURCE_H_
#define SOURCE_H_

int add(int a, int b);
int subtract(int a, int b);

#endif
/* SOURCE_H_ */
// 本コードは、Renesasのアプリケーションノートから変更なし
#include "source.h"

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

4. テストコードの作成

メインのソースコードを下記のように修正

#include <stdlib.h>       // _Exit()
#include "unity.h"
#include "source.h"

// RUN_TEST毎の前後で呼ばれる関数(関数定義は必須、中身は空でも良い)
void setUp(void) {
}

void tearDown(void) {
}

// 下記テストは、Renesasのアプリケーションノートの内容を、Unity用に書き換えたもの
static void test_Add_01(void) {
    TEST_ASSERT_EQUAL_INT(1, add(1,0));
}

static void test_Add_02(void) {
    TEST_ASSERT_EQUAL_INT(10, add(1,9));
}

static void test_Subtract(void) {
    TEST_ASSERT_EQUAL_INT(0, subtract(1,1));
}

void main(void) {
    // テストケースが失敗した数
    int num_of_failures;

    // テスト開始
    UNITY_BEGIN();

    // 各テストを実施
    RUN_TEST(test_Add_01);
    RUN_TEST(test_Add_02);
    RUN_TEST(test_Subtract);

    // テスト終了
    num_of_failures = UNITY_END();

    // プログラムを強制終了し、シミュレータを抜ける
    // - このやり方が正しいか分からないが、Renesasのアプリケーションノートの方法(generate/start.Sにbrkを追加)だと、
    //   プログラム終了してからコマンドプロンプトに戻るまでに時間が掛かるので、このようにしている
    _Exit( (num_of_failures == 0) ? EXIT_SUCCESS : EXIT_FAILURE );
}
  • ポイント
    • テストコード test_Add_01()などを記述
      ※アプリケーションノートだとテストは別ファイルtestsource.cでしたが、ここでは簡単のためテストを同一ファイルに記述してます
    • テスト実行コードを main() 内に記述
    • テスト完了後、_Exit() でプログラムを強制終了し、シミュレータを抜ける
      ※このやり方が正しいか分からないですが、アプリケーションノートの方法(generate/start.Sにbrkを追加)だと、コマンドプロンプトに戻るまでに時間が掛かるので、このようにしてます

5. テスト用のバッチファイル作成

  • /Debugフォルダに下記ファイルをrun_test.batとして作成、ビルド後のフェーズでテストを実行する
@echo off
REM シミュレータでテストを実行する
REM ★GCC for RX のバージョン・インストール先に合わせて rx-elf-run.exe のパスを変更
REM ★プロジェクトの設定に合わせて *.elf のファイル名を変更
echo ******************** test phase ********************
"C:\ProgramData\GCC for Renesas RX 8.3.0.202202-GNURX-ELF\rx-elf\rx-elf\bin\rx-elf-run.exe" SampleUnity.elf
echo ****************************************************

6. 確認

この手順まで進めると、下記のフォルダ構成になります(水色が追加・修正したファイル)

7. プロジェクトのプロパティ設定

プロジェクトのプロパティを開いて、下記を設定

  • C/C++ビルド>設定>ツール設定>Linker>Otherに、オプション-msimを追加
  • C/C++ビルド>設定>ビルド・ステップにて、ビルド後のステップにrun_test.batを入力

8. Unityを使用した単体テストを実行する

プロジェクトをビルドすると、ビルドに続いて、テストが実行される
先日の記事と同様、設定すればVS Code上でも実行可能です


参考にした情報

e2studio(GCC for RX)で、CUnitによる単体テストを試してみた

Renesasのアプリケーションノート「e2studioでのCUnitの使用方法(GCC for RX)(R02AN0525JJ0102)」で紹介されていた内容を、そのまま試してみました

基本的に、資料の通りに進めれば良いのですが、いくつか引っ掛かった箇所があったので記載しておきます。おまけとして、①ビルド後に自動的にテスト実行、②VS Code上で実行を試してます


1. 環境

2. 前提条件

32bit版のe2stuido(V7.8.0)では、うまく行きません。指示通り 64bit版(20xx-xx) を使った方が良いです

V7.8.0でテスト対象プロジェクトをビルドすると、rx-elf-libgen--header-files=allというオプションが指定され、これが解釈できずエラーになりました

3. 「2.2 CUnitライブラリを作成する」について

ライブラリ側のビルド時にいくつか警告が発生します。おそらく、スタック使用量の警告で問題ないと思います

最後の警告(無効なプロジェクト・パス~)は、C/C++一般>パスおよびシンボル>ソース・ロケーションから、/CUnit/generateを削除すれば消えます

4. 「3.1 テスト対象プロジェクトを作成する」について

アプリケーションノートのpdfファイルから、ソースコードをコピペするとprintf内の改行指示がおかしくなり、テストの出力が文字化けします。ここは手入力した方がよいです

上がコピペした状態、下が正しい状態です

コピペした状態でテストすると、テストの出力が文字化けします

5. 「3.2 CUnit を使用した単体テストを実行する」について

[Show in Local Terminal]>[Terminal]でターミナルを起動するのですが、このメニューは、e2studioインストール時に拡張機能Terminalsを選択してないと表示されません

表示されない場合は、コマンドプロンプトで代用可能です

6. よく分からないこと

以上で、アプリケーションノートの内容は再現できました

ただ、テスト完了後に(Tests completed with return value 0. が表示されてから、プロンプトが表示されるまでに)、10秒くらい間が空きます。これが正しい動作かよく分かりません。テストNG時はエラーメッセージ(Read from unwritten memory at 0xa000001c)が出て、すぐプロンプトに戻るのですが・・・

とりあえずの対策

_Exit() や abort() で強制的にプログラムを終了すると、すぐにコマンドプロンプトに戻るようになりました。exit() では効果がなかったので、両者の違いである atexit()ハンドラ が影響しているのかも知れません

7. おまけ①: ビルド後に自動的にテスト実行する

折角なので、ビルドしたら自動的にテストを実行するようにしてみます。これは、ビルド後のステップで、テストを起動するだけで出来ます

  • SampleCUnit/Debugフォルダに、下記ファイルをrun_test.batとして配置
@echo off
REM シミュレータでテストを実行する
REM ★GCC for RX のバージョン・インストール先に合わせて rx-elf-run.exe のパスを変更
REM ★プロジェクトの設定に合わせて *.elf のファイル名を変更
echo ******************** test phase ********************
"C:\ProgramData\GCC for Renesas RX 8.3.0.202202-GNURX-ELF\rx-elf\rx-elf\bin\rx-elf-run.exe" SampleCUnit.elf
echo ****************************************************
  • C/C++ビルド>設定>ビルド・ステップにて、ビルド後のステップにrun_test.batを入力

  • ビルドを実行すると、続けてテストが実行される

8. おまけ②: VS Code上で実行する

VS Codeで、RXマイコンの e2studio プロジェクトをビルドする」の記事に従い、ビルドタスクを設定すれば、VS Code上でも「おまけ①」と同様にテストを実行できます

参考までに tasks.json の設定は下記です。★の部分は環境に合わせて調整必要

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "e2studioプロジェクトのビルド",
            "type": "shell",
            // ★eclipsec.exe もしくは e2studioc.exe のフルパスを指定
            // e2studioのインストールフォルダ/eclipse/ にあるはず
            "command": "C:/Renesas/e2_studio_2022-07/eclipse/e2studioc.exe",
            "args": [
                "-nosplash",
                "--launcher.suppressErrors",
                "-application",
                "org.eclipse.cdt.managedbuilder.core.headlessbuild",
                "-data",
                // ★e2studioのワークスペースフォルダを指定
                "C:/User/e2studio_2022-07",
                // ★build or cleanBuild を指定
                "-build",
                // ★ビルド対象のプロジェクト/ビルド構成を指定
                "SampleCUnit/Debug"
            ],
            "group": "build",
            "presentation": {
                "reveal": "always", // Terminal パネルを必ず開く
                "clear": true       // 実行前に Terminal をクリア
            },
            "problemMatcher": []
        }
    ]
}

9. 最後に

以上で、VS Code上でRXマイコン単体テストを実施できるようになりました
以前、e2studio上でシミュレータを起動して単体テストをしたのですが、テストがe2studio上に制約されるのは不便に感じました。今回の方法だと、テストがCUIで完結するため、便利になりそうです

今回、Renesasの単体テストに関するアプリケーションノートを参照しましたが、最近、Renesasから継続的インテグレーション関係のアプリケーションノートが多数発行されてます。特定マイコンに対して、具体的な手順が記載された資料は少ないので、ありがたいです。他の内容も試したいと思ってます


参考にした情報

VS Codeで、RXマイコンの e2studio プロジェクトをビルドする

VS CodeでRXマイコンのプロジェクトをビルドする方法はいくつかのサイトで紹介されています。それらは統合開発環境 CS+ での事例だったので、もう1つの環境 e2studio で試してみました
結果、eclipseHeadless Buildを使うことでビルドできました。ただし、日本語メッセージの文字化けについては、英語表示に切り替えて回避してます

  • 2022/10:64bit版の情報を補足しました
    e2studioには 32bit版(V7.8.0) と 64bit版(2022-10) がありますが、64bit版の途中でコマンドライン用の実行ファイルが変わった為、異なる点を追記しました。説明の都合上、eclipsec.exeのケースを32bit版、e2studioc.exeのケースを64bit版と呼びます
  • 2022/11:ビルド時のエラーを出力する設定を追加しました

1. 環境

2. 手順の概略

  1. コマンドラインでビルド出来るようにする
  2. 日本語メッセージの文字化けに対処する
  3. VS Codeのビルドタスクを作る
  4. ビルドタスクを実行してみる
  5. (オプション) ビルド時のエラーを問題に出力

3. コマンドラインでビルド出来るようにする

Renesasの「FAQ 3000149 : e² studioのプロジェクトをコマンドラインでビルドするには?」に従って作業します

  • e2studioのインストールフォルダ/eclipse/e2studio.ini ファイルを同じフォルダにコピーし、ファイル名をeclipse.iniに変更する
    64bit版の場合e2studioc.iniに変更する ※ここは公式情報ではないので間違っているかも1

    32bit版 64bit版

準備としてはこれだけ。あとは、コマンドプロンプトで下記を実行すれば良いです

  • e2studioのインストールフォルダ\eclipse\eclipsec.exe -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data "e2studioのワークスペースフォルダ" -cleanBuild プロジェクト名(/ビルド構成)
    • 64bit版の場合
      e2studioのインストールフォルダ\eclipse\e2studioc.exe -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data "e2studioのワークスペースフォルダ" -cleanBuild プロジェクト名(/ビルド構成)
  • 補足
    • ビルド構成は設定しなくてもよい。設定しない場合は、全ての構成が対象になる
    • -cleanBuild を指定するとクリーンアップとビルド、-build を指定するとビルドのみになる

具体例として、私の環境だと

C:\Renesas\e2_studio\eclipse\eclipsec.exe -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data "C:\User\e2studio" -cleanBuild rx231_cast_test/Debug

64bit版の場合

C:\Renesas\e2_studio\eclipse\e2studioc.exe -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data "C:\User\e2studio" -cleanBuild rx231_cast_test/Debug

という感じになります。なお、私の環境・ワークスペース構成は下記です

  • e2studioのインストールフォルダ = C:\Renesas\e2_studio
  • e2studioのワークスペースフォルダ = C:\User\e2studio
  • プロジェクト名 = rx231_cast_test
  • ビルド構成 = Debug

コマンドを実行すると、クリーンアップおよびビルドが走ります。実行結果は下記の通り
ビルドは完了しますが、一部の日本語メッセージが文字化けします

C:\Renesas\e2_studio\eclipse\eclipsec.exe -nosplash --launcher.suppressErrors -application
 org.eclipse.cdt.managedbuilder.core.headlessbuild -data "C:\User\e2studio" -cleanBuild rx231_cast_test/Debug
23:39:13 **** 繝励Ο繧ク繧ァ繧ッ繝・rx231_cast_test 縺ォ蟇セ縺吶k讒区・ Debug 縺ョ 繧ッ繝ェ繝シ繝ウ縺ョ縺ソ縺ョ繝薙Ν繝・****
make -j4 clean
rm -rf *.sni *.dbg *.lst *.lis *.lpp *.map *.x *.lbp *.bls *.libelf *.rel *.lbk *.abs *.mi *.jmp
 *.fsy 1st/*.abs 1st/*.jmp 1st/*.fsy rx231_cast_test.abs rx231_cast_test.lib
・・・
ECHO は <OFF> です。
'Clean complete.'

23:39:13 Build Finished. 0 errors, 0 warnings. (took 497ms)

23:39:15 **** 繝励Ο繧ク繧ァ繧ッ繝・rx231_cast_test 縺ォ蟇セ縺吶k讒区・ Debug 縺ョ 繝薙Ν繝・****
make -j4 all
'Scanning and building file: ../src/smc_gen/r_bsp/mcu/all/r_bsp_common.c'
・・・
Converting the DWARF information....
Constructing the output ELF image....
Saving the ELF output file rx231_cast_test.x
'Build complete.'

23:39:24 Build Finished. 0 errors, 8 warnings. (took 9s.441ms)

ワークスペースを保管しています。

4. 日本語メッセージの文字化けに対処する

eclipseの表示言語を英語に切り替えて対処します。elipcse.iniの先頭に下記2行を追加する
64bit版の場合e2studioc.iniに追加する

-nl
en_US

これにより、ビルド時のメッセージが英語に変わり、文字化けを回避できます

-- 変更前 --
23:43:13 **** 繝励Ο繧ク繧ァ繧ッ繝・rx231_cast_test 縺ォ蟇セ縺吶k讒区・ Debug 縺ョ 繧ッ繝ェ繝シ繝ウ縺ョ縺ソ縺ョ繝薙Ν繝・****
make -j4 clean
・・・
23:43:16 **** 繝励Ο繧ク繧ァ繧ッ繝・rx231_cast_test 縺ォ蟇セ縺吶k讒区・ Debug 縺ョ 繝薙Ν繝・****
make -j4 all

-- 変更後 --
23:45:02 **** Clean-only build of configuration Debug for project rx231_cast_test ****
make -j4 clean
・・・
23:45:05 **** Build of configuration Debug for project rx231_cast_test ****
make -j4 all

日本語で対処する方法も色々探したのですが、どれもうまく行きませんでした
例えば elipces.ini に-Dfile.encoding=MS932を追加するとか。結局、英語にするのが一番簡単でした

5. VS Codeのビルドタスクを作る

ビルドが出来るようになったので、VS Code 上でビルドタスクを設定します

  • /.vscode/tasks.jsonファイルがない状態で「ターミナル>タスクの構成」を選択
  • 「テンプレートから tasks.json を生成」、「MSBuild ビルド ターゲットを実行」の順に選択
  • /.vscode/tasks.jsonファイルが生成される

生成されたファイルの中身を下記のように修正。★の部分は環境に合わせて調整必要

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "e2studioプロジェクトのクリーンビルド",
            "type": "shell",
            // ★eclipsec.exe もしくは e2studioc.exe のフルパスを指定
            // [e2studioのインストールフォルダ]/eclipse/ にあるはず
            "command": "C:/Renesas/e2_studio/eclipse/eclipsec.exe",
            // "command": "C:/Renesas/e2_studio/eclipse/e2studioc.exe",
            "args": [
                "-nosplash",
                "--launcher.suppressErrors",
                "-application",
                "org.eclipse.cdt.managedbuilder.core.headlessbuild",
                "-data",
                // ★e2studioのワークスペースフォルダを指定
                "C:/User/e2studio",
                // ★build or cleanBuild を指定
                "-cleanBuild",
                // ★ビルド対象のプロジェクト/ビルド構成を指定
                "rx231_cast_test/Debug"
            ],
            "group": "build",
            "presentation": {
                "reveal": "always", // Terminal パネルを必ず開く
                "clear": true       // 実行前に Terminal をクリア
            },
            "problemMatcher": []
        }
    ]
}

以上で設定は完了です

6. ビルドタスクを実行してみる

「ターミナル>タスクの実行...」よりタスク「e2studioプロジェクトのクリーンビルド」を実行します。起動に少し時間が掛かりますが、クリーンアップ・ビルドが順次実行されて、ビルド完了します

補足
ビルド時のメッセージが増えてくると、最初の方のメッセージが流れてしまって見えなくなります。「ファイル>ユーザ設定>設定」よりterminal.integrated.scrollbackを検索し、ターミナルの最大行数を調整してください。私は5000行に設定しました

7. ビルド時のエラーを「問題」に出力

tasks.jsonproblemMatcherの部分を修正すると、ビルド時のコンパイルエラーを「問題」のタブに出力できます。但し、リンカ関係のエラー表示は完全ではないです(下図の E0562310, W0561017 のようにファイル名としてエラーコードが表示される)。この設定は かふぇルネ(Renesas Engineering Community) の投稿を参考に作りました

"problemMatcher": [
    {
        // コンパイラのエラーを検出
        "owner": "ccrx",
        "fileLocation": [
            // ★ビルド対象のビルドロケーション(makefileが出来る場所)を指定
            // ${workspaceFolder}/ビルド構成 になるはず
            "relative", "${workspaceFolder}/HardwareDebug"
        ],
        "severity": "error",
        "pattern": {
            "regexp": "^(.*)\\((\\d+)\\):([CEF]\\d+):(.*)$", "file": 1, "line": 2, "code": 3, "message": 4
        }
    },
    {
        // コンパイラのワーニングを検出
        "owner": "ccrx",
        "fileLocation": [
            // ★同上
            "relative", "${workspaceFolder}/HardwareDebug"
        ],
        "severity": "warning",
        "pattern": {
            "regexp": "^(.*)\\((\\d+)\\):(W\\d+):(.*)$", "file": 1, "line": 2, "code": 3, "message": 4
        }
    },
    {
        // コンパイラのインフォメーションを検出
        "owner": "ccrx",
        "fileLocation": [
            // ★同上
            "relative", "${workspaceFolder}/HardwareDebug"
        ],
        "severity": "info",
        "pattern": {
            "regexp": "^(.*)\\((\\d+)\\):(M\\d+):(.*)$", "file": 1, "line": 2, "code": 3, "message": 4
        }
    },
    {
        // リンカなどのエラーを検出
        // ※ファイルを特定できないため"file"にエラーコードを指定、ファイル名としてエラーコードが表示されます
        // ※簡単にするため、エラー/ワーニング/インフォメーションを区別してません
        "owner": "ccrx",
        "pattern": {
            "regexp": "^([CEFWM]\\d+):(.*)$", "file":1, "code": 1, "message": 2
        }
    }
]

なお、エラーメッセージのフォーマットは CC-RX ユーザーズマニュアル(R20UT3248JJ0111) の 10.2 出力形式 に記載されています。e2studio のエラーパーサー設定も参考になります

  1. ファイル名 (行番号): メッセージ種別(CEFMW) コンポーネント番号(05) メッセージ番号 : メッセージ
  2. メッセージ種別(CEFMW) コンポーネント番号(05) メッセージ番号 : メッセージ

8. まとめ

e2studioのプロジェクトが VS Code でビルド出来るようになりました。今なら e2studio 2020-04以降でサポートされた CMakeプロジェクトを使った方が筋が良い気がしますが、既存プロジェクトをそのまま VS Code でビルドできるのは便利です


参考にした情報


  1. 試した限りでは 、64bit版の場合はeclipse.iniではなく、e2studioc.iniが参照されるようです。また、e2studioc.iniがない場合は、e2studio.iniが参照される感じでした。ただ、RenesasのFAQとは一致していないので、この理解は間違っているかもしれません

PowerShellで、クリップボードのURLをHtml形式のリンクに変換する

下記のように、URLをHtml形式のリンクに変換します(文字列のHERE!はスクリプトで固定)
f:id:sonoka_gi:20210613104051p:plain
URLをチャットやメールなどに貼り付ける時、URLそのままだと長いので、短くすることが目的です。 適当なソフトが見つからなかったので、PowerShellで作ってみました。


1. 使い方

  • 下記のバッチファイルとPowerShellスクリプトを同一フォルダに配置
  • URLをクリップボードにコピー
  • convert_URL_to_html_format_link.bat を実行
  • 貼り付けたいアプリケーションでペースト
    • Html形式をサポートしているソフト(Outlook, Excel, Teamsなど)で使えるはず

2. バッチファイルとPowerShellスクリプト

ファイルは>こちら

powershell -v 5 -NoProfile -ExecutionPolicy Unrestricted .\convert_URL_to_html_format_link.ps1
# クリップボードにURLが格納されていたら、それをHTML形式のリンクに変換する
# ・実行時は PowerShell v 5 を指定のこと。Set-Clipboard の -AsHtml パラメーターが v5 でしか使えない
# ・生成するリンクが英語なのは、日本語の文字化け問題を解消できなかったから

# PowerShellのバージョンが不適切なら抜ける
if ( (Get-Host).Version.Major -ne 5 ) {
    Write-Host "This script requires powershell V5."
    exit
}

# クリップボード内容をテキスト形式で取得
$clipboard_text = Get-Clipboard -Format Text

# httpから始まる文字列ならURLと判断
if ( $clipboard_text -like "http*" )
{
    # HTMLタグでURLへのリンクを作り、Html形式でクリップボードに設定
    $html_link = "<a href=""" + $clipboard_text + """><b><i>HERE!</i></b></a>"
    Set-Clipboard -AsHtml $html_link

    # 生成内容をコンソールに出力
    Write-Host "Created Link:" $html_link
}

3. スクリプトの説明

クリップボードにURLリンクを設定する方法として、Set-Clipboard-asHtmlパラメーターを使いました(参照:Set-Clipboard)。 下記のように文字列($html_link)を渡すと、HTML形式でクリップボードに格納してくれます。 今回はa hrefタグで作ったURLのリンクを渡してます。

PS C:\> $html_link = "<a href=""https://www.google.com/"">Google</a>"
PS C:\> Set-Clipboard -AsHtml $html_link

クリップボードの状態 f:id:sonoka_gi:20210613104057p:plain
Outlookへの貼り付け結果
f:id:sonoka_gi:20210613104106p:plain

残念ながら、このパラメーターは PowerShell 7 では削除されているようで、Windows PowerShell 5 のみで実行可能です。また、html内に日本語を含むケースの文字化けを解決できなかったので、英語のみで使ってます。


参考にした情報

Developer Command Prompt for VS 2019 から VS Code を起動する

VS CodeMicrosoft Visual C++ を使って開発する方法として、開発者用コンソール(Developer Command Prompt for VS 2019など)から VS Code を起動する手順が紹介されていたのですが(こちら)、入力が面倒なのでバッチファイルを作りました。

REM Developer Command Promptを起動し、完了まで待つ
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\VsDevCmd.bat"
REM 開くフォルダ指定してVS Codeを起動。VS Codeの終了を待たずに次に進む(start利用)
start "" "C:\Program Files\Microsoft VS Code\Code.exe" "D:\User\c"
REM バッファファイル終了
exit /b 0

1. 環境

2. 環境依存の項目

  • C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\VsDevCmd.bat
    • Developer Command Prompt for VS 2019 起動時のバッチファイルを指定
    • スタートメニューからショートカット実体を探し、プロパティのリンク先から確認 f:id:sonoka_gi:20210523180819j:plain
      f:id:sonoka_gi:20210523180812j:plain
      %comspec% /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\VsDevCmd.bat"となるが、%comspec% /kの部分は不要1
  • C:\Program Files\Microsoft VS Code\Code.exe
    • VS Code をフルパスで指定
    • 上記と同様に、スタートメニューからVisual Studio Code のショートカット実体を探して確認
      f:id:sonoka_gi:20210523180815j:plain
  • D:\User\c
    • VS Code で開きたいフォルダを指定

3. バッチファイルの説明

Developer Command Prompt 用バッチファイルを実行した 「後」VS Codeを実行。VS Codeの終了を待たずに先に進み」バッチファイルを終了させたい。このため、下記手順を踏んでます

  • callを使って、バッチファイルを実行し、完了を待つ
  • startを使って、新しいプロセスで VS Code を起動し、先に進む
  • バッチファイルを終了して、閉じる

参考にした情報


  1. コマンドプロンプトを開き、指定のバッチファイルを実行、そのままコマンドプロンプトを継続するという記述なので(参考: COMSPEC環境変数 - DOS コマンド一覧 - Programming Field)