FRK-RX62N (15) KPIT GNURX NewDevice 登録2011年06月23日 21時24分17秒

NewDevice RX62NCQ
KPIT GNURX デフォルトのセクション設定ではプロジェクトを作成する毎に修正しなくてはならない。ここらでプロジェクトジェネレータにデバイスの追加又は変更をすることにする。Original は現在の設定、SerialMonitor も使うことを考えると NewSetting の値でちょうどいいかなと思う。
Original	NewSetting	SerialMonitor	SectionName
0xFFFFFFA0	0xFFFFFFA0	0x0000FFF8	.fvectors
0xFFFC0000	0xFFFA0000	0x00002000	.text
0x00001808	0x0000F000	0x0000F000	.istack
0x00001708	0x0000EF00	0x0000EF00	.ustack
0x00001000	0x00000400	0x00000400	.data
				0x00000000	.rvectors


RX62NCQ という名前で新規登録ということにする。


①scapp.det と scppapp.det にデバイス RX62NCQ を追加
C:\Program Files\Renesas\Hew\System\Pg\KPIT GNURX-ELF\GNURX_Info\Support\scapp.det
C:\Program Files\Renesas\Hew\System\Pg\KPIT GNURX-ELF\GNURX_Info\Support\scppapp.det

 



②RX62N.PGD の名前を RX62NCQ.PGD と変えてコピーする。RX62NCQ.PGD 8行目を以下のように修正
5=vecttbl\rx62ncq.c
C:\Program Files\Renesas\Hew\System\Pg\KPIT GNURX-ELF\GNURX_Info\Support\RX600\RX62NCQ.PGD


③rx62ncq.dat を作成
C:\Program Files\Renesas\Hew\System\Pg\KPIT GNURX-ELF\Hardware\RX600\rx62ncq.dat

 



④ベクタテーブル rx62n.c に少々変更を加え SerialMonitor で扱いやすくする。ここに示すのは FVECT_SECT の部分だけ、後の部分は変更なし。修正後 rx62ncq.c として保存する。
C:\Program Files\Renesas\Hew\System\Pg\KPIT GNURX-ELF\GNURX_Info\Generate\VECTTBL\rx62ncq.c
SerialMonitor を使う場合 Debug_RX600_Serial_Monitor を define する。

 



これでプロジェクトジェネレータを起動した時に新しいデバイスが現れるはずだ。


環境:High-performance Embedded Workshop Upgrade 4.09.00
    KPIT GNURX v11.01 Windows Tool Chain (ELF)

FRK-RX62N (14) printf (3) KPIT GNURX SCI2011年06月22日 20時49分53秒

FDT SCI Download
今回 FRK-RX62N のSCI1 に接続することができたので SCI から flash write を試してみる。
JPP1 open (MD0)
JPP2 short (MD1)
JPP4 open (NMI)


ComPort は4になる。
FDT の設定は USB と同じで
入力クロック: 12MHz
メインクロックの逓倍比: 8
周辺クロックの逓倍比: 4
これで書き込み開始。USB に比べると遅いが問題なく書き込みできる。 できれば FDT 以外でも書き込みできればいいのだが今のところ見つからない。


さて、本題は 「KPIT GNURX で printf を使う」 だ。
副題として、[SYSLAB blog 読者 限定公開 第一弾 GNURX printf の使い方 Optimized 編]
しかし、中身は無いに等しい。ほとんど Renesas のサンプルをコピーするだけだ。


それでは始めよう。
1.KPIT GNURX で新規プロジェクトを作成する。
2.前回作成した hardware_setup.c を新規プロジェクトの中にコピーする。
3.main を新規プロジェクトの中にコピーする。
4.ソースの中の stdint.h をローカルから読み込むようにする。
  #include "stdint.h"
  もちろん stdint.h はプロジェクトディレクトリにコピーしておく。そうでなければ stdint.h をinclude しないようにして uint32_t などを unsigned int と書き直せばよい。
