$ $ TOPPERS/SSP Kernel $ Smallest Set Profile Kernel $ $ 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プロジェクトは,本ソフトウェアに関して,特定の使用目的に対す $ る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用 $ により直接的または間接的に生じたいかなる損害に関しても,その責任を負 $ わない. $ $ $ プロセッサ依存テンプレート $ $ $ ATT_ISRで使用できる割込み番号とそれに対応する割込みハンドラ番号 $ $INTNO_ATTISR_VALID = INTNO_VALID$ $INHNO_ATTISR_VALID = INHNO_VALID$ $ $ DEF_INH/DEF_EXCで使用できる割込みハンドラ番号/CPU例外ハンドラ番号 $ $INHNO_DEFINH_VALID = INHNO_VALID$ $EXCNO_DEFEXC_VALID = EXCNO_VALID$ $ $ CFG_INTで使用できる割込み番号と割込み優先度 $ $INTNO_CFGINT_VALID = INTNO_VALID$ $ // INTPRI_CFGINT_VALID はプロセッサにセット可能な優先度の範囲を示し, $ // カーネル管理(外)かどうかの区別をしていない. $ // カーネル管理となる割込み優先度の範囲を変更する場合, $ // TMIN_INTPRI (prc_kernel.h) の値を必要に応じて変更する. $INTPRI_CFGINT_VALID = { -4,-3,-2,-1 }$ $ $ スタックサイズのチェック方法指定 $ $ アライメントに関係なく同じ速度でアクセスできる $ $CHECK_STKSZ_ALIGN = 1$ $ $ 定数定義 $ $TA_POSEDGE = TA_EDGE$ $ $ ターゲット依存の割込み属性の定義 $ $TARGET_INTATR = TA_POSEDGE | TA_NEGEDGE | TA_BOTHEDGE$ $ $ 標準テンプレートファイルのインクルード $ $INCLUDE "kernel.tf"$ $ $ CFG_INTのターゲット依存のエラーチェック $ $ $ $FOREACH intno INT.ORDER_LIST$ $ // INT割込みに対する割込み番号かどうか $IF (LENGTH(FIND(INTNO_INT , INT.INTNO[intno])) != 0)$ $ // TA_POSEDGE または TA_NEGEDGE または TA_BOTHEDGE が同時に設定されてないかどうか $IF ( ((INT.INTATR[intno] & (TA_POSEDGE|TA_NEGEDGE|TA_BOTHEDGE)) != (TA_POSEDGE)) & ((INT.INTATR[intno] & (TA_POSEDGE|TA_NEGEDGE|TA_BOTHEDGE)) != (TA_NEGEDGE)) & ((INT.INTATR[intno] & (TA_POSEDGE|TA_NEGEDGE|TA_BOTHEDGE)) != (TA_BOTHEDGE)) )$ $ERROR$ INT.TEXT_LINE[intno]:$FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "intatr", INT.INTATR[intno], INT.INTNO[intno], "CFG_INT")$$END$ $END$ $ELSE$ $ // INT割込み以外の割込みに対して TA_ENAINT 及び TA_EDGE 以外の割込み属性が指定されていないかどうか $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE)) != 0$ $ERROR$ INT.TEXT_LINE[intno]: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "intatr", INT.INTATR[intno], INT.INTNO[intno], "CFG_INT")$$END$ $END$ $END$ $END$ $ $ 割込み番号から割込み優先度を取り出すテーブル $ $FILE "kernel_cfg.c"$ const PRI _kernel_intpri_table[$LENGTH(INTNO_RANGE)$] = $NL$ { $FOREACH intno INTNO_RANGE$ $IF LENGTH(INT.INTNO[intno])$ $intpri = INT.INTPRI[intno]$ $ELSE$ $intpri = "0"$ $END$ $TAB$$FORMAT("INT8_C(%2d), /* %02u */", intpri , +intno)$$NL$ $END$ };$NL$$NL$ $ $ アーキテクチャ依存テンプレート(アセンブラ固有部分) $ $ $ アセンブラ出力ファイル (共通部分) $ $FILE "kernel_cfg_asm.asm"$ ;$NL$ ; RL78アーキテクチャ依存出力ファイル$NL$ ;$NL$ ; 割込みハンドラ入口処理の定義$NL$ ;$NL$ $NL$$NL$ $ $ 割込み入口処理 $ $ $ グローバルシンボル $ $TAB$extrn __kernel_interrupt_entry $NL$ $TAB$extrn __kernel_int_return$NL$$NL$ $TAB$; コンパイラが使用する saddr領域のレジスタ$NL$ $TAB$extrn _@RTARG0,_@RTARG2,_@RTARG4,_@RTARG6,_@SEGAX,_@SEGDE$NL$ $TAB$extrn _@NRARG0,_@NRARG1,_@NRARG2,_@NRARG3$NL$ $TAB$extrn _@NRAT00,_@NRAT02,_@NRAT04,_@NRAT06$NL$ $NL$ ; $NL$ ; コンパイラが使用するsaddr領域の退避 $NL$ ; $NL$ save_saddr_regs macro$NL$ $TAB$movw ax, _@RTARG0 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@RTARG2 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@RTARG4 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@RTARG6 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@SEGAX $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@SEGDE $NL$ $TAB$push ax $NL$ $TAB$$$if (ALLOC_REGVAR_TO_SADDR) ; -qr オプションを使用する場合 $NL$ $TAB$movw ax, _@NRARG0 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@NRARG1 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@NRARG2 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@NRARG3 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@NRAT00 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@NRAT02 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@NRAT04 $NL$ $TAB$push ax $NL$ $TAB$movw ax, _@NRAT06 $NL$ $TAB$push ax $NL$ $TAB$$$endif$NL$ $TAB$endm$NL$ $NL$ @@BASE$TAB$CSEG BASE$NL$ $ $ 割込みハンドラ入口処理 $ $FOREACH inhno INHNO_RANGE$ $IF LENGTH(INH.INHNO[inhno])$ $TAB$extrn _$INH.INTHDR[inhno]$ $NL$ $TAB$public __kernel_$INH.INTHDR[inhno]$_$+INH.INHNO[inhno]$_entry $NL$ __kernel_$INH.INTHDR[inhno]$_$+INH.INHNO[inhno]$_entry: $NL$ $TAB$push ax ; レジスタをタスクスタックへ退避 $NL$ $TAB$push bc $NL$ $TAB$push de $NL$ $TAB$push hl $NL$ $TAB$mov a,es ; ES, CS の退避 $NL$ $TAB$mov x,a $NL$ $TAB$mov a,cs $NL$ $TAB$push ax $NL$ $TAB$save_saddr_regs$NL$ $TAB$movw bc, #_$INH.INTHDR[inhno]$ ; ハンドラのアドレスを bc へ $NL$ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$ $TAB$br __kernel_interrupt_entry ; 共通の入口処理へ $NL$ $NL$$NL$ $ELSE$ $TAB$;カーネル管理外の割込みの場合,ハンドラ実行してそのままリターン $NL$ $TAB$call bc ; 割込みハンドラ呼び出し$NL$ $TAB$br __kernel_int_return ; レジスタ復帰 & 割込みからリターン(prc_support.asm) $NL$ $END$ $END$ $END$ $ $ CPU例外ハンドラ入口処理 $ $FOREACH excno EXCNO_RANGE$ $IF LENGTH(EXC.EXCNO[excno])$ $TAB$extrn _$EXC.EXCHDR[excno]$ $NL$ $TAB$public __kernel_$EXC.EXCHDR[excno]$_$+EXC.EXCNO[excno]$_entry $NL$ __kernel_$EXC.EXCHDR[excno]$_$+EXC.EXCNO[excno]$_entry: $NL$ $TAB$push ax ; レジスタをタスクスタックへ退避 $NL$ $TAB$push bc $NL$ $TAB$push de $NL$ $TAB$push hl $NL$ $TAB$mov a,es ; ES, CS の退避 $NL$ $TAB$mov x,a $NL$ $TAB$mov a,cs $NL$ $TAB$push ax $NL$ $TAB$save_saddr_regs $NL$ $TAB$movw ax, sp ; SP(ハンドラの引数となる)を ax へ $NL$ $TAB$movw bc, #_$EXC.EXCHDR[excno]$ ; ハンドラのアドレスを bc へ $NL$ $TAB$br __kernel_interrupt_entry ; 共通の入口処理へ $NL$ $NL$$NL$ $END$ $END$ $ $ ベクタテーブル $ ;$NL$ ; ベクタテーブル$NL$ ;$NL$ $NL$ $TAB$extrn $TAB$ _unused_interrupt $NL$ $TAB$org 0004h$NL$$NL$ $FOREACH inhno INHNO_RANGE$ $IF LENGTH(INH.INHNO[inhno])$ $inhhdr = CONCAT(CONCAT("_kernel_" , CONCAT(INH.INTHDR[inhno] , "_")) , CONCAT(+INH.INHNO[inhno] , "_entry"))$ $ELSE$ $inhhdr = "unused_interrupt"$ $END$ $TAB$dw$TAB$_$inhhdr$ $TAB$ $TAB$ $FORMAT("; %02d" , inhno)$ $NL$ $END$ $NL$$NL$ $TAB$org 007eh$NL$$NL$ $FOREACH excno EXCNO_RANGE$ $IF LENGTH(EXC.EXCNO[excno])$ $exchdr = CONCAT(CONCAT("_kernel_" , CONCAT(EXC.EXCHDR[excno] , "_")) , CONCAT(+EXC.EXCNO[excno] , "_entry"))$ $ELSE$ $exchdr = "unused_interrupt"$ $END$ $TAB$dw$TAB$_$exchdr$ $TAB$ $TAB$ $FORMAT("; %02d" , excno)$ $NL$ $END$ $NL$$NL$ $TAB$end $NL$ $ $ prc_support.asm 用マクロ定義ファイル $ $FILE "prc_support_def.inc"$ $IF TMIN_INTPRI == -4$ TMIN_INTPRI_EQU_MINUS4 equ 1 $NL$ $ELSE$ TMIN_INTPRI_EQU_MINUS4 equ 0 $NL$ $END$