$ $ TOPPERS/ASP Kernel $ Toyohashi Open Platform for Embedded Real-Time Systems/ $ Advanced Standard Profile Kernel $ $ Copyright (C) 2008-2015 by Embedded and Real-Time Systems Laboratory $ Graduate School of Information Science, Nagoya Univ., JAPAN $ $ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ $ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 $ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. $ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 $ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー $ スコード中に含まれていること. $ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 $ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 $ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 $ の無保証規定を掲載すること. $ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 $ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ $ と. $ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 $ 作権表示,この利用条件および下記の無保証規定を掲載すること. $ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに $ 報告すること. $ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 $ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. $ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 $ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを $ 免責すること. $ $ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お $ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 $ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ $ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ $ の責任を負わない. $ $ $Id: kernel_check.tf 463 2015-10-18 14:25:55Z ertl-hiro $ $ $ $ コンフィギュレータのパス3のテンプレートファイル $ $ $ データセクションのLMAからVMAへのコピー $ $FOREACH lma LMA.ORDER_LIST$ $start_data = SYMBOL(LMA.START_DATA[lma])$ $end_data = SYMBOL(LMA.END_DATA[lma])$ $start_idata = SYMBOL(LMA.START_IDATA[lma])$ $IF !LENGTH(start_data)$ $ERROR$$FORMAT(_("symbol '%1%' not found"), LMA.START_DATA[lma])$$END$ $ELIF !LENGTH(end_data)$ $ERROR$$FORMAT(_("symbol '%1%' not found"), LMA.END_DATA[lma])$$END$ $ELIF !LENGTH(start_idata)$ $ERROR$$FORMAT(_("symbol '%1%' not found"), LMA.START_IDATA[lma])$$END$ $ELSE$ $BCOPY(start_idata, start_data, end_data - start_data)$ $END$ $END$ $ $ 通知情報のチェック関数 $ $tmax_tskid = PEEK(SYMBOL("_kernel_tmax_tskid"), sizeof_ID)$ $tmax_semid = PEEK(SYMBOL("_kernel_tmax_semid"), sizeof_ID)$ $tmax_flgid = PEEK(SYMBOL("_kernel_tmax_flgid"), sizeof_ID)$ $tmax_dtqid = PEEK(SYMBOL("_kernel_tmax_dtqid"), sizeof_ID)$ $FUNCTION CHECK_NFYHDR$ $ // パラメータを変数に格納 $nfymode = ARGV[1]$ $nfymode1 = nfymode & 0x0f$ $nfymode2 = nfymode & ~0x0f$ $exinf = ARGV[2]$ $nfyhdr = ARGV[3]$ $par1 = ARGV[4]$ $par2 = ARGV[5]$ $text_line = ARGV[8]$ $objid = ARGV[9]$ $apiname = ARGV[10]$ $funcname = CONCAT("_kernel_nfyhdr_", objid)$ $ // 通知処理のパラメータ数による補正処理 $IF nfymode1 == TNFY_SETVAR || nfymode1 == TNFY_SETFLG || nfymode1 == TNFY_SNDDTQ$ $ // 通知処理のパラメータが2つの場合 $epar1 = ARGV[6]$ $epar2 = ARGV[7]$ $ELSE$ $ // 通知処理のパラメータが1つの場合 $epar1 = ARGV[5]$ $epar2 = ARGV[6]$ $END$ $ // タイムイベントハンドラの先頭番地のチェック[NGKI3693] $IF nfymode == TNFY_HANDLER$ $tmehdr = nfyhdr$ $IF CHECK_FUNC_ALIGN && (tmehdr & (CHECK_FUNC_ALIGN - 1)) != 0$ $ERROR text_line$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "tmehdr", par2, objid, apiname)$ $END$ $END$ $IF CHECK_FUNC_NONNULL && tmehdr == 0$ $ERROR text_line$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"), "tmehdr", par2, objid, apiname)$ $END$ $END$ $END$ $ // イベント通知処理の変数の番地とオブジェクトIDのチェック $IF nfymode1 == TNFY_SETVAR || nfymode1 == TNFY_INCVAR$ $ // 変数の設定/インクリメントによるタイムイベントの通知 $p_var = exinf$ $ // 変数の番地のチェック[NGKI3699][NGKI3897] $IF CHECK_INTPTR_ALIGN && (p_var & (CHECK_INTPTR_ALIGN - 1)) != 0$ $ERROR text_line$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "p_var", par1, objid, apiname)$ $END$ $END$ $IF CHECK_INTPTR_NONNULL && p_var == 0$ $ERROR text_line$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"), "p_var", par1, objid, apiname)$ $END$ $END$ $ELIF nfymode1 == TNFY_ACTTSK || nfymode1 == TNFY_WUPTSK$ $ // タスクの起動/起床によるタイムイベントの通知 $tskid = exinf$ $ // タスクIDのチェック[NGKI3704] $IF !(TMIN_TSKID <= tskid && tskid <= tmax_tskid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskid", par1, objid, apiname)$ $END$ $END$ $ELIF nfymode1 == TNFY_SIGSEM$ $ // セマフォの資源の返却によるタイムイベントの通知 $semid = exinf$ $ // セマフォIDのチェック[NGKI3707] $IF !(TMIN_SEMID <= semid && semid <= tmax_semid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "semid", par1, objid, apiname)$ $END$ $END$ $ELIF nfymode1 == TNFY_SETFLG$ $ // イベントフラグのセットによるタイムイベントの通知 $flgid = exinf$ $ // イベントフラグIDのチェック[NGKI3710] $IF !(TMIN_FLGID <= flgid && flgid <= tmax_flgid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgid", par1, objid, apiname)$ $END$ $END$ $ELIF nfymode1 == TNFY_SNDDTQ$ $ // データキューへの送信によるタイムイベントの通知 $dtqid = exinf$ $ // データキューIDのチェック[NGKI3713] $IF !(TMIN_DTQID <= dtqid && dtqid <= tmax_dtqid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqid", par1, objid, apiname)$ $END$ $END$ $END$ $ // エラー通知処理の変数の番地とオブジェクトIDのチェック $IF nfymode2 == TENFY_SETVAR || nfymode2 == TENFY_INCVAR$ $ // 変数の設定/インクリメントによるエラーの通知 $p_var = PEEK(SYMBOL(CONCAT(funcname, "_p_evar")), sizeof_intptr_t)$ $ // 変数の番地のチェック[NGKI3701][NGKI3897] $IF CHECK_INTPTR_ALIGN && (p_var & (CHECK_INTPTR_ALIGN - 1)) != 0$ $ERROR text_line$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "p_var", epar1, objid, apiname)$ $END$ $END$ $IF CHECK_INTPTR_NONNULL && p_var == 0$ $ERROR text_line$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"), "p_var", epar1, objid, apiname)$ $END$ $END$ $ELIF nfymode2 == TENFY_ACTTSK || nfymode2 == TENFY_WUPTSK$ $ // タスクの起動/起床によるエラーの通知 $tskid = PEEK(SYMBOL(CONCAT(funcname, "_etskid")), sizeof_ID)$ $ // タスクIDのチェック[NGKI3704] $IF !(TMIN_TSKID <= tskid && tskid <= tmax_tskid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskid", epar1, objid, apiname)$ $END$ $END$ $ELIF nfymode2 == TENFY_SIGSEM$ $ // セマフォの資源の返却によるエラーの通知 $semid = PEEK(SYMBOL(CONCAT(funcname, "_esemid")), sizeof_ID)$ $ // セマフォIDのチェック[NGKI3707] $IF !(TMIN_SEMID <= semid && semid <= tmax_semid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "semid", epar1, objid, apiname)$ $END$ $END$ $ELIF nfymode2 == TENFY_SETFLG$ $ // イベントフラグのセットによるエラーの通知 $flgid = PEEK(SYMBOL(CONCAT(funcname, "_eflgid")), sizeof_ID)$ $ // イベントフラグIDのチェック[NGKI3710] $IF !(TMIN_FLGID <= flgid && flgid <= tmax_flgid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgid", epar1, objid, apiname)$ $END$ $END$ $ELIF nfymode2 == TENFY_SNDDTQ$ $ // データキューへの送信によるエラーの通知 $dtqid = PEEK(SYMBOL(CONCAT(funcname, "_edtqid")), sizeof_ID)$ $ // データキューIDのチェック[NGKI3715] $IF !(TMIN_DTQID <= dtqid && dtqid <= tmax_dtqid)$ $ERROR text_line$E_ID:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqid", epar1, objid, apiname)$ $END$ $END$ $END$ $END$ $ $ タスクに関するチェック $ $tinib = SYMBOL("_kernel_tinib_table")$ $FOREACH tskid TSK.ID_LIST$ $ // タスクの先頭番地のチェック[NGKI1033] $task = PEEK(tinib + offsetof_TINIB_task, sizeof_FP)$ $IF CHECK_FUNC_ALIGN && (task & (CHECK_FUNC_ALIGN - 1)) != 0$ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "task", TSK.TASK[tskid], tskid, "CRE_TSK")$ $END$ $END$ $IF CHECK_FUNC_NONNULL && task == 0$ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"), "task", TSK.TASK[tskid], tskid, "CRE_TSK")$ $END$ $END$ $ // タスクのスタック領域の先頭番地のチェック[NGKI1056] $IF USE_TSKINICTXB$ $stk = GET_STK_TSKINICTXB(tinib)$ $ELSE$ $stk = PEEK(tinib + offsetof_TINIB_stk, sizeof_void_ptr)$ $END$ $IF CHECK_STACK_ALIGN && (stk & (CHECK_STACK_ALIGN - 1)) != 0$ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stk", TSK.STK[tskid], tskid, "CRE_TSK")$ $END$ $END$ $IF CHECK_STACK_NONNULL && stk == 0$ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"), "stk", TSK.STK[tskid], tskid, "CRE_TSK")$ $END$ $END$ $tinib = tinib + sizeof_TINIB$ $END$ $ $ 周期通知に関するチェック $ $cycinib = SYMBOL("_kernel_cycinib_table")$ $FOREACH cycid CYC.ID_LIST$ $exinf = PEEK(cycinib + offsetof_CYCINIB_exinf, sizeof_intptr_t)$ $nfyhdr = PEEK(cycinib + offsetof_CYCINIB_nfyhdr, sizeof_FP)$ $ // 通知情報のチェック $CHECK_NFYHDR(CYC.NFYMODE[cycid], exinf, nfyhdr, CYC.PAR1[cycid], CYC.PAR2[cycid], CYC.PAR3[cycid], CYC.PAR4[cycid], CYC.TEXT_LINE[cycid], cycid, "CRE_CYC")$ $cycinib = cycinib + sizeof_CYCINIB$ $END$ $ $ アラーム通知に関するチェック $ $alminib = SYMBOL("_kernel_alminib_table")$ $FOREACH almid ALM.ID_LIST$ $exinf = PEEK(alminib + offsetof_ALMINIB_exinf, sizeof_intptr_t)$ $nfyhdr = PEEK(alminib + offsetof_ALMINIB_nfyhdr, sizeof_FP)$ $ // 通知情報のチェック $CHECK_NFYHDR(ALM.NFYMODE[almid], exinf, nfyhdr, ALM.PAR1[almid], ALM.PAR2[almid], ALM.PAR3[almid], ALM.PAR4[almid], ALM.TEXT_LINE[almid], almid, "CRE_ALM")$ $alminib = alminib + sizeof_ALMINIB$ $END$ $ $ オーバランハンドラに関するチェック $ $ovrinib = SYMBOL("_kernel_ovrinib")$ $IF LENGTH(OVR.ORDER_LIST)$ $ovrhdr = PEEK(ovrinib + offsetof_OVRINIB_ovrhdr, sizeof_FP)$ $ // オーバランハンドラの先頭番地のチェック[NGKI2613] $IF CHECK_FUNC_ALIGN && (ovrhdr & (CHECK_FUNC_ALIGN - 1)) != 0$ $ERROR OVR.TEXT_LINE[1]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' in %4% is not aligned"), "ovrhdr", OVR.OVRHDR[1], "DEF_OVR")$ $END$ $END$ $IF CHECK_FUNC_NONNULL && ovrhdr == 0$ $ERROR OVR.TEXT_LINE[1]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' in %3% is null"), "ovrhdr", OVR.OVRHDR[1], "DEF_OVR")$ $END$ $END$ $END$ $ $ 固定長メモリプールに関するチェック $ $mpfinib = SYMBOL("_kernel_mpfinib_table")$ $FOREACH mpfid MPF.ID_LIST$ $mpf = PEEK(mpfinib + offsetof_MPFINIB_mpf, sizeof_void_ptr)$ $ // 固定長メモリプール領域の先頭番地のチェック[NGKI2249] $IF CHECK_MPF_ALIGN && (mpf & (CHECK_MPF_ALIGN - 1)) != 0$ $ERROR MPF.TEXT_LINE[mpfid]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$ $END$ $END$ $IF CHECK_MPF_NONNULL && mpf == 0$ $ERROR MPF.TEXT_LINE[mpfid]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"), "mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$ $END$ $END$ $mpfinib = mpfinib + sizeof_MPFINIB$ $END$ $ $ 非タスクコンテキスト用のスタック領域に関するチェック $ $istk = PEEK(SYMBOL("_kernel_istk"), sizeof_void_ptr)$ $ 非タスクコンテキスト用のスタック領域の先頭番地のチェック[NGKI3222] $IF CHECK_STACK_ALIGN && (istk & (CHECK_STACK_ALIGN - 1)) != 0$ $ERROR ICS.TEXT_LINE[1]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istk", ICS.ISTK[1], "DEF_ICS")$ $END$ $END$ $IF CHECK_STACK_NONNULL && istk == 0$ $ERROR ICS.TEXT_LINE[1]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' in %3% is null"), "istk", ICS.ISTK[1], "DEF_ICS")$ $END$ $END$