Everything

第2章  システム構築


本章では,RI600PXが提供している機能を利用したシステム(ロード・モジュール)の構築手順について解説しています。
2.1 概  要
システム構築とは,RI600PXの提供媒体からユーザの開発環境(ホスト・マシン)上にインストールされたファイル群(カーネル・ライブラリなど)を用いてロード・モジュールを生成することです。
図2-1に,システム構築の手順を示します。
図2-1  システム構築の手順
RI600PXでは,ロード・モジュールを生成する際に必要となるファイル群のサンプル・プログラムを提供しています。
サンプル・プログラムは,以下のフォルダに格納されています。ソース・ファイルは,appliサブ・フォルダに格納されています。
<ri_sample> = <CubeSuite+_root>\SampleProjects\RX\デバイス名_RI600PX
- <CubeSuite+_root>
CubeSuite+のインストール・フォルダを表します。
デフォルトでは,“ C:\Program Files\Renesas Electronics\CubeSuite+”となります。
- SampleProjects
CubeSuite+のサンプル・プロジェクト・フォルダです。
- RX
RX MCU用のサンプル・プロジェクト・フォルダです。
- デバイス名_RI600PX
RI600PXのサンプル・プロジェクト・フォルダです。このフォルダに,プロジェクト・ファイルがあります。
デバイス名: サンプルを提供しているデバイス名を表しています。
2.2 処理プログラムの記述
システムとして実現すべき処理を記述します。
なお,RI600PXでは,処理プログラムを実現すべき処理の種類,および,用途にあわせて以下に示した5種類に分類しています。
- タ ス ク
他処理プログラム(割り込みハンドラ,周期ハンドラ,およびアラーム・ハンドラ)とは異なり,RI600PXが提供するサービス・コールを使用して明示的に操作しないかぎり実行されることのない処理プログラムです。
- タスク例外処理ルーチン
タスクに対してタスク例外を要求すると,タスク毎に定義されたタスク例外処理ルーチンが起動されます。タスク例外処理ルーチンには,要求された例外要因が渡されます。
- 周期ハンドラ
指定された周期時間毎に起動されるルーチンです。
なお,RI600PXでは,周期ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,一定の時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,周期ハンドラに制御が移ります。
- アラーム・ハンドラ
指定した時間後に一度だけ起動されるルーチンです。
なお,RI600PXでは,アラーム・ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,一定の時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,アラーム・ハンドラに制御が移ります。
- 割り込みハンドラ
割り込みが発生した際に起動されるルーチンです。
なお,RI600PXでは,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,割り込みが発生した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,割り込みハンドラに制御が移ります。
備考 処理プログラムについての詳細は,「第4章 タスク管理機能」,「第6章 タスク例外処理機能」,「第10章 時間管理機能」,「第12章 割り込み管理機能」を参照してください。
2.3 システム・コンフィギュレーション・ファイルの記述
RI600PXに提供するデータを保持した情報ファイルを生成する際に必要となるシステム・コンフィギュレーション・ファイルを記述します。
備考 システム・コンフィギュレーション・ファイルについての詳細は,「第20章 システム・コンフィギュレーション・ファイル」を参照してください。
2.4 ユーザ・オウン・コーディング部の記述
- アクセス例外ハンドラ(_RI_sys_access_exception( ))
アクセス例外ハンドラは,タスクまたはタスク例外処理ルーチンが許可されていないメモリ・アクセスを行ったときに起動されます。
- 基本クロック用タイマ初期化ルーチン(_RI_init_cmt_knl( ))
基本クロック用タイマ初期化ルーチンは,RI600PX起動時に呼び出されます。
- システム・ダウン・ルーチン(_RI_sys_dwn__( ))
システム・ダウン・ルーチンは,システム・ダウンが発生したときに呼び出されます。
- ブート処理ファイル
詳細は,「17.2 ブート処理ファイル(ユーザ・オウン・コーディング部)」を参照してください。
- セクション情報ファイル(ユーザ・オウン・コーディング部)
未初期化データ・セクションおよび初期化データ・セクションの情報を定義します。
2.5 ロード・モジュールの生成
2.2 処理プログラムの記述」から「2.4 ユーザ・オウン・コーディング部の記述」で作成されたファイル群,および,RI600PX,Cコンパイラ・パッケージが提供しているライブラリ・ファイルに対して,CubeSuite+上でビルドを実行し,ロード・モジュールを生成します。
1 ) プロジェクトの作成/読み込み
プロジェクトの新規作成,または既存のプロジェクトの読み込みを行います。
備考 プロジェクトの新規作成,および既存のプロジェクトの読み込みについての詳細は,「RIシリーズ 起動編」,「CubeSuite+ 起動編」,および本製品のリリースノートを参照してください。
2 ) ビルド対象プロジェクトの設定
ビルドの設定や実行を行う場合は,アクティブ・プロジェクトを設定します。
なお,サブプロジェクトがない場合,プロジェクトは常にアクティブになります。
備考 アクティブ・プロジェクトの設定についての詳細は,「CubeSuite+ RXビルド編」を参照してください。
3 ) バージョンの確認
プロジェクト・ツリーでリアルタイムOSノードを選択し,プロパティ パネルをオープンします。
[RI600PX]タブの[カーネル・バージョン]プロパティにおいて,使用するRI600PXのバージョンを確認します。
図2-2  プロパティ パネル:[RI600PX]タブ
4 ) ビルド対象ファイルの設定
プロジェクトへのビルド対象ファイルの追加/削除,依存関係の更新などを行います。
備考 プロジェクトへのビルド対象ファイルの追加/削除,依存関係の更新についての詳細は,「CubeSuite+ RXビルド編」を参照してください。
以下に,ロード・モジュールを生成する際に必要となるファイル群の一覧を示します。
- 「2.2 処理プログラムの記述」で作成されたソース・ファイル
- 処理プログラム(タスク,周期ハンドラ,アラーム・ハンドラ,割り込みハンドラ)
- 「2.3 システム・コンフィギュレーション・ファイルの記述」で作成されたシステム・コンフィギュレーション・ファイル
備考 システム・コンフィギュレーション・ファイル名の拡張子は,“cfg”を指定してください。
拡張子が異なる場合は,“cfg”が自動的に付加されます(例えば,ファイル名に“aaa.c”を指定した場合,“aaa.c.cfg”となります)。
- 「2.4 ユーザ・オウン・コーディング部の記述」で作成されたソース・ファイル
- ユーザ・オウン・コーディング部(システム・ダウン・ルーチン,ブート処理)
- RI600PXが提供しているライブラリ・ファイル
- カーネル・ライブラリ(「2.6.3 カーネル・ライブラリ」参照)
- Cコンパイラ・パッケージが提供しているライブラリ・ファイル
- 標準ライブラリ,数学ライブラリなど
備考1 プロジェクト・ツリー パネルにシステム・コンフィギュレーション・ファイルを追加すると,リアルタイムOS生成ファイル・ノードが表示されます。
リアルタイムOS生成ファイル・ノードには,以下の情報ファイルが表示されます。ただし,この時点では,これらのファイルは生成されません。
- システム情報ヘッダ・ファイル(kernel_id.h)
- サービス・コール定義ファイル(kernel_sysint.h)
- ROM定義ファイル(kernel_rom.h)
- RAM定義ファイル(kernel_ram.h)
- システム定義ファイル(ri600.inc)
- CMTタイマ定義ファイル(ri_cmt.h)
- テーブル・ファイル(ritable.src)
図2-3  プロジェクト・ツリー パネル
備考2 システム・コンフィギュレーション・ファイルを差し替える場合は,追加しているシステム・コンフィギュレーション・ファイルを一旦プロジェクトから外したのち,再度ファイルを追加してください。
備考3 システム・コンフィギュレーション・ファイルは,プロジェクトに複数追加することができますが,有効となるのは最初に追加したファイルです。有効なファイルをプロジェクトから外しても,追加済みのファイルは有効にならないため,再度ファイルを追加してください。
5 ) リアルタイムOS生成ファイルの出力指定
プロジェクト・ツリーでシステム・コンフィギュレーション・ファイルを選択し,プロパティ パネルをオープンします。
[システム・コンフィギュレーション・ファイル関連情報]タブにおいて,リアルタイムOS生成ファイルの出力設定などを行います。
図2-4  プロパティ パネル:[システム・コンフィギュレーション・ファイル情報]タブ
6 ) ロード・モジュール・ファイルの出力指定
ビルドの生成物として,ロード・モジュール・ファイルを出力することを設定します。
備考 ロード・モジュールの出力指定についての詳細は,「CubeSuite+ RXビルド編」を参照してください。
7 ) ビルド・オプションの設定
コンパイラ,アセンブラ,リンカなどに対するオプションを設定します。
必ず「2.6 ビルド・オプション」を参照してください。
備考 ビルド・オプションの設定についての詳細は,「CubeSuite+ RXビルド編」を参照してください。
8 ) ビルドの実行
ビルドを実行し,ロード・モジュール・ファイルを生成します。
備考 ビルドの実行についての詳細は,「CubeSuite+ RXビルド編」を参照してください。
図2-5  プロジェクト・ツリー パネル(ビルド実行後)
9 ) プロジェクトの保存
プロジェクトの設定情報をプロジェクト・ファイルに保存します。
備考 プロジェクトの保存についての詳細は,「CubeSuite+ 起動編」を参照してください。
2.6 ビルド・オプション
ここでは,特に留意すべきビルド・オプションについて解説します。
2.6.1 サービス・コール情報ファイルと“-ri600_preinit_mrc”コンパイラ・オプション
サービス・コール情報ファイル(mrcファイル)は,kernel.hをインクルードするファイルのコンパイルによって,オブジェクト・ファイルと同じフォルダに生成されます。
mrcファイルには,ソース中で使用しているサービス・コール名が出力されます。テーブル生成ユーティリティmkritblpxには,mrcファイルが格納されたパスを漏れなく指定する必要があります。漏れがある場合,アプリケーションで使用しているサービス・コール・モジュールがリンクされない場合があります。この場合,そのサービス・コールを呼び出したときにシステム・ダウンとなります。
逆に,過去に生成され,現在は無効なmrcファイルをmkritblpxに入力した場合は,アプリケーションで使用していないサービス・コール・モジュールがリンクされる場合があります。この場合,RI600PXの動作に問題は生じませんが,コードサイズが無駄に大きくなってしまうことになります。
また,kernel.hをインクルードするファイルのコンパイル時には,“-ri600_preinit_mrc”オプションを指定してください。本オプションを指定しなくてもRI600PXの動作に問題は生じませんが,アプリケーションで使用していないサービス・コール・モジュールがリンクされる場合があります。この場合,RI600PXの動作に問題は生じませんが,コードサイズが無駄に大きくなってしまうことになります。
アプリケーションをライブラリ化する場合は,コンパイル時に生成されたmrcファイルもmkritblpxに入力してください。これが難しい場合,使用しているサービス・コール名を羅列したmrcファイル(下記例を参照)を作成し,mkritblpxに入力してください。
なお,組み込まれていないサービス・コールを呼び出した場合は,システム・ダウンとなります。
 sta_tsk
 snd_mbx
 rcv_mbx
 prcv_mbx

