© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域、
フラッシュ領域の
分割方法
RL78ファミリ用Cコンパイラ CC-RL
2016年10月5日 Rev.2.00 ソフトウエア事業部 ソフトウエア技術部 ルネサス システムデザイン株式会社R20UT3475JJ0200
アジェンダ
はじめに ページ 3 概要 ページ 4 ブート領域、フラッシュ領域共通 ページ 12 ブート領域 ページ 19 フラッシュ領域 ページ 38 デバッグツール ページ 50 サンプルプログラム ページ 53 改版履歴 ページ 58© 2016 Renesas System Design Co., Ltd. All rights reserved.
はじめに
ページ 3 本資料は、 RL78ファミリ用Cコンパイラ CC-RLを使用して、プログラムをブート領域、フラッ シュ領域に分割する際に、必要な処理について説明しています。 本資料は、次のツール、バージョンで説明をしています。 RL78ファミリ用Cコンパイラ CC-RL V1.03.00 統合開発環境 e2 studio V5.2.0.020 統合開発環境 CS+ for CC V4.01.00概要
•
ブート領域、フラッシュ領域の分割について
•
ブート領域、フラッシュ領域の配置
•
ブート領域、フラッシュ領域の分割をするために
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域、フラッシュ領域の分割について(1/4)
ページ 5 システム上でのイメージブート領域
(HEX固定)フラッシュ領域
(アプリケーション1)フラッシュ領域
(アプリケーション2) マイコンのフラッシュメモリセルフプログラミング機能を 使用して、アプリケーション部分を更新ブート領域、フラッシュ領域の分割について(2/4)
ブート領域とフラッシュ領域とは ブート領域:システム上、書き換えが不可能な領域 フラッシュ領域:システム上、書き換え/取り換えが可能な領域 ブート領域とフラッシュ領域の分割の目的 ブート領域上のプログラムの再構築を行わず、フラッシュ領域上のプログラムのみを変更する© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域、フラッシュ領域の分割について(3/4)
ページ 7 ブート領域とフラッシュ領域間で実現すること フラッシュ領域からブート領域の変数、関数をアクセスできるようにする − ブート領域プロジェクトで外部定義シンボル出力機能-FSymbolを利用 − フラッシュ領域プロジェクトでそのファイルをビルド対象にする ブート領域から、フラッシュ領域の関数を関数テーブル経由で呼び出せるようにする。 − ブート領域プロジェクトで、フラッシュ領域の関数を呼び出す関数テーブルの関数の各分岐 命令のアドレスを呼び出すようにする − フラッシュ領域プロジェクトで、ブート領域プロジェクトから呼び出される関数の分岐命令 のテーブルを作成し、各関数への分岐命令を記述するブート領域、フラッシュ領域の分割について(4/4)
ブート領域、フラッシュ領域間の変数、関数の参照ブート領域
フラッシュ領域
RAM領域
ブート用RAM
フラッシュ用RAM
分岐テーブル領域
ROM領域
参照できない。 実アドレスを 管理する (関数コール) 外部定義シンボ ル出力機能 -FSymbolを 利用 (変数参照) 参照できない 外部定義シンボ ル出力機能 -FSymbolを 利用 (関数コール)0000H
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域、フラッシュ領域の配置
ページ 9 (例)次のようにブート領域とフラッシュ領域に配置 ページ 9ブート領域
フラッシュ領域
RAM領域
ブート用RAM
フラッシュ用RAM
分岐テーブル領域
ROM領域
0000H
2000H
2200H
FE900H
FEA00H
ブート領域、フラッシュ領域の分割をするために
ブート領域用のプロジェクトの作成 ソースファイルにブート領域のためのプログラムを作成 リンカのオプション設定 フラッシュ領域のプロジェクトをビルドする際に必要なため、フラッシュ領域用プロジェクト よりも前にビルドが必要 フラッシュ領域用のプロジェクトの作成 ソースファイルにフラッシュ領域のためのプログラムを作成 リンカのオプション設定© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域、フラッシュ領域のビルドイメージ
ページ 11 コンパイル -fsymbol= 外部変数・関数 セクション boot.asm boot.c boot.abs 変数・関数.fsy flash.asm flash.c flash.obj flash.abs 変数・関数.fsy 変数・関数.obj コンパイル アセンブル リンク アセンブル boot.obj リンク ブート領域用 ロードモジュール 外部変数・関数のシンボル情報 ブート領域 フラッシュ領域 フラッシュ領域用 ロードモジュール 関数の分岐命令のテー ブル解決.asm 関数の分岐命令のテー ブル解決.obj 関数テーブ ル.asm 関数テーブ ル.objブート領域、フラッシュ領域共通
•
プロジェクトの作成
•
e
2studio
•
CS+
•
ブート領域、フラッシュ領域共通プログラムの作成
•
分岐テーブルのアドレス定義ファイル(アセンブラ)
•
ブート領域用とフラッシュ領域用のヘキサファイル
•
初期化フロー
© 2016 Renesas System Design Co., Ltd. All rights reserved.
プロジェクトの作成(e
2
studio)
ページ 13 プロジェクトの作成※ フラッシュ領域のプロジェクト ブート領域のプロジェクト ビルド対象ファイルの追加 ※補足 1. フラッシュ領域のプロジェクトに、 ブート領域のプロジェクトのプロジェクトを 参照するように設定することにより、 フラッシュ領域のプロジェクトビルド時に、 ブート領域のプロジェクトを参照します。 2. *.fsy ファイルをアセンブルすることができないの で、拡張子を*.asmに変更して登録してください。プロジェクトの作成(CS+)
プロジェクトの作成※ メインプロジェクト − フラッシュ領域のプロジェクト サブプロジェクト − ブート領域のプロジェクト 自動生成ファイルの ビルド対象外への変更 ビルド対象ファイルの追加 ※補足 1. CS+のビルド順は、 サブプロジェクト」→「メインプロジェクト」 2. ブート領域のプログラムは1度作成したら 変更しないため、フラッシュ領域の2世代目以降 の作成時には、サブプロジェクトを削除する ことが可能© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域、フラッシュ領域共通プログラムの作成
ページ 15 分岐テーブルのアドレス定義ファイル(アセンブラ) ブート領域、フラッシュ領域のアセンブラソースアイルにインクルードします。 − FLASH_TABLE : 分岐テーブルの先頭アドレス − INTERRUPT_OFFSET : 分岐テーブルの割り込み領域分のサイズ 例 ftable.inc FLASH_TABLE .EQU 0x2000 INTERRUPT_OFFSET .EQU 0x100ブート領域用とフラッシュ領域用のヘキサファイル
本資料で設定するファイル名(出力方法は後述) 0000H 2000Hブート領域用ヘキサファイル
(boot0000_1fff.mot)
フラッシュ領域用
ヘキサファイル
(flash2000_ffff.mot)
結合したヘキサファイル
(boot_flash.mot)
補足: ロードモジュールファイル(*.abs)は、 ブート領域、フラッシュ領域のそれぞれに生成されます。ブート領域
フラッシュ領域
RAM領域
© 2016 Renesas System Design Co., Ltd. All rights reserved.
初期化フロー(1/2)
ページ 170000H
ブート領域(ROM)
_start:
ベクタ領域
… VECT02 VECT01 RESETboot_main()
2
1
.data
.sdata
.dataR
.sdataR
RAM領域
フラッシュ用領域
ブート用領域
_startの中で初期値のコピーを行う
_startの最後で フラッシュの スタートアップに飛ぶ3
初期化フロー(2/2)
_start
main()
分岐テーブル領域
BR !func … BR !! VECT02 BR !! VECT01 BR !! _start_startの中で
初期値のコピーを行う
.data
.sbata
3
4
5
割込み用 関数用func()
RAM領域
.dataR
.sdataR
フラッシュ用領域
ブート用領域
フラッシュ領域(ROM)
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域
•
ブート領域用プログラムの作成
• スタートアップルーチン(cstart.asm)の変更 • hdwinit.asm と stkinit.asm の変更 • オンチップデバッグ用領域の確保プログラムの作成 • 分岐テーブルの関数アドレス解決用のファイルの作成•
ブート領域のオプションの設定
• 外部定義シンボルのファイルの出力 • セクションの配置指定 • フラッシュ領域の割り込み関数に分岐させるためのベクタの設定 • オンチップデバッグを使用するための設定 • ブート領域のアドレスのみのヘキサファイルを出力する設定ブート領域用プログラムの作成(1/9)
スタートアップルーチン(cstart.asm)の変更(1/6) 分岐テーブルのアドレス定義のインクルードの追加 例 $IFNDEF __RENESAS_VERSION__ __RENESAS_VERSION__ .EQU 0x01000000 $ENDIF $INCLUDE "ftable.inc"© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域用プログラムの作成(2/9)
ページ 21 スタートアップルーチン(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:
ブート領域用プログラムの作成(3/9)
スタートアップルーチン(cstart.asm)の変更(3/6) セクション名の変更 − 外部定義シンボル出力機能-Fsymbolの対象外にするために、セクション名を変更する。 例 ;---; startup ;---.SECTION .btext, TEXT© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域用プログラムの作成(4/9)
ページ 23 スタートアップルーチン(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ブート領域用プログラムの作成(5/9)
スタートアップルーチン(cstart.asm)の変更(5/6) ブート領域用のメイン関数の呼び出しへの変更と、フラッシュ領域のスタートアップルーチン への分岐命令の追加 例 ;---; call main function
;---CALL !!_boot_main ; main();
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域用プログラムの作成(6/9)
ページ 25 スタートアップルーチン(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:
ブート領域用プログラムの作成(7/9)
hdwinit.asm と stkinit.asm の変更
セクション名の変更
− 外部定義シンボル出力機能-Fsymbolの対象外にするために、セクション名を変更する。
例
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域用プログラムの作成(8/9)
ページ 27 オンチップデバッグ用領域の確保プログラムの作成 オンチップデバッグを使用する場合には、特定のメモリを開ける(0xffで埋める)必要があり ます。 − 0x0002~0x0003番地 − リンカの-VECTNオプションで0xffffを設定 − 0x00ce~0x00d7番地 − アセンブラソースで定義(下記プログラム参照) − ROMの最後の512バイト − フラッシュ領域で確保 例 ocdrom_ce.asmMON_CE .CSEG AT 0x00ce .DB8 0xffffffffffffffff
ブート領域用プログラムの作成(9/9)
分岐テーブルの関数アドレス解決用のファイルの作成(アセンブラ) Cソース上から、フラッシュ領域の関数コールをするための、分岐テーブルのアドレスを解決 するためのシンボルを定義してください。 このファイルを、プロジェクトに登録してください。 例 extern_ftable.asm $INCLUDE "ftable.inc" .public _f1_f1 .equ (FLASH_TABLE + INTERRUPT_OFFSET + (0 * 4)) .public _f2
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域のオプションの設定(1/9)
ページ 29 フラッシュ領域のプロジェクトでブート領域の変数、関数をアクセスできるように外部定義シン ボルのファイルの出力 対象とするセクションを-Fsymbolオプションにすべて登録してください。 例 e2 studioブート領域のオプションの設定(2/9)
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域のオプションの設定(3/9)
ページ 31 セクションの配置指定 リンカの-startオプションで、ブート領域のセクションの配置を指定してください。 フラッシュ領域の配置と重ならない様に考慮してください。 スタック領域のセクションの指定も追加してください。 例 e2 studio 例 CS+ブート領域のオプションの設定(4/9)
フラッシュ領域の割り込み関数に分岐させるためのベクタの設定
リンカの-VECTNオプションで分岐テーブルの該当アドレスを指定してください。
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域のオプションの設定(5/9)
ページ 33
ブート領域のオプションの設定(6/9)
オンチップデバッグを使用するための設定 リンカの-VECTNオプションで0x0002~0x0003番地の領域を確保してください。( e2 studio で は、自動で設定されています) リンカの-OCDBGオプションを有効にし、オンチップデバッグオプションバイトの値を設定を してください。 例 e2 studio© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域のオプションの設定(7/9)
ページ 35
ブート領域のオプションの設定(8/9)
ブート領域のアドレスのみのヘキサファイルを出力する設定
出力するファイル名と、出力するアドレスを設定してください。
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域のオプションの設定(9/9)
ページ 37
フラッシュ領域
•
フラッシュ領域用プログラムの作成
• スタートアップルーチン(cstart.asm)の変更 • 分岐テーブルプログラムの作成 • 割り込み関数の定義•
フラッシュ領域のオプションの設定
• 外部定義シンボルファイルのプロジェクト登録 • セクションの配置指定 • フラッシュ領域のアドレスのみのヘキサファイルを出力する設定 • ブート領域とフラッシュ領域のヘキサファイルの結合© 2016 Renesas System Design Co., Ltd. All rights reserved.
フラッシュ領域用プログラムの作成(1/3)
ページ 39 スタートアップルーチン(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
フラッシュ領域用プログラムの作成(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
割り込み用
© 2016 Renesas System Design Co., Ltd. All rights reserved.
フラッシュ領域用プログラムの作成(3/3)
ページ 41 割り込み関数の定義 割り込みベクタはブート領域のプロジェクトで定義の必要があります。 フラッシュ領域では、#pragma interruptでベクタのアドレス(vect)は指定しないでください。 例 #include "iodefine.h"#pragma interrupt int_INTP0
volatile char f;
void int_INTP0(void) {
f = 1; }
フラッシュ領域のオプションの設定(1/8)
外部定義シンボルファイルのプロジェクト登録 ブート領域の変数、関数をアクセスできるように、ブート領域で作成した外部定義シンボル ファイルをプロジェクトに登録してください。 例 e2 studio 例 CS+ ※補足 e2 studio *.fsy ファイルをアセンブルすることが できないので、拡張子を*.asmに変更して 登録してください。© 2016 Renesas System Design Co., Ltd. All rights reserved.
フラッシュ領域のオプションの設定(2/8)
ページ 43 セクションの配置指定 リンカの-startオプションで、フラッシュ領域のセクションの配置を指定してください。 − ブート領域の配置と重ならない様に考慮してください。 − 分岐テーブルの領域を空けるようにしてください。 例 e2 studio 例 CS+フラッシュ領域のオプションの設定(3/8)
フラッシュ領域のアドレスのみのヘキサファイルを出力する設定
出力するファイル名と、出力するアドレスを設定してください。
© 2016 Renesas System Design Co., Ltd. All rights reserved.
フラッシュ領域のオプションの設定(4/8)
ページ 45
フラッシュ領域のオプションの設定(5/8)
ブート領域とフラッシュ領域のヘキサファイルの結合
ブート領域とフラッシュ領域のヘキサファイルを結合して1つにする場合には、ビルド後の処
理にリンカの実行を追加してください。
© 2016 Renesas System Design Co., Ltd. All rights reserved.
フラッシュ領域のオプションの設定(6/8)
ページ 47
フラッシュ領域のオプションの設定(7/8)
ブート領域とフラッシュ領域のヘキサファイルの結合
リンカに入力するサブコマンドファイルで、入力するヘキサファイルと、ヘキサファイルの形
式、出力するファイル名を指定してください。
例 sub_mot.txt (e2 studio)
-input=..¥..¥boot¥HardwareDebug¥boot0000_1fff.mot -input=flash2000_ffff.mot
-form=stype
© 2016 Renesas System Design Co., Ltd. All rights reserved.
フラッシュ領域のオプションの設定(8/8)
ページ 49 例 sub_mot.txt (CS+) -input=..¥boot¥DefaultBuild¥boot0000_1fff.mot -input=.¥DefaultBuild¥flash2000_ffff.mot -form=stype -output=.¥DefaultBuild¥boot_flash.mot© 2016 Renesas System Design Co., Ltd. All rights reserved.
デバッグツールへのダウンロード(1/2)
ページ 51 ロードモジュールファイル(*.abs)は、ブート領域用、フラッシュ領域用の2つのファイルが生 成されるので、デバッグツールでは、2つのロードモジュールファイルをダウンロードしてくだ さい。 例 フラッシュ領域のプロジェクトにブート領域のロードモジュールファイルを追加 (e2 studio) ※補足 e2studio boot.xは、接続時は「No」にしてください。 接続後に、ダウンロードしてください。デバッグツールへのダウンロード(2/2)
例 フラッシュ領域のプロジェクトにブート領域のロードモジュールファイルを追加
© 2016 Renesas System Design Co., Ltd. All rights reserved.
サンプルプログラム
今まで作成してきたプログラムを使用するための、ブート領域のプログラム、フラッシュ領域の
© 2016 Renesas System Design Co., Ltd. All rights reserved.
ブート領域のサンプルプログラム
ページ 55
#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; }
フラッシュ領域のサンプルプログラム(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(); /* ブート領域の関数のアクセス*/ }
© 2016 Renesas System Design Co., Ltd. All rights reserved.
フラッシュ領域のサンプルプログラム(2/2)
ページ 57
#include "iodefine.h" /* SFRの定義ファイル */
#pragma interrupt int_INTP0 /* フラッシュ領域の割り込み定義 */ volatile char f;
void int_INTP0(void) /* フラッシュ領域の割り込み処理 */ {
f = 1; }
改版履歴
版数
内容
適用箇所
Rev.1.00
初版
Rev.2.00
テンプレートの変更
全般
対象ツールのバージョン変更
P3, P29, P32, P47
-VECTN
オプションの指定値修正
P32, P33
_int_INTP0
への分岐命令の修正
P40
© 2016 Renesas System Design Co., Ltd. All rights reserved.