RH850のコード自動生成を試す

前記事ではRH850のPCシュミレータを試してみました。RL78では、CS+e2studio 共にペリフェラル部の自動コード生成ができます。本製品用にはギモンですが、ライトな製品、デモ、プロト には役立ちます。RH850では使えそうでしょうか?


実施条件は、IDE:e2studio 2024-07、基板は北斗電子さんのHSBRH850F1KH176を使います。PIN数は176。基板は仲間が手配中で未だ手元にはありません。取説は見ず勘所での操作なので勘違いがあるやもしれません。

自動生成機能(スマートコンフィグレータ)を起動するには、プロジェクトツリーかに、.scfg を開きます。分かりにくいですがタブ切替が下端にあります。


[クロック]タブを選ぶと思わずうげっとする複雑の図が現れます。クロックソースから各機能クロックと分周が接続図で現れ、図中の分岐ポイントを切替えると各機能クロックの周波数が表示される仕組みです。RH850F1H は水晶は2つ接続できるのでややこしい図になっていますが、ハードマニュアルと照らし合わせれば理解は可能です。

今回は、CSI(クロック同期シリアル)を最速にしたいので上記の設定となりました。


[コンポーネント]タブでは、マイコン機能詳細を設定します。アイコンを選びぶとコンポーネント一覧から必要な機能を選び追加し、それぞれの機能の設定を行います。コンポーネント名はプリセットされますが任意に変更できます。これは先にすましておいたほうがいいようです。各詳細は後術にて。しかし肝心のCANの自動生成は今のところ無いようです。


[端子]タブでは、マイコンポート機能の有効無効を設定します。I/Oポートの設定、各機能の設定はここでは行いません。以下CSI の一例です。


[割込]タブでは、ハンドラ名、優先度を設定します。ベクターテーブルがそのまま掲載されている感じです。割込みの有効無効は、[コンポーネント]タブの機能詳細設定側では設定します。


RL78ではポート一覧が常時表示されていましたが、RH850では[コンポーネント]タブから、アイコンを選び、コンポーネント一覧から[ポート]を選び明示的に追加が必要です。操作は以下の通り、ポート一覧の操作は普通です。この設定ができていないと、[端子]タブで「ポートの初期化ができていません」とメッセージが表示されます。


標準的なハードウェアタイマーを作りたい場合、[コンポーネント]タブからコンポーネント一覧から[インターバルタイマ]を選び、次の画面からタイマー種とチャンネルを選びます。

タイマー種とチャンネルはハードウェアマニュアルから理解しておく必要があります。後は画面項目に従って入力します。以下、1msecタイマーの一例です。


設定に特筆はないのですが、クロック設定でCSI用は80Mhzに下にもかかわらず、通信速度が最大の 10Mbps ではなく、1Mbps 止まりです。動かしてみてから実際のところを確認してみたいと思います。


設定に特筆はないのですが、ソースアドレス、デスとネーションアドレスには、直接SFRは書けないようです。CS+用のRL78では出来ていたような…


ソースコードの生成ボタンが分かりにくいですが以下の場所あります。


尚、ソースコードを生成すると、ソースコード生成フォルダが一度削除されます。バージョン管理などの管理フォルダ .ファイル が削除さてれしまいます。 project設定を変更しても解消できません。弊方では以下のように対処しました。

① 自動生成フォルダを src 下外に移動します。

② Makefile自動設定をoffにする。

③ 自動生成 folder のサブ folder のMakefile類を以下のように修正します。このついでに絶対パスほ相対パスに変更しておきます。

④ 再度自動生成した場合は、src/smc_gen の結果を、移動先folder にマージします。しかしシンボリックリンクを張ればマージは不要になるかもしれません。ソースが増えたら、Makdefile自動を有効にして一度makefileを再生成して、③の修正をマージします。


以上、RH850の自動コード生成は使えそうでした。しかしCAN部が何もありません。

CANドライバー作成にづづきます。

RH850でPCシミュレータを使ってみる