2.6.2 ブート処理ファイルのコンパイラ・オプション
17.2.3 ブート処理ファイルのコンパイラ・オプション」に記載のように,ブート処理ファイル(サンプル・プロジェクトでは“resetprg.c”)にはオプション“-nostuff”を設定する必要があります。そうでない場合,RI600PXは正常に動作しません。
オプション“-nostuff”をブート処理ファイルのみに設定するにはブート処理ファイルの[プロパティ]パネルの[個別コンパイル・オプション]タブで,オプション“-nostuff”を全ファイルに設定するには[CC-RX(ビルド・ツール)]の[プロパティ] パネルの[コンパイル・オプション]タブで,以下のいずれかを設定してください。
1 ) [オブジェクト]カテゴリで設定する
図2-6のように,[初期値なし変数をアライメント4のセクションに配置する],[初期値あり変数をアライメント4のセクションに配置する],および[const修飾変数をアライメント4のセクションに配置する]を”はい”に設定してください。
図2-6  [オブジェクト]カテゴリ
2 ) [その他]カテゴリで設定する
図2-7のように,[その他の追加オプション]に“-nostuff”を追加してください。
図2-7  [その他]カテゴリ
2.6.3 カーネル・ライブラリ
カーネルライブラリは,表2-1に示すフォルダに格納されています。ただし,CubeSuite+が自動的に適切なカーネル・ライブラリをリンクするので,ユーザはカーネル・ライブラリを意識する必要はありません。
表2-1  カーネル・ライブラリ
フォルダ
対応コンパイラ・バージョン
対応CPUコア
ファイル名
説明
1
<ri_root>\library\rxv1
V1.02.01以降
RXv1アーキテクチャ
ri600lit.lib
リトル・エンディアン用
ri600big.lib
ビッグ・エンディアン用
2
<ri_root>\library\rxv2
V2.01.00以降
RXv1アーキテクチャおよびRXv2アーキテクチャ
ri600lit.lib
リトル・エンディアン用
ri600big.lib
ビッグ・エンディアン用

