RX ファミリ用コンパイラスタートアップの紹介 ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A
コンテンツ スタートアップの概要 スタートアッププログラム例 外部メモリを利用する場合の設定 2
スタートアップの概要 3
処理の流れとファイル構成例 パワーオン リセット Fixed_Vectors ( 固定ベクタテーブル ) スタートアップ vecttbl.c resetprg.c CPU 内部の初期化 machine.h 組み込み関数用ヘッダ hwsetup.c ハードウェアの初期化 iodefine.h PowerON_Reset_PC 関数 HardwareSetup 関数 内蔵周辺機能用ヘッダ intprg.c Dummy 関数 MNI 関数 ( 割り込み関数群 ) 割り込み関数のプロトタイプ宣言 vect.h ライブラリ ファイル静的変数の初期化 _INITSCT 関数 main 関数 関数 処理の流れ インクルード関係 ユーザ固有ヘッダ 関数 ユーザシステムに依存 4
スタートアッププログラム例 5
スタートアップのプログラム例 (1) #include <machine.h> #pragma stacksize si=0x200 void HardwareSetup(void); void _INITSCT(void); void main(void); // Use Embedded Function // Interrupt Stack is 512Byte resetprg.c #pragma section P PResetPRG // Section Name is PResetPRG #pragma entry PowerON_Reset_PC // Entry Function void PowerON_Reset_PC(void) { set_intb( sectop("c$vect")); // Initialize of INTB HardwareSetup( ); // Initialize of CPG _INITSCT( ); // Initialize of Static Variable main( ); // Execute main Function } 6
割り込みテーブルレジスタ (INTB) #include <machine.h> #pragma stacksize si=0x200 void HardwareSetup(void); void _INITSCT(void); void main(void); // Use Embedded Function // Interrupt Stack is 512Byte アドレス空間 INTB #pragma section 可変ベクタテーブルの先頭アドレス P PResetPRG // Section Name is PResetPRG 可変ベクタ #pragma entry PowerON_Reset_PC // Entry Function テーブル void PowerON_Reset_PC(void) 組み込み関数 { set_intb( sectop("c$vect")); // Initialize of INTB HardwareSetup( ); // Initialize of CPG セクションの先頭アドレス _INITSCT( ); 可変ベクタテーブルのセクション // Initialize of Static Variable 固定ベクタ main( ); // Execute main Function テーブル } 7
HardwareSetup 関数のプログラム例 #include "iodefine.h" // Peripheral Header File hwsetup.c void HardwareSetup(void) { SYSTEM.SCKCR.LONG = 0x00020100; // ICLK=96MHz,BCLK=24MHz,PCLK=48MHz //SYSTEM.SYSCR0.WORD = 0x5A03; // External Bus Enable //set BSC, I/O port } 8
システムクロックコントロールレジスタ (SCKCR) BCK ICK PCK ICK になるように設定 入力クロック (EXTAL) に対する倍数 9
システムコントロールレジスタ 0(SYSCR0) 0x5A 外部拡張モード
_INITSCT ライブラリ関数による静的変数の初期化 セクション SI B_1 R_1 B_2 R_2 B R PResetPRG PIntPRG P C_1 D_1 W_1 C_2 D_2 W_2 C D W L C$VECT C$DSEC C$BSEC FIXEDVECT RAM ROM 初期値のない静的変数 B_1 B_2 B _INITSCT(); 0 クリア RAM 領域を示すように ROM 化支援オプションを設定 -rom=d=r,d_2=r_2,d_1=r_1 セクション初期化用テーブル が使用するセクション 初期値のある静的変数 R_1 R_2 R _INITSCT(); D_1 D_2 D 初期値のコピー X_1: アライメント数 =1 X_2: アライメント数 =2 X: アライメント数 =4 11
セクション初期化用テーブルのプログラム例 #pragma unpack #pragma section C C$DSEC // Section Name is C$DSEC extern const struct { _UBYTE *rom_s; /* 初期化データセクションの ROM 上の先頭アドレス */ _UBYTE *rom_e; /* 初期化データセクションの ROM 上の最終アドレス */ _UBYTE *ram_s; /* 初期化データセクションの RAM 上の先頭アドレス */ } _DTBL[] = { { sectop("d"), secend("d"), sectop("r") }, { sectop("d_2"), secend("d_2"), sectop("r_2") }, { sectop("d_1"), secend("d_1"), sectop("r_1") } }; #pragma section C C$BSEC // Section Name is C$BSEC extern const struct { _UBYTE *b_s; /* 未初期化データセクションの先頭アドレス */ _UBYTE *b_e; /* 未初期化データセクションの最終アドレス */ } _BTBL[] = { { sectop("b"), secend("b") }, { sectop("b_2"), secend("b_2") }, { sectop("b_1"), secend("b_1") } }; #pragma section #pragma packoption dbsct.c 12
スタートアップのプログラム例 (2) #include <machine.h> #pragma stacksize si=0x200 void HardwareSetup(void); void _INITSCT(void); void main(void); // Use Embedded Function // Interrupt Stack is 512Byte スタートアップ関数の先頭に スタックポインタの初期設定コードを出力 CPU 内部レジスタの退避 復帰コードを作成しない resetprg.c #pragma section P PResetPRG // Section Name is PResetPRG #pragma entry PowerON_Reset_PC // Entry Function void PowerON_Reset_PC(void) { set_intb( sectop("c$vect")); // Initialize of INTB set_fpsw(fpsw_init); // Initialize of FPSW HardwareSetup( ); // Initialize of CPG _INITSCT( ); // Initialize of Static Variable main( ); // Execute main Function } 13
固定ベクタテーブル用配列のプログラム例 #include "vect.h" 0xFFFFFFD0 番地に配置 #pragma section C FIXEDVECT // Section Name is FIXEDVECT void (*const Fixed_Vectors[])(void) = { MSB Dummy, FFFFFFD0h Dummy, FFFFFFD4h Dummy, FFFFFFD8h Dummy, FFFFFFDCh Dummy, FFFFFFE0h Dummy, FFFFFFE4h Dummy, FFFFFFE8h Dummy, FFFFFFECh Dummy, FFFFFFF0h Dummy, FFFFFFF4h NMI, FFFFFFF8h PowerON_Reset_PC, FFFFFFFCh }; 特権命令例外アクセス例外 ( 予約領域 ) 未定義命令例外 ( 予約領域 ) 浮動小数点例外 ( 予約領域 ) ( 予約領域 ) ( 予約領域 ) ( 予約領域 ) ノンマスカブル割り込みリセット 固定ベクタテーブル vecttbl.c LSB 14
外部メモリを利用する場合の設定 15
外部メモリへの変数の配置方法 外部メモリ仕様 ROM 配置アドレス :0x01000000 配置セクション :DMem セクション RAM 配置アドレス :0x02000000 配置セクション :RMem セクション アドレス空間 内蔵 RAM R セクション #pragma section Mem static uint32_t array[] = { ( 初期値 ) }; #pragma section 0x01000000 外部 ROM 新セクション DMem 0x02000000 外部 RAM 新セクション RMem 内蔵 ROM D セクション 16
セクションアドレスオプション設定 (HEW の場合 ) 0x01000000 番地 :DMem セクション 0x02000000 番地 :RMem セクション追加 タブ : 最適化リンカカテゴリ : セクション設定項目 : セクション 17
セクションアドレスオプション設定 (CubeSuite+ の場合 ) 18
ROM 化支援オプション設定 (HEW の場合 ) ROM セクション :DMem セクション RAM セクション :RMem セクション追加 タブカテゴリオプション項目 : 最適化リンカ : 出力 :ROMからRAMへマップするセクション 19
ROM 化支援オプション設定 (CubeSuite+ の場合 ) 20
セクション初期化用テーブルへの登録 #pragma unpack #pragma section C C$DSEC // Section Name is C$DSEC extern const struct { _UBYTE *rom_s; /* 初期化データセクションの ROM 上の先頭アドレス */ _UBYTE *rom_e; /* 初期化データセクションの ROM 上の最終アドレス */ _UBYTE *ram_s; /* 初期化データセクションの RAM 上の先頭アドレス */ } _DTBL[] = { { sectop("d"), secend("d"), sectop("r") }, { sectop("d_2"), secend("d_2"), sectop("r_2") }, { sectop("d_1"), secend("d_1"), sectop("r_1") }, { sectop("dmem"), secend("dmem"), sectop("rmem") } }; #pragma section C C$BSEC // Section Name is C$BSEC extern const struct { _UBYTE *b_s; /* 未初期化データセクションの先頭アドレス */ _UBYTE *b_e; /* 未初期化データセクションの最終アドレス */ } _BTBL[] = { { sectop("b"), secend("b") }, { sectop("b_2"), secend("b_2") }, { sectop("b_1"), secend("b_1") } }; #pragma section #pragma packoption dbsct.c 21
END ルネサスエレクトロニクス株式会社