以前、RL78でPCシミュレータはなかなか使えることを報告しました。 RH850ではどう確認してみました。しかし取説は一切よまず勘所での操作です。

e2studioでRH850環境をいれるとシミュレータもインストールされています。

メニュー [プロジェクト] -> [プロパティ] -> [実行デバック設定] -> [新規] から、[GDB Simulation Debugggin(RH850) ]を選択して設定構成のひな形ができます。

適当にお試しコードを書きBuildし、brake point を張ります。

設定構成を開いてデバッグ情報の生成ファイル *.x を選択します。

この辺りはRL78と同様に操作してみました。虫アイコンをクリックしてデバックを開始すると、テストコードの brake point に達するはずですが、エラーのトラップ行に張り付いてしまいます。RH850の場合は追加で何か必要なのでしょうか???


プロジェクトツリーから [RH850 シミュレータ] を右クリックして、デバックツールを[RH850 シュミレータ]に切替えます。

次にメニュー[ツール] -> [デバックツールへ接続]を選び、接続が完了したらます。[ツール] -> [デバックツールへダウンロード]を選びます。

Cコード部が表示され、現在行がハイライトされます。実行を押すと break point で止まります。CS+ はなんか使えそうな感じです。


IDEの使い勝手としては、e2studioの方がGoodですが、悩ましいところです。CS+もタイマやI/Oなどどこまでシミュレーションされるのでしょうか? ひとまずコードも用意していかないといけません。

自動コード生成編につづきます。

VC++6 を VS2019 にコンバート時のポイント

VC++6 のアプリは、インストーラレスで動作させることができるため、今日でも需要があります。しかしIDEの機能が低いため、開発効率は低いです。そこで弊方では、一度Visual Studio 2019 にコンバートして開発し、最後にVC++6で検証してリリースしています。その時のポイントの覚書です。

Visual Studio 2019 の設定

VC++6の頃は.NETはまだなく、標準ライブラリは MFC でした。Visual Studio 2022となった現在でもサポートされています。2000年当時、現在も名だたる数々のアプリが作成されました。オプション機能になっいるので、以下のようにオプション追加します。尚、無償版ではサポートされていません。


Projectのコンバート

vc++6 のproject file : .dsp.dsw を、Visual Studio 2019 で開きます。後は、質問に答えていけば完了です。.sln .vcxproj が生成されます。


コードの修正

C++ のコンパイラ仕様がやや特殊であったため、(汚いコードを書いていると)修正が必要になります。

【違い1】 VC++6では関数/method内で宣言した変数は、その後スコープを跨いで使用可能となっている。

具体的には、

void founcA( )
{
    for( int i = 0; i < 10; i ++ ) {
         .....
    } 
    for(  i = 0; i < 20; i ++ ) {  /* VC++6ではOK、VS2019とC++一般ではNG */
         .....
    } 
}

【違い2】 VC++6ではcastしなくても、引数の型に合わせてくれる。

具体的には、

void funcA( int x, int y )
{
   ....
}

void funcB( )
    LONG y1;
    ...
    funcA( 100, y1 );  /* VC++6ではOK、VS2019とC++一般ではNG */

数値だけでなく、char[]CString 間でも暗黙castされているので要注意です。数値を表示用に文字として扱う場合も同様です。

【違い3】 VC++6では関数/method型を宣言しないと、intとして扱われる。

具体的には、

virtual CString methodA();
virtual methodB();    /* VC++6ではint扱いでOK、VS2019とC++一般ではNG */

また strcpy系の関数にて以下の警告がでますが、領域外の上限をコード内で実装していれば問題ないので許容します。


Build設定の変更

Debug ビルドで以下のエラーが出る場合があります。

“/Gy-” は “Gy”オプション無し の意です。 以下のように有効にします。オプションの意味合い上、実害はないでしょう。


以上これでコンバートでlinkageまでとおります。これで.NETのC++並みのデバッグ機能が使用できるようになります。最近のVisual Studioのプラグインも使用できます。

ただし生成されたexeを他PCで実行する場合は、各Visual Studio バージョンに対応した VC++再配布可能ライブラリ が必要です。mfc42.dll では動きません。