備考1 <ri_root>は,RI600PXのインストール・フォルダを表しています。
デフォルトは,“ C:\Program Files\Renesas Electronics\CubeSuite+\RI600PX”です。
備考2 コンパイラCC-RX V2.01以降を使用時は項番2,それ以外の場合は項番1のライブラリがリンクされます。
2.6.4 セクション配置
1 ) セクション名の命名規則
各セクションを適切なメモリ・オブジェクトに配置するために,以下の例のようなセクション命名規則を定めることを推奨します。
- 1文字目:セクション種別
- P:プログラム領域
- C:定数領域
- B:未初期化データ領域
- D:初期化データ領域(ROM部)
- R:初期化データ領域(RAM部)(リンカ生成)
- W:switch文分岐テーブル領域(コンパイラ生成)
- L:リテラル領域(コンパイラ生成)
- 2文字目以降
- RI*:RI600PX予約
この領域は,ユーザ・モード(=タスク・コンテキスト)からアクセスされません。
- U*:メモリ・オブジェクトまたはユーザ・スタック
この領域は,ユーザ・モード(=タスク・コンテキスト)からアクセスされます。
- S*:上記以外
この領域は,ユーザ・モード(=タスク・コンテキスト)からアクセスされません。
2 ) RI600PXのセクション
表2-2に,RI600PXのセクションを示します。
アプリケーションでは,SURI_STACKおよびBURI_HEAP以外のRI600PXのセクションを使用しないでください。
表2-2  RI600PXセクション一覧
セクション名
属性
アライメント数
ROM/RAM
意味
PRI_KERNEL
CODE
1
ROM/RAM
RI600PXプログラム
CRI_ROM
ROMDATA
4
ROM/RAM
RI600PX定数
DRI_ROM
ROMDATA
4
ROM/RAM
RI600PX初期化データ(ROM)
FIX_INTERRUPT_VECTOR
ROMDATA
4
ROM
固定ベクタ・テーブル/例外ベクタ・テーブルです。後述の「FIX_INTERRUPT_VECTORセクション」を参照してください。
INTERRUPT_VECTOR
ROMDATA
4
ROM/RAM
可変ベクタ・テーブル(1kB)
SI
DATA
4
RAM
システム・スタック
SURI_STACK
DATA
4
RAM
ユーザ・スタック領域のデフォルトのセクション
BRI_RAM
DATA
4
RAM
- RI600PX変数
- システム・コンフィギュレーション・ファイルで生成されたデータ・キュー領域
- システム・コンフィギュレーション・ファイルで生成されたメッセージ・バッファ領域(セクション指定省略時)
RRI_RAM
DATA
4
RAM
RI600PX初期化データ(RAM)
BURI_HEAP
DATA
4
RAM
- システム・コンフィギュレーション・ファイルで生成された固定長メモリ・プール領域(セクション指定省略時)
- システム・コンフィギュレーション・ファイルで生成された可変長メモリ・プール領域(セクション指定省略時)
通常,本セクションはメモリ・オブジェクトにしてください。