5.serial_printf.c をプロジェクトにコピーする。

 



6.KPIT GNURX [ELF] Toolchain の Library Generator は
  Library type が Pre-Built
  Select library が Optimized
  (次回は Newlib でもやってみよう)
7.後はコンパイルして書き込むだけ。


しかし、問題が無いわけではない。FDT で書き込む時 mot file exceeds the flash ROM size of RX600 Series device という警告が出てくる。
exceeds the flash ROM size
FDTがうまく動かない場合は S-record file の2行目を削除してしまおう。
S30900001000xxxxxxxxxx となっている部分。
でも、本来このデータは ROM に入っていなければならないはずだが...
そのうち何とかすることにしよう。おそらく次の GNURX では直っていると思う。
表示は Renesas のサンプルそのまま。
GNURX printf



欲を言えば、送受信割り込み+リングバッファ対応としたいところだ。


参照:Renesas Application Notes RX600 Series Adding Printf and Scanf Support (R01AN0509EU0100)
環境:High-performance Embedded Workshop Upgrade 4.09.00
    KPIT GNURX v11.01 Windows Tool Chain (ELF)

FRK-RX62N (13) printf (2) Renesas RXC SCI2011年06月21日 20時56分51秒

FRK-RX62N + RS232C変換基板
printf をシリアルに出力するのはいいけどハードウェアの整備をしなくてはならない。
SCI は6チャンネルあるので半田付けが一番少なくなるようなチャンネルを考えよう。
調べてみると JTAG 用のコネクタに SCI1 が出ている。ピン数も少ないし最適だ。これで進めよう。脱着も容易にできるようにする。


必要な部品をまとめると
1.14P ヘッダー
2.ケーブル 1Pタイプ(Ainex LED-30EXB or Valuewave FW-BP) 切断して使う
3.トランジスタ技術 2008年1月号付属 RS232C変換基板


2のケーブルだけは購入することにする。後は手持ちの部品だ。


FRK-RX62N のコネクタピン用途は
CN4-8	+3.3V
CN4-11	RxD1
CN4-5	TxD1
CN4-14	GND


半田付けしてケーブルを接続すると写真のようになる。
それにしてもCQ出版の基板には Reset SW が付いてないのが不便だ。写真で分かるように、私の場合大きくて邪魔になる。TRZ1104A には SW が付いていたが水晶が付いてなかった。


さて、 さっそくプログラムを書き込んで試してみたいところだが、その前に若干修正が必要だ。 Renesas のサンプルは SCI2 を使っているので SCI1 に変更する必要がある。


まず、hardware_setup.c

 

次に、serial_printf.c

 



さあ、動かしてみよう。
どきどき
...
Printf も Scanf も動いている。
おそらく問題ないのだろう。たぶん?


参照:Renesas Application Notes RX600 Series Adding Printf and Scanf Support (R01AN0509EU0100)
環境:High-performance Embedded Workshop Upgrade 4.09.00
    Renesas C/C++ compiler package for RX family V.1.00 Release 02

FRK-RX62N (12) printf (1) Renesas RXC Simulator2011年06月19日 09時02分52秒

RX62N SimDebug printf
Renesas Peripheral Driver Library はもうやめにすることにする。
もともと Peripheral Driver Generator は使うつもりがなかった上にコード効率が悪く、使い勝手も悪いことが分かってきたからだ。という訳で他に何かよい題材が無いかと探していると xxxxJTAG日記に「printf等のライブラリを使うことができるようになった」と書いてある。
しかし、[当社お客様向け限定ダウンロードサービス]ということで私はダウンロードできない。
それならば私が作って公開しよう!
ということにする。


とは言ったものの何かサンプルが無いか探してみる。
あるではないですか RX600 Series Adding Printf and Scanf Support
中をのぞいてみると SCI と Simulator Window と E1 E20 Debugger で printf が使えるらしい。
これははじめて知った。 Simulator Window に表示できるなんて!
早速 Simulator で使ってみる。
表示は遅いけど...うんうん表示できる。