最後に一言、.NETアプリでないと「セキュリティが!!」と怒り狂う方や、.NETコンバートを強く勧めるベンダーさんももいらっしゃいますが、MFCはまだ使えるしセキュリティも配慮されています。一度作ったコードは大事に継承し続けたいですね。ただ VC++ 6の入手/環境作りがネックです。

VC++ 6のコードを最新に移植したいが手がたりない、自身がない、担当者がいなくなったなどお困りの方は、こちらよりご相談ください。


ターゲットがVC++6で、VC2019でクロス開発するとき、VC++6で正式Buildするときの注意です。

  • bool と BOOL の違いがチェックされ、合わない場合、警告になります。TRUE/true、FALSE/false も同じ。
  • MFCでWin32APIを使うとき、MFCのライブラリを参照しないよう 「::API名」と記述しますが、効かない場合あり。
  • Win32APIを使うとき、対応する .h を 明示的 include しないとエラーになる。 VC2019ではいい塩梅にひっぱってきてくれる模様。(もしくは .h の構造がちがう)
  • Win32APIを使うとき、対応する .lib を 明示的 にリンク指定しないとエラーになる。 VC2019ではいい塩梅にひっぱってきてくれる模様。

SwiftでGPS初期化完了を待つ

SwiftでGPSが位置を取得するコードはたくさんありますが、どのくらいで初期化かせ完了するかまでは他皆様の記事にはあまり書いていなかったので、記事としてのこしておきました。

通常は、CLLocationManager の初回イベントが発生するまで待てばいいのですが、アプリ起動時の位置をなるはやで知りたい場合があります。初回イベントが発生するまで待たせると「反応しない」とコンプレインにつながる場合もあります。

CLLocationManager に初期化完了のイベントは見当たらず。(調べきれていないかも…) 具体的なGPS初期化時間は公称されていないし、端末や処理負荷によって変わってしまうかもしれません。そこで以下のようなコードにしてみました。

	public var	NowLatitude  = 0.0
	public var	NowLongitude = 0.0	
	private var myLocMgr: CLLocationManager	
		
		var  i:Int = 0
		while( i < 30 /* 約1.5分  */ ) {
				
			if let startLoc = myLocMgr.location {
				// 自クラス用にコピー
				NowLatitude  = startLoc.coordinate.latitude
				NowLongitude = startLoc.coordinate.longitude
				break
			}
			
			Thread.sleep(forTimeInterval:3)
			i += 1
		}

とれるまでぐるぐる回すしかない。iPad 6thでは大体このくらいで収まっていました。初期GPS位置が取れなかった場合のリスクに応じて、whileの回数を調整するばよいかなと思います。

Drawioの勧め

visio を使わなく、見かけることもなくなって久しいですが、、、(まだ存在するようですが) UMLやフローチャートを書きたい場面はしばしばです。最近は、Drawio というフリーソフトがあるようです。コードはjavaのようです。

売り物のUMLツールほど、強力、厳格ではないのですが、ダイアグラムが書けて、操作も直感的で使いやすいです。きちんと日本語化もされています。以下シーケンス図の例です。

「UMLからコード生成したい」というわけでもなければ十二分です。売り物のUMLツールより記述に自由度があります。描画も割と軽い。フローチャートの例です。

クラス図は、

エクスポートもSVGがサポートされていています。

SVGから、inkscape で編集したり、eps に変換してWordに読ませWord図形にしたり応用も広がります。

その他図のもりだくさん。

ExeclはA3までですが、こちらはページサイズをA0サイズまで拡大できる。(試してませんが図面プロッターにも出せる!!) いくらでかい図を描いてもOK。

気づき点、テクニックを以下に列挙します。

  • PDFへのエクスポートは崩れるので、PDFプリンタに印刷したほうがよい。
  • スナップ( 線を図形に自動的繋ぐ機能 ) がOFFできない。
  • 図形のグリッド位置への補正ががOFFできない。
  • ( 以降、随時更新中 )