なんとかなるさね

マイコンをネタにブログを始めてみました


スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--   blog-entry-   category: スポンサー広告

go page top

RL78マイコン(RL78/G10)|スタートアップルーチンを拡張子が.cのソースに書いてみる (CC-RL) 

以前のエントリ(571, 572, 等)でRL78/G10用CA78K0Rスタートアップルーチンを拡張子が.cのソースに書いて
みた(といっても大半がインラインアセンブラ記述の'おまじない'となってしまいましたが)ことがあるのですが、
今回CC-RLで同様にやってみました(というか単にインラインアセンブラ記述しただけになってしまいましたが)。

cstart_g10.c        (2016/08/13更新(コメント部分のみ))

/* This code is in the public domain. You may use, modify or distribute it freely. */

/* Yet another C startup routine for CC-RL compiler and RL78/G10 group */

#pragma inline_asm start

void __near start(void)
{
    //--------------------------------------------------
    // setting the stack pointer
    //--------------------------------------------------
    MOVW    SP, #LOWW(__STACK_ADDR_START)

    //--------------------------------------------------
    // hardware initialization (this code assumes ROM < 64K)
    //--------------------------------------------------
    // hdwinit function here cannot use any global/static variables
    // because they are not initialized with zero nor data
    // and they will be initialized with zero or data
#if 1 // you can set 0 if you want to call hdwinit in main function
    CALL    !_hdwinit
#endif

    //--------------------------------------------------
    // RAM clear (this code assumes RAM size > 0)
    //--------------------------------------------------
    CLRW    AX
    MOVW    BC, #LOWW(__RAM_ADDR_END - __RAM_ADDR_START)
.L1_RAM:
    DECW    BC
    MOV     #LOWW(__RAM_ADDR_START)[BC], A
    CMPW    AX, BC
    BNZ     $.L1_RAM

    //--------------------------------------------------
    // ROM data copy (this code assumes ROM < 64K)
    //--------------------------------------------------
#if 1 // you can set 0 if there are no variables having initial value
    MOV     ES, A // A = 0 just after RAM clear is finished

#if 1  // you can set 0 if there are no normal variables having initial value
    // copy external variables having initial value
    MOVW    DE, #LOWW(STARTOF(.data))
    MOVW    HL, #LOWW(STARTOF(.dataR))
    MOVW    BC, #LOWW(STARTOF(.dataR) + SIZEOF(.dataR))
    CALL    !.romdatacopy
#endif

#if 1  // you can set 0 if there are no saddr variables having initial value
    // copy saddr variables having initial value
    MOVW    DE, #LOWW(STARTOF(.sdata))
    MOVW    HL, #LOWW(STARTOF(.sdataR))
    MOVW    BC, #LOWW(STARTOF(.sdataR) + SIZEOF(.sdataR))
    CALL    !.romdatacopy
#endif
#endif

    //--------------------------------------------------
    // call main function (this code assumes ROM < 64K)
    //--------------------------------------------------
    //CALL  !_main
//.L1_EXIT:
    //BR    $.L1_EXIT
    // main function never return (this reduces 4 bytes of stack usage)
    BR      !_main

    //--------------------------------------------------
    // romdatacopy (this code assumes ROM < 64K)
    //--------------------------------------------------
#if 1 // you can set 0 if there are no variables having initial value
    //MOV   ES, #0 // ROM
    //MOVW  DE, #LOWW(STARTOF(.xxx)) // ROM
    //MOVW  HL, #LOWW(STARTOF(.xxxR)) // RAM
    //MOVW  BC, #LOWW(STARTOF(.xxxR) + SIZEOF(.xxxR)) // RAM
.L1_DATA:
    MOV     A,ES:[DE]
    MOV     [HL], A
    INCW    DE
    INCW    HL
.romdatacopy:
    MOVW    AX, BC
    CMPW    AX, HL
    BNZ     $.L1_DATA
    //RET is in the next line
#endif
}

#if 0 // please set 1 when exit function is necessary
void __near exit(void)
{
    for (;;) {}
}
#endif




CC-RLではインラインアセンブラ記述出来る内容がCA78K0Rよりも限られていて、リセットベクタを設定する
擬似命令を記述出来ませんでしたので、以下のようにリンカオプションでリセットベクタを設定しました。




なお、RAM領域やスタック領域等の取得方法は以下のRulzのサンプルコードのアセンブラソースやビルド時の
マップファイルを参考にさせて頂きました。

Home >> かふぇルネ >> サンプルプログラム等 >> RL78G10簡易IICによるLCD表示器の制御 - Rulz
http://japan.renesasrulz.com/cafe_rene/m/sample_program/277.aspx

また、以前のエントリ(571, 572, 等)と同様にルネサスの開発ツールのFAQにあったRL78/G10向けのスタート
アップルーチンのコードサイズの削減手順について解説している以下の資料も参考にさせて頂きました。

FAQ No. 1011096
RL78コンパイラ(CA78K0R)を使用してRL78/G10のプログラムを作成していますが、
デフォルトのスタートアップルーチンから処理を少なくすることはできますか?
https://support.renesas.com/hc/ja/articles/210553967
https://www.renesas.com/ja-jp/doc/products/tool/doc/003/r20ut3046jj0100_ca78k0r.pdf

追記 : メモ

ちなみに、CC-RL(少なくとも私が試したV1.02.00)ではインラインアセンブラ記述部分(インラインアセンブラ
関数として関数全体をアセンブラ記述する必要があります)はデバッガでソースステップ実行出来ませんでした。

追記 : 履歴

2016/08/13
cstart_g10.c
* コメントの修正/追加

2016/08/07
cstart_g10.c
* 初版

関連記事

2016/08/07   blog-entry-798   category: RL78 /* 16bit,8bit CISC */

go page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。