しかし、このサンプル日本語のページには無いんだよね?
以前からそうなんだけど Renesas は日本向けのページに載せないことが多い。


参照:Renesas Application Notes RX600 Series Adding Printf and Scanf Support (R01AN0509EU0100)
環境:High-performance Embedded Workshop Upgrade 4.09.00
    Renesas C/C++ compiler package for RX family V.1.00 Release 02

FRK-RX62N (11) Renesas Peripheral Driver Library (3)2011年06月17日 20時32分02秒

RPDL_RX62N.exe
ライブラリがおかしいようなので解凍したディレクトリのファイルを見てみる。
ライブラリは RPDL_RX62N\Device-specific の中に入っている。
RX62N_library_LFBGA_176.lib	385,100
RX62N_library_LQFP_100.lib	366,897
RX62N_library_LQFP_144.lib	154,717
RX62N_library_TFLGA_145.lib	384,081
RX62N_library_TFLGA_85.lib	355,774
おや???
RX62N_library_LQFP_144.lib だけサイズが小さい。
Renesas H Series Librarian Interface で中身をのぞいてみる。
memchr、memcmp、memcpy、memmove....
と標準関数が続いている。
つまり RX62N_library_LQFP_144.lib だけ標準ライブラリが添付されていたのだ


これではエラーになって当たり前。
しかし、ライブラリを作成するためのプロジェクトは用意されて無いので必要なファイルをプロジェクトに詰め込んでいくことにする。
ADC_10\globals_ADC_10.c
ADC_10\utilities_ADC_10.c
CGC\R_CGC_ControlAll.c
CGC\R_CGC_SetAll.c
CGC\globals_CGC.c
INTC\globals_INTC.c
MTU2\R_MTU2_ControlChannelAll.c
MTU2\R_MTU2_CreateAll.c
MTU2\R_MTU2_DestroyAll.c
MTU2\R_MTU2_ReadChannelAll.c
MTU2\globals_MTU2.c
MTU2\utilities_MTU2.c
RPDL\Interrupt_INTC.c
RPDL\Interrupt_MTU2.c
結構たくさんあった。
問題なくコンパイルリンクできる。
FDT で書き込んでみると LED が点滅している。


サンプルを動かすためにここまで苦労するとは...


参照:Renesas Application Notes RX62N Group, RX621 Group Peripheral Driver Library
環境:
    High-performance Embedded Workshop Upgrade 4.09.00
    C/C++ compiler package for RX family V.1.00 Release 02
    RX62N Group, RX621 Group Peripheral Driver Library APR.08.11 Rev.1.04
    Interface 7月号掲載PDGサンプル・プログラム

FRK-RX62N (10) Renesas Peripheral Driver Library (2)2011年06月16日 21時57分30秒

Renesas Peripheral Driver Library
RPDL (RENESAS Peripheral Driver Library) は PDG (Peripheral Driver Generator) から使用するのが本来の使い方のようだ。
図を見ると SH も RPDL 経由で使えるようになっている。探してみよう。


さて、まずは RX62N.zip を解凍する。
さらに、次の二つを解凍する
RPDL_RX62N.exe
RPDL_RX62N_CS-5_source.zip


RPDL_RX62N\Copy_RPDL_RX62N.bat を起動して
下図のように
3 [enter]
..\RPDL_RX62N_CS-5_source [enter] とキー入力する。
Copy_RPDL_RX62N.bat



これでライブラリの用意はできたはずだ。
まともに動くかどうか確認してみよう。
7月号掲載PDGサンプル・プログラム がちょうどいいだろう。
サンプルのプロジェクトはパスが固定になっているらしくエラーになるのでプロジェクトのソースファイルを入れなおし、include ディレクトリを設定しなおし、ライブラリを再設定する。これでパス関係はOKのはずだがまだエラーが出る。
ライブラリをリンクしているはずなのに「ライブラリが無い」というエラーを吐き出し、また標準関数がダブっていると大量の warning が出てくる。 いったいどうなっているの?
L1320 (W) Duplicate symbol "_malloc" in "C:\WorkSpace\rx62n\PDG\RPDL\RPDL\RX62N_library.lib(malloc)"



