RL78のサンプルプログラム等を再開します。

チョコです。

一月程度,忙しい日が続いたのも何とか終わったので,RL78のサンプルプログラム等を再開しようと思います。

その第1弾として,ソフトウェアによるI2Cバスのスレーブ機能を考えています。

10pinのRL78/G10にはIICA0が搭載されていないので,I2Cバスのスレーブとして使用できませんでした。

そこで,R5F10Y16(ROM:2KB,RAM:256B)でどこまでできるかにチャレンジしてみることにします。

(R5F10Y17(ROM:4KB,RAM:512B)の方が楽なのですが,入手性の問題から秋月で入手できるR5F10Y16を

ターゲットにしてみました。)

 

さすがに,400kbpsのファースト・モードには対応できないので,100kbpsの標準モードをターゲットにします。

まずは,ターゲット仕様を決めます。

メモリが少ないので,どこまで実現できるか楽しみです。

 

RL78でのソフトウェアによるI2Cバスのスレーブ機能の実現.pdf

  • チョコです。
    やはり,2kバイト(実際には最初の200バイト程度は使えないので1.8kバイト程度ですが)ではプログラムが入らなくなり,
    ターゲットをR5F10Y17(4kバイト)に変更してプログラミング中です。
    完成したら,どこまでシュリンクできるか検討する方向で進めていきます。
    (I2C以外の機能で頑張り過ぎました。)
  • > 実際には最初の200バイト程度は使えない

    cstart.asm を小変更すると CALLT テーブル領域にスタートアップのコードの大半を収めることができ、使われない領域を減らせます。japan.renesasrulz.com/.../22161 に添付のファイルでそれを行っているので宜しかったら見てみて下さい。

  • チョコです。
    fujitaさん,コメントありがとうございます。そこも使う予定です。本当は,ベクタ領域の未使用分も使おうとしました。CA78K0Rでは使うことができましたが,CC-RLになって使えなくなってしまいました(アセンブラ記述だけなら,ベクタの記述を.DB2にしてしまえば,使えるのですが,C言語部分があるとダメでした)。
  • > 本当は,ベクタ領域の未使用分も使おうとしました。

    『RL78/G10 ユーザーズマニュアル ハードウェア編』によると RL78/G10 のベクタ・テーブル領域は 10ピンの製品は 0001AH~0007DH の 100バイト、16ピンの製品では 0002AH~0007DH の 84バイトの連続した領域が何の用途も割り当てられてないですね。これを使わないのは勿体ない!

  • > アセンブラ記述だけなら,ベクタの記述を.DB2にしてしまえば,使えるのですが,C言語部分があるとダメでした

    一旦 C でコンパイルした機械語を .DB で書けばベクタ・テーブル領域にコードを置くことも不可能ではなさそうですが、そういう無駄な労力をなしに ROM を無駄なく使えると良いですね。
  • チョコです。
    >これを使わないのは勿体ない!
    そうなんですよ。特に1kバイトしかないものもあるので,ここは何とか使いたいところです。
    ここに配置したい部分だけをCA78K0Rでアセンブラで記述して,HEXを作成し,後でエディタでHEXを結合することも考えています。使い勝手が悪くなるのが気になっています。
  • チョコさん、こんにちは。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さん,コメントありがとうございます。
    そのつもりで,エディタでVECTをgrepして全て削除したつもりなんですが。ご指摘のところは.CSEG AT 0でセグメントを0にして.DB2 LLOW _startでリセット・ベクタを定義するようにしたのですが,どここばつのところで引っかかったようです。

    cstart.asmではご指摘の箇所のすぐ上のスタック領域の指定が「 .DS 0x200」となっている部分が気に入らない(RL78/G10ではRAMが最大512バイトしかないのになぜ0x200なんて宣言するんだ)と文句を言ったことがありましたね。

    >コード生成では初期化関数のみ生成させることを好まれている
    コード生成で出力されるAPI関数があまり気に入らないので,初期化のみを良く使っています。
    特に通信関係はいつも言っていますが,問題があると感じています(I2C関係で考慮が足らないので,使い物にならないと考えています)。
    そういえば,最近もCSI+DTCをやった時にCSIの割り込み処理APIがデバイスの使い方に全く合っていないと文句を付けましたね。

    ということで,年のせいか,文句ばっかり言っているような気がします。
  • チョコさん、こんにちは。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"

  • チョコです。
    エラーは上側のものです。
    まだ,全体が完成しているわけでないのと,R5F10Y16しかないので,仕様をシュリンクする方向になるかと思います。
    (やりたいのはソフトでのI2Cスレーブなので,他の部分を削ることになるかと思います。)