/* * TOPPERS/SSP Kernel * Smallest Set Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory * Graduate School of Information Science, Nagoya Univ., JAPAN * Copyright (C) 2008 by Witz Corporation, JAPAN * Copyright (C) 2010-2014 by Naoki Saito * Nagoya Municipal Industrial Research Institute, JAPAN * * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・ * 再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース * コード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保 * 証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用 * できない形で再配布する場合には,次のいずれかの条件を満たすこと. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作 * 権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報 * 告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また, * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負 * わない. * */ /* * プロセッサ依存モジュール(RL78) * * このインクルードファイルは,"<プロセッサ型番>_config.h" のみから * インクルードされる.他のファイルから直接インクルードしてはならない. */ #ifndef TOPPERS_PRC_CONFIG_H #define TOPPERS_PRC_CONFIG_H /* * (1) コンテキストに関する定義 */ /* 共有スタック領域のためのスタックポインタ初期値を生成するマクロ */ #define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz))) /* * (2) システム状態に関する定義 */ /* * CPUロック状態での割込み優先度マスク(IPM)の値 * TIPM_LOCKは,CPUロック状態を表現する割込み優先度マスク(IPM)の値を示す. * カーネル管理の割込みに対する割込み優先度の最小値(TMIN_INTPRI)に等しい. */ #ifndef TIPM_LOCK #define TIPM_LOCK TMIN_INTPRI #endif /* TIPM_LOCK */ /* * 割込み優先度マスク(IPM) とプロセッサの割込み優先度マスク(ISP) の変換 * * RL78 では,PSWレジスタの下位から数えてビット1および 2 の 2 ビットに * インサービス・プライオリティ・フラグ(ISP) の値が格納される. * * カーネルの管理するIPM (-1から連続した負の値) を使って * プロセッサの ISP を制御するために変換が必要となる. * * 指定したレベル以下の割込みをマスクする場合は,ISPの設定値を * 目的のレベルより一つ高い優先度(値としては小さい)値にする必要がある. */ #define IPM2ISP(ipm) (((uint8_t)(4-1+(ipm))) << 1U) /* IPM-->ISP(ipm=-3,-2,-1,0) */ #define ISP2IPM(isp) ((PRI)((PRI)(isp >> 1U)+1-4)) /* ISP-->IPM */ /* * 割込み優先度マスクの特別な値に対する内部表現 */ #define ISP_LOCK (IPM2ISP(TIPM_LOCK)) /* CPUロック状態での ISP */ #define ISP_ENAALL (IPM2ISP(TIPM_ENAALL)) /* TIPM_ENAALL での ISP */ /* * (3) 割込み処理モデル(割込み要求ライン) */ /* * intnoが,dis_int/ena_intに対する割込み番号として * 有効な値である場合にtrue,そうでない場合にfalseを返すマクロ */ #define VALID_INTNO_DISINT(intno) VALID_INTNO(intno) #define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno) /* * IPM から割込み制御レジスタでの表現に変換するマクロ */ #define IPM2ILVL(ipm) ((ipm)+4) // ipm=-1,-2,-3,-4 /* * (4) 割込み処理モデル(割込みハンドラ) */ /* * 割込みハンドラの入口処理の生成マクロ */ #define _INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno##_entry #define INT_ENTRY(inhno, inthdr) _INT_ENTRY(inhno , inthdr) #define _INTHDR_ENTRY(inhno, inhno_num ,inthdr) \ extern _kernel_##inthdr##_##inhno##_entry(void); #define INTHDR_ENTRY(inhno, inhno_num ,inthdr) _INTHDR_ENTRY(inhno, inhno_num ,inthdr) /* * (5) CPU例外処理モデル */ /* * CPU例外ハンドラの入口処理の生成マクロ */ #define _EXC_ENTRY(excno , exchdr) _kernel_##exchdr##_##excno##_entry #define EXC_ENTRY(excno , exchdr) _EXC_ENTRY(excno , exchdr) #define _EXCHDR_ENTRY(excno , excno_num , exchdr) \ extern _kernel_##exchdr##_##excno##_entry(void); #define EXCHDR_ENTRY(excno , excno_num , exchdr) _EXCHDR_ENTRY(excno , excno_num , exchdr) /* * (6) 初期化・終了処理 */ // 定義なし #ifndef TOPPERS_MACRO_ONLY /* * (1) コンテキストに関する定義 */ /* * コンテキストの参照 */ extern bool_t sense_context(void); /* * (2) システム状態に関する定義 */ /* * CPUロックフラグ実現のための変数 (prc_config.c) */ extern bool_t lock_flag; /* CPUロックフラグの値 */ extern uint8_t saved_psw; /* CPUロック状態移行前の割込み優先度レベル */ /* * CPU ロック状態への移行 * この関数は,CPU ロック状態のときに呼びだされないことを前提とする. */ extern void t_lock_cpu(void); extern void i_lock_cpu(void); /* * CPUロック状態の解除 * この関数は,CPU ロック状態のときにのみ呼びだされることを前提とする. */ extern void t_unlock_cpu(void); extern void i_unlock_cpu(void); /* * CPUロック状態の参照 */ extern bool_t x_sense_lock(void); #define t_sense_lock() x_sense_lock() #define i_sense_lock() x_sense_lock() /* * 割込み優先度マスク(IPM) の設定 * 指定した割込み優先度(-1, -2, ..., TMIN_INTPRI) を元に * プロセッサの割込み優先度レベル (IPL) を設定する. */ extern void x_set_ipm(PRI intpri); #define t_set_ipm(intpri) x_set_ipm(intpri) #define i_set_ipm(intpri) x_set_ipm(intpri) extern PRI x_get_ipm(void); #define i_get_ipm() x_get_ipm() #define t_get_ipm() t_get_ipm() /* * (3) 割込み処理モデル(割込み要求ライン) */ /* * 割込み要因毎のレベル定義テーブル (kernel_cfg.c による出力) * 割込み番号(INTNO) から割込み優先度を取得するために使用. */ extern const PRI intpri_table[]; /* * 割込み要求禁止フラグのセット(prc_config.c) * 指定した割込み番号に対応する割込み要求ラインの割込み要求フラグをセットする. * 割込み属性が設定されていない割込み要求ラインの割込み番号を指定した * 場合は,単に FALSE を返す. */ extern bool_t x_disable_int(INTNO intno); #define t_disable_int(intno) x_disable_int(intno) #define i_disable_int(intno) x_disable_int(intno) /* * 割込み要求禁止フラグのクリア(prc_config.c) * 指定した割込み番号に対応する割込み要求ラインの割込み要求フラグをクリアする. * 割込み属性が設定されていない割込み要求ラインの割込み番号を指定した * 場合は,単に FALSE を返す. */ extern bool_t x_enable_int(INTNO intno); #define t_enable_int(intno) x_enable_int(intno) #define i_enable_int(intno) x_enable_int(intno) /* * 割込み要求のクリア(prc_config.c) */ extern void x_clear_int(INTNO intno); #define t_clear_int(intno) x_clear_int(intno) #define i_clear_int(intno) x_clear_int(intno) /* * 割込み要求のチェック(prc_config.c) */ extern bool_t x_probe_int(INTNO intno); #define t_probe_int(intno) x_probe_int(intno) #define i_probe_int(intno) x_probe_int(intno) /* * 割込み要求ラインの属性の設定 (prc_config.c) */ extern void x_config_int(INTNO intno, ATR intatr, PRI intpri); /* * (4) 割込み処理モデル(割込みハンドラ) */ /* * 割込みハンドラの設定 * * RL78はROMに割込みベクタを配置するため,本関数は空に定義する. */ #define x_define_inh(inhno, inthdr) /* * 割込みハンドラの入口で必要な処理 */ #define i_begin_int(intno) /* 特に行うべき処理はない */ /* * 割込みハンドラの出口で必要な処理 */ #define i_end_int(intno) /* 特に行うべき処理はない */ /* * (5) CPU例外処理モデル */ /* * CPU例外ハンドラの設定 * RL78 は ROM にベクタを配置するため,本関数は空に定義する. */ #define x_define_exc(excno, exchdr) /* * (6) 初期化・終了処理 */ /* * プロセッサ依存の初期化(prc_config.c) */ extern void prc_initialize(void); /* * dispatcher 呼び出し前にターゲット依存で必要な処理を行うための関数 * (prc_support.asm) */ extern void start_dispatch(void); /* * カーネルの終了処理の呼出し(prc_support.asm) * * call_exit_kernelは,カーネルの終了時に呼び出され,スタックポインタを * 初期化し,カーネルの終了処理(exit_kernel)を呼び出す. */ extern void call_exit_kernel(void); /* * プロセッサ依存の終了時処理(prc_config.c) */ extern void prc_terminate(void); /* * (7) dispacher での割込み待ち */ extern void idle_loop(void); #endif /* TOPPERS_MACRO_ONLY */ #endif /* TOPPERS_PRC_CONFIG_H */