参照:Renesas Application Notes RX62N Group, RX621 Group Peripheral Driver Library
環境:
    High-performance Embedded Workshop Upgrade 4.09.00
    C/C++ compiler package for RX family V.1.00 Release 02
    RX62N Group, RX621 Group Peripheral Driver Library APR.08.11 Rev.1.04
    Interface 7月号掲載PDGサンプル・プログラム

FRK-RX62N (9) Renesas Peripheral Driver Library (1)2011年06月15日 21時32分28秒

久しぶりに Renesas のページを覗いてみると Renesas Peripheral Driver Library があった。今まで見過ごしてきたのだろうか?
ARM のライブラリのような感じだ。このようにまとめてあった方が使いやすい。しかし、どうやって使うのだろう?
見たところソースとヘッダーしかない。自分でライブラリを作るなり、ソースをプロジェクトに加えるなり、「自由にしてね」という事なのだろうか?
かなり ARM を意識した感じだ。 sh も h8 も r8c もぜひこのようにしてほしい。


あ、よく見るとライブラリの形にもしてあった。
ドキュメントを読んでみよう。


参照:Renesas Application Notes

FRK-RX62N (8) KPIT GNURX + 新規デバイスの登録2011年04月25日 23時43分39秒

RX630
以前、作成していて中断した新規デバイスの作成、中途半端ながらここにまとめておこう。ビットフィールドの並びの問題が解決できれば追加も容易なのだが...。
作成するのはRX630。


新規作成ファイル
Hardware\RX600\RX630.dat
GNURX_Info\Support\RX600\RX630.PGD
GNURX_Info\Generate\iodefine\rx630.h
GNURX_Info\Generate\hwsetup\rx630.c
GNURX_Info\Generate\IntPRG\rx630.c
GNURX_Info\Generate\RESETPRG\rx630.asm
GNURX_Info\Generate\vect\rx630.h
GNURX_Info\Generate\VECTTBL\rx630.c


項目を追加
GNURX_Info\Support\scapp.det
GNURX_Info\Support\scppapp.det


それでは scapp.det と scppapp.det 内容は同じでリンカースクリプト情報を追加する。

 



GNURX_Info\Support\RX600\RX630.PGD、プロジェクトに含めるファイルやセクション情報を記述する。

 



GNURX_Info\Generate\hwsetup\rx630.c、初期化関数で start.asm から呼び出される。(文字がない部分もコピーして張り付ける)

 



GNURX_Info\Generate\IntPRG\rx630.c、割り込みプログラム中身は空。(文字がない部分もコピーして張り付ける)

 



GNURX_Info\Generate\iodefine\rx630.h、問題のI/Oヘッダーファイル白紙状態だ。(文字がない部分もコピーして張り付ける)

 



GNURX_Info\Generate\vect\rx630.h、ベクター定義ヘッダー(文字がない部分もコピーして張り付ける)

 



GNURX_Info\Generate\VECTTBL\rx630.c、ベクターテーブル(文字がない部分もコピーして張り付ける)

 



GNURX_Info\Generate\RESETPRG\rx630.asm、リセット時に最初に動くプログラム。

 



Hardware\RX600\RX630.dat、ハードウェア情報。

 



環境: HEW Version 4.09.00.007 + KPIT GNURX v11.01 Windows Tool Chain (ELF)

FRK-RX62N (7) rxc vs gnurx (2)2011年04月09日 09時46分38秒

