第2章 システム構築
- タ ス ク
他処理プログラム(割り込みハンドラ,周期ハンドラ,およびアラーム・ハンドラ)とは異なり,RI600PXが提供するサービス・コールを使用して明示的に操作しないかぎり実行されることのない処理プログラムです。
他処理プログラム(割り込みハンドラ,周期ハンドラ,およびアラーム・ハンドラ)とは異なり,RI600PXが提供するサービス・コールを使用して明示的に操作しないかぎり実行されることのない処理プログラムです。
- 周期ハンドラ
指定された周期時間毎に起動されるルーチンです。
なお,RI600PXでは,周期ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,一定の時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,周期ハンドラに制御が移ります。
指定された周期時間毎に起動されるルーチンです。
なお,RI600PXでは,周期ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,一定の時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,周期ハンドラに制御が移ります。
- アラーム・ハンドラ
指定した時間後に一度だけ起動されるルーチンです。
なお,RI600PXでは,アラーム・ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,一定の時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,アラーム・ハンドラに制御が移ります。
指定した時間後に一度だけ起動されるルーチンです。
なお,RI600PXでは,アラーム・ハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,一定の時間が経過した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,アラーム・ハンドラに制御が移ります。
- 割り込みハンドラ
割り込みが発生した際に起動されるルーチンです。
なお,RI600PXでは,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,割り込みが発生した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,割り込みハンドラに制御が移ります。
割り込みが発生した際に起動されるルーチンです。
なお,RI600PXでは,割り込みハンドラを“タスクとは独立したもの(非タスク)”として位置づけています。このため,割り込みが発生した際には,システム内で最高優先度を持つタスクが処理を実行中であっても,その処理は中断され,割り込みハンドラに制御が移ります。
- アクセス例外ハンドラ(_RI_sys_access_exception( ))
アクセス例外ハンドラは,タスクまたはタスク例外処理ルーチンが許可されていないメモリ・アクセスを行ったときに起動されます。
アクセス例外ハンドラは,タスクまたはタスク例外処理ルーチンが許可されていないメモリ・アクセスを行ったときに起動されます。
「2.2 処理プログラムの記述」から「2.4 ユーザ・オウン・コーディング部の記述」で作成されたファイル群,および,RI600PX,Cコンパイラ・パッケージが提供しているライブラリ・ファイルに対して,CubeSuite+上でビルドを実行し,ロード・モジュールを生成します。
備考 システム・コンフィギュレーション・ファイル名の拡張子は,“cfg”を指定してください。
拡張子が異なる場合は,“cfg”が自動的に付加されます(例えば,ファイル名に“aaa.c”を指定した場合,“aaa.c.cfg”となります)。
拡張子が異なる場合は,“cfg”が自動的に付加されます(例えば,ファイル名に“aaa.c”を指定した場合,“aaa.c.cfg”となります)。
備考1 プロジェクト・ツリー パネルにシステム・コンフィギュレーション・ファイルを追加すると,リアルタイムOS生成ファイル・ノードが表示されます。
リアルタイムOS生成ファイル・ノードには,以下の情報ファイルが表示されます。ただし,この時点では,これらのファイルは生成されません。
リアルタイムOS生成ファイル・ノードには,以下の情報ファイルが表示されます。ただし,この時点では,これらのファイルは生成されません。
備考3 システム・コンフィギュレーション・ファイルは,プロジェクトに複数追加することができますが,有効となるのは最初に追加したファイルです。有効なファイルをプロジェクトから外しても,追加済みのファイルは有効にならないため,再度ファイルを追加してください。
mrcファイルには,ソース中で使用しているサービス・コール名が出力されます。テーブル生成ユーティリティmkritblpxには,mrcファイルが格納されたパスを漏れなく指定する必要があります。漏れがある場合,アプリケーションで使用しているサービス・コール・モジュールがリンクされない場合があります。この場合,そのサービス・コールを呼び出したときにシステム・ダウンとなります。
逆に,過去に生成され,現在は無効なmrcファイルをmkritblpxに入力した場合は,アプリケーションで使用していないサービス・コール・モジュールがリンクされる場合があります。この場合,RI600PXの動作に問題は生じませんが,コードサイズが無駄に大きくなってしまうことになります。
また,kernel.hをインクルードするファイルのコンパイル時には,“-ri600_preinit_mrc”オプションを指定してください。本オプションを指定しなくてもRI600PXの動作に問題は生じませんが,アプリケーションで使用していないサービス・コール・モジュールがリンクされる場合があります。この場合,RI600PXの動作に問題は生じませんが,コードサイズが無駄に大きくなってしまうことになります。
アプリケーションをライブラリ化する場合は,コンパイル時に生成されたmrcファイルもmkritblpxに入力してください。これが難しい場合,使用しているサービス・コール名を羅列したmrcファイル(下記例を参照)を作成し,mkritblpxに入力してください。
「17.2.3 ブート処理ファイルのコンパイラ・オプション」に記載のように,ブート処理ファイル(サンプル・プロジェクトでは“resetprg.c”)にはオプション“-nostuff”を設定する必要があります。そうでない場合,RI600PXは正常に動作しません。
オプション“-nostuff”をブート処理ファイルのみに設定するにはブート処理ファイルの[プロパティ]パネルの[個別コンパイル・オプション]タブで,オプション“-nostuff”を全ファイルに設定するには[CC-RX(ビルド・ツール)]の[プロパティ] パネルの[コンパイル・オプション]タブで,以下のいずれかを設定してください。
1 ) [オブジェクト]カテゴリで設定する
図2-6のように,[初期値なし変数をアライメント4のセクションに配置する],[初期値あり変数をアライメント4のセクションに配置する],および[const修飾変数をアライメント4のセクションに配置する]を”はい”に設定してください。
図2-6のように,[初期値なし変数をアライメント4のセクションに配置する],[初期値あり変数をアライメント4のセクションに配置する],および[const修飾変数をアライメント4のセクションに配置する]を”はい”に設定してください。
カーネルライブラリは,表2-1に示すフォルダに格納されています。ただし,CubeSuite+が自動的に適切なカーネル・ライブラリをリンクするので,ユーザはカーネル・ライブラリを意識する必要はありません。
備考1 <ri_root>は,RI600PXのインストール・フォルダを表しています。
デフォルトは,“ C:\Program Files\Renesas Electronics\CubeSuite+\RI600PX”です。
デフォルトは,“ C:\Program Files\Renesas Electronics\CubeSuite+\RI600PX”です。
2 ) RI600PXのセクション
表2-2に,RI600PXのセクションを示します。
アプリケーションでは,SURI_STACKおよびBURI_HEAP以外のRI600PXのセクションを使用しないでください。
表2-2に,RI600PXのセクションを示します。
アプリケーションでは,SURI_STACKおよびBURI_HEAP以外のRI600PXのセクションを使用しないでください。
コンフィギュレータcfg600pxは,システム・コンフィギュレーション・ファイルの“interrupt_fvector[]”の定義内容に従って,固定ベクタ・テーブル/例外ベクタ・テーブルをFIX_INTERRUPT_VECTOR セクションとして生成します。
- RXv1アーキテクチャ使用時
RXv1アーキテクチャでは,固定ベクタ・テーブルは0xFFFFFF80番地に固定されています。FIX_INTERRUPT_VECTORセクションは0xFFFFFF80番地に配置してください。
FIX_INTERRUPT_VECTORセクションを0xFFFFFF80番地以外に配置した場合,RI600PXは正常に動作しません。
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 セクションの先頭アドレスに初期化してください。
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 セクションの先頭アドレスに初期化してください。
5 ) LおよびWセクションに関する注意
Lセクションはリテラル領域,Wセクションはswtich文分岐テーブル領域です。これらはコンパイラによって生成されます。これらのセクションは,#pragma sectionでセクション名を変更することはできません。
LおよびW セクションが生成される可能性のあるソース・ファイル中の関数をタスクの一部として実行させる場合は,以下に留意してください。
Lセクションはリテラル領域,Wセクションはswtich文分岐テーブル領域です。これらはコンパイラによって生成されます。これらのセクションは,#pragma sectionでセクション名を変更することはできません。
LおよびW セクションが生成される可能性のあるソース・ファイル中の関数をタスクの一部として実行させる場合は,以下に留意してください。
A ) ソース・ファイル中の全関数が,同一ドメインに所属するタスクとしてのみ実行する場合
特に留意事項はありません。LおよびW セクションを,そのドメインからリード・アクセス可能なメモリ・オブジェクトとしてください。
特に留意事項はありません。LおよびW セクションを,そのドメインからリード・アクセス可能なメモリ・オブジェクトとしてください。
B ) ソース・ファイル中の関数が,複数のドメインに所属するタスクとして実行する場合
関数ごとのリテラル領域および分岐テーブル領域に異なるセクション名を付与することはできないため,それらを異なるアクセス許可を持つ個別のメモリ・オブジェクトに分離することはできません。したがって,実行時のドメインごとに関数を別ファイル化してAを適用するか,またはLおよび W セクションを全てのドメインからリード・アクセス可能なメモリ・オブジェクトとしてください。
関数ごとのリテラル領域および分岐テーブル領域に異なるセクション名を付与することはできないため,それらを異なるアクセス許可を持つ個別のメモリ・オブジェクトに分離することはできません。したがって,実行時のドメインごとに関数を別ファイル化してAを適用するか,またはLおよび W セクションを全てのドメインからリード・アクセス可能なメモリ・オブジェクトとしてください。
セクション情報ファイル(ユーザ・オウン・コーディング部)のDTBLに記述した初期化データセクションは,リンカのオプション“-rom”を用いてROMに配置されたセクションをRAM上のセクションにマップする設定を行う必要があります。図2-8のように,[CC-RX(ビルド・ツール)]の[プロパティ] パネルの[リンク・オプション]タブの[セクション]カテゴリを設定してください。