$ $ TOPPERS/ASP Kernel $ Toyohashi Open Platform for Embedded Real-Time Systems/ $ Advanced Standard Profile Kernel $ $ Copyright (C) 2007 by TAKAGI Nobuhisa $ Copyright (C) 2007-2014 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: task.tf 480 2016-01-03 07:37:12Z ertl-hiro $ $ $ $ タスク管理モジュールのテンプレートファイル $ $ $ kernel_cfg.hの生成 $ $FILE "kernel_cfg.h.new"$ #define TNUM_TSKID $LENGTH(TSK.ID_LIST)$$NL$ $FOREACH id TSK.ID_LIST$ #define $id$ $+id$$NL$ $END$ $ $ kernel_cfg.cの生成 $ $FILE "kernel_cfg.c"$ /*$NL$ $SPC$* Task Management Functions$NL$ $SPC$*/$NL$ $NL$ $ $ タスクのID番号を保持する変数 $ $IF USE_EXTERNAL_ID$ $FOREACH id TSK.ID_LIST$ const ID $id$_id = $+id$;$NL$ $END$$NL$ $END$ $ $ タスクが1つも登録されていない場合[NGKI0033] $ $IF !LENGTH(TSK.ID_LIST)$ $ERROR$$FORMAT(_("no task is registered"))$$END$ $END$ $ $ タスクID番号の最大値 $ const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);$NL$ $NL$ $ $ エラーチェック $ $FOREACH tskid TSK.ID_LIST$ $ // tskatrが無効の場合(E_RSATR)[NGKI1028] $ //(TA_ACT,TA_NOACTQUE,TA_RSTR,TARGET_TSKATR以外のビットがセット $ // されている場合) $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TA_NOACTQUE|TA_RSTR|TARGET_TSKATR)) != 0$ $ERROR TSK.TEXT_LINE[tskid]$E_RSATR:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$ $END$ $END$ $ // (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合[NGKI1034] $IF !(TMIN_TPRI <= TSK.ITSKPRI[tskid] && TSK.ITSKPRI[tskid] <= TMAX_TPRI)$ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$ $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "itskpri", TSK.ITSKPRI[tskid], tskid, "CRE_TSK")$ $END$ $END$ $END$ $ $ スタック領域に関するエラーチェック $ $FOREACH tskid TSK.ID_LIST$ $ // stkszが0以下か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも $ // 小さい場合[NGKI1042] $IF TSK.STKSZ[tskid] <= 0 || (TARGET_MIN_STKSZ && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$ $FORMAT(_("too small %1% `%2%\' of `%3%\' in %4%"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$ $END$ $END$ $ // stkszがスタック領域のサイズとして正しくない場合[NGKI1056] $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:$SPC$ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$ $END$ $END$ $END$ $ $ スタック領域の生成 $ $FOREACH tskid TSK.ID_LIST$ $ // スタック領域の設定[NGKI1041] $IF EQ(TSK.STK[tskid],"NULL")$ $IF (TSK.TSKATR[tskid] & TA_RSTR) == 0$ $ // スタック領域の生成[NGKI1049] $ // 大きい方に丸めたサイズで確保する[NGKI1050] $TSK.TINIB_STKSZ[tskid] = ALLOC_STACK(CONCAT("_kernel_stack_", tskid), TSK.STKSZ[tskid])$ $TSK.TINIB_STK[tskid] = CONCAT("_kernel_stack_", tskid)$ $ELSE$ $ // 制約タスクのスタック領域の設定[NGKI1052] $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$ $TSK.TINIB_STK[tskid] = CONCAT("_kernel_shared_stack_", +TSK.ITSKPRI[tskid])$ $ // 制約タスク用の共有スタックのサイズを求める[NGKI1053] $IF !LENGTH(shared_stack_size[TSK.ITSKPRI[tskid]]) || shared_stack_size[TSK.ITSKPRI[tskid]] < TSK.STKSZ[tskid]$ $shared_stack_size[TSK.ITSKPRI[tskid]] = TSK.STKSZ[tskid]$ $END$ $END$ $ELSE$ $TSK.TINIB_STKSZ[tskid] = FORMAT("(%1%)", TSK.STKSZ[tskid])$ $TSK.TINIB_STK[tskid] = FORMAT("(void *)(%1%)", TSK.STK[tskid])$ $END$ $END$ $ 制約タスク用の共有スタック領域の生成[NGKI1052][NGKI1053] $FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$ $IF LENGTH(shared_stack_size[tskpri])$ $RESULT = ALLOC_STACK(CONCAT("_kernel_shared_stack_", tskpri), shared_stack_size[tskpri])$ $END$ $END$ $NL$ $ $ タスク初期化ブロックの生成(タスクは1個以上存在する) $ const TINIB _kernel_tinib_table[TNUM_TSKID] = {$NL$ $JOINEACH tskid TSK.ID_LIST ",\n"$ $TAB${$SPC$ $ // タスク属性,拡張情報,起動番地,起動時優先度 ($TSK.TSKATR[tskid]$),$SPC$ (intptr_t)($TSK.EXINF[tskid]$),$SPC$ (TASK)($TSK.TASK[tskid]$),$SPC$ INT_PRIORITY($TSK.ITSKPRI[tskid]$),$SPC$ $ // タスク初期化コンテキストブロック,スタック領域 $IF USE_TSKINICTXB$ $GENERATE_TSKINICTXB(tskid)$ $ELSE$ $TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$ $END$$SPC$ }$END$$NL$ };$NL$ $NL$ $ $ タスク生成順序テーブルの生成 $ const ID _kernel_torder_table[TNUM_TSKID] = {$NL$ $TAB$$JOINEACH tskid TSK.ORDER_LIST ", "$$tskid$$END$$NL$ };$NL$ $NL$ $ $ タスク管理ブロックの生成 $ TCB _kernel_tcb_table[TNUM_TSKID];$NL$ $NL$ $ $ タスク管理モジュール初期化関数 $ $initfuncs = "_kernel_initialize_task();"$