ブート領域 フラッシュ領域の分割方法 RL78 ファミリ用 C コンパイラ CC-RL 2016 年 10 月 5 日 Rev.2.00 ソフトウエア事業部 ソフトウエア技術部 ルネサスシステムデザイン株式会社 R20UT3475JJ0200
アジェンダ はじめにページ 3 概要ページ 4 ブート領域 フラッシュ領域共通ページ 12 ブート領域ページ 19 フラッシュ領域ページ 38 デバッグツールページ 50 サンプルプログラムページ 53 改版履歴ページ 58 ページ 2
はじめに 本資料は RL78 ファミリ用 C コンパイラ CC-RL を使用して プログラムをブート領域 フラッ シュ領域に分割する際に 必要な処理について説明しています 本資料は 次のツール バージョンで説明をしています RL78ファミリ用 Cコンパイラ CC-RL V1.03.00 統合開発環境 e 2 studio V5.2.0.020 統合開発環境 CS+ for CC V4.01.00 ページ 3
概要 ブート領域 フラッシュ領域の分割について ブート領域 フラッシュ領域の配置 ブート領域 フラッシュ領域の分割をするために ブート領域 フラッシュ領域のビルドイメージ
ブート領域 フラッシュ領域の分割について (1/4) システム上でのイメージ フラッシュ領域 ( アプリケーション 1) フラッシュ領域 ( アプリケーション 2) ブート領域 (HEX 固定 ) マイコンのフラッシュメモリセルフプログラミング機能を使用して アプリケーション部分を更新 ページ 5
ブート領域 フラッシュ領域の分割について (2/4) ブート領域とフラッシュ領域とは ブート領域 : システム上 書き換えが不可能な領域 フラッシュ領域 : システム上 書き換え / 取り換えが可能な領域 ブート領域とフラッシュ領域の分割の目的 ブート領域上のプログラムの再構築を行わず フラッシュ領域上のプログラムのみを変更する ページ 6
ブート領域 フラッシュ領域の分割について (3/4) ブート領域とフラッシュ領域間で実現すること フラッシュ領域からブート領域の変数 関数をアクセスできるようにする ブート領域プロジェクトで外部定義シンボル出力機能 -FSymbolを利用 フラッシュ領域プロジェクトでそのファイルをビルド対象にする ブート領域から フラッシュ領域の関数を関数テーブル経由で呼び出せるようにする ブート領域プロジェクトで フラッシュ領域の関数を呼び出す関数テーブルの関数の各分岐命令のアドレスを呼び出すようにする フラッシュ領域プロジェクトで ブート領域プロジェクトから呼び出される関数の分岐命令のテーブルを作成し 各関数への分岐命令を記述する ページ 7
ブート領域 フラッシュ領域の分割について (4/4) ブート領域 フラッシュ領域間の変数 関数の参照 外部定義シンボル出力機能 -FSymbol を利用 ( 変数参照 ) フラッシュ用 RAM ブート用 RAM 参照できない RAM 領域 外部定義シンボル出力機能 -FSymbol を利用 ( 関数コール ) フラッシュ領域 分岐テーブル領域 ブート領域 参照できない 実アドレスを管理する ( 関数コール ) ROM 領域 0000H ページ 8
ブート領域 フラッシュ領域の配置 ( 例 ) 次のようにブート領域とフラッシュ領域に配置 FEA00H FE900H フラッシュ用 RAM ブート用 RAM RAM 領域 2200H 2000H フラッシュ領域 分岐テーブル領域 ROM 領域 0000H ブート領域 ページ 9
ブート領域 フラッシュ領域の分割をするために ブート領域用のプロジェクトの作成 ソースファイルにブート領域のためのプログラムを作成 リンカのオプション設定 フラッシュ領域のプロジェクトをビルドする際に必要なため フラッシュ領域用プロジェクトよりも前にビルドが必要 フラッシュ領域用のプロジェクトの作成 ソースファイルにフラッシュ領域のためのプログラムを作成 リンカのオプション設定 ページ 10
ブート領域 フラッシュ領域のビルドイメージ ブート領域 フラッシュ領域 boot.c flash.c コンパイル コンパイル boot.asm 関数の分岐命令のテーブル解決.asm 変数 関数.fsy 関数テーブル.asm flash.asm アセンブル アセンブル boot.obj 関数の分岐命令のテーブル解決.obj -fsymbol= 外部変数 関数セクション 変数 関数.obj 関数テーブル.obj flash.obj リンク リンク boot.abs 変数 関数.fsy flash.abs ブート領域用ロードモジュール 外部変数 関数のシンボル情報 フラッシュ領域用ロードモジュール ページ 11
ブート領域 フラッシュ領域共通 プロジェクトの作成 e 2 studio CS+ ブート領域 フラッシュ領域共通プログラムの作成 分岐テーブルのアドレス定義ファイル ( アセンブラ ) ブート領域用とフラッシュ領域用のヘキサファイル 初期化フロー
プロジェクトの作成 (e 2 studio) プロジェクトの作成 フラッシュ領域のプロジェクト ブート領域のプロジェクト ビルド対象ファイルの追加 補足 1. フラッシュ領域のプロジェクトに ブート領域のプロジェクトのプロジェクトを参照するように設定することにより フラッシュ領域のプロジェクトビルド時に ブート領域のプロジェクトを参照します 2. *.fsy ファイルをアセンブルすることができないので 拡張子を *.asm に変更して登録してください ページ 13
プロジェクトの作成 (CS+) プロジェクトの作成 メインプロジェクト フラッシュ領域のプロジェクト サブプロジェクト ブート領域のプロジェクト 自動生成ファイルのビルド対象外への変更 ビルド対象ファイルの追加 補足 1. CS+ のビルド順は サブプロジェクト メインプロジェクト 2. ブート領域のプログラムは 1 度作成したら変更しないため フラッシュ領域の 2 世代目以降の作成時には サブプロジェクトを削除することが可能 ページ 14
ブート領域 フラッシュ領域共通プログラムの作成 分岐テーブルのアドレス定義ファイル ( アセンブラ ) ブート領域 フラッシュ領域のアセンブラソースアイルにインクルードします FLASH_TABLE : 分岐テーブルの先頭アドレス INTERRUPT_OFFSET : 分岐テーブルの割り込み領域分のサイズ 例 ftable.inc FLASH_TABLE.EQU 0x2000 INTERRUPT_OFFSET.EQU 0x100 ページ 15
ブート領域用とフラッシュ領域用のヘキサファイル 本資料で設定するファイル名 ( 出力方法は後述 ) 結合したヘキサファイル (boot_flash.mot) RAM 領域 フラッシュ領域 フラッシュ領域用ヘキサファイル (flash2000_ffff.mot) 2000H ブート領域用ヘキサファイル (boot0000_1fff.mot) 0000H ブート領域 補足 : ロードモジュールファイル (*.abs) は ブート領域 フラッシュ領域のそれぞれに生成されます ページ 16
初期化フロー (1/2) _start の最後でフラッシュのスタートアップに飛ぶ ブート領域 (ROM).data.sdata RAM 領域 フラッシュ用領域 3 1 0000H boot_main() _start: ベクタ領域 VECT02 VECT01 RESET 2 ブート用領域.dataR.sdataR _start の中で初期値のコピーを行う ページ 17
初期化フロー (2/2) フラッシュ領域 (ROM) RAM 領域.data.sbata フラッシュ用領域 5 func() main().datar.sdatar _start の中で初期値のコピーを行う _start ブート用領域 3 4 BR BR BR BR 分岐テーブル領域!func!! VECT02!! VECT01!! _start 関数用 割込み用 ページ 18
ブート領域 ブート領域用プログラムの作成 スタートアップルーチン (cstart.asm) の変更 hdwinit.asm と stkinit.asm の変更 オンチップデバッグ用領域の確保プログラムの作成 分岐テーブルの関数アドレス解決用のファイルの作成 ブート領域のオプションの設定 外部定義シンボルのファイルの出力 セクションの配置指定 フラッシュ領域の割り込み関数に分岐させるためのベクタの設定 オンチップデバッグを使用するための設定 ブート領域のアドレスのみのヘキサファイルを出力する設定
ブート領域用プログラムの作成 (1/9) スタートアップルーチン (cstart.asm) の変更 (1/6) 分岐テーブルのアドレス定義のインクルードの追加 例 $IFNDEF RENESAS_VERSION RENESAS_VERSION.EQU $ENDIF 0x01000000 $INCLUDE "ftable.inc" ページ 20
ブート領域用プログラムの作成 (2/9) スタートアップルーチン (cstart.asm) の変更 (2/6) スタック領域の明示的な確保 条件アセンブル命令をコメントアウトし.stack_bss セクションの定義を有効にする 例 ;$IF ( RENESAS_VERSION < 0x01010000) ; for CC-RL V1.00 ;------------------------------------------------------------------- ; stack area ;------------------------------------------------------------------- ;!!! [CAUTION]!!! ; Set up stack size suitable for a project..section.stack_bss, BSS _stackend:.ds 0x200 _stacktop: ;$ENDIF ページ 21
ブート領域用プログラムの作成 (3/9) スタートアップルーチン (cstart.asm) の変更 (3/6) セクション名の変更 外部定義シンボル出力機能 -Fsymbol の対象外にするために セクション名を変更する 例 ;----------------------------------------------------------------------------- ; startup ;-----------------------------------------------------------------------------.SECTION.btext, TEXT _start: ページ 22
ブート領域用プログラムの作成 (4/9) スタートアップルーチン (cstart.asm) の変更 (4/6) スタックポインタの設定 条件アセンブル命令等をコメントアウトし 明示的に確保した.stack_bssセクションをスタックポインタに設定する 例 ;$IF ( RENESAS_VERSION >= 0x01010000) ; MOVW SP,#LOWW( STACK_ADDR_START) ;$ELSE ; for CC-RL V1.00 MOVW SP,#LOWW(_stacktop) ;$ENDIF ページ 23
ブート領域用プログラムの作成 (5/9) スタートアップルーチン (cstart.asm) の変更 (5/6) ブート領域用のメイン関数の呼び出しへの変更と フラッシュ領域のスタートアップルーチンへの分岐命令の追加 例 ;-------------------------------------------------- ; call main function ;-------------------------------------------------- CALL!!_boot_main ; main(); BR!!FLASH_TABLE ページ 24
ブート領域用プログラムの作成 (6/9) スタートアップルーチン (cstart.asm) の変更 (6/6) ブート領域にミラー元領域が含まれない場合には.constセクションの定義をコメントアウトしてください 例 ; section ;----------------------------------------------------------------------------- $IF ( RENESAS_VERSION >= 0x01010000).SECTION.RLIB, TEXTF.L_section_RLIB:.SECTION.SLIB, TEXTF.L_section_SLIB: $ENDIF.SECTION.textf, TEXTF.L_section_textf: ;.SECTION.const, CONST ;.L_section_const: ページ 25
ブート領域用プログラムの作成 (7/9) hdwinit.asm と stkinit.asm の変更 セクション名の変更 外部定義シンボル出力機能 -Fsymbolの対象外にするために セクション名を変更する 例.btextf.CSEG TEXTF ページ 26
ブート領域用プログラムの作成 (8/9) オンチップデバッグ用領域の確保プログラムの作成 オンチップデバッグを使用する場合には 特定のメモリを開ける (0xffで埋める) 必要があります 0x0002~0x0003 番地 リンカの -VECTN オプションで 0xffff を設定 0x00ce~0x00d7 番地 アセンブラソースで定義 ( 下記プログラム参照 ) ROM の最後の 512 バイト 例 フラッシュ領域で確保 ocdrom_ce.asm MON_CE.CSEG AT 0x00ce.DB8 0xffffffffffffffff.DB2 0xffff ページ 27
ブート領域用プログラムの作成 (9/9) 分岐テーブルの関数アドレス解決用のファイルの作成 ( アセンブラ ) Cソース上から フラッシュ領域の関数コールをするための 分岐テーブルのアドレスを解決するためのシンボルを定義してください このファイルを プロジェクトに登録してください 例 extern_ftable.asm $INCLUDE "ftable.inc".public _f1 _f1.equ (FLASH_TABLE + INTERRUPT_OFFSET + (0 * 4)).public _f2 _f2.equ (FLASH_TABLE + INTERRUPT_OFFSET + (1 * 4)) ページ 28
ブート領域のオプションの設定 (1/9) フラッシュ領域のプロジェクトでブート領域の変数 関数をアクセスできるように外部定義シンボルのファイルの出力 対象とするセクションを -Fsymbol オプションにすべて登録してください 例 e 2 studio ページ 29
ブート領域のオプションの設定 (2/9) 例 CS+ ページ 30
ブート領域のオプションの設定 (3/9) セクションの配置指定 リンカの-startオプションで ブート領域のセクションの配置を指定してください フラッシュ領域の配置と重ならない様に考慮してください スタック領域のセクションの指定も追加してください 例 e 2 studio 例 CS+ ページ 31
ブート領域のオプションの設定 (4/9) フラッシュ領域の割り込み関数に分岐させるためのベクタの設定 リンカの -VECTN オプションで分岐テーブルの該当アドレスを指定してください 例 e 2 studio 8 番地に 0x2010 を設定する ページ 32
ブート領域のオプションの設定 (5/9) 例 CS+ 8 番地に 0x2010 を設定する ページ 33
ブート領域のオプションの設定 (6/9) オンチップデバッグを使用するための設定 リンカの-VECTNオプションで0x0002~0x0003 番地の領域を確保してください ( e 2 studio では 自動で設定されています ) リンカの-OCDBGオプションを有効にし オンチップデバッグオプションバイトの値を設定をしてください 例 e 2 studio ページ 34
ブート領域のオプションの設定 (7/9) 例 CS+ ページ 35
ブート領域のオプションの設定 (8/9) ブート領域のアドレスのみのヘキサファイルを出力する設定 出力するファイル名と 出力するアドレスを設定してください 例 e 2 studio ページ 36
ブート領域のオプションの設定 (9/9) 例 CS+ ページ 37
フラッシュ領域 フラッシュ領域用プログラムの作成 スタートアップルーチン (cstart.asm) の変更 分岐テーブルプログラムの作成 割り込み関数の定義 フラッシュ領域のオプションの設定 外部定義シンボルファイルのプロジェクト登録 セクションの配置指定 フラッシュ領域のアドレスのみのヘキサファイルを出力する設定 ブート領域とフラッシュ領域のヘキサファイルの結合
フラッシュ領域用プログラムの作成 (1/3) スタートアップルーチン (cstart.asm) の変更 スタックポインタの設定部分のコメントアウト ブート領域のスタートアップルーチンで設定したスタックポインタを使用するため フラッシュ領域では再設定しないでください 例 ;-------------------------------------------------- ; setting the stack pointer ;-------------------------------------------------- ;$IF ( RENESAS_VERSION >= 0x01010000) ; MOVW SP,#LOWW( STACK_ADDR_START) ;$ELSE ; for CC-RL V1.00 ; MOVW SP,#LOWW(_stacktop) ;$ENDIF ページ 39
フラッシュ領域用プログラムの作成 (2/3) 分岐テーブルプログラムの作成 ブート領域から呼び出されるアドレスに フラッシュ領域の関数のアドレスへ分岐するための 分岐命令を記載してください 例 ftable.asm $INCLUDE "ftable.inc".extern _start.extern _f1.extern _f2.jtext.cseg AT FLASH_TABLE br!!_start ; RESET.DB4 0xffffffff ;.DB4 0xffffffff ; INTWDTI.DB4 0xffffffff ; INTLVI br!!_int_intp0 ; INTP0.DB4 0xffffffff ; INTP1.DB4 0xffffffff ; INTP2 ~ 省略 ~.jtext2.cseg AT FLASH_TABLE+INTERRUPT_OFFSET br!!_f1 br!!_f2 割り込み用 関数用 ページ 40
フラッシュ領域用プログラムの作成 (3/3) 割り込み関数の定義 割り込みベクタはブート領域のプロジェクトで定義の必要があります フラッシュ領域では #pragma interrupt でベクタのアドレス (vect) は指定しないでください 例 #include "iodefine.h" #pragma interrupt int_intp0 volatile char f; void int_intp0(void) { f = 1; } ページ 41
フラッシュ領域のオプションの設定 (1/8) 外部定義シンボルファイルのプロジェクト登録 ブート領域の変数 関数をアクセスできるように ブート領域で作成した外部定義シンボルファイルをプロジェクトに登録してください 例 e 2 studio 例 CS+ 補足 e 2 studio *.fsy ファイルをアセンブルすることができないので 拡張子を *.asm に変更して登録してください ページ 42
フラッシュ領域のオプションの設定 (2/8) セクションの配置指定 リンカの-startオプションで フラッシュ領域のセクションの配置を指定してください ブート領域の配置と重ならない様に考慮してください 分岐テーブルの領域を空けるようにしてください 例 e 2 studio 例 CS+ ページ 43
フラッシュ領域のオプションの設定 (3/8) フラッシュ領域のアドレスのみのヘキサファイルを出力する設定 出力するファイル名と 出力するアドレスを設定してください 例 e 2 studio ページ 44
フラッシュ領域のオプションの設定 (4/8) 例 CS+ ページ 45
フラッシュ領域のオプションの設定 (5/8) ブート領域とフラッシュ領域のヘキサファイルの結合 ブート領域とフラッシュ領域のヘキサファイルを結合して1つにする場合には ビルド後の処理にリンカの実行を追加してください 例 e 2 studio ページ 46
フラッシュ領域のオプションの設定 (6/8) 例 CS+ ページ 47
フラッシュ領域のオプションの設定 (7/8) ブート領域とフラッシュ領域のヘキサファイルの結合 リンカに入力するサブコマンドファイルで 入力するヘキサファイルと ヘキサファイルの形式 出力するファイル名を指定してください 例 sub_mot.txt (e 2 studio) -input=.... boot HardwareDebug boot0000_1fff.mot -input=flash2000_ffff.mot -form=stype -output=boot_flash.mot ページ 48
フラッシュ領域のオプションの設定 (8/8) 例 sub_mot.txt (CS+) -input=.. boot DefaultBuild boot0000_1fff.mot -input=. DefaultBuild flash2000_ffff.mot -form=stype -output=. DefaultBuild boot_flash.mot ページ 49
デバッグツール
デバッグツールへのダウンロード (1/2) ロードモジュールファイル (*.abs) は ブート領域用 フラッシュ領域用の 2 つのファイルが生 成されるので デバッグツールでは 2 つのロードモジュールファイルをダウンロードしてくだ さい 例 フラッシュ領域のプロジェクトにブート領域のロードモジュールファイルを追加 (e 2 studio) 補足 e 2 studio boot.x は 接続時は No にしてください 接続後に ダウンロードしてください ページ 51
デバッグツールへのダウンロード (2/2) 例 フラッシュ領域のプロジェクトにブート領域のロードモジュールファイルを追加 (CS+) ページ 52
サンプルプログラム
サンプルプログラム 今まで作成してきたプログラムを使用するための ブート領域のプログラム フラッシュ領域のプログラムの例を 次ページ以降に記載します ページ 54
ブート領域のサンプルプログラム #include iodefine.h /* SFR の定義ファイル */ #pragma interrupt int_intp1 (vect=intp1) /* ブート領域の割り込み定義 */ int boot_a = 0x12; int boot_b = 0x34; extern int f1 ( int ) ; /* フラッシュ領域の関数のプロトタイプ宣言 */ extern int f2 ( int ) ; /* フラッシュ領域の関数のプロトタイプ宣言 */ void boot_main (void ) /* ブート領域のメイン関数 */ { /* ブート領域のメインの処理 */ } void boot_func(void) { boot_a = f1 ( boot_a ) ; /* フラッシュ領域の関数コール */ boot_b = f2 ( boot_b ) ; /* フラッシュ領域の関数コール */ } void int_intp1 (void) /* ブート領域の割り込み処理 */ { boot_a = 1; } ページ 55
フラッシュ領域のサンプルプログラム (1/2) #include "iodefine.h" /* SFR の定義ファイル */ int flash_a, b; extern int boot_a, boot_b; /* ブート領域で定義された変数 */ extern void boot_func(void); /* ブート領域で定義された関数 */ int f1 ( int a) { return (++a); } int f2 ( int b) { return (--b); } void main(void) /* フラッシュ領域のメイン関数 */ { boot_a++; /* ブート領域の変数のアクセス */ boot_b++; /* ブート領域の変数のアクセス */ boot_func(); /* ブート領域の関数のアクセス */ } ページ 56
フラッシュ領域のサンプルプログラム (2/2) #include "iodefine.h" /* SFR の定義ファイル */ #pragma interrupt int_intp0 /* フラッシュ領域の割り込み定義 */ volatile char f; void int_intp0(void) /* フラッシュ領域の割り込み処理 */ { f = 1; } ページ 57
改版履歴 版数 内容 適用箇所 Rev.1.00 初版 Rev.2.00 テンプレートの変更 全般 対象ツールのバージョン変更 P3, P29, P32, P47 -VECTNオプションの指定値修正 P32, P33 _int_intp0への分岐命令の修正 P40 ページ 58
ルネサスシステムデザイン株式会社