チョコです。
一月程度,忙しい日が続いたのも何とか終わったので,RL78のサンプルプログラム等を再開しようと思います。
その第1弾として,ソフトウェアによるI2Cバスのスレーブ機能を考えています。
10pinのRL78/G10にはIICA0が搭載されていないので,I2Cバスのスレーブとして使用できませんでした。
そこで,R5F10Y16(ROM:2KB,RAM:256B)でどこまでできるかにチャレンジしてみることにします。
(R5F10Y17(ROM:4KB,RAM:512B)の方が楽なのですが,入手性の問題から秋月で入手できるR5F10Y16を
ターゲットにしてみました。)
さすがに,400kbpsのファースト・モードには対応できないので,100kbpsの標準モードをターゲットにします。
まずは,ターゲット仕様を決めます。
メモリが少ないので,どこまで実現できるか楽しみです。
RL78でのソフトウェアによるI2Cバスのスレーブ機能の実現.pdf
> 実際には最初の200バイト程度は使えない cstart.asm を小変更すると CALLT テーブル領域にスタートアップのコードの大半を収めることができ、使われない領域を減らせます。japan.renesasrulz.com/.../22161 に添付のファイルでそれを行っているので宜しかったら見てみて下さい。
> 本当は,ベクタ領域の未使用分も使おうとしました。 『RL78/G10 ユーザーズマニュアル ハードウェア編』によると RL78/G10 のベクタ・テーブル領域は 10ピンの製品は 0001AH~0007DH の 100バイト、16ピンの製品では 0002AH~0007DH の 84バイトの連続した領域が何の用途も割り当てられてないですね。これを使わないのは勿体ない!
チョコさん、こんにちは。NoMaYです。確認したのがCC-RL V1.02なのでV1.04では挙動が異なるかも知れませんが、ソースコード上でベクタを全く生成しないようにした上で、以下のような設定をすれば、一応ベクタ領域にもコードをおくことが出来ました。(マップファイルの抜粋を添付します。) ですので、CA78K0Rを引っ張り出さなくても済むと思います。(なお、ベースにしたプロジェクトは以前のApplilet EZ PLのスレッドに添付したものです。また、CC-RL V1.02で試しているのは当方特有の事情です。すみません。)・cstart.asmで以下の行をコメントアウトする _start .VECTOR 0 CALL !!_hdwinit (もしくは藤田さんソースのCALL !_hdwinit) CALL !_main ; main();・CS+にて[セクションの開始アドレス]を以下のようにする .text/0001A,.textf,.SLIB,.RLIB/000CE・CS+にて[その他の追加オプション]を以下のようにする -change_message=warning=2320
*** Options ***-subcommand=DefaultBuild\EZPLforRL78v2andCCRLv102.clnk-Input=DefaultBuild\cstart.obj-Input=DefaultBuild\opt_byte.obj-SECURITY_ID=00000000000000000000-DEVICE=E:\tools\micom\Renesas\CS+\CC\Device\RL78\Devicefile\DR5F10Y47.DVF-DEBug-NOCOmpress-OUtput=DefaultBuild\EZPLforRL78v2andCCRLv102.abs-LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4s.lib-LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4r.lib-ENTry=_start-LISt=DefaultBuild\EZPLforRL78v2andCCRLv102.map-SHow=ALL-AUTO_SECTION_LAYOUT-STARt=.text/0001A,.textf,.SLIB,.RLIB/000CE-FSymbol=.text-ROm=.data=.dataR-ROm=.sdata=.sdataR-NOMessage-NOLOgo-change_message=warning=2320-end*** Error information ***W0562320:Section address overflowed out of range : ".text"*** Mapping List ***SECTION START END SIZE ALIGN.const 00000002 00000002 0 2.constf 00000002 00000002 0 2.data 00000002 00000002 0 2.sdata 00000002 00000002 0 2.text 0000001a 00000055 3c 1.option_byte 000000c0 000000c3 4 1.security_id 000000c4 000000cd a 1.textf 000000ce 000000ce 0 1.SLIB 000000ce 000000ce 0 1.RLIB 000000ce 000000ce 0 1.bss 000ffce0 000ffce0 0 2.dataR 000ffce0 000ffce0 0 2.sbss 000ffe20 000ffe20 0 2.sdataR 000ffe20 000ffe20 0 2
あと、例示するプロジェクトを用意する手間を横着しようとして、こちらのプロジェクト上で設定してしまったのですが、本来の相手側のプロジェクトで以下のように設定すれば、相手側のプロジェクトで例えば以下のような外部シンボル定義ファイル(*.fsy)を生成させることが出来ますので、それをこちら側のプロジェクトに追加すると、プロジェクト間でサブルーチンコールしたりすることが簡単になります。(もし、ご存知でしたら、すみません、、、)・CS+にて[外部定義シンボルをファイル出力するセクション]に以下を追加する .text
;RENESAS OPTIMIZING LINKER GENERATED FILE 2017.05.28;fsymbol = .text;SECTION NAME = .text .public _start_start .equ 0x0000001a .public _exit_exit .equ 0x00000054
[画面コピー][追記] 2017/05/28 14:42そういえば、先日チョコさんはコード生成では初期化関数のみ生成させることを好まれているようなことを仰っていましたので、たとえ幾らかはコード生成を使っていたとしても、たぶん、今回のチョコさんのソース全体に渡ってベクタを生成させないように記述するのは容易な気がします。その上で、そのプロジェクトから外部シンボル定義ファイル(*.fsy)を生成させ、もう1つプロジェクトを用意し、そちらではその外部シンボル定義ファイル(*.fsy)を利用してベクタ部分だけ記述するようにし、それらからの2つのMOTをCS+のPythonスクリプト等を[ビルド後に実行するコマンド]の設定で実行させて結合するというのは、どうでしょうか。(あくまで苦肉の策ですが。)
チョコさん、こんにちは。NoMaYです。チョコさんがコードシュリンク前のR5F10Y47でのソースを公開された時に、こちらで確認するのが効率が良さそうだと思っていて、その時には試してみるつもりなのですが、でも、ひとまず忘れない為のメモ代わりの投稿、ということにして書いておくことにしました。エラー番号としては、以下の2つの番号が考えられます。E0562321:Section ".text" overlaps section ".vect"E0562320:Section address overflowed out of range : ".text"上の1つ目のものであれば、どこか別のところに残っているのだろうと考えられるのですが、2つめのものであれば、チョコさんがイメージしておられるであろう原因/理由とは別ものだと思われます。先程の策でも実は2つ目のものがエラーとして残っていたのです。(原因/理由は腑に落ちませんが。) それをリンクオプションに -change_message=warning=2320 を指定することで強制的にエラーをワーニング扱いに変更させて、何とかABS/MOTの生成に漕ぎ着けたというカラクリなのです。なお、エラーの種類によってはABS/MOTの生成に漕ぎ着けられず駄目なこともあるのですが、このエラーに関しては何とかなりました。(ただ、CC-RL V1.04ではV1.02と挙動が異なっているという可能性は有り得ます。)駄目だったエラーは、上の1つ目のものでした。一応、-change_message=warning=2321 を指定するとワーニング扱いになって状況は変わるのですが、今度は別のエラーが発生してしまい、それをワーニング扱いにすると更に別のエラー発生するという状況で、それら全てを -change_message=warning=2321,2320,2022 でワーニング化しようとしても、最後のエラーがワーニング化されずに以下のように表示され、ABS/MOTの生成に漕ぎ着けられませんでした。(この最後のエラーに関しても腑に落ちませんが。)W0562321:Section ".text" overlaps section ".vect"W0562320:Section address overflowed out of range : ".text"E0562022:Address ranges overlap in option "output" : "0x1a-0x5d"
チョコさん、藤田さん、こんにちは。NoMaYです。修正版の藤田さんcstart.asmでチョコさんの .CSEG AT 0 / .DB2 LLOW _start の書き換えをしていて頭に浮かんだのですが、昨日の -change_message=warning=2320 を指定することでABS/MOTの生成に漕ぎ着けられるならば、割り込み関数についても同様に(チョコさんのやり方を真似て)出来れば、ひとまず第一ステップをクリアしたと言って良さそうな気がしたのです。試してみると、以下のマップファイル(0番地はリセットベクタ、0x18番地は_int18hという割り込み関数のベクタ)が示すABS/MOTを生成することが出来ました。 これって第一ステップをクリア出来たということなのではないかという気がするのです。(ただ、当方の事情で、まずはCC-RL V1.02にて、というところではありますが、、、)プロジェクトのファイル一式CCRLv102andCStartG10Fujita.OK.zip
*** Options ***-subcommand=DefaultBuild\CCRLv102andCStartG10Fujita.clnk-Input=DefaultBuild\cstart.obj-Input=DefaultBuild\opt_byte.obj-Input=DefaultBuild\main.obj-SECURITY_ID=00000000000000000000-DEVICE=E:\tools\micom\Renesas\CS+\CC\Device\RL78\Devicefile\DR5F10Y47.DVF-DEBug-NOCOmpress-OUtput=DefaultBuild\CCRLv102andCStartG10Fujita.abs-LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4s.lib-LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4r.lib-ENTry=_start-LISt=DefaultBuild\CCRLv102andCStartG10Fujita.map-SHow=ALL-AUTO_SECTION_LAYOUT-STARt=.cstart_g10/0001A,.text,.textf,.RLIB,.SLIB,.sdata,.data/000CE,.dataR,.bss/FFCE0,.sdataR,.sbss/FFE20-ROm=.data=.dataR-ROm=.sdata=.sdataR-NOMessage-NOLOgo-change_message=warning=2320-end*** Error information ***W0562320:Section address overflowed out of range : ".cstart_g10"*** Mapping List ***SECTION START END SIZE ALIGN.text_AT0 00000000 00000001 2 1.constf 00000002 00000002 0 2.text_AT18 00000018 00000019 2 1.cstart_g10 0000001a 00000059 40 1.const 0000005a 0000005b 2 2.option_byte 000000c0 000000c3 4 1.security_id 000000c4 000000cd a 1.text 000000ce 000000ee 21 1.textf 000000ef 000000ef 0 1.RLIB 000000ef 000000ef 0 1.SLIB 000000ef 000000ef 0 1.sdata 000000f0 000000f1 2 2.data 000000f2 000000f3 2 2.dataR 000ffce0 000ffce1 2 2.bss 000ffce2 000ffce5 4 2.sdataR 000ffe20 000ffe21 2 2.sbss 000ffe22 000ffe23 2 2
画面コピー
> ループ制御変数をuint8_tからuint16_tに変更したり
RL78 で uint8_t よか uint16_t の方が小さくなるとかそんなことあるのかなと r_initad.c の R_ADC_Init()
void R_ADC_Init(void) { uint16_t data_work; uint16_t i;
/* 略 */
for ( i = 0 ; i < SAMPLE ; i++ ) { ad_data[i][ad_ch] = data_work; /* A/Dデータ初期化 */ }
で使用しているループ変数 i を試しに uint8_t に変更してビルドしてみたところ、最適化レベルが「デバッグ優先(-Onothing)」の条件では
PROGRAM SECTION: 000006c1 Byte(s)↓PROGRAM SECTION: 000006c4 Byte(s)
とサイズが増大したものゝ、最適化レベルを「サイズ優先(-Osize)」でビルドした場合では
PROGRAM SECTION: 00000583 Byte(s)↓PROGRAM SECTION: 00000580 Byte(s)
とサイズが小さくなりました。この辺りの判断は難しいですね。
CC-RLがV1.07から未使用のベクタ領域をプログラムで使用できるようになったと,先日やっと気が付きました。
CS+ RL78コンパイラCC-RL V1.07.00リリースノートの「4.3 ベクタテーブル・セクションをベクタテーブル・アドレス別に生成する機能の追加」には以下の記述がありました。
「ベクタテーブル・セクションをベクタテーブル・アドレス別に分割して生成する-SPLIT_VECTオプションを追加しました。これにより未使用のベクタテーブル領域を別の用途に活用できるようになりました。」
そこで,前回のプログラムで確認してみることにしました。
まず,CS+のプロジェクト・ツリーのCC-RLのプロパティを開いて,「リンク・オプション」タグを開いて,「出力コード」の項目を開きます。
その中で,一番下にある「ベクタ・テーブル・セクションの分割生成」を「はい(-SPLIT_VECT)」に設定します。
その上で,「共通オプション」タグで,使用するコンパイラのバージョンを最新版にしておきます。
確認のために,前回作成したr_iicss_lib.asmの最後の部分に以下のように0x0020から配置するように指定してみました。
ビルドして,シミュレータにダウンロードしてアドレスを確認すると,ちゃんと0x0020から配置されていることが分かります。
前回,問題となった「未使用ベクタ領域にプログラムを配置することができる」ように修正されていることが確認できました。
(今回は,機能の確認だけなので,ぎりぎりまで使うような変更はしていません。)