3 ) FIX_INTERRUPT_VECTORセクション
コンフィギュレータcfg600pxは,システム・コンフィギュレーション・ファイルの“interrupt_fvector[]”の定義内容に従って,固定ベクタ・テーブル/例外ベクタ・テーブルをFIX_INTERRUPT_VECTOR セクションとして生成します。
- RXv1アーキテクチャ使用時
RXv1アーキテクチャでは,固定ベクタ・テーブルは0xFFFFFF80番地に固定されています。FIX_INTERRUPT_VECTORセクションは0xFFFFFF80番地に配置してください。
FIX_INTERRUPT_VECTORセクションを0xFFFFFF80番地以外に配置した場合,RI600PXは正常に動作しません。
- RXv2アーキテクチャ使用時
RXv2 アーキテクチャでは,RXv1 アーキテクチャの「固定ベクタ・テーブル」は「例外ベクタ・テーブル」と呼称が変更され,その先頭アドレスをEXTB レジスタで設定できるようになりました。EXTB レジスタのリセット時の初期値は,RXv1 アーキテクチャの固定ベクタ・テーブルと同じ0xFFFFFF80 です。
FIX_INTERRUPT_VECTOR セクションは,通常はリンク時に0xFFFFFF80 番地に配置してください。
FIX_INTERRUPT_VECTORセクションを0xFFFFFF80 番地以外に配置した場合は,システム・コンフィギュレーション・ファイルの“interrupt_fvector[31]”(リセット・ベクタ)は無視されます。ユーザ側でリセット・ベクタ(0xFFFFFFFC 番地)を用意してください。また,ブート処理関数(PowerON_Reset_PC( ))でEXTB レジスタをFIX_INTERRUPT_VECTOR セクションの先頭アドレスに初期化してください。
4 ) “aligned_section”リンカ・オプション
以下のセクションは,“aligned_section”リンカ・オプションを指定する必要があります。
- システム・コンフィギュレーション・ファイルで,memory_object[].start_addressに指定したセクション
- システム・コンフィギュレーション・ファイルで,task[].stack_sectionに指定したセクション
- SURI_STACKセクション
5 ) LおよびWセクションに関する注意
Lセクションはリテラル領域,Wセクションはswtich文分岐テーブル領域です。これらはコンパイラによって生成されます。これらのセクションは,#pragma sectionでセクション名を変更することはできません。
LおよびW セクションが生成される可能性のあるソース・ファイル中の関数をタスクの一部として実行させる場合は,以下に留意してください。
A ) ソース・ファイル中の全関数が,同一ドメインに所属するタスクとしてのみ実行する場合
特に留意事項はありません。LおよびW セクションを,そのドメインからリード・アクセス可能なメモリ・オブジェクトとしてください。
B ) ソース・ファイル中の関数が,複数のドメインに所属するタスクとして実行する場合
関数ごとのリテラル領域および分岐テーブル領域に異なるセクション名を付与することはできないため,それらを異なるアクセス許可を持つ個別のメモリ・オブジェクトに分離することはできません。したがって,実行時のドメインごとに関数を別ファイル化してAを適用するか,またはLおよび W セクションを全てのドメインからリード・アクセス可能なメモリ・オブジェクトとしてください。
2.6.5 初期化データ・セクション
セクション情報ファイル(ユーザ・オウン・コーディング部)のDTBLに記述した初期化データセクションは,リンカのオプション“-rom”を用いてROMに配置されたセクションをRAM上のセクションにマップする設定を行う必要があります。図2-8のように,[CC-RX(ビルド・ツール)]の[プロパティ] パネルの[リンク・オプション]タブの[セクション]カテゴリを設定してください。
図2-8  ROMからRAMへマップするセクション
備考 RI600PXが提供するサンプルプロジェクトでは,RI600PXの“DRI_ROM”セクションの“RRI_RAM”セクションへのマップを設定済みです。