確率で円周率を求めるモンテカルロ法を使って KPIT GNURX の Optimize と Library の違いによってオブジェクトのサイズや実行スピードがどのようになるか調べてみよう。
Optimize 設定はメニューの Build から KPIT GNURX [ELF] Tooolchain を選択し C/C++ タブの Optimization Type で決定する。
Optimization Type

Library 設定はメニューの Build から KPIT GNURX [ELF] Tooolchain を選択し Library Generator タブの Select library で決定する。
Select library



結果をまとめたのが以下に示す表だ。
OptimizeLevel	なし	size	speed	both	単位
実行時間		11.72	6.85	6.60	7.03	秒	(Newlib ライブラリ)
ObjectSize	11004	9644	21010	20850	bytes	(Newlib ライブラリ)
実行時間		9.10	4.06	3.81	4.11	秒	(Optimized ライブラリ)
ObjectSize	7932	6574	17926	17778	bytes	(Optimized ライブラリ)
Optimize は size を選択するのがバランスが取れているようだ。 Library は、さすがに名前のとおり Optimized Library がスピード、サイズ共にいい感じだ。これからは Optimized Library を使って Optimize に size を指定するのをデフォルトにしよう。


一方、Renesas 純正コンパイラはどうだろう?
設定は細かくできて speed と size でそれぞれ0~max まで指定できる。さらに、ライブラリの設定もあるのでこの辺でやめにしておく。
OptimizeLevel	0	1	2	max	
実行時間		11.72	9.97	4.02	3.95	秒	(size 優先)
ObjectSize	5738	5412	5014	5014	bytes	(size 優先)
実行時間		11.74	9.99	4.12	4.00	秒	(speed 優先)
ObjectSize	5738	5412	5032	5032	bytes	(speed 優先)
デフォルトで level2 なのでほぼ最強だろう。max にしてもスピード、サイズ共に変わらない。


こうしてみてみると Kpit GNURX はよくできている。しかし、問題点もある。新しいデバイスの追加が Renesas 純正より遅くなってしまうことだ。当然、自分で追加してみようと思った。やってみてわかったことは Renesas 純正のヘッダーファイルが使えないことだ。それは、ビットフィールドの並びが異なるためで、KPIT のヘッダーは手作業で(おそらく)書き換えてある。新しいデバイスごとに自分でこの作業をする気にはなれないので Kpit のリリースを待つか RX をあきらめるしかないと思っている。


環境: KPIT GNURX v11.01 Windows Tool Chain (ELF)
    Renesas C/C++ Compiler Package for RX Family V.1.00 Release 02

FRK-RX62N (6) rxc vs gnurx (1)2011年04月03日 19時09分01秒

確率で円周率を求めるモンテカルロ法を用いて FRK-SH2A と同じように FRK-RX62N で評価してみる。
プログラムは以前と同じ。

CPU は RX62N (FRK-RX62N) 96MHz 比較のため SH7262 (FRK-SH2A) 144MHzもとりあげる。


コンパイラ: C/C++ Compiler Package for RX Family V.1.00 Release 02
コンパイラ: GNURX v11.01 Windows Tool Chain (ELF)
ループ回数: 10000000 回


			 単精度		倍精度
Renesas	shc V.9.03r02	 19.65 秒	 31.87 秒	FRK-SH2A
KPIT	GNUSH v10.01	178.82 秒	189.27 秒	FRK-SH2A
Renesas	rxc V.1.00r02	  4.02 秒	159.96 秒	FRK-RX62N
KPIT	GNURX v11.01	 11.72 秒	249.45 秒	FRK-RX62N


うんうん、興味深い結果だ。
単精度で使うなら RX62N はすばらしい。ま、CPUの能力に見合った使い方をすれば良いということか?



コンパイラ:
 Renesas
  SuperH RISC engine C/C++ Compiler (V.9.03.02)
  C/C++ Compiler Package for RX Family V.1.00 Release 02
 KPIT
  GNUSH v10.01 Windows Tool Chain (ELF)
  GNURX v11.01 Windows Tool Chain (ELF)