本書はRX231 IoT-Engine向けのμT-Kernel3.0の実装仕様を記す。 対象は、トロンフォーラムから公開されているμT-Kernel 3.0(V3.00.07)のうち、RX231 IoT-Engine向けの実装部分である。
ハードウェアに依存しない共通の実装仕様は「μT-Kernel3.0共通実装仕様書」を参照、RXv2コアに共通の仕様は「μT-Kernel3.0 RXv2向け実装仕様書」を参照のこと。
以降、単にOSと称する場合はμT-Kenrel3.0を示し、本実装と称する場合、前述のソースコードの実装を示す。
実装対象のハードウェアは以下の通りである。
分類 | 名称 | 備考 |
---|---|---|
実機 | RX231 IoT-Engine | UCテクノロジー製 |
搭載マイコン | RX200シリーズ RX231グループ R5F52318ADFL |
ルネサス エレクトロニクス製 |
RX231 IoT-Engineのターゲット名および関連する識別名は以下とする。
分類 | 名称 | 対象 |
---|---|---|
ターゲット名 | _IOTE_RX231_ | |
対象システム | IOTE_RX231 | RX231 IoT-Engine |
対象CPUアーキテクチャ | CPU_RX231 | RX231シリーズ |
対象CPUコア | CPU_CORE_RXV2 | RXv2コア |
識別名は以下のファイルで定義される。
include/sys/sysdepend/iote_rx231/machine.h
以下に関連するドキュメントを記す。
分類 | 名称 | 発行 |
---|---|---|
OS | μT-Kernel 3.0仕様書(Ver.3.00.01) TEF020-S004-03.00.01 |
TRONフォーラム |
OS | μT-Kernel3.0共通実装仕様書(Ver.2.00.00) TEF033-W002-2304xx |
TRONフォーラム |
T-Monitor | T-Monitor仕様書 TEF020-S002-01.00.01 |
トロンフォーラム |
デバイスドライバ | μT-Kernel 3.0 デバイスドライバ説明書(Ver.1.00.05) TEF033-W007-221007 |
トロンフォーラム |
実機 | UCT RX231 IoT-Engine取扱説明書 | UCテクノロジー |
搭載マイコン | RX230グループ、RX231グループ ユーザーズマニュアル ハードウェア編 | ルネサス エレクトロニクス |
機種依存定義sysdependディレクトリ下の本実装のディレクトリ構成を以下に示す。名称に(*)の点いたディレクトリが本実装の対象である。
─ sysdepend ハードウェア依存部
├ iote_rx231 RX231 Iot-Engine依存部 (*)
├ :
├ <ターゲットn> ターゲットn 依存部
└ cpu CPU依存部
├ rx231 RX231マイコン依存部 (*)
├ :
└ <CPUn> CPUn依存部
└ core コア依存部
├ rxv2 RXv2コア依存部
├ :
└ <core n> コアn依存部
「RXv2コア依存部」は、RXv2コアに共通するコードであり、他の共通のコアを有するマイコンでも使用される。 「RX231マイコン依存部」は、前述のコア依存部以外の本マイコンに固有のコードである。 「RX231 IoT-Engine依存部」は、前述のコア依存部およびマイコン依存部以外のRX231 IoT-Enginのハードウェアに固有のコードである。
実装対象のマイコンの基本的な仕様を以下に記す。
項目 | 内容 |
---|---|
CPUコア | RXv2 |
ROM | 512KB(内蔵フラッシュROM) |
RAM | 64KB(内蔵RAM) |
RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
省電力機能はサポートしていない。プロファイルTK_SUPPORT_LOWPOWERはFALSEである。よって、マイコンの低消費電力モードに対応する機能は持たない。
省電力機能のAPI(low_pow、off_pow)は、/kernel/sysdepend/iote_rx231/power.cに空関数として記述されている。なお、本関数に適切な省電力処理を記述し、プロファイルTK_SUPPORT_LOWPOWERをTRUEに指定すれば、OSの省電力機能(tk_set_pow)は使用可能となる。
本マイコンはFPUおよびDSPの機能を有する。コンフィギュレーションUSE_FPUおよびUSE_DSPにより、OSのコプロセッサ対応機能を有効とすることができる。FPUやDSPが有効の場合、コプロセッサレジスタ操作APIが使用可能となる。 詳細はRXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
マイコンのアドレス・マップは、シングルチップモードまたは内蔵ROM有効拡張モードとする。 以下にマイコンのアドレス・マップを記す。なお、リザーブ領域は記載しない(詳細はマイコンの仕様書を参照のこと)。
アドレス (上段:開始 下段:終了) |
種別 | サイズ (KByte) |
備考 |
---|---|---|---|
0x0000 0000 0x0000 FFFF |
内蔵RAM | 64 | |
0x0008 0000 0x000F FFFF |
周辺I/Oレジスタ | ||
0x0010 0000 0x0010 1FFF |
内蔵ROM | E2データフラッシュ | |
0x007F C000 0x007F C4FF |
周辺I/Oレジスタ | ||
0x007F FC00 0x007F FFFF |
周辺I/Oレジスタ | ||
0x0500 0000 0x07FF FFFF |
外部アドレス空間 (CS領域) |
シングルチップモードではリザーブ領域 | |
0xFFF8 0000 0xFFFF FFFF |
内蔵ROM | 512 | プログラムROM |
本実装では、マイコンの内蔵ROMおよび内蔵RAMを使用する。 OSを含む全てのプログラムのコードは内蔵ROMに配置され、実行される。 リセットベクタおよび例外ベクタテーブルは内蔵ROM上に配置される。 割込みベクタテーブルおよび割込みの高級言語ハンドラテーブルは、リセット時は内蔵ROM上にあるが、OSの初期化処理にてRAM上に再配置される。ただし、コンフィグレーションUSE_STATIC_IVTを有効にすることにより、RAM上への再配置を禁止することができる(初期値は無効)。再配置を禁止した場合、APIによる割込みハンドラの登録が不可となる。
以下に内蔵ROMおよび内蔵RAMのメモリマップを示す。表中でアドレスに「-」が記載された箇所はデータのサイズによりC言語の処理系にてアドレスが決定され、OS内ではアドレスの指定は行っていない。
(1) 内蔵ROMのメモリマップ
アドレス (上段:開始 下段:終了) |
種別 | 内容 | |
---|---|---|---|
0xFFF8 0000 - |
プログラムコード | プログラムコードが配置される領域 | |
- - |
割込みベクタテーブル | 割込みのベクタテーブル |
リセット時のみ有効 |
- - |
割込み高級言語ハンドラテーブル | 割込みの高級言語ハンドラの登録テーブル リセット時のみ有効 |
|
- - |
定数データ | C言語の定数データなどが配置される領域 | |
0xFFFF FF80 - |
例外ベクタテーブル | 例外のベクタテーブル リセット時のみ有効 |
|
0xFFFF FFFC |
0xFFFF FFFF | リセットベクタ |
(2) 内蔵RAMのメモリマップ
アドレス (上段:開始 下段:終了) |
種別 | 内容 |
---|---|---|
0x0000 0000 - |
割込みベクタテーブル | 割込みのベクタテーブル OSの初期化後に有効 |
- - |
割込み高級言語ハンドラテーブル | 割込みの高級言語ハンドラの登録テーブル OSの初期化後に有効 |
- - |
プログラムデータ | C言語の変数等が配置される領域 |
- - |
OS管理領域 | OS内部の動的メモリ管理の領域 |
- 0x0000 FFFF |
例外スタック領域 | 例外および割込みハンドラにて使用されるスタック |
RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
本マイコンのハードウェアに関わる割込み関連の定義を以下に記す。項目はRXv2コアにおいて共通である。RXv2向け実装仕様書を参照のこと。
名称 | 値 | 意味 |
---|---|---|
N_INTVEC0 | 256 | グループ割込み以外の割込み数(※) |
N_INTVEC | 256 | すべての割込み数 |
INTPRI_MIN_INT_PRI | 1 | 割込みの最低優先度 |
INTPRI_MAX_INT_PRI | 15 | 割込みの最高優先度 |
(※)本マイコンにはグループ割込みは存在しないのでN_INTVECと同じになる
以上の定義は以下のファイルで記述される。
/include/sys/sysdepend/cpu/rx231/sysdef.h
本マイコンは、例外ベクタテーブルと割込みベクタテーブルを有する(各テーブルの具体的な仕様はマイコンのユーザマニュアルを参照のこと)。 また、OS内の割込みハンドラ管理用にHLL割込みハンドラテーブルが存在する。
(1) 例外ベクタテーブル RXv2向け実装仕様書を参照のこと。
(2) 割込みベクタテーブル 割込みベクタテーブルは、割込みおよび無条件トラップの割込みハンドラのアドレスが設定される。 リセット時の割込みベクタテーブルは、以下のファイルにknl_int_vect_romとして定義される。
kernel/sysdepend/cpu/rx231/intvect_tbl.c
OSの初期化処理において、ROM上のベクタテーブルはRAM上にコピーされ、以降そちらが使用される。RXv2向け実装仕様書を参照のこと。 ただし、コンフィグレーションUSE_STATIC_IVTが1に設定されている場合は、ROM上のベクターテーブルが使用され続ける。USE_STATIC_IVTの初期値は0である。
(3) HLL割込みハンドラテーブル TA_HLANG属性の割込みハンドラ(高級言語(C言語)で記述された割込みハンドラ)は、OS内の高級言語対応ルーチンを経由して呼び出される。TA_HLANG属性の割込みハンドラの実行アドレスは、HLL割込みハンドラテーブルに登録される。 リセット時のHLL割込みハンドラテーブルは、以下のファイルにknl_hll_inthdr_romとして定義される。
kernel/sysdepend/cpu/rx231/hllint_tbl.c
OSの初期化処理において、ROM上のHLL割込みハンドラテーブルはRAM上にコピーされ、以降そちらが使用される。RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
OSの内部で使用する割込みには、以下のようにマイコンの割込みまたは例外が割り当てられる。該当する割込みまたは例外は、OS以外で使用してはならない。
種類 | 割込み番号 | 割り当てられる割込み・例外 | 優先度 |
---|---|---|---|
システムタイマ割込み | 28 | CMI0 | 15 |
本実装ではディスパッチ要求および強制ディスパッチ要求には割込みを使用しない。
各割込み・例外の割り当ては以下のファイルで定義される。
/include/sys/sysdepend/cpu/rx231/sysdef.h ``` #define INTNO_SYS_DISPATCH 1 /* Dispatch (reserved)*/ #define INTNO_SYS_SVC 2 /* System call (reserved) */ #define INTNO_SYS_RET_INT 3 /* System call : tk_ret_int (reserved) */ #define INTNO_SYS_DGSPT 4 /* Debugger support (reserved) */ #define INTNO_SYS_TICK 28 /* System Timer tick */ ``` システムタイマ割込み(INTNO_SYS_TICK)以外は将来のための予約である。
システムタイマ割込みは最高優先度が設定される。他の割込みは、この割込み優先度の間の優先度を使用しなければならない。 システムタイマ割込みの優先度は以下のファイルで定義される。
/include/sys/sysdepend/cpu/rx231/sysdef.h ```
#define INTLEVEL_SYS_TICK 15 ```
RXv2向け実装仕様書を参照のこと。
最高割込み優先度INTPRI_MAX_EXTINT_PRIは、本OSが管理する割込みの最高の割込み優先度であり、以下のファイルで定義される。詳細はRXv2向け実装仕様書を参照のこと。
include/sys/sysdepend/cpu/rx231/sysdef.h ``` #define INTPRI_MAX_INT_PRI 15 ```
本マイコン固有の実装仕様を以降に記す。共通仕様はRXv2向け実装仕様書を参照のこと。
割込み番号 | 対応する割込み |
---|---|
0 ~ 255 | ベクタ番号0 ~ ベクタ番号255 |
RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
リセットハンドラはRXv2向け実装仕様書を参照のこと。 リセットハンドラから呼ばれるknl_startup_hw関数により本システムに固有の処理が実行される。 knl_startup_hw関数は以下のファイルに定義される。
kernel/sysdepend/iote_rx231/hw_setting.c
knl_startup_hw関数では以下の処理が実行される。ユーザは必要に応じてknl_startup_hw関数の内容を変更してよい。
(1) 周辺モジュールのセットアップ 使用する周辺モジュールのモジュールストップを解除し使用可能とする。 設定はmstop_tblテーブルの内容に従い実行する。 mstop_tblテーブルの要素は以下の構造体であり、レジスタのアドレスと設定値を示す。テーブルの内容を変更することにより設定を変えることができる。
typedef struct {
UW addr;
UW data;
} T_SETUP_REG;
初期値では以下の周辺モジュールのモジュールストップを解除する。
● コンフィギュレーションUSE_SDEV_DRVが無効(0)の場合
周辺モジュール名 | 用途 |
---|---|
DMAC/DTC | |
CMT0 | システムタイマ |
TMR0 ~ 3 | 物理タイマ |
SCI6 | デバッグ用シリアル入出力(T-Monitor) |
● コンフィギュレーションUSE_SDEV_DRVが有効(1)の場合
周辺モジュール名 | 用途 |
---|---|
DMAC/DTC | |
CMT0 ~ 1 | |
TMR0 ~ 3 | 物理タイマ |
SCI6 | デバッグ用シリアル入出力(T-Monitor) |
RII0 | デバイスドライバ(I2C) |
S12ADE | デバイスドライバ(A/DC) |
(2) I/O端子の設定 各I/O端子の機能設定を行う。 設定はpinfnc_tblテーブルおよびpinmode_tblテーブルの内容に従い実行する。 各テーブルの要素は前述のT_SETUP_REG構造体である。テーブルの内容を変更することにより、I/O端子の設定を変えることができる。
初期値では以下の端子の機能が設定されている。
● コンフィギュレーションUSE_SDEV_DRVが無効(0)の場合
I/Oポート名 | 機能名 | 用途 |
---|---|---|
PB0 | SCI6.RXD6 | デバッグ用シリアル入出力(T-Monitor) |
PB1 | SCI6.TXD6 | 同上 |
● コンフィギュレーションUSE_SDEV_DRVが有効(1)の場合
I/Oポート名 | 機能名 | 用途 |
---|---|---|
P16 | RII0.SCL0 | デバイスドライバ(I2C) |
P17 | RII0.SDA0 | 同上 |
P40 | AN000 | デバイスドライバ(A/DC) |
P41 | AN001 | 同上 |
P42 | AN002 | 同上 |
PB0 | SCI6.RXD6 | デバッグ用シリアル入出力(T-Monitor) |
PB1 | SCI6.TXD6 | 同上 |
(3) CPUクロックの設定 CPUクロックの設定は以下のファイルのstartup_clock関数で行っている。
kernel/sysdepend/iote_rx231/cpu_clock.c
本実装では以下の設定となる。
項目 | 値 | 備考 |
---|---|---|
システムクロック ICLK | 54MHz | |
周辺モジュールクロック PCLKA | 54MHz | MTU2用 |
周辺モジュールクロック PCLKB | 27MHz | MTU2,S12AD以外 |
周辺モジュールクロック PCLKD | 54MHz | S12AD用 |
Flash I/Fクロック FCLK | 1.6875MHz | |
USBクロック UCLK | 48MHz |
クロックの値は以下のファイルで定義されている。
include/sys/sysdepend/cpu/rx231/sysdef.h
#define SYSCLK_ICLK (UW)(54*MHz)
#define SYSCLK_PCLKA (UW)(54*MHz)
#define SYSCLK_PCLKB (UW)(27*MHz)
#define SYSCLK_PCLKD (UW)(54*MHz)
なお、クロックの初期設定は原則として変更してはならない。もし変更した場合は、OSのクロック制御やデバイスドライバの制御にも影響がある場合があるため、合わせてプログラムの変更を行わなくてはならない。
OS初期化処理は共通部のmain関数で実行される。共通実装仕様書を参照のこと。 main関数から以下の対象システムに依存する処理が実行される。
(1) デバイスの初期化 knl_init_device main関数より呼び出され、デバイスドライバの登録に先立ち、必要なハードウェアの初期化を行う。 デバイスの初期化は以下のファイルにknl_init_device関数として実装される。
kernel/sysdepend/iote_rx231/devinit.c
なお、本実装ではknl_init_device関数内の処理は記述されてないので、ユーザは必要に応じてknl_init_device関数に処理を記述すること。
初期タスクの処理は共通部のinit_task_main関数で実行される。共通実装仕様書を参照のこと。 init_task_main関数から以下の対象システムに依存する処理が実行される。
(1) デバイスの実行(knl_start_device) デバイスドライバの登録、実行を行う。本処理は以下のファイルにknl_start_device関数として定義される。
kernel/sysdepend/iote_rx231/devinit.c
コンフィギュレーションUSE_SDEV_DRVが有効(1)の場合、以下の基本的なデバイスドライバが登録される。
デバイス名 | 機能 |
---|---|
serd | シリアル通信(SCI6) |
iica | I2C通信(RIIC0) |
adca | A/Dコンバータ(S12SDE) |
コンフィギュレーションUSE_SDEV_DRVが無効(0)の場合、デバイスドライバの登録は行われない(初期値は無効(0))。
ユーザが使用するデバイスドライバを変更する場合は、必要に応じて上記の関数の処理を変更する必要がある。
終了処理と再起動処理は共通部のshutdown_system関数で実行される。shutdown_system関数からハードウェアに依存する処理が呼び出される。 対象ハードウェアに依存する処理のうち、本マイコンに依存する処理を記す。RXv2コアに依存する処理は、RXv2コア向け実装仕様書を参照のこと。
(1) デバイスの終了処理 knl_finish_device knl_start_deviceと対となるデバイスの終了処理を実行する。 knl_finish_device関数は以下のファイルに定義される。
kernel/sysdepend/iote_rx231/devinit.c
なお、本実装ではknl_finish_device関数内の処理は記述されてないので、ユーザは必要に応じてknl_finish_device関数に処理を記述すること。
(2) ハードウェア停止処理(knl_shutdown_hw) ハードウェアをすべて停止し、マイコンを終了状態とする。本関数の処理でシステムは終了する。 knl_shutdown_hw関数は以下のファイルに定義される。
kernel/sysdepend/iote_rx231/hw_setting.c
なお、本実装では割込みを無効とし無限ループを行っている。ユーザは必要に応じてknl_shutdown_hw関数の内容を変更してよい。
(2) ハードウェア再起動(knl_restart_hw) ハードウェアの再起動処理を行う。knl_restart_hw関数は以下のファイルに定義される。
kernel/sysdepend/iote_rx231/hw_setting.c
なお、本実装では再起動には対応していないので、処理のひな型のみを記述している。knl_restart_hw関数はエラーを返して終了し、システムは終了するようになっている。ユーザは必要に応じて、knl_restart_hw関数に再起動処理を記述すること。
本マイコンに依存するタスクの仕様を以下に記す。
タスク属性のハードウェア依存仕様を以下に示す。
属性 | 可否 | 説明 |
---|---|---|
TA_COP0 | 〇 | FPU(TA_FPUと同じ) |
TA_COP1 | × | DSP |
TA_COP2 | × | 対応無し |
TA_COP3 | × | 対応無し |
TA_FPU | 〇 | FPU(TA_COP0と同じ) |
RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
RXv2向け実装仕様書を参照のこと。
タイムイベントハンドラの実行中の割込みマスクレベルは、タイムイベントハンドラ割込みレベルTIMER_INTLEVELに設定される。TIMER_INTLEVELは、以下のファイルで定義される。
include/sys/sysdepend/cpu/rx231/sysdef.h
本実装では初期値は以下のように0(すべての割込みを許可)が設定されている。
#define TIMER_INTLEVEL 0 //すべての割込みを許可
マイコン内蔵の8ビットタイマ(TMR)を16ビットカウントモードで使用して物理タイマが実装される。 8ビットタイマは4チャンネルが存在する。そのうちTMR0とTMR1、TMR2とTMR3の組み合わせで16ビットカウントモードとし、物理タイマ番号が1から割り当てられる。
物理タイマ番号 | 対応するタイマ | ビット幅 |
---|---|---|
1 | TMR0、TMR1 | 16 |
2 | TMR2、TMR3 | 16 |
TMRは物理タイマ以外の用途にも使用可能である。その場合は物理タイマAPIを呼び出さなければよい(API StartPhysicalTimerにてTMRは物理タイマに初期化される)。
物理タイマのクロック設定は、以下のファイルで定義される。
include/sys/sysdepend/cpu/rx231/sysdef.h
#define TMR01_CLOCK (0x08) // Count PCLK
#define TMR23_CLOCK (0x08) // Count PCLK
この値は、TMRのTCCRレジスタのCKSビットに設定される。上記の設定を変更することにより、各物理タイマのクロックを変更できる。 本実装の初期値では、タイマクロックの周波数はPCLK(27MHz)と同じである。
物理タイマはその内部処理において、各TMRBのコンペアマッチ割込み(CMIA)およびオーバーフロー割込み(OVI)を使用する。
物理タイマ番号 | 対応する割込み | 割込み番号 |
---|---|---|
1 | CMIA0 | 174 |
1 | OVI0 | 176 |
2 | CMIA2 | 180 |
2 | OVIA2 | 182 |
各割込みの優先度は以下のファイルに定義される。割込み優先度は必要に応じて変更可能である。
include/sys/sysdepend/cpu/rx231/sysdef.h
#define INTPRI_TMR01 5 // 物理タイマ1
#define INTPRI_TMR23 5 // 物理タイマ2
T-Monitor互換ライブラリのAPIによるコンソール入出力の仕様を以下に示す。
項目 | 内容 |
---|---|
デバイス | シリアルコミュニケーションインタフェース(SCI) Channel 6 |
ボーレート | 115200bps |
データ形式 | data 8bit, stop 1bit, no parity |
版数 | 日付 | 内容 | |
---|---|---|---|
2.00.00 | 2023.12.01 | ・内容および構成の全面見直 | |
1.00.09 | 2022.10.14 | ・誤字修正 | |
1.00.08 | 2022.10.07 | ・μT-Kernelおよび関連仕様書バージョン更新 ・5.1リセット処理 (2)ベクタテーブルの移動 誤記修正 (誤) USE_NOINIT (正)USE_STATIC_IVT |
|
1.00.07 | 20022.06.30 | ・5.2 ハードウェアの初期化および終了処理 |
cpu_clock.cファイルのパス変更 |
1.00.06 | 2021.11.15 | ・1.4 関連ドキュメント バージョン番号等を更新 ・誤記修正 (正)RNG (誤)RING |
|
1.00.05 | 2021.03.31 | ・1.4 関連ドキュメント バージョン番号等を更新 | |
1.00.04 | 2020.12.09 | ・1.4 関連ドキュメント バージョン番号等を更新 ・1.5 ソースコード構成 説明の追加 ・ 2.5 コプロセッサ対応 一部説明を「8.1 コプロセッサ関連」に移動 ・5.2 ハードウェアの初期化および終了処理 コンフィギュレーションUSE_SDEV_DRVによるハードウェアの初期化の説明を追加 ・5.3 デバイスドライバの実行および終了 コンフィギュレーションUSE_SDEV_DRVによるデバイスドライバの初期化の説明を追加 ・6 タスク および、7時間管理 「6.その他の実装仕様」から独立した章に変更 ・8.1 コプロセッサ関連 新規追加 |
|
1.00.03 | 2020.10.21 | ・1.4 関連ドキュメント バージョン番号等を更新 ・5.2ハードウェアの初期化および終了処理 ハードウェアの初期設定の処理について説明を追記 ・6.3.2 タイマの設定 物理タイマのクロック設定について説明を追記 |
|
1.00.02 | 2020.07.13 | ・6.3 物理タイマ機能 新規 | |
1.00.01 | 2020.05.29 | ・1.4 関連ドキュメント バージョン番号等を更新 4.4 OS内部で使用する割込み 説明の追加 |
|
1.00.00 | 2020.03.13 | ・初版 |
以上