PACKAGE asp
-VERSION 1.6.0
+VERSION 1.7.0
configure
MANIFEST
kernel/eventflag.h
kernel/exception.c
kernel/exception.h
+kernel/genoffset.tf
kernel/interrupt.c
kernel/interrupt.h
kernel/kernel.tf
- TOPPERS/ASP Kernel(Release 1.6.0)
+ TOPPERS/ASP Kernel(Release 1.7.0)
Toyohashi Open Platform for Embedded Real-Time Systems/
Advanced Standard Profile Kernel
【今後の改造計画】
-今後(Release 1.7以降),ASPカーネルに対して大きな変更の可能性がある項
+今後(Release 1.8以降),ASPカーネルに対して大きな変更の可能性がある項
目は次の通りです.
・TOPPERS組込みコンポーネントシステム(TECS)の導入.現時点では,TECSの
$IF excno == 11$
$TAB$(FP)(_kernel_svc_handler), // 11 SVCall handler
$ELSE$
- $TAB$(FP)(_kernel_exc_entry),
+ $TAB$(FP)(_kernel_exc_entry_point),
$END$
$SPC$$FORMAT("/* %d */", +excno)$$NL$
$END$
$IF LENGTH(INH.INHNO[inhno]) && (INT.INTPRI[inhno] < TIPM_LOCK)$
$TAB$(FP)($INH.INTHDR[inhno]$),
$ELSE$
- $TAB$(FP)(_kernel_int_entry),
+ $TAB$(FP)(_kernel_int_entry_point),
$END$
$SPC$$FORMAT("/* %d */", +inhno)$$NL$
$END$
/*
* CPU例外エントリ(prc_support.S)
*/
-extern void exc_entry(void);
+extern void exc_entry_point(void);
/*
* 割込みエントリ(prc_support.S)
*/
-extern void int_entry(void);
+extern void int_entry_point(void);
/*
* プロセッサ依存の初期化
bitpat_cfgint
# prc_support.S
-int_entry
-exc_entry
+int_entry_point
+exc_entry_point
ret_int
ret_exc
svc_handler
/*
* prc_support.S
*/
-#define int_entry _kernel_int_entry
-#define exc_entry _kernel_exc_entry
+#define int_entry_point _kernel_int_entry_point
+#define exc_entry_point _kernel_exc_entry_point
#define ret_int _kernel_ret_int
#define ret_exc _kernel_ret_exc
#define svc_handler _kernel_svc_handler
/*
* prc_support.S
*/
-#define _int_entry __kernel_int_entry
-#define _exc_entry __kernel_exc_entry
+#define _int_entry_point __kernel_int_entry_point
+#define _exc_entry_point __kernel_exc_entry_point
#define _ret_int __kernel_ret_int
#define _ret_exc __kernel_ret_exc
#define _svc_handler __kernel_svc_handler
.align 2
.syntax unified
.code 16
- .global exc_entry
- .type exc_entry, function
-exc_entry:
+ .global exc_entry_point
+ .type exc_entry_point, function
+exc_entry_point:
/*
* 例外/割込みが発生すると,発生時にアクティブなスタックにスクラ
* ッチレジスタ等が保存される.
.align 2
.syntax unified
.code 16
- .global int_entry
- .type int_entry, function
-int_entry:
+ .global int_entry_point
+ .type int_entry_point, function
+int_entry_point:
/*
* 割込み発生時の割込み優先度マスクをスタックに保存するため取得
*/
/*
* prc_support.S
*/
-#undef int_entry
-#undef exc_entry
+#undef int_entry_point
+#undef exc_entry_point
#undef ret_int
#undef ret_exc
#undef svc_handler
/*
* prc_support.S
*/
-#undef _int_entry
-#undef _exc_entry
+#undef _int_entry_point
+#undef _exc_entry_point
#undef _ret_int
#undef _ret_exc
#undef _svc_handler
prc_cfg1_out.h
prc_config.c
prc_config.h
+prc_def.csv
prc_insn.h
prc_kernel.h
+prc_offset.tf
prc_rename.def
prc_rename.h
prc_sil.h
#
-# @(#) $Id: Makefile.prc 304 2007-07-16 07:50:38Z hiro $
-#
-
-#
-# Makefile のプロセッサ依存部(M68040用)
+# Makefileのプロセッサ依存部(M68040用)
#
#
GCC_TARGET = m68k-unknown-elf
#
+# プロセッサ依存部ディレクトリ名の定義
+#
+PRCDIR = $(SRCDIR)/arch/$(PRC)_$(TOOL)
+
+#
# コンパイルオプション
#
COPTS := $(COPTS) -m68020-40 -msoft-float
#
# カーネルに関する定義
#
-KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/$(PRC)_$(TOOL)
+KERNEL_DIR := $(KERNEL_DIR) $(PRCDIR)
KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) prc_support.o
KERNEL_COBJS := $(KERNEL_COBJS) prc_config.o
+
+#
+# コンフィギュレータ関係の変数の定義
+#
+CFG_TABS := $(CFG_TABS) --cfg1-def-table $(PRCDIR)/prc_def.csv
+
+#
+# オフセットファイル生成のための定義
+#
+OFFSET_TF = $(PRCDIR)/prc_offset.tf
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: makeoffset.c 1840 2010-07-10 17:29:42Z ertl-hiro $
+ * @(#) $Id: makeoffset.c 2048 2011-04-03 02:36:03Z ertl-hiro $
*/
#include "kernel_impl.h"
false, /* acqeue */
false, /* wupque */
true, /* enatex */
- 0U, /* texprn */
+ 0U, /* texptn */
NULL, /* p_winifo */
#ifdef TOPPERS_SUPPORT_MUTEX
{ NULL, NULL }, /* mutex_queue */
#endif /* TOPPERS_SUPPORT_MUTEX */
#ifdef TOPPERS_SUPPORT_OVRTIM
0U, /* leftotm */
-#endif TOPPERS_SUPPORT_OVRTIM
+#endif /* TOPPERS_SUPPORT_OVRTIM */
{ NULL, NULL } /* tskctxb */
};
/*
- * @(#) $Id: prc_cfg1_out.h 930 2008-04-14 07:33:19Z ertl-hiro $
- */
-
-/*
* cfg1_out.cのリンクに必要なスタブの定義
*/
const SIZE _kernel_istksz = 0;
STK_T *const _kernel_istk = NULL;
+
+/*
+ * オフセットファイルを生成するための定義
+ */
+const uint8_t MAGIC_1 = 0x12;
+const uint16_t MAGIC_2 = 0x1234;
+const uint32_t MAGIC_4 = 0x12345678;
+
+const TCB TCB_enatex = {
+ { NULL, NULL }, /* task_queue */
+ NULL, /* p_tinib */
+ 0U, /* tstat */
+#ifdef TOPPERS_SUPPORT_MUTEX
+ 0U, /* bpriority */
+#endif /* TOPPERS_SUPPORT_MUTEX */
+ 0U, /* priority */
+ false, /* acqeue */
+ false, /* wupque */
+ true, /* enatex */
+ 0U, /* texptn */
+ NULL, /* p_winifo */
+#ifdef TOPPERS_SUPPORT_MUTEX
+ { NULL, NULL }, /* mutex_queue */
+#endif /* TOPPERS_SUPPORT_MUTEX */
+#ifdef TOPPERS_SUPPORT_OVRTIM
+ 0U, /* leftotm */
+#endif /* TOPPERS_SUPPORT_OVRTIM */
+ { NULL, NULL } /* tskctxb */
+};
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: prc_config.h 1766 2010-02-21 07:02:24Z ertl-hiro $
+ * $Id: prc_config.h 2013 2010-12-31 12:47:36Z ertl-hiro $
*/
/*
* CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
*
* CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
- * ã\83³ã\83\86ã\82ã\82¹ã\83\88ã\81§ã\81\82ã\82\8aï¼\8cå\89²è¾¼ã\81¿ã\83ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cCPUã\83ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cï¼\88ã\83¢
- * デル上の)割込み優先度マスク全解除状態である時にtrue,そうでない時
- * にfalseを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
- * ã\81«ã\82\82falseã\82\92è¿\94ã\81\99ï¼\89ï¼\8e
+ * ã\83³ã\83\86ã\82ã\82¹ã\83\88ã\81§ã\81\82ã\82\8aï¼\8cå\85¨å\89²è¾¼ã\81¿ã\83ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cCPUã\83ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\8fï¼\8cå\89²
+ * 込み優先度マスク全解除状態である時にtrue,そうでない時にfalseを返す
+ * (CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返
+ * す).
*
* M68040では,CPU例外の発生した時のIPM(ハードウェアの割込み優先度マ
* スク)がすべての割込みを許可する状態であることをチェックすることで,
- * ã\82«ã\83¼ã\83\8dã\83«å®\9fè¡\8cä¸ã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cå\89²è¾¼ã\81¿ã\83ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cCPUã\83ã\83\83ã\82¯ç\8a¶æ\85\8b
- * でないこと,(モデル上の)割込み優先度マスク全解除状態であることの
- * 4つの条件をチェックすることができる(CPU例外が発生した時の
- * lock_flagを参照する必要はない).
+ * ã\82«ã\83¼ã\83\8dã\83«å®\9fè¡\8cä¸ã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cå\85¨å\89²è¾¼ã\81¿ã\83ã\83\83ã\82¯ç\8a¶æ\85\8bã\81§ã\81ªã\81\84ã\81\93ã\81¨ï¼\8cCPUã\83ã\83\83ã\82¯ç\8a¶
+ * 態でないこと,割込み優先度マスク全解除状態であることの4つの条件を
+ * チェックすることができる(CPU例外が発生した時のlock_flagを参照する
+ * 必要はない).
*/
Inline bool_t
exc_sense_intmask(void *p_excinf)
}
/*
- * CPU例外の発生した時のコンテキストと割込み/CPUロック状態の参照
- *
- * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
- * ンテキストであり,割込みロック状態でなく,CPUロック状態でない時に
- * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処
- * 理中で発生した場合にもfalseを返す).
- *
- * ただし,ターゲット定義で,(モデル上の)割込み優先度マスクが
- * TMIN_INTPRIと同じかそれよりも高い状態で発生したCPU例外をカーネル管
- * 理外のCPU例外と扱うこととし,それに対してfalseを返すこととしてもよ
- * い.
- *
- * M68040では,このターゲット定義の規定を採用する.これにより,CPU例外
- * の発生した時のIPM(ハードウェアの割込み優先度マスク)がTMIN_INTPRI
- * より低いことをチェックすることで,カーネル実行中でないこと,割込み
- * ロック状態でないこと,CPUロック状態でないことの3つの条件をチェック
- * することができる(CPU例外が発生した時のlock_flagは参照していない).
- */
-Inline bool_t
-exc_sense_unlock(void *p_excinf)
-{
- return(!exc_sense_context(p_excinf)
- && exc_get_iipm(p_excinf) < INT_IPM(TMIN_INTPRI));
-}
-
-/*
* プロセッサ依存の初期化
*/
extern void prc_initialize(void);
--- /dev/null
+sizeof_TCB,sizeof(TCB)
+offsetof_TCB_p_tinib,"offsetof(TCB,p_tinib)"
+offsetof_TCB_texptn,"offsetof(TCB,texptn)"
+offsetof_TCB_msp,"offsetof(TCB,tskctxb.msp)"
+offsetof_TCB_pc,"offsetof(TCB,tskctxb.pc)"
--- /dev/null
+$
+$ オフセットファイル生成用テンプレートファイル(M68040用)
+$
+
+$
+$ 標準テンプレートファイルのインクルード
+$
+$INCLUDE "kernel/genoffset.tf"$
+
+$
+$ オフセット値のマクロ定義の生成
+$
+$DEFINE("TCB_p_tinib", offsetof_TCB_p_tinib)$
+$DEFINE("TCB_texptn", offsetof_TCB_texptn)$
+$DEFINE("TCB_msp", offsetof_TCB_msp)$
+$DEFINE("TCB_pc", offsetof_TCB_pc)$
+
+$DEFINE("TINIB_exinf", offsetof_TINIB_exinf)$
+$DEFINE("TINIB_task", offsetof_TINIB_task)$
+
+$
+$ ビットオフセット値等のマクロ定義の生成
+$
+$DEFINE_BIT("TCB_enatex", sizeof_TCB, "B")$
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: prc_support.S 1766 2010-02-21 07:02:24Z ertl-hiro $
+ * $Id: prc_support.S 2015 2010-12-31 13:05:04Z ertl-hiro $
*/
/*
movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */
btst.b #TCB_enatex_bit, TCB_enatex(%a0)
jbeq dispatch_r_1 /* enatexがfalseならリターン */
- tst.l TCB_texptn(%a0) /* texptnが0でなければ */
+ tst.l TCB_texptn(%a0) /* texptnが0ならリターン */
+ jbeq dispatch_r_1
+ tst.l ipmflg /* ipmflgがtrueであれば */
jbne call_texrtn /* タスク例外処理ルーチンの呼出し */
dispatch_r_1:
rts
*/
clr.l reqflg /* reqflgをfalseに */
/*
- * CPUロック状態に移行する.カーネル管理の割込みはすでに禁止して
- * いるので,lock_flagとsaved_iipmを更新する.saved_iipmは,戻り
- * 先の割込み優先度マスク(の内部表現)に設定する.
+ * CPUロック状態に移行し,割込み優先度マスクを割込み処理前の値に設
+ * 定する.カーネル管理の割込みはすでに禁止しているので,lock_flag
+ * とsaved_iipmを更新する.saved_iipmは,戻り先の割込み優先度マス
+ * ク(の内部表現)に設定する.
*
* この時点でCPUロック状態とするのは,dispatcherへ分岐する時と,
* call_texrtnを呼び出す時に,CPUロック状態になっている必要がある
movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */
ret_int_4:
/*
- * enatexã\81\8ctrueã\81§ï¼\8ctexptnã\81\8c0ã\81§ã\81ªã\81\91ã\82\8cã\81°ï¼\8cã\82¿ã\82¹ã\82¯ä¾\8bå¤\96å\87¦ç\90\86ã\83«ã\83¼ã\83\81ã\83³ã\82\92
- * 呼び出す.
+ * enatexã\81\8ctrueã\81§ï¼\8ctexptnã\81\8c0ã\81§ã\81ªã\81\8fï¼\8cipmflgã\81\8ctrueã\81§ã\81\82ã\82\8cã\81°ï¼\8cã\82¿ã\82¹ã\82¯
+ * 例外処理ルーチンを呼び出す.
*/
btst.b #TCB_enatex_bit, TCB_enatex(%a0)
jbeq ret_int_5 /* enatexがfalseならret_int_5へ */
tst.l TCB_texptn(%a0) /* texptnが0ならret_int_5へ */
jbeq ret_int_5
+ tst.l ipmflg /* ipmflgがfalseならret_int_5へ */
+ jbeq ret_int_5
jsr call_texrtn /* タスク例外処理ルーチンの呼出し */
ret_int_5:
/*
PACKAGE cfg
-VERSION 1.6.0
+VERSION 1.7.0
cfg.sln
configure
- TOPPERS新世代カーネル用コンフィギュレータ(Release 1.6.0)
+ TOPPERS新世代カーネル用コンフィギュレータ(Release 1.7.0)
TOPPERS新世代カーネル用コンフィギュレータは、カーネルやソフトウェア部品
あります(コンフィギュレータをバイナリで入手した場合には、このステップ
は必要はありません)。
コンフィギュレータの構築にはBoost C++ Libraries 1.42.0以上が必要です。
+また、開発時点でのBoost C Librariesの最新版は1.46.0であり、それ以降の
+バージョンについては動作確認を行っていません(まだ無いので行えません)。
Boost C++ Librariesは、下記URLから入手することができます。
http://www.boost.org/
Boost C++ Librariesをバイナリで入手できない場合には、ソースからビルドし
てください。
+・動作確認済みの環境
+Windows 7 Home Premium(x64) SP1 + Cygwin 1.7.8-1 + GCC 4.3.4 + Boost 1.43.0
+Windows 7 Home Premium(x64) SP1 + MinGW GCC 4.5.2 + Boost 1.46.0
+Windows 7 Home Premium(x64) SP1 + MinGW64 GCC 4.5.1 + Boost 1.46.0
+Windows Vista Home Premium SP2 + Cygwin 1.7.7-1 + GCC 4.3.4 + Boost 1.43.0
+Windows Vista Home Premium SP2 + Visual Studio 2008 SP1 + Boost 1.44.0
+Windows Vista Home Premium SP2 + Visual Studio 2010 + Boost 1.44.0
+Windows XP Professional SP3 + Cygwin 1.7.7-1 + GCC 4.3.4 + Boost 1.43.0
+Windows XP Professional SP3 + Visual C++ 2010 + Boost 1.44.0
+Windows XP Professional SP3 + Visual C++ 2005 SP2 + Boost 1.44.0
+Windows XP Professional SP3 + Visual C++.net 2003 SP1 + Boost 1.44.0
+Windows XP Professional SP3 + Visual C++.net 2003 SP1 + Boost 1.43.0
+Linux Ubuntu 10.10 + GCC 4.4.5 + Boost 1.42.0a
+Mac OSX 10.6.6 + GCC 4.2.1 + Boost 1.45.0
+
+
=== GNU開発環境を用いる場合 ===
コンフィギュレータ(cfgプログラム)を構築するには、cfgディレクトリに移動
Boost C++ Librariesをインストールした後、インクルードおよびライブラリの
ディレクトリをVisual Studioに登録してからビルドを実行してください。
+Visual Studio 2010からはプロジェクトごとにディレクトリを登録するように
+仕様変更されているので注意してください。
Visual C++ 2005 Express Editionを使用する場合、別途Platform SDKをインス
トールする必要があります。
+複数のバージョンのBoost C++ Librariesがインストールされている場合(中途
+半端に案インストールされた場合を含む)、configureに失敗する可能性があり
+ます。その場合は手作業でMakefile.configを修正してください。
+
+【Mekefile.configの説明】
+
+configureコマンドによって生成されるMakefile.configでは次のパラメータが
+定義されます。
+
+・LIBBOOST_SUFFIX
+Boost C+ Librariesのライブラリファイルのサフィックス
+たとえば、ライブラリファイルがlibboost_system-mt.aのような形式であれば、
+LIBBOOST_SUFFIXには-mtが設定されます。
+
+・BOOST_VERSION
+Boost C++ Librariesのバージョン
+バージョン1.43.0であれば、BOOST_VERSIONには1_43が設定されます。
+
+・BOOST_DIR=/usr/include
+Boost C++ Librariesのヘッダファイルがあるディレクトリ
+自分でBoost C++ Librariesをインストールした場合、通常/usr/local/include
+が設定されます。
+
+・LIBBOOST_DIR
+Boost C++ Librariesのライブラリファイルがあるディレクトリ
+自分でBoost C++ Librariesをインストールした場合、通常/usr/local/libが設定
+されます。
+
+・OPTIONS
+コンパイラの追加オプション
+普通は何も設定されません。
【コンフィギュレータの使い方】
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
// テンプレート処理
boost::any template_file( global( "template-file" ) );
namespace fs = boost::filesystem;
- fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+// fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+ fs::path cfg_dir( get_global< std::string >( "cfg-directory" ) ); // filesystem3対応
std::vector< std::string > include_paths = get_global< std::vector< std::string > >( "include-path" );
- include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+// include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+ include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.string() ); // filesystem3対応
if ( !template_file.empty() )
{
toppers::text in_text;
fs::path kernel_cfg_template_file( cfg_dir/fs::path( "../../kernel/kernel.tf" ) );
if ( !fs::exists( kernel_cfg_template_file ) )
{
- error( _( "cannot open file `%1%\'" ), kernel_cfg_template_file.native_file_string() );
+// error( _( "cannot open file `%1%\'" ), kernel_cfg_template_file.native_file_string() );
+ error( _( "cannot open file `%1%\'" ), kernel_cfg_template_file.string() ); // filesystem3対応
}
else
{
toppers::text in_text;
toppers::text pp_text;
- in_text.set_line( kernel_cfg_template_file.native_file_string(), 1 );
- std::ifstream ifs( kernel_cfg_template_file.native_file_string().c_str() );
+// in_text.set_line( kernel_cfg_template_file.native_file_string(), 1 );
+ in_text.set_line( kernel_cfg_template_file.string(), 1 ); // filesystem3対応
+// std::ifstream ifs( kernel_cfg_template_file.native_file_string().c_str() );
+ std::ifstream ifs( kernel_cfg_template_file.string().c_str() ); // filesystem3対応
in_text.append( ifs );
macro_processor::preprocess( in_text, pp_text );
mproc->evaluate( pp_text );
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
mproc->add_builtin_function( func_info );
// ↑ 追加組み込み関数の登録
- fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+// fs::path cfg_dir( get_global< std::string >( "cfg-directory" ), fs::native );
+ fs::path cfg_dir( get_global< std::string >( "cfg-directory" ) ); // filesystem3対応
std::vector< std::string > include_paths = get_global< std::vector< std::string > >( "include-path" );
- include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+// include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.native_file_string() );
+ include_paths.push_back( cfg_dir.empty() ? "." : cfg_dir.string() ); // filesystem3対応
toppers::text in_text;
toppers::text pp_text;
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
#include <sys/stat.h>
//! cfgのバージョン情報
-extern char const cfg_version[] = "1.6.0";
+extern char const cfg_version[] = "1.7.0";
/*!
* \brief プログラムファイル(cfg or cfg.exe)のタイムスタンプを取得する。
echo " specify the directory of Boost headers"
echo "--with-libraries=<dir>"
echo " specify the directory of Boost libraries"
+ exit
;;
esac
done
libboost_suffix=`echo $libboost_regex_filename | sed -e s/.*libboost_regex//g -e s/\.[a-z]*$//g`
echo "LIBBOOST_SUFFIX=$libboost_suffix" >> $makefile_config
-options=`echo "#if defined(__x86_64) && defined(__APPLE__)
--m32
-#endif" | g++ -E -x c++ - | grep m32`
-
# 各種変数を出力
echo BOOST_VERSION=$boost_lib_version >> $makefile_config
echo BOOST_DIR=$include_path >> $makefile_config
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
* の責任を負わない.
*
*/
+#include <cstdio>
#include <cstdlib>
#include <cerrno>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>
-#include <ostream>
+#include <iostream>
#include "toppers/macro_processor.hpp"
#include "toppers/diagnostics.hpp"
#include "toppers/gettext.hpp"
#include <boost/format.hpp>
#include <boost/utility.hpp>
#include <boost/lexical_cast.hpp>
-#include <cstdio>
+#include <boost/xpressive/xpressive.hpp>
namespace toppers
{
var_t bf_concat( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
{
element e;
- if ( macro_processor::check_arity( line, arg_list.size(), 2, "CAT" ) )
+ if ( macro_processor::check_arity( line, arg_list.size(), 2, "CONCAT" ) )
{
e.s = get_s( arg_list[ 0 ], p_ctx ) + get_s( arg_list[ 1 ], p_ctx );
}
* \param[in] arg_list マクロ実引数リスト
* \param[in] p_ctx マクロコンテキスト
* \retval マクロ返却値
- * 第1マクロ実引数と第2マクロ実引数を連結して新しい順序付きリストを生成する。
+ * 第1マクロ実引数と第2マクロ実引数以降を連結して新しい順序付きリストを生成する。
*/
var_t bf_append( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
{
var_t result;
- if ( macro_processor::check_arity( line, arg_list.size(), 2, "APPEND" ) )
- {
- result = arg_list[ 0 ];
- result.insert( result.end(), arg_list[ 1 ].begin(), arg_list[1].end() );
- }
+ var_t::size_type const n = arg_list.size();
+ if ( n < 2 )
+ {
+ error( line, _( "too few arguments for `%1%\'" ), "APPEND" );
+ }
+ else
+ {
+ result = arg_list[ 0 ];
+ for ( var_t::size_type i = 1; i < n; i++)
+ {
+ result.insert( result.end(), arg_list[ i ].begin(), arg_list[ i ].end() );
+ }
+ }
return result;
}
var_t bf_at( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
{
element e;
- if ( macro_processor::check_arity( line, arg_list.size(), 2, "CAT" ) )
+ if ( macro_processor::check_arity( line, arg_list.size(), 2, "AT" ) )
{
try
{
if ( macro_processor::check_arity( line, arg_list.size(), 2, "FIND" ) )
{
var_t list( arg_list[ 0 ] );
- std::tr1::int64_t value( get_i( arg_list[ 1 ], p_ctx ) );
- for ( var_t::const_iterator iter( list.begin() ), last( list.end() ); iter != last; ++iter )
- {
- if ( iter->i.get() == value ) // 発見!
+ if ( !arg_list[ 1 ].empty() )
+ {
+ element key( arg_list[ 1 ].front() );
+
+ if ( !key.i ) // 整数値が設定されていなければ...
{
- e.i = iter - list.begin(); // iter は RandomAccessIterator
- return var_t( 1, e );
+ std::string value( key.s );
+
+ for ( var_t::const_iterator iter( list.begin() ), last( list.end() ); iter != last; ++iter )
+ {
+ if ( iter->s == value ) // 発見!
+ {
+ e.i = iter - list.begin(); // iter は RandomAccessIterator
+ return var_t( 1, e );
+ }
+ }
}
- }
+ else
+ {
+ std::tr1::int64_t value( key.i.get() );
+
+ for ( var_t::const_iterator iter( list.begin() ), last( list.end() ); iter != last; ++iter )
+ {
+ if ( iter->i && iter->i.get() == value ) // 発見!
+ {
+ e.i = iter - list.begin(); // iter は RandomAccessIterator
+ return var_t( 1, e );
+ }
+ }
+ }
+ }
}
return var_t();
}
if ( macro_processor::check_arity( line, arg_list.size(), 1, "UNESCSTR" ) )
{
std::string str( get_s( arg_list[ 0 ], p_ctx ) );
- e.s = expand_quote( str );
+ if ( !str.empty() )
+ {
+ e.s = expand_quote( str );
+ }
}
return var_t( 1, e );
}
arg_list.push_back( var_t( 1, e ) );
arg_list.push_back( var_t( 1, lhs ) );
arg_list.push_back( var_t( 1, rhs ) );
- int arg1 = static_cast< int >( *lhs.i );
- int arg2 = static_cast< int >( *rhs.i );
+ int arg1 = static_cast< int >( *lhs.i );
+ int arg2 = static_cast< int >( *rhs.i );
var_t r = bf_call( line_, arg_list, p_ctx_ );
bool result = 0;
if ( !r.empty() )
{
- int retval = static_cast< int >( *r.front().i );
+ int retval = static_cast< int >( *r.front().i );
result = ( *r.front().i < 0 );
}
return result;
return result;
}
+ /*!
+ * \brief 正規表現を用いた置換
+ * \param[in] line 行番号
+ * \param[in] arg_list マクロ実引数リスト
+ * \param[in] p_ctx マクロコンテキスト
+ * \retval マクロ返却値
+ * 第1マクロ実引数で指定した文字列のうち、第2マクロ実引数で指定した正規表現にマッチする箇所を第3マクロ実引数の内容で置換する。
+ * 正規表現はECMAScript互換とする。
+ */
+ var_t bf_regex_replace( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
+ {
+ element e;
+ if ( macro_processor::check_arity( line, arg_list.size(), 3, "REGEX_REPLACE" ) )
+ {
+ e.s = boost::xpressive::regex_replace( get_s( arg_list[ 0 ], p_ctx ),
+ boost::xpressive::sregex::compile( get_s( arg_list[ 1 ], p_ctx ) ),
+ get_s( arg_list[ 2 ], p_ctx ) );
+ }
+ return var_t( 1, e );
+ }
+
+ /*!
+ * \brief 配列の全削除
+ * \param[in] line 行番号
+ * \param[in] arg_list マクロ実引数リスト
+ * \param[in] p_ctx マクロコンテキスト
+ * \retval マクロ返却値
+ * 第1マクロ実引数で指定した名前の配列を全削除する。
+ */
+ var_t bf_clean( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
+ {
+ element e;
+ if ( macro_processor::check_arity( line, arg_list.size(), 1, "CLEAN" ) )
+ {
+ std::string name = get_s( arg_list[ 0 ], p_ctx ) + "[";
+ for ( std::map< std::string, var_t >::iterator it = p_ctx->var_map.lower_bound( name );
+ it != p_ctx->var_map.end();
+ ++it )
+ {
+ if ( std::strncmp( it->first.c_str(), name.c_str(), name.size() ) != 0 )
+ break;
+ it->second = var_t();
+ }
+ }
+ return var_t( 1, e );
+ }
+
+ /*!
+ * \brief マクロプロセッサの終了
+ * \param[in] line 行番号
+ * \param[in] arg_list マクロ実引数リスト
+ * \param[in] p_ctx マクロコンテキスト
+ * \retval マクロ返却値
+ * マクロプロセッサを終了する。
+ */
+ var_t bf_die( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx )
+ {
+ element e;
+ if ( macro_processor::check_arity( line, arg_list.size(), 0, "DIE" ) )
+ {
+ throw macro_processor::die_terminate();
+ }
+ return var_t( 1, e );
+ }
+
/*!
* \brief 何もしない組み込み関数
* \param[in] line 行番号
{ "LSORT", bf_lsort },
{ "ISFUNCTION", bf_isfunction },
{ "REVERSE", bf_reverse },
+ { "REGEX_REPLACE", bf_regex_replace },
+ { "CLEAN", bf_clean },
+ { "DIE", bf_die },
{ "NOOP", bf_noop },
{ "", 0 },
};
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2005-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2005-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
| ( unary_operator >> cast_expression )
);
unary_operator =
- chset<>( "&*~!+-" );
+ //chset<>( "&*~!+-" );
+ ch_p( '&' ) | '*' | '~' | '!' | '+' | '-';
cast_expression =
*( '(' >> type_name >> ')' ) >> unary_expression
| +( '(' >> ( type_name | identifier ) >> ')' ); // 構文解析に失敗する不具合対策
as_lower_d
[
( ( *digit_p >> '.' >> +digit_p ) | ( +digit_p >> '.' ) ) >>
- 'e' >> !chset<>( "+-" ) >> +digit_p >>
- !chset<>( "fl" )
+// 'e' >> !chset<>( "+-" ) >> +digit_p >>
+ 'e' >> !( ch_p( '+' ) | '-' ) >> +digit_p >>
+// !chset<>( "fl" )
+ ( ch_p( 'f' ) | 'l' )
]
];
hexadecimal_floating_constant =
[
"0x" >>
( ( *xdigit_p >> '.' >> +xdigit_p ) | ( +xdigit_p >> '.' ) ) >>
- 'p' >> !chset<>( "+-" ) >> +digit_p >>
- !chset<>( "fl" )
+// 'p' >> !chset<>( "+-" ) >> +digit_p >>
+ 'p' >> !( ch_p( '+' ) | '-' ) >> +digit_p >>
+// !chset<>( "fl" )
+ ( ch_p( 'f' ) | 'l' )
]
];
integer_constant =
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
#include <cstring>
#include <cstdio>
#include <stdexcept>
+#include <iostream>
#include "toppers/cpp.hpp"
namespace toppers
std::string::size_type n = str.find_first_not_of( " \t\r\n" );
std::string quoted( str, n );
- if ( quoted.empty() || quoted[0] != '"' || quoted[quoted.size() - 1] != '"' )
+ if ( quoted.size() < 2 || quoted[0] != '"' || quoted[quoted.size() - 1] != '"' )
{
throw std::invalid_argument( "argument is not quoted" );
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2008 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
std::string search_include_file( InputIterator first, InputIterator last, std::string const& headername )
{
namespace fs = boost::filesystem;
- fs::path filename( headername, fs::native );
+// fs::path filename( headername, fs::native );
+ fs::path filename( headername ); // filesystem3対応
if ( fs::exists( filename ) && !fs::is_directory( filename ) )
{
}
while ( first != last )
{
- fs::path pathname = fs::path( *first, fs::native )/filename;
+// fs::path pathname = fs::path( *first, fs::native )/filename;
+ fs::path pathname = fs::path( *first )/filename; // filesystem3対応
if ( fs::exists( pathname ) && !fs::is_directory( pathname ) )
{
- return pathname.native_file_string();
+// return pathname.native_file_string();
+ return pathname.string(); // filesysytem3対応
}
++first;
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2008 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
}
std::string lang( env );
- fs::path cfg_dir( dir, fs::native );
- fs::path po_file( cfg_dir/fs::path( lang + ".po", fs::native ) );
- std::ifstream ifs( po_file.native_file_string().c_str() );
+// fs::path cfg_dir( dir, fs::native );
+ fs::path cfg_dir( dir ); // filesystem3対応
+// fs::path po_file( cfg_dir/fs::path( lang + ".po", fs::native ) );
+ fs::path po_file( cfg_dir/fs::path( lang + ".po" ) ); // filesystem3対応
+
+// std::ifstream ifs( po_file.native_file_string().c_str() );
+ std::ifstream ifs( po_file.string().c_str() ); // filesystem3対応
std::string msgid;
std::string msgstr;
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
#include "toppers/macro_processor.hpp"
#include "toppers/s_record.hpp"
#include "toppers/nm_symbol.hpp"
+#include "toppers/misc.hpp"
#include "toppers/itronx/cfg1_out.hpp"
#include "toppers/itronx/preprocess.hpp"
#include <boost/spirit/include/classic.hpp>
{
ofile_ << "const uint32_t TOPPERS_cfg_magic_number = 0x12345678;\n"
"const uint32_t TOPPERS_cfg_sizeof_signed_t = sizeof(signed_t);\n"
+ "const uint32_t TOPPERS_cfg_sizeof_pointer = sizeof(const volatile void*);\n"
"const unsigned_t TOPPERS_cfg_CHAR_BIT = CHAR_BIT;\n"
"const unsigned_t TOPPERS_cfg_CHAR_MAX = CHAR_MAX;\n"
"const unsigned_t TOPPERS_cfg_CHAR_MIN = CHAR_MIN;\n"
"const unsigned_t TOPPERS_cfg_LONG_MAX = LONG_MAX;\n"
"\n";
- if ( def_table_ != 0 )
+ if ( def_table_ != 0 ) // 「値取得シンボルテーブル」
{
for ( cfg1_def_table::const_iterator iter( def_table_->begin() ), last( def_table_->end() );
iter != last;
"(" + value2 + ");\n"
"#endif\n";
}
+ else if ( iter->expression[ 0 ] == '@' ) // '@'で始まればアドレス
+ {
+ definition = "const volatile void* const TOPPERS_cfg_" + iter->name + " = (" + ( iter->expression.c_str() + 1 ) + ");\n";
+ }
else
{
definition +=
{
oss << "\n#ifndef TOPPERS_cfg_valueof_" << id << "_DEFINED\n"
"#define TOPPERS_cfg_valueof_" << id << "_DEFINED 1\n";
- oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % iter.line().file;
+ oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % dir_delimiter_to_slash( iter.line().file );
current_class = idexp;
oss << "const unsigned_t TOPPERS_cfg_valueof_" << id << " = " << idexp << ";\n";
{
oss << "\n#ifndef TOPPERS_cfg_valueof_" << id << "_DEFINED\n"
"#define TOPPERS_cfg_valueof_" << id << "_DEFINED 1\n";
- oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % iter.line().file;
+ oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % dir_delimiter_to_slash( iter.line().file );
current_domain = id;
oss << "const unsigned_t TOPPERS_cfg_valueof_" << id << " = ";
block_stack.pop();
oss << "\n#ifndef TOPPERS_cfg_inside_of_" << b.id << "\n";
- oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % iter.line().file;
+ oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( iter.line().line ) % dir_delimiter_to_slash( iter.line().file );
oss << "#error syntax error\n"
"#endif\n";
oss << "#undef TOPPERS_cfg_inside_of_" << b.id << "\n"
api_array.push_back( api );
- std::string file( boost::filesystem::path( api.line().file, boost::filesystem::native ).string() ); // ディレクトリ区切子を / に変更
- oss << boost::format( "\n#line %1% \"%2%\"\n" ) % api.line().line % file;
+ oss << boost::format( "\n#line %1% \"%2%\"\n" ) % api.line().line % dir_delimiter_to_slash( api.line().file );
oss << "const unsigned_t TOPPERS_cfg_static_api_" << serial << " = " << serial << ";\n";
if ( !api.params().empty() && api.begin()->symbol[0] == '#' ) // オブジェクト識別名
else
{
oss << "#define " << object_id << "\t(<>)\n"; // でたらめな字句(基本ソース文字集合のみで構成)に定義することで、誤使用を検出する
- oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( api.line().line ) % file;
+ oss << boost::format( "\n#line %1% \"%2%\"\n" ) % ( api.line().line ) % dir_delimiter_to_slash( api.line().file );
}
}
for ( static_api::iterator api_iter( api.begin() ), api_last( api.end() );
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
cfg1_out::cfg1_def_table const* def_table = cfg1out.get_def_table();
std::size_t sizeof_signed_t;
+ std::size_t sizeof_pointer;
static cfg1_out::cfg1_def_t const limit_defs[] =
{
nm_symbol::entry nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_sizeof_signed_t" );
sizeof_signed_t = static_cast< std::size_t >( cfg1out.get_srec()->get_value( nm_entry.address, 4, cfg1out.is_little_endian() ) );
+ nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_sizeof_pointer" );
+ sizeof_pointer = static_cast< std::size_t >( cfg1out.get_srec()->get_value( nm_entry.address, 4, cfg1out.is_little_endian() ) );
+
for ( std::size_t i = 0; i < sizeof limit_defs / sizeof limit_defs[ 0 ]; ++i )
{
element e;
++iter )
{
element e;
- e.s = iter->expression;
+ std::tr1::int64_t value;
+
nm_entry = cfg1out.get_syms()->find( "TOPPERS_cfg_" + iter->name );
if ( nm_entry.type >= 0 )
{
- std::tr1::int64_t value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_signed_t, cfg1out.is_little_endian() );
- if ( sizeof_signed_t < 8 && iter->is_signed )
+ if ( !iter->expression.empty() && iter->expression[ 0 ] == '@' ) // 式が'@'で始まる場合はアドレス定数式
{
- value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+ value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_pointer, cfg1out.is_little_endian() );
+ if ( sizeof_signed_t < 8 && iter->is_signed )
+ {
+ value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+ }
+
+ // 先ほど取り出したアドレスを使って間接参照
+ value = cfg1out.get_srec()->get_value( value, 8, cfg1out.is_little_endian() ); // 取り出す値は型に関係なく常に8バイト
+ if ( sizeof_signed_t < 8 && iter->is_signed )
+ {
+ value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+ }
+ e.s = iter->expression.c_str() + 1; // 先頭の'@'を除去
+ }
+ else // アドレスではない通常の整数定数式
+ {
+ value = cfg1out.get_srec()->get_value( nm_entry.address, sizeof_signed_t, cfg1out.is_little_endian() );
+ if ( sizeof_signed_t < 8 && iter->is_signed )
+ {
+ value = cfg1_out::make_signed( static_cast< std::tr1::uint32_t >( value ) );
+ }
+ e.s = iter->expression;
}
e.i = value;
mproc.set_var( iter->name, var_t( 1, e ) );
// その他の組み込み変数の設定
set_object_vars( api_map, *mproc );
+ set_object_vars( cfg1out.get_static_api_array(), *mproc );
set_clsid_vars( cfg1out.get_clsid_table(), cfg1out, *mproc );
set_domid_vars( cfg1out.get_domid_table(), *mproc );
set_platform_vars( cfg1out, *mproc );
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
#include "toppers/cpp.hpp"
#include "toppers/global.hpp"
#include "toppers/diagnostics.hpp"
+#include "toppers/misc.hpp"
#include "toppers/itronx/preprocess.hpp"
#include <boost/spirit/include/classic.hpp>
{
if ( dependencies != 0 )
{
- dependencies->insert( hname );
+ dependencies->insert( dir_delimiter_to_slash( hname ) );
}
out.push_back( ' ' ); // ダミーを挿入しておかないと行番号がずれる
preprocess( hname, out, codeset, dependencies, onces ); // ヘッダ名で指定されたファイルに対して前処理を再帰的に行う
}
out.push_back( '\n' );
iter = info.stop.get_row();
- if ( iter != last )
- {
-// out.set_line( iter->line.file, iter->line.line );
- }
--iter; // インクリメントされるのでいったん戻す。
break;
}
else if ( *symbol.rbegin() == '\?' ) // 省略可能パラメータのスキップ
{
skip = true;
+ --iter;
}
else
{
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2010 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
id_string_literal, id_ordered_list, id_ordered_sequence, id_ordered_item,
id_root, id_top,
- id_function_, id_if_, id_foreach_, id_joineach_, id_error_, id_warning_,
+ id_function_, id_if_, id_foreach_, id_joineach_, id_while_, id_joinwhile_,
+ id_error_, id_warning_,
id_file_, id_expr_, id_plain,
id_illegal = -1
if_,
foreach_,
joineach_,
+ while_,
+ joinwhile_,
error_,
warning_,
file_,
guard_if_,
guard_foreach_,
guard_joineach_,
+ guard_while_,
+ guard_joinwhile_,
guard_expr,
guard_postfix_expr,
guard_lvalue_expr,
error_handler()
];
identifier =
- leaf_node_d[ lexeme_d[ ( alpha_p | '_' ) >> *( alnum_p | '_' | '.' ) ] ];
+ leaf_node_d[ lexeme_d[ ( alpha_p | '_' ) >> *( alnum_p | '_' | '.' ) ] ] - "ELIF";
constant =
leaf_node_d
[
root =
top >> lexeme_d[ !space_p ];
top =
- *( function_ | if_ | foreach_ | joineach_ | warning_ | error_ | file_ | expr_ | plain );
+ *( function_ | if_ | foreach_ | joineach_ | while_ | joinwhile_ | warning_ | error_ | file_ | expr_ | plain );
function_ =
guard_function_
(
if_ =
guard_if_
(
- ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> "$ELSE$" >> top >> expect_end( str_p( "$END$" ) ) )
+ ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top
+ >> +( "$ELIF" >> expression >> expect_doller( ch_p( '$' ) ) >> top )
+ >> ( "$ELSE$" >> top ) >> expect_end( str_p( "$END$" ) ) )
+ | ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top
+ >> +( "$ELIF" >> expression >> expect_doller( ch_p( '$' ) ) >> top ) >> expect_end( str_p( "$END$" ) ) )
+ | ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> "$ELSE$" >> top >> expect_end( str_p( "$END$" ) ) )
| ( "$IF" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> expect_end( str_p( "$END$" ) ) )
)
[
[
error_handler()
];
+ while_ =
+ guard_while_
+ (
+ "$WHILE" >> expression >> expect_doller( ch_p( '$' ) ) >> top >> expect_end( str_p( "$END$" ) )
+ )
+ [
+ error_handler()
+ ];
+ joinwhile_ =
+ guard_joinwhile_
+ (
+ "$JOINWHILE" >> expression >> expression >> expect_doller( ch_p( '$' ) ) >> top >> expect_end( str_p( "$END$" ) )
+ )
+ [
+ error_handler()
+ ];
warning_ =
"$WARNING$" >> top >> "$END$" >> !eol_p
| "$WARNING" >> expression >> '$' >> top >> "$END$";
if_.set_id( id_if_ );
foreach_.set_id( id_foreach_ );
joineach_.set_id( id_joineach_ );
+ while_.set_id( id_while_ );
+ joinwhile_.set_id( id_joinwhile_ );
error_.set_id( id_error_ );
warning_.set_id( id_warning_ );
file_.set_id( id_file_ );
}
result = p_ctx->var_map[ "RESULT" ];
+ p_ctx->var_map[ "RESULT" ] = var_t(); // 変数$RESULT$をクリア
}
p_ctx->stack.push( result );
}
fatal( node.value.begin().line(), "no body of %1%", "'IF' or 'ELSE'" );
}
- // 0 1 2 3 4 5 6
+ // 0 1 2 3 4 5 6 4+4*i 4+4*i+1 4+4*i+2 4+4*i+3 n-3 n-2 n-1
// $IF expression $ top $END$
// $IF expression $ top $ELSE$ top $END$
+ // $IF expression $ top ... $ELIF expression $ top ... $ELSE$ top $END$
if ( eval_node( node.children[ 1 ], p_ctx ) ) // expression
{
var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
throw;
}
+
+ std::size_t n = node.children.size();
+
if ( cond ) // $IF expr$
{
result &= eval_node( node.children[ 3 ], p_ctx ); // top
}
- else if ( node.children.size() == 7 ) // $ELSE$
+ else if ( n == 7 ) // $ELSE$
{
result &= eval_node( node.children[ 5 ], p_ctx ); // top
}
+ else if ( n > 5 ) // $ELIF...
+ {
+ for ( std::size_t i = 0; 4 + 4 * i < n - 1; i++ )
+ {
+ std::string token( node.children[ 4 + 4 * i ].value.begin(), node.children[ 4 + 4 * i ].value.end() );
+ if ( token == "$ELIF" ) // $ELIF
+ {
+ if ( eval_node( node.children[ 4 + 4 * i + 1 ], p_ctx ) ) // expression
+ {
+ var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
+ cond = false;
+ try
+ {
+ cond = !!get_i( expr, p_ctx );
+ }
+ catch ( expr_error& )
+ {
+ error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
+ throw;
+ }
+ if ( cond ) // $ELIF expr$
+ {
+ result &= eval_node( node.children[ 4 + 4 * i + 3 ], p_ctx ); // top
+ break;
+ }
+ }
+ }
+ else // ELSE
+ {
+ result &= eval_node( node.children[ 4 + 4 * i + 1 ], p_ctx ); // top
+ break;
+ }
+ }
+ }
}
return result;
}
return result;
}
+ //! WHILE命令
+ bool while_( tree_node_t const& node, context* p_ctx )
+ {
+ bool result = true;
+
+ if ( node.children.empty() )
+ {
+ fatal( node.value.begin().line(), "no body of %1%", "'WHILE'" );
+ }
+
+ // 0 1 2 3 4
+ // $WHILE expression $ top $END$
+ for (;;)
+ {
+ if ( eval_node( node.children[1], p_ctx ) ) // expression
+ {
+ var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
+ bool cond = false;
+ try
+ {
+ cond = !!get_i( expr, p_ctx );
+ }
+ catch ( expr_error& )
+ {
+ error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
+ throw;
+ }
+ if ( !cond )
+ {
+ break;
+ }
+ result &= eval_node( node.children[ 3 ], p_ctx ); // top
+ }
+ }
+ return result;
+ }
+
+ //! $JOINWHILE命令
+ bool joinwhile_( tree_node_t const& node, context* p_ctx )
+ {
+ bool result = true;
+
+ if ( node.children.empty() )
+ {
+ fatal( node.value.begin().line(), "no body of %1%", "'JOINWHILE'" );
+ }
+
+ // 0 1 2 3 4 5
+ // $JOINWHILE expression delimitor $ top $END$
+ for ( bool first = true; ; first = false )
+ {
+ if ( eval_node( node.children[1], p_ctx ) ) // expression
+ {
+ var_t expr( p_ctx->stack.top() ); p_ctx->stack.pop();
+ bool cond = false;
+ try
+ {
+ cond = !!get_i( expr, p_ctx );
+ }
+ catch ( expr_error& )
+ {
+ error( node.children[ 0 ].value.begin().line(), _( "`%1%\' does not have a value" ), get_s( expr, p_ctx ) );
+ throw;
+ }
+ if ( !cond )
+ {
+ break;
+ }
+ if ( !first && eval_node( node.children[ 2 ], p_ctx ) ) // delimitor
+ {
+ var_t delimitor( p_ctx->stack.top() ); p_ctx->stack.pop();
+ p_ctx->target_file << get_s( delimitor, p_ctx );
+ }
+ }
+ result &= eval_node( node.children[ 4 ], p_ctx ); // top
+ }
+ return result;
+ }
+
//! $ERROR命令
bool error_( tree_node_t const& node, context* p_ctx )
{
{
std::string buf;
buf.reserve( node.children[ 0 ].value.end() - node.children[ 0 ].value.begin() );
- for ( text::const_iterator iter( node.children[ 0 ].value.begin() ), last( node.children[0].value.end() ); iter != last; ++iter )
+ std::size_t offset = 0;
+
+ if ( std::isspace( static_cast< unsigned char >( *node.children[ 0 ].value.begin() ) ) ) // plainの先頭が空白類文字の場合、なぜか二重になる不具合の暫定対策
+ offset = 1;
+
+ for ( text::const_iterator iter( node.children[ 0 ].value.begin() + offset ), last( node.children[0].value.end() ); iter != last; ++iter )
{
if ( *iter == '$' )
{
% node.children[ 0 ].value.begin().line().line
% std::string( node.children[ 0 ].value.begin(), node.children[ 0 ].value.end() )
).str().c_str() );
+#elif 0
+ std::cerr << boost::format( "%s:%d:%s" )
+ % node.children[ 0 ].value.begin().line().file
+ % node.children[ 0 ].value.begin().line().line
+ % std::string( node.children[ 0 ].value.begin(), node.children[ 0 ].value.end() )
+ << std::endl;
#endif
switch ( parser::rule_id_t id = static_cast< parser::rule_id_t >( node.value.id().to_long() ) )
case parser::id_joineach_:
result = joineach_( node, p_ctx );
break;
+ case parser::id_while_:
+ result = while_( node, p_ctx );
+ break;
+ case parser::id_joinwhile_:
+ result = joinwhile_( node, p_ctx );
+ break;
case parser::id_error_:
result = error_( node, p_ctx );
break;
fatal( _( "macro processing error" ) );
}
}
+ catch ( die_terminate& )
+ {
+ // $DIE()$関数が呼ばれた
+ }
catch ( expr_error& )
{
fatal( _( "macro processing error" ) );
for ( text::const_iterator iter; ( iter = std::find( first, last, '\n' ) ) != last ; first = iter + 1 )
{
std::string buf( first, iter );
- if ( ( ( buf[0] == '$' ) && ( buf.size() >= 2 ) && std::isspace( static_cast< unsigned char >( buf[1] ) ) ) )
+ std::string::size_type found_pos;
+
+ if ( ( ( buf.size() >= 2 ) && ( buf[0] == '$' ) && std::isspace( static_cast< unsigned char >( buf[1] ) ) )
+ || ( buf.size() == 1 && buf[0] == '$' ) ) // 行頭に限り、'$'単独でもコメントとみなす
{
*result = '\n';
}
- else
+ else if ( ( found_pos = buf.find( std::string( "$#" ) ) ) != std::string::npos ) // 行の途中に"$#"があれば、それ以降をコメントとみなす
+ {
+ result = std::copy( buf.begin(), buf.begin() + found_pos, result );
+ }
+ else
{
// コメント行以外は行頭の空白類を除去する。
first = std::find_if( first, iter, std::not1( std::ptr_fun< char, bool >( &toppers::isspace ) ) );
return var_t();
}
- return p_ctx->var_map[ "RESULT" ];
+ var_t result = p_ctx->var_map[ "RESULT" ];
+ p_ctx->var_map[ "RESULT" ] = var_t(); // 変数$RESULT$をクリア
+ return result;
}
}
context() : in_function( false ) {}
};
+ struct die_terminate {};
+
macro_processor();
macro_processor( macro_processor const& other );
explicit macro_processor( text const& in );
#include "toppers/codeset.hpp"
#include <boost/scoped_array.hpp>
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#include <mbstring.h>
+#endif
+
// workaround
#include <ctype.h>
#include <wctype.h>
return str.substr( first );
}
+ inline std::string dir_delimiter_to_slash( std::string const& str )
+ {
+#if defined(_MSC_VER) || defined(__MINGW32__)
+ std::string result;
+ result.reserve( str.size() );
+
+ unsigned char const* s1 = reinterpret_cast< unsigned char const* >( str.c_str() );
+ while ( unsigned char const* s2 = _mbschr( s1, '\\' ) )
+ {
+ result.append( s1, s2 );
+ result.push_back( '/' );
+ s1 = s2 + 1;
+ }
+ return result + reinterpret_cast< char const* >( s1 );
+#else
+ return str;
+#endif
+ }
+
}
#endif // ! TOPPERS_MISC_HPP_
unsigned long address = 0;
char type;
std::string symbol;
- if ( !std::isspace( static_cast< unsigned char >( buf[0] ) ) )
+ if ( !buf.empty() && !std::isspace( static_cast< unsigned char >( buf[0] ) ) )
{
isstr >> std::hex >> address;
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2008 by TAKAGI Nobuhisa
+ * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
{
if ( iter->first != "" )
{
- fs::path filename( iter->first, fs::native );
- fs::path backup( iter->first + ".org", fs::native );
+// fs::path filename( iter->first, fs::native );
+ fs::path filename( iter->first ); // filesystem3対応
+// fs::path backup( iter->first + ".org", fs::native );
+ fs::path backup( iter->first + ".org" ); // filesystem3対応
bool existed = fs::exists( filename );
try
{
- std::string file( filename.native_file_string() );
+// std::string file( filename.native_file_string() );
+ std::string file( filename.string() ); // filesystem3対応
if ( existed )
{
fs::rename( filename, backup );
iter != last;
++iter )
{
- fs::path filename( *iter, fs::native );
+// fs::path filename( *iter, fs::native );
+ fs::path filename( *iter ); // filesystem3対応
fs::remove( filename );
- fs::path backup( *iter + ".org", fs::native );
+// fs::path backup( *iter + ".org", fs::native );
+ fs::path backup( *iter + ".org" ); // filesystem3対応
if ( fs::exists( backup ) )
{
fs::rename( backup, filename );
{
return filename;
}
- fs::path dir( get_global< std::string >( "output-directory" ), fs::native );
- return ( dir/filename ).native_file_string();
+// fs::path dir( get_global< std::string >( "output-directory" ), fs::native );
+ fs::path dir( get_global< std::string >( "output-directory" ) ); // filesystem3対応
+// return ( dir/filename ).native_file_string();
+ return ( dir/filename ).string(); // filesystem3対応
}
/*!
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2005-2008 by TAKAGI Nobuhisa
+ * Copyright (C) 2005-2011 by TAKAGI Nobuhisa
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
#include "toppers/s_record.hpp"
#include <istream>
#include <algorithm>
+#include <iterator>
#include <cctype>
#include <cstring>
pri_level/kernel/task.c
pri_level/kernel/task.h
pri_level/test/test_task1.h
+
+rstr_task/include/kernel.h
+
+rstr_task/kernel/Makefile.kernel
+rstr_task/kernel/allfunc.h
+rstr_task/kernel/check.h
+rstr_task/kernel/kernel.tf
+rstr_task/kernel/kernel_def.csv
+rstr_task/kernel/kernel_rename.def
+rstr_task/kernel/kernel_rename.h
+rstr_task/kernel/kernel_unrename.h
+rstr_task/kernel/sys_manage.c
+rstr_task/kernel/task.c
+rstr_task/kernel/task.h
+rstr_task/kernel/task_manage.c
+rstr_task/kernel/task_sync.c
+
+rstr_task/test/test_rstr1.c
+rstr_task/test/test_rstr1.cfg
+rstr_task/test/test_rstr1.h
+rstr_task/test/test_rstr2.c
+rstr_task/test/test_rstr2.cfg
+rstr_task/test/test_rstr2.h
+
+dcre/include/kernel.h
+
+dcre/kernel/Makefile.kernel
+dcre/kernel/alarm.c
+dcre/kernel/alarm.h
+dcre/kernel/allfunc.h
+dcre/kernel/check.h
+dcre/kernel/cyclic.c
+dcre/kernel/cyclic.h
+dcre/kernel/dataqueue.c
+dcre/kernel/dataqueue.h
+dcre/kernel/eventflag.c
+dcre/kernel/eventflag.h
+dcre/kernel/interrupt.c
+dcre/kernel/interrupt.h
+dcre/kernel/kernel.tf
+dcre/kernel/kernel_api.csv
+dcre/kernel/kernel_check.tf
+dcre/kernel/kernel_def.csv
+dcre/kernel/kernel_impl.h
+dcre/kernel/kernel_rename.def
+dcre/kernel/kernel_rename.h
+dcre/kernel/kernel_unrename.h
+dcre/kernel/mailbox.c
+dcre/kernel/mailbox.h
+dcre/kernel/mempfix.c
+dcre/kernel/mempfix.h
+dcre/kernel/pridataq.c
+dcre/kernel/pridataq.h
+dcre/kernel/semaphore.c
+dcre/kernel/semaphore.h
+dcre/kernel/startup.c
+dcre/kernel/task.c
+dcre/kernel/task.h
+dcre/kernel/task_except.c
+dcre/kernel/task_manage.c
+dcre/kernel/task_refer.c
+dcre/kernel/task_sync.c
+
+dcre/sample/sample1.c
+dcre/sample/sample1.cfg
+dcre/sample/sample1.h
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2004-2010 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.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * TOPPERS/ASPカーネル 標準ヘッダファイル
+ *
+ * TOPPERS/ASPカーネルがサポートするサービスコールの宣言と,必要なデー
+ * タ型,定数,マクロの定義を含むヘッダファイル.
+ *
+ * アセンブリ言語のソースファイルからこのファイルをインクルードする時
+ * は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
+ * 除くようになっている.
+ *
+ * このファイルをインクルードする前にインクルードしておくべきファイル
+ * はない.
+ */
+
+#ifndef TOPPERS_KERNEL_H
+#define TOPPERS_KERNEL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * TOPPERS共通のデータ型・定数・マクロ
+ */
+#include <t_stddef.h>
+
+/*
+ * ターゲット依存部
+ */
+#include "target_kernel.h"
+
+#ifndef TOPPERS_MACRO_ONLY
+
+/*
+ * データ型の定義
+ */
+
+/*
+ * ビットパターンやオブジェクト番号の型定義
+ */
+typedef uint_t TEXPTN; /* タスク例外要因のビットパターン */
+typedef uint_t FLGPTN; /* イベントフラグのビットパターン */
+typedef uint_t INTNO; /* 割込み番号 */
+typedef uint_t INHNO; /* 割込みハンドラ番号 */
+typedef uint_t EXCNO; /* CPU例外ハンドラ番号 */
+
+/*
+ * 処理単位の型定義
+ */
+typedef void (*TASK)(intptr_t exinf);
+typedef void (*TEXRTN)(TEXPTN texptn, intptr_t exinf);
+typedef void (*CYCHDR)(intptr_t exinf);
+typedef void (*ALMHDR)(intptr_t exinf);
+typedef void (*ISR)(intptr_t exinf);
+typedef void (*INTHDR)(void);
+typedef void (*EXCHDR)(void *p_excinf);
+typedef void (*INIRTN)(intptr_t exinf);
+typedef void (*TERRTN)(intptr_t exinf);
+
+/*
+ * メモリ領域確保のための型定義
+ */
+#ifndef TOPPERS_STK_T
+#define TOPPERS_STK_T intptr_t
+#endif /* TOPPERS_STK_T */
+typedef TOPPERS_STK_T STK_T; /* スタック領域を確保するための型 */
+
+#ifndef TOPPERS_MPF_T
+#define TOPPERS_MPF_T intptr_t
+#endif /* TOPPERS_MPF_T */
+typedef TOPPERS_MPF_T MPF_T; /* 固定長メモリプール領域を確保するための型 */
+
+/*
+ * メッセージヘッダの型定義
+ */
+typedef struct t_msg { /* メールボックスのメッセージヘッダ */
+ struct t_msg *pk_next;
+} T_MSG;
+
+typedef struct t_msg_pri { /* 優先度付きメッセージヘッダ */
+ T_MSG msgque; /* メッセージヘッダ */
+ PRI msgpri; /* メッセージ優先度 */
+} T_MSG_PRI;
+
+/*
+ * パケット形式の定義
+ */
+typedef struct t_ctsk {
+ ATR tskatr; /* タスク属性 */
+ intptr_t exinf; /* タスクの拡張情報 */
+ TASK task; /* タスクのメインルーチンの先頭番地 */
+ PRI itskpri; /* タスクの起動時優先度 */
+ SIZE stksz; /* タスクのスタック領域のサイズ */
+ STK_T *stk; /* タスクのスタック領域の先頭番地 */
+} T_CTSK;
+
+typedef struct t_rtsk {
+ STAT tskstat; /* タスク状態 */
+ PRI tskpri; /* タスクの現在優先度 */
+ PRI tskbpri; /* タスクのベース優先度 */
+ STAT tskwait; /* 待ち要因 */
+ ID wobjid; /* 待ち対象のオブジェクトのID */
+ TMO lefttmo; /* タイムアウトするまでの時間 */
+ uint_t actcnt; /* 起動要求キューイング数 */
+ uint_t wupcnt; /* 起床要求キューイング数 */
+} T_RTSK;
+
+typedef struct t_dtex {
+ ATR texatr; /* タスク例外処理ルーチン属性 */
+ TEXRTN texrtn; /* タスク例外処理ルーチンの先頭番地 */
+} T_DTEX;
+
+typedef struct t_rtex {
+ STAT texstat; /* タスク例外処理の状態 */
+ TEXPTN pndptn; /* 保留例外要因 */
+} T_RTEX;
+
+typedef struct t_csem {
+ ATR sematr; /* セマフォ属性 */
+ uint_t isemcnt; /* セマフォの初期資源数 */
+ uint_t maxsem; /* セマフォの最大資源数 */
+} T_CSEM;
+
+typedef struct t_rsem {
+ ID wtskid; /* セマフォの待ち行列の先頭のタスクのID番号 */
+ uint_t semcnt; /* セマフォの現在の資源数 */
+} T_RSEM;
+
+typedef struct t_cflg {
+ ATR flgatr; /* イベントフラグ属性 */
+ FLGPTN iflgptn; /* イベントフラグの初期ビットパターン */
+} T_CFLG;
+
+typedef struct t_rflg {
+ ID wtskid; /* イベントフラグの待ち行列の先頭のタスクのID番号 */
+ FLGPTN flgptn; /* イベントフラグの現在のビットパターン */
+} T_RFLG;
+
+typedef struct t_cdtq {
+ ATR dtqatr; /* データキュー属性 */
+ uint_t dtqcnt; /* データキュー管理領域に格納できるデータ数 */
+ void *dtqmb; /* データキュー管理領域の先頭番地 */
+} T_CDTQ;
+
+typedef struct t_rdtq {
+ ID stskid; /* データキューの送信待ち行列の先頭のタスクのID番号 */
+ ID rtskid; /* データキューの受信待ち行列の先頭のタスクのID番号 */
+ uint_t sdtqcnt; /* データキュー管理領域に格納されているデータの数 */
+} T_RDTQ;
+
+typedef struct t_cpdq {
+ ATR pdqatr; /* 優先度データキュー属性 */
+ uint_t pdqcnt; /* 優先度データキュー管理領域に格納できるデータ数 */
+ PRI maxdpri; /* 優先度データキューに送信できるデータ優先度の最
+ 大値 */
+ void *pdqmb; /* 優先度データキュー管理領域の先頭番地 */
+} T_CPDQ;
+
+typedef struct t_rpdq {
+ ID stskid; /* 優先度データキューの送信待ち行列の先頭のタスク
+ のID番号 */
+ ID rtskid; /* 優先度データキューの受信待ち行列の先頭のタスク
+ のID番号 */
+ uint_t spdqcnt; /* 優先度データキュー管理領域に格納されているデー
+ タの数 */
+} T_RPDQ;
+
+typedef struct t_cmbx {
+ ATR mbxatr; /* メールボックス属性 */
+ PRI maxmpri; /* 優先度メールボックスに送信できるメッセージ優先
+ 度の最大値 */
+ void *mprihd; /* 優先度別のメッセージキューヘッダ領域の先頭番地 */
+} T_CMBX;
+
+typedef struct t_rmbx {
+ ID wtskid; /* メールボックスの待ち行列の先頭のタスクのID番号 */
+ T_MSG *pk_msg; /* メッセージキューの先頭につながれたメッセージ
+ の先頭番地 */
+} T_RMBX;
+
+typedef struct t_cmpf {
+ ATR mpfatr; /* 固定長メモリプール属性 */
+ uint_t blkcnt; /* 獲得できる固定長メモリブロックの数 */
+ uint_t blksz; /* 固定長メモリブロックのサイズ */
+ MPF_T *mpf; /* 固定長メモリプール領域の先頭番地 */
+ void *mpfmb; /* 固定長メモリプール管理領域の先頭番地 */
+} T_CMPF;
+
+typedef struct t_rmpf {
+ ID wtskid; /* 固定長メモリプールの待ち行列の先頭のタスクの
+ ID番号 */
+ uint_t fblkcnt; /* 固定長メモリプール領域の空きメモリ領域に割り
+ 付けることができる固定長メモリブロックの数 */
+} T_RMPF;
+
+typedef struct t_ccyc {
+ ATR cycatr; /* 周期ハンドラ属性 */
+ intptr_t exinf; /* 周期ハンドラの拡張情報 */
+ CYCHDR cychdr; /* 周期ハンドラの先頭番地 */
+ RELTIM cyctim; /* 周期ハンドラの起動周期 */
+ RELTIM cycphs; /* 周期ハンドラの起動位相 */
+} T_CCYC;
+
+typedef struct t_rcyc {
+ STAT cycstat; /* 周期ハンドラの動作状態 */
+ RELTIM lefttim; /* 次に周期ハンドラを起動する時刻までの相対時間 */
+} T_RCYC;
+
+typedef struct t_calm {
+ ATR almatr; /* アラームハンドラ属性 */
+ intptr_t exinf; /* アラームハンドラの拡張情報 */
+ ALMHDR almhdr; /* アラームハンドラの先頭番地 */
+} T_CALM;
+
+typedef struct t_ralm {
+ STAT almstat; /* アラームハンドラの動作状態 */
+ RELTIM lefttim; /* アラームハンドラを起動する時刻までの相対時間 */
+} T_RALM;
+
+typedef struct t_cisr {
+ ATR isratr; /* 割込みサービスルーチン属性 */
+ intptr_t exinf; /* 割込みサービスルーチンの拡張情報 */
+ INTNO intno; /* 割込みサービスルーチンを登録する割込み番号 */
+ ISR isr; /* 割込みサービスルーチンの先頭番地 */
+ PRI isrpri; /* 割込みサービスルーチン優先度 */
+} T_CISR;
+
+/*
+ * サービスコールの宣言
+ */
+
+/*
+ * タスク管理機能
+ */
+extern ER_UINT acre_tsk(const T_CTSK *pk_ctsk) throw();
+extern ER del_tsk(ID tskid) throw();
+extern ER act_tsk(ID tskid) throw();
+extern ER iact_tsk(ID tskid) throw();
+extern ER_UINT can_act(ID tskid) throw();
+extern ER ext_tsk(void) throw();
+extern ER ter_tsk(ID tskid) throw();
+extern ER chg_pri(ID tskid, PRI tskpri) throw();
+extern ER get_pri(ID tskid, PRI *p_tskpri) throw();
+extern ER get_inf(intptr_t *p_exinf) throw();
+extern ER ref_tsk(ID tskid, T_RTSK *pk_rtsk) throw();
+
+/*
+ * タスク付属同期機能
+ */
+extern ER slp_tsk(void) throw();
+extern ER tslp_tsk(TMO tmout) throw();
+extern ER wup_tsk(ID tskid) throw();
+extern ER iwup_tsk(ID tskid) throw();
+extern ER_UINT can_wup(ID tskid) throw();
+extern ER rel_wai(ID tskid) throw();
+extern ER irel_wai(ID tskid) throw();
+extern ER sus_tsk(ID tskid) throw();
+extern ER rsm_tsk(ID tskid) throw();
+extern ER dly_tsk(RELTIM dlytim) throw();
+
+/*
+ * タスク例外処理機能
+ */
+extern ER def_tex(ID tskid, const T_DTEX *pk_dtex) throw();
+extern ER ras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER iras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER dis_tex(void) throw();
+extern ER ena_tex(void) throw();
+extern bool_t sns_tex(void) throw();
+extern ER ref_tex(ID tskid, T_RTEX *pk_rtex) throw();
+
+/*
+ * 同期・通信機能
+ */
+extern ER_ID acre_sem(const T_CSEM *pk_csem) throw();
+extern ER del_sem(ID semid) throw();
+extern ER sig_sem(ID semid) throw();
+extern ER isig_sem(ID semid) throw();
+extern ER wai_sem(ID semid) throw();
+extern ER pol_sem(ID semid) throw();
+extern ER twai_sem(ID semid, TMO tmout) throw();
+extern ER ini_sem(ID semid) throw();
+extern ER ref_sem(ID semid, T_RSEM *pk_rsem) throw();
+
+extern ER_ID acre_flg(const T_CFLG *pk_cflg) throw();
+extern ER del_flg(ID flgid) throw();
+extern ER set_flg(ID flgid, FLGPTN setptn) throw();
+extern ER iset_flg(ID flgid, FLGPTN setptn) throw();
+extern ER clr_flg(ID flgid, FLGPTN clrptn) throw();
+extern ER wai_flg(ID flgid, FLGPTN waiptn,
+ MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER pol_flg(ID flgid, FLGPTN waiptn,
+ MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER twai_flg(ID flgid, FLGPTN waiptn,
+ MODE wfmode, FLGPTN *p_flgptn, TMO tmout) throw();
+extern ER ini_flg(ID flgid) throw();
+extern ER ref_flg(ID flgid, T_RFLG *pk_rflg) throw();
+
+extern ER_ID acre_dtq(const T_CDTQ *pk_cdtq) throw();
+extern ER del_dtq(ID dtqid) throw();
+extern ER snd_dtq(ID dtqid, intptr_t data) throw();
+extern ER psnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER ipsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) throw();
+extern ER fsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER ifsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER rcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER prcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) throw();
+extern ER ini_dtq(ID dtqid) throw();
+extern ER ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) throw();
+
+extern ER_ID acre_pdq(const T_CPDQ *pk_cpdq) throw();
+extern ER del_pdq(ID pdqid) throw();
+extern ER snd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER psnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER tsnd_pdq(ID pdqid, intptr_t data,
+ PRI datapri, TMO tmout) throw();
+extern ER rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER trcv_pdq(ID pdqid, intptr_t *p_data,
+ PRI *p_datapri, TMO tmout) throw();
+extern ER ini_pdq(ID pdqid) throw();
+extern ER ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) throw();
+
+extern ER_ID acre_mbx(const T_CMBX *pk_cmbx) throw();
+extern ER del_mbx(ID mbxid) throw();
+extern ER snd_mbx(ID mbxid, T_MSG *pk_msg) throw();
+extern ER rcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER prcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) throw();
+extern ER ini_mbx(ID mbxid) throw();
+extern ER ref_mbx(ID mbxid, T_RMBX *pk_rmbx) throw();
+
+/*
+ * メモリプール管理機能
+ */
+extern ER_ID acre_mpf(const T_CMPF *pk_cmpf) throw();
+extern ER del_mpf(ID mpfid) throw();
+extern ER get_mpf(ID mpfid, void **p_blk) throw();
+extern ER pget_mpf(ID mpfid, void **p_blk) throw();
+extern ER tget_mpf(ID mpfid, void **p_blk, TMO tmout) throw();
+extern ER rel_mpf(ID mpfid, void *blk) throw();
+extern ER ini_mpf(ID mpfid) throw();
+extern ER ref_mpf(ID mpfid, T_RMPF *pk_rmpf) throw();
+
+/*
+ * 時間管理機能
+ */
+extern ER get_tim(SYSTIM *p_systim) throw();
+extern ER get_utm(SYSUTM *p_sysutm) throw();
+
+extern ER_ID acre_cyc(const T_CCYC *pk_ccyc) throw();
+extern ER del_cyc(ID cycid) throw();
+extern ER sta_cyc(ID cycid) throw();
+extern ER stp_cyc(ID cycid) throw();
+extern ER ref_cyc(ID cycid, T_RCYC *pk_rcyc) throw();
+
+extern ER_ID acre_alm(const T_CALM *pk_calm) throw();
+extern ER del_alm(ID almid) throw();
+extern ER sta_alm(ID almid, RELTIM almtim) throw();
+extern ER ista_alm(ID almid, RELTIM almtim) throw();
+extern ER stp_alm(ID almid) throw();
+extern ER istp_alm(ID almid) throw();
+extern ER ref_alm(ID almid, T_RALM *pk_ralm) throw();
+
+/*
+ * システム状態管理機能
+ */
+extern ER rot_rdq(PRI tskpri) throw();
+extern ER irot_rdq(PRI tskpri) throw();
+extern ER get_tid(ID *p_tskid) throw();
+extern ER iget_tid(ID *p_tskid) throw();
+extern ER loc_cpu(void) throw();
+extern ER iloc_cpu(void) throw();
+extern ER unl_cpu(void) throw();
+extern ER iunl_cpu(void) throw();
+extern ER dis_dsp(void) throw();
+extern ER ena_dsp(void) throw();
+extern bool_t sns_ctx(void) throw();
+extern bool_t sns_loc(void) throw();
+extern bool_t sns_dsp(void) throw();
+extern bool_t sns_dpn(void) throw();
+extern bool_t sns_ker(void) throw();
+extern ER ext_ker(void) throw();
+
+/*
+ * 割込み管理機能
+ */
+extern ER_ID acre_isr(const T_CISR *pk_cisr) throw();
+extern ER del_isr(ID isrid) throw();
+extern ER dis_int(INTNO intno) throw();
+extern ER ena_int(INTNO intno) throw();
+extern ER chg_ipm(PRI intpri) throw();
+extern ER get_ipm(PRI *p_intpri) throw();
+
+/*
+ * CPU例外管理機能
+ */
+extern bool_t xsns_dpn(void *p_excinf) throw();
+extern bool_t xsns_xpn(void *p_excinf) throw();
+
+#endif /* TOPPERS_MACRO_ONLY */
+
+/*
+ * オブジェクト属性の定義
+ */
+#define TA_ACT UINT_C(0x02) /* タスクを起動された状態で生成 */
+
+#define TA_TPRI UINT_C(0x01) /* タスクの待ち行列を優先度順に */
+#define TA_MPRI UINT_C(0x02) /* メッセージキューを優先度順に */
+
+#define TA_WMUL UINT_C(0x02) /* 複数の待ちタスク */
+#define TA_CLR UINT_C(0x04) /* イベントフラグのクリア指定 */
+
+#define TA_STA UINT_C(0x02) /* 周期ハンドラを動作状態で生成 */
+
+#define TA_NONKERNEL UINT_C(0x02) /* カーネル管理外の割込み */
+
+#define TA_ENAINT UINT_C(0x01) /* 割込み要求禁止フラグをクリア */
+#define TA_EDGE UINT_C(0x02) /* エッジトリガ */
+
+/*
+ * サービスコールの動作モードの定義
+ */
+#define TWF_ORW UINT_C(0x01) /* イベントフラグのOR待ち */
+#define TWF_ANDW UINT_C(0x02) /* イベントフラグのAND待ち */
+
+/*
+ * オブジェクトの状態の定義
+ */
+#define TTS_RUN UINT_C(0x01) /* 実行状態 */
+#define TTS_RDY UINT_C(0x02) /* 実行可能状態 */
+#define TTS_WAI UINT_C(0x04) /* 待ち状態 */
+#define TTS_SUS UINT_C(0x08) /* 強制待ち状態 */
+#define TTS_WAS UINT_C(0x0c) /* 二重待ち状態 */
+#define TTS_DMT UINT_C(0x10) /* 休止状態 */
+
+#define TTW_SLP UINT_C(0x0001) /* 起床待ち */
+#define TTW_DLY UINT_C(0x0002) /* 時間経過待ち */
+#define TTW_SEM UINT_C(0x0004) /* セマフォの資源獲得待ち */
+#define TTW_FLG UINT_C(0x0008) /* イベントフラグ待ち */
+#define TTW_SDTQ UINT_C(0x0010) /* データキューへの送信待ち */
+#define TTW_RDTQ UINT_C(0x0020) /* データキューからの受信待ち */
+#define TTW_SPDQ UINT_C(0x0100) /* 優先度データキューへの送信待ち */
+#define TTW_RPDQ UINT_C(0x0200) /* 優先度データキューからの受信待ち */
+#define TTW_MBX UINT_C(0x0040) /* メールボックスからの受信待ち */
+#define TTW_MPF UINT_C(0x2000) /* 固定長メモリブロックの獲得待ち */
+
+#define TTEX_ENA UINT_C(0x01) /* タスク例外処理許可状態 */
+#define TTEX_DIS UINT_C(0x02) /* タスク例外処理禁止状態 */
+
+#define TCYC_STP UINT_C(0x01) /* 周期ハンドラが動作していない */
+#define TCYC_STA UINT_C(0x02) /* 周期ハンドラが動作している */
+
+#define TALM_STP UINT_C(0x01) /* アラームハンドラが動作していない */
+#define TALM_STA UINT_C(0x02) /* アラームハンドラが動作している */
+
+/*
+ * その他の定数の定義
+ */
+#define TSK_SELF 0 /* 自タスク指定 */
+#define TSK_NONE 0 /* 該当するタスクがない */
+
+#define TPRI_SELF 0 /* 自タスクのベース優先度 */
+#define TPRI_INI 0 /* タスクの起動時優先度 */
+
+#define TIPM_ENAALL 0 /* 割込み優先度マスク全解除 */
+
+/*
+ * 構成定数とマクロ
+ */
+
+/*
+ * サポートする機能
+ */
+#ifdef TOPPERS_TARGET_SUPPORT_DIS_INT
+#define TOPPERS_SUPPORT_DIS_INT /* dis_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_DIS_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_ENA_INT
+#define TOPPERS_SUPPORT_ENA_INT /* ena_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_ENA_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_GET_UTM
+#define TOPPERS_SUPPORT_GET_UTM /* get_utmがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_GET_UTM */
+
+#define TOPPERS_SUPPORT_DYNAMIC_CRE /* 動的生成機能拡張 */
+
+/*
+ * 優先度の範囲
+ */
+#define TMIN_TPRI 1 /* タスク優先度の最小値(最高値)*/
+#define TMAX_TPRI 16 /* タスク優先度の最大値(最低値)*/
+#define TMIN_DPRI 1 /* データ優先度の最小値(最高値)*/
+#define TMAX_DPRI 16 /* データ優先度の最大値(最低値)*/
+#define TMIN_MPRI 1 /* メッセージ優先度の最小値(最高値)*/
+#define TMAX_MPRI 16 /* メッセージ優先度の最大値(最低値)*/
+#define TMIN_ISRPRI 1 /* 割込みサービスルーチン優先度の最小値 */
+#define TMAX_ISRPRI 16 /* 割込みサービスルーチン優先度の最大値 */
+
+/*
+ * バージョン情報
+ */
+#define TKERNEL_MAKER UINT_C(0x0118) /* カーネルのメーカーコード */
+#define TKERNEL_PRID UINT_C(0x0007) /* カーネルの識別番号 */
+#define TKERNEL_SPVER UINT_C(0xf513) /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER UINT_C(0x1070) /* カーネルのバージョン番号 */
+
+/*
+ * キューイング回数の最大値
+ */
+#define TMAX_ACTCNT UINT_C(1) /* 起動要求キューイング数の最大値 */
+#define TMAX_WUPCNT UINT_C(1) /* 起床要求キューイング数の最大値 */
+
+/*
+ * ビットパターンのビット数
+ */
+#ifndef TBIT_TEXPTN /* タスク例外要因のビット数 */
+#define TBIT_TEXPTN (sizeof(TEXPTN) * CHAR_BIT)
+#endif /* TBIT_TEXPTN */
+
+#ifndef TBIT_FLGPTN /* イベントフラグのビット数 */
+#define TBIT_FLGPTN (sizeof(FLGPTN) * CHAR_BIT)
+#endif /* TBIT_FLGPTN */
+
+/*
+ * メモリ領域確保のためのマクロ
+ *
+ * 以下のTOPPERS_COUNT_SZとTOPPERS_ROUND_SZの定義は,unitが2の巾乗であ
+ * ることを仮定している.
+ */
+#ifndef TOPPERS_COUNT_SZ
+#define TOPPERS_COUNT_SZ(sz, unit) (((sz) + (unit) - 1) / (unit))
+#endif /* TOPPERS_COUNT_SZ */
+#ifndef TOPPERS_ROUND_SZ
+#define TOPPERS_ROUND_SZ(sz, unit) (((sz) + (unit) - 1) & ~((unit) - 1))
+#endif /* TOPPERS_ROUND_SZ */
+
+#define COUNT_STK_T(sz) TOPPERS_COUNT_SZ(sz, sizeof(STK_T))
+#define ROUND_STK_T(sz) TOPPERS_ROUND_SZ(sz, sizeof(STK_T))
+
+#define COUNT_MPF_T(blksz) TOPPERS_COUNT_SZ(blksz, sizeof(MPF_T))
+#define ROUND_MPF_T(blksz) TOPPERS_ROUND_SZ(blksz, sizeof(MPF_T))
+
+#define TSZ_DTQMB(dtqcnt) (sizeof(intptr_t) * (dtqcnt))
+#define TCNT_DTQMB(dtqcnt) TOPPERS_COUNT_SZ(TSZ_DTQMB(dtqcnt), sizeof(MB_T))
+
+#ifndef TSZ_PDQMB
+#define TSZ_PDQMB(pdqcnt) (sizeof(intptr_t) * 3 * (pdqcnt))
+#endif /* TSZ_PDQMB */
+#define TCNT_PDQMB(pdqcnt) TOPPERS_COUNT_SZ(TSZ_PDQMB(pdqcnt), sizeof(MB_T))
+
+#define TSZ_MPFMB(blkcnt) (sizeof(uint_t) * (blkcnt))
+#define TCNT_MPFMB(blkcnt) TOPPERS_COUNT_SZ(TSZ_MPFMB(blkcnt), sizeof(MB_T))
+
+/*
+ * その他の構成定数
+ */
+#define TMAX_MAXSEM UINT_MAX /* セマフォの最大資源数の最大値 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TOPPERS_KERNEL_H */
--- /dev/null
+#
+# TOPPERS/ASP Kernel
+# Toyohashi Open Platform for Embedded Real-Time Systems/
+# Advanced Standard Profile Kernel
+#
+# Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
+# Toyohashi Univ. of Technology, JAPAN
+# Copyright (C) 2005-2010 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: Makefile.kernel 1966 2010-11-20 07:23:56Z ertl-hiro $
+#
+
+#
+# カーネルのファイル構成の定義
+#
+
+#
+# 1つのソースファイルから複数のオブジェクトファイルを生成するように作
+# 成されたソースファイルのリスト
+#
+KERNEL_FCSRCS = startup.c task.c wait.c time_event.c \
+ task_manage.c task_refer.c task_sync.c task_except.c \
+ semaphore.c eventflag.c dataqueue.c pridataq.c mailbox.c \
+ mempfix.c time_manage.c cyclic.c alarm.c \
+ sys_manage.c interrupt.c exception.c
+
+#
+# 各ソースファイルから生成されるオブジェクトファイルのリスト
+#
+startup = sta_ker.o ext_ker.o kermem.o
+
+task = tskini.o tsksched.o tskrun.o tsknrun.o \
+ tskdmt.o tskact.o tskpri.o tskrot.o tsktex.o
+
+wait = waimake.o waicmp.o waitmo.o waitmook.o \
+ wairel.o wobjwai.o wobjwaitmo.o iniwque.o
+
+time_event = tmeini.o tmeup.o tmedown.o tmeins.o tmedel.o tmeltim.o sigtim.o
+
+task_manage = acre_tsk.o del_tsk.o act_tsk.o iact_tsk.o can_act.o \
+ ext_tsk.o ter_tsk.o chg_pri.o get_pri.o get_inf.o
+
+task_refer = ref_tsk.o
+
+task_sync = slp_tsk.o tslp_tsk.o wup_tsk.o iwup_tsk.o can_wup.o \
+ rel_wai.o irel_wai.o sus_tsk.o rsm_tsk.o dly_tsk.o
+
+task_except = def_tex.o ras_tex.o iras_tex.o dis_tex.o ena_tex.o \
+ sns_tex.o ref_tex.o
+
+semaphore = semini.o acre_sem.o del_sem.o sig_sem.o isig_sem.o \
+ wai_sem.o pol_sem.o twai_sem.o ini_sem.o ref_sem.o
+
+eventflag = flgini.o flgcnd.o acre_flg.o del_flg.o set_flg.o iset_flg.o \
+ clr_flg.o wai_flg.o pol_flg.o twai_flg.o ini_flg.o ref_flg.o
+
+dataqueue = dtqini.o dtqenq.o dtqfenq.o dtqdeq.o dtqsnd.o dtqfsnd.o dtqrcv.o \
+ acre_dtq.o del_dtq.o snd_dtq.o psnd_dtq.o ipsnd_dtq.o tsnd_dtq.o \
+ fsnd_dtq.o ifsnd_dtq.o rcv_dtq.o prcv_dtq.o trcv_dtq.o ini_dtq.o \
+ ref_dtq.o
+
+pridataq = pdqini.o pdqenq.o pdqdeq.o pdqsnd.o pdqrcv.o \
+ acre_pdq.o del_pdq.o snd_pdq.o psnd_pdq.o ipsnd_pdq.o tsnd_pdq.o \
+ rcv_pdq.o prcv_pdq.o trcv_pdq.o ini_pdq.o ref_pdq.o
+
+mailbox = mbxini.o acre_mbx.o del_mbx.o snd_mbx.o rcv_mbx.o \
+ prcv_mbx.o trcv_mbx.o ini_mbx.o ref_mbx.o
+
+mempfix = mpfini.o mpfget.o acre_mpf.o del_mpf.o get_mpf.o\
+ pget_mpf.o tget_mpf.o rel_mpf.o ini_mpf.o ref_mpf.o
+
+time_manage = get_tim.o get_utm.o
+
+cyclic = cycini.o acre_cyc.o del_cyc.o sta_cyc.o stp_cyc.o ref_cyc.o cyccal.o
+
+alarm = almini.o acre_alm.o del_alm.o sta_alm.o ista_alm.o stp_alm.o \
+ istp_alm.o ref_alm.o almcal.o
+
+sys_manage = rot_rdq.o irot_rdq.o get_tid.o iget_tid.o \
+ loc_cpu.o iloc_cpu.o unl_cpu.o iunl_cpu.o dis_dsp.o ena_dsp.o \
+ sns_ctx.o sns_loc.o sns_dsp.o sns_dpn.o sns_ker.o
+
+interrupt = isrini.o isrcal.o acre_isr.o del_isr.o \
+ intini.o dis_int.o ena_int.o chg_ipm.o get_ipm.o
+
+exception = excini.o xsns_dpn.o xsns_xpn.o
+
+#
+# 生成されるオブジェクトファイルの依存関係の定義
+#
+$(startup) $(startup:.o=.s) $(startup:.o=.d): startup.c
+$(task) $(task:.o=.s) $(task:.o=.d): task.c
+$(wait) $(wait:.o=.s) $(wait:.o=.d): wait.c
+$(time_event) $(time_event:.o=.s) $(time_event:.o=.d): time_event.c
+$(task_manage) $(task_manage:.o=.s) $(task_manage:.o=.d): task_manage.c
+$(task_refer) $(task_refer:.o=.s) $(task_refer:.o=.d): task_refer.c
+$(task_sync) $(task_sync:.o=.s) $(task_sync:.o=.d): task_sync.c
+$(task_except) $(task_except:.o=.s) $(task_except:.o=.d): task_except.c
+$(semaphore) $(semaphore:.o=.s) $(semaphore:.o=.d): semaphore.c
+$(eventflag) $(eventflag:.o=.s) $(eventflag:.o=.d): eventflag.c
+$(dataqueue) $(dataqueue:.o=.s) $(dataqueue:.o=.d): dataqueue.c
+$(pridataq) $(pridataq:.o=.s) $(pridataq:.o=.d): pridataq.c
+$(mailbox) $(mailbox:.o=.s) $(mailbox:.o=.d): mailbox.c
+$(mempfix) $(mempfix:.o=.s) $(mempfix:.o=.d): mempfix.c
+$(time_manage) $(time_manage:.o=.s) $(time_manage:.o=.d): time_manage.c
+$(cyclic) $(cyclic:.o=.s) $(cyclic:.o=.d): cyclic.c
+$(alarm) $(alarm:.o=.s) $(alarm:.o=.d): alarm.c
+$(sys_manage) $(sys_manage:.o=.s) $(sys_manage:.o=.d): sys_manage.c
+$(interrupt) $(interrupt:.o=.s) $(interrupt:.o=.d): interrupt.c
+$(exception) $(exception:.o=.s) $(exception:.o=.d): exception.c
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: alarm.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * アラームハンドラ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "alarm.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ALM_ENTER
+#define LOG_ALM_ENTER(p_almcb)
+#endif /* LOG_ALM_ENTER */
+
+#ifndef LOG_ALM_LEAVE
+#define LOG_ALM_LEAVE(p_almcb)
+#endif /* LOG_ALM_LEAVE */
+
+#ifndef LOG_ACRE_ALM_ENTER
+#define LOG_ACRE_ALM_ENTER(pk_calm)
+#endif /* LOG_ACRE_ALM_ENTER */
+
+#ifndef LOG_ACRE_ALM_LEAVE
+#define LOG_ACRE_ALM_LEAVE(ercd)
+#endif /* LOG_ACRE_ALM_LEAVE */
+
+#ifndef LOG_DEL_ALM_ENTER
+#define LOG_DEL_ALM_ENTER(almid)
+#endif /* LOG_DEL_ALM_ENTER */
+
+#ifndef LOG_DEL_ALM_LEAVE
+#define LOG_DEL_ALM_LEAVE(ercd)
+#endif /* LOG_DEL_ALM_LEAVE */
+
+#ifndef LOG_STA_ALM_ENTER
+#define LOG_STA_ALM_ENTER(almid, almtim)
+#endif /* LOG_STA_ALM_ENTER */
+
+#ifndef LOG_STA_ALM_LEAVE
+#define LOG_STA_ALM_LEAVE(ercd)
+#endif /* LOG_STA_ALM_LEAVE */
+
+#ifndef LOG_ISTA_ALM_ENTER
+#define LOG_ISTA_ALM_ENTER(almid, almtim)
+#endif /* LOG_ISTA_ALM_ENTER */
+
+#ifndef LOG_ISTA_ALM_LEAVE
+#define LOG_ISTA_ALM_LEAVE(ercd)
+#endif /* LOG_ISTA_ALM_LEAVE */
+
+#ifndef LOG_STP_ALM_ENTER
+#define LOG_STP_ALM_ENTER(almid)
+#endif /* LOG_STP_ALM_ENTER */
+
+#ifndef LOG_STP_ALM_LEAVE
+#define LOG_STP_ALM_LEAVE(ercd)
+#endif /* LOG_STP_ALM_LEAVE */
+
+#ifndef LOG_ISTP_ALM_ENTER
+#define LOG_ISTP_ALM_ENTER(almid)
+#endif /* LOG_ISTP_ALM_ENTER */
+
+#ifndef LOG_ISTP_ALM_LEAVE
+#define LOG_ISTP_ALM_LEAVE(ercd)
+#endif /* LOG_ISTP_ALM_LEAVE */
+
+#ifndef LOG_REF_ALM_ENTER
+#define LOG_REF_ALM_ENTER(almid, pk_ralm)
+#endif /* LOG_REF_ALM_ENTER */
+
+#ifndef LOG_REF_ALM_LEAVE
+#define LOG_REF_ALM_LEAVE(ercd, pk_ralm)
+#endif /* LOG_REF_ALM_LEAVE */
+
+/*
+ * アラームハンドラの数
+ */
+#define tnum_alm ((uint_t)(tmax_almid - TMIN_ALMID + 1))
+#define tnum_salm ((uint_t)(tmax_salmid - TMIN_ALMID + 1))
+
+/*
+ * アラームハンドラIDからアラームハンドラ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_ALM(almid) ((uint_t)((almid) - TMIN_ALMID))
+#define get_almcb(almid) (&(almcb_table[INDEX_ALM(almid)]))
+
+#ifdef TOPPERS_almini
+
+/*
+ * 使用していないアラームハンドラ管理ブロックのリスト
+ *
+ * アラームハンドラ管理ブロックの先頭にはキューにつなぐための領域がな
+ * いため,タイムイベントブロック(tmevtb)の領域を用いる.
+ */
+QUEUE free_almcb;
+
+/*
+ * アラームハンドラ機能の初期化
+ */
+void
+initialize_alarm(void)
+{
+ uint_t i, j;
+ ALMCB *p_almcb;
+ ALMINIB *p_alminib;
+
+ for (p_almcb = almcb_table, i = 0; i < tnum_salm; p_almcb++, i++) {
+ p_almcb->p_alminib = &(alminib_table[i]);
+ p_almcb->almsta = false;
+ }
+ queue_initialize(&free_almcb);
+ for (j = 0; i < tnum_alm; p_almcb++, i++, j++) {
+ p_alminib = &(aalminib_table[j]);
+ p_alminib->almatr = TA_NOEXS;
+ p_almcb->p_alminib = ((const ALMINIB *) p_alminib);
+ queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb)));
+ }
+}
+
+#endif /* TOPPERS_almini */
+
+/*
+ * アラームハンドラの生成
+ */
+#ifdef TOPPERS_acre_alm
+
+ER_UINT
+acre_alm(const T_CALM *pk_calm)
+{
+ ALMCB *p_almcb;
+ ALMINIB *p_alminib;
+ ER ercd;
+
+ LOG_ACRE_ALM_ENTER(pk_calm);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_calm->almatr, TA_NULL);
+ CHECK_ALIGN_FUNC(pk_calm->almhdr);
+ CHECK_NONNULL_FUNC(pk_calm->almhdr);
+
+ t_lock_cpu();
+ if (queue_empty(&free_almcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ p_almcb = ((ALMCB *)(((char *) queue_delete_next(&free_almcb))
+ - offsetof(ALMCB, tmevtb)));
+ p_alminib = (ALMINIB *)(p_almcb->p_alminib);
+ p_alminib->almatr = pk_calm->almatr;
+ p_alminib->exinf = pk_calm->exinf;
+ p_alminib->almhdr = pk_calm->almhdr;
+
+ p_almcb->almsta = false;
+ ercd = ALMID(p_almcb);
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_ALM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_alm */
+
+/*
+ * アラームハンドラの削除
+ */
+#ifdef TOPPERS_del_alm
+
+ER
+del_alm(ID almid)
+{
+ ALMCB *p_almcb;
+ ALMINIB *p_alminib;
+ ER ercd;
+
+ LOG_DEL_ALM_ENTER(almid);
+ CHECK_TSKCTX_UNL();
+ CHECK_ALMID(almid);
+ p_almcb = get_almcb(almid);
+
+ t_lock_cpu();
+ if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (ALMID(p_almcb) > tmax_salmid) {
+ if (p_almcb->almsta) {
+ p_almcb->almsta = false;
+ tmevtb_dequeue(&(p_almcb->tmevtb));
+ }
+
+ p_alminib = (ALMINIB *)(p_almcb->p_alminib);
+ p_alminib->almatr = TA_NOEXS;
+ queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb)));
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_ALM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_alm */
+
+/*
+ * アラームハンドラの動作開始
+ */
+#ifdef TOPPERS_sta_alm
+
+ER
+sta_alm(ID almid, RELTIM almtim)
+{
+ ALMCB *p_almcb;
+ ER ercd;
+
+ LOG_STA_ALM_ENTER(almid, almtim);
+ CHECK_TSKCTX_UNL();
+ CHECK_ALMID(almid);
+ CHECK_PAR(almtim <= TMAX_RELTIM);
+ p_almcb = get_almcb(almid);
+
+ t_lock_cpu();
+ if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_almcb->almsta) {
+ tmevtb_dequeue(&(p_almcb->tmevtb));
+ }
+ else {
+ p_almcb->almsta = true;
+ }
+ tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
+ (CBACK) call_almhdr, (void *) p_almcb);
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_STA_ALM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_sta_alm */
+
+/*
+ * アラームハンドラの動作開始(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ista_alm
+
+ER
+ista_alm(ID almid, RELTIM almtim)
+{
+ ALMCB *p_almcb;
+ ER ercd;
+
+ LOG_ISTA_ALM_ENTER(almid, almtim);
+ CHECK_INTCTX_UNL();
+ CHECK_ALMID(almid);
+ CHECK_PAR(almtim <= TMAX_RELTIM);
+ p_almcb = get_almcb(almid);
+
+ i_lock_cpu();
+ if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_almcb->almsta) {
+ tmevtb_dequeue(&(p_almcb->tmevtb));
+ }
+ else {
+ p_almcb->almsta = true;
+ }
+ tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
+ (CBACK) call_almhdr, (void *) p_almcb);
+ ercd = E_OK;
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_ISTA_ALM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ista_alm */
+
+/*
+ * アラームハンドラの動作停止
+ */
+#ifdef TOPPERS_stp_alm
+
+ER
+stp_alm(ID almid)
+{
+ ALMCB *p_almcb;
+ ER ercd;
+
+ LOG_STP_ALM_ENTER(almid);
+ CHECK_TSKCTX_UNL();
+ CHECK_ALMID(almid);
+ p_almcb = get_almcb(almid);
+
+ t_lock_cpu();
+ if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_almcb->almsta) {
+ p_almcb->almsta = false;
+ tmevtb_dequeue(&(p_almcb->tmevtb));
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_STP_ALM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_stp_alm */
+
+/*
+ * アラームハンドラの動作停止(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_istp_alm
+
+ER
+istp_alm(ID almid)
+{
+ ALMCB *p_almcb;
+ ER ercd;
+
+ LOG_ISTP_ALM_ENTER(almid);
+ CHECK_INTCTX_UNL();
+ CHECK_ALMID(almid);
+ p_almcb = get_almcb(almid);
+
+ i_lock_cpu();
+ if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_almcb->almsta) {
+ p_almcb->almsta = false;
+ tmevtb_dequeue(&(p_almcb->tmevtb));
+ }
+ ercd = E_OK;
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_ISTP_ALM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_istp_alm */
+
+/*
+ * アラームハンドラの状態参照
+ */
+#ifdef TOPPERS_ref_alm
+
+ER
+ref_alm(ID almid, T_RALM *pk_ralm)
+{
+ ALMCB *p_almcb;
+ ER ercd;
+
+ LOG_REF_ALM_ENTER(almid, pk_ralm);
+ CHECK_TSKCTX_UNL();
+ CHECK_ALMID(almid);
+ p_almcb = get_almcb(almid);
+
+ t_lock_cpu();
+ if (p_almcb->p_alminib->almatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ if (p_almcb->almsta) {
+ pk_ralm->almstat = TALM_STA;
+ pk_ralm->lefttim = tmevt_lefttim(&(p_almcb->tmevtb));
+ }
+ else {
+ pk_ralm->almstat = TALM_STP;
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_ALM_LEAVE(ercd, pk_ralm);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_alm */
+
+/*
+ * アラームハンドラ起動ルーチン
+ */
+#ifdef TOPPERS_almcal
+
+void
+call_almhdr(ALMCB *p_almcb)
+{
+ PRI saved_ipm;
+
+ /*
+ * アラームハンドラを停止状態にする.
+ */
+ p_almcb->almsta = false;
+
+ /*
+ * アラームハンドラを,CPUロック解除状態で呼び出す.
+ */
+ saved_ipm = i_get_ipm();
+ i_unlock_cpu();
+
+ LOG_ALM_ENTER(p_almcb);
+ (*((ALMHDR)(p_almcb->p_alminib->almhdr)))(p_almcb->p_alminib->exinf);
+ LOG_ALM_LEAVE(p_almcb);
+
+ if (!i_sense_lock()) {
+ i_lock_cpu();
+ }
+ i_set_ipm(saved_ipm);
+}
+
+#endif /* TOPPERS_almcal */
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
+ * @(#) $Id: alarm.h 1966 2010-11-20 07:23:56Z ertl-hiro $
*/
-#ifndef TOPPERS_TARGET_CONFIG_H
-#define TOPPERS_TARGET_CONFIG_H
-
/*
- * ターゲット依存部モジュール(CQ-STARM用)
- *
- * カーネルのターゲット依存部のインクルードファイル.kernel_impl.hのター
- * ゲット依存部の位置付けとなす.
+ * アラームハンドラ機能
*/
+#ifndef TOPPERS_ALARM_H
+#define TOPPERS_ALARM_H
+
+#include <queue.h>
+#include "time_event.h"
+
/*
- * ターゲットシステムのハードウェア資源の定義
+ * アラームハンドラ初期化ブロック
*/
-#include "cq_starm.h"
+typedef struct alarm_handler_initialization_block {
+ ATR almatr; /* アラームハンドラ属性 */
+ intptr_t exinf; /* アラームハンドラの拡張情報 */
+ ALMHDR almhdr; /* アラームハンドラの起動番地 */
+} ALMINIB;
/*
- * ã\83\88ã\83¬ã\83¼ã\82¹ã\83ã\82°ã\81«é\96¢ã\81\99ã\82\8bè¨å®\9a
+ * ã\82¢ã\83©ã\83¼ã\83 ã\83\8fã\83³ã\83\89ã\83©ç®¡ç\90\86ã\83\96ã\83ã\83\83ã\82¯
*/
-#ifdef TOPPERS_ENABLE_TRACE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_ENABLE_TRACE */
+typedef struct alarm_handler_control_block {
+ const ALMINIB *p_alminib; /* 初期化ブロックへのポインタ */
+ bool_t almsta; /* アラームハンドラの動作状態 */
+ TMEVTB tmevtb; /* タイムイベントブロック */
+} ALMCB;
/*
- * デフォルトの非タスクコンテキスト用のスタック領域の定義
- * 8byte単位で取得される.
+ * 使用していないアラームハンドラ管理ブロックのリスト
*/
-#define DEFAULT_ISTKSZ (0x1000/8U) /* 4KByte */
+extern QUEUE free_almcb;
/*
- * 微少時間待ちのための定義(本来はSILのターゲット依存部)
+ * アラームハンドラIDの最大値(kernel_cfg.c)
*/
-#define SIL_DLY_TIM1 162
-#define SIL_DLY_TIM2 100
+extern const ID tmax_almid;
+extern const ID tmax_salmid;
/*
- * 使用するシリアルポートID
+ * アラームハンドラ初期化ブロックのエリア(kernel_cfg.c)
*/
-#define SIO_PORTID (1)
+extern const ALMINIB alminib_table[];
+extern ALMINIB aalminib_table[];
/*
- * CQ-STARM用のIDLE処理の定義
- *
- * サスペンド時にOpenOCDデバッグツールが使えなくなる問題の対応
- * WFI等でサスペンドしているプログラムに対して,フラッシュROM
- * 書き込みも出来なくなるため,IDEL処理変更.
+ * アラームハンドラ管理ブロックのエリア(kernel_cfg.c)
*/
-#define TOPPERS_CUSTOM_IDEL
-#define toppers_asm_custom_idle \
- msr basepri, r0; \
- msr basepri, r1;
-
-
-#ifndef TOPPERS_MACRO_ONLY
+extern ALMCB almcb_table[];
/*
- * ターゲットシステム依存の初期化
+ * アラームハンドラ管理ブロックからアラームハンドラIDを取り出すための
+ * マクロ
*/
-extern void target_initialize(void);
+#define ALMID(p_almcb) ((ID)(((p_almcb) - almcb_table) + TMIN_ALMID))
/*
- * ターゲットシステムの終了
- *
- * システムを終了する時に使う.
+ * アラームハンドラ機能の初期化
*/
-extern void target_exit(void) NoReturn;
-
-#endif /* TOPPERS_MACRO_ONLY */
+extern void initialize_alarm(void);
/*
- * ã\83\81ã\83\83ã\83\97ä¾\9då\98ã\83¢ã\82¸ã\83¥ã\83¼ã\83«ï¼\88ARM-Mç\94¨ï¼\89
+ * ã\82¢ã\83©ã\83¼ã\83 ã\83\8fã\83³ã\83\89ã\83©èµ·å\8b\95ã\83«ã\83¼ã\83\81ã\83³
*/
-#include "arm_m_gcc/prc_config.h"
+extern void call_almhdr(ALMCB *p_almcb);
-#endif /* TOPPERS_TARGET_CONFIG_H */
+#endif /* TOPPERS_ALARM_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2005-2010 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: allfunc.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * すべての関数をコンパイルするための定義
+ */
+
+#ifndef TOPPERS_ALLFUNC_H
+#define TOPPERS_ALLFUNC_H
+
+/* startup.c */
+#define TOPPERS_sta_ker
+#define TOPPERS_ext_ker
+#define TOPPERS_kermem
+
+/* task.c */
+#define TOPPERS_tskini
+#define TOPPERS_tsksched
+#define TOPPERS_tskrun
+#define TOPPERS_tsknrun
+#define TOPPERS_tskdmt
+#define TOPPERS_tskact
+#define TOPPERS_tskpri
+#define TOPPERS_tskrot
+#define TOPPERS_tsktex
+
+/* wait.c */
+#define TOPPERS_waimake
+#define TOPPERS_waicmp
+#define TOPPERS_waitmo
+#define TOPPERS_waitmook
+#define TOPPERS_wairel
+#define TOPPERS_wobjwai
+#define TOPPERS_wobjwaitmo
+#define TOPPERS_iniwque
+
+/* time_event.c */
+#define TOPPERS_tmeini
+#define TOPPERS_tmeup
+#define TOPPERS_tmedown
+#define TOPPERS_tmeins
+#define TOPPERS_tmedel
+#define TOPPERS_tmeltim
+#define TOPPERS_sigtim
+
+/* task_manage.c */
+#define TOPPERS_acre_tsk
+#define TOPPERS_del_tsk
+#define TOPPERS_act_tsk
+#define TOPPERS_iact_tsk
+#define TOPPERS_can_act
+#define TOPPERS_ext_tsk
+#define TOPPERS_ter_tsk
+#define TOPPERS_chg_pri
+#define TOPPERS_get_pri
+#define TOPPERS_get_inf
+
+/* task_refer.c */
+#define TOPPERS_ref_tsk
+
+/* task_sync.c */
+#define TOPPERS_slp_tsk
+#define TOPPERS_tslp_tsk
+#define TOPPERS_wup_tsk
+#define TOPPERS_iwup_tsk
+#define TOPPERS_can_wup
+#define TOPPERS_rel_wai
+#define TOPPERS_irel_wai
+#define TOPPERS_sus_tsk
+#define TOPPERS_rsm_tsk
+#define TOPPERS_dly_tsk
+
+/* task_except.c */
+#define TOPPERS_def_tex
+#define TOPPERS_ras_tex
+#define TOPPERS_iras_tex
+#define TOPPERS_dis_tex
+#define TOPPERS_ena_tex
+#define TOPPERS_sns_tex
+#define TOPPERS_ref_tex
+
+/* semaphore.c */
+#define TOPPERS_semini
+#define TOPPERS_acre_sem
+#define TOPPERS_del_sem
+#define TOPPERS_sig_sem
+#define TOPPERS_isig_sem
+#define TOPPERS_wai_sem
+#define TOPPERS_pol_sem
+#define TOPPERS_twai_sem
+#define TOPPERS_ini_sem
+#define TOPPERS_ref_sem
+
+/* eventflag.c */
+#define TOPPERS_flgini
+#define TOPPERS_flgcnd
+#define TOPPERS_acre_flg
+#define TOPPERS_del_flg
+#define TOPPERS_set_flg
+#define TOPPERS_iset_flg
+#define TOPPERS_clr_flg
+#define TOPPERS_wai_flg
+#define TOPPERS_pol_flg
+#define TOPPERS_twai_flg
+#define TOPPERS_ini_flg
+#define TOPPERS_ref_flg
+
+/* dataqueue.c */
+#define TOPPERS_dtqini
+#define TOPPERS_dtqenq
+#define TOPPERS_dtqfenq
+#define TOPPERS_dtqdeq
+#define TOPPERS_dtqsnd
+#define TOPPERS_dtqfsnd
+#define TOPPERS_dtqrcv
+#define TOPPERS_acre_dtq
+#define TOPPERS_del_dtq
+#define TOPPERS_snd_dtq
+#define TOPPERS_psnd_dtq
+#define TOPPERS_ipsnd_dtq
+#define TOPPERS_tsnd_dtq
+#define TOPPERS_fsnd_dtq
+#define TOPPERS_ifsnd_dtq
+#define TOPPERS_rcv_dtq
+#define TOPPERS_prcv_dtq
+#define TOPPERS_trcv_dtq
+#define TOPPERS_ini_dtq
+#define TOPPERS_ref_dtq
+
+/* pridataq.c */
+#define TOPPERS_pdqini
+#define TOPPERS_pdqenq
+#define TOPPERS_pdqdeq
+#define TOPPERS_pdqsnd
+#define TOPPERS_pdqrcv
+#define TOPPERS_acre_pdq
+#define TOPPERS_del_pdq
+#define TOPPERS_snd_pdq
+#define TOPPERS_psnd_pdq
+#define TOPPERS_ipsnd_pdq
+#define TOPPERS_tsnd_pdq
+#define TOPPERS_rcv_pdq
+#define TOPPERS_prcv_pdq
+#define TOPPERS_trcv_pdq
+#define TOPPERS_ini_pdq
+#define TOPPERS_ref_pdq
+
+/* mailbox.c */
+#define TOPPERS_mbxini
+#define TOPPERS_acre_mbx
+#define TOPPERS_del_mbx
+#define TOPPERS_snd_mbx
+#define TOPPERS_rcv_mbx
+#define TOPPERS_prcv_mbx
+#define TOPPERS_trcv_mbx
+#define TOPPERS_ini_mbx
+#define TOPPERS_ref_mbx
+
+/* mempfix.c */
+#define TOPPERS_mpfini
+#define TOPPERS_mpfget
+#define TOPPERS_acre_mpf
+#define TOPPERS_del_mpf
+#define TOPPERS_get_mpf
+#define TOPPERS_pget_mpf
+#define TOPPERS_tget_mpf
+#define TOPPERS_rel_mpf
+#define TOPPERS_ini_mpf
+#define TOPPERS_ref_mpf
+
+/* time_manage.c */
+#define TOPPERS_get_tim
+#define TOPPERS_get_utm
+
+/* cyclic.c */
+#define TOPPERS_cycini
+#define TOPPERS_acre_cyc
+#define TOPPERS_del_cyc
+#define TOPPERS_sta_cyc
+#define TOPPERS_stp_cyc
+#define TOPPERS_ref_cyc
+#define TOPPERS_cyccal
+
+/* alarm.c */
+#define TOPPERS_almini
+#define TOPPERS_acre_alm
+#define TOPPERS_del_alm
+#define TOPPERS_sta_alm
+#define TOPPERS_ista_alm
+#define TOPPERS_stp_alm
+#define TOPPERS_istp_alm
+#define TOPPERS_ref_alm
+#define TOPPERS_almcal
+
+/* sys_manage.c */
+#define TOPPERS_rot_rdq
+#define TOPPERS_irot_rdq
+#define TOPPERS_get_tid
+#define TOPPERS_iget_tid
+#define TOPPERS_loc_cpu
+#define TOPPERS_iloc_cpu
+#define TOPPERS_unl_cpu
+#define TOPPERS_iunl_cpu
+#define TOPPERS_dis_dsp
+#define TOPPERS_ena_dsp
+#define TOPPERS_sns_ctx
+#define TOPPERS_sns_loc
+#define TOPPERS_sns_dsp
+#define TOPPERS_sns_dpn
+#define TOPPERS_sns_ker
+
+/* interrupt.c */
+#define TOPPERS_isrini
+#define TOPPERS_isrcal
+#define TOPPERS_acre_isr
+#define TOPPERS_del_isr
+#define TOPPERS_intini
+#define TOPPERS_dis_int
+#define TOPPERS_ena_int
+#define TOPPERS_chg_ipm
+#define TOPPERS_get_ipm
+
+/* exception.c */
+#define TOPPERS_excini
+#define TOPPERS_xsns_dpn
+#define TOPPERS_xsns_xpn
+
+#endif /* TOPPERS_ALLFUNC_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: check.h 1970 2010-11-20 11:27:06Z ertl-hiro $
+ */
+
+/*
+ * エラーチェック用マクロ
+ */
+
+#ifndef TOPPERS_CHECK_H
+#define TOPPERS_CHECK_H
+
+/*
+ * 予約属性エラーのチェック(E_PAR)
+ */
+#define CHECK_RSATR(atr, valid_atr) { \
+ if (((atr) & ~(valid_atr)) != 0U) { \
+ ercd = E_RSATR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 優先度の範囲の判定
+ */
+#define VALID_TPRI(tpri) (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI)
+
+#define VALID_DPRI(dpri) (TMIN_DPRI <= (dpri) && (dpri) <= TMAX_DPRI)
+
+#define VALID_MPRI(mpri) (TMIN_MPRI <= (mpri) && (mpri) <= TMAX_MPRI)
+
+#define VALID_ISRPRI(isrpri) \
+ (TMIN_ISRPRI <= (isrpri) && (isrpri) <= TMAX_ISRPRI)
+
+#ifndef VALID_INTPRI_CHGIPM
+#define VALID_INTPRI_CHGIPM(intpri) \
+ (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
+#endif /* VALID_INTPRI_CHGIPM */
+
+/*
+ * タスク優先度のチェック(E_PAR)
+ */
+#define CHECK_TPRI(tpri) { \
+ if (!VALID_TPRI(tpri)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_TPRI_INI(tpri) { \
+ if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_TPRI_SELF(tpri) { \
+ if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * データ優先度のチェック(E_PAR)
+ */
+#define CHECK_DPRI(dpri) { \
+ if (!VALID_DPRI(dpri)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * メッセージ優先度のチェック(E_PAR)
+ */
+#define CHECK_MPRI(mpri) { \
+ if (!VALID_MPRI(mpri)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 割込みサービスルーチン優先度のチェック(E_PAR)
+ */
+#define CHECK_ISRPRI(isrpri) { \
+ if (!VALID_ISRPRI(isrpri)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * タイムアウト指定値のチェック(E_PAR)
+ */
+#define CHECK_TMOUT(tmout) { \
+ if (!(TMO_FEVR <= (tmout))) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 割込み優先度のチェック(E_PAR)
+ */
+#define CHECK_INTPRI_CHGIPM(intpri) { \
+ if (!VALID_INTPRI_CHGIPM(intpri)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 割込み番号のチェック(E_PAR)
+ */
+#define CHECK_INTNO_CREISR(intno) { \
+ if (!VALID_INTNO_CREISR(intno)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_INTNO_DISINT(intno) { \
+ if (!VALID_INTNO_DISINT(intno)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * アラインしているかの判定
+ */
+#define ALIGNED(val, align) ((((uintptr_t)(val)) & ((align) - 1U)) == 0U)
+
+#ifdef CHECK_FUNC_ALIGN
+#define FUNC_ALIGNED(func) ALIGNED(func, CHECK_FUNC_ALIGN)
+#else /* CHECK_FUNC_ALIGN */
+#define FUNC_ALIGNED(func) true
+#endif /* CHECK_FUNC_ALIGN */
+
+#ifdef CHECK_STKSZ_ALIGN
+#define STKSZ_ALIGNED(stksz) ALIGNED(stksz, CHECK_STKSZ_ALIGN)
+#else /* CHECK_STKSZ_ALIGN */
+#define STKSZ_ALIGNED(stksz) true
+#endif /* CHECK_STKSZ_ALIGN */
+
+#ifdef CHECK_STACK_ALIGN
+#define STACK_ALIGNED(stack) ALIGNED(stack, CHECK_STACK_ALIGN)
+#else /* CHECK_STACK_ALIGN */
+#define STACK_ALIGNED(stack) true
+#endif /* CHECK_STACK_ALIGN */
+
+#ifdef CHECK_MPF_ALIGN
+#define MPF_ALIGNED(mpf) ALIGNED(mpf, CHECK_MPF_ALIGN)
+#else /* CHECK_MPF_ALIGN */
+#define MPF_ALIGNED(mpf) true
+#endif /* CHECK_MPF_ALIGN */
+
+#ifdef CHECK_MB_ALIGN
+#define MB_ALIGNED(mb) ALIGNED(mb, CHECK_MB_ALIGN)
+#else /* CHECK_MB_ALIGN */
+#define MB_ALIGNED(mb) true
+#endif /* CHECK_MB_ALIGN */
+
+/*
+ * NULLでないことのチェック
+ */
+#ifdef CHECK_FUNC_NONNULL
+#define FUNC_NONNULL(func) ((func) != NULL)
+#else /* CHECK_FUNC_NONNULL */
+#define FUNC_NONNULL(func) true
+#endif /* CHECK_FUNC_NONNULL */
+
+#ifdef CHECK_STACK_NONNULL
+#define STACK_NONNULL(stack) ((stack) != NULL)
+#else /* CHECK_STACK_NONNULL */
+#define STACK_NONNULL(stack) true
+#endif /* CHECK_STACK_NONNULL */
+
+#ifdef CHECK_MPF_NONNULL
+#define MPF_NONNULL(mpf) ((mpf) != NULL)
+#else /* CHECK_MPF_NONNULL */
+#define MPF_NONNULL(mpf) true
+#endif /* CHECK_MPF_NONNULL */
+
+/*
+ * 関数の先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_FUNC(func) { \
+ if (!FUNC_ALIGNED(func)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_NONNULL_FUNC(func) { \
+ if (!FUNC_NONNULL(func)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * スタックサイズのチェック(E_PAR)
+ */
+#define CHECK_ALIGN_STKSZ(stksz) { \
+ if (!STKSZ_ALIGNED(stksz)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#ifndef TARGET_MIN_STKSZ
+#define TARGET_MIN_STKSZ 1U /* 未定義の場合は0でないことをチェック */
+#endif /* TARGET_MIN_STKSZ */
+
+#define CHECK_STKSZ_MIN(stksz) { \
+ if ((stksz) < TARGET_MIN_STKSZ) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * スタックの先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_STACK(stack) { \
+ if (!STACK_ALIGNED(stack)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_NONNULL_STACK(stack) { \
+ if (!STACK_NONNULL(stack)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 固定長メモリプール領域の先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_MPF(mpf) { \
+ if (!MPF_ALIGNED(mpf)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_NONNULL_MPF(mpf) { \
+ if (!MPF_NONNULL(mpf)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 管理領域の先頭番地のチェック(E_PAR)
+ */
+#define CHECK_ALIGN_MB(mb) { \
+ if (!MB_ALIGNED(mb)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * その他のパラメータエラーのチェック(E_PAR)
+ */
+#define CHECK_PAR(exp) { \
+ if (!(exp)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * オブジェクトIDの範囲の判定
+ */
+#define VALID_TSKID(tskid) (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)
+#define VALID_SEMID(semid) (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
+#define VALID_FLGID(flgid) (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid)
+#define VALID_DTQID(dtqid) (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid)
+#define VALID_PDQID(pdqid) (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid)
+#define VALID_MBXID(mbxid) (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid)
+#define VALID_MPFID(mpfid) (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
+#define VALID_CYCID(cycid) (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
+#define VALID_ALMID(almid) (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
+#define VALID_ISRID(isrid) (TMIN_ISRID <= (isrid) && (isrid) <= tmax_isrid)
+
+/*
+ * オブジェクトIDのチェック(E_ID)
+ */
+#define CHECK_TSKID(tskid) { \
+ if (!VALID_TSKID(tskid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_TSKID_SELF(tskid) { \
+ if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_SEMID(semid) { \
+ if (!VALID_SEMID(semid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_FLGID(flgid) { \
+ if (!VALID_FLGID(flgid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_DTQID(dtqid) { \
+ if (!VALID_DTQID(dtqid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_PDQID(pdqid) { \
+ if (!VALID_PDQID(pdqid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_MBXID(mbxid) { \
+ if (!VALID_MBXID(mbxid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_MPFID(mpfid) { \
+ if (!VALID_MPFID(mpfid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_CYCID(cycid) { \
+ if (!VALID_CYCID(cycid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_ALMID(almid) { \
+ if (!VALID_ALMID(almid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_ISRID(isrid) { \
+ if (!VALID_ISRID(isrid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 呼出しコンテキストのチェック(E_CTX)
+ */
+#define CHECK_TSKCTX() { \
+ if (sense_context()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_INTCTX() { \
+ if (!sense_context()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 呼出しコンテキストとCPUロック状態のチェック(E_CTX)
+ */
+#define CHECK_TSKCTX_UNL() { \
+ if (sense_context() || t_sense_lock()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_INTCTX_UNL() { \
+ if (!sense_context() || i_sense_lock()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * ディスパッチ保留状態でないかのチェック(E_CTX)
+ */
+#define CHECK_DISPATCH() { \
+ if (sense_context() || t_sense_lock() || !dspflg) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * その他のコンテキストエラーのチェック(E_CTX)
+ */
+#define CHECK_CTX(exp) { \
+ if (!(exp)) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 自タスクを指定していないかのチェック(E_ILUSE)
+ */
+#define CHECK_NONSELF(p_tcb) { \
+ if ((p_tcb) == p_runtsk) { \
+ ercd = E_ILUSE; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * その他の不正使用エラーのチェック(E_ILUSE)
+ */
+#define CHECK_ILUSE(exp) { \
+ if (!(exp)) { \
+ ercd = E_ILUSE; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 未サポート機能エラーのチェック(E_NOSPT)
+ */
+#define CHECK_NOSPT(exp) { \
+ if (!(exp)) { \
+ ercd = E_NOSPT; \
+ goto error_exit; \
+ } \
+}
+
+#endif /* TOPPERS_CHECK_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: cyclic.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * 周期ハンドラ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "cyclic.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_CYC_ENTER
+#define LOG_CYC_ENTER(p_cyccb)
+#endif /* LOG_CYC_ENTER */
+
+#ifndef LOG_CYC_LEAVE
+#define LOG_CYC_LEAVE(p_cyccb)
+#endif /* LOG_CYC_LEAVE */
+
+#ifndef LOG_ACRE_CYC_ENTER
+#define LOG_ACRE_CYC_ENTER(pk_ccyc)
+#endif /* LOG_ACRE_CYC_ENTER */
+
+#ifndef LOG_ACRE_CYC_LEAVE
+#define LOG_ACRE_CYC_LEAVE(ercd)
+#endif /* LOG_ACRE_CYC_LEAVE */
+
+#ifndef LOG_DEL_CYC_ENTER
+#define LOG_DEL_CYC_ENTER(cycid)
+#endif /* LOG_DEL_CYC_ENTER */
+
+#ifndef LOG_DEL_CYC_LEAVE
+#define LOG_DEL_CYC_LEAVE(ercd)
+#endif /* LOG_DEL_CYC_LEAVE */
+
+#ifndef LOG_STA_CYC_ENTER
+#define LOG_STA_CYC_ENTER(cycid)
+#endif /* LOG_STA_CYC_ENTER */
+
+#ifndef LOG_STA_CYC_LEAVE
+#define LOG_STA_CYC_LEAVE(ercd)
+#endif /* LOG_STA_CYC_LEAVE */
+
+#ifndef LOG_STP_CYC_ENTER
+#define LOG_STP_CYC_ENTER(cycid)
+#endif /* LOG_STP_CYC_ENTER */
+
+#ifndef LOG_STP_CYC_LEAVE
+#define LOG_STP_CYC_LEAVE(ercd)
+#endif /* LOG_STP_CYC_LEAVE */
+
+#ifndef LOG_REF_CYC_ENTER
+#define LOG_REF_CYC_ENTER(cycid, pk_rcyc)
+#endif /* LOG_REF_CYC_ENTER */
+
+#ifndef LOG_REF_CYC_LEAVE
+#define LOG_REF_CYC_LEAVE(ercd, pk_rcyc)
+#endif /* LOG_REF_CYC_LEAVE */
+
+/*
+ * 周期ハンドラの数
+ */
+#define tnum_cyc ((uint_t)(tmax_cycid - TMIN_CYCID + 1))
+#define tnum_scyc ((uint_t)(tmax_scycid - TMIN_CYCID + 1))
+
+/*
+ * 周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_CYC(cycid) ((uint_t)((cycid) - TMIN_CYCID))
+#define get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)]))
+
+/*
+ * 周期ハンドラ起動のためのタイムイベントブロックの登録
+ */
+Inline void
+tmevtb_enqueue_cyc(CYCCB *p_cyccb, EVTTIM evttim)
+{
+ tmevtb_enqueue_evttim(&(p_cyccb->tmevtb), evttim,
+ (CBACK) call_cychdr, (void *) p_cyccb);
+ p_cyccb->evttim = evttim;
+}
+
+#ifdef TOPPERS_cycini
+
+/*
+ * 使用していない周期ハンドラ管理ブロックのリスト
+ *
+ * 周期ハンドラ管理ブロックの先頭にはキューにつなぐための領域がないた
+ * め,タイムイベントブロック(tmevtb)の領域を用いる.
+ */
+QUEUE free_cyccb;
+
+/*
+ * 周期ハンドラ機能の初期化
+ */
+void
+initialize_cyclic(void)
+{
+ uint_t i, j;
+ CYCCB *p_cyccb;
+ CYCINIB *p_cycinib;
+
+ for (p_cyccb = cyccb_table, i = 0; i < tnum_scyc; p_cyccb++, i++) {
+ p_cyccb->p_cycinib = &(cycinib_table[i]);
+ if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) {
+ p_cyccb->cycsta = true;
+ tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs));
+ }
+ else {
+ p_cyccb->cycsta = false;
+ }
+ }
+ queue_initialize(&free_cyccb);
+ for (j = 0; i < tnum_cyc; p_cyccb++, i++, j++) {
+ p_cycinib = &(acycinib_table[j]);
+ p_cycinib->cycatr = TA_NOEXS;
+ p_cyccb->p_cycinib = ((const CYCINIB *) p_cycinib);
+ queue_insert_prev(&free_cyccb, ((QUEUE *) &(p_cyccb->tmevtb)));
+ }
+}
+
+#endif /* TOPPERS_cycini */
+
+/*
+ * 周期ハンドラの生成
+ */
+#ifdef TOPPERS_acre_cyc
+
+ER_UINT
+acre_cyc(const T_CCYC *pk_ccyc)
+{
+ CYCCB *p_cyccb;
+ CYCINIB *p_cycinib;
+ ER ercd;
+
+ LOG_ACRE_CYC_ENTER(pk_ccyc);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_ccyc->cycatr, TA_STA);
+ CHECK_ALIGN_FUNC(pk_ccyc->cychdr);
+ CHECK_NONNULL_FUNC(pk_ccyc->cychdr);
+ CHECK_PAR(0 < pk_ccyc->cyctim && pk_ccyc->cyctim <= TMAX_RELTIM);
+ CHECK_PAR(0 <= pk_ccyc->cycphs && pk_ccyc->cycphs <= TMAX_RELTIM);
+
+ t_lock_cpu();
+ if (queue_empty(&free_cyccb)) {
+ ercd = E_NOID;
+ }
+ else {
+ p_cyccb = ((CYCCB *)(((char *) queue_delete_next(&free_cyccb))
+ - offsetof(CYCCB, tmevtb)));
+ p_cycinib = (CYCINIB *)(p_cyccb->p_cycinib);
+ p_cycinib->cycatr = pk_ccyc->cycatr;
+ p_cycinib->exinf = pk_ccyc->exinf;
+ p_cycinib->cychdr = pk_ccyc->cychdr;
+ p_cycinib->cyctim = pk_ccyc->cyctim;
+ p_cycinib->cycphs = pk_ccyc->cycphs;
+
+ if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) {
+ p_cyccb->cycsta = true;
+ tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs));
+ }
+ else {
+ p_cyccb->cycsta = false;
+ }
+ ercd = CYCID(p_cyccb);
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_CYC_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_cyc */
+
+/*
+ * 周期ハンドラの削除
+ */
+#ifdef TOPPERS_del_cyc
+
+ER
+del_cyc(ID cycid)
+{
+ CYCCB *p_cyccb;
+ CYCINIB *p_cycinib;
+ ER ercd;
+
+ LOG_DEL_CYC_ENTER(cycid);
+ CHECK_TSKCTX_UNL();
+ CHECK_CYCID(cycid);
+ p_cyccb = get_cyccb(cycid);
+
+ t_lock_cpu();
+ if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (CYCID(p_cyccb) > tmax_scycid) {
+ if (p_cyccb->cycsta) {
+ p_cyccb->cycsta = false;
+ tmevtb_dequeue(&(p_cyccb->tmevtb));
+ }
+
+ p_cycinib = (CYCINIB *)(p_cyccb->p_cycinib);
+ p_cycinib->cycatr = TA_NOEXS;
+ queue_insert_prev(&free_cyccb, ((QUEUE *) &(p_cyccb->tmevtb)));
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_CYC_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_cyc */
+
+/*
+ * 周期ハンドラの動作開始
+ */
+#ifdef TOPPERS_sta_cyc
+
+ER
+sta_cyc(ID cycid)
+{
+ CYCCB *p_cyccb;
+ ER ercd;
+
+ LOG_STA_CYC_ENTER(cycid);
+ CHECK_TSKCTX_UNL();
+ CHECK_CYCID(cycid);
+ p_cyccb = get_cyccb(cycid);
+
+ t_lock_cpu();
+ if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_cyccb->cycsta) {
+ tmevtb_dequeue(&(p_cyccb->tmevtb));
+ }
+ else {
+ p_cyccb->cycsta = true;
+ }
+ tmevtb_enqueue_cyc(p_cyccb, base_time + p_cyccb->p_cycinib->cycphs);
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_STA_CYC_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_sta_cyc */
+
+/*
+ * 周期ハンドラの動作停止
+ */
+#ifdef TOPPERS_stp_cyc
+
+ER
+stp_cyc(ID cycid)
+{
+ CYCCB *p_cyccb;
+ ER ercd;
+
+ LOG_STP_CYC_ENTER(cycid);
+ CHECK_TSKCTX_UNL();
+ CHECK_CYCID(cycid);
+ p_cyccb = get_cyccb(cycid);
+
+ t_lock_cpu();
+ if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_cyccb->cycsta) {
+ p_cyccb->cycsta = false;
+ tmevtb_dequeue(&(p_cyccb->tmevtb));
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_STP_CYC_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_stp_cyc */
+
+/*
+ * 周期ハンドラの状態参照
+ */
+#ifdef TOPPERS_ref_cyc
+
+ER
+ref_cyc(ID cycid, T_RCYC *pk_rcyc)
+{
+ CYCCB *p_cyccb;
+ ER ercd;
+
+ LOG_REF_CYC_ENTER(cycid, pk_rcyc);
+ CHECK_TSKCTX_UNL();
+ CHECK_CYCID(cycid);
+ p_cyccb = get_cyccb(cycid);
+
+ t_lock_cpu();
+ if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ if (p_cyccb->cycsta) {
+ pk_rcyc->cycstat = TCYC_STA;
+ pk_rcyc->lefttim = tmevt_lefttim(&(p_cyccb->tmevtb));
+ }
+ else {
+ pk_rcyc->cycstat = TCYC_STP;
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_CYC_LEAVE(ercd, pk_rcyc);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_cyc */
+
+/*
+ * 周期ハンドラ起動ルーチン
+ */
+#ifdef TOPPERS_cyccal
+
+void
+call_cychdr(CYCCB *p_cyccb)
+{
+ PRI saved_ipm;
+
+ /*
+ * 次回の起動のためのタイムイベントブロックを登録する.
+ *
+ * 同じタイムティックで周期ハンドラを再度起動すべき場合には,この
+ * 関数からsignal_timeに戻った後に,再度この関数が呼ばれることにな
+ * る.
+ */
+ tmevtb_enqueue_cyc(p_cyccb, p_cyccb->evttim + p_cyccb->p_cycinib->cyctim);
+
+ /*
+ * 周期ハンドラを,CPUロック解除状態で呼び出す.
+ */
+ saved_ipm = i_get_ipm();
+ i_unlock_cpu();
+
+ LOG_CYC_ENTER(p_cyccb);
+ (*((CYCHDR)(p_cyccb->p_cycinib->cychdr)))(p_cyccb->p_cycinib->exinf);
+ LOG_CYC_LEAVE(p_cyccb);
+
+ if (!i_sense_lock()) {
+ i_lock_cpu();
+ }
+ i_set_ipm(saved_ipm);
+}
+
+#endif /* TOPPERS_cyccal */
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Advanced Standard Profile Kernel
*
- * Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
+ * @(#) $Id: cyclic.h 1966 2010-11-20 07:23:56Z ertl-hiro $
*/
/*
- * シリアルI/Oデバイス(SIO)ドライバ(CQ-STARM用)
+ * 周期ハンドラ機能
*/
-#ifndef TOPPERS_TARGET_SERIAL_H
-#define TOPPERS_TARGET_SERIAL_H
+#ifndef TOPPERS_CYCLIC_H
+#define TOPPERS_CYCLIC_H
-#include "cq_starm.h"
+#include <queue.h>
+#include "time_event.h"
/*
- * SIOの割込みベクタ番号
+ * 周期ハンドラ初期化ブロック
*/
-#if (SIO_PORTID == 1)
-#define INHNO_SIO IRQ_VECTOR_USART1
-#define INTNO_SIO IRQ_VECTOR_USART1
-#elif (SIO_PORID == 2)
-#define INHNO_SIO IRQ_VECTOR_USART2
-#define INTNO_SIO IRQ_VECTOR_USART2
-#endif
-#define INTPRI_SIO -3 /* 割込み優先度 */
-#define INTATR_SIO 0 /* 割込み属性 */
+typedef struct cyclic_handler_initialization_block {
+ ATR cycatr; /* 周期ハンドラ属性 */
+ intptr_t exinf; /* 周期ハンドラの拡張情報 */
+ CYCHDR cychdr; /* 周期ハンドラの起動番地 */
+ RELTIM cyctim; /* 周期ハンドラの起動周期 */
+ RELTIM cycphs; /* 周期ハンドラの起動位相 */
+} CYCINIB;
/*
- * コールバックルーチンの識別番号
+ * 周期ハンドラ管理ブロック
*/
-#define SIO_RDY_SND 1U /* 送信可能コールバック */
-#define SIO_RDY_RCV 2U /* 受信通知コールバック */
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- * シリアルポートの管理ブロック
- */
-typedef struct sio_port_control_block {
- ID port;
- uint32_t reg;
- intptr_t exinf;
-} SIOPCB;
-
-/*
- * SIO初期化
- */
-extern void sio_initialize(intptr_t exinf);
-
-/*
- * シリアルオープン
- */
-extern SIOPCB *sio_opn_por(ID siopid, intptr_t exinf);
+typedef struct cyclic_handler_control_block {
+ const CYCINIB *p_cycinib; /* 初期化ブロックへのポインタ */
+ bool_t cycsta; /* 周期ハンドラの動作状態 */
+ EVTTIM evttim; /* 次に周期ハンドラを起動する時刻 */
+ TMEVTB tmevtb; /* タイムイベントブロック */
+} CYCCB;
/*
- * シリアルクローズ
+ * 使用していない周期ハンドラ管理ブロックのリスト
*/
-extern void sio_cls_por(SIOPCB *p_siopcb);
+extern QUEUE free_cyccb;
/*
- * å\89²è¾¼ã\81¿ã\83\8fã\83³ã\83\89ã\83©
+ * å\91¨æ\9c\9fã\83\8fã\83³ã\83\89ã\83©IDã\81®æ\9c\80大å\80¤ï¼\88kernel_cfg.cï¼\89
*/
-extern void sio_isr(intptr_t exinf);
+extern const ID tmax_cycid;
+extern const ID tmax_scycid;
/*
- * 1文字送信
- */
-extern bool_t sio_snd_chr(SIOPCB *siopcb, char_t c);
-
-/*
- * 1文字受信
- */
-extern int_t sio_rcv_chr(SIOPCB *siopcb);
-
-/*
- * コールバックの許可
- */
-extern void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn);
-
-/*
- * コールバックの禁止
+ * 周期ハンドラ初期化ブロックのエリア(kernel_cfg.c)
*/
-extern void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn);
+extern const CYCINIB cycinib_table[];
+extern CYCINIB acycinib_table[];
/*
- * 送信可能コールバック
+ * 周期ハンドラ管理ブロックのエリア(kernel_cfg.c)
*/
-extern void sio_irdy_snd(intptr_t exinf);
+extern CYCCB cyccb_table[];
/*
- * å\8f\97ä¿¡é\80\9aç\9f¥ã\82³ã\83¼ã\83«ã\83\90ã\83\83ã\82¯
+ * å\91¨æ\9c\9fã\83\8fã\83³ã\83\89ã\83©ç®¡ç\90\86ã\83\96ã\83ã\83\83ã\82¯ã\81\8bã\82\89å\91¨æ\9c\9fã\83\8fã\83³ã\83\89ã\83©IDã\82\92å\8f\96ã\82\8aå\87ºã\81\99ã\81\9fã\82\81ã\81®ã\83\9eã\82¯ã\83
*/
-extern void sio_irdy_rcv(intptr_t exinf);
+#define CYCID(p_cyccb) ((ID)(((p_cyccb) - cyccb_table) + TMIN_CYCID))
/*
- * 1文字送信(ポーリングでの出力)
+ * 周期ハンドラ機能の初期化
*/
-extern void sio_pol_snd_chr(char_t c, ID siopid);
+extern void initialize_cyclic(void);
/*
- * ターゲットのシリアル初期化
+ * 周期ハンドラ起動ルーチン
*/
-extern void target_usart_init(ID siopid);
+extern void call_cychdr(CYCCB *p_cyccb);
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_SERIAL_H */
+#endif /* TOPPERS_CYCLIC_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: dataqueue.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * データキュー機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "dataqueue.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_DTQ_ENTER
+#define LOG_ACRE_DTQ_ENTER(pk_cdtq)
+#endif /* LOG_ACRE_DTQ_ENTER */
+
+#ifndef LOG_ACRE_DTQ_LEAVE
+#define LOG_ACRE_DTQ_LEAVE(ercd)
+#endif /* LOG_ACRE_DTQ_LEAVE */
+
+#ifndef LOG_DEL_DTQ_ENTER
+#define LOG_DEL_DTQ_ENTER(dtqid)
+#endif /* LOG_DEL_DTQ_ENTER */
+
+#ifndef LOG_DEL_DTQ_LEAVE
+#define LOG_DEL_DTQ_LEAVE(ercd)
+#endif /* LOG_DEL_DTQ_LEAVE */
+
+#ifndef LOG_SND_DTQ_ENTER
+#define LOG_SND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_SND_DTQ_ENTER */
+
+#ifndef LOG_SND_DTQ_LEAVE
+#define LOG_SND_DTQ_LEAVE(ercd)
+#endif /* LOG_SND_DTQ_LEAVE */
+
+#ifndef LOG_PSND_DTQ_ENTER
+#define LOG_PSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_PSND_DTQ_ENTER */
+
+#ifndef LOG_PSND_DTQ_LEAVE
+#define LOG_PSND_DTQ_LEAVE(ercd)
+#endif /* LOG_PSND_DTQ_LEAVE */
+
+#ifndef LOG_IPSND_DTQ_ENTER
+#define LOG_IPSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_IPSND_DTQ_ENTER */
+
+#ifndef LOG_IPSND_DTQ_LEAVE
+#define LOG_IPSND_DTQ_LEAVE(ercd)
+#endif /* LOG_IPSND_DTQ_LEAVE */
+
+#ifndef LOG_TSND_DTQ_ENTER
+#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
+#endif /* LOG_TSND_DTQ_ENTER */
+
+#ifndef LOG_TSND_DTQ_LEAVE
+#define LOG_TSND_DTQ_LEAVE(ercd)
+#endif /* LOG_TSND_DTQ_LEAVE */
+
+#ifndef LOG_FSND_DTQ_ENTER
+#define LOG_FSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_FSND_DTQ_ENTER */
+
+#ifndef LOG_FSND_DTQ_LEAVE
+#define LOG_FSND_DTQ_LEAVE(ercd)
+#endif /* LOG_FSND_DTQ_LEAVE */
+
+#ifndef LOG_IFSND_DTQ_ENTER
+#define LOG_IFSND_DTQ_ENTER(dtqid, data)
+#endif /* LOG_IFSND_DTQ_ENTER */
+
+#ifndef LOG_IFSND_DTQ_LEAVE
+#define LOG_IFSND_DTQ_LEAVE(ercd)
+#endif /* LOG_IFSND_DTQ_LEAVE */
+
+#ifndef LOG_RCV_DTQ_ENTER
+#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
+#endif /* LOG_RCV_DTQ_ENTER */
+
+#ifndef LOG_RCV_DTQ_LEAVE
+#define LOG_RCV_DTQ_LEAVE(ercd, data)
+#endif /* LOG_RCV_DTQ_LEAVE */
+
+#ifndef LOG_PRCV_DTQ_ENTER
+#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
+#endif /* LOG_PRCV_DTQ_ENTER */
+
+#ifndef LOG_PRCV_DTQ_LEAVE
+#define LOG_PRCV_DTQ_LEAVE(ercd, data)
+#endif /* LOG_PRCV_DTQ_LEAVE */
+
+#ifndef LOG_TRCV_DTQ_ENTER
+#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
+#endif /* LOG_TRCV_DTQ_ENTER */
+
+#ifndef LOG_TRCV_DTQ_LEAVE
+#define LOG_TRCV_DTQ_LEAVE(ercd, data)
+#endif /* LOG_TRCV_DTQ_LEAVE */
+
+#ifndef LOG_INI_DTQ_ENTER
+#define LOG_INI_DTQ_ENTER(dtqid)
+#endif /* LOG_INI_DTQ_ENTER */
+
+#ifndef LOG_INI_DTQ_LEAVE
+#define LOG_INI_DTQ_LEAVE(ercd)
+#endif /* LOG_INI_DTQ_LEAVE */
+
+#ifndef LOG_REF_DTQ_ENTER
+#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
+#endif /* LOG_REF_DTQ_ENTER */
+
+#ifndef LOG_REF_DTQ_LEAVE
+#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
+#endif /* LOG_REF_DTQ_LEAVE */
+
+/*
+ * データキューの数
+ */
+#define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
+#define tnum_sdtq ((uint_t)(tmax_sdtqid - TMIN_DTQID + 1))
+
+/*
+ * データキューIDからデータキュー管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_DTQ(dtqid) ((uint_t)((dtqid) - TMIN_DTQID))
+#define get_dtqcb(dtqid) (&(dtqcb_table[INDEX_DTQ(dtqid)]))
+
+#ifdef TOPPERS_dtqini
+
+/*
+ * 使用していないデータキュー管理ブロックのリスト
+ */
+QUEUE free_dtqcb;
+
+/*
+ * データキュー機能の初期化
+ */
+void
+initialize_dataqueue(void)
+{
+ uint_t i, j;
+ DTQCB *p_dtqcb;
+ DTQINIB *p_dtqinib;
+
+ for (p_dtqcb = dtqcb_table, i = 0; i < tnum_sdtq; p_dtqcb++, i++) {
+ queue_initialize(&(p_dtqcb->swait_queue));
+ p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
+ queue_initialize(&(p_dtqcb->rwait_queue));
+ p_dtqcb->count = 0U;
+ p_dtqcb->head = 0U;
+ p_dtqcb->tail = 0U;
+ }
+ queue_initialize(&free_dtqcb);
+ for (j = 0; i < tnum_dtq; p_dtqcb++, i++, j++) {
+ p_dtqinib = &(adtqinib_table[j]);
+ p_dtqinib->dtqatr = TA_NOEXS;
+ p_dtqcb->p_dtqinib = ((const DTQINIB *) p_dtqinib);
+ queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
+ }
+}
+
+#endif /* TOPPERS_dtqini */
+
+/*
+ * データキューの生成
+ */
+#ifdef TOPPERS_acre_dtq
+
+ER_UINT
+acre_dtq(const T_CDTQ *pk_cdtq)
+{
+ DTQCB *p_dtqcb;
+ DTQINIB *p_dtqinib;
+ ATR dtqatr;
+ DTQMB *p_dtqmb;
+ ER ercd;
+
+ LOG_ACRE_DTQ_ENTER(pk_cdtq);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_cdtq->dtqatr, TA_TPRI);
+ dtqatr = pk_cdtq->dtqatr;
+ p_dtqmb = pk_cdtq->dtqmb;
+
+ t_lock_cpu();
+ if (queue_empty(&free_dtqcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
+ p_dtqmb = kernel_malloc(sizeof(DTQMB) * pk_cdtq->dtqcnt);
+ dtqatr |= TA_MBALLOC;
+ }
+ if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
+ ercd = E_NOMEM;
+ }
+ else {
+ p_dtqcb = ((DTQCB *) queue_delete_next(&free_dtqcb));
+ p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
+ p_dtqinib->dtqatr = dtqatr;
+ p_dtqinib->dtqcnt = pk_cdtq->dtqcnt;
+ p_dtqinib->p_dtqmb = p_dtqmb;
+
+ queue_initialize(&(p_dtqcb->swait_queue));
+ queue_initialize(&(p_dtqcb->rwait_queue));
+ p_dtqcb->count = 0U;
+ p_dtqcb->head = 0U;
+ p_dtqcb->tail = 0U;
+ ercd = DTQID(p_dtqcb);
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_dtq */
+
+/*
+ * データキューの削除
+ */
+#ifdef TOPPERS_del_dtq
+
+ER
+del_dtq(ID dtqid)
+{
+ DTQCB *p_dtqcb;
+ DTQINIB *p_dtqinib;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_DEL_DTQ_ENTER(dtqid);
+ CHECK_TSKCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (DTQID(p_dtqcb) > tmax_sdtqid) {
+ dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
+ if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
+ dspreq = true;
+ }
+ p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
+ if ((p_dtqinib->dtqatr & TA_MBALLOC) != 0U) {
+ kernel_free(p_dtqinib->p_dtqmb);
+ }
+ p_dtqinib->dtqatr = TA_NOEXS;
+ queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue));
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_dtq */
+
+/*
+ * データキュー管理領域へのデータの格納
+ */
+#ifdef TOPPERS_dtqenq
+
+void
+enqueue_data(DTQCB *p_dtqcb, intptr_t data)
+{
+ (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
+ p_dtqcb->count++;
+ p_dtqcb->tail++;
+ if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
+ p_dtqcb->tail = 0U;
+ }
+}
+
+#endif /* TOPPERS_dtqenq */
+
+/*
+ * データキュー管理領域へのデータの強制格納
+ */
+#ifdef TOPPERS_dtqfenq
+
+void
+force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
+{
+ (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
+ p_dtqcb->tail++;
+ if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
+ p_dtqcb->tail = 0U;
+ }
+ if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
+ p_dtqcb->count++;
+ }
+ else {
+ p_dtqcb->head = p_dtqcb->tail;
+ }
+}
+
+#endif /* TOPPERS_dtqfenq */
+
+/*
+ * データキュー管理領域からのデータの取出し
+ */
+#ifdef TOPPERS_dtqdeq
+
+void
+dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
+{
+ *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
+ p_dtqcb->count--;
+ p_dtqcb->head++;
+ if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
+ p_dtqcb->head = 0U;
+ }
+}
+
+#endif /* TOPPERS_dtqdeq */
+
+/*
+ * データキューへのデータ送信
+ */
+#ifdef TOPPERS_dtqsnd
+
+bool_t
+send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp)
+{
+ TCB *p_tcb;
+
+ if (!queue_empty(&(p_dtqcb->rwait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
+ ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
+ *p_reqdsp = wait_complete(p_tcb);
+ return(true);
+ }
+ else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
+ enqueue_data(p_dtqcb, data);
+ *p_reqdsp = false;
+ return(true);
+ }
+ else {
+ return(false);
+ }
+}
+
+#endif /* TOPPERS_dtqsnd */
+
+/*
+ * データキューへのデータ強制送信
+ */
+#ifdef TOPPERS_dtqfsnd
+
+bool_t
+force_send_data(DTQCB *p_dtqcb, intptr_t data)
+{
+ TCB *p_tcb;
+
+ if (!queue_empty(&(p_dtqcb->rwait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
+ ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
+ return(wait_complete(p_tcb));
+ }
+ else {
+ force_enqueue_data(p_dtqcb, data);
+ return(false);
+ }
+}
+
+#endif /* TOPPERS_dtqfsnd */
+
+/*
+ * 送信待ちキューの先頭タスクからのデータ受信
+ */
+#ifdef TOPPERS_dtqrcv
+
+bool_t
+receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)
+{
+ TCB *p_tcb;
+ intptr_t data;
+
+ if (p_dtqcb->count > 0U) {
+ dequeue_data(p_dtqcb, p_data);
+ if (!queue_empty(&(p_dtqcb->swait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
+ data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
+ enqueue_data(p_dtqcb, data);
+ *p_reqdsp = wait_complete(p_tcb);
+ }
+ else {
+ *p_reqdsp = false;
+ }
+ return(true);
+ }
+ else if (!queue_empty(&(p_dtqcb->swait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
+ *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
+ *p_reqdsp = wait_complete(p_tcb);
+ return(true);
+ }
+ else {
+ return(false);
+ }
+}
+
+#endif /* TOPPERS_dtqrcv */
+
+/*
+ * データキューへの送信
+ */
+#ifdef TOPPERS_snd_dtq
+
+ER
+snd_dtq(ID dtqid, intptr_t data)
+{
+ DTQCB *p_dtqcb;
+ WINFO_DTQ winfo_dtq;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_SND_DTQ_ENTER(dtqid, data);
+ CHECK_DISPATCH();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ if (send_data(p_dtqcb, data, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ winfo_dtq.data = data;
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
+ wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
+ dispatch();
+ ercd = winfo_dtq.winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SND_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_snd_dtq */
+
+/*
+ * データキューへの送信(ポーリング)
+ */
+#ifdef TOPPERS_psnd_dtq
+
+ER
+psnd_dtq(ID dtqid, intptr_t data)
+{
+ DTQCB *p_dtqcb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_PSND_DTQ_ENTER(dtqid, data);
+ CHECK_TSKCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ if (send_data(p_dtqcb, data, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_PSND_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_psnd_dtq */
+
+/*
+ * データキューへの送信(ポーリング,非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ipsnd_dtq
+
+ER
+ipsnd_dtq(ID dtqid, intptr_t data)
+{
+ DTQCB *p_dtqcb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_IPSND_DTQ_ENTER(dtqid, data);
+ CHECK_INTCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ i_lock_cpu();
+ if (send_data(p_dtqcb, data, &reqdsp)) {
+ if (reqdsp) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IPSND_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ipsnd_dtq */
+
+/*
+ * データキューへの送信(タイムアウトあり)
+ */
+#ifdef TOPPERS_tsnd_dtq
+
+ER
+tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
+{
+ DTQCB *p_dtqcb;
+ WINFO_DTQ winfo_dtq;
+ TMEVTB tmevtb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
+ CHECK_DISPATCH();
+ CHECK_DTQID(dtqid);
+ CHECK_TMOUT(tmout);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ if (send_data(p_dtqcb, data, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ winfo_dtq.data = data;
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
+ wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
+ &tmevtb, tmout);
+ dispatch();
+ ercd = winfo_dtq.winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TSND_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_tsnd_dtq */
+
+/*
+ * データキューへの強制送信
+ */
+#ifdef TOPPERS_fsnd_dtq
+
+ER
+fsnd_dtq(ID dtqid, intptr_t data)
+{
+ DTQCB *p_dtqcb;
+ ER ercd;
+
+ LOG_FSND_DTQ_ENTER(dtqid, data);
+ CHECK_TSKCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+ CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
+
+ t_lock_cpu();
+ if (force_send_data(p_dtqcb, data)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_FSND_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_fsnd_dtq */
+
+/*
+ * データキューへの強制送信(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ifsnd_dtq
+
+ER
+ifsnd_dtq(ID dtqid, intptr_t data)
+{
+ DTQCB *p_dtqcb;
+ ER ercd;
+
+ LOG_IFSND_DTQ_ENTER(dtqid, data);
+ CHECK_INTCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+ CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
+
+ i_lock_cpu();
+ if (force_send_data(p_dtqcb, data)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IFSND_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ifsnd_dtq */
+
+/*
+ * データキューからの受信
+ */
+#ifdef TOPPERS_rcv_dtq
+
+ER
+rcv_dtq(ID dtqid, intptr_t *p_data)
+{
+ DTQCB *p_dtqcb;
+ WINFO_DTQ winfo_dtq;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_RCV_DTQ_ENTER(dtqid, p_data);
+ CHECK_DISPATCH();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ if (receive_data(p_dtqcb, p_data, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
+ make_wait(&(winfo_dtq.winfo));
+ queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
+ winfo_dtq.p_dtqcb = p_dtqcb;
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo_dtq.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_data = winfo_dtq.data;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_RCV_DTQ_LEAVE(ercd, *p_data);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rcv_dtq */
+
+/*
+ * データキューからの受信(ポーリング)
+ */
+#ifdef TOPPERS_prcv_dtq
+
+ER
+prcv_dtq(ID dtqid, intptr_t *p_data)
+{
+ DTQCB *p_dtqcb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_PRCV_DTQ_ENTER(dtqid, p_data);
+ CHECK_TSKCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ if (receive_data(p_dtqcb, p_data, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
+ return(ercd);
+}
+
+#endif /* TOPPERS_prcv_dtq */
+
+/*
+ * データキューからの受信(タイムアウトあり)
+ */
+#ifdef TOPPERS_trcv_dtq
+
+ER
+trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
+{
+ DTQCB *p_dtqcb;
+ WINFO_DTQ winfo_dtq;
+ TMEVTB tmevtb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
+ CHECK_DISPATCH();
+ CHECK_DTQID(dtqid);
+ CHECK_TMOUT(tmout);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ if (receive_data(p_dtqcb, p_data, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
+ make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout);
+ queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
+ winfo_dtq.p_dtqcb = p_dtqcb;
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo_dtq.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_data = winfo_dtq.data;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
+ return(ercd);
+}
+
+#endif /* TOPPERS_trcv_dtq */
+
+/*
+ * データキューの再初期化
+ */
+#ifdef TOPPERS_ini_dtq
+
+ER
+ini_dtq(ID dtqid)
+{
+ DTQCB *p_dtqcb;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_INI_DTQ_ENTER(dtqid);
+ CHECK_TSKCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
+ if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
+ dspreq = true;
+ };
+ p_dtqcb->count = 0U;
+ p_dtqcb->head = 0U;
+ p_dtqcb->tail = 0U;
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_INI_DTQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ini_dtq */
+
+/*
+ * データキューの状態参照
+ */
+#ifdef TOPPERS_ref_dtq
+
+ER
+ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
+{
+ DTQCB *p_dtqcb;
+ ER ercd;
+
+ LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
+ CHECK_TSKCTX_UNL();
+ CHECK_DTQID(dtqid);
+ p_dtqcb = get_dtqcb(dtqid);
+
+ t_lock_cpu();
+ pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
+ pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
+ pk_rdtq->sdtqcnt = p_dtqcb->count;
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_dtq */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: dataqueue.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * データキュー機能
+ */
+
+#ifndef TOPPERS_DATAQUEUE_H
+#define TOPPERS_DATAQUEUE_H
+
+#include <queue.h>
+
+/*
+ * データ管理ブロック
+ */
+typedef struct data_management_block {
+ intptr_t data; /* データ本体 */
+} DTQMB;
+
+/*
+ * データキュー初期化ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ * (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初のフィールドが共通になっている.
+ */
+typedef struct dataqueue_initialization_block {
+ ATR dtqatr; /* データキュー属性 */
+ uint_t dtqcnt; /* データキューの容量 */
+ DTQMB *p_dtqmb; /* データキュー管理領域の先頭番地 */
+} DTQINIB;
+
+/*
+ * データキュー管理ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ * を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ * フィールドが共通になっている.
+ */
+typedef struct dataqueue_control_block {
+ QUEUE swait_queue; /* データキュー送信待ちキュー */
+ const DTQINIB *p_dtqinib; /* 初期化ブロックへのポインタ */
+ QUEUE rwait_queue; /* データキュー受信待ちキュー */
+ uint_t count; /* データキュー中のデータの数 */
+ uint_t head; /* 最初のデータの格納場所 */
+ uint_t tail; /* 最後のデータの格納場所の次 */
+} DTQCB;
+
+/*
+ * データキュー待ち情報ブロックの定義
+ *
+ * この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ * (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初の2つのフィールドが共通になっている.
+ * データキューへの送信待ちとデータキューからの受信待ちで,同じ待ち情
+ * 報ブロックを使う.
+ */
+typedef struct dataqueue_waiting_information {
+ WINFO winfo; /* 標準の待ち情報ブロック */
+ DTQCB *p_dtqcb; /* 待っているデータキューの管理ブロック */
+ intptr_t data; /* 送受信データ */
+} WINFO_DTQ;
+
+/*
+ * 使用していないデータキュー管理ブロックのリスト
+ */
+extern QUEUE free_dtqcb;
+
+/*
+ * データキューIDの最大値(kernel_cfg.c)
+ */
+extern const ID tmax_dtqid;
+extern const ID tmax_sdtqid;
+
+/*
+ * データキュー初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const DTQINIB dtqinib_table[];
+extern DTQINIB adtqinib_table[];
+
+/*
+ * データキュー管理ブロックのエリア(kernel_cfg.c)
+ */
+extern DTQCB dtqcb_table[];
+
+/*
+ * データキュー管理ブロックからデータキューIDを取り出すためのマクロ
+ */
+#define DTQID(p_dtqcb) ((ID)(((p_dtqcb) - dtqcb_table) + TMIN_DTQID))
+
+/*
+ * データキュー機能の初期化
+ */
+extern void initialize_dataqueue(void);
+
+/*
+ * データキュー管理領域へのデータの格納
+ */
+extern void enqueue_data(DTQCB *p_dtqcb, intptr_t data);
+
+/*
+ * データキュー管理領域へのデータの強制格納
+ */
+extern void force_enqueue_data(DTQCB *p_dtqcb, intptr_t data);
+
+/*
+ * データキュー管理領域からのデータの取出し
+ */
+extern void dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data);
+
+/*
+ * データキューへのデータ送信
+ */
+extern bool_t send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp);
+
+/*
+ * データキューへのデータ強制送信
+ */
+extern bool_t force_send_data(DTQCB *p_dtqcb, intptr_t data);
+
+/*
+ * データキューからのデータ受信
+ */
+extern bool_t receive_data(DTQCB *p_dtqcb, intptr_t *p_data,
+ bool_t *p_reqdsp);
+
+#endif /* TOPPERS_DATAQUEUE_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: eventflag.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * イベントフラグ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "eventflag.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_FLG_ENTER
+#define LOG_ACRE_FLG_ENTER(pk_cflg)
+#endif /* LOG_ACRE_FLG_ENTER */
+
+#ifndef LOG_ACRE_FLG_LEAVE
+#define LOG_ACRE_FLG_LEAVE(ercd)
+#endif /* LOG_ACRE_FLG_LEAVE */
+
+#ifndef LOG_DEL_FLG_ENTER
+#define LOG_DEL_FLG_ENTER(flgid)
+#endif /* LOG_DEL_FLG_ENTER */
+
+#ifndef LOG_DEL_FLG_LEAVE
+#define LOG_DEL_FLG_LEAVE(ercd)
+#endif /* LOG_DEL_FLG_LEAVE */
+
+#ifndef LOG_SET_FLG_ENTER
+#define LOG_SET_FLG_ENTER(flgid, setptn)
+#endif /* LOG_SET_FLG_ENTER */
+
+#ifndef LOG_SET_FLG_LEAVE
+#define LOG_SET_FLG_LEAVE(ercd)
+#endif /* LOG_SET_FLG_LEAVE */
+
+#ifndef LOG_ISET_FLG_ENTER
+#define LOG_ISET_FLG_ENTER(flgid, setptn)
+#endif /* LOG_ISET_FLG_ENTER */
+
+#ifndef LOG_ISET_FLG_LEAVE
+#define LOG_ISET_FLG_LEAVE(ercd)
+#endif /* LOG_ISET_FLG_LEAVE */
+
+#ifndef LOG_CLR_FLG_ENTER
+#define LOG_CLR_FLG_ENTER(flgid, clrptn)
+#endif /* LOG_CLR_FLG_ENTER */
+
+#ifndef LOG_CLR_FLG_LEAVE
+#define LOG_CLR_FLG_LEAVE(ercd)
+#endif /* LOG_CLR_FLG_LEAVE */
+
+#ifndef LOG_WAI_FLG_ENTER
+#define LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn)
+#endif /* LOG_WAI_FLG_ENTER */
+
+#ifndef LOG_WAI_FLG_LEAVE
+#define LOG_WAI_FLG_LEAVE(ercd, flgptn)
+#endif /* LOG_WAI_FLG_LEAVE */
+
+#ifndef LOG_POL_FLG_ENTER
+#define LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn)
+#endif /* LOG_POL_FLG_ENTER */
+
+#ifndef LOG_POL_FLG_LEAVE
+#define LOG_POL_FLG_LEAVE(ercd, flgptn)
+#endif /* LOG_POL_FLG_LEAVE */
+
+#ifndef LOG_TWAI_FLG_ENTER
+#define LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout)
+#endif /* LOG_TWAI_FLG_ENTER */
+
+#ifndef LOG_TWAI_FLG_LEAVE
+#define LOG_TWAI_FLG_LEAVE(ercd, flgptn)
+#endif /* LOG_TWAI_FLG_LEAVE */
+
+#ifndef LOG_INI_FLG_ENTER
+#define LOG_INI_FLG_ENTER(flgid)
+#endif /* LOG_INI_FLG_ENTER */
+
+#ifndef LOG_INI_FLG_LEAVE
+#define LOG_INI_FLG_LEAVE(ercd)
+#endif /* LOG_INI_FLG_LEAVE */
+
+#ifndef LOG_REF_FLG_ENTER
+#define LOG_REF_FLG_ENTER(flgid, pk_rflg)
+#endif /* LOG_REF_FLG_ENTER */
+
+#ifndef LOG_REF_FLG_LEAVE
+#define LOG_REF_FLG_LEAVE(ercd, pk_rflg)
+#endif /* LOG_REF_FLG_LEAVE */
+
+/*
+ * イベントフラグの数
+ */
+#define tnum_flg ((uint_t)(tmax_flgid - TMIN_FLGID + 1))
+#define tnum_sflg ((uint_t)(tmax_sflgid - TMIN_FLGID + 1))
+
+/*
+ * イベントフラグIDからイベントフラグ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_FLG(flgid) ((uint_t)((flgid) - TMIN_FLGID))
+#define get_flgcb(flgid) (&(flgcb_table[INDEX_FLG(flgid)]))
+
+#ifdef TOPPERS_flgini
+
+/*
+ * 使用していないイベントフラグ管理ブロックのリスト
+ */
+QUEUE free_flgcb;
+
+/*
+ * イベントフラグ機能の初期化
+ */
+void
+initialize_eventflag(void)
+{
+ uint_t i, j;
+ FLGCB *p_flgcb;
+ FLGINIB *p_flginib;
+
+ for (p_flgcb = flgcb_table, i = 0; i < tnum_sflg; p_flgcb++, i++) {
+ queue_initialize(&(p_flgcb->wait_queue));
+ p_flgcb->p_flginib = &(flginib_table[i]);
+ p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn;
+ }
+ queue_initialize(&free_flgcb);
+ for (j = 0; i < tnum_flg; p_flgcb++, i++, j++) {
+ p_flginib = &(aflginib_table[j]);
+ p_flginib->flgatr = TA_NOEXS;
+ p_flgcb->p_flginib = ((const FLGINIB *) p_flginib);
+ queue_insert_prev(&free_flgcb, &(p_flgcb->wait_queue));
+ }
+}
+
+#endif /* TOPPERS_flgini */
+
+/*
+ * イベントフラグの生成
+ */
+#ifdef TOPPERS_acre_flg
+
+ER_UINT
+acre_flg(const T_CFLG *pk_cflg)
+{
+ FLGCB *p_flgcb;
+ FLGINIB *p_flginib;
+ ER ercd;
+
+ LOG_ACRE_FLG_ENTER(pk_cflg);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_cflg->flgatr, TA_TPRI|TA_WMUL|TA_CLR);
+
+ t_lock_cpu();
+ if (queue_empty(&free_flgcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ p_flgcb = ((FLGCB *) queue_delete_next(&free_flgcb));
+ p_flginib = (FLGINIB *)(p_flgcb->p_flginib);
+ p_flginib->flgatr = pk_cflg->flgatr;
+ p_flginib->iflgptn = pk_cflg->iflgptn;
+
+ queue_initialize(&(p_flgcb->wait_queue));
+ p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn;
+ ercd = FLGID(p_flgcb);
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_FLG_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_flg */
+
+/*
+ * イベントフラグの削除
+ */
+#ifdef TOPPERS_del_flg
+
+ER
+del_flg(ID flgid)
+{
+ FLGCB *p_flgcb;
+ FLGINIB *p_flginib;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_DEL_FLG_ENTER(flgid);
+ CHECK_TSKCTX_UNL();
+ CHECK_FLGID(flgid);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (FLGID(p_flgcb) > tmax_sflgid) {
+ dspreq = init_wait_queue(&(p_flgcb->wait_queue));
+ p_flginib = (FLGINIB *)(p_flgcb->p_flginib);
+ p_flginib->flgatr = TA_NOEXS;
+ queue_insert_prev(&free_flgcb, &(p_flgcb->wait_queue));
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_FLG_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_flg */
+
+/*
+ * イベントフラグ待ち解除条件のチェック
+ */
+#ifdef TOPPERS_flgcnd
+
+bool_t
+check_flg_cond(FLGCB *p_flgcb, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
+{
+ if ((wfmode & TWF_ORW) != 0U ? (p_flgcb->flgptn & waiptn) != 0U
+ : (p_flgcb->flgptn & waiptn) == waiptn) {
+ *p_flgptn = p_flgcb->flgptn;
+ if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) {
+ p_flgcb->flgptn = 0U;
+ }
+ return(true);
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_flgcnd */
+
+/*
+ * イベントフラグのセット
+ */
+#ifdef TOPPERS_set_flg
+
+ER
+set_flg(ID flgid, FLGPTN setptn)
+{
+ FLGCB *p_flgcb;
+ QUEUE *p_queue;
+ TCB *p_tcb;
+ WINFO_FLG *p_winfo_flg;
+ bool_t dspreq = false;
+ ER ercd;
+
+ LOG_SET_FLG_ENTER(flgid, setptn);
+ CHECK_TSKCTX_UNL();
+ CHECK_FLGID(flgid);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ p_flgcb->flgptn |= setptn;
+ p_queue = p_flgcb->wait_queue.p_next;
+ while (p_queue != &(p_flgcb->wait_queue)) {
+ p_tcb = (TCB *) p_queue;
+ p_queue = p_queue->p_next;
+ p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo);
+ if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn,
+ p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) {
+ queue_delete(&(p_tcb->task_queue));
+ if (wait_complete(p_tcb)) {
+ dspreq = true;
+ }
+ if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) {
+ break;
+ }
+ }
+ }
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SET_FLG_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_set_flg */
+
+/*
+ * イベントフラグのセット(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iset_flg
+
+ER
+iset_flg(ID flgid, FLGPTN setptn)
+{
+ FLGCB *p_flgcb;
+ QUEUE *p_queue;
+ TCB *p_tcb;
+ WINFO_FLG *p_winfo_flg;
+ ER ercd;
+
+ LOG_ISET_FLG_ENTER(flgid, setptn);
+ CHECK_INTCTX_UNL();
+ CHECK_FLGID(flgid);
+ p_flgcb = get_flgcb(flgid);
+
+ i_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ p_flgcb->flgptn |= setptn;
+ p_queue = p_flgcb->wait_queue.p_next;
+ while (p_queue != &(p_flgcb->wait_queue)) {
+ p_tcb = (TCB *) p_queue;
+ p_queue = p_queue->p_next;
+ p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo);
+ if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn,
+ p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) {
+ queue_delete(&(p_tcb->task_queue));
+ if (wait_complete(p_tcb)) {
+ reqflg = true;
+ }
+ if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) {
+ break;
+ }
+ }
+ }
+ ercd = E_OK;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_ISET_FLG_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iset_flg */
+
+/*
+ * イベントフラグのクリア
+ */
+#ifdef TOPPERS_clr_flg
+
+ER
+clr_flg(ID flgid, FLGPTN clrptn)
+{
+ FLGCB *p_flgcb;
+ ER ercd;
+
+ LOG_CLR_FLG_ENTER(flgid, clrptn);
+ CHECK_TSKCTX_UNL();
+ CHECK_FLGID(flgid);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ p_flgcb->flgptn &= clrptn;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CLR_FLG_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_clr_flg */
+
+/*
+ * イベントフラグ待ち
+ */
+#ifdef TOPPERS_wai_flg
+
+ER
+wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
+{
+ FLGCB *p_flgcb;
+ WINFO_FLG winfo_flg;
+ ER ercd;
+
+ LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
+ CHECK_DISPATCH();
+ CHECK_FLGID(flgid);
+ CHECK_PAR(waiptn != 0U);
+ CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U
+ && !queue_empty(&(p_flgcb->wait_queue))) {
+ ercd = E_ILUSE;
+ }
+ else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) {
+ ercd = E_OK;
+ }
+ else {
+ winfo_flg.waiptn = waiptn;
+ winfo_flg.wfmode = wfmode;
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG);
+ wobj_make_wait((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg);
+ dispatch();
+ ercd = winfo_flg.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_flgptn = winfo_flg.flgptn;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_WAI_FLG_LEAVE(ercd, *p_flgptn);
+ return(ercd);
+}
+
+#endif /* TOPPERS_wai_flg */
+
+/*
+ * イベントフラグ待ち(ポーリング)
+ */
+#ifdef TOPPERS_pol_flg
+
+ER
+pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
+{
+ FLGCB *p_flgcb;
+ ER ercd;
+
+ LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
+ CHECK_TSKCTX_UNL();
+ CHECK_FLGID(flgid);
+ CHECK_PAR(waiptn != 0U);
+ CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U
+ && !queue_empty(&(p_flgcb->wait_queue))) {
+ ercd = E_ILUSE;
+ }
+ else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) {
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_POL_FLG_LEAVE(ercd, *p_flgptn);
+ return(ercd);
+}
+
+#endif /* TOPPERS_pol_flg */
+
+/*
+ * イベントフラグ待ち(タイムアウトあり)
+ */
+#ifdef TOPPERS_twai_flg
+
+ER
+twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
+{
+ FLGCB *p_flgcb;
+ WINFO_FLG winfo_flg;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout);
+ CHECK_DISPATCH();
+ CHECK_FLGID(flgid);
+ CHECK_PAR(waiptn != 0U);
+ CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW);
+ CHECK_TMOUT(tmout);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U
+ && !queue_empty(&(p_flgcb->wait_queue))) {
+ ercd = E_ILUSE;
+ }
+ else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) {
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ winfo_flg.waiptn = waiptn;
+ winfo_flg.wfmode = wfmode;
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG);
+ wobj_make_wait_tmout((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg,
+ &tmevtb, tmout);
+ dispatch();
+ ercd = winfo_flg.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_flgptn = winfo_flg.flgptn;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn);
+ return(ercd);
+}
+
+#endif /* TOPPERS_twai_flg */
+
+/*
+ * イベントフラグの再初期化
+ */
+#ifdef TOPPERS_ini_flg
+
+ER
+ini_flg(ID flgid)
+{
+ FLGCB *p_flgcb;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_INI_FLG_ENTER(flgid);
+ CHECK_TSKCTX_UNL();
+ CHECK_FLGID(flgid);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ dspreq = init_wait_queue(&(p_flgcb->wait_queue));
+ p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn;
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_INI_FLG_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ini_flg */
+
+/*
+ * イベントフラグの状態参照
+ */
+#ifdef TOPPERS_ref_flg
+
+ER
+ref_flg(ID flgid, T_RFLG *pk_rflg)
+{
+ FLGCB *p_flgcb;
+ ER ercd;
+
+ LOG_REF_FLG_ENTER(flgid, pk_rflg);
+ CHECK_TSKCTX_UNL();
+ CHECK_FLGID(flgid);
+ p_flgcb = get_flgcb(flgid);
+
+ t_lock_cpu();
+ if (p_flgcb->p_flginib->flgatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ pk_rflg->wtskid = wait_tskid(&(p_flgcb->wait_queue));
+ pk_rflg->flgptn = p_flgcb->flgptn;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_FLG_LEAVE(ercd, pk_rflg);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_flg */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: eventflag.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * イベントフラグ機能
+ */
+
+#ifndef TOPPERS_EVENTFLAG_H
+#define TOPPERS_EVENTFLAG_H
+
+#include <queue.h>
+
+/*
+ * イベントフラグ初期化ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ * (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初のフィールドが共通になっている.
+ */
+typedef struct eventflag_initialization_block {
+ ATR flgatr; /* イベントフラグ属性 */
+ FLGPTN iflgptn; /* イベントフラグのビットパターンの初期値 */
+} FLGINIB;
+
+/*
+ * イベントフラグ管理ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ * を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ * フィールドが共通になっている.
+ */
+typedef struct eventflag_control_block {
+ QUEUE wait_queue; /* イベントフラグ待ちキュー */
+ const FLGINIB *p_flginib; /* 初期化ブロックへのポインタ */
+ FLGPTN flgptn; /* イベントフラグ現在パターン */
+} FLGCB;
+
+/*
+ * イベントフラグ待ち情報ブロックの定義
+ *
+ * この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ * (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初の2つのフィールドが共通になっている.
+ *
+ * flgptnは,waiptnおよびwfmodeと同時に使うことはないため,共用体を使
+ * えばメモリを節約することが可能である.
+ */
+typedef struct eventflag_waiting_information {
+ WINFO winfo; /* 標準の待ち情報ブロック */
+ FLGCB *p_flgcb; /* 待っているイベントフラグの管理ブロック */
+ FLGPTN waiptn; /* 待ちパターン */
+ MODE wfmode; /* 待ちモード */
+ FLGPTN flgptn; /* 待ち解除時のパターン */
+} WINFO_FLG;
+
+/*
+ * 使用していないイベントフラグ管理ブロックのリスト
+ */
+extern QUEUE free_flgcb;
+
+/*
+ * イベントフラグIDの最大値(kernel_cfg.c)
+ */
+extern const ID tmax_flgid;
+extern const ID tmax_sflgid;
+
+/*
+ * イベントフラグ初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const FLGINIB flginib_table[];
+extern FLGINIB aflginib_table[];
+
+/*
+ * イベントフラグ管理ブロックのエリア(kernel_cfg.c)
+ */
+extern FLGCB flgcb_table[];
+
+/*
+ * イベントフラグ管理ブロックからイベントフラグIDを取り出すためのマクロ
+ */
+#define FLGID(p_flgcb) ((ID)(((p_flgcb) - flgcb_table) + TMIN_FLGID))
+
+/*
+ * イベントフラグ機能の初期化
+ */
+extern void initialize_eventflag(void);
+
+/*
+ * イベントフラグ待ち解除条件のチェック
+ */
+extern bool_t check_flg_cond(FLGCB *p_flgcb, FLGPTN waiptn,
+ MODE wfmode, FLGPTN *p_flgptn);
+
+#endif /* TOPPERS_EVENTFLAG_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: interrupt.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * 割込み管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "interrupt.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ISR_ENTER
+#define LOG_ISR_ENTER(intno)
+#endif /* LOG_ISR_ENTER */
+
+#ifndef LOG_ISR_LEAVE
+#define LOG_ISR_LEAVE(intno)
+#endif /* LOG_ISR_LEAVE */
+
+#ifndef LOG_ACRE_ISR_ENTER
+#define LOG_ACRE_ISR_ENTER(pk_cisr)
+#endif /* LOG_ACRE_ISR_ENTER */
+
+#ifndef LOG_ACRE_ISR_LEAVE
+#define LOG_ACRE_ISR_LEAVE(ercd)
+#endif /* LOG_ACRE_ISR_LEAVE */
+
+#ifndef LOG_DEL_ISR_ENTER
+#define LOG_DEL_ISR_ENTER(isrid)
+#endif /* LOG_DEL_ISR_ENTER */
+
+#ifndef LOG_DEL_ISR_LEAVE
+#define LOG_DEL_ISR_LEAVE(ercd)
+#endif /* LOG_DEL_ISR_LEAVE */
+
+#ifndef LOG_DIS_INT_ENTER
+#define LOG_DIS_INT_ENTER(intno)
+#endif /* LOG_DIS_INT_ENTER */
+
+#ifndef LOG_DIS_INT_LEAVE
+#define LOG_DIS_INT_LEAVE(ercd)
+#endif /* LOG_DIS_INT_LEAVE */
+
+#ifndef LOG_ENA_INT_ENTER
+#define LOG_ENA_INT_ENTER(intno)
+#endif /* LOG_ENA_INT_ENTER */
+
+#ifndef LOG_ENA_INT_LEAVE
+#define LOG_ENA_INT_LEAVE(ercd)
+#endif /* LOG_ENA_INT_LEAVE */
+
+#ifndef LOG_CHG_IPM_ENTER
+#define LOG_CHG_IPM_ENTER(intpri)
+#endif /* LOG_CHG_IPM_ENTER */
+
+#ifndef LOG_CHG_IPM_LEAVE
+#define LOG_CHG_IPM_LEAVE(ercd)
+#endif /* LOG_CHG_IPM_LEAVE */
+
+#ifndef LOG_GET_IPM_ENTER
+#define LOG_GET_IPM_ENTER(p_intpri)
+#endif /* LOG_GET_IPM_ENTER */
+
+#ifndef LOG_GET_IPM_LEAVE
+#define LOG_GET_IPM_LEAVE(ercd, intpri)
+#endif /* LOG_GET_IPM_LEAVE */
+
+/*
+ * 割込みサービスルーチンの数
+ */
+#define tnum_isr ((uint_t)(tmax_isrid - TMIN_SEMID + 1) + tnum_sisr)
+
+/*
+ * 割込みサービスルーチンIDから割込みサービスルーチン管理ブロックを取
+ * り出すためのマクロ
+ */
+#define INDEX_ISR(isrid) ((uint_t)((isrid) - TMIN_ISRID) + tnum_sisr)
+#define get_isrcb(isrid) (&(isrcb_table[INDEX_ISR(isrid)]))
+
+/*
+ * 割込みサービスルーチンキューへの登録
+ */
+Inline void
+enqueue_isr(QUEUE *p_isr_queue, ISRCB *p_isrcb)
+{
+ QUEUE *p_entry;
+ PRI isrpri = p_isrcb->p_isrinib->isrpri;
+
+ for (p_entry = p_isr_queue->p_next; p_entry != p_isr_queue;
+ p_entry = p_entry->p_next) {
+ if (isrpri < ((ISRCB *) p_entry)->p_isrinib->isrpri) {
+ break;
+ }
+ }
+ queue_insert_prev(p_entry, &(p_isrcb->isr_queue));
+}
+
+#ifdef TOPPERS_isrini
+
+/*
+ * 使用していない割込みサービスルーチン管理ブロックのリスト
+ */
+QUEUE free_isrcb;
+
+/*
+ * 割込みサービスルーチン機能の初期化
+ */
+void
+initialize_isr(void)
+{
+ uint_t i, j;
+ ISRCB *p_isrcb;
+ ISRINIB *p_isrinib;
+
+ for (i = 0; i < tnum_isr_queue; i++) {
+ queue_initialize(&(isr_queue_table[i]));
+ }
+ for (p_isrcb = isrcb_table, i = 0; i < tnum_sisr; p_isrcb++, i++) {
+ p_isrcb->p_isrinib = &(sisrinib_table[i]);
+ enqueue_isr(p_isrcb->p_isrinib->p_isr_queue, p_isrcb);
+ }
+ queue_initialize(&free_isrcb);
+ for (j = 0; i < tnum_isr; p_isrcb++, i++, j++) {
+ p_isrinib = &(aisrinib_table[j]);
+ p_isrinib->isratr = TA_NOEXS;
+ p_isrcb->p_isrinib = ((const ISRINIB *) p_isrinib);
+ queue_insert_prev(&free_isrcb, &(p_isrcb->isr_queue));
+ }
+}
+
+#endif /* TOPPERS_isrini */
+
+/*
+ * 割込みサービスルーチンの呼出し
+ */
+#ifdef TOPPERS_isrcal
+
+void
+call_isr(QUEUE *p_isr_queue)
+{
+ QUEUE *p_queue;
+ ISRINIB *p_isrinib;
+ PRI saved_ipm;
+
+ saved_ipm = i_get_ipm();
+ for (p_queue = p_isr_queue->p_next; p_queue != p_isr_queue;
+ p_queue = p_queue->p_next) {
+ p_isrinib = (ISRINIB *)(((ISRCB *) p_queue)->p_isrinib);
+ LOG_ISR_ENTER(p_isrinib->intno);
+ (*(p_isrinib->isr))(p_isrinib->exinf);
+ LOG_ISR_LEAVE(p_isrinib->intno);
+
+ if (p_queue->p_next != p_isr_queue) {
+ /* ISRの呼出し前の状態に戻す */
+ if (i_sense_lock()) {
+ i_unlock_cpu();
+ }
+ i_set_ipm(saved_ipm);
+ }
+ }
+}
+
+#endif /* TOPPERS_isrcal */
+
+/*
+ * 割込みサービスルーチン呼出しキューの検索
+ */
+Inline QUEUE *
+search_isr_queue(INTNO intno)
+{
+ int_t left, right, i;
+
+ if (tnum_isr_queue == 0) {
+ return(NULL);
+ }
+
+ left = 0;
+ right = tnum_isr_queue - 1;
+ while (left < right) {
+ i = (left + right + 1) / 2;
+ if (intno < isr_queue_list[i].intno) {
+ right = i - 1;
+ }
+ else {
+ left = i;
+ }
+ }
+ if (isr_queue_list[left].intno == intno) {
+ return(isr_queue_list[left].p_isr_queue);
+ }
+ else {
+ return(NULL);
+ }
+}
+
+/*
+ * 割込みサービスルーチンの生成
+ */
+#ifdef TOPPERS_acre_isr
+
+ER_UINT
+acre_isr(const T_CISR *pk_cisr)
+{
+ ISRCB *p_isrcb;
+ ISRINIB *p_isrinib;
+ QUEUE *p_isr_queue;
+ ER ercd;
+
+ LOG_ACRE_ISR_ENTER(pk_cisr);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_cisr->isratr, TARGET_ISRATR);
+ CHECK_INTNO_CREISR(pk_cisr->intno);
+ CHECK_ALIGN_FUNC(pk_cisr->isr);
+ CHECK_NONNULL_FUNC(pk_cisr->isr);
+ CHECK_ISRPRI(pk_cisr->isrpri);
+
+ p_isr_queue = search_isr_queue(pk_cisr->intno);
+ CHECK_PAR(p_isr_queue != NULL);
+
+ t_lock_cpu();
+ if (queue_empty(&free_isrcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ p_isrcb = ((ISRCB *) queue_delete_next(&free_isrcb));
+ p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib);
+ p_isrinib->isratr = pk_cisr->isratr;
+ p_isrinib->exinf = pk_cisr->exinf;
+ p_isrinib->intno = pk_cisr->intno;
+ p_isrinib->p_isr_queue = p_isr_queue;
+ p_isrinib->isr = pk_cisr->isr;
+ p_isrinib->isrpri = pk_cisr->isrpri;
+ enqueue_isr(p_isr_queue, p_isrcb);
+ ercd = ISRID(p_isrcb);
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_ISR_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_isr */
+
+/*
+ * 割込みサービスルーチンの削除
+ */
+#ifdef TOPPERS_del_isr
+
+ER
+del_isr(ID isrid)
+{
+ ISRCB *p_isrcb;
+ ISRINIB *p_isrinib;
+ ER ercd;
+
+ LOG_DEL_ISR_ENTER(isrid);
+ CHECK_TSKCTX_UNL();
+ CHECK_ISRID(isrid);
+ p_isrcb = get_isrcb(isrid);
+
+ t_lock_cpu();
+ if (p_isrcb->p_isrinib->isratr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ queue_delete(&(p_isrcb->isr_queue));
+ p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib);
+ p_isrinib->isratr = TA_NOEXS;
+ queue_insert_prev(&free_isrcb, &(p_isrcb->isr_queue));
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_ISR_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_isr */
+
+/*
+ * 割込み管理機能の初期化
+ */
+#ifdef TOPPERS_intini
+#ifndef OMIT_INITIALIZE_INTERRUPT
+
+void
+initialize_interrupt(void)
+{
+ uint_t i;
+ const INHINIB *p_inhinib;
+ const INTINIB *p_intinib;
+
+ for (p_inhinib = inhinib_table, i = 0; i < tnum_inhno; p_inhinib++, i++) {
+ x_define_inh(p_inhinib->inhno, p_inhinib->int_entry);
+ }
+ for (p_intinib = intinib_table, i = 0; i < tnum_intno; p_intinib++, i++) {
+ x_config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri);
+ }
+}
+
+#endif /* OMIT_INITIALIZE_INTERRUPT */
+#endif /* TOPPERS_intini */
+
+/*
+ * 割込みの禁止
+ */
+#ifdef TOPPERS_dis_int
+#ifdef TOPPERS_SUPPORT_DIS_INT
+
+ER
+dis_int(INTNO intno)
+{
+ bool_t locked;
+ ER ercd;
+
+ LOG_DIS_INT_ENTER(intno);
+ CHECK_TSKCTX();
+ CHECK_INTNO_DISINT(intno);
+
+ locked = t_sense_lock();
+ if (!locked) {
+ t_lock_cpu();
+ }
+ if (t_disable_int(intno)) {
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ if (!locked) {
+ t_unlock_cpu();
+ }
+
+ error_exit:
+ LOG_DIS_INT_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_SUPPORT_DIS_INT */
+#endif /* TOPPERS_dis_int */
+
+/*
+ * 割込みの許可
+ */
+#ifdef TOPPERS_ena_int
+#ifdef TOPPERS_SUPPORT_ENA_INT
+
+ER
+ena_int(INTNO intno)
+{
+ bool_t locked;
+ ER ercd;
+
+ LOG_ENA_INT_ENTER(intno);
+ CHECK_TSKCTX();
+ CHECK_INTNO_DISINT(intno);
+
+ locked = t_sense_lock();
+ if (!locked) {
+ t_lock_cpu();
+ }
+ if (t_enable_int(intno)) {
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ if (!locked) {
+ t_unlock_cpu();
+ }
+
+ error_exit:
+ LOG_ENA_INT_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_SUPPORT_ENA_INT */
+#endif /* TOPPERS_ena_int */
+
+/*
+ * 割込み優先度マスクの変更
+ */
+#ifdef TOPPERS_chg_ipm
+
+ER
+chg_ipm(PRI intpri)
+{
+ ER ercd;
+
+ LOG_CHG_IPM_ENTER(intpri);
+ CHECK_TSKCTX_UNL();
+ CHECK_INTPRI_CHGIPM(intpri);
+
+ t_lock_cpu();
+ t_set_ipm(intpri);
+ if (intpri == TIPM_ENAALL) {
+ ipmflg = true;
+ if (!disdsp) {
+ dspflg = true;
+ if (p_runtsk != p_schedtsk) {
+ dispatch();
+ }
+ }
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+ call_texrtn();
+ }
+ }
+ else {
+ ipmflg = false;
+ dspflg = false;
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CHG_IPM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_chg_ipm */
+
+/*
+ * 割込み優先度マスクの参照
+ */
+#ifdef TOPPERS_get_ipm
+
+ER
+get_ipm(PRI *p_intpri)
+{
+ ER ercd;
+
+ LOG_GET_IPM_ENTER(p_intpri);
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ *p_intpri = t_get_ipm();
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_GET_IPM_LEAVE(ercd, *p_intpri);
+ return(ercd);
+}
+
+#endif /* TOPPERS_get_ipm */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: interrupt.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * 割込み管理機能
+ */
+
+#ifndef TOPPERS_INTERRUPT_H
+#define TOPPERS_INTERRUPT_H
+
+/*
+ * 割込みサービスルーチン初期化ブロック
+ */
+typedef struct isr_initialization_block {
+ ATR isratr; /* 割込みサービスルーチン属性 */
+ intptr_t exinf; /* 割込みサービスルーチンの拡張情報 */
+ INTNO intno; /* 割込みサービスルーチンを登録する割込み番号 */
+ QUEUE *p_isr_queue; /* 登録先割込みサービスルーチンキューの番地 */
+ ISR isr; /* 割込みサービスルーチンの先頭番地 */
+ PRI isrpri; /* 割込みサービスルーチン優先度 */
+} ISRINIB;
+
+/*
+ * 割込みサービスルーチン管理ブロック
+ */
+typedef struct isr_control_block {
+ QUEUE isr_queue; /* 割込みサービスルーチン呼出しキュー */
+ const ISRINIB *p_isrinib; /* 初期化ブロックへのポインタ */
+} ISRCB;
+
+/*
+ * 割込みサービスルーチン呼出しキューを検索するためのデータ構造
+ */
+typedef struct {
+ INTNO intno; /* 割込み番号 */
+ QUEUE *p_isr_queue; /* 割込みサービスルーチン呼出しキュー */
+} ISR_ENTRY;
+
+/*
+ * 割込みサービスルーチンキューのエントリ数(kernel_cfg.c)
+ */
+extern const uint_t tnum_isr_queue;
+
+/*
+ * 割込みサービスルーチンキューリスト(kernel_cfg.c)
+ */
+extern const ISR_ENTRY isr_queue_list[];
+
+/*
+ * 割込みサービスルーチンキューのエリア(kernel_cfg.c)
+ */
+extern QUEUE isr_queue_table[];
+
+/*
+ * 使用していない割込みサービスルーチン管理ブロックのリスト
+ */
+extern QUEUE free_isrcb;
+
+/*
+ * 割込みサービスルーチンIDの最大値(kernel_cfg.c)
+ *
+ * 静的に生成される割込みサービスルーチンはID番号を持たないため,
+ * tmax_isridは動的に生成される割込みサービスルーチンのID番号の最大値
+ * である.静的に生成される割込みサービスルーチンの数は,tnum_sisrに保
+ * 持する.
+ */
+extern const ID tmax_isrid;
+extern const uint_t tnum_sisr;
+
+/*
+ * 割込みサービスルーチン初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const ISRINIB sisrinib_table[];
+extern ISRINIB aisrinib_table[];
+
+/*
+ * 割込みサービスルーチン管理ブロックのエリア(kernel_cfg.c)
+ */
+extern ISRCB isrcb_table[];
+
+/*
+ * 割込みサービスルーチン管理ブロックから割込みサービスルーチンIDを取
+ * り出すためのマクロ
+ */
+#define ISRID(p_isrcb) ((ID)(((p_isrcb) - isrcb_table) \
+ - tnum_sisr + TMIN_ISRID))
+
+/*
+ * 割込みサービスルーチン機能の初期化
+ */
+extern void initialize_isr(void);
+
+/*
+ * 割込みサービスルーチンの呼出し
+ */
+extern void call_isr(QUEUE *p_isr_queue);
+
+#ifndef OMIT_INITIALIZE_INTERRUPT
+
+/*
+ * 割込みハンドラ初期化ブロック
+ */
+typedef struct interrupt_handler_initialization_block {
+ INHNO inhno; /* 割込みハンドラ番号 */
+ ATR inhatr; /* 割込みハンドラ属性 */
+ FP int_entry; /* 割込みハンドラの出入口処理の番地 */
+} INHINIB;
+
+/*
+ * 割込み要求ライン初期化ブロック
+ */
+typedef struct interrupt_request_initialization_block {
+ INTNO intno; /* 割込み番号 */
+ ATR intatr; /* 割込み属性 */
+ PRI intpri; /* 割込み優先度 */
+} INTINIB;
+
+/*
+ * 割込みハンドラ番号の数(kernel_cfg.c)
+ */
+extern const uint_t tnum_inhno;
+
+/*
+ * 割込みハンドラ初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const INHINIB inhinib_table[];
+
+/*
+ * 割込み要求ラインの数(kernel_cfg.c)
+ */
+extern const uint_t tnum_intno;
+
+/*
+ * 割込み要求ライン初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const INTINIB intinib_table[];
+
+#endif /* OMIT_INITIALIZE_INTERRUPT */
+
+/*
+ * 割込み管理機能の初期化
+ */
+extern void initialize_interrupt(void);
+
+#endif /* TOPPERS_INTERRUPT_H */
--- /dev/null
+$ ======================================================================
+$
+$ TOPPERS/ASP Kernel
+$ Toyohashi Open Platform for Embedded Real-Time Systems/
+$ Advanced Standard Profile Kernel
+$
+$ Copyright (C) 2007 by TAKAGI Nobuhisa
+$ Copyright (C) 2007-2011 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.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
+$
+$ =====================================================================
+
+$ =====================================================================
+$ AID_XXXの処理
+$ =====================================================================
+
+$num_atskid = 0$
+$FOREACH i ATSK.ORDER_LIST$
+ $num_atskid = num_atskid + ATSK.NOTSK[i]$
+$END$
+$num_tskid = LENGTH(TSK.ID_LIST) + num_atskid$
+
+$num_asemid = 0$
+$FOREACH i ASEM.ORDER_LIST$
+ $num_asemid = num_asemid + ASEM.NOSEM[i]$
+$END$
+$num_semid = LENGTH(SEM.ID_LIST) + num_asemid$
+
+$num_aflgid = 0$
+$FOREACH i AFLG.ORDER_LIST$
+ $num_aflgid = num_aflgid + AFLG.NOFLG[i]$
+$END$
+$num_flgid = LENGTH(FLG.ID_LIST) + num_aflgid$
+
+$num_adtqid = 0$
+$FOREACH i ADTQ.ORDER_LIST$
+ $num_adtqid = num_adtqid + ADTQ.NODTQ[i]$
+$END$
+$num_dtqid = LENGTH(DTQ.ID_LIST) + num_adtqid$
+
+$num_apdqid = 0$
+$FOREACH i APDQ.ORDER_LIST$
+ $num_apdqid = num_apdqid + APDQ.NOPDQ[i]$
+$END$
+$num_pdqid = LENGTH(PDQ.ID_LIST) + num_apdqid$
+
+$num_ambxid = 0$
+$FOREACH i AMBX.ORDER_LIST$
+ $num_ambxid = num_ambxid + AMBX.NOMBX[i]$
+$END$
+$num_mbxid = LENGTH(MBX.ID_LIST) + num_ambxid$
+
+$num_ampfid = 0$
+$FOREACH i AMPF.ORDER_LIST$
+ $num_ampfid = num_ampfid + AMPF.NOMPF[i]$
+$END$
+$num_mpfid = LENGTH(MPF.ID_LIST) + num_ampfid$
+
+$num_acycid = 0$
+$FOREACH i ACYC.ORDER_LIST$
+ $num_acycid = num_acycid + ACYC.NOCYC[i]$
+$END$
+$num_cycid = LENGTH(CYC.ID_LIST) + num_acycid$
+
+$num_aalmid = 0$
+$FOREACH i AALM.ORDER_LIST$
+ $num_aalmid = num_aalmid + AALM.NOALM[i]$
+$END$
+$num_almid = LENGTH(ALM.ID_LIST) + num_aalmid$
+
+$num_aisrid = 0$
+$FOREACH i AISR.ORDER_LIST$
+ $num_aisrid = num_aisrid + AISR.NOISR[i]$
+$END$
+$num_isrid = num_aisrid$
+$num_isr = LENGTH(ISR.ORDER_LIST) + num_aisrid$
+
+$ =====================================================================
+$ kernel_cfg.hの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.h"$
+/* kernel_cfg.h */$NL$
+#ifndef TOPPERS_KERNEL_CFG_H$NL$
+#define TOPPERS_KERNEL_CFG_H$NL$
+$NL$
+#define TNUM_TSKID $num_tskid$$NL$
+#define TNUM_SEMID $num_semid$$NL$
+#define TNUM_FLGID $num_flgid$$NL$
+#define TNUM_DTQID $num_dtqid$$NL$
+#define TNUM_PDQID $num_pdqid$$NL$
+#define TNUM_MBXID $num_mbxid$$NL$
+#define TNUM_MPFID $num_mpfid$$NL$
+#define TNUM_CYCID $num_cycid$$NL$
+#define TNUM_ALMID $num_almid$$NL$
+#define TNUM_ISRID $num_isrid$$NL$
+$NL$
+$FOREACH id TSK.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id SEM.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id FLG.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id DTQ.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id PDQ.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id MBX.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id MPF.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id CYC.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id ALM.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$NL$
+#endif /* TOPPERS_KERNEL_CFG_H */$NL$
+
+$ =====================================================================
+$ kernel_cfg.cの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.c"$
+/* kernel_cfg.c */$NL$
+#include "kernel/kernel_int.h"$NL$
+#include "kernel_cfg.h"$NL$
+$NL$
+#ifndef TOPPERS_EMPTY_LABEL$NL$
+#define TOPPERS_EMPTY_LABEL(x,y) x y[0]$NL$
+#endif$NL$
+$NL$
+#if TKERNEL_PRID != 0x07u$NL$
+#error The kernel does not match this configuration file.$NL$
+#endif$NL$
+$NL$
+
+$
+$ インクルードディレクティブ(#include)
+$
+/*$NL$
+$SPC$* Include Directives (#include)$NL$
+$SPC$*/$NL$
+$NL$
+$INCLUDES$
+$NL$
+
+$
+$ オブジェクトのID番号を保持する変数
+$
+$IF USE_EXTERNAL_ID$
+ /*$NL$
+ $SPC$* Variables for Object ID$NL$
+ $SPC$*/$NL$
+ $NL$
+ $FOREACH id TSK.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id SEM.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id FLG.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id DTQ.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id PDQ.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id MBX.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id MPF.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id CYC.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id ALM.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+$END$
+
+$
+$ タスク
+$
+/*$NL$
+$SPC$* Task Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたタスクが1個以上存在することのチェック
+$IF !LENGTH(TSK.ID_LIST)$
+ $ERROR$$FORMAT(_("no task is registered"))$$END$
+$END$
+
+$ 静的に生成されたタスクの数
+#define TNUM_STSKID $LENGTH(TSK.ID_LIST)$$NL$
+$NL$
+
+$ タスクID番号の最大値
+const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);$NL$
+const ID _kernel_tmax_stskid = (TMIN_TSKID + TNUM_STSKID - 1);$NL$
+$NL$
+
+$ エラーチェック
+$FOREACH tskid TSK.ID_LIST$
+$ // tskatrが([TA_ACT])でない場合(E_RSATR)
+ $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
+ $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+
+$ // (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
+ $IF !(TMIN_TPRI <= TSK.ITSKPRI[tskid] && TSK.ITSKPRI[tskid] <= TMAX_TPRI)$
+ $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "itskpri", TSK.ITSKPRI[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+
+$ // texatrが(TA_NULL)でない場合(E_RSATR)
+ $IF LENGTH(TSK.TEXATR[tskid]) && TSK.TEXATR[tskid] != 0$
+ $ERROR DEF_TEX.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "texatr", TSK.TEXATR[tskid], tskid, "DEF_TEX")$$END$
+ $END$
+$END$
+
+$ スタック領域の生成とそれに関するエラーチェック
+$FOREACH tskid TSK.ID_LIST$
+$ // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
+ $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+ && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+ $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+$ // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
+ $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
+ && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
+ $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+
+ $IF EQ(TSK.STK[tskid],"NULL")$
+ static STK_T _kernel_stack_$tskid$[COUNT_STK_T($TSK.STKSZ[tskid]$)];$NL$
+ $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$
+ $TSK.TINIB_STK[tskid] = CONCAT("_kernel_stack_", tskid)$
+ $ELSE$
+ $TSK.TINIB_STKSZ[tskid] = TSK.STKSZ[tskid]$
+ $TSK.TINIB_STK[tskid] = TSK.STK[tskid]$
+ $END$
+$END$
+$NL$
+
+$ タスク初期化ブロックの生成(タスクは1個以上存在する)
+const TINIB _kernel_tinib_table[TNUM_STSKID] = {$NL$
+$JOINEACH tskid TSK.ID_LIST ",\n"$
+$ // タスク属性,拡張情報,起動番地,起動時優先度
+ $TAB${
+ $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
+ $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+
+$ // タスク初期化コンテキストブロック,スタック領域
+ $IF USE_TSKINICTXB$
+ $GENERATE_TSKINICTXB(tskid)$
+ $ELSE$
+ $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
+ $END$
+
+$ // タスク例外処理ルーチンの属性と起動番地
+ $SPC$($ALT(TSK.TEXATR[tskid],"TA_NULL")$), ($ALT(TSK.TEXRTN[tskid],"NULL")$) }
+$END$$NL$
+};$NL$
+$NL$
+
+$ 動的生成タスク用のタスク初期化ブロックの生成
+$IF num_atskid > 0$
+ TINIB _kernel_atinib_table[$num_atskid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(TINIB, _kernel_atinib_table);$NL$
+$END$$NL$
+
+$ タスク管理ブロックの生成
+TCB _kernel_tcb_table[TNUM_TSKID];$NL$
+$NL$
+
+$ タスク生成順序テーブルの生成
+const ID _kernel_torder_table[TNUM_STSKID] = {$NL$
+$TAB$$JOINEACH tskid TSK.ORDER_LIST ", "$$tskid$$END$$NL$
+};$NL$
+$NL$
+
+$
+$ セマフォ
+$
+/*$NL$
+$SPC$* Semaphore Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたセマフォの数
+#define TNUM_SSEMID $LENGTH(SEM.ID_LIST)$$NL$
+$NL$
+
+$ セマフォID番号の最大値
+const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1);$NL$
+const ID _kernel_tmax_ssemid = (TMIN_SEMID + TNUM_SSEMID - 1);$NL$
+$NL$
+
+$ セマフォ初期化ブロックの生成
+$IF LENGTH(SEM.ID_LIST)$
+ const SEMINIB _kernel_seminib_table[TNUM_SSEMID] = {$NL$
+ $JOINEACH semid SEM.ID_LIST ",\n"$
+$ // sematrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (SEM.SEMATR[semid] & ~TA_TPRI) != 0$
+ $ERROR SEM.TEXT_LINE[semid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "sematr", SEM.SEMATR[semid], semid, "CRE_SEM")$$END$
+ $END$
+
+$ // (0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
+ $IF !(0 <= SEM.ISEMCNT[semid] && SEM.ISEMCNT[semid] <= SEM.MAXSEM[semid])$
+ $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("too large %1% `%2%\' of `%3%\' in %4%"), "isemcnt", SEM.ISEMCNT[semid], semid, "CRE_SEM")$$END$
+ $END$
+
+$ // (1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
+ $IF !(1 <= SEM.MAXSEM[semid] && SEM.MAXSEM[semid] <= TMAX_MAXSEM)$
+ $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxsem", SEM.MAXSEM[semid], semid, "CRE_SEM")$$END$
+ $END$
+
+$ // セマフォ初期化ブロック
+ $TAB${ ($SEM.SEMATR[semid]$), ($SEM.ISEMCNT[semid]$), ($SEM.MAXSEM[semid]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
+$END$$NL$
+
+$ 動的生成セマフォ用のセマフォ初期化ブロックの生成
+$IF num_asemid > 0$
+ SEMINIB _kernel_aseminib_table[$num_asemid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(SEMINIB, _kernel_aseminib_table);$NL$
+$END$$NL$
+
+$ セマフォ管理ブロックの生成
+$IF num_semid$
+ SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
+$END$$NL$
+
+$
+$ イベントフラグ
+$
+/*$NL$
+$SPC$* Eventflag Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたイベントフラグの数
+#define TNUM_SFLGID $LENGTH(FLG.ID_LIST)$$NL$
+$NL$
+
+$ イベントフラグID番号の最大値
+const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1);$NL$
+const ID _kernel_tmax_sflgid = (TMIN_FLGID + TNUM_SFLGID - 1);$NL$
+$NL$
+
+$ イベントフラグ初期化ブロックの生成
+$IF LENGTH(FLG.ID_LIST)$
+ const FLGINIB _kernel_flginib_table[TNUM_SFLGID] = {$NL$
+ $JOINEACH flgid FLG.ID_LIST ",\n"$
+$ // flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
+ $IF (FLG.FLGATR[flgid] & ~(TA_TPRI|TA_WMUL|TA_CLR)) != 0$
+ $ERROR FLG.TEXT_LINE[flgid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgatr", FLG.FLGATR[flgid], flgid, "CRE_FLG")$$END$
+ $END$
+
+$ // イベントフラグ初期化ブロック
+ $TAB${ ($FLG.FLGATR[flgid]$), ($FLG.IFLGPTN[flgid]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
+$END$$NL$
+
+$ 動的生成イベントフラグ用のイベントフラグ初期化ブロックの生成
+$IF num_aflgid > 0$
+ FLGINIB _kernel_aflginib_table[$num_aflgid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(FLGINIB, _kernel_aflginib_table);$NL$
+$END$$NL$
+
+$ イベントフラグ管理ブロックの生成
+$IF num_flgid$
+ FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
+$END$$NL$
+
+$
+$ データキュー
+$
+/*$NL$
+$SPC$* Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたデータキューの数
+#define TNUM_SDTQID $LENGTH(DTQ.ID_LIST)$$NL$
+$NL$
+
+$ データキューID番号の最大値
+const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1);$NL$
+const ID _kernel_tmax_sdtqid = (TMIN_DTQID + TNUM_SDTQID - 1);$NL$
+$NL$
+
+$IF LENGTH(DTQ.ID_LIST)$
+ $FOREACH dtqid DTQ.ID_LIST$
+$ // dtqatrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (DTQ.DTQATR[dtqid] & ~TA_TPRI) != 0$
+ $ERROR DTQ.TEXT_LINE[dtqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqatr", DTQ.DTQATR[dtqid], dtqid, "CRE_DTQ")$$END$
+ $END$
+
+$ // dtqmbがNULLでない場合(E_NOSPT)
+ $IF !EQ(DTQ.DTQMB[dtqid], "NULL")$
+ $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
+ $END$
+
+$ // データキュー領域
+ $IF DTQ.DTQCNT[dtqid]$
+ static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+ $END$
+ $END$
+
+$ // データキュー初期化ブロックの生成
+ const DTQINIB _kernel_dtqinib_table[TNUM_SDTQID] = {$NL$
+ $JOINEACH dtqid DTQ.ID_LIST ",\n"$
+ $TAB${ ($DTQ.DTQATR[dtqid]$), ($DTQ.DTQCNT[dtqid]$), $IF DTQ.DTQCNT[dtqid]$(_kernel_dtqmb_$dtqid$)$ELSE$NULL$END$ }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
+$END$$NL$
+
+$ 動的生成データキュー用のデータキュー初期化ブロックの生成
+$IF num_adtqid > 0$
+ DTQINIB _kernel_adtqinib_table[$num_adtqid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(DTQINIB, _kernel_adtqinib_table);$NL$
+$END$$NL$
+
+$ データキュー管理ブロックの生成
+$IF num_dtqid$
+ DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
+$END$$NL$
+
+$
+$ 優先度データキュー
+$
+/*$NL$
+$SPC$* Priority Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成された優先度データキューの数
+#define TNUM_SPDQID $LENGTH(PDQ.ID_LIST)$$NL$
+$NL$
+
+$ 優先度データキューID番号の最大値
+const ID _kernel_tmax_pdqid = (TMIN_PDQID + TNUM_PDQID - 1);$NL$
+const ID _kernel_tmax_spdqid = (TMIN_PDQID + TNUM_SPDQID - 1);$NL$
+$NL$
+
+$IF LENGTH(PDQ.ID_LIST)$
+ $FOREACH pdqid PDQ.ID_LIST$
+$ // pdqatrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (PDQ.PDQATR[pdqid] & ~TA_TPRI) != 0$
+ $ERROR PDQ.TEXT_LINE[pdqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqatr", PDQ.PDQATR[pdqid], pdqid, "CRE_PDQ")$$END$
+ $END$
+
+$ // (TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
+ $IF !(TMIN_DPRI <= PDQ.MAXDPRI[pdqid] && PDQ.MAXDPRI[pdqid] <= TMAX_DPRI)$
+ $ERROR PDQ.TEXT_LINE[pdqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxdpri", PDQ.MAXDPRI[pdqid], pdqid, "CRE_PDQ")$$END$
+ $END$
+
+$ // pdqmbがNULLでない場合(E_NOSPT)
+ $IF !EQ(PDQ.PDQMB[pdqid], "NULL")$
+ $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
+ $END$
+
+$ // 優先度データキュー領域
+ $IF PDQ.PDQCNT[pdqid]$
+ static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
+ $END$
+ $END$
+
+$ // 優先度データキュー初期化ブロックの生成
+ const PDQINIB _kernel_pdqinib_table[TNUM_SPDQID] = {$NL$
+ $JOINEACH pdqid PDQ.ID_LIST ",\n"$
+ $TAB${ ($PDQ.PDQATR[pdqid]$), ($PDQ.PDQCNT[pdqid]$), ($PDQ.MAXDPRI[pdqid]$), $IF PDQ.PDQCNT[pdqid]$(_kernel_pdqmb_$pdqid$)$ELSE$NULL$END$ }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
+$END$$NL$
+
+$ 動的生成優先度データキュー用の優先度データキュー初期化ブロックの生成
+$IF num_apdqid > 0$
+ PDQINIB _kernel_apdqinib_table[$num_apdqid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(PDQINIB, _kernel_apdqinib_table);$NL$
+$END$$NL$
+
+$ 優先度データキュー管理ブロックの生成
+$IF num_pdqid$
+ PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
+$END$$NL$
+
+$
+$ メールボックス
+$
+/*$NL$
+$SPC$* Mailbox Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたメールボックスの数
+#define TNUM_SMBXID $LENGTH(MBX.ID_LIST)$$NL$
+$NL$
+
+$ メールボックスID番号の最大値
+const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1);$NL$
+const ID _kernel_tmax_smbxid = (TMIN_MBXID + TNUM_SMBXID - 1);$NL$
+$NL$
+
+$ メールボックス初期化ブロックの生成
+$IF LENGTH(MBX.ID_LIST)$
+ const MBXINIB _kernel_mbxinib_table[TNUM_SMBXID] = {$NL$
+ $JOINEACH mbxid MBX.ID_LIST ",\n"$
+$ // mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
+ $IF (MBX.MBXATR[mbxid] & ~(TA_TPRI|TA_MPRI)) != 0$
+ $ERROR MBX.TEXT_LINE[mbxid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mbxatr", MBX.MBXATR[mbxid], mbxid, "CRE_MBX")$$END$
+ $END$
+
+$ // (TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
+ $IF !(TMIN_MPRI <= MBX.MAXMPRI[mbxid] && MBX.MAXMPRI[mbxid] <= TMAX_MPRI)$
+ $ERROR MBX.TEXT_LINE[mbxid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxmpri", MBX.MAXMPRI[mbxid], mbxid, "CRE_MBX")$$END$
+ $END$
+
+$ // mprihdがNULLでない場合(E_NOSPT)
+ $IF !EQ(MBX.MPRIHD[mbxid], "NULL")$
+ $ERROR MBX.TEXT_LINE[mbxid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mprihd", MBX.MPRIHD[mbxid], mbxid, "CRE_MBX")$$END$
+ $END$
+
+$ // メールボックス初期化ブロック
+ $TAB${ ($MBX.MBXATR[mbxid]$), ($MBX.MAXMPRI[mbxid]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
+$END$$NL$
+
+$ 動的生成メールボックス用のメールボックス初期化ブロックの生成
+$IF num_ambxid > 0$
+ MBXINIB _kernel_ambxinib_table[$num_ambxid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(MBXINIB, _kernel_ambxinib_table);$NL$
+$END$$NL$
+
+$ メールボックス管理ブロックの生成
+$IF num_mbxid$
+ MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
+$END$$NL$
+
+$
+$ 固定長メモリプール
+$
+/*$NL$
+$SPC$* Fixed-sized Memorypool Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成された固定長メモリプールの数
+#define TNUM_SMPFID $LENGTH(MPF.ID_LIST)$$NL$
+$NL$
+
+$ 固定長メモリプールID番号の最大値
+const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1);$NL$
+const ID _kernel_tmax_smpfid = (TMIN_MPFID + TNUM_SMPFID - 1);$NL$
+$NL$
+
+$IF LENGTH(MPF.ID_LIST)$
+ $FOREACH mpfid MPF.ID_LIST$
+$ // mpfatrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (MPF.MPFATR[mpfid] & ~TA_TPRI) != 0$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfatr", MPF.MPFATR[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // blkcntが0の場合(E_PAR)
+ $IF MPF.BLKCNT[mpfid] == 0$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blkcnt", MPF.BLKCNT[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // blkszが0の場合(E_PAR)
+ $IF MPF.BLKSZ[mpfid] == 0$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blksz", MPF.BLKSZ[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // 固定長メモリプール領域
+ $IF EQ(MPF.MPF[mpfid], "NULL")$
+ static MPF_T _kernel_mpf_$mpfid$[($MPF.BLKCNT[mpfid]$) * COUNT_MPF_T($MPF.BLKSZ[mpfid]$)];$NL$
+ $END$
+
+$ // mpfmbがNULLでない場合(E_NOSPT)
+ $IF !EQ(MPF.MPFMB[mpfid], "NULL")$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfmb", MPF.MPFMB[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // 固定長メモリプール管理領域
+ static MPFMB _kernel_mpfmb_$mpfid$[$MPF.BLKCNT[mpfid]$];$NL$
+ $END$
+
+$ // 固定長メモリプール初期化ブロックの生成
+ const MPFINIB _kernel_mpfinib_table[TNUM_SMPFID] = {$NL$
+ $JOINEACH mpfid MPF.ID_LIST ",\n"$
+ $TAB${ ($MPF.MPFATR[mpfid]$), ($MPF.BLKCNT[mpfid]$), ROUND_MPF_T($MPF.BLKSZ[mpfid]$), $IF EQ(MPF.MPF[mpfid],"NULL")$(_kernel_mpf_$mpfid$)$ELSE$($MPF.MPF[mpfid]$)$END$, (_kernel_mpfmb_$mpfid$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
+$END$$NL$
+
+$ 動的生成固定長メモリプール用の固定長メモリプール初期化ブロックの生成
+$IF num_ampfid > 0$
+ MPFINIB _kernel_ampfinib_table[$num_ampfid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(MPFINIB, _kernel_ampfinib_table);$NL$
+$END$$NL$
+
+$ 固定長メモリプール管理ブロックの生成
+$IF num_mpfid$
+ MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
+$END$$NL$
+
+$
+$ 周期ハンドラ
+$
+/*$NL$
+$SPC$* Cyclic Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成された周期ハンドラの数
+#define TNUM_SCYCID $LENGTH(CYC.ID_LIST)$$NL$
+$NL$
+
+$ 周期ハンドラID番号の最大値
+const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1);$NL$
+const ID _kernel_tmax_scycid = (TMIN_CYCID + TNUM_SCYCID - 1);$NL$
+$NL$
+
+$ 周期ハンドラ初期化テーブルの生成
+$IF LENGTH(CYC.ID_LIST)$
+ const CYCINIB _kernel_cycinib_table[TNUM_SCYCID] = {$NL$
+ $JOINEACH cycid CYC.ID_LIST ",\n"$
+$ // cycatrが([TA_STA])でない場合(E_RSATR)
+ $IF (CYC.CYCATR[cycid] & ~TA_STA) != 0$
+ $ERROR CYC.TEXT_LINE[cycid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycatr", CYC.CYCATR[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+
+$ // (0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
+ $IF !(0 < CYC.CYCTIM[cycid] && CYC.CYCTIM[cycid] <= TMAX_RELTIM)$
+ $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cyctim", CYC.CYCTIM[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+
+$ // (0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
+ $IF !(0 <= CYC.CYCPHS[cycid] && CYC.CYCPHS[cycid] <= TMAX_RELTIM)$
+ $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycphs", CYC.CYCPHS[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+
+$ // 警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
+ $IF (CYC.CYCATR[cycid] & TA_STA) != 0 && CYC.CYCPHS[cycid] == 0$
+ $WARNING CYC.TEXT_LINE[cycid]$$FORMAT(_("%1% is not recommended when %2% is set to %3% in %4%"), "cycphs==0", "TA_STA", "cycatr", "CRE_CYC")$$END$
+ $END$
+
+$ // 周期ハンドラ初期化ブロック
+ $TAB${ ($CYC.CYCATR[cycid]$), (intptr_t)($CYC.EXINF[cycid]$), ($CYC.CYCHDR[cycid]$), ($CYC.CYCTIM[cycid]$), ($CYC.CYCPHS[cycid]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
+$END$$NL$
+
+$ 動的生成周期ハンドラ用の周期ハンドラ初期化ブロックの生成
+$IF num_acycid > 0$
+ CYCINIB _kernel_acycinib_table[$num_acycid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(CYCINIB, _kernel_acycinib_table);$NL$
+$END$$NL$
+
+$ 周期ハンドラ管理ブロック
+$IF num_cycid$
+ CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
+$END$$NL$
+
+$
+$ アラームハンドラ
+$
+/*$NL$
+$SPC$* Alarm Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 静的に生成されたアラームハンドラの数
+#define TNUM_SALMID $LENGTH(ALM.ID_LIST)$$NL$
+$NL$
+
+$ アラームハンドラID番号の最大値
+const ID _kernel_tmax_almid = (TMIN_ALMID + TNUM_ALMID - 1);$NL$
+const ID _kernel_tmax_salmid = (TMIN_ALMID + TNUM_SALMID - 1);$NL$
+$NL$
+
+$ アラームハンドラ初期化ブロックの生成
+$IF LENGTH(ALM.ID_LIST)$
+ const ALMINIB _kernel_alminib_table[TNUM_SALMID] = {$NL$
+ $JOINEACH almid ALM.ID_LIST ",\n"$
+$ // almatrが(TA_NULL)でない場合(E_RSATR)
+ $IF ALM.ALMATR[almid] != 0$
+ $ERROR ALM.TEXT_LINE[almid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "almatr", ALM.ALMATR[almid], almid, "CRE_ALM")$$END$
+ $END$
+
+$ // アラームハンドラ初期化ブロック
+ $TAB${ ($ALM.ALMATR[almid]$), (intptr_t)($ALM.EXINF[almid]$), ($ALM.ALMHDR[almid]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
+$END$$NL$
+
+$ 動的生成アラームハンドラ用のアラームハンドラ初期化ブロックの生成
+$IF num_aalmid > 0$
+ ALMINIB _kernel_aalminib_table[$num_aalmid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(ALMINIB, _kernel_aalminib_table);$NL$
+$END$$NL$
+
+$ アラームハンドラ管理ブロック
+$IF num_almid$
+ ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
+$END$$NL$
+
+$
+$ 割込み管理機能
+$
+/*$NL$
+$SPC$* Interrupt Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 割込み番号と割込みハンドラ番号の変換テーブルの作成
+$IF LENGTH(INTNO_ATTISR_VALID) != LENGTH(INHNO_ATTISR_VALID)$
+ $ERROR$length of `INTNO_ATTISR_VALID' is different from length of `INHNO_ATTISR_VALID'$END$
+$END$
+$i = 0$
+$FOREACH intno INTNO_ATTISR_VALID$
+ $inhno = AT(INHNO_ATTISR_VALID, i)$
+ $INHNO[intno] = inhno$
+ $INTNO[inhno] = intno$
+ $i = i + 1$
+$END$
+
+$ 割込み要求ラインに関するエラーチェック
+$i = 0$
+$FOREACH intno INT.ORDER_LIST$
+$ // intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INTNO_CFGINT_VALID, INT.INTNO[intno]))$
+ $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+ $END$
+
+$ // intnoがCFG_INTによって設定済みの場合(E_OBJ)
+ $j = 0$
+ $FOREACH intno2 INT.ORDER_LIST$
+ $IF INT.INTNO[intno] == INT.INTNO[intno2] && j < i$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+ $END$
+ $j = j + 1$
+ $END$
+
+$ // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
+ $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
+ $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
+ $END$
+
+$ // intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$
+ $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intpri", INT.INTPRI[intno], "CFG_INT")$$END$
+ $END$
+
+$ // カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRI
+$ // よりも小さい値が指定された場合(E_OBJ)
+ $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must not have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+
+$ // カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
+$ // よりも小さい値が指定されなかった場合(E_OBJ)
+ $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$
+ $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+ $i = i + 1$
+$END$
+
+$ 割込みハンドラに関するエラーチェック
+$i = 0$
+$FOREACH inhno INH.ORDER_LIST$
+$ // inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INHNO_DEFINH_VALID, INH.INHNO[inhno]))$
+ $ERROR INH.TEXT_LINE[inhno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+ $END$
+
+$ // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
+ $j = 0$
+ $FOREACH inhno2 INH.ORDER_LIST$
+ $IF INH.INHNO[inhno] == INH.INHNO[inhno2] && j < i$
+ $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+ $END$
+ $j = j + 1$
+ $END$
+
+$ // inhatrが(TA_NULL)でない場合(E_RSATR)
+ $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
+ $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+ $END$
+
+$ // カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$ // が指定されている場合(E_RSATR)
+ $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$
+ $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must not be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+ $END$
+ $END$
+
+$ // カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$ // が指定されていない場合(E_RSATR)
+ $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+ $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+ $END$
+ $END$
+
+ $IF LENGTH(INTNO[INH.INHNO[inhno]])$
+ $intno = INTNO[INH.INHNO[inhno]]$
+$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+ $IF !LENGTH(INT.INTNO[intno])$
+ $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+ $ELSE$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+ $END$
+ $ELSE$
+$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRI以上である場合(E_OBJ)
+ $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+ $END$
+ $END$
+ $i = i + 1$
+$END$
+
+$ 割込みサービスルーチン(ISR)に関するエラーチェック
+$FOREACH order ISR.ORDER_LIST$
+$ // isratrが(TA_NULL)でない場合(E_RSATR)
+ $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+ $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
+ $END$
+
+$ // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INTNO_ATTISR_VALID, ISR.INTNO[order]))$
+ $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", ISR.INTNO[order], "ATT_ISR")$$END$
+ $END$
+
+$ // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
+ $IF !(TMIN_ISRPRI <= ISR.ISRPRI[order] && ISR.ISRPRI[order] <= TMAX_ISRPRI)$
+ $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isrpri", ISR.ISRPRI[order], "ATT_ISR")$$END$
+ $END$
+$END$
+
+$FOREACH intno INTNO_ATTISR_VALID$
+ $inhno = INHNO[intno]$
+
+$ // 割込み番号intnoに対して登録されたISRのリストの作成
+ $isr_order_list = {}$
+ $FOREACH order ISR.ORDER_LIST$
+ $IF ISR.INTNO[order] == intno$
+ $isr_order_list = APPEND(isr_order_list, order)$
+ $order_for_error = order$
+ $END$
+ $END$
+
+$ // 割込み番号intnoに対して登録されたISRが存在する場合
+ $IF LENGTH(isr_order_list) > 0$
+$ // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
+ $IF LENGTH(INH.INHNO[inhno])$
+ $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"), "intno", ISR.INTNO[order_for_error], "ATT_ISR", "inhno", INH.INHNO[inhno])$$END$
+ $END$
+
+$ // intnoに対するCFG_INTがない場合(E_OBJ)
+ $IF !LENGTH(INT.INTNO[intno])$
+ $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' is not configured with %3%"), "intno", ISR.INTNO[order_for_error], "CFG_INT")$$END$
+ $ELSE$
+$ // intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRI
+$ // よりも小さい場合(E_OBJ)
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "intno", ISR.INTNO[order_for_error], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+ $END$
+$END$
+
+$ 割込みサービスルーチン(ISR)管理のデータ構造
+$intno_isr_list = {}$
+$FOREACH intno INTNO_ATTISR_VALID$
+ $inhno = INHNO[intno]$
+ $IF LENGTH(INT.INTNO[intno]) && !LENGTH(INH.INHNO[inhno])$
+ $intno_isr_list = APPEND(intno_isr_list, intno)$
+ $END$
+$END$
+
+$INTNO_ISR = {}$
+$i = 0$
+$FOREACH intno SORT(intno_isr_list, "INT.INTNO")$
+ $INTNO_ISR = APPEND(INTNO_ISR, intno)$
+ $ISR_QUEUE_HEADER[intno] = FORMAT("&(_kernel_isr_queue_table[%d])", i)$
+ $i = i + 1$
+$END$
+
+const uint_t _kernel_tnum_isr_queue = $LENGTH(INTNO_ISR)$;$NL$
+$NL$
+
+$IF LENGTH(INTNO_ISR)$
+ const ISR_ENTRY _kernel_isr_queue_list[$LENGTH(INTNO_ISR)$] = {$NL$
+ $JOINEACH intno INTNO_ISR ",\n"$
+ $TAB${ $intno$, $ISR_QUEUE_HEADER[intno]$ }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
+$END$$NL$
+
+$IF LENGTH(INTNO_ISR)$
+ QUEUE _kernel_isr_queue_table[$LENGTH(INTNO_ISR)$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
+$END$$NL$
+
+$ 割込みサービスルーチン(ISR)呼出しのための割込みハンドラの生成
+$FOREACH intno INTNO_ISR$
+ $inhno = INHNO[intno]$
+
+$ // DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
+ $INH.INHNO[inhno] = inhno$
+ $INH.INHATR[inhno] = VALUE("TA_NULL", 0)$
+ $INH.INTHDR[inhno] = CONCAT("_kernel_inthdr_", intno)$
+ $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$
+
+$ // ISR用の割込みハンドラ
+ void$NL$
+ _kernel_inthdr_$intno$(void)$NL$
+ {$NL$
+ $TAB$i_begin_int($intno$);$NL$
+ $TAB$call_isr($ISR_QUEUE_HEADER[intno]$);$NL$
+ $TAB$i_end_int($intno$);$NL$
+ }$NL$
+ $NL$
+$END$
+
+$ 静的に生成された割込みサービスルーチンの数
+#define TNUM_SISR $LENGTH(ISR.ORDER_LIST)$$NL$
+#define TNUM_ISR $LENGTH(ISR.ORDER_LIST) + num_aisrid$$NL$
+$NL$
+
+$ 割込みサービスルーチンID番号の最大値
+const ID _kernel_tmax_isrid = (TMIN_ISRID + TNUM_ISRID - 1);$NL$
+const uint_t _kernel_tnum_sisr = TNUM_SISR;$NL$
+$NL$
+
+$ 割込みサービスルーチン初期化ブロックの生成
+$IF LENGTH(ISR.ORDER_LIST)$
+ const ISRINIB _kernel_sisrinib_table[TNUM_SISR] = {$NL$
+ $JOINEACH order ISR.ORDER_LIST ",\n"$
+ $TAB${ ($ISR.ISRATR[order]$), ($ISR.EXINF[order]$), ($ISR.INTNO[order]$), ($ISR_QUEUE_HEADER[ISR.INTNO[order]]$), ($ISR.ISR[order]$), ($ISR.ISRPRI[order]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const ISRINIB, _kernel_sisrinib_table);$NL$
+$END$
+$NL$
+
+$ 動的生成割込みサービスルーチン用の割込みサービスルーチン初期化ブロッ
+$ クの生成
+$IF num_aisrid > 0$
+ ISRINIB _kernel_aisrinib_table[$num_aisrid$];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(ISRINIB, _kernel_aisrinib_table);$NL$
+$END$
+$NL$
+
+$ 割込みサービスルーチン管理ブロックの生成
+$IF LENGTH(ISR.ORDER_LIST) || num_aisrid > 0$
+ ISRCB _kernel_isrcb_table[TNUM_ISR];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(ISRCB, _kernel_isrcb_table);$NL$
+$END$
+$NL$
+
+$
+$ 割込み管理機能のための標準的な初期化情報の生成
+$
+$ 割込みハンドラの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
+
+$ 割込みハンドラ数
+#define TNUM_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_inhno = TNUM_INHNO;$NL$
+$NL$
+$FOREACH inhno INH.ORDER_LIST$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+ INTHDR_ENTRY($INH.INHNO[inhno]$, $+INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)$NL$
+ $END$
+$END$
+$NL$
+
+$ 割込みハンドラ初期化テーブル
+$IF LENGTH(INH.ORDER_LIST)$
+ const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {$NL$
+ $JOINEACH inhno INH.ORDER_LIST ",\n"$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+ $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)(INT_ENTRY($INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)) }
+ $ELSE$
+ $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)($INH.INTHDR[inhno]$) }
+ $END$
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 割込み要求ラインの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
+
+$ 割込み要求ライン数
+#define TNUM_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_intno = TNUM_INTNO;$NL$
+$NL$
+
+$ 割込み要求ライン初期化テーブル
+$IF LENGTH(INT.ORDER_LIST)$
+ const INTINIB _kernel_intinib_table[TNUM_INTNO] = {$NL$
+ $JOINEACH intno INT.ORDER_LIST ",\n"$
+ $TAB${ ($INT.INTNO[intno]$), ($INT.INTATR[intno]$), ($INT.INTPRI[intno]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
+$END$$NL$
+$END$
+
+$
+$ CPU例外管理機能
+$
+/*$NL$
+$SPC$* CPU Exception Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ CPU例外ハンドラに関するエラーチェック
+$i = 0$
+$FOREACH excno EXC.ORDER_LIST$
+$ // excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(EXCNO_DEFEXC_VALID, EXC.EXCNO[excno]))$
+ $ERROR EXC.TEXT_LINE[excno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+ $END$
+
+$ // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
+ $j = 0$
+ $FOREACH excno2 EXC.ORDER_LIST$
+ $IF EXC.EXCNO[excno] == EXC.EXCNO[excno2] && j < i$
+ $ERROR EXC.TEXT_LINE[excno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+ $END$
+ $j = j + 1$
+ $END$
+
+$ // excatrが(TA_NULL)でない場合(E_RSATR)
+ $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
+ $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+ $END$
+ $i = i + 1$
+$END$
+
+$ CPU例外ハンドラのための標準的な初期化情報の生成
+$IF !OMIT_INITIALIZE_EXCEPTION$
+
+$ CPU例外ハンドラ数
+#define TNUM_EXCNO $LENGTH(EXC.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_excno = TNUM_EXCNO;$NL$
+$NL$
+$FOREACH excno EXC.ORDER_LIST$
+ EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
+$END$
+$NL$
+
+$ CPU例外ハンドラ初期化テーブル
+$IF LENGTH(EXC.ORDER_LIST)$
+ const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
+ $JOINEACH excno EXC.ORDER_LIST ",\n"$
+ $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
+$END$$NL$
+$END$
+
+$
+$ 非タスクコンテキスト用のスタック領域
+$
+/*$NL$
+$SPC$* Stack Area for Non-task Context$NL$
+$SPC$*/$NL$
+$NL$
+
+$IF !LENGTH(ICS.ORDER_LIST)$
+$ // DEF_ICSがない場合のデフォルト値の設定
+ #ifdef DEFAULT_ISTK$NL$
+ $NL$
+ #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ$NL$
+ #define TOPPERS_ISTK DEFAULT_ISTK$NL$
+ $NL$
+ #else /* DEAULT_ISTK */$NL$
+ $NL$
+ static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];$NL$
+ #define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)$NL$
+ #define TOPPERS_ISTK _kernel_istack$NL$
+ $NL$
+ #endif /* DEAULT_ISTK */$NL$
+$ELSE$
+
+$ // 静的API「DEF_ICS」が複数ある(E_OBJ)
+ $IF LENGTH(ICS.ORDER_LIST) > 1$
+ $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$
+ $END$
+
+$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
+ $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
+ && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
+ $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
+ $END$
+
+ $IF EQ(ICS.ISTK[1], "NULL")$
+$ // スタック領域の自動割付け
+ static STK_T _kernel_istack[COUNT_STK_T($ICS.ISTKSZ[1]$)];$NL$
+ #define TOPPERS_ISTKSZ ROUND_STK_T($ICS.ISTKSZ[1]$)$NL$
+ #define TOPPERS_ISTK _kernel_istack$NL$
+ $ELSE$
+ #define TOPPERS_ISTKSZ ($ICS.ISTKSZ[1]$)$NL$
+ #define TOPPERS_ISTK ($ICS.ISTK[1]$)$NL$
+ $END$
+$END$
+$NL$
+
+$ 非タスクコンテキスト用のスタック領域
+const SIZE _kernel_istksz = TOPPERS_ISTKSZ;$NL$
+STK_T *const _kernel_istk = TOPPERS_ISTK;$NL$
+$NL$
+#ifdef TOPPERS_ISTKPT$NL$
+STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);$NL$
+#endif /* TOPPERS_ISTKPT */$NL$
+$NL$
+
+$
+$ カーネルが割り付けるメモリ領域
+$
+/*$NL$
+$SPC$* Memory Area Allocated by Kernel$NL$
+$SPC$*/$NL$
+$NL$
+
+$IF !LENGTH(KMM.ORDER_LIST)$
+$ // DEF_KMMがない場合のデフォルト値の設定
+ #define TOPPERS_KMMSZ 0$NL$
+ #define TOPPERS_KMM NULL$NL$
+$ELSE$
+
+$ // 静的API「DEF_KMM」が複数ある(E_OBJ)
+ $IF LENGTH(KMM.ORDER_LIST) > 1$
+ $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_KMM")$$END$
+ $END$
+
+$ // kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場合(E_PAR)
+ $IF !EQ(KMM.KMM[1], "NULL") && CHECK_MB_ALIGN
+ && (KMM.MBSZ[1] & (CHECK_MB_ALIGN - 1))$
+ $ERROR KMM.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "kmmsz", KMM.KMMSZ[1], "DEF_KMM")$$END$
+ $END$
+
+ $IF EQ(KMM.KMM[1], "NULL")$
+$ // カーネルが割り付けるメモリ領域の自動割付け
+ static MB_T _kernel_memory[TOPPERS_COUNT_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))];$NL$
+ #define TOPPERS_KMMSZ TOPPERS_ROUND_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))$NL$
+ #define TOPPERS_KMM _kernel_memory$NL$
+ $ELSE$
+ #define TOPPERS_KMMSZ ($KMM.KMMSZ[1]$)$NL$
+ #define TOPPERS_KMM ($KMM.KMM[1]$)$NL$
+ $END$
+$END$
+$NL$
+
+$ カーネルが割り付けるメモリ領域
+const SIZE _kernel_kmmsz = TOPPERS_KMMSZ;$NL$
+MB_T *const _kernel_kmm = TOPPERS_KMM;$NL$
+$NL$
+
+$
+$ タイムイベント管理
+$
+/*$NL$
+$SPC$* Time Event Management$NL$
+$SPC$*/$NL$
+$NL$
+TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];$NL$
+$NL$
+
+$
+$ 各モジュールの初期化関数
+$
+/*$NL$
+$SPC$* Module Initialization Function$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_initialize_object(void)$NL$
+{$NL$
+$TAB$_kernel_initialize_task();$NL$
+$IF num_semid$ _kernel_initialize_semaphore();$NL$$END$
+$IF num_flgid$ _kernel_initialize_eventflag();$NL$$END$
+$IF num_dtqid$ _kernel_initialize_dataqueue();$NL$$END$
+$IF num_pdqid$ _kernel_initialize_pridataq();$NL$$END$
+$IF num_mbxid$ _kernel_initialize_mailbox();$NL$$END$
+$IF num_mpfid$ _kernel_initialize_mempfix();$NL$$END$
+$IF num_cycid$ _kernel_initialize_cyclic();$NL$$END$
+$IF num_almid$ _kernel_initialize_alarm();$NL$$END$
+$TAB$_kernel_initialize_interrupt();$NL$
+$IF num_isr$ _kernel_initialize_isr();$NL$$END$
+$TAB$_kernel_initialize_exception();$NL$
+}$NL$
+$NL$
+
+$
+$ 初期化ルーチンの実行関数
+$
+/*$NL$
+$SPC$* Initialization Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_inirtn(void)$NL$
+{$NL$
+$FOREACH order INI.ORDER_LIST$
+$ // iniatrが(TA_NULL)でない場合(E_RSATR)
+ $IF INI.INIATR[order] != 0$
+ $ERROR INI.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "iniatr", INI.INIATR[order], "inirtn", INI.INIRTN[order], "ATT_INI")$$END$
+ $END$
+ $TAB$((INIRTN)($INI.INIRTN[order]$))((intptr_t)($INI.EXINF[order]$));$NL$
+$END$
+}$NL$
+$NL$
+
+$
+$ 終了処理ルーチンの実行関数
+$
+/*$NL$
+$SPC$* Termination Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_terrtn(void)$NL$
+{$NL$
+$FOREACH rorder TER.RORDER_LIST$
+$ // teratrが(TA_NULL)でない場合(E_RSATR)
+ $IF TER.TERATR[rorder] != 0$
+ $ERROR TER.TEXT_LINE[rorder]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "teratr", TER.TERATR[rorder], "terrtn", TER.TERRTN[rorder], "ATT_TER")$$END$
+ $END$
+ $TAB$((TERRTN)($TER.TERRTN[rorder]$))((intptr_t)($TER.EXINF[rorder]$));$NL$
+$END$
+}$NL$
+$NL$
--- /dev/null
+tsk,CRE_TSK,#tskid { .tskatr &exinf &task +itskpri .stksz &stk },,
+tsk,DEF_TEX,%tskid { .texatr &texrtn },0,1,
+atsk,AID_TSK,.notsk,,
+sem,CRE_SEM,#semid { .sematr .isemcnt .maxsem },,
+asem,AID_SEM,.nosem,,
+flg,CRE_FLG,#flgid { .flgatr .iflgptn },,
+aflg,AID_FLG,.nosem,,
+dtq,CRE_DTQ,#dtqid { .dtqatr .dtqcnt &dtqmb },,
+adtq,AID_DTQ,.nodtq,,
+pdq,CRE_PDQ,#pdqid { .pdqatr .pdqcnt +maxdpri &pdqmb },,
+apdq,AID_PDQ,.nopdq,,
+mbx,CRE_MBX,#mbxid { .mbxatr +maxmpri &mprihd },,
+ambx,AID_MBX,.nombx,,
+mpf,CRE_MPF,#mpfid { .mpfatr .blkcnt .blksz &mpf &mpfmb },,
+ampf,AID_MPF,.nompf,,
+cyc,CRE_CYC,#cycid { .cycatr &exinf &cychdr .cyctim .cycphs },,
+acyc,AID_CYC,.nocyc,,
+alm,CRE_ALM,#almid { .almatr &exinf &almhdr },,
+aalm,AID_ALM,.noalm,,
+int,CFG_INT,.intno { .intatr +intpri },,
+isr,ATT_ISR,{ .isratr &exinf .intno &isr +isrpri },-1,
+aisr,AID_ISR,.noisr,,
+inh,DEF_INH,.inhno { .inhatr &inthdr },,
+ics,DEF_ICS,{ .istksz &istk },-1,
+kmm,DEF_KMM,{ .kmmsz &kmm },-1,
+exc,DEF_EXC,.excno { .excatr &exchdr },,
+ini,ATT_INI,{ .iniatr &exinf &inirtn },-1,
+ter,ATT_TER,{ .teratr &exinf &terrtn },-1,
--- /dev/null
+$ ======================================================================
+$
+$ TOPPERS/ASP Kernel
+$ Toyohashi Open Platform for Embedded Real-Time Systems/
+$ Advanced Standard Profile Kernel
+$
+$ Copyright (C) 2008-2010 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 2062 2011-04-10 16:27:41Z ertl-hiro $
+$
+$ =====================================================================
+
+$
+$ 関数の先頭番地のチェック
+$
+$IF CHECK_FUNC_ALIGN || CHECK_FUNC_NONNULL$
+$ // タスクとタスク例外処理ルーチンの先頭番地のチェック
+ $tinib = SYMBOL("_kernel_tinib_table")$
+ $FOREACH tskid TSK.ID_LIST$
+ $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:
+ $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:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+ "task", TSK.TASK[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+ $texrtn = PEEK(tinib + offsetof_TINIB_texrtn, sizeof_FP)$
+ $IF CHECK_FUNC_ALIGN && (texrtn & (CHECK_FUNC_ALIGN - 1)) != 0$
+ $ERROR DEF_TEX.TEXT_LINE[tskid]$E_PAR:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+ "texrtn", TSK.TEXRTN[tskid], tskid, "DEF_TEX")$$END$
+ $END$
+ $tinib = tinib + sizeof_TINIB$
+ $END$
+
+$ // 周期ハンドラの先頭番地のチェック
+ $cycinib = SYMBOL("_kernel_cycinib_table")$
+ $FOREACH cycid CYC.ID_LIST$
+ $cychdr = PEEK(cycinib + offsetof_CYCINIB_cychdr, 4)$
+ $IF CHECK_FUNC_ALIGN && (cychdr & (CHECK_FUNC_ALIGN - 1)) != 0$
+ $ERROR CYC.TEXT_LINE[cycid]$E_PAR:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+ "cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+ $IF CHECK_FUNC_NONNULL && cychdr == 0$
+ $ERROR CYC.TEXT_LINE[cycid]$E_PAR:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+ "cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+ $cycinib = cycinib + sizeof_CYCINIB$
+ $END$
+
+$ // アラームハンドラの先頭番地のチェック
+ $alminib = SYMBOL("_kernel_alminib_table")$
+ $FOREACH almid ALM.ID_LIST$
+ $almhdr = PEEK(alminib + offsetof_ALMINIB_almhdr, 4)$
+ $IF CHECK_FUNC_ALIGN && (almhdr & (CHECK_FUNC_ALIGN - 1)) != 0$
+ $ERROR ALM.TEXT_LINE[almid]$E_PAR:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
+ "almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
+ $END$
+ $IF CHECK_FUNC_NONNULL && almhdr == 0$
+ $ERROR ALM.TEXT_LINE[almid]$E_PAR:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+ "almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
+ $END$
+ $alminib = alminib + sizeof_ALMINIB$
+ $END$
+
+$ // 割込みサービスルーチンの先頭番地のチェック
+ $isrinib = SYMBOL("_kernel_sisrinib_table")$
+ $FOREACH order ISR.ORDER_LIST$
+ $isr = PEEK(isrinib + offsetof_ISRINIB_isr, 4)$
+ $IF CHECK_FUNC_ALIGN && (isr & (CHECK_FUNC_ALIGN - 1)) != 0$
+ $ERROR ISR.TEXT_LINE[order]$E_PAR:
+ $FORMAT(_("%1% `%2%\' in %4% is not aligned"),
+ "isr", ISR.ISR[order], "ATT_ISR")$$END$
+ $END$
+ $IF CHECK_FUNC_NONNULL && isr == 0$
+ $ERROR ISR.TEXT_LINE[order]$E_PAR:
+ $FORMAT(_("%1% `%2%\' in %4% is null"),
+ "isr", ISR.ISR[order], "ATT_ISR")$$END$
+ $END$
+ $isrinib = isrinib + sizeof_ISRINIB$
+ $END$
+$END$
+
+$
+$ スタック領域の先頭番地のチェック
+$
+$IF CHECK_STACK_ALIGN || CHECK_STACK_NONNULL$
+$ // タスクのスタック領域の先頭番地のチェック
+ $tinib = SYMBOL("_kernel_tinib_table")$
+ $FOREACH tskid TSK.ID_LIST$
+ $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:
+ $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:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+ "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+ $tinib = tinib + sizeof_TINIB$
+ $END$
+
+$ // 非タスクコンテキスト用のスタック領域の先頭番地のチェック
+ $istk = PEEK(SYMBOL("_kernel_istk"), sizeof_void_ptr)$
+ $IF CHECK_STACK_ALIGN && (istk & (CHECK_STACK_ALIGN - 1)) != 0$
+ $ERROR ICE.TEXT_LINE[1]$E_PAR:
+ $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
+ "istk", ICS.ISTK[1], "DEF_ICS")$$END$
+ $END$
+ $IF CHECK_STACK_NONNULL && istk == 0$
+ $ERROR ICE.TEXT_LINE[1]$E_PAR:
+ $FORMAT(_("%1% `%2%\' in %3% is null"),
+ "istk", ICS.ISTK[1], "DEF_ICS")$$END$
+ $END$
+$END$
+
+$
+$ 固定長メモリプール領域の先頭番地のチェック
+$
+$IF CHECK_MPF_ALIGN || CHECK_MPF_NONNULL$
+$ // 固定長メモリプール領域の先頭番地のチェック
+ $mpfinib = SYMBOL("_kernel_mpfinib_table")$
+ $FOREACH mpfid MPF.ID_LIST$
+ $mpf = PEEK(mpfinib + offsetof_MPFINIB_mpf, sizeof_void_ptr)$
+ $IF CHECK_MPF_ALIGN && (mpf & (CHECK_MPF_ALIGN - 1)) != 0$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_PAR:
+ $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:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+ "mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+ $mpfinib = mpfinib + sizeof_MPFINIB$
+ $END$
+$END$
+
+$
+$ カーネルが割り付けるメモリ領域の先頭番地のチェック
+$
+$IF CHECK_MB_ALIGN$
+$ // カーネルが割り付けるメモリ領域の先頭番地のチェック
+ $kmm = PEEK(SYMBOL("_kernel_kmm"), sizeof_void_ptr)$
+ $IF CHECK_MB_ALIGN && (kmm & (CHECK_MB_ALIGN - 1)) != 0$
+ $ERROR KMM.TEXT_LINE[1]$E_PAR:
+ $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
+ "kmm", KMM.KMM[1], "DEF_KMM")$$END$
+ $END$
+$END$
--- /dev/null
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
+TA_NULL,TA_NULL
+TA_ACT,TA_ACT
+TA_TPRI,TA_TPRI
+TA_MPRI,TA_MPRI
+TA_WMUL,TA_WMUL
+TA_CLR,TA_CLR
+TA_STA,TA_STA
+TA_NONKERNEL,TA_NONKERNEL
+TA_ENAINT,TA_ENAINT
+TA_EDGE,TA_EDGE
+TMIN_TPRI,TMIN_TPRI,signed
+TMAX_TPRI,TMAX_TPRI,signed
+TMIN_DPRI,TMIN_DPRI,signed
+TMAX_DPRI,TMAX_DPRI,signed
+TMIN_MPRI,TMIN_MPRI,signed
+TMAX_MPRI,TMAX_MPRI,signed
+TMIN_ISRPRI,TMIN_ISRPRI,signed
+TMAX_ISRPRI,TMAX_ISRPRI,signed
+TMAX_MAXSEM,TMAX_MAXSEM
+TMAX_RELTIM,TMAX_RELTIM
+TMIN_INTPRI,TMIN_INTPRI,signed
+OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
+OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
+USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
+CHECK_MB_ALIGN,#defined(CHECK_MB_ALIGN),,CHECK_MB_ALIGN
+sizeof_ID,sizeof(ID)
+sizeof_uint_t,sizeof(uint_t)
+sizeof_SIZE,sizeof(SIZE)
+sizeof_ATR,sizeof(ATR)
+sizeof_PRI,sizeof(PRI)
+sizeof_void_ptr,sizeof(void*)
+sizeof_VP,sizeof(void*)
+sizeof_intptr_t,sizeof(intptr_t)
+sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
+sizeof_TINIB,sizeof(TINIB)
+offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
+offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
+offsetof_TINIB_task,"offsetof(TINIB,task)"
+offsetof_TINIB_ipriority,"offsetof(TINIB,ipriority)"
+offsetof_TINIB_stksz,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stksz)"
+offsetof_TINIB_stk,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stk)"
+offsetof_TINIB_texatr,"offsetof(TINIB,texatr)"
+offsetof_TINIB_texrtn,"offsetof(TINIB,texrtn)"
+sizeof_SEMINIB,sizeof(SEMINIB)
+offsetof_SEMINIB_sematr,"offsetof(SEMINIB,sematr)"
+offsetof_SEMINIB_isemcnt,"offsetof(SEMINIB,isemcnt)"
+offsetof_SEMINIB_maxsem,"offsetof(SEMINIB,maxsem)"
+sizeof_FLGPTN,sizeof(FLGPTN)
+sizeof_FLGINIB,sizeof(FLGINIB)
+offsetof_FLGINIB_flgatr,"offsetof(FLGINIB,flgatr)"
+offsetof_FLGINIB_iflgptn,"offsetof(FLGINIB,iflgptn)"
+sizeof_DTQINIB,sizeof(DTQINIB)
+offsetof_DTQINIB_dtqatr,"offsetof(DTQINIB,dtqatr)"
+offsetof_DTQINIB_dtqcnt,"offsetof(DTQINIB,dtqcnt)"
+offsetof_DTQINIB_p_dtqmb,"offsetof(DTQINIB,p_dtqmb)"
+sizeof_PDQINIB,sizeof(PDQINIB)
+offsetof_PDQINIB_pdqatr,"offsetof(PDQINIB,pdqatr)"
+offsetof_PDQINIB_pdqcnt,"offsetof(PDQINIB,pdqcnt)"
+offsetof_PDQINIB_maxdpri,"offsetof(PDQINIB,maxdpri)"
+offsetof_PDQINIB_p_pdqmb,"offsetof(PDQINIB,p_pdqmb)"
+sizeof_MBXINIB,sizeof(MBXINIB)
+offsetof_MBXINIB_mbxatr,"offsetof(MBXINIB,mbxatr)"
+offsetof_MBXINIB_maxmpri,"offsetof(MBXINIB,maxmpri)"
+sizeof_MPFINIB,sizeof(MPFINIB)
+offsetof_MPFINIB_mpfatr,"offsetof(MPFINIB,mpfatr)"
+offsetof_MPFINIB_blkcnt,"offsetof(MPFINIB,blkcnt)"
+offsetof_MPFINIB_blksz,"offsetof(MPFINIB,blksz)"
+offsetof_MPFINIB_mpf,"offsetof(MPFINIB,mpf)"
+offsetof_MPFINIB_p_mpfmb,"offsetof(MPFINIB,p_mpfmb)"
+sizeof_CYCINIB,sizeof(CYCINIB)
+offsetof_CYCINIB_cycatr,"offsetof(CYCINIB,cycatr)"
+offsetof_CYCINIB_exinf,"offsetof(CYCINIB,exinf)"
+offsetof_CYCINIB_cychdr,"offsetof(CYCINIB,cychdr)"
+offsetof_CYCINIB_cyctim,"offsetof(CYCINIB,cyctim)"
+offsetof_CYCINIB_cycphs,"offsetof(CYCINIB,cycphs)"
+sizeof_ALMINIB,sizeof(ALMINIB)
+offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
+offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
+offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
+sizeof_ISRINIB,sizeof(ISRINIB)
+offsetof_ISRINIB_isratr,"offsetof(ISRINIB,isratr)"
+offsetof_ISRINIB_exinf,"offsetof(ISRINIB,exinf)"
+offsetof_ISRINIB_intno,"offsetof(ISRINIB,intno)"
+offsetof_ISRINIB_p_isr_queue,"offsetof(ISRINIB,p_isr_queue)"
+offsetof_ISRINIB_isr,"offsetof(ISRINIB,isr)"
+offsetof_ISRINIB_isrpri,"offsetof(ISRINIB,isrpri)"
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2004-2010 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_impl.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * TOPPERS/ASPカーネル内部向け標準ヘッダファイル
+ *
+ * このヘッダファイルは,カーネルを構成するプログラムのソースファイル
+ * で必ずインクルードするべき標準ヘッダファイルである.
+ *
+ * アセンブリ言語のソースファイルからこのファイルをインクルードする時
+ * は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
+ * 除くようになっている.
+ */
+
+#ifndef TOPPERS_KERNEL_IMPL_H
+#define TOPPERS_KERNEL_IMPL_H
+
+/*
+ * カーネルの内部識別名のリネーム
+ */
+#include "kernel_rename.h"
+
+/*
+ * アプリケーションと共通のヘッダファイル
+ */
+#include <kernel.h>
+
+/*
+ * システムログ機能のための定義
+ */
+#include <t_syslog.h>
+
+/*
+ * 型キャストを行うマクロの定義
+ */
+#ifndef CAST
+#define CAST(type, val) ((type)(val))
+#endif /* CAST */
+
+/*
+ * ターゲット依存情報の定義
+ */
+#include "target_config.h"
+
+/*
+ * すべての関数をコンパイルするための定義
+ */
+#ifdef ALLFUNC
+#include "allfunc.h"
+#endif /* ALLFUNC */
+
+/*
+ * ビットフィールドでの符号無し整数型
+ *
+ * 8ビット以下の幅のビットフィールドで,符号無し整数値を保持したい場合
+ * に用いるべきデータ型.ANSI Cでは,ビットフィールドのデータ型には
+ * intとunsigned intしか許されないため,デフォルトの定義はunsigned
+ * intとしているが,ターゲットおよびツール依存で,unsigned charまたは
+ * unsigned shortに定義した方が効率が良い場合がある.
+ */
+#ifndef BIT_FIELD_UINT
+#define BIT_FIELD_UINT unsigned int
+#endif /* BIT_FIELD_UINT */
+
+/*
+ * ビットフィールドでのブール型
+ *
+ * 1ビット幅のビットフィールドで,ブール値を保持したい場合に用いるべき
+ * データ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブー
+ * ル値を保持することを明示するために別の名称としている.
+ */
+#ifndef BIT_FIELD_BOOL
+#define BIT_FIELD_BOOL BIT_FIELD_UINT
+#endif /* BIT_FIELD_BOOL */
+
+/*
+ * オブジェクトIDの最小値の定義
+ */
+#define TMIN_TSKID 1 /* タスクIDの最小値 */
+#define TMIN_SEMID 1 /* セマフォIDの最小値 */
+#define TMIN_FLGID 1 /* フラグIDの最小値 */
+#define TMIN_DTQID 1 /* データキューIDの最小値 */
+#define TMIN_PDQID 1 /* 優先度データキューIDの最小値 */
+#define TMIN_MBXID 1 /* メールボックスIDの最小値 */
+#define TMIN_MPFID 1 /* 固定長メモリプールIDの最小値 */
+#define TMIN_CYCID 1 /* 周期ハンドラIDの最小値 */
+#define TMIN_ALMID 1 /* アラームハンドラIDの最小値 */
+#define TMIN_ISRID 1 /* 割込みサービスルーチンIDの最小値 */
+
+/*
+ * 優先度の段階数の定義
+ */
+#define TNUM_TPRI (TMAX_TPRI - TMIN_TPRI + 1)
+#define TNUM_MPRI (TMAX_MPRI - TMIN_MPRI + 1)
+#define TNUM_INTPRI (TMAX_INTPRI - TMIN_INTPRI + 1)
+
+/*
+ * カーネル内部で使用する属性の定義
+ */
+#define TA_NOEXS ((ATR)(-1)) /* 未登録状態 */
+
+#ifndef TA_MEMALLOC
+#define TA_MEMALLOC UINT_C(0x8000) /* メモリ領域をカーネルで確保 */
+#endif /* TA_MEMALLOC */
+#ifndef TA_MBALLOC
+#define TA_MBALLOC UINT_C(0x4000) /* 管理領域をカーネルで確保 */
+#endif /* TA_MBALLOC */
+
+/*
+ * ターゲット定義のエラーチェックマクロのデフォルト値の定義
+ */
+#ifndef TARGET_TSKATR
+#define TARGET_TSKATR 0U /* ターゲット定義のタスク属性 */
+#endif /* TARGET_TSKATR */
+
+#ifndef TARGET_ISRATR
+#define TARGET_ISRATR 0U /* ターゲット定義のISR属性 */
+#endif /* TARGET_ISRATR */
+
+/*
+ * ヘッダファイルを持たないモジュールの関数・変数の宣言
+ */
+#ifndef TOPPERS_MACRO_ONLY
+
+/*
+ * 各モジュールの初期化(kernel_cfg.c)
+ */
+extern void initialize_object(void);
+
+/*
+ * 初期化ルーチンの実行(kernel_cfg.c)
+ */
+extern void call_inirtn(void);
+
+/*
+ * 終了処理ルーチンの実行(kernel_cfg.c)
+ */
+extern void call_terrtn(void);
+
+/*
+ * 非タスクコンテキスト用のスタック領域(kernel_cfg.c)
+ */
+extern const SIZE istksz; /* スタック領域のサイズ(丸めた値) */
+extern STK_T *const istk; /* スタック領域の先頭番地 */
+#ifdef TOPPERS_ISTKPT
+extern STK_T *const istkpt; /* スタックポインタの初期値 */
+#endif /* TOPPERS_ISTKPT */
+
+/*
+ * カーネルが割り付けるメモリ領域(kernel_cfg.c)
+ */
+extern const SIZE kmmsz; /* カーネルが割り付けるメモリ領域のサイズ */
+extern MB_T *const kmm; /* カーネルが割り付けるメモリ領域の先頭番地 */
+
+/*
+ * カーネル動作状態フラグ(startup.c)
+ */
+extern bool_t kerflg;
+
+/*
+ * カーネルの起動(startup.c)
+ */
+extern void sta_ker(void);
+
+/*
+ * カーネルの終了処理(startup.c)
+ */
+extern void exit_kernel(void);
+
+/*
+ * カーネルの割り付けるメモリ領域の管理(startup.c)
+ */
+extern void initialize_kmm(void);
+extern void *kernel_malloc(SIZE size);
+extern void kernel_free(void *ptr);
+
+#endif /* TOPPERS_MACRO_ONLY */
+#endif /* TOPPERS_KERNEL_IMPL_H */
--- /dev/null
+# startup.c
+kerflg
+exit_kernel
+initialize_kmm
+kernel_malloc
+kernel_free
+
+# task.c
+p_runtsk
+p_schedtsk
+reqflg
+ipmflg
+disdsp
+dspflg
+ready_queue
+ready_primap
+free_tcb
+initialize_task
+search_schedtsk
+make_runnable
+make_non_runnable
+make_dormant
+make_active
+change_priority
+rotate_ready_queue
+call_texrtn
+calltex
+
+# wait.c
+make_wait_tmout
+wait_complete
+wait_tmout
+wait_tmout_ok
+wait_release
+wobj_make_wait
+wobj_make_wait_tmout
+init_wait_queue
+
+# time_event.c
+current_time
+min_time
+next_time
+next_subtime
+last_index
+initialize_tmevt
+tmevt_up
+tmevt_down
+tmevtb_insert
+tmevtb_delete
+tmevt_lefttim
+signal_time
+
+# semaphore.c
+free_semcb
+initialize_semaphore
+
+# eventflag.c
+free_flgcb
+initialize_eventflag
+check_flg_cond
+
+# dataqueue.c
+free_dtqcb
+initialize_dataqueue
+enqueue_data
+force_enqueue_data
+dequeue_data
+send_data
+force_send_data
+receive_data
+
+# pridataq.c
+free_pdqcb
+initialize_pridataq
+enqueue_pridata
+dequeue_pridata
+send_pridata
+receive_pridata
+
+# mailbox.c
+free_mbxcb
+initialize_mailbox
+
+# mempfix.c
+free_mpfcb
+initialize_mempfix
+get_mpf_block
+
+# cyclic.c
+free_cyccb
+initialize_cyclic
+call_cychdr
+
+# alarm.c
+free_almcb
+initialize_alarm
+call_almhdr
+
+# interrupt.c
+free_isrcb
+initialize_isr
+inthdr_call_isr
+initialize_interrupt
+
+# exception.c
+initialize_exception
+
+# kernel_cfg.c
+initialize_object
+call_inirtn
+call_terrtn
+tmax_tskid
+tmax_stskid
+tinib_table
+atinib_table
+tcb_table
+torder_table
+tmax_semid
+tmax_ssemid
+seminib_table
+aseminib_table
+semcb_table
+tmax_flgid
+tmax_sflgid
+flginib_table
+aflginib_table
+flgcb_table
+tmax_dtqid
+tmax_adtqid
+dtqinib_table
+sdtqinib_table
+dtqcb_table
+tmax_pdqid
+tmax_apdqid
+pdqinib_table
+apdqinib_table
+pdqcb_table
+tmax_mbxid
+tmax_smbxid
+mbxinib_table
+ambxinib_table
+mbxcb_table
+tmax_mpfid
+tmax_smpfid
+mpfinib_table
+ampfinib_table
+mpfcb_table
+tmax_cycid
+tmax_scycid
+cycinib_table
+acycinib_table
+cyccb_table
+tmax_almid
+tmax_salmid
+alminib_table
+aalminib_table
+almcb_table
+tnum_isr_queue
+isr_queue_table
+isr_queue_list
+tmax_isrid
+tnum_sisr
+sisrinib_table
+aisrinib_table
+isrcb_table
+tnum_inhno
+inhinib_table
+tnum_intno
+intinib_table
+tnum_excno
+excinib_table
+tmevt_heap
+istksz
+istk
+istkpt
+kmmsz
+kmm
+
+INCLUDE "target"
--- /dev/null
+/* This file is generated from kernel_rename.def by genrename. */
+
+#ifndef TOPPERS_KERNEL_RENAME_H
+#define TOPPERS_KERNEL_RENAME_H
+
+/*
+ * startup.c
+ */
+#define kerflg _kernel_kerflg
+#define exit_kernel _kernel_exit_kernel
+#define initialize_kmm _kernel_initialize_kmm
+#define kernel_malloc _kernel_kernel_malloc
+#define kernel_free _kernel_kernel_free
+
+/*
+ * task.c
+ */
+#define p_runtsk _kernel_p_runtsk
+#define p_schedtsk _kernel_p_schedtsk
+#define reqflg _kernel_reqflg
+#define ipmflg _kernel_ipmflg
+#define disdsp _kernel_disdsp
+#define dspflg _kernel_dspflg
+#define ready_queue _kernel_ready_queue
+#define ready_primap _kernel_ready_primap
+#define free_tcb _kernel_free_tcb
+#define initialize_task _kernel_initialize_task
+#define search_schedtsk _kernel_search_schedtsk
+#define make_runnable _kernel_make_runnable
+#define make_non_runnable _kernel_make_non_runnable
+#define make_dormant _kernel_make_dormant
+#define make_active _kernel_make_active
+#define change_priority _kernel_change_priority
+#define rotate_ready_queue _kernel_rotate_ready_queue
+#define call_texrtn _kernel_call_texrtn
+#define calltex _kernel_calltex
+
+/*
+ * wait.c
+ */
+#define make_wait_tmout _kernel_make_wait_tmout
+#define wait_complete _kernel_wait_complete
+#define wait_tmout _kernel_wait_tmout
+#define wait_tmout_ok _kernel_wait_tmout_ok
+#define wait_release _kernel_wait_release
+#define wobj_make_wait _kernel_wobj_make_wait
+#define wobj_make_wait_tmout _kernel_wobj_make_wait_tmout
+#define init_wait_queue _kernel_init_wait_queue
+
+/*
+ * time_event.c
+ */
+#define current_time _kernel_current_time
+#define min_time _kernel_min_time
+#define next_time _kernel_next_time
+#define next_subtime _kernel_next_subtime
+#define last_index _kernel_last_index
+#define initialize_tmevt _kernel_initialize_tmevt
+#define tmevt_up _kernel_tmevt_up
+#define tmevt_down _kernel_tmevt_down
+#define tmevtb_insert _kernel_tmevtb_insert
+#define tmevtb_delete _kernel_tmevtb_delete
+#define tmevt_lefttim _kernel_tmevt_lefttim
+#define signal_time _kernel_signal_time
+
+/*
+ * semaphore.c
+ */
+#define free_semcb _kernel_free_semcb
+#define initialize_semaphore _kernel_initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#define free_flgcb _kernel_free_flgcb
+#define initialize_eventflag _kernel_initialize_eventflag
+#define check_flg_cond _kernel_check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#define free_dtqcb _kernel_free_dtqcb
+#define initialize_dataqueue _kernel_initialize_dataqueue
+#define enqueue_data _kernel_enqueue_data
+#define force_enqueue_data _kernel_force_enqueue_data
+#define dequeue_data _kernel_dequeue_data
+#define send_data _kernel_send_data
+#define force_send_data _kernel_force_send_data
+#define receive_data _kernel_receive_data
+
+/*
+ * pridataq.c
+ */
+#define free_pdqcb _kernel_free_pdqcb
+#define initialize_pridataq _kernel_initialize_pridataq
+#define enqueue_pridata _kernel_enqueue_pridata
+#define dequeue_pridata _kernel_dequeue_pridata
+#define send_pridata _kernel_send_pridata
+#define receive_pridata _kernel_receive_pridata
+
+/*
+ * mailbox.c
+ */
+#define free_mbxcb _kernel_free_mbxcb
+#define initialize_mailbox _kernel_initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#define free_mpfcb _kernel_free_mpfcb
+#define initialize_mempfix _kernel_initialize_mempfix
+#define get_mpf_block _kernel_get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#define free_cyccb _kernel_free_cyccb
+#define initialize_cyclic _kernel_initialize_cyclic
+#define call_cychdr _kernel_call_cychdr
+
+/*
+ * alarm.c
+ */
+#define free_almcb _kernel_free_almcb
+#define initialize_alarm _kernel_initialize_alarm
+#define call_almhdr _kernel_call_almhdr
+
+/*
+ * interrupt.c
+ */
+#define free_isrcb _kernel_free_isrcb
+#define initialize_isr _kernel_initialize_isr
+#define inthdr_call_isr _kernel_inthdr_call_isr
+#define initialize_interrupt _kernel_initialize_interrupt
+
+/*
+ * exception.c
+ */
+#define initialize_exception _kernel_initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#define initialize_object _kernel_initialize_object
+#define call_inirtn _kernel_call_inirtn
+#define call_terrtn _kernel_call_terrtn
+#define tmax_tskid _kernel_tmax_tskid
+#define tmax_stskid _kernel_tmax_stskid
+#define tinib_table _kernel_tinib_table
+#define atinib_table _kernel_atinib_table
+#define tcb_table _kernel_tcb_table
+#define torder_table _kernel_torder_table
+#define tmax_semid _kernel_tmax_semid
+#define tmax_ssemid _kernel_tmax_ssemid
+#define seminib_table _kernel_seminib_table
+#define aseminib_table _kernel_aseminib_table
+#define semcb_table _kernel_semcb_table
+#define tmax_flgid _kernel_tmax_flgid
+#define tmax_sflgid _kernel_tmax_sflgid
+#define flginib_table _kernel_flginib_table
+#define aflginib_table _kernel_aflginib_table
+#define flgcb_table _kernel_flgcb_table
+#define tmax_dtqid _kernel_tmax_dtqid
+#define tmax_adtqid _kernel_tmax_adtqid
+#define dtqinib_table _kernel_dtqinib_table
+#define sdtqinib_table _kernel_sdtqinib_table
+#define dtqcb_table _kernel_dtqcb_table
+#define tmax_pdqid _kernel_tmax_pdqid
+#define tmax_apdqid _kernel_tmax_apdqid
+#define pdqinib_table _kernel_pdqinib_table
+#define apdqinib_table _kernel_apdqinib_table
+#define pdqcb_table _kernel_pdqcb_table
+#define tmax_mbxid _kernel_tmax_mbxid
+#define tmax_smbxid _kernel_tmax_smbxid
+#define mbxinib_table _kernel_mbxinib_table
+#define ambxinib_table _kernel_ambxinib_table
+#define mbxcb_table _kernel_mbxcb_table
+#define tmax_mpfid _kernel_tmax_mpfid
+#define tmax_smpfid _kernel_tmax_smpfid
+#define mpfinib_table _kernel_mpfinib_table
+#define ampfinib_table _kernel_ampfinib_table
+#define mpfcb_table _kernel_mpfcb_table
+#define tmax_cycid _kernel_tmax_cycid
+#define tmax_scycid _kernel_tmax_scycid
+#define cycinib_table _kernel_cycinib_table
+#define acycinib_table _kernel_acycinib_table
+#define cyccb_table _kernel_cyccb_table
+#define tmax_almid _kernel_tmax_almid
+#define tmax_salmid _kernel_tmax_salmid
+#define alminib_table _kernel_alminib_table
+#define aalminib_table _kernel_aalminib_table
+#define almcb_table _kernel_almcb_table
+#define tnum_isr_queue _kernel_tnum_isr_queue
+#define isr_queue_table _kernel_isr_queue_table
+#define isr_queue_list _kernel_isr_queue_list
+#define tmax_isrid _kernel_tmax_isrid
+#define tnum_sisr _kernel_tnum_sisr
+#define sisrinib_table _kernel_sisrinib_table
+#define aisrinib_table _kernel_aisrinib_table
+#define isrcb_table _kernel_isrcb_table
+#define tnum_inhno _kernel_tnum_inhno
+#define inhinib_table _kernel_inhinib_table
+#define tnum_intno _kernel_tnum_intno
+#define intinib_table _kernel_intinib_table
+#define tnum_excno _kernel_tnum_excno
+#define excinib_table _kernel_excinib_table
+#define tmevt_heap _kernel_tmevt_heap
+#define istksz _kernel_istksz
+#define istk _kernel_istk
+#define istkpt _kernel_istkpt
+#define kmmsz _kernel_kmmsz
+#define kmm _kernel_kmm
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ * startup.c
+ */
+#define _kerflg __kernel_kerflg
+#define _exit_kernel __kernel_exit_kernel
+#define _initialize_kmm __kernel_initialize_kmm
+#define _kernel_malloc __kernel_kernel_malloc
+#define _kernel_free __kernel_kernel_free
+
+/*
+ * task.c
+ */
+#define _p_runtsk __kernel_p_runtsk
+#define _p_schedtsk __kernel_p_schedtsk
+#define _reqflg __kernel_reqflg
+#define _ipmflg __kernel_ipmflg
+#define _disdsp __kernel_disdsp
+#define _dspflg __kernel_dspflg
+#define _ready_queue __kernel_ready_queue
+#define _ready_primap __kernel_ready_primap
+#define _free_tcb __kernel_free_tcb
+#define _initialize_task __kernel_initialize_task
+#define _search_schedtsk __kernel_search_schedtsk
+#define _make_runnable __kernel_make_runnable
+#define _make_non_runnable __kernel_make_non_runnable
+#define _make_dormant __kernel_make_dormant
+#define _make_active __kernel_make_active
+#define _change_priority __kernel_change_priority
+#define _rotate_ready_queue __kernel_rotate_ready_queue
+#define _call_texrtn __kernel_call_texrtn
+#define _calltex __kernel_calltex
+
+/*
+ * wait.c
+ */
+#define _make_wait_tmout __kernel_make_wait_tmout
+#define _wait_complete __kernel_wait_complete
+#define _wait_tmout __kernel_wait_tmout
+#define _wait_tmout_ok __kernel_wait_tmout_ok
+#define _wait_release __kernel_wait_release
+#define _wobj_make_wait __kernel_wobj_make_wait
+#define _wobj_make_wait_tmout __kernel_wobj_make_wait_tmout
+#define _init_wait_queue __kernel_init_wait_queue
+
+/*
+ * time_event.c
+ */
+#define _current_time __kernel_current_time
+#define _min_time __kernel_min_time
+#define _next_time __kernel_next_time
+#define _next_subtime __kernel_next_subtime
+#define _last_index __kernel_last_index
+#define _initialize_tmevt __kernel_initialize_tmevt
+#define _tmevt_up __kernel_tmevt_up
+#define _tmevt_down __kernel_tmevt_down
+#define _tmevtb_insert __kernel_tmevtb_insert
+#define _tmevtb_delete __kernel_tmevtb_delete
+#define _tmevt_lefttim __kernel_tmevt_lefttim
+#define _signal_time __kernel_signal_time
+
+/*
+ * semaphore.c
+ */
+#define _free_semcb __kernel_free_semcb
+#define _initialize_semaphore __kernel_initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#define _free_flgcb __kernel_free_flgcb
+#define _initialize_eventflag __kernel_initialize_eventflag
+#define _check_flg_cond __kernel_check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#define _free_dtqcb __kernel_free_dtqcb
+#define _initialize_dataqueue __kernel_initialize_dataqueue
+#define _enqueue_data __kernel_enqueue_data
+#define _force_enqueue_data __kernel_force_enqueue_data
+#define _dequeue_data __kernel_dequeue_data
+#define _send_data __kernel_send_data
+#define _force_send_data __kernel_force_send_data
+#define _receive_data __kernel_receive_data
+
+/*
+ * pridataq.c
+ */
+#define _free_pdqcb __kernel_free_pdqcb
+#define _initialize_pridataq __kernel_initialize_pridataq
+#define _enqueue_pridata __kernel_enqueue_pridata
+#define _dequeue_pridata __kernel_dequeue_pridata
+#define _send_pridata __kernel_send_pridata
+#define _receive_pridata __kernel_receive_pridata
+
+/*
+ * mailbox.c
+ */
+#define _free_mbxcb __kernel_free_mbxcb
+#define _initialize_mailbox __kernel_initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#define _free_mpfcb __kernel_free_mpfcb
+#define _initialize_mempfix __kernel_initialize_mempfix
+#define _get_mpf_block __kernel_get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#define _free_cyccb __kernel_free_cyccb
+#define _initialize_cyclic __kernel_initialize_cyclic
+#define _call_cychdr __kernel_call_cychdr
+
+/*
+ * alarm.c
+ */
+#define _free_almcb __kernel_free_almcb
+#define _initialize_alarm __kernel_initialize_alarm
+#define _call_almhdr __kernel_call_almhdr
+
+/*
+ * interrupt.c
+ */
+#define _free_isrcb __kernel_free_isrcb
+#define _initialize_isr __kernel_initialize_isr
+#define _inthdr_call_isr __kernel_inthdr_call_isr
+#define _initialize_interrupt __kernel_initialize_interrupt
+
+/*
+ * exception.c
+ */
+#define _initialize_exception __kernel_initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#define _initialize_object __kernel_initialize_object
+#define _call_inirtn __kernel_call_inirtn
+#define _call_terrtn __kernel_call_terrtn
+#define _tmax_tskid __kernel_tmax_tskid
+#define _tmax_stskid __kernel_tmax_stskid
+#define _tinib_table __kernel_tinib_table
+#define _atinib_table __kernel_atinib_table
+#define _tcb_table __kernel_tcb_table
+#define _torder_table __kernel_torder_table
+#define _tmax_semid __kernel_tmax_semid
+#define _tmax_ssemid __kernel_tmax_ssemid
+#define _seminib_table __kernel_seminib_table
+#define _aseminib_table __kernel_aseminib_table
+#define _semcb_table __kernel_semcb_table
+#define _tmax_flgid __kernel_tmax_flgid
+#define _tmax_sflgid __kernel_tmax_sflgid
+#define _flginib_table __kernel_flginib_table
+#define _aflginib_table __kernel_aflginib_table
+#define _flgcb_table __kernel_flgcb_table
+#define _tmax_dtqid __kernel_tmax_dtqid
+#define _tmax_adtqid __kernel_tmax_adtqid
+#define _dtqinib_table __kernel_dtqinib_table
+#define _sdtqinib_table __kernel_sdtqinib_table
+#define _dtqcb_table __kernel_dtqcb_table
+#define _tmax_pdqid __kernel_tmax_pdqid
+#define _tmax_apdqid __kernel_tmax_apdqid
+#define _pdqinib_table __kernel_pdqinib_table
+#define _apdqinib_table __kernel_apdqinib_table
+#define _pdqcb_table __kernel_pdqcb_table
+#define _tmax_mbxid __kernel_tmax_mbxid
+#define _tmax_smbxid __kernel_tmax_smbxid
+#define _mbxinib_table __kernel_mbxinib_table
+#define _ambxinib_table __kernel_ambxinib_table
+#define _mbxcb_table __kernel_mbxcb_table
+#define _tmax_mpfid __kernel_tmax_mpfid
+#define _tmax_smpfid __kernel_tmax_smpfid
+#define _mpfinib_table __kernel_mpfinib_table
+#define _ampfinib_table __kernel_ampfinib_table
+#define _mpfcb_table __kernel_mpfcb_table
+#define _tmax_cycid __kernel_tmax_cycid
+#define _tmax_scycid __kernel_tmax_scycid
+#define _cycinib_table __kernel_cycinib_table
+#define _acycinib_table __kernel_acycinib_table
+#define _cyccb_table __kernel_cyccb_table
+#define _tmax_almid __kernel_tmax_almid
+#define _tmax_salmid __kernel_tmax_salmid
+#define _alminib_table __kernel_alminib_table
+#define _aalminib_table __kernel_aalminib_table
+#define _almcb_table __kernel_almcb_table
+#define _tnum_isr_queue __kernel_tnum_isr_queue
+#define _isr_queue_table __kernel_isr_queue_table
+#define _isr_queue_list __kernel_isr_queue_list
+#define _tmax_isrid __kernel_tmax_isrid
+#define _tnum_sisr __kernel_tnum_sisr
+#define _sisrinib_table __kernel_sisrinib_table
+#define _aisrinib_table __kernel_aisrinib_table
+#define _isrcb_table __kernel_isrcb_table
+#define _tnum_inhno __kernel_tnum_inhno
+#define _inhinib_table __kernel_inhinib_table
+#define _tnum_intno __kernel_tnum_intno
+#define _intinib_table __kernel_intinib_table
+#define _tnum_excno __kernel_tnum_excno
+#define _excinib_table __kernel_excinib_table
+#define _tmevt_heap __kernel_tmevt_heap
+#define _istksz __kernel_istksz
+#define _istk __kernel_istk
+#define _istkpt __kernel_istkpt
+#define _kmmsz __kernel_kmmsz
+#define _kmm __kernel_kmm
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_rename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
--- /dev/null
+/* This file is generated from kernel_rename.def by genrename. */
+
+/* This file is included only when kernel_rename.h has been included. */
+#ifdef TOPPERS_KERNEL_RENAME_H
+#undef TOPPERS_KERNEL_RENAME_H
+
+/*
+ * startup.c
+ */
+#undef kerflg
+#undef exit_kernel
+#undef initialize_kmm
+#undef kernel_malloc
+#undef kernel_free
+
+/*
+ * task.c
+ */
+#undef p_runtsk
+#undef p_schedtsk
+#undef reqflg
+#undef ipmflg
+#undef disdsp
+#undef dspflg
+#undef ready_queue
+#undef ready_primap
+#undef free_tcb
+#undef initialize_task
+#undef search_schedtsk
+#undef make_runnable
+#undef make_non_runnable
+#undef make_dormant
+#undef make_active
+#undef change_priority
+#undef rotate_ready_queue
+#undef call_texrtn
+#undef calltex
+
+/*
+ * wait.c
+ */
+#undef make_wait_tmout
+#undef wait_complete
+#undef wait_tmout
+#undef wait_tmout_ok
+#undef wait_release
+#undef wobj_make_wait
+#undef wobj_make_wait_tmout
+#undef init_wait_queue
+
+/*
+ * time_event.c
+ */
+#undef current_time
+#undef min_time
+#undef next_time
+#undef next_subtime
+#undef last_index
+#undef initialize_tmevt
+#undef tmevt_up
+#undef tmevt_down
+#undef tmevtb_insert
+#undef tmevtb_delete
+#undef tmevt_lefttim
+#undef signal_time
+
+/*
+ * semaphore.c
+ */
+#undef free_semcb
+#undef initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#undef free_flgcb
+#undef initialize_eventflag
+#undef check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#undef free_dtqcb
+#undef initialize_dataqueue
+#undef enqueue_data
+#undef force_enqueue_data
+#undef dequeue_data
+#undef send_data
+#undef force_send_data
+#undef receive_data
+
+/*
+ * pridataq.c
+ */
+#undef free_pdqcb
+#undef initialize_pridataq
+#undef enqueue_pridata
+#undef dequeue_pridata
+#undef send_pridata
+#undef receive_pridata
+
+/*
+ * mailbox.c
+ */
+#undef free_mbxcb
+#undef initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#undef free_mpfcb
+#undef initialize_mempfix
+#undef get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#undef free_cyccb
+#undef initialize_cyclic
+#undef call_cychdr
+
+/*
+ * alarm.c
+ */
+#undef free_almcb
+#undef initialize_alarm
+#undef call_almhdr
+
+/*
+ * interrupt.c
+ */
+#undef free_isrcb
+#undef initialize_isr
+#undef inthdr_call_isr
+#undef initialize_interrupt
+
+/*
+ * exception.c
+ */
+#undef initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#undef initialize_object
+#undef call_inirtn
+#undef call_terrtn
+#undef tmax_tskid
+#undef tmax_stskid
+#undef tinib_table
+#undef atinib_table
+#undef tcb_table
+#undef torder_table
+#undef tmax_semid
+#undef tmax_ssemid
+#undef seminib_table
+#undef aseminib_table
+#undef semcb_table
+#undef tmax_flgid
+#undef tmax_sflgid
+#undef flginib_table
+#undef aflginib_table
+#undef flgcb_table
+#undef tmax_dtqid
+#undef tmax_adtqid
+#undef dtqinib_table
+#undef sdtqinib_table
+#undef dtqcb_table
+#undef tmax_pdqid
+#undef tmax_apdqid
+#undef pdqinib_table
+#undef apdqinib_table
+#undef pdqcb_table
+#undef tmax_mbxid
+#undef tmax_smbxid
+#undef mbxinib_table
+#undef ambxinib_table
+#undef mbxcb_table
+#undef tmax_mpfid
+#undef tmax_smpfid
+#undef mpfinib_table
+#undef ampfinib_table
+#undef mpfcb_table
+#undef tmax_cycid
+#undef tmax_scycid
+#undef cycinib_table
+#undef acycinib_table
+#undef cyccb_table
+#undef tmax_almid
+#undef tmax_salmid
+#undef alminib_table
+#undef aalminib_table
+#undef almcb_table
+#undef tnum_isr_queue
+#undef isr_queue_table
+#undef isr_queue_list
+#undef tmax_isrid
+#undef tnum_sisr
+#undef sisrinib_table
+#undef aisrinib_table
+#undef isrcb_table
+#undef tnum_inhno
+#undef inhinib_table
+#undef tnum_intno
+#undef intinib_table
+#undef tnum_excno
+#undef excinib_table
+#undef tmevt_heap
+#undef istksz
+#undef istk
+#undef istkpt
+#undef kmmsz
+#undef kmm
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ * startup.c
+ */
+#undef _kerflg
+#undef _exit_kernel
+#undef _initialize_kmm
+#undef _kernel_malloc
+#undef _kernel_free
+
+/*
+ * task.c
+ */
+#undef _p_runtsk
+#undef _p_schedtsk
+#undef _reqflg
+#undef _ipmflg
+#undef _disdsp
+#undef _dspflg
+#undef _ready_queue
+#undef _ready_primap
+#undef _free_tcb
+#undef _initialize_task
+#undef _search_schedtsk
+#undef _make_runnable
+#undef _make_non_runnable
+#undef _make_dormant
+#undef _make_active
+#undef _change_priority
+#undef _rotate_ready_queue
+#undef _call_texrtn
+#undef _calltex
+
+/*
+ * wait.c
+ */
+#undef _make_wait_tmout
+#undef _wait_complete
+#undef _wait_tmout
+#undef _wait_tmout_ok
+#undef _wait_release
+#undef _wobj_make_wait
+#undef _wobj_make_wait_tmout
+#undef _init_wait_queue
+
+/*
+ * time_event.c
+ */
+#undef _current_time
+#undef _min_time
+#undef _next_time
+#undef _next_subtime
+#undef _last_index
+#undef _initialize_tmevt
+#undef _tmevt_up
+#undef _tmevt_down
+#undef _tmevtb_insert
+#undef _tmevtb_delete
+#undef _tmevt_lefttim
+#undef _signal_time
+
+/*
+ * semaphore.c
+ */
+#undef _free_semcb
+#undef _initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#undef _free_flgcb
+#undef _initialize_eventflag
+#undef _check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#undef _free_dtqcb
+#undef _initialize_dataqueue
+#undef _enqueue_data
+#undef _force_enqueue_data
+#undef _dequeue_data
+#undef _send_data
+#undef _force_send_data
+#undef _receive_data
+
+/*
+ * pridataq.c
+ */
+#undef _free_pdqcb
+#undef _initialize_pridataq
+#undef _enqueue_pridata
+#undef _dequeue_pridata
+#undef _send_pridata
+#undef _receive_pridata
+
+/*
+ * mailbox.c
+ */
+#undef _free_mbxcb
+#undef _initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#undef _free_mpfcb
+#undef _initialize_mempfix
+#undef _get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#undef _free_cyccb
+#undef _initialize_cyclic
+#undef _call_cychdr
+
+/*
+ * alarm.c
+ */
+#undef _free_almcb
+#undef _initialize_alarm
+#undef _call_almhdr
+
+/*
+ * interrupt.c
+ */
+#undef _free_isrcb
+#undef _initialize_isr
+#undef _inthdr_call_isr
+#undef _initialize_interrupt
+
+/*
+ * exception.c
+ */
+#undef _initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#undef _initialize_object
+#undef _call_inirtn
+#undef _call_terrtn
+#undef _tmax_tskid
+#undef _tmax_stskid
+#undef _tinib_table
+#undef _atinib_table
+#undef _tcb_table
+#undef _torder_table
+#undef _tmax_semid
+#undef _tmax_ssemid
+#undef _seminib_table
+#undef _aseminib_table
+#undef _semcb_table
+#undef _tmax_flgid
+#undef _tmax_sflgid
+#undef _flginib_table
+#undef _aflginib_table
+#undef _flgcb_table
+#undef _tmax_dtqid
+#undef _tmax_adtqid
+#undef _dtqinib_table
+#undef _sdtqinib_table
+#undef _dtqcb_table
+#undef _tmax_pdqid
+#undef _tmax_apdqid
+#undef _pdqinib_table
+#undef _apdqinib_table
+#undef _pdqcb_table
+#undef _tmax_mbxid
+#undef _tmax_smbxid
+#undef _mbxinib_table
+#undef _ambxinib_table
+#undef _mbxcb_table
+#undef _tmax_mpfid
+#undef _tmax_smpfid
+#undef _mpfinib_table
+#undef _ampfinib_table
+#undef _mpfcb_table
+#undef _tmax_cycid
+#undef _tmax_scycid
+#undef _cycinib_table
+#undef _acycinib_table
+#undef _cyccb_table
+#undef _tmax_almid
+#undef _tmax_salmid
+#undef _alminib_table
+#undef _aalminib_table
+#undef _almcb_table
+#undef _tnum_isr_queue
+#undef _isr_queue_table
+#undef _isr_queue_list
+#undef _tmax_isrid
+#undef _tnum_sisr
+#undef _sisrinib_table
+#undef _aisrinib_table
+#undef _isrcb_table
+#undef _tnum_inhno
+#undef _inhinib_table
+#undef _tnum_intno
+#undef _intinib_table
+#undef _tnum_excno
+#undef _excinib_table
+#undef _tmevt_heap
+#undef _istksz
+#undef _istk
+#undef _istkpt
+#undef _kmmsz
+#undef _kmm
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_unrename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: mailbox.c 1970 2010-11-20 11:27:06Z ertl-hiro $
+ */
+
+/*
+ * メールボックス機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "mailbox.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_MBX_ENTER
+#define LOG_ACRE_MBX_ENTER(pk_cmbx)
+#endif /* LOG_ACRE_MBX_ENTER */
+
+#ifndef LOG_ACRE_MBX_LEAVE
+#define LOG_ACRE_MBX_LEAVE(ercd)
+#endif /* LOG_ACRE_MBX_LEAVE */
+
+#ifndef LOG_DEL_MBX_ENTER
+#define LOG_DEL_MBX_ENTER(mbxid)
+#endif /* LOG_DEL_MBX_ENTER */
+
+#ifndef LOG_DEL_MBX_LEAVE
+#define LOG_DEL_MBX_LEAVE(ercd)
+#endif /* LOG_DEL_MBX_LEAVE */
+
+#ifndef LOG_SND_MBX_ENTER
+#define LOG_SND_MBX_ENTER(mbxid, pk_msg)
+#endif /* LOG_SND_MBX_ENTER */
+
+#ifndef LOG_SND_MBX_LEAVE
+#define LOG_SND_MBX_LEAVE(ercd)
+#endif /* LOG_SND_MBX_LEAVE */
+
+#ifndef LOG_RCV_MBX_ENTER
+#define LOG_RCV_MBX_ENTER(mbxid, ppk_msg)
+#endif /* LOG_RCV_MBX_ENTER */
+
+#ifndef LOG_RCV_MBX_LEAVE
+#define LOG_RCV_MBX_LEAVE(ercd, pk_msg)
+#endif /* LOG_RCV_MBX_LEAVE */
+
+#ifndef LOG_PRCV_MBX_ENTER
+#define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg)
+#endif /* LOG_PRCV_MBX_ENTER */
+
+#ifndef LOG_PRCV_MBX_LEAVE
+#define LOG_PRCV_MBX_LEAVE(ercd, pk_msg)
+#endif /* LOG_PRCV_MBX_LEAVE */
+
+#ifndef LOG_TRCV_MBX_ENTER
+#define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout)
+#endif /* LOG_TRCV_MBX_ENTER */
+
+#ifndef LOG_TRCV_MBX_LEAVE
+#define LOG_TRCV_MBX_LEAVE(ercd, pk_msg)
+#endif /* LOG_TRCV_MBX_LEAVE */
+
+#ifndef LOG_INI_MBX_ENTER
+#define LOG_INI_MBX_ENTER(mbxid)
+#endif /* LOG_INI_MBX_ENTER */
+
+#ifndef LOG_INI_MBX_LEAVE
+#define LOG_INI_MBX_LEAVE(ercd)
+#endif /* LOG_INI_MBX_LEAVE */
+
+#ifndef LOG_REF_MBX_ENTER
+#define LOG_REF_MBX_ENTER(mbxid, pk_rmbx)
+#endif /* LOG_REF_MBX_ENTER */
+
+#ifndef LOG_REF_MBX_LEAVE
+#define LOG_REF_MBX_LEAVE(ercd, pk_rmbx)
+#endif /* LOG_REF_MBX_LEAVE */
+
+/*
+ * メールボックスの数
+ */
+#define tnum_mbx ((uint_t)(tmax_mbxid - TMIN_MBXID + 1))
+#define tnum_smbx ((uint_t)(tmax_smbxid - TMIN_MBXID + 1))
+
+/*
+ * メールボックスIDからメールボックス管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_MBX(mbxid) ((uint_t)((mbxid) - TMIN_MBXID))
+#define get_mbxcb(mbxid) (&(mbxcb_table[INDEX_MBX(mbxid)]))
+
+#ifdef TOPPERS_mbxini
+
+/*
+ * 使用していないメールボックス管理ブロックのリスト
+ */
+QUEUE free_mbxcb;
+
+/*
+ * メールボックス機能の初期化
+ */
+void
+initialize_mailbox(void)
+{
+ uint_t i, j;
+ MBXCB *p_mbxcb;
+ MBXINIB *p_mbxinib;
+
+ for (p_mbxcb = mbxcb_table, i = 0; i < tnum_smbx; p_mbxcb++, i++) {
+ queue_initialize(&(p_mbxcb->wait_queue));
+ p_mbxcb->p_mbxinib = &(mbxinib_table[i]);
+ p_mbxcb->pk_head = NULL;
+ }
+ queue_initialize(&free_mbxcb);
+ for (j = 0; i < tnum_mbx; p_mbxcb++, i++, j++) {
+ p_mbxinib = &(ambxinib_table[j]);
+ p_mbxinib->mbxatr = TA_NOEXS;
+ p_mbxcb->p_mbxinib = ((const MBXINIB *) p_mbxinib);
+ queue_insert_prev(&free_mbxcb, &(p_mbxcb->wait_queue));
+ }
+}
+
+#endif /* TOPPERS_mbxini */
+
+/*
+ * メッセージ優先度の取出し
+ */
+#define MSGPRI(pk_msg) (((T_MSG_PRI *) pk_msg)->msgpri)
+
+/*
+ * 優先度順メッセージキューへの挿入
+ */
+Inline void
+enqueue_msg_pri(T_MSG **ppk_prevmsg_next, T_MSG *pk_msg)
+{
+ T_MSG *pk_nextmsg;
+
+ while ((pk_nextmsg = *ppk_prevmsg_next) != NULL) {
+ if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) {
+ break;
+ }
+ ppk_prevmsg_next = &(pk_nextmsg->pk_next);
+ }
+ pk_msg->pk_next = pk_nextmsg;
+ *ppk_prevmsg_next = pk_msg;
+}
+
+/*
+ * メールボックスの生成
+ */
+#ifdef TOPPERS_acre_mbx
+
+ER_UINT
+acre_mbx(const T_CMBX *pk_cmbx)
+{
+ MBXCB *p_mbxcb;
+ MBXINIB *p_mbxinib;
+ ER ercd;
+
+ LOG_ACRE_MBX_ENTER(pk_cmbx);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_cmbx->mbxatr, TA_TPRI|TA_MPRI);
+ CHECK_MPRI(pk_cmbx->maxmpri);
+ CHECK_NOSPT(pk_cmbx->mprihd == NULL);
+
+ t_lock_cpu();
+ if (queue_empty(&free_mbxcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ p_mbxcb = ((MBXCB *) queue_delete_next(&free_mbxcb));
+ p_mbxinib = (MBXINIB *)(p_mbxcb->p_mbxinib);
+ p_mbxinib->mbxatr = pk_cmbx->mbxatr;
+ p_mbxinib->maxmpri = pk_cmbx->maxmpri;
+
+ queue_initialize(&(p_mbxcb->wait_queue));
+ p_mbxcb->pk_head = NULL;
+ ercd = MBXID(p_mbxcb);
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_MBX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_mbx */
+
+/*
+ * メールボックスの削除
+ */
+#ifdef TOPPERS_del_mbx
+
+ER
+del_mbx(ID mbxid)
+{
+ MBXCB *p_mbxcb;
+ MBXINIB *p_mbxinib;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_DEL_MBX_ENTER(mbxid);
+ CHECK_TSKCTX_UNL();
+ CHECK_MBXID(mbxid);
+ p_mbxcb = get_mbxcb(mbxid);
+
+ t_lock_cpu();
+ if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (MBXID(p_mbxcb) > tmax_smbxid) {
+ dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
+ p_mbxinib = (MBXINIB *)(p_mbxcb->p_mbxinib);
+ p_mbxinib->mbxatr = TA_NOEXS;
+ queue_insert_prev(&free_mbxcb, &(p_mbxcb->wait_queue));
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_MBX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_mbx */
+
+/*
+ * メールボックスへの送信
+ */
+#ifdef TOPPERS_snd_mbx
+
+ER
+snd_mbx(ID mbxid, T_MSG *pk_msg)
+{
+ MBXCB *p_mbxcb;
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_SND_MBX_ENTER(mbxid, pk_msg);
+ CHECK_TSKCTX_UNL();
+ CHECK_MBXID(mbxid);
+ p_mbxcb = get_mbxcb(mbxid);
+ CHECK_PAR((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) == 0U
+ || (TMIN_MPRI <= MSGPRI(pk_msg)
+ && MSGPRI(pk_msg) <= p_mbxcb->p_mbxinib->maxmpri));
+
+ t_lock_cpu();
+ if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (!queue_empty(&(p_mbxcb->wait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_mbxcb->wait_queue));
+ ((WINFO_MBX *)(p_tcb->p_winfo))->pk_msg = pk_msg;
+ if (wait_complete(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if ((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) != 0U) {
+ enqueue_msg_pri(&(p_mbxcb->pk_head), pk_msg);
+ ercd = E_OK;
+ }
+ else {
+ pk_msg->pk_next = NULL;
+ if (p_mbxcb->pk_head != NULL) {
+ p_mbxcb->pk_last->pk_next = pk_msg;
+ }
+ else {
+ p_mbxcb->pk_head = pk_msg;
+ }
+ p_mbxcb->pk_last = pk_msg;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SND_MBX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_snd_mbx */
+
+/*
+ * メールボックスからの受信
+ */
+#ifdef TOPPERS_rcv_mbx
+
+ER
+rcv_mbx(ID mbxid, T_MSG **ppk_msg)
+{
+ MBXCB *p_mbxcb;
+ WINFO_MBX winfo_mbx;
+ ER ercd;
+
+ LOG_RCV_MBX_ENTER(mbxid, ppk_msg);
+ CHECK_DISPATCH();
+ CHECK_MBXID(mbxid);
+ p_mbxcb = get_mbxcb(mbxid);
+
+ t_lock_cpu();
+ if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_mbxcb->pk_head != NULL) {
+ *ppk_msg = p_mbxcb->pk_head;
+ p_mbxcb->pk_head = (*ppk_msg)->pk_next;
+ ercd = E_OK;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
+ wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx);
+ dispatch();
+ ercd = winfo_mbx.winfo.wercd;
+ if (ercd == E_OK) {
+ *ppk_msg = winfo_mbx.pk_msg;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_RCV_MBX_LEAVE(ercd, *ppk_msg);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rcv_mbx */
+
+/*
+ * メールボックスからの受信(ポーリング)
+ */
+#ifdef TOPPERS_prcv_mbx
+
+ER
+prcv_mbx(ID mbxid, T_MSG **ppk_msg)
+{
+ MBXCB *p_mbxcb;
+ ER ercd;
+
+ LOG_PRCV_MBX_ENTER(mbxid, ppk_msg);
+ CHECK_TSKCTX_UNL();
+ CHECK_MBXID(mbxid);
+ p_mbxcb = get_mbxcb(mbxid);
+
+ t_lock_cpu();
+ if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_mbxcb->pk_head != NULL) {
+ *ppk_msg = p_mbxcb->pk_head;
+ p_mbxcb->pk_head = (*ppk_msg)->pk_next;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg);
+ return(ercd);
+}
+
+#endif /* TOPPERS_prcv_mbx */
+
+/*
+ * メールボックスからの受信(タイムアウトあり)
+ */
+#ifdef TOPPERS_trcv_mbx
+
+ER
+trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
+{
+ MBXCB *p_mbxcb;
+ WINFO_MBX winfo_mbx;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout);
+ CHECK_DISPATCH();
+ CHECK_MBXID(mbxid);
+ CHECK_TMOUT(tmout);
+ p_mbxcb = get_mbxcb(mbxid);
+
+ t_lock_cpu();
+ if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_mbxcb->pk_head != NULL) {
+ *ppk_msg = p_mbxcb->pk_head;
+ p_mbxcb->pk_head = (*ppk_msg)->pk_next;
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
+ wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx,
+ &tmevtb, tmout);
+ dispatch();
+ ercd = winfo_mbx.winfo.wercd;
+ if (ercd == E_OK) {
+ *ppk_msg = winfo_mbx.pk_msg;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg);
+ return(ercd);
+}
+
+#endif /* TOPPERS_trcv_mbx */
+
+/*
+ * メールボックスの再初期化
+ */
+#ifdef TOPPERS_ini_mbx
+
+ER
+ini_mbx(ID mbxid)
+{
+ MBXCB *p_mbxcb;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_INI_MBX_ENTER(mbxid);
+ CHECK_TSKCTX_UNL();
+ CHECK_MBXID(mbxid);
+ p_mbxcb = get_mbxcb(mbxid);
+
+ t_lock_cpu();
+ if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
+ p_mbxcb->pk_head = NULL;
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_INI_MBX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ini_mbx */
+
+/*
+ * メールボックスの状態参照
+ */
+#ifdef TOPPERS_ref_mbx
+
+ER
+ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
+{
+ MBXCB *p_mbxcb;
+ ER ercd;
+
+ LOG_REF_MBX_ENTER(mbxid, pk_rmbx);
+ CHECK_TSKCTX_UNL();
+ CHECK_MBXID(mbxid);
+ p_mbxcb = get_mbxcb(mbxid);
+
+ t_lock_cpu();
+ if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ pk_rmbx->wtskid = wait_tskid(&(p_mbxcb->wait_queue));
+ pk_rmbx->pk_msg = p_mbxcb->pk_head;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_MBX_LEAVE(ercd, pk_rmbx);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_mbx */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: mailbox.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * メールボックス機能
+ */
+
+#ifndef TOPPERS_MAILBOX_H
+#define TOPPERS_MAILBOX_H
+
+#include <queue.h>
+
+/*
+ * メールボックス初期化ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ * (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初のフィールドが共通になっている.
+ */
+typedef struct mailbox_initialization_block {
+ ATR mbxatr; /* メールボックス属性 */
+ PRI maxmpri; /* メッセージ優先度の最大値 */
+} MBXINIB;
+
+/*
+ * メールボックス管理ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ * を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ * フィールドが共通になっている.
+ *
+ * メッセージキューがメッセージの優先度順の場合には,pk_lastは使わな
+ * い.また,メッセージキューが空の場合(pk_headがNULLの場合)にも,
+ * pk_lastは無効である.
+ */
+typedef struct mailbox_control_block {
+ QUEUE wait_queue; /* メールボックス待ちキュー */
+ const MBXINIB *p_mbxinib; /* 初期化ブロックへのポインタ */
+ T_MSG *pk_head; /* 先頭のメッセージ */
+ T_MSG *pk_last; /* 末尾のメッセージ */
+} MBXCB;
+
+/*
+ * メールボックス待ち情報ブロックの定義
+ *
+ * この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ * (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初の2つのフィールドが共通になっている.
+ */
+typedef struct mailbox_waiting_information {
+ WINFO winfo; /* 標準の待ち情報ブロック */
+ MBXCB *p_mbxcb; /* 待っているメールボックスの管理ブロック */
+ T_MSG *pk_msg; /* 受信したメッセージ */
+} WINFO_MBX;
+
+/*
+ * 使用していないメールボックス管理ブロックのリスト
+ */
+extern QUEUE free_mbxcb;
+
+/*
+ * メールボックスIDの最大値(kernel_cfg.c)
+ */
+extern const ID tmax_mbxid;
+extern const ID tmax_smbxid;
+
+/*
+ * メールボックス初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const MBXINIB mbxinib_table[];
+extern MBXINIB ambxinib_table[];
+
+/*
+ * メールボックス管理ブロックのエリア(kernel_cfg.c)
+ */
+extern MBXCB mbxcb_table[];
+
+/*
+ * メールボックス管理ブロックからメールボックスIDを取り出すためのマクロ
+ */
+#define MBXID(p_mbxcb) ((ID)(((p_mbxcb) - mbxcb_table) + TMIN_MBXID))
+
+/*
+ * メールボックス機能の初期化
+ */
+extern void initialize_mailbox(void);
+
+#endif /* TOPPERS_MAILBOX_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: mempfix.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * 固定長メモリプール機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "mempfix.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_MPF_ENTER
+#define LOG_ACRE_MPF_ENTER(pk_cmpf)
+#endif /* LOG_ACRE_MPF_ENTER */
+
+#ifndef LOG_ACRE_MPF_LEAVE
+#define LOG_ACRE_MPF_LEAVE(ercd)
+#endif /* LOG_ACRE_MPF_LEAVE */
+
+#ifndef LOG_DEL_MPF_ENTER
+#define LOG_DEL_MPF_ENTER(mpfid)
+#endif /* LOG_DEL_MPF_ENTER */
+
+#ifndef LOG_DEL_MPF_LEAVE
+#define LOG_DEL_MPF_LEAVE(ercd)
+#endif /* LOG_DEL_MPF_LEAVE */
+
+#ifndef LOG_GET_MPF_ENTER
+#define LOG_GET_MPF_ENTER(mpfid, p_blk)
+#endif /* LOG_GET_MPF_ENTER */
+
+#ifndef LOG_GET_MPF_LEAVE
+#define LOG_GET_MPF_LEAVE(ercd, blk)
+#endif /* LOG_GET_MPF_LEAVE */
+
+#ifndef LOG_PGET_MPF_ENTER
+#define LOG_PGET_MPF_ENTER(mpfid, p_blk)
+#endif /* LOG_PGET_MPF_ENTER */
+
+#ifndef LOG_PGET_MPF_LEAVE
+#define LOG_PGET_MPF_LEAVE(ercd, blk)
+#endif /* LOG_PGET_MPF_LEAVE */
+
+#ifndef LOG_TGET_MPF_ENTER
+#define LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout)
+#endif /* LOG_TGET_MPF_ENTER */
+
+#ifndef LOG_TGET_MPF_LEAVE
+#define LOG_TGET_MPF_LEAVE(ercd, blk)
+#endif /* LOG_TGET_MPF_LEAVE */
+
+#ifndef LOG_REL_MPF_ENTER
+#define LOG_REL_MPF_ENTER(mpfid, blk)
+#endif /* LOG_REL_MPF_ENTER */
+
+#ifndef LOG_REL_MPF_LEAVE
+#define LOG_REL_MPF_LEAVE(ercd)
+#endif /* LOG_REL_MPF_LEAVE */
+
+#ifndef LOG_INI_MPF_ENTER
+#define LOG_INI_MPF_ENTER(mpfid)
+#endif /* LOG_INI_MPF_ENTER */
+
+#ifndef LOG_INI_MPF_LEAVE
+#define LOG_INI_MPF_LEAVE(ercd)
+#endif /* LOG_INI_MPF_LEAVE */
+
+#ifndef LOG_REF_MPF_ENTER
+#define LOG_REF_MPF_ENTER(mpfid, pk_rmpf)
+#endif /* LOG_REF_MPF_ENTER */
+
+#ifndef LOG_REF_MPF_LEAVE
+#define LOG_REF_MPF_LEAVE(ercd, pk_rmpf)
+#endif /* LOG_REF_MPF_LEAVE */
+
+/*
+ * 固定長メモリプールの数
+ */
+#define tnum_mpf ((uint_t)(tmax_mpfid - TMIN_MPFID + 1))
+#define tnum_smpf ((uint_t)(tmax_smpfid - TMIN_MPFID + 1))
+
+/*
+ * 固定長メモリプールIDから固定長メモリプール管理ブロックを取り出すた
+ * めのマクロ
+ */
+#define INDEX_MPF(mpfid) ((uint_t)((mpfid) - TMIN_MPFID))
+#define get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)]))
+
+/*
+ * 特殊なインデックス値の定義
+ */
+#define INDEX_NULL (~0U) /* 空きブロックリストの最後 */
+#define INDEX_ALLOC (~1U) /* 割当て済みのブロック */
+
+#ifdef TOPPERS_mpfini
+
+/*
+ * 使用していない固定長メモリプール管理ブロックのリスト
+ */
+QUEUE free_mpfcb;
+
+/*
+ * 固定長メモリプール機能の初期化
+ */
+void
+initialize_mempfix(void)
+{
+ uint_t i, j;
+ MPFCB *p_mpfcb;
+ MPFINIB *p_mpfinib;
+
+ for (p_mpfcb = mpfcb_table, i = 0; i < tnum_smpf; p_mpfcb++, i++) {
+ queue_initialize(&(p_mpfcb->wait_queue));
+ p_mpfcb->p_mpfinib = &(mpfinib_table[i]);
+ p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
+ p_mpfcb->unused = 0U;
+ p_mpfcb->freelist = INDEX_NULL;
+ }
+ queue_initialize(&free_mpfcb);
+ for (j = 0; i < tnum_mpf; p_mpfcb++, i++, j++) {
+ p_mpfinib = &(ampfinib_table[j]);
+ p_mpfinib->mpfatr = TA_NOEXS;
+ p_mpfcb->p_mpfinib = ((const MPFINIB *) p_mpfinib);
+ queue_insert_prev(&free_mpfcb, &(p_mpfcb->wait_queue));
+ }
+}
+
+#endif /* TOPPERS_mpfini */
+
+/*
+ * 固定長メモリプールからブロックを獲得
+ */
+#ifdef TOPPERS_mpfget
+
+void
+get_mpf_block(MPFCB *p_mpfcb, void **p_blk)
+{
+ uint_t blkidx;
+
+ if (p_mpfcb->freelist != INDEX_NULL) {
+ blkidx = p_mpfcb->freelist;
+ p_mpfcb->freelist = (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next;
+ }
+ else {
+ blkidx = p_mpfcb->unused;
+ p_mpfcb->unused++;
+ }
+ *p_blk = (void *)((char *)(p_mpfcb->p_mpfinib->mpf)
+ + p_mpfcb->p_mpfinib->blksz * blkidx);
+ p_mpfcb->fblkcnt--;
+ (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = INDEX_ALLOC;
+}
+
+#endif /* TOPPERS_mpfget */
+
+/*
+ * 固定長メモリプールの生成
+ */
+#ifdef TOPPERS_acre_mpf
+
+ER_UINT
+acre_mpf(const T_CMPF *pk_cmpf)
+{
+ MPFCB *p_mpfcb;
+ MPFINIB *p_mpfinib;
+ ATR mpfatr;
+ void *mpf;
+ MPFMB *p_mpfmb;
+ ER ercd;
+
+ LOG_ACRE_MPF_ENTER(pk_cmpf);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_cmpf->mpfatr, TA_TPRI|TA_MPRI);
+ CHECK_PAR(pk_cmpf->blkcnt != 0);
+ CHECK_PAR(pk_cmpf->blksz != 0);
+ CHECK_ALIGN_MPF(pk_cmpf->mpf);
+ CHECK_ALIGN_MB(pk_cmpf->mpfmb);
+ mpfatr = pk_cmpf->mpfatr;
+ mpf = pk_cmpf->mpf;
+ p_mpfmb = pk_cmpf->mpfmb;
+
+ t_lock_cpu();
+ if (queue_empty(&free_mpfcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ if (mpf == NULL) {
+ mpf = kernel_malloc(pk_cmpf->blkcnt * ROUND_MPF_T(pk_cmpf->blksz));
+ mpfatr |= TA_MEMALLOC;
+ }
+ if (mpf == NULL) {
+ ercd = E_NOMEM;
+ }
+ else {
+ if (p_mpfmb == NULL) {
+ p_mpfmb = kernel_malloc(sizeof(MPFMB) * pk_cmpf->blkcnt);
+ mpfatr |= TA_MBALLOC;
+ }
+ if (p_mpfmb == NULL) {
+ if ((mpfatr & TA_MEMALLOC) != 0U) {
+ kernel_free(mpf);
+ }
+ ercd = E_NOMEM;
+ }
+ else {
+ p_mpfcb = ((MPFCB *) queue_delete_next(&free_mpfcb));
+ p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib);
+ p_mpfinib->mpfatr = mpfatr;
+ p_mpfinib->blkcnt = pk_cmpf->blkcnt;
+ p_mpfinib->blksz = ROUND_MPF_T(pk_cmpf->blksz);
+ p_mpfinib->mpf = mpf;
+ p_mpfinib->p_mpfmb = p_mpfmb;
+
+ queue_initialize(&(p_mpfcb->wait_queue));
+ p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
+ p_mpfcb->unused = 0U;
+ p_mpfcb->freelist = INDEX_NULL;
+ ercd = MPFID(p_mpfcb);
+ }
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_MPF_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_mpf */
+
+/*
+ * 固定長メモリプールの削除
+ */
+#ifdef TOPPERS_del_mpf
+
+ER
+del_mpf(ID mpfid)
+{
+ MPFCB *p_mpfcb;
+ MPFINIB *p_mpfinib;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_DEL_MPF_ENTER(mpfid);
+ CHECK_TSKCTX_UNL();
+ CHECK_MPFID(mpfid);
+ p_mpfcb = get_mpfcb(mpfid);
+
+ t_lock_cpu();
+ if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (MPFID(p_mpfcb) > tmax_smpfid) {
+ dspreq = init_wait_queue(&(p_mpfcb->wait_queue));
+ p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib);
+ if ((p_mpfinib->mpfatr & TA_MEMALLOC) != 0U) {
+ kernel_free(p_mpfinib->mpf);
+ }
+ if ((p_mpfinib->mpfatr & TA_MBALLOC) != 0U) {
+ kernel_free(p_mpfinib->p_mpfmb);
+ }
+ p_mpfinib->mpfatr = TA_NOEXS;
+ queue_insert_prev(&free_mpfcb, &(p_mpfcb->wait_queue));
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_MPF_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_mpf */
+
+/*
+ * 固定長メモリブロックの獲得
+ */
+#ifdef TOPPERS_get_mpf
+
+ER
+get_mpf(ID mpfid, void **p_blk)
+{
+ MPFCB *p_mpfcb;
+ WINFO_MPF winfo_mpf;
+ ER ercd;
+
+ LOG_GET_MPF_ENTER(mpfid, p_blk);
+ CHECK_DISPATCH();
+ CHECK_MPFID(mpfid);
+ p_mpfcb = get_mpfcb(mpfid);
+
+ t_lock_cpu();
+ if (p_mpfcb->fblkcnt > 0) {
+ get_mpf_block(p_mpfcb, p_blk);
+ ercd = E_OK;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
+ wobj_make_wait((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf);
+ dispatch();
+ ercd = winfo_mpf.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_blk = winfo_mpf.blk;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_GET_MPF_LEAVE(ercd, *p_blk);
+ return(ercd);
+}
+
+#endif /* TOPPERS_get_mpf */
+
+/*
+ * 固定長メモリブロックの獲得(ポーリング)
+ */
+#ifdef TOPPERS_pget_mpf
+
+ER
+pget_mpf(ID mpfid, void **p_blk)
+{
+ MPFCB *p_mpfcb;
+ ER ercd;
+
+ LOG_PGET_MPF_ENTER(mpfid, p_blk);
+ CHECK_TSKCTX_UNL();
+ CHECK_MPFID(mpfid);
+ p_mpfcb = get_mpfcb(mpfid);
+
+ t_lock_cpu();
+ if (p_mpfcb->fblkcnt > 0) {
+ get_mpf_block(p_mpfcb, p_blk);
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_PGET_MPF_LEAVE(ercd, *p_blk);
+ return(ercd);
+}
+
+#endif /* TOPPERS_pget_mpf */
+
+/*
+ * 固定長メモリブロックの獲得(タイムアウトあり)
+ */
+#ifdef TOPPERS_tget_mpf
+
+ER
+tget_mpf(ID mpfid, void **p_blk, TMO tmout)
+{
+ MPFCB *p_mpfcb;
+ WINFO_MPF winfo_mpf;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout);
+ CHECK_DISPATCH();
+ CHECK_MPFID(mpfid);
+ CHECK_TMOUT(tmout);
+ p_mpfcb = get_mpfcb(mpfid);
+
+ t_lock_cpu();
+ if (p_mpfcb->fblkcnt > 0) {
+ get_mpf_block(p_mpfcb, p_blk);
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
+ wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf,
+ &tmevtb, tmout);
+ dispatch();
+ ercd = winfo_mpf.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_blk = winfo_mpf.blk;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TGET_MPF_LEAVE(ercd, *p_blk);
+ return(ercd);
+}
+
+#endif /* TOPPERS_tget_mpf */
+
+/*
+ * 固定長メモリブロックの返却
+ */
+#ifdef TOPPERS_rel_mpf
+
+ER
+rel_mpf(ID mpfid, void *blk)
+{
+ MPFCB *p_mpfcb;
+ SIZE blkoffset;
+ uint_t blkidx;
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_REL_MPF_ENTER(mpfid, blk);
+ CHECK_TSKCTX_UNL();
+ CHECK_MPFID(mpfid);
+ p_mpfcb = get_mpfcb(mpfid);
+ CHECK_PAR(p_mpfcb->p_mpfinib->mpf <= blk);
+ blkoffset = ((char *) blk) - (char *)(p_mpfcb->p_mpfinib->mpf);
+ CHECK_PAR(blkoffset % p_mpfcb->p_mpfinib->blksz == 0U);
+ CHECK_PAR(blkoffset / p_mpfcb->p_mpfinib->blksz < p_mpfcb->unused);
+ blkidx = (uint_t)(blkoffset / p_mpfcb->p_mpfinib->blksz);
+ CHECK_PAR((p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next == INDEX_ALLOC);
+
+ t_lock_cpu();
+ if (!queue_empty(&(p_mpfcb->wait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_mpfcb->wait_queue));
+ ((WINFO_MPF *)(p_tcb->p_winfo))->blk = blk;
+ if (wait_complete(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ p_mpfcb->fblkcnt++;
+ (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = p_mpfcb->freelist;
+ p_mpfcb->freelist = blkidx;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REL_MPF_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rel_mpf */
+
+/*
+ * 固定長メモリプールの再初期化
+ */
+#ifdef TOPPERS_ini_mpf
+
+ER
+ini_mpf(ID mpfid)
+{
+ MPFCB *p_mpfcb;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_INI_MPF_ENTER(mpfid);
+ CHECK_TSKCTX_UNL();
+ CHECK_MPFID(mpfid);
+ p_mpfcb = get_mpfcb(mpfid);
+
+ t_lock_cpu();
+ dspreq = init_wait_queue(&(p_mpfcb->wait_queue));
+ p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
+ p_mpfcb->unused = 0U;
+ p_mpfcb->freelist = INDEX_NULL;
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_INI_MPF_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ini_mpf */
+
+/*
+ * 固定長メモリプールの状態参照
+ */
+#ifdef TOPPERS_ref_mpf
+
+ER
+ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
+{
+ MPFCB *p_mpfcb;
+ ER ercd;
+
+ LOG_REF_MPF_ENTER(mpfid, pk_rmpf);
+ CHECK_TSKCTX_UNL();
+ CHECK_MPFID(mpfid);
+ p_mpfcb = get_mpfcb(mpfid);
+
+ t_lock_cpu();
+ pk_rmpf->wtskid = wait_tskid(&(p_mpfcb->wait_queue));
+ pk_rmpf->fblkcnt = p_mpfcb->fblkcnt;
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_MPF_LEAVE(ercd, pk_rmpf);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_mpf */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: mempfix.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * 固定長メモリプール機能
+ */
+
+#ifndef TOPPERS_MEMPFIX_H
+#define TOPPERS_MEMPFIX_H
+
+#include <queue.h>
+
+/*
+ * 固定長メモリブロック管理ブロック
+ *
+ * nextフィールドには,メモリブロックが割当て済みの場合はINDEX_ALLOCを,
+ * 未割当ての場合は次の未割当てブロックのインデックス番号を格納する.
+ * 最後の未割当てブロックの場合には,INDEX_NULLを格納する.
+ */
+typedef struct fixed_memoryblock_management_block {
+ uint_t next; /* 次の未割当てブロック */
+} MPFMB;
+
+/*
+ * 固定長メモリプール初期化ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ * (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初のフィールドが共通になっている.
+ */
+typedef struct fixed_memorypool_initialization_block {
+ ATR mpfatr; /* 固定長メモリプール属性 */
+ uint_t blkcnt; /* メモリブロック数 */
+ uint_t blksz; /* メモリブロックのサイズ(丸めた値) */
+ void *mpf; /* 固定長メモリプール領域の先頭番地 */
+ MPFMB *p_mpfmb; /* 固定長メモリプール管理領域の先頭番地 */
+} MPFINIB;
+
+/*
+ * 固定長メモリプール管理ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ * を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ * フィールドが共通になっている.
+ */
+typedef struct fixed_memorypool_control_block {
+ QUEUE wait_queue; /* 固定長メモリプール待ちキュー */
+ const MPFINIB *p_mpfinib; /* 初期化ブロックへのポインタ */
+ uint_t fblkcnt; /* 未割当てブロック数 */
+ uint_t unused; /* 未使用ブロックの先頭 */
+ uint_t freelist; /* 未割当てブロックのリスト */
+} MPFCB;
+
+/*
+ * 固定長メモリプール待ち情報ブロックの定義
+ *
+ * この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ * (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初の2つのフィールドが共通になっている.
+ */
+typedef struct fixed_memorypool_waiting_information {
+ WINFO winfo; /* 標準の待ち情報ブロック */
+ MPFCB *p_mpfcb; /* 待っている固定長メモリプールの管理ブロック*/
+ void *blk; /* 獲得したメモリブロック */
+} WINFO_MPF;
+
+/*
+ * 使用していない固定長メモリプール管理ブロックのリスト
+ */
+extern QUEUE free_mpfcb;
+
+/*
+ * 固定長メモリプールIDの最大値(kernel_cfg.c)
+ */
+extern const ID tmax_mpfid;
+extern const ID tmax_smpfid;
+
+/*
+ * 固定長メモリプール初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const MPFINIB mpfinib_table[];
+extern MPFINIB ampfinib_table[];
+
+/*
+ * 固定長メモリプール管理ブロックのエリア(kernel_cfg.c)
+ */
+extern MPFCB mpfcb_table[];
+
+/*
+ * 固定長メモリプール管理ブロックから固定長メモリプールIDを取り出すた
+ * めのマクロ
+ */
+#define MPFID(p_mpfcb) ((ID)(((p_mpfcb) - mpfcb_table) + TMIN_MPFID))
+
+/*
+ * 固定長メモリプール機能の初期化
+ */
+extern void initialize_mempfix(void);
+
+/*
+ * 固定長メモリプールからブロックを獲得
+ */
+extern void get_mpf_block(MPFCB *p_mpfcb, void **p_blk);
+
+#endif /* TOPPERS_MEMPFIX_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: pridataq.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * 優先度データキュー機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "pridataq.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_PDQ_ENTER
+#define LOG_ACRE_PDQ_ENTER(pk_cpdq)
+#endif /* LOG_ACRE_PDQ_ENTER */
+
+#ifndef LOG_ACRE_PDQ_LEAVE
+#define LOG_ACRE_PDQ_LEAVE(ercd)
+#endif /* LOG_ACRE_PDQ_LEAVE */
+
+#ifndef LOG_DEL_PDQ_ENTER
+#define LOG_DEL_PDQ_ENTER(pdqid)
+#endif /* LOG_DEL_PDQ_ENTER */
+
+#ifndef LOG_DEL_PDQ_LEAVE
+#define LOG_DEL_PDQ_LEAVE(ercd)
+#endif /* LOG_DEL_PDQ_LEAVE */
+
+#ifndef LOG_SND_PDQ_ENTER
+#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
+#endif /* LOG_SND_PDQ_ENTER */
+
+#ifndef LOG_SND_PDQ_LEAVE
+#define LOG_SND_PDQ_LEAVE(ercd)
+#endif /* LOG_SND_PDQ_LEAVE */
+
+#ifndef LOG_PSND_PDQ_ENTER
+#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
+#endif /* LOG_PSND_PDQ_ENTER */
+
+#ifndef LOG_PSND_PDQ_LEAVE
+#define LOG_PSND_PDQ_LEAVE(ercd)
+#endif /* LOG_PSND_PDQ_LEAVE */
+
+#ifndef LOG_IPSND_PDQ_ENTER
+#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
+#endif /* LOG_IPSND_PDQ_ENTER */
+
+#ifndef LOG_IPSND_PDQ_LEAVE
+#define LOG_IPSND_PDQ_LEAVE(ercd)
+#endif /* LOG_IPSND_PDQ_LEAVE */
+
+#ifndef LOG_TSND_PDQ_ENTER
+#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
+#endif /* LOG_TSND_PDQ_ENTER */
+
+#ifndef LOG_TSND_PDQ_LEAVE
+#define LOG_TSND_PDQ_LEAVE(ercd)
+#endif /* LOG_TSND_PDQ_LEAVE */
+
+#ifndef LOG_RCV_PDQ_ENTER
+#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
+#endif /* LOG_RCV_PDQ_ENTER */
+
+#ifndef LOG_RCV_PDQ_LEAVE
+#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
+#endif /* LOG_RCV_PDQ_LEAVE */
+
+#ifndef LOG_PRCV_PDQ_ENTER
+#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
+#endif /* LOG_PRCV_PDQ_ENTER */
+
+#ifndef LOG_PRCV_PDQ_LEAVE
+#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
+#endif /* LOG_PRCV_PDQ_LEAVE */
+
+#ifndef LOG_TRCV_PDQ_ENTER
+#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
+#endif /* LOG_TRCV_PDQ_ENTER */
+
+#ifndef LOG_TRCV_PDQ_LEAVE
+#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
+#endif /* LOG_TRCV_PDQ_LEAVE */
+
+#ifndef LOG_INI_PDQ_ENTER
+#define LOG_INI_PDQ_ENTER(pdqid)
+#endif /* LOG_INI_PDQ_ENTER */
+
+#ifndef LOG_INI_PDQ_LEAVE
+#define LOG_INI_PDQ_LEAVE(ercd)
+#endif /* LOG_INI_PDQ_LEAVE */
+
+#ifndef LOG_REF_PDQ_ENTER
+#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
+#endif /* LOG_REF_PDQ_ENTER */
+
+#ifndef LOG_REF_PDQ_LEAVE
+#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
+#endif /* LOG_REF_PDQ_LEAVE */
+
+/*
+ * 優先度データキューの数
+ */
+#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
+#define tnum_spdq ((uint_t)(tmax_spdqid - TMIN_PDQID + 1))
+
+/*
+ * 優先度データキューIDから優先度データキュー管理ブロックを取り出すた
+ * めのマクロ
+ */
+#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
+#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
+
+#ifdef TOPPERS_pdqini
+
+/*
+ * 使用していない優先度データキュー管理ブロックのリスト
+ */
+QUEUE free_pdqcb;
+
+/*
+ * 優先度データキュー機能の初期化
+ */
+void
+initialize_pridataq(void)
+{
+ uint_t i, j;
+ PDQCB *p_pdqcb;
+ PDQINIB *p_pdqinib;
+
+ for (p_pdqcb = pdqcb_table, i = 0; i < tnum_spdq; p_pdqcb++, i++) {
+ queue_initialize(&(p_pdqcb->swait_queue));
+ p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
+ queue_initialize(&(p_pdqcb->rwait_queue));
+ p_pdqcb->count = 0U;
+ p_pdqcb->p_head = NULL;
+ p_pdqcb->unused = 0U;
+ p_pdqcb->p_freelist = NULL;
+ }
+ queue_initialize(&free_pdqcb);
+ for (j = 0; i < tnum_pdq; p_pdqcb++, i++, j++) {
+ p_pdqinib = &(apdqinib_table[j]);
+ p_pdqinib->pdqatr = TA_NOEXS;
+ p_pdqcb->p_pdqinib = ((const PDQINIB *) p_pdqinib);
+ queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
+ }
+}
+
+#endif /* TOPPERS_pdqini */
+
+/*
+ * 優先度データキューの生成
+ */
+#ifdef TOPPERS_acre_pdq
+
+ER_UINT
+acre_pdq(const T_CPDQ *pk_cpdq)
+{
+ PDQCB *p_pdqcb;
+ PDQINIB *p_pdqinib;
+ ATR pdqatr;
+ PDQMB *p_pdqmb;
+ ER ercd;
+
+ LOG_ACRE_PDQ_ENTER(pk_cpdq);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_cpdq->pdqatr, TA_TPRI);
+ CHECK_DPRI(pk_cpdq->maxdpri);
+ pdqatr = pk_cpdq->pdqatr;
+ p_pdqmb = pk_cpdq->pdqmb;
+
+ t_lock_cpu();
+ if (queue_empty(&free_pdqcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
+ p_pdqmb = kernel_malloc(sizeof(PDQMB) * pk_cpdq->pdqcnt);
+ pdqatr |= TA_MBALLOC;
+ }
+ if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
+ ercd = E_NOMEM;
+ }
+ else {
+ p_pdqcb = ((PDQCB *) queue_delete_next(&free_pdqcb));
+ p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
+ p_pdqinib->pdqatr = pdqatr;
+ p_pdqinib->pdqcnt = pk_cpdq->pdqcnt;
+ p_pdqinib->maxdpri = pk_cpdq->maxdpri;
+ p_pdqinib->p_pdqmb = p_pdqmb;
+
+ queue_initialize(&(p_pdqcb->swait_queue));
+ queue_initialize(&(p_pdqcb->rwait_queue));
+ p_pdqcb->count = 0U;
+ p_pdqcb->p_head = NULL;
+ p_pdqcb->unused = 0U;
+ p_pdqcb->p_freelist = NULL;
+ ercd = PDQID(p_pdqcb);
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_PDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_pdq */
+
+/*
+ * 優先度データキューの削除
+ */
+#ifdef TOPPERS_del_pdq
+
+ER
+del_pdq(ID pdqid)
+{
+ PDQCB *p_pdqcb;
+ PDQINIB *p_pdqinib;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_DEL_PDQ_ENTER(pdqid);
+ CHECK_TSKCTX_UNL();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (PDQID(p_pdqcb) > tmax_spdqid) {
+ dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
+ if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
+ dspreq = true;
+ };
+ p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
+ if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) {
+ kernel_free(p_pdqinib->p_pdqmb);
+ }
+ p_pdqinib->pdqatr = TA_NOEXS;
+ queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue));
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_PDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_pdq */
+
+/*
+ * 優先度データキュー管理領域へのデータの格納
+ */
+#ifdef TOPPERS_pdqenq
+
+void
+enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
+{
+ PDQMB *p_pdqmb;
+ PDQMB **pp_prev_next, *p_next;
+
+ if (p_pdqcb->p_freelist != NULL) {
+ p_pdqmb = p_pdqcb->p_freelist;
+ p_pdqcb->p_freelist = p_pdqmb->p_next;
+ }
+ else {
+ p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
+ p_pdqcb->unused++;
+ }
+
+ p_pdqmb->data = data;
+ p_pdqmb->datapri = datapri;
+
+ pp_prev_next = &(p_pdqcb->p_head);
+ while ((p_next = *pp_prev_next) != NULL) {
+ if (p_next->datapri > datapri) {
+ break;
+ }
+ pp_prev_next = &(p_next->p_next);
+ }
+ p_pdqmb->p_next = p_next;
+ *pp_prev_next = p_pdqmb;
+ p_pdqcb->count++;
+}
+
+#endif /* TOPPERS_pdqenq */
+
+/*
+ * 優先度データキュー管理領域からのデータの取出し
+ */
+#ifdef TOPPERS_pdqdeq
+
+void
+dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
+{
+ PDQMB *p_pdqmb;
+
+ p_pdqmb = p_pdqcb->p_head;
+ p_pdqcb->p_head = p_pdqmb->p_next;
+ p_pdqcb->count--;
+
+ *p_data = p_pdqmb->data;
+ *p_datapri = p_pdqmb->datapri;
+
+ p_pdqmb->p_next = p_pdqcb->p_freelist;
+ p_pdqcb->p_freelist = p_pdqmb;
+}
+
+#endif /* TOPPERS_pdqdeq */
+
+/*
+ * 優先度データキューへのデータ送信
+ */
+#ifdef TOPPERS_pdqsnd
+
+bool_t
+send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_reqdsp)
+{
+ TCB *p_tcb;
+
+ if (!queue_empty(&(p_pdqcb->rwait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
+ ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
+ ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
+ *p_reqdsp = wait_complete(p_tcb);
+ return(true);
+ }
+ else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
+ enqueue_pridata(p_pdqcb, data, datapri);
+ *p_reqdsp = false;
+ return(true);
+ }
+ else {
+ return(false);
+ }
+}
+
+#endif /* TOPPERS_pdqsnd */
+
+/*
+ * 優先度データキューからのデータ受信
+ */
+#ifdef TOPPERS_pdqrcv
+
+bool_t
+receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
+ PRI *p_datapri, bool_t *p_reqdsp)
+{
+ TCB *p_tcb;
+ intptr_t data;
+ PRI datapri;
+
+ if (p_pdqcb->count > 0U) {
+ dequeue_pridata(p_pdqcb, p_data, p_datapri);
+ if (!queue_empty(&(p_pdqcb->swait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
+ data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
+ datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
+ enqueue_pridata(p_pdqcb, data, datapri);
+ *p_reqdsp = wait_complete(p_tcb);
+ }
+ else {
+ *p_reqdsp = false;
+ }
+ return(true);
+ }
+ else if (!queue_empty(&(p_pdqcb->swait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
+ *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
+ *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
+ *p_reqdsp = wait_complete(p_tcb);
+ return(true);
+ }
+ else {
+ return(false);
+ }
+}
+
+#endif /* TOPPERS_pdqrcv */
+
+/*
+ * 優先度データキューへの送信
+ */
+#ifdef TOPPERS_snd_pdq
+
+ER
+snd_pdq(ID pdqid, intptr_t data, PRI datapri)
+{
+ PDQCB *p_pdqcb;
+ WINFO_PDQ winfo_pdq;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_SND_PDQ_ENTER(pdqid, data, datapri);
+ CHECK_DISPATCH();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+ CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ winfo_pdq.data = data;
+ winfo_pdq.datapri = datapri;
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
+ wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
+ dispatch();
+ ercd = winfo_pdq.winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SND_PDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_snd_pdq */
+
+/*
+ * 優先度データキューへの送信(ポーリング)
+ */
+#ifdef TOPPERS_psnd_pdq
+
+ER
+psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
+{
+ PDQCB *p_pdqcb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
+ CHECK_TSKCTX_UNL();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+ CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_PSND_PDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_psnd_pdq */
+
+/*
+ * 優先度データキューへの送信(ポーリング,非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_ipsnd_pdq
+
+ER
+ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
+{
+ PDQCB *p_pdqcb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
+ CHECK_INTCTX_UNL();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+ CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+ i_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+ if (reqdsp) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IPSND_PDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ipsnd_pdq */
+
+/*
+ * 優先度データキューへの送信(タイムアウトあり)
+ */
+#ifdef TOPPERS_tsnd_pdq
+
+ER
+tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
+{
+ PDQCB *p_pdqcb;
+ WINFO_PDQ winfo_pdq;
+ TMEVTB tmevtb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
+ CHECK_DISPATCH();
+ CHECK_PDQID(pdqid);
+ CHECK_TMOUT(tmout);
+ p_pdqcb = get_pdqcb(pdqid);
+ CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ winfo_pdq.data = data;
+ winfo_pdq.datapri = datapri;
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
+ wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
+ &tmevtb, tmout);
+ dispatch();
+ ercd = winfo_pdq.winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TSND_PDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_tsnd_pdq */
+
+/*
+ * 優先度データキューからの受信
+ */
+#ifdef TOPPERS_rcv_pdq
+
+ER
+rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
+{
+ PDQCB *p_pdqcb;
+ WINFO_PDQ winfo_pdq;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
+ CHECK_DISPATCH();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
+ make_wait(&(winfo_pdq.winfo));
+ queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
+ winfo_pdq.p_pdqcb = p_pdqcb;
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo_pdq.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_data = winfo_pdq.data;
+ *p_datapri = winfo_pdq.datapri;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rcv_pdq */
+
+/*
+ * 優先度データキューからの受信(ポーリング)
+ */
+#ifdef TOPPERS_prcv_pdq
+
+ER
+prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
+{
+ PDQCB *p_pdqcb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
+ CHECK_TSKCTX_UNL();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
+ return(ercd);
+}
+
+#endif /* TOPPERS_prcv_pdq */
+
+/*
+ * 優先度データキューからの受信(タイムアウトあり)
+ */
+#ifdef TOPPERS_trcv_pdq
+
+ER
+trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
+{
+ PDQCB *p_pdqcb;
+ WINFO_PDQ winfo_pdq;
+ TMEVTB tmevtb;
+ bool_t reqdsp;
+ ER ercd;
+
+ LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
+ CHECK_DISPATCH();
+ CHECK_PDQID(pdqid);
+ CHECK_TMOUT(tmout);
+ p_pdqcb = get_pdqcb(pdqid);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
+ if (reqdsp) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
+ make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
+ queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
+ winfo_pdq.p_pdqcb = p_pdqcb;
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo_pdq.winfo.wercd;
+ if (ercd == E_OK) {
+ *p_data = winfo_pdq.data;
+ *p_datapri = winfo_pdq.datapri;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
+ return(ercd);
+}
+
+#endif /* TOPPERS_trcv_pdq */
+
+/*
+ * 優先度データキューの再初期化
+ */
+#ifdef TOPPERS_ini_pdq
+
+ER
+ini_pdq(ID pdqid)
+{
+ PDQCB *p_pdqcb;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_INI_PDQ_ENTER(pdqid);
+ CHECK_TSKCTX_UNL();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
+ if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
+ dspreq = true;
+ }
+ p_pdqcb->count = 0U;
+ p_pdqcb->p_head = NULL;
+ p_pdqcb->unused = 0U;
+ p_pdqcb->p_freelist = NULL;
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_INI_PDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ini_pdq */
+
+/*
+ * 優先度データキューの状態参照
+ */
+#ifdef TOPPERS_ref_pdq
+
+ER
+ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
+{
+ PDQCB *p_pdqcb;
+ ER ercd;
+
+ LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
+ CHECK_TSKCTX_UNL();
+ CHECK_PDQID(pdqid);
+ p_pdqcb = get_pdqcb(pdqid);
+
+ t_lock_cpu();
+ if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
+ pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
+ pk_rpdq->spdqcnt = p_pdqcb->count;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_pdq */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: pridataq.h 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * 優先度データキュー機能
+ */
+
+#ifndef TOPPERS_PRIDATAQ_H
+#define TOPPERS_PRIDATAQ_H
+
+#include <queue.h>
+
+/*
+ * 優先度データ管理ブロック
+ */
+typedef struct pridata_management_block PDQMB;
+
+struct pridata_management_block {
+ PDQMB *p_next; /* 次のデータ */
+ intptr_t data; /* データ本体 */
+ PRI datapri; /* データ優先度 */
+};
+
+/*
+ * 優先度データキュー初期化ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ * (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初のフィールドが共通になっている.
+ */
+typedef struct pridataq_initialization_block {
+ ATR pdqatr; /* 優先度データキュー属性 */
+ uint_t pdqcnt; /* 優先度データキューの容量 */
+ PRI maxdpri; /* データ優先度の最大値 */
+ PDQMB *p_pdqmb; /* 優先度データキュー管理領域の先頭番地 */
+} PDQINIB;
+
+/*
+ * 優先度データキュー管理ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ * を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ * フィールドが共通になっている.
+ */
+typedef struct pridataq_control_block {
+ QUEUE swait_queue; /* 優先度データキュー送信待ちキュー */
+ const PDQINIB *p_pdqinib; /* 初期化ブロックへのポインタ */
+ QUEUE rwait_queue; /* 優先度データキュー受信待ちキュー */
+ uint_t count; /* 優先度データキュー中のデータの数 */
+ PDQMB *p_head; /* 最初のデータ */
+ uint_t unused; /* 未使用データ管理ブロックの先頭 */
+ PDQMB *p_freelist; /* 未割当てデータ管理ブロックのリスト */
+} PDQCB;
+
+/*
+ * 優先度データキュー待ち情報ブロックの定義
+ *
+ * この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ * (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初の2つのフィールドが共通になっている.
+ * 優先度データキューへの送信待ちと優先度データキューからの受信待ちで,
+ * 同じ待ち情報ブロックを使う.
+ */
+typedef struct pridataq_waiting_information {
+ WINFO winfo; /* 標準の待ち情報ブロック */
+ PDQCB *p_pdqcb; /* 待っている優先度データキューの管理ブロック*/
+ intptr_t data; /* 送受信データ */
+ PRI datapri; /* データ優先度 */
+} WINFO_PDQ;
+
+/*
+ * 使用していない優先度データキュー管理ブロックのリスト
+ */
+extern QUEUE free_pdqcb;
+
+/*
+ * 優先度データキューIDの最大値(kernel_cfg.c)
+ */
+extern const ID tmax_pdqid;
+extern const ID tmax_spdqid;
+
+/*
+ * 優先度データキュー初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const PDQINIB pdqinib_table[];
+extern PDQINIB apdqinib_table[];
+
+/*
+ * 優先度データキュー管理ブロックのエリア(kernel_cfg.c)
+ */
+extern PDQCB pdqcb_table[];
+
+/*
+ * 優先度データキュー管理ブロックから優先度データキューIDを取り出すた
+ * めのマクロ
+ */
+#define PDQID(p_pdqcb) ((ID)(((p_pdqcb) - pdqcb_table) + TMIN_PDQID))
+
+/*
+ * 優先度データキュー機能の初期化
+ */
+extern void initialize_pridataq(void);
+
+/*
+ * 優先度データキュー管理領域へのデータの格納
+ */
+extern void enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri);
+
+/*
+ * 優先度データキュー管理領域からのデータの取出し
+ */
+extern void dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri);
+
+/*
+ * 優先度データキューへのデータ送信
+ */
+extern bool_t send_pridata(PDQCB *p_pdqcb, intptr_t data,
+ PRI datapri, bool_t *p_reqdsp);
+
+/*
+ * 優先度データキューからのデータ受信
+ */
+extern bool_t receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
+ PRI *p_datapri, bool_t *p_reqdsp);
+
+#endif /* TOPPERS_PRIDATAQ_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: semaphore.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * セマフォ機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "semaphore.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_SEM_ENTER
+#define LOG_ACRE_SEM_ENTER(pk_csem)
+#endif /* LOG_ACRE_SEM_ENTER */
+
+#ifndef LOG_ACRE_SEM_LEAVE
+#define LOG_ACRE_SEM_LEAVE(ercd)
+#endif /* LOG_ACRE_SEM_LEAVE */
+
+#ifndef LOG_DEL_SEM_ENTER
+#define LOG_DEL_SEM_ENTER(semid)
+#endif /* LOG_DEL_SEM_ENTER */
+
+#ifndef LOG_DEL_SEM_LEAVE
+#define LOG_DEL_SEM_LEAVE(ercd)
+#endif /* LOG_DEL_SEM_LEAVE */
+
+#ifndef LOG_SIG_SEM_ENTER
+#define LOG_SIG_SEM_ENTER(semid)
+#endif /* LOG_SIG_SEM_ENTER */
+
+#ifndef LOG_SIG_SEM_LEAVE
+#define LOG_SIG_SEM_LEAVE(ercd)
+#endif /* LOG_SIG_SEM_LEAVE */
+
+#ifndef LOG_ISIG_SEM_ENTER
+#define LOG_ISIG_SEM_ENTER(semid)
+#endif /* LOG_ISIG_SEM_ENTER */
+
+#ifndef LOG_ISIG_SEM_LEAVE
+#define LOG_ISIG_SEM_LEAVE(ercd)
+#endif /* LOG_ISIG_SEM_LEAVE */
+
+#ifndef LOG_WAI_SEM_ENTER
+#define LOG_WAI_SEM_ENTER(semid)
+#endif /* LOG_WAI_SEM_ENTER */
+
+#ifndef LOG_WAI_SEM_LEAVE
+#define LOG_WAI_SEM_LEAVE(ercd)
+#endif /* LOG_WAI_SEM_LEAVE */
+
+#ifndef LOG_POL_SEM_ENTER
+#define LOG_POL_SEM_ENTER(semid)
+#endif /* LOG_POL_SEM_ENTER */
+
+#ifndef LOG_POL_SEM_LEAVE
+#define LOG_POL_SEM_LEAVE(ercd)
+#endif /* LOG_POL_SEM_LEAVE */
+
+#ifndef LOG_TWAI_SEM_ENTER
+#define LOG_TWAI_SEM_ENTER(semid, tmout)
+#endif /* LOG_TWAI_SEM_ENTER */
+
+#ifndef LOG_TWAI_SEM_LEAVE
+#define LOG_TWAI_SEM_LEAVE(ercd)
+#endif /* LOG_TWAI_SEM_LEAVE */
+
+#ifndef LOG_INI_SEM_ENTER
+#define LOG_INI_SEM_ENTER(semid)
+#endif /* LOG_INI_SEM_ENTER */
+
+#ifndef LOG_INI_SEM_LEAVE
+#define LOG_INI_SEM_LEAVE(ercd)
+#endif /* LOG_INI_SEM_LEAVE */
+
+#ifndef LOG_REF_SEM_ENTER
+#define LOG_REF_SEM_ENTER(semid, pk_rsem)
+#endif /* LOG_REF_SEM_ENTER */
+
+#ifndef LOG_REF_SEM_LEAVE
+#define LOG_REF_SEM_LEAVE(ercd, pk_rsem)
+#endif /* LOG_REF_SEM_LEAVE */
+
+/*
+ * セマフォの数
+ */
+#define tnum_sem ((uint_t)(tmax_semid - TMIN_SEMID + 1))
+#define tnum_ssem ((uint_t)(tmax_ssemid - TMIN_SEMID + 1))
+
+/*
+ * セマフォIDからセマフォ管理ブロックを取り出すためのマクロ
+ */
+#define INDEX_SEM(semid) ((uint_t)((semid) - TMIN_SEMID))
+#define get_semcb(semid) (&(semcb_table[INDEX_SEM(semid)]))
+
+#ifdef TOPPERS_semini
+
+/*
+ * 使用していないセマフォ管理ブロックのリスト
+ */
+QUEUE free_semcb;
+
+/*
+ * セマフォ機能の初期化
+ */
+void
+initialize_semaphore(void)
+{
+ uint_t i, j;
+ SEMCB *p_semcb;
+ SEMINIB *p_seminib;
+
+ for (p_semcb = semcb_table, i = 0; i < tnum_ssem; p_semcb++, i++) {
+ queue_initialize(&(p_semcb->wait_queue));
+ p_semcb->p_seminib = &(seminib_table[i]);
+ p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
+ }
+ queue_initialize(&free_semcb);
+ for (j = 0; i < tnum_sem; p_semcb++, i++, j++) {
+ p_seminib = &(aseminib_table[j]);
+ p_seminib->sematr = TA_NOEXS;
+ p_semcb->p_seminib = ((const SEMINIB *) p_seminib);
+ queue_insert_prev(&free_semcb, &(p_semcb->wait_queue));
+ }
+}
+
+#endif /* TOPPERS_semini */
+
+/*
+ * セマフォの生成
+ */
+#ifdef TOPPERS_acre_sem
+
+ER_UINT
+acre_sem(const T_CSEM *pk_csem)
+{
+ SEMCB *p_semcb;
+ SEMINIB *p_seminib;
+ ER ercd;
+
+ LOG_ACRE_SEM_ENTER(pk_csem);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_csem->sematr, TA_TPRI);
+ CHECK_PAR(0 <= pk_csem->isemcnt && pk_csem->isemcnt <= pk_csem->maxsem);
+ CHECK_PAR(1 <= pk_csem->maxsem && pk_csem->maxsem <= TMAX_MAXSEM);
+
+ t_lock_cpu();
+ if (queue_empty(&free_semcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ p_semcb = ((SEMCB *) queue_delete_next(&free_semcb));
+ p_seminib = (SEMINIB *)(p_semcb->p_seminib);
+ p_seminib->sematr = pk_csem->sematr;
+ p_seminib->isemcnt = pk_csem->isemcnt;
+ p_seminib->maxsem = pk_csem->maxsem;
+
+ queue_initialize(&(p_semcb->wait_queue));
+ p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
+ ercd = SEMID(p_semcb);
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_sem */
+
+/*
+ * セマフォの削除
+ */
+#ifdef TOPPERS_del_sem
+
+ER
+del_sem(ID semid)
+{
+ SEMCB *p_semcb;
+ SEMINIB *p_seminib;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_DEL_SEM_ENTER(semid);
+ CHECK_TSKCTX_UNL();
+ CHECK_SEMID(semid);
+ p_semcb = get_semcb(semid);
+
+ t_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (SEMID(p_semcb) > tmax_ssemid) {
+ dspreq = init_wait_queue(&(p_semcb->wait_queue));
+ p_seminib = (SEMINIB *)(p_semcb->p_seminib);
+ p_seminib->sematr = TA_NOEXS;
+ queue_insert_prev(&free_semcb, &(p_semcb->wait_queue));
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_sem */
+
+/*
+ * セマフォ資源の返却
+ */
+#ifdef TOPPERS_sig_sem
+
+ER
+sig_sem(ID semid)
+{
+ SEMCB *p_semcb;
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_SIG_SEM_ENTER(semid);
+ CHECK_TSKCTX_UNL();
+ CHECK_SEMID(semid);
+ p_semcb = get_semcb(semid);
+
+ t_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (!queue_empty(&(p_semcb->wait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
+ if (wait_complete(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
+ p_semcb->semcnt += 1;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SIG_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_sig_sem */
+
+/*
+ * セマフォ資源の返却(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_isig_sem
+
+ER
+isig_sem(ID semid)
+{
+ SEMCB *p_semcb;
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_ISIG_SEM_ENTER(semid);
+ CHECK_INTCTX_UNL();
+ CHECK_SEMID(semid);
+ p_semcb = get_semcb(semid);
+
+ i_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (!queue_empty(&(p_semcb->wait_queue))) {
+ p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
+ if (wait_complete(p_tcb)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
+ p_semcb->semcnt += 1;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_ISIG_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_isig_sem */
+
+/*
+ * セマフォ資源の獲得
+ */
+#ifdef TOPPERS_wai_sem
+
+ER
+wai_sem(ID semid)
+{
+ SEMCB *p_semcb;
+ WINFO_SEM winfo_sem;
+ ER ercd;
+
+ LOG_WAI_SEM_ENTER(semid);
+ CHECK_DISPATCH();
+ CHECK_SEMID(semid);
+ p_semcb = get_semcb(semid);
+
+ t_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_semcb->semcnt >= 1) {
+ p_semcb->semcnt -= 1;
+ ercd = E_OK;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
+ wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);
+ dispatch();
+ ercd = winfo_sem.winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_WAI_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_wai_sem */
+
+/*
+ * セマフォ資源の獲得(ポーリング)
+ */
+#ifdef TOPPERS_pol_sem
+
+ER
+pol_sem(ID semid)
+{
+ SEMCB *p_semcb;
+ ER ercd;
+
+ LOG_POL_SEM_ENTER(semid);
+ CHECK_TSKCTX_UNL();
+ CHECK_SEMID(semid);
+ p_semcb = get_semcb(semid);
+
+ t_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_semcb->semcnt >= 1) {
+ p_semcb->semcnt -= 1;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_TMOUT;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_POL_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_pol_sem */
+
+/*
+ * セマフォ資源の獲得(タイムアウトあり)
+ */
+#ifdef TOPPERS_twai_sem
+
+ER
+twai_sem(ID semid, TMO tmout)
+{
+ SEMCB *p_semcb;
+ WINFO_SEM winfo_sem;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_TWAI_SEM_ENTER(semid, tmout);
+ CHECK_DISPATCH();
+ CHECK_SEMID(semid);
+ CHECK_TMOUT(tmout);
+ p_semcb = get_semcb(semid);
+
+ t_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (p_semcb->semcnt >= 1) {
+ p_semcb->semcnt -= 1;
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
+ wobj_make_wait_tmout((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem,
+ &tmevtb, tmout);
+ dispatch();
+ ercd = winfo_sem.winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TWAI_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_twai_sem */
+
+/*
+ * セマフォの再初期化
+ */
+#ifdef TOPPERS_ini_sem
+
+ER
+ini_sem(ID semid)
+{
+ SEMCB *p_semcb;
+ bool_t dspreq;
+ ER ercd;
+
+ LOG_INI_SEM_ENTER(semid);
+ CHECK_TSKCTX_UNL();
+ CHECK_SEMID(semid);
+ p_semcb = get_semcb(semid);
+
+ t_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ dspreq = init_wait_queue(&(p_semcb->wait_queue));
+ p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
+ if (dspreq) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_INI_SEM_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ini_sem */
+
+/*
+ * セマフォの状態参照
+ */
+#ifdef TOPPERS_ref_sem
+
+ER
+ref_sem(ID semid, T_RSEM *pk_rsem)
+{
+ SEMCB *p_semcb;
+ ER ercd;
+
+ LOG_REF_SEM_ENTER(semid, pk_rsem);
+ CHECK_TSKCTX_UNL();
+ CHECK_SEMID(semid);
+ p_semcb = get_semcb(semid);
+
+ t_lock_cpu();
+ if (p_semcb->p_seminib->sematr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
+ pk_rsem->semcnt = p_semcb->semcnt;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_SEM_LEAVE(ercd, pk_rsem);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_sem */
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Advanced Standard Profile Kernel
*
- * Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
+ * @(#) $Id: semaphore.h 1966 2010-11-20 07:23:56Z ertl-hiro $
*/
/*
- * システムサービスのターゲット依存部(CQ-STARM用)
- *
- * システムサービスのターゲット依存部のインクルードファイル.このファ
- * イルの内容は,コンポーネント記述ファイルに記述され,このファイルは
- * 無くなる見込み.
+ * セマフォ機能
*/
-#ifndef TOPPERS_TARGET_SYSSVC_H
-#define TOPPERS_TARGET_SYSSVC_H
+#ifndef TOPPERS_SEMAPHORE_H
+#define TOPPERS_SEMAPHORE_H
+
+#include <queue.h>
/*
- * ターゲットシステムのハードウェア資源の定義
+ * セマフォ初期化ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
+ * (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * 最初のフィールドが共通になっている.
*/
-#include "cq_starm.h"
+typedef struct semaphore_initialization_block {
+ ATR sematr; /* セマフォ属性 */
+ uint_t isemcnt; /* セマフォの資源数の初期値 */
+ uint_t maxsem; /* セマフォの最大資源数 */
+} SEMINIB;
/*
- * トレースログに関する設定
+ * セマフォ管理ブロック
+ *
+ * この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)
+ * を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの
+ * フィールドが共通になっている.
*/
-#ifdef TOPPERS_TRACE_ENABLE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_TRACE_ENABLE */
+typedef struct semaphore_control_block {
+ QUEUE wait_queue; /* セマフォ待ちキュー */
+ const SEMINIB *p_seminib; /* 初期化ブロックへのポインタ */
+ uint_t semcnt; /* セマフォ現在カウント値 */
+} SEMCB;
/*
- * 起動メッセージのターゲットシステム名
+ * セマフォ待ち情報ブロックの定義
+ *
+ * この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分
+ * (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので,
+ * すべてのフィールドが共通になっている.
*/
-#define TARGET_NAME "CQ-STARM(STM32F103)"
+typedef struct semaphore_waiting_information {
+ WINFO winfo; /* 標準の待ち情報ブロック */
+ SEMCB *p_semcb; /* 待っているセマフォの管理ブロック */
+} WINFO_SEM;
/*
- * 起動メッセージにターゲット依存部の著作権表示を
- * 追加するためのマクロ.
+ * 使用していないセマフォ管理ブロックのリスト
*/
-#ifdef PRC_COPYRIGHT
-#define TARGET_COPYRIGHT PRC_COPYRIGHT
-#endif /* PRC_COPYRIGHT */
+extern QUEUE free_semcb;
/*
- * システムログの低レベル出力のための文字出力
- *
- * ターゲット依存の方法で,文字cを表示/出力/保存する.
+ * セマフォIDの最大値(kernel_cfg.c)
*/
-extern void target_fput_log(char_t c);
+extern const ID tmax_semid;
+extern const ID tmax_ssemid;
/*
- * ã\82·ã\83ªã\82¢ã\83«ã\83\9dã\83¼ã\83\88æ\95°ã\81®å®\9a義
+ * ã\82»ã\83\9eã\83\95ã\82©å\88\9dæ\9c\9få\8c\96ã\83\96ã\83ã\83\83ã\82¯ã\81®ã\82¨ã\83ªã\82¢ï¼\88kernel_cfg.cï¼\89
*/
-#define TNUM_PORT (1) /* サポートするシリアルポートの数 */
-#define TNUM_SIOP (1)
+extern const SEMINIB seminib_table[];
+extern SEMINIB aseminib_table[];
-#define LOGTASK_PORTID SIO_PORTID
+/*
+ * セマフォ管理ブロックのエリア(kernel_cfg.c)
+ */
+extern SEMCB semcb_table[];
/*
- * ã\83\9cã\83¼ã\83¬ã\83¼ã\83\88
+ * ã\82»ã\83\9eã\83\95ã\82©ç®¡ç\90\86ã\83\96ã\83ã\83\83ã\82¯ã\81\8bã\82\89ã\82»ã\83\9eã\83\95ã\82©IDã\82\92å\8f\96ã\82\8aå\87ºã\81\99ã\81\9fã\82\81ã\81®ã\83\9eã\82¯ã\83
*/
-#define BPS_SETTING (115200)
+#define SEMID(p_semcb) ((ID)(((p_semcb) - semcb_table) + TMIN_SEMID))
/*
- * システムログタスク関連の定数の定義
- *
- * デフォルト値の通り.
+ * セマフォ機能の初期化
*/
+extern void initialize_semaphore(void);
-#endif /* TOPPERS_TARGET_SYSSVC_H */
+#endif /* TOPPERS_SEMAPHORE_H */
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Advanced Standard Profile Kernel
*
- * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: target_config.c 1309 2008-08-27 07:48:51Z ertl-honda $
+ * @(#) $Id: startup.c 1966 2010-11-20 07:23:56Z ertl-hiro $
*/
/*
- * ターゲット依存モジュール(LM3S8962用)
+ * カーネルの初期化と終了処理
*/
+
#include "kernel_impl.h"
+#include "time_event.h"
#include <sil.h>
-#include "hw_types.h"
-#include "hw_sysctl.h"
-#include "sysctl.h"
-#include "hw_memmap.h"
-#include "gpio.h"
-#include "uart.h"
-#include "hw_ints.h"
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_KER_ENTER
+#define LOG_KER_ENTER()
+#endif /* LOG_KER_ENTER */
+
+#ifndef LOG_KER_LEAVE
+#define LOG_KER_LEAVE()
+#endif /* LOG_KER_LEAVE */
+
+#ifndef LOG_EXT_KER_ENTER
+#define LOG_EXT_KER_ENTER()
+#endif /* LOG_EXT_KER_ENTER */
+
+#ifndef LOG_EXT_KER_LEAVE
+#define LOG_EXT_KER_LEAVE(ercd)
+#endif /* LOG_EXT_KER_LEAVE */
+
+#ifdef TOPPERS_sta_ker
+
+/*
+ * カーネル動作状態フラグ
+ *
+ * スタートアップルーチンで,false(=0)に初期化されることを期待して
+ * いる.
+ */
+bool_t kerflg = false;
/*
- * ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ä¾\9då\98ã\81®å\88\9dæ\9c\9få\8c\96
+ * ã\82«ã\83¼ã\83\8dã\83«ã\81®èµ·å\8b\95
*/
void
-target_initialize(void){
+sta_ker(void)
+{
/*
- * ã\82¯ã\83ã\83\83ã\82¯の初期化
+ * ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ä¾\9då\98の初期化
*/
- if( DEVICE_IS_REVA2 ) {
- SysCtlLDOSet( SYSCTL_LDO_2_75V );
- }
-
- SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ );
+ target_initialize();
/*
- * LEDの初期化
+ * 各モジュールの初期化
+ *
+ * タイムイベント管理モジュールは他のモジュールより先に初期化
+ * する必要がある.
*/
- SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
- GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT );
- GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD );
+ initialize_kmm();
+ initialize_tmevt();
+ initialize_object();
+
+ /*
+ * 初期化ルーチンの実行
+ */
+ call_inirtn();
/*
- * チップ依存の初期化
+ * カーネル動作の開始
*/
- prc_initialize();
+ kerflg = true;
+ LOG_KER_ENTER();
+ start_dispatch();
+ assert(0);
+}
+
+#endif /* TOPPERS_sta_ker */
+
+/*
+ * カーネルの終了
+ */
+#ifdef TOPPERS_ext_ker
+
+ER
+ext_ker(void)
+{
+ SIL_PRE_LOC;
+
+ LOG_EXT_KER_ENTER();
/*
- * sys_putc が可能になるようにUARTを初期化
+ * 割込みロック状態に移行
*/
- SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
- SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
- GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
- UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
- (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
- UART_CONFIG_PAR_NONE));
+ SIL_LOC_INT();
-}
+ /*
+ * カーネル動作の終了
+ */
+ LOG_KER_LEAVE();
+ kerflg = false;
+ /*
+ * カーネルの終了処理の呼出し
+ *
+ * 非タスクコンテキストに切り換えて,exit_kernelを呼び出す.
+ */
+ call_exit_kernel();
+ return(E_SYS);
+}
/*
- * ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ä¾\9då\98の終了処理
+ * ã\82«ã\83¼ã\83\8dã\83«の終了処理
*/
void
-target_exit(void)
+exit_kernel(void)
{
/*
- * チップ依存の終了処理
+ * 終了処理ルーチンの実行
*/
- prc_terminate();
+ call_terrtn();
/*
- * 開発環境依存の終了処理
+ * ターゲット依存の終了処理
*/
- while(1);
+ target_exit();
+ assert(0);
}
+#endif /* TOPPERS_ext_ker */
/*
- * システムログの低レベル出力のための文字出力
+ * カーネルの割り付けるメモリ領域の管理
+ *
+ * メモリ領域を先頭から順に割り当て,解放されたメモリ領域を再利用しな
+ * いメモリ管理モジュール.
*/
+#ifdef TOPPERS_kermem
+#ifndef OMIT_KMM_ALLOCONLY
+
+static void *kmm_brk;
+
void
-target_fput_log(char_t c)
+initialize_kmm(void)
{
- if (c == '\n') {
- UARTCharPut(UART0_BASE, '\r');
+ kmm_brk = ((char *) kmm) + kmmsz;
+}
+
+void *
+kernel_malloc(SIZE size)
+{
+ if (((char *) kmm_brk) - ((char *) kmm) >= size) {
+ kmm_brk = ((char *) kmm_brk) - size;
+ return(kmm_brk);
+ }
+ else {
+ return(NULL);
}
- UARTCharPut(UART0_BASE, c);
}
+
+void
+kernel_free(void *ptr)
+{
+}
+
+#endif /* OMIT_KMM_ALLOCONLY */
+#endif /* TOPPERS_kermem */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * タスク管理モジュール
+ */
+
+#include "kernel_impl.h"
+#include "wait.h"
+#include "task.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TEX_ENTER
+#define LOG_TEX_ENTER(p_tcb, texptn)
+#endif /* LOG_TEX_ENTER */
+
+#ifndef LOG_TEX_LEAVE
+#define LOG_TEX_LEAVE(p_tcb)
+#endif /* LOG_TEX_LEAVE */
+
+#ifdef TOPPERS_tskini
+
+/*
+ * 実行状態のタスク
+ */
+TCB *p_runtsk;
+
+/*
+ * 最高優先順位のタスク
+ */
+TCB *p_schedtsk;
+
+/*
+ * タスクディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ */
+bool_t reqflg;
+
+/*
+ * 割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
+ * ディスパッチ禁止状態
+ */
+bool_t disdsp;
+
+/*
+ * タスクディスパッチ可能状態
+ */
+bool_t dspflg;
+
+/*
+ * レディキュー
+ */
+QUEUE ready_queue[TNUM_TPRI];
+
+/*
+ * レディキューサーチのためのビットマップ
+ */
+uint16_t ready_primap;
+
+/*
+ * 使用していないTCBのリスト
+ */
+QUEUE free_tcb;
+
+/*
+ * タスク管理モジュールの初期化
+ */
+void
+initialize_task(void)
+{
+ uint_t i, j;
+ TCB *p_tcb;
+ TINIB *p_tinib;
+
+ p_runtsk = p_schedtsk = NULL;
+ reqflg = false;
+ ipmflg = true;
+ disdsp = false;
+ dspflg = true;
+
+ for (i = 0; i < TNUM_TPRI; i++) {
+ queue_initialize(&(ready_queue[i]));
+ }
+ ready_primap = 0U;
+
+ for (i = 0; i < tnum_stsk; i++) {
+ j = INDEX_TSK(torder_table[i]);
+ p_tcb = &(tcb_table[j]);
+ p_tcb->p_tinib = &(tinib_table[j]);
+ p_tcb->actque = false;
+ make_dormant(p_tcb);
+ if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
+ make_active(p_tcb);
+ }
+ }
+ queue_initialize(&free_tcb);
+ for (j = 0; i < tnum_tsk; i++, j++) {
+ p_tcb = &(tcb_table[i]);
+ p_tinib = &(atinib_table[j]);
+ p_tinib->tskatr = TA_NOEXS;
+ p_tcb->p_tinib = ((const TINIB *) p_tinib);
+ queue_insert_prev(&free_tcb, &(p_tcb->task_queue));
+ }
+}
+
+#endif /* TOPPERS_tskini */
+
+/*
+ * ビットマップサーチ関数
+ *
+ * bitmap内の1のビットの内,最も下位(右)のものをサーチし,そのビッ
+ * ト番号を返す.ビット番号は,最下位ビットを0とする.bitmapに0を指定
+ * してはならない.この関数では,bitmapが16ビットであることを仮定し,
+ * uint16_t型としている.
+ *
+ * ビットサーチ命令を持つプロセッサでは,ビットサーチ命令を使うように
+ * 書き直した方が効率が良い場合がある.このような場合には,ターゲット
+ * 依存部でビットサーチ命令を使ったbitmap_searchを定義し,
+ * OMIT_BITMAP_SEARCHをマクロ定義すればよい.また,ビットサーチ命令の
+ * サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
+ * は,PRIMAP_BITをマクロ定義すればよい.
+ *
+ * また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ * 使った方が効率が良い可能性もある.
+ * #define bitmap_search(bitmap) (ffs(bitmap) - 1)
+ */
+#ifndef PRIMAP_BIT
+#define PRIMAP_BIT(pri) (1U << (pri))
+#endif /* PRIMAP_BIT */
+
+#ifndef OMIT_BITMAP_SEARCH
+
+static const unsigned char bitmap_search_table[] = { 0, 1, 0, 2, 0, 1, 0,
+ 3, 0, 1, 0, 2, 0, 1, 0 };
+
+Inline uint_t
+bitmap_search(uint16_t bitmap)
+{
+ uint_t n = 0U;
+
+ assert(bitmap != 0U);
+ if ((bitmap & 0x00ffU) == 0U) {
+ bitmap >>= 8;
+ n += 8;
+ }
+ if ((bitmap & 0x0fU) == 0U) {
+ bitmap >>= 4;
+ n += 4;
+ }
+ return(n + bitmap_search_table[(bitmap & 0x0fU) - 1]);
+}
+
+#endif /* OMIT_BITMAP_SEARCH */
+
+/*
+ * 優先度ビットマップが空かのチェック
+ */
+Inline bool_t
+primap_empty(void)
+{
+ return(ready_primap == 0U);
+}
+
+/*
+ * 優先度ビットマップのサーチ
+ */
+Inline uint_t
+primap_search(void)
+{
+ return(bitmap_search(ready_primap));
+}
+
+/*
+ * 優先度ビットマップのセット
+ */
+Inline void
+primap_set(uint_t pri)
+{
+ ready_primap |= PRIMAP_BIT(pri);
+}
+
+/*
+ * 優先度ビットマップのクリア
+ */
+Inline void
+primap_clear(uint_t pri)
+{
+ ready_primap &= ~PRIMAP_BIT(pri);
+}
+
+/*
+ * 最高優先順位タスクのサーチ
+ */
+#ifdef TOPPERS_tsksched
+
+TCB *
+search_schedtsk(void)
+{
+ uint_t schedpri;
+
+ schedpri = primap_search();
+ return((TCB *)(ready_queue[schedpri].p_next));
+}
+
+#endif /* TOPPERS_tsksched */
+
+/*
+ * 実行できる状態への遷移
+ *
+ * 最高優先順位のタスクを更新するのは,実行できるタスクがなかった場合
+ * と,p_tcbの優先度が最高優先順位のタスクの優先度よりも高い場合であ
+ * る.
+ */
+#ifdef TOPPERS_tskrun
+
+bool_t
+make_runnable(TCB *p_tcb)
+{
+ uint_t pri = p_tcb->priority;
+
+ queue_insert_prev(&(ready_queue[pri]), &(p_tcb->task_queue));
+ primap_set(pri);
+
+ if (p_schedtsk == (TCB *) NULL || pri < p_schedtsk->priority) {
+ p_schedtsk = p_tcb;
+ return(dspflg);
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tskrun */
+
+/*
+ * 実行できる状態から他の状態への遷移
+ *
+ * 最高優先順位のタスクを更新するのは,p_tcbが最高優先順位のタスクで
+ * あった場合である.p_tcbと同じ優先度のタスクが他にある場合は,p_tcb
+ * の次のタスクが最高優先順位になる.そうでない場合は,レディキューを
+ * サーチする必要がある.
+ */
+#ifdef TOPPERS_tsknrun
+
+bool_t
+make_non_runnable(TCB *p_tcb)
+{
+ uint_t pri = p_tcb->priority;
+ QUEUE *p_queue = &(ready_queue[pri]);
+
+ queue_delete(&(p_tcb->task_queue));
+ if (queue_empty(p_queue)) {
+ primap_clear(pri);
+ if (p_schedtsk == p_tcb) {
+ p_schedtsk = primap_empty() ? (TCB *) NULL : search_schedtsk();
+ return(dspflg);
+ }
+ }
+ else {
+ if (p_schedtsk == p_tcb) {
+ p_schedtsk = (TCB *)(p_queue->p_next);
+ return(dspflg);
+ }
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tsknrun */
+
+/*
+ * 休止状態への遷移
+ */
+#ifdef TOPPERS_tskdmt
+
+void
+make_dormant(TCB *p_tcb)
+{
+ p_tcb->tstat = TS_DORMANT;
+ p_tcb->priority = p_tcb->p_tinib->ipriority;
+ p_tcb->wupque = false;
+ p_tcb->enatex = false;
+ p_tcb->texptn = 0U;
+ LOG_TSKSTAT(p_tcb);
+}
+
+#endif /* TOPPERS_tskdmt */
+
+/*
+ * 休止状態から実行できる状態への遷移
+ */
+#ifdef TOPPERS_tskact
+
+bool_t
+make_active(TCB *p_tcb)
+{
+ activate_context(p_tcb);
+ p_tcb->tstat = TS_RUNNABLE;
+ LOG_TSKSTAT(p_tcb);
+ return(make_runnable(p_tcb));
+}
+
+#endif /* TOPPERS_tskact */
+
+/*
+ * タスクの優先度の変更
+ *
+ * タスクが実行できる状態の場合には,レディキューの中での位置を変更す
+ * る.オブジェクトの待ちキューの中で待ち状態になっている場合には,待
+ * ちキューの中での位置を変更する.
+ *
+ * 最高優先順位のタスクを更新するのは,(1) p_tcbが最高優先順位のタス
+ * クであって,その優先度を下げた場合,(2) p_tcbが最高優先順位のタス
+ * クではなく,変更後の優先度が最高優先順位のタスクの優先度よりも高い
+ * 場合である.(1)の場合には,レディキューをサーチする必要がある.
+ */
+#ifdef TOPPERS_tskpri
+
+bool_t
+change_priority(TCB *p_tcb, uint_t newpri)
+{
+ uint_t oldpri;
+
+ oldpri = p_tcb->priority;
+ p_tcb->priority = newpri;
+
+ if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+ /*
+ * タスクが実行できる状態の場合
+ */
+ queue_delete(&(p_tcb->task_queue));
+ if (queue_empty(&(ready_queue[oldpri]))) {
+ primap_clear(oldpri);
+ }
+ queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue));
+ primap_set(newpri);
+
+ if (p_schedtsk == p_tcb) {
+ if (newpri >= oldpri) {
+ p_schedtsk = search_schedtsk();
+ return(p_schedtsk != p_tcb && dspflg);
+ }
+ }
+ else {
+ if (newpri < p_schedtsk->priority) {
+ p_schedtsk = p_tcb;
+ return(dspflg);
+ }
+ }
+ }
+ else {
+ if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) {
+ /*
+ * タスクが,同期・通信オブジェクトの管理ブロックの共通部
+ * 分(WOBJCB)の待ちキューにつながれている場合
+ */
+ wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb,
+ p_tcb);
+ }
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tskpri */
+
+/*
+ * レディキューの回転
+ *
+ * 最高優先順位のタスクを更新するのは,最高優先順位のタスクがタスクキ
+ * ューの末尾に移動した場合である.
+ */
+#ifdef TOPPERS_tskrot
+
+bool_t
+rotate_ready_queue(uint_t pri)
+{
+ QUEUE *p_queue = &(ready_queue[pri]);
+ QUEUE *p_entry;
+
+ if (!queue_empty(p_queue) && p_queue->p_next->p_next != p_queue) {
+ p_entry = queue_delete_next(p_queue);
+ queue_insert_prev(p_queue, p_entry);
+ if (p_schedtsk == (TCB *) p_entry) {
+ p_schedtsk = (TCB *)(p_queue->p_next);
+ return(dspflg);
+ }
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tskrot */
+
+/*
+ * タスク例外処理ルーチンの呼出し
+ *
+ * ASPカーネルでは,タスク例外処理ルーチン内でCPUロック状態に遷移し,
+ * 元の状態に戻さずにリターンした場合,カーネルが元の状態に戻す.
+ */
+#ifdef TOPPERS_tsktex
+
+void
+call_texrtn(void)
+{
+ TEXPTN texptn;
+ bool_t saved_disdsp;
+
+ saved_disdsp = disdsp;
+ p_runtsk->enatex = false;
+ do {
+ texptn = p_runtsk->texptn;
+ p_runtsk->texptn = 0U;
+
+ t_unlock_cpu();
+ LOG_TEX_ENTER(p_runtsk, texptn);
+ (*((TEXRTN)(p_runtsk->p_tinib->texrtn)))(texptn,
+ p_runtsk->p_tinib->exinf);
+ LOG_TEX_LEAVE(p_runtsk);
+ if (!t_sense_lock()) {
+ t_lock_cpu();
+ }
+ if (!ipmflg) {
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
+ disdsp = saved_disdsp;
+ dspflg = !disdsp;
+ p_runtsk->enatex = false;
+ if (p_runtsk != p_schedtsk && dspflg) {
+ /*
+ * ここでdispatchを呼び出す処理は,相互再帰呼出しになって
+ * いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
+ * おけば支障がない.その理由については,「TOPPERS/ASP カー
+ * ネル 設計メモ」を参照のこと.
+ */
+ dispatch();
+ }
+ } while (p_runtsk->texptn != 0U);
+ p_runtsk->enatex = true;
+}
+
+/*
+ * タスク例外処理ルーチンの起動
+ */
+#ifndef OMIT_CALLTEX
+
+void
+calltex(void)
+{
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
+ call_texrtn();
+ }
+}
+
+#endif /* OMIT_CALLTEX */
+#endif /* TOPPERS_tsktex */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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.h 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * タスク管理モジュール
+ */
+
+#ifndef TOPPERS_TASK_H
+#define TOPPERS_TASK_H
+
+#include <queue.h>
+#include "time_event.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TSKSTAT
+#define LOG_TSKSTAT(p_tcb)
+#endif /* LOG_TSKSTAT */
+
+/*
+ * タスク優先度の内部表現・外部表現変換マクロ
+ */
+#define INT_PRIORITY(x) ((uint_t)((x) - TMIN_TPRI))
+#define EXT_TSKPRI(x) ((PRI)(x) + TMIN_TPRI)
+
+/*
+ * タスク状態の内部表現
+ *
+ * TCB中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY)
+ * は区別しない.両状態を総称して,実行できる状態(RUNNABLE)と呼ぶ.
+ * 二重待ち状態は,(TS_WAITING | TS_SUSPENDED)で表す.TS_WAIT_???は待
+ * ち要因を表し,待ち状態(二重待ち状態を含む)の場合にのみ設定する.
+ */
+#define TS_DORMANT 0x00U /* 休止状態 */
+#define TS_RUNNABLE 0x01U /* 実行できる状態 */
+#define TS_WAITING 0x02U /* 待ち状態 */
+#define TS_SUSPENDED 0x04U /* 強制待ち状態 */
+
+#define TS_WAIT_DLY (0x00U << 3) /* 時間経過待ち */
+#define TS_WAIT_SLP (0x01U << 3) /* 起床待ち */
+#define TS_WAIT_RDTQ (0x02U << 3) /* データキューからの受信待ち */
+#define TS_WAIT_RPDQ (0x03U << 3) /* 優先度データキューからの受信待ち */
+#define TS_WAIT_SEM (0x04U << 3) /* セマフォ資源の獲得待ち */
+#define TS_WAIT_FLG (0x05U << 3) /* イベントフラグ待ち */
+#define TS_WAIT_SDTQ (0x06U << 3) /* データキューへの送信待ち */
+#define TS_WAIT_SPDQ (0x07U << 3) /* 優先度データキューへの送信待ち */
+#define TS_WAIT_MBX (0x08U << 3) /* メールボックスからの受信待ち */
+#define TS_WAIT_MPF (0x09U << 3) /* 固定長メモリブロックの獲得待ち */
+
+/*
+ * タスク状態判別マクロ
+ *
+ * TSTAT_DORMANTはタスクが休止状態であるかどうかを,TSTAT_RUNNABLEは
+ * タスクが実行できる状態であるかどうかを判別する.TSTAT_WAITINGは待
+ * ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDEDは
+ * 強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する.
+ */
+#define TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT)
+#define TSTAT_RUNNABLE(tstat) (((tstat) & TS_RUNNABLE) != 0U)
+#define TSTAT_WAITING(tstat) (((tstat) & TS_WAITING) != 0U)
+#define TSTAT_SUSPENDED(tstat) (((tstat) & TS_SUSPENDED) != 0U)
+
+/*
+ * タスク待ち要因判別マクロ
+ *
+ * TSTAT_WAIT_SLPはタスクが起床待ちであるかどうかを,TSTAT_WAIT_WOBJ
+ * はタスクが同期・通信オブジェクトに対する待ちであるか(言い換えると,
+ * 同期通信オブジェクトの待ちキューにつながれているか)どうかを判別す
+ * る.また,TSTAT_WAIT_WOBJCBはタスクが同期・通信オブジェクトの管理
+ * ブロックの共通部分(WOBJCB)の待ちキューにつながれているかどうかを
+ * 判別する.
+ *
+ * TSTAT_WAIT_SLPは,任意のタスク状態の中から,タスクが起床待ちである
+ * ことを判別できる.すなわち,TSTAT_WAITINGにより待ち状態であることを
+ * 判別せずに,TSTAT_SLPだけを用いて起床待ち状態であることを判別できる.
+ * これを効率的に実現するために,TS_WAIT_SLPの値を,(0x00U << 3)ではな
+ * く(0x01U << 3)としている.そのため,タスクが時間経過待ち状態である
+ * ことを判別するためのTSTAT_WAIT_DLYを,TSTAT_WAIT_SLPと同様の方法で
+ * 実現することはできない.
+ */
+#define TS_WAIT_MASK (0x0fU << 3) /* 待ち要因の取出しマスク */
+
+#define TSTAT_WAIT_SLP(tstat) (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP)
+#define TSTAT_WAIT_WOBJ(tstat) (((tstat) & TS_WAIT_MASK) >= TS_WAIT_RDTQ)
+#define TSTAT_WAIT_WOBJCB(tstat) (((tstat) & TS_WAIT_MASK) >= TS_WAIT_SEM)
+
+/*
+ * 待ち情報ブロック(WINFO)の定義
+ *
+ * タスクが待ち状態の間は,TCBおよびそのp_winfoで指されるWINFOを次の
+ * ように設定しなければならない.
+ *
+ * (a) TCBのタスク状態を待ち状態(TS_WAITING)にする.その際に,待ち
+ * 要因(TS_WAIT_???)も設定する.
+ *
+ * (b) タイムアウトを監視するために,タイムイベントブロックを登録する.
+ * 登録するタイムイベントブロックは,待ちに入るサービスコール処理関数
+ * のローカル変数として確保し,それへのポインタをWINFOのp_tmevtbに記
+ * 憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には,
+ * p_tmevtbをNULLにする.
+ *
+ * 同期・通信オブジェクトに対する待ち状態の場合には,標準のWINFOに
+ * p_wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.hで定義)を使
+ * う.また,以下の(c)〜(e)の設定を行う必要がある.同期・通信オブジェ
+ * クトに関係しない待ち(起床待ち,時間経過待ち)の場合には,(c)〜(e)
+ * は必要ない.
+ *
+ * (c) TCBを待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待
+ * ちキューにつなぐために,task_queueを使う.
+ *
+ * (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを,
+ * WINFO_WOBJのp_wobjcbに記憶する.
+ *
+ * (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な
+ * 情報がある場合には,WINFO_WOBJに必要な情報のためのフィールドを追加
+ * した構造体を定義し,WINFO_WOBJの代わりに用いる.
+ *
+ * 待ち状態を解除する際には,待ち解除したタスクに対する返値をWINFOの
+ * wercdに設定する.wercdが必要なのは待ち解除以降であるのに対して,
+ * p_tmevtbは待ち解除後は必要ないため,メモリ節約のために共用体を使っ
+ * ている.そのため,wercdへエラーコードを設定するのは,タイムイベント
+ * ブロックを登録解除した後にしなければならない.
+ */
+typedef union waiting_information {
+ ER wercd; /* 待ち解除時のエラーコード */
+ TMEVTB *p_tmevtb; /* 待ち状態用のタイムイベントブロック */
+} WINFO;
+
+/*
+ * タスク初期化ブロック
+ *
+ * タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク
+ * 初期化ブロック)と,値が変化するためにRAMに置かなければならない部
+ * 分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化
+ * ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する
+ * TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい
+ * が,実行効率が悪くなるために採用していない.他のオブジェクトについ
+ * ても同様に扱う.
+ *
+ * タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ
+ * ンに関する情報も含む.
+ */
+typedef struct task_initialization_block {
+ ATR tskatr; /* タスク属性 */
+ intptr_t exinf; /* タスクの拡張情報 */
+ TASK task; /* タスクの起動番地 */
+ uint_t ipriority; /* タスクの起動時優先度(内部表現) */
+
+#ifdef USE_TSKINICTXB
+ TSKINICTXB tskinictxb; /* タスク初期化コンテキストブロック */
+#else /* USE_TSKINICTXB */
+ SIZE stksz; /* スタック領域のサイズ(丸めた値) */
+ void *stk; /* スタック領域の先頭番地 */
+#endif /* USE_TSKINICTXB */
+
+ ATR texatr; /* タスク例外処理ルーチン属性 */
+ TEXRTN texrtn; /* タスク例外処理ルーチンの起動番地 */
+} TINIB;
+
+/*
+ * TCB中のフィールドのビット幅の定義
+ *
+ * プロセッサによっては,TCB中のフィールドのビット幅でメモリ使用量と
+ * 性能がトレードオフになるため,ターゲット依存にフィールドのビット幅
+ * を変更することを許している.
+ */
+#ifndef TBIT_TCB_PRIORITY
+#define TBIT_TCB_PRIORITY 8 /* priorityフィールドのビット幅 */
+#endif /* TBIT_TCB_PRIORITY */
+
+/*
+ * タスク管理ブロック(TCB)
+ *
+ * ASPカーネルでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)
+ * と起床要求キューイング数の最大値(TMAX_WUPCNT)は1に固定されている
+ * ため,キューイングされているかどうかの真偽値で表現することができる.
+ * また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が1に固定されてい
+ * るので,強制待ち要求ネスト数(suscnt)は必要ない.
+ *
+ * TCBのいくつかのフィールドは,特定のタスク状態でのみ有効な値を保持し,
+ * それ以外の場合は値が保証されない(よって,参照してはならない).各
+ * フィールドが有効な値を保持する条件は次の通り.
+ *
+ * ・初期化後は常に有効:
+ * p_tinib,tstat,actque
+ * ・休止状態以外で有効(休止状態では初期値になっている):
+ * priority,wupque,enatex,texptn
+ * ・待ち状態(二重待ち状態を含む)で有効:
+ * p_winfo
+ * ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効:
+ * task_queue
+ * ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効:
+ * tskctxb
+ */
+typedef struct task_control_block {
+ QUEUE task_queue; /* タスクキュー */
+ const TINIB *p_tinib; /* 初期化ブロックへのポインタ */
+
+#ifdef UINT8_MAX
+ uint8_t tstat; /* タスク状態(内部表現)*/
+#else /* UINT8_MAX */
+ BIT_FIELD_UINT tstat : 8; /* タスク状態(内部表現)*/
+#endif /* UINT8_MAX */
+#if defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8)
+ uint8_t priority; /* 現在の優先度(内部表現)*/
+#else /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+ BIT_FIELD_UINT priority : TBIT_TCB_PRIORITY;
+ /* 現在の優先度(内部表現)*/
+#endif /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+ BIT_FIELD_BOOL actque : 1; /* 起動要求キューイング */
+ BIT_FIELD_BOOL wupque : 1; /* 起床要求キューイング */
+ BIT_FIELD_BOOL enatex : 1; /* タスク例外処理許可状態 */
+
+ TEXPTN texptn; /* 保留例外要因 */
+ WINFO *p_winfo; /* 待ち情報ブロックへのポインタ */
+ TSKCTXB tskctxb; /* タスクコンテキストブロック */
+} TCB;
+
+/*
+ * 実行状態のタスク
+ *
+ * 実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の
+ * TCBを指すポインタ.実行状態のタスクがない場合はNULLにする.
+ *
+ * サービスコールの処理中で,自タスク(サービスコールを呼び出したタス
+ * ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え
+ * るのは,ディスパッチャ(と初期化処理)のみである.
+ */
+extern TCB *p_runtsk;
+
+/*
+ * 最高優先順位のタスク
+ *
+ * 実行できるタスクの中で最高優先順位のタスクのTCBを指すポインタ.実
+ * 行できるタスクがない場合はNULLにする.
+ *
+ * ディスパッチ禁止状態など,ディスパッチが保留されている間はp_runtsk
+ * と一致しているとは限らない.
+ */
+extern TCB *p_schedtsk;
+
+/*
+ * ディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ *
+ * 割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは
+ * タスク例外処理ルーチンの起動を要求することを示すフラグ.
+ */
+extern bool_t reqflg;
+
+/*
+ * 割込み優先度マスク全解除状態
+ *
+ * 割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t ipmflg;
+
+/*
+ * ディスパッチ禁止状態
+ *
+ * ディスパッチ禁止状態であることを示すフラグ.
+ */
+extern bool_t disdsp;
+
+/*
+ * タスクディスパッチ可能状態
+ *
+ * 割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ
+ * スパッチ禁止状態でない)ことを示すフラグ.
+ */
+extern bool_t dspflg;
+
+/*
+ * レディキュー
+ *
+ * レディキューは,実行できる状態のタスクを管理するためのキューである.
+ * 実行状態のタスクも管理しているため,レディ(実行可能)キューという
+ * 名称は正確ではないが,レディキューという名称が定着しているため,こ
+ * の名称で呼ぶことにする.
+ *
+ * レディキューは,優先度ごとのタスクキューで構成されている.タスクの
+ * TCBは,該当する優先度のキューに登録される.
+ */
+extern QUEUE ready_queue[TNUM_TPRI];
+
+/*
+ * レディキューサーチのためのビットマップ
+ *
+ * レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー
+ * にタスクが入っているかどうかを示すビットマップを用意している.ビッ
+ * トマップを使うことで,メモリアクセスの回数を減らすことができるが,
+ * ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない
+ * 場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち
+ * る可能性もある.
+ *
+ * 優先度が16段階であることを仮定しているため,uint16_t型としている.
+ */
+extern uint16_t ready_primap;
+
+/*
+ * 使用していないTCBのリスト
+ */
+extern QUEUE free_tcb;
+
+/*
+ * タスクIDの最大値(kernel_cfg.c)
+ */
+extern const ID tmax_tskid;
+extern const ID tmax_stskid;
+
+/*
+ * タスク初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const TINIB tinib_table[];
+extern TINIB atinib_table[];
+
+/*
+ * タスク生成順序テーブル(kernel_cfg.c)
+ */
+extern const ID torder_table[];
+
+/*
+ * TCBのエリア(kernel_cfg.c)
+ */
+extern TCB tcb_table[];
+
+/*
+ * タスクの数
+ */
+#define tnum_tsk ((uint_t)(tmax_tskid - TMIN_TSKID + 1))
+#define tnum_stsk ((uint_t)(tmax_stskid - TMIN_TSKID + 1))
+
+/*
+ * タスクIDからTCBを取り出すためのマクロ
+ */
+#define INDEX_TSK(tskid) ((uint_t)((tskid) - TMIN_TSKID))
+#define get_tcb(tskid) (&(tcb_table[INDEX_TSK(tskid)]))
+#define get_tcb_self(tskid) ((tskid) == TSK_SELF ? p_runtsk : get_tcb(tskid))
+
+/*
+ * TCBからタスクIDを取り出すためのマクロ
+ */
+#define TSKID(p_tcb) ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID))
+
+/*
+ * タスク管理モジュールの初期化
+ */
+extern void initialize_task(void);
+
+/*
+ * 最高優先順位タスクのサーチ
+ *
+ * レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ
+ * を返す.レディキューが空の場合には,この関数を呼び出してはならない.
+ */
+extern TCB *search_schedtsk(void);
+
+/*
+ * 実行できる状態への遷移
+ *
+ * p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入
+ * したタスクの優先度が,最高優先順位のタスクの優先度よりも高い場合は,
+ * 最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを返
+ * す.そうでない場合はfalseを返す.
+ */
+extern bool_t make_runnable(TCB *p_tcb);
+
+/*
+ * 実行できる状態から他の状態への遷移
+ *
+ * p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した
+ * タスクが最高優先順位のタスクであった場合には,最高優先順位のタスク
+ * を設定しなおし,ディスパッチ許可状態であればtrueを返す.そうでない
+ * 場合はfalseを返す.タスクの状態は更新しない.
+ */
+extern bool_t make_non_runnable(TCB *p_tcb);
+
+/*
+ * 休止状態への遷移
+ *
+ * p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動
+ * 時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設
+ * 定する.
+ */
+extern void make_dormant(TCB *p_tcb);
+
+/*
+ * 休止状態から実行できる状態への遷移
+ *
+ * p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする.
+ * 実行できる状態に遷移したタスクへのディスパッチが必要な場合はtrue,
+ * そうでない場合はfalseを返す.
+ */
+extern bool_t make_active(TCB *p_tcb);
+
+/*
+ * タスクの優先度の変更
+ *
+ * p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また,
+ * 必要な場合には最高優先順位のタスクを更新し,ディスパッチ許可状態で
+ * あればtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t change_priority(TCB *p_tcb, uint_t newpri);
+
+/*
+ * レディキューの回転
+ *
+ * レディキュー中の,priで指定される優先度のタスクキューを回転させる.
+ * また,必要な場合には最高優先順位のタスクを変更し,ディスパッチが保
+ * 留されていなければtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t rotate_ready_queue(uint_t pri);
+
+/*
+ * タスク例外処理ルーチンの呼出し
+ *
+ * タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの
+ * 保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解
+ * 除する.
+ *
+ * タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間
+ * に保留例外要因が0でなくなっていれば,再びタスク例外処理ルーチンを
+ * 呼び出す.保留例外要因が0の場合には,例外処理許可状態にして関数か
+ * らリターンする.
+ *
+ * この関数は,実行状態のタスクが,タスク例外処理許可状態(enatexが
+ * true)で,保留例外要因が0でない(texptnが0でない)場合に呼び出すこ
+ * とを想定している.この関数は,CPUロック状態で呼び出さなければなら
+ * ない.
+ */
+extern void call_texrtn(void);
+
+/*
+ * タスク例外処理ルーチンの起動
+ *
+ * 実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば,
+ * タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時
+ * は,一時的にCPUロックを解除する.
+ *
+ * この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口
+ * 処理から呼び出されることを想定している.この関数は,CPUロック状態
+ * で呼び出さなければならない.
+ *
+ * 実行効率を上げるために,この関数をターゲット依存部で記述してもよい.
+ * その場合には,OMIT_CALLTEXをマクロ定義する.
+ */
+extern void calltex(void);
+
+#endif /* TOPPERS_TASK_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2011 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_except.c 2023 2011-01-02 08:59:06Z ertl-hiro $
+ */
+
+/*
+ * タスク例外処理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_DEF_TEX_ENTER
+#define LOG_DEF_TEX_ENTER(tskid, pk_dtex)
+#endif /* LOG_DEF_TEX_ENTER */
+
+#ifndef LOG_DEF_TEX_LEAVE
+#define LOG_DEF_TEX_LEAVE(ercd)
+#endif /* LOG_DEF_TEX_LEAVE */
+
+#ifndef LOG_RAS_TEX_ENTER
+#define LOG_RAS_TEX_ENTER(tskid, rasptn)
+#endif /* LOG_RAS_TEX_ENTER */
+
+#ifndef LOG_RAS_TEX_LEAVE
+#define LOG_RAS_TEX_LEAVE(ercd)
+#endif /* LOG_RAS_TEX_LEAVE */
+
+#ifndef LOG_IRAS_TEX_ENTER
+#define LOG_IRAS_TEX_ENTER(tskid, rasptn)
+#endif /* LOG_IRAS_TEX_ENTER */
+
+#ifndef LOG_IRAS_TEX_LEAVE
+#define LOG_IRAS_TEX_LEAVE(ercd)
+#endif /* LOG_IRAS_TEX_LEAVE */
+
+#ifndef LOG_DIS_TEX_ENTER
+#define LOG_DIS_TEX_ENTER()
+#endif /* LOG_DIS_TEX_ENTER */
+
+#ifndef LOG_DIS_TEX_LEAVE
+#define LOG_DIS_TEX_LEAVE(ercd)
+#endif /* LOG_DIS_TEX_LEAVE */
+
+#ifndef LOG_ENA_TEX_ENTER
+#define LOG_ENA_TEX_ENTER()
+#endif /* LOG_ENA_TEX_ENTER */
+
+#ifndef LOG_ENA_TEX_LEAVE
+#define LOG_ENA_TEX_LEAVE(ercd)
+#endif /* LOG_ENA_TEX_LEAVE */
+
+#ifndef LOG_SNS_TEX_ENTER
+#define LOG_SNS_TEX_ENTER()
+#endif /* LOG_SNS_TEX_ENTER */
+
+#ifndef LOG_SNS_TEX_LEAVE
+#define LOG_SNS_TEX_LEAVE(state)
+#endif /* LOG_SNS_TEX_LEAVE */
+
+#ifndef LOG_REF_TEX_ENTER
+#define LOG_REF_TEX_ENTER(tskid, pk_rtex)
+#endif /* LOG_REF_TEX_ENTER */
+
+#ifndef LOG_REF_TEX_LEAVE
+#define LOG_REF_TEX_LEAVE(ercd, pk_rtex)
+#endif /* LOG_REF_TEX_LEAVE */
+
+/*
+ * タスク例外処理ルーチンの定義
+ */
+#ifdef TOPPERS_def_tex
+
+ER_UINT
+def_tex(ID tskid, const T_DTEX *pk_dtex)
+{
+ TCB *p_tcb;
+ TINIB *p_tinib;
+ ER ercd;
+
+ LOG_DEF_TEX_ENTER(tskid, pk_dtex);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ CHECK_RSATR(pk_dtex->texatr, TA_NULL);
+ if (pk_dtex->texrtn != NULL) {
+ CHECK_ALIGN_FUNC(pk_dtex->texrtn);
+ CHECK_NONNULL_FUNC(pk_dtex->texrtn);
+ }
+ p_tcb = get_tcb_self(tskid);
+ p_tinib = (TINIB *)(p_tcb->p_tinib);
+
+ t_lock_cpu();
+ if (TSKID(p_tcb) <= tmax_stskid) {
+ ercd = E_OBJ;
+ }
+ else if (pk_dtex->texrtn != NULL) {
+ if (p_tinib->texrtn != NULL) {
+ ercd = E_OBJ;
+ }
+ else {
+ p_tinib->texatr = pk_dtex->texatr;
+ p_tinib->texrtn = pk_dtex->texrtn;
+ ercd = E_OK;
+ }
+ }
+ else {
+ if (p_tinib->texrtn != NULL) {
+ p_tinib->texrtn = NULL;
+ p_tcb->enatex = false;
+ p_tcb->texptn = 0U;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEF_TEX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_def_tex */
+
+/*
+ * タスク例外処理の要求
+ */
+#ifdef TOPPERS_ras_tex
+
+ER
+ras_tex(ID tskid, TEXPTN rasptn)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_RAS_TEX_ENTER(tskid, rasptn);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ CHECK_PAR(rasptn != 0U);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
+ ercd = E_OBJ;
+ }
+ else {
+ p_tcb->texptn |= rasptn;
+ if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
+ call_texrtn();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_RAS_TEX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ras_tex */
+
+/*
+ * タスク例外処理の要求(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iras_tex
+
+ER
+iras_tex(ID tskid, TEXPTN rasptn)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_IRAS_TEX_ENTER(tskid, rasptn);
+ CHECK_INTCTX_UNL();
+ CHECK_TSKID(tskid);
+ CHECK_PAR(rasptn != 0U);
+ p_tcb = get_tcb(tskid);
+
+ i_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
+ ercd = E_OBJ;
+ }
+ else {
+ p_tcb->texptn |= rasptn;
+ if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IRAS_TEX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iras_tex */
+
+/*
+ * タスク例外処理の禁止
+ */
+#ifdef TOPPERS_dis_tex
+
+ER
+dis_tex(void)
+{
+ ER ercd;
+
+ LOG_DIS_TEX_ENTER();
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ if (p_runtsk->p_tinib->texrtn == NULL) {
+ ercd = E_OBJ;
+ }
+ else {
+ p_runtsk->enatex = false;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DIS_TEX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_dis_tex */
+
+/*
+ * タスク例外処理の許可
+ */
+#ifdef TOPPERS_ena_tex
+
+ER
+ena_tex(void)
+{
+ ER ercd;
+
+ LOG_ENA_TEX_ENTER();
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ if (p_runtsk->p_tinib->texrtn == NULL) {
+ ercd = E_OBJ;
+ }
+ else {
+ p_runtsk->enatex = true;
+ if (p_runtsk->texptn != 0U && ipmflg) {
+ call_texrtn();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ENA_TEX_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ena_tex */
+
+/*
+ * タスク例外処理禁止状態の参照
+ */
+#ifdef TOPPERS_sns_tex
+
+bool_t
+sns_tex(void)
+{
+ bool_t state;
+
+ LOG_SNS_TEX_ENTER();
+ state = (p_runtsk != NULL && p_runtsk->enatex) ? false : true;
+ LOG_SNS_TEX_LEAVE(state);
+ return(state);
+}
+
+#endif /* TOPPERS_sns_tex */
+
+/*
+ * タスク例外処理の状態参照
+ */
+#ifdef TOPPERS_ref_tex
+
+ER
+ref_tex(ID tskid, T_RTEX *pk_rtex)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_REF_TEX_ENTER(tskid, pk_rtex);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
+ ercd = E_OBJ;
+ }
+ else {
+ pk_rtex->texstat = (p_tcb->enatex) ? TTEX_ENA : TTEX_DIS;
+ pk_rtex->pndptn = p_tcb->texptn;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_TEX_LEAVE(ercd, pk_rtex);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_tex */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * タスク管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACRE_TSK_ENTER
+#define LOG_ACRE_TSK_ENTER(pk_ctsk)
+#endif /* LOG_ACRE_TSK_ENTER */
+
+#ifndef LOG_ACRE_TSK_LEAVE
+#define LOG_ACRE_TSK_LEAVE(ercd)
+#endif /* LOG_ACRE_TSK_LEAVE */
+
+#ifndef LOG_DEL_TSK_ENTER
+#define LOG_DEL_TSK_ENTER(tskid)
+#endif /* LOG_DEL_TSK_ENTER */
+
+#ifndef LOG_DEL_TSK_LEAVE
+#define LOG_DEL_TSK_LEAVE(ercd)
+#endif /* LOG_DEL_TSK_LEAVE */
+
+#ifndef LOG_ACT_TSK_ENTER
+#define LOG_ACT_TSK_ENTER(tskid)
+#endif /* LOG_ACT_TSK_ENTER */
+
+#ifndef LOG_ACT_TSK_LEAVE
+#define LOG_ACT_TSK_LEAVE(ercd)
+#endif /* LOG_ACT_TSK_LEAVE */
+
+#ifndef LOG_IACT_TSK_ENTER
+#define LOG_IACT_TSK_ENTER(tskid)
+#endif /* LOG_IACT_TSK_ENTER */
+
+#ifndef LOG_IACT_TSK_LEAVE
+#define LOG_IACT_TSK_LEAVE(ercd)
+#endif /* LOG_IACT_TSK_LEAVE */
+
+#ifndef LOG_CAN_ACT_ENTER
+#define LOG_CAN_ACT_ENTER(tskid)
+#endif /* LOG_CAN_ACT_ENTER */
+
+#ifndef LOG_CAN_ACT_LEAVE
+#define LOG_CAN_ACT_LEAVE(ercd)
+#endif /* LOG_CAN_ACT_LEAVE */
+
+#ifndef LOG_EXT_TSK_ENTER
+#define LOG_EXT_TSK_ENTER()
+#endif /* LOG_EXT_TSK_ENTER */
+
+#ifndef LOG_EXT_TSK_LEAVE
+#define LOG_EXT_TSK_LEAVE(ercd)
+#endif /* LOG_EXT_TSK_LEAVE */
+
+#ifndef LOG_TER_TSK_ENTER
+#define LOG_TER_TSK_ENTER(tskid)
+#endif /* LOG_TER_TSK_ENTER */
+
+#ifndef LOG_TER_TSK_LEAVE
+#define LOG_TER_TSK_LEAVE(ercd)
+#endif /* LOG_TER_TSK_LEAVE */
+
+#ifndef LOG_CHG_PRI_ENTER
+#define LOG_CHG_PRI_ENTER(tskid, tskpri)
+#endif /* LOG_CHG_PRI_ENTER */
+
+#ifndef LOG_CHG_PRI_LEAVE
+#define LOG_CHG_PRI_LEAVE(ercd)
+#endif /* LOG_CHG_PRI_LEAVE */
+
+#ifndef LOG_GET_PRI_ENTER
+#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
+#endif /* LOG_GET_PRI_ENTER */
+
+#ifndef LOG_GET_PRI_LEAVE
+#define LOG_GET_PRI_LEAVE(ercd, tskpri)
+#endif /* LOG_GET_PRI_LEAVE */
+
+#ifndef LOG_GET_INF_ENTER
+#define LOG_GET_INF_ENTER(p_exinf)
+#endif /* LOG_GET_INF_ENTER */
+
+#ifndef LOG_GET_INF_LEAVE
+#define LOG_GET_INF_LEAVE(ercd, exinf)
+#endif /* LOG_GET_INF_LEAVE */
+
+/*
+ * タスクの生成
+ */
+#ifdef TOPPERS_acre_tsk
+
+ER_UINT
+acre_tsk(const T_CTSK *pk_ctsk)
+{
+ TCB *p_tcb;
+ TINIB *p_tinib;
+ ATR tskatr;
+ STK_T *stk;
+ ER ercd;
+
+ LOG_ACRE_TSK_ENTER(pk_ctsk);
+ CHECK_TSKCTX_UNL();
+ CHECK_RSATR(pk_ctsk->tskatr, TA_ACT|TARGET_TSKATR);
+ CHECK_ALIGN_FUNC(pk_ctsk->task);
+ CHECK_NONNULL_FUNC(pk_ctsk->task);
+ CHECK_TPRI(pk_ctsk->itskpri);
+ CHECK_STKSZ_MIN(pk_ctsk->stksz);
+ CHECK_ALIGN_STKSZ(pk_ctsk->stksz);
+ CHECK_ALIGN_STACK(pk_ctsk->stk);
+ tskatr = pk_ctsk->tskatr;
+ stk = pk_ctsk->stk;
+
+ t_lock_cpu();
+ if (queue_empty(&free_tcb)) {
+ ercd = E_NOID;
+ }
+ else {
+ if (stk == NULL) {
+ stk = kernel_malloc(pk_ctsk->stksz);
+ tskatr |= TA_MEMALLOC;
+ }
+ if (stk == NULL) {
+ ercd = E_NOMEM;
+ }
+ else {
+ p_tcb = ((TCB *) queue_delete_next(&free_tcb));
+ p_tinib = (TINIB *)(p_tcb->p_tinib);
+ p_tinib->tskatr = tskatr;
+ p_tinib->exinf = pk_ctsk->exinf;
+ p_tinib->task = pk_ctsk->task;
+ p_tinib->ipriority = INT_PRIORITY(pk_ctsk->itskpri);
+#ifdef USE_TSKINICTXB
+ init_tskinictxb(&(p_tinib->tskinictxb), stk, pk_ctsk);
+#else /* USE_TSKINICTXB */
+ p_tinib->stksz = pk_ctsk->stksz;
+ p_tinib->stk = stk;
+#endif /* USE_TSKINICTXB */
+ p_tinib->texatr = TA_NULL;
+ p_tinib->texrtn = NULL;
+
+ p_tcb->actque = false;
+ make_dormant(p_tcb);
+ if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
+ make_active(p_tcb);
+ }
+ ercd = TSKID(p_tcb);
+ }
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACRE_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_acre_tsk */
+
+/*
+ * タスクの削除
+ */
+#ifdef TOPPERS_del_tsk
+
+ER
+del_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ TINIB *p_tinib;
+ ER ercd;
+
+ LOG_DEL_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSKID(p_tcb) > tmax_stskid && TSTAT_DORMANT(p_tcb->tstat)) {
+ p_tinib = (TINIB *)(p_tcb->p_tinib);
+#ifdef USE_TSKINICTXB
+ term_tskinictxb(&(p_tinib->tskinictxb));
+#else /* USE_TSKINICTXB */
+ if ((p_tinib->tskatr & TA_MEMALLOC) != 0U) {
+ kernel_free(p_tinib->stk);
+ }
+#endif /* USE_TSKINICTXB */
+ p_tinib->tskatr = TA_NOEXS;
+ queue_insert_prev(&free_tcb, &(p_tcb->task_queue));
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_OBJ;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DEL_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_del_tsk */
+
+/*
+ * タスクの起動
+ */
+#ifdef TOPPERS_act_tsk
+
+ER
+act_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_ACT_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ if (make_active(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->actque)) {
+ p_tcb->actque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACT_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_act_tsk */
+
+/*
+ * タスクの起動(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iact_tsk
+
+ER
+iact_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_IACT_TSK_ENTER(tskid);
+ CHECK_INTCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+
+ i_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ if (make_active(p_tcb)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->actque)) {
+ p_tcb->actque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IACT_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iact_tsk */
+
+/*
+ * タスク起動要求のキャンセル
+ */
+#ifdef TOPPERS_can_act
+
+ER_UINT
+can_act(ID tskid)
+{
+ TCB *p_tcb;
+ ER_UINT ercd;
+
+ LOG_CAN_ACT_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ ercd = p_tcb->actque ? 1 : 0;
+ }
+ p_tcb->actque = false;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CAN_ACT_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_can_act */
+
+/*
+ * 自タスクの終了
+ */
+#ifdef TOPPERS_ext_tsk
+
+ER
+ext_tsk(void)
+{
+ ER ercd;
+
+ LOG_EXT_TSK_ENTER();
+ CHECK_TSKCTX();
+
+ if (t_sense_lock()) {
+ /*
+ * CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
+ * てからタスクを終了する.実装上は,サービスコール内でのCPU
+ * ロックを省略すればよいだけ.
+ */
+ }
+ else {
+ t_lock_cpu();
+ }
+ if (disdsp) {
+ /*
+ * ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
+ * チ許可状態にしてからタスクを終了する.
+ */
+ disdsp = false;
+ }
+ if (!ipmflg) {
+ /*
+ * 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
+ * が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
+ * る.
+ */
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
+ dspflg = true;
+
+ (void) make_non_runnable(p_runtsk);
+ make_dormant(p_runtsk);
+ if (p_runtsk->actque) {
+ p_runtsk->actque = false;
+ (void) make_active(p_runtsk);
+ }
+ exit_and_dispatch();
+ ercd = E_SYS;
+
+ error_exit:
+ LOG_EXT_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ext_tsk */
+
+/*
+ * タスクの強制終了
+ */
+#ifdef TOPPERS_ter_tsk
+
+ER
+ter_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_TER_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+ CHECK_NONSELF(p_tcb);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+ /*
+ * p_tcbは自タスクでないため,(シングルプロセッサでは)実
+ * 行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ
+ * チが必要になることはない.
+ */
+ (void) make_non_runnable(p_tcb);
+ }
+ else if (TSTAT_WAITING(p_tcb->tstat)) {
+ wait_dequeue_wobj(p_tcb);
+ wait_dequeue_tmevtb(p_tcb);
+ }
+ make_dormant(p_tcb);
+ if (p_tcb->actque) {
+ p_tcb->actque = false;
+ if (make_active(p_tcb)) {
+ dispatch();
+ }
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TER_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ter_tsk */
+
+/*
+ * タスクのベース優先度の変更
+ */
+#ifdef TOPPERS_chg_pri
+
+ER
+chg_pri(ID tskid, PRI tskpri)
+{
+ TCB *p_tcb;
+ uint_t newpri;
+ ER ercd;
+
+ LOG_CHG_PRI_ENTER(tskid, tskpri);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ CHECK_TPRI_INI(tskpri);
+ p_tcb = get_tcb_self(tskid);
+ newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
+ : INT_PRIORITY(tskpri);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (change_priority(p_tcb, newpri)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CHG_PRI_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_chg_pri */
+
+/*
+ * タスク優先度の参照
+ */
+#ifdef TOPPERS_get_pri
+
+ER
+get_pri(ID tskid, PRI *p_tskpri)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_GET_PRI_ENTER(tskid, p_tskpri);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ *p_tskpri = EXT_TSKPRI(p_tcb->priority);
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
+ return(ercd);
+}
+
+#endif /* TOPPERS_get_pri */
+
+/*
+ * 自タスクの拡張情報の参照
+ */
+#ifdef TOPPERS_get_inf
+
+ER
+get_inf(intptr_t *p_exinf)
+{
+ ER ercd;
+
+ LOG_GET_INF_ENTER(p_exinf);
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ *p_exinf = p_runtsk->p_tinib->exinf;
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_GET_INF_LEAVE(ercd, *p_exinf);
+ return(ercd);
+}
+
+#endif /* TOPPERS_get_inf */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2005-2010 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_refer.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * タスクの状態参照機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+#include "semaphore.h"
+#include "eventflag.h"
+#include "dataqueue.h"
+#include "pridataq.h"
+#include "mailbox.h"
+#include "mempfix.h"
+#include "time_event.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_REF_TSK_ENTER
+#define LOG_REF_TSK_ENTER(tskid, pk_rtsk)
+#endif /* LOG_REF_TSK_ENTER */
+
+#ifndef LOG_REF_TSK_LEAVE
+#define LOG_REF_TSK_LEAVE(ercd, pk_rtsk)
+#endif /* LOG_REF_TSK_LEAVE */
+
+/*
+ * タスクの状態参照
+ */
+#ifdef TOPPERS_ref_tsk
+
+ER
+ref_tsk(ID tskid, T_RTSK *pk_rtsk)
+{
+ TCB *p_tcb;
+ uint_t tstat;
+ ER ercd;
+
+ LOG_REF_TSK_ENTER(tskid, pk_rtsk);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ tstat = p_tcb->tstat;
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else {
+ if (TSTAT_DORMANT(tstat)) {
+ /*
+ * 対象タスクが休止状態の場合
+ */
+ pk_rtsk->tskstat = TTS_DMT;
+ }
+ else {
+ /*
+ * タスク状態の取出し
+ */
+ if (TSTAT_SUSPENDED(tstat)) {
+ if (TSTAT_WAITING(tstat)) {
+ pk_rtsk->tskstat = TTS_WAS;
+ }
+ else {
+ pk_rtsk->tskstat = TTS_SUS;
+ }
+ }
+ else if (TSTAT_WAITING(tstat)) {
+ pk_rtsk->tskstat = TTS_WAI;
+ }
+ else if (p_tcb == p_runtsk) {
+ pk_rtsk->tskstat = TTS_RUN;
+ }
+ else {
+ pk_rtsk->tskstat = TTS_RDY;
+ }
+
+ /*
+ * 現在優先度とベース優先度の取出し
+ */
+ pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority);
+ pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->priority);
+
+ if (TSTAT_WAITING(tstat)) {
+ /*
+ * 待ち要因と待ち対象のオブジェクトのIDの取出し
+ */
+ switch (tstat & TS_WAIT_MASK) {
+ case TS_WAIT_SLP:
+ pk_rtsk->tskwait = TTW_SLP;
+ break;
+ case TS_WAIT_DLY:
+ pk_rtsk->tskwait = TTW_DLY;
+ break;
+ case TS_WAIT_SEM:
+ pk_rtsk->tskwait = TTW_SEM;
+ pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo))
+ ->p_semcb);
+ break;
+ case TS_WAIT_FLG:
+ pk_rtsk->tskwait = TTW_FLG;
+ pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo))
+ ->p_flgcb);
+ break;
+ case TS_WAIT_SDTQ:
+ pk_rtsk->tskwait = TTW_SDTQ;
+ pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo))
+ ->p_dtqcb);
+ break;
+ case TS_WAIT_RDTQ:
+ pk_rtsk->tskwait = TTW_RDTQ;
+ pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo))
+ ->p_dtqcb);
+ break;
+ case TS_WAIT_SPDQ:
+ pk_rtsk->tskwait = TTW_SPDQ;
+ pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo))
+ ->p_pdqcb);
+ break;
+ case TS_WAIT_RPDQ:
+ pk_rtsk->tskwait = TTW_RPDQ;
+ pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo))
+ ->p_pdqcb);
+ break;
+ case TS_WAIT_MBX:
+ pk_rtsk->tskwait = TTW_MBX;
+ pk_rtsk->wobjid = MBXID(((WINFO_MBX *)(p_tcb->p_winfo))
+ ->p_mbxcb);
+ break;
+ case TS_WAIT_MPF:
+ pk_rtsk->tskwait = TTW_MPF;
+ pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo))
+ ->p_mpfcb);
+ break;
+ }
+
+ /*
+ * タイムアウトするまでの時間の取出し
+ */
+ if (p_tcb->p_winfo->p_tmevtb != NULL) {
+ pk_rtsk->lefttmo
+ = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb);
+ }
+ else {
+ pk_rtsk->lefttmo = TMO_FEVR;
+ }
+ }
+
+ /*
+ * 起床要求キューイング数の取出し
+ */
+ pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U;
+ }
+
+ /*
+ * 起動要求キューイング数の取出し
+ */
+ pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U;
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REF_TSK_LEAVE(ercd, pk_rtsk);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ref_tsk */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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_sync.c 1966 2010-11-20 07:23:56Z ertl-hiro $
+ */
+
+/*
+ * タスク付属同期機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_SLP_TSK_ENTER
+#define LOG_SLP_TSK_ENTER()
+#endif /* LOG_SLP_TSK_ENTER */
+
+#ifndef LOG_SLP_TSK_LEAVE
+#define LOG_SLP_TSK_LEAVE(ercd)
+#endif /* LOG_SLP_TSK_LEAVE */
+
+#ifndef LOG_TSLP_TSK_ENTER
+#define LOG_TSLP_TSK_ENTER(tmout)
+#endif /* LOG_TSLP_TSK_ENTER */
+
+#ifndef LOG_TSLP_TSK_LEAVE
+#define LOG_TSLP_TSK_LEAVE(ercd)
+#endif /* LOG_TSLP_TSK_LEAVE */
+
+#ifndef LOG_WUP_TSK_ENTER
+#define LOG_WUP_TSK_ENTER(tskid)
+#endif /* LOG_WUP_TSK_ENTER */
+
+#ifndef LOG_WUP_TSK_LEAVE
+#define LOG_WUP_TSK_LEAVE(ercd)
+#endif /* LOG_WUP_TSK_LEAVE */
+
+#ifndef LOG_IWUP_TSK_ENTER
+#define LOG_IWUP_TSK_ENTER(tskid)
+#endif /* LOG_IWUP_TSK_ENTER */
+
+#ifndef LOG_IWUP_TSK_LEAVE
+#define LOG_IWUP_TSK_LEAVE(ercd)
+#endif /* LOG_IWUP_TSK_LEAVE */
+
+#ifndef LOG_CAN_WUP_ENTER
+#define LOG_CAN_WUP_ENTER(tskid)
+#endif /* LOG_CAN_WUP_ENTER */
+
+#ifndef LOG_CAN_WUP_LEAVE
+#define LOG_CAN_WUP_LEAVE(ercd)
+#endif /* LOG_CAN_WUP_LEAVE */
+
+#ifndef LOG_REL_WAI_ENTER
+#define LOG_REL_WAI_ENTER(tskid)
+#endif /* LOG_REL_WAI_ENTER */
+
+#ifndef LOG_REL_WAI_LEAVE
+#define LOG_REL_WAI_LEAVE(ercd)
+#endif /* LOG_REL_WAI_LEAVE */
+
+#ifndef LOG_IREL_WAI_ENTER
+#define LOG_IREL_WAI_ENTER(tskid)
+#endif /* LOG_IREL_WAI_ENTER */
+
+#ifndef LOG_IREL_WAI_LEAVE
+#define LOG_IREL_WAI_LEAVE(ercd)
+#endif /* LOG_IREL_WAI_LEAVE */
+
+#ifndef LOG_SUS_TSK_ENTER
+#define LOG_SUS_TSK_ENTER(tskid)
+#endif /* LOG_SUS_TSK_ENTER */
+
+#ifndef LOG_SUS_TSK_LEAVE
+#define LOG_SUS_TSK_LEAVE(ercd)
+#endif /* LOG_SUS_TSK_LEAVE */
+
+#ifndef LOG_RSM_TSK_ENTER
+#define LOG_RSM_TSK_ENTER(tskid)
+#endif /* LOG_RSM_TSK_ENTER */
+
+#ifndef LOG_RSM_TSK_LEAVE
+#define LOG_RSM_TSK_LEAVE(ercd)
+#endif /* LOG_RSM_TSK_LEAVE */
+
+#ifndef LOG_DLY_TSK_ENTER
+#define LOG_DLY_TSK_ENTER(dlytim)
+#endif /* LOG_DLY_TSK_ENTER */
+
+#ifndef LOG_DLY_TSK_LEAVE
+#define LOG_DLY_TSK_LEAVE(ercd)
+#endif /* LOG_DLY_TSK_LEAVE */
+
+/*
+ * 起床待ち
+ */
+#ifdef TOPPERS_slp_tsk
+
+ER
+slp_tsk(void)
+{
+ WINFO winfo;
+ ER ercd;
+
+ LOG_SLP_TSK_ENTER();
+ CHECK_DISPATCH();
+
+ t_lock_cpu();
+ if (p_runtsk->wupque) {
+ p_runtsk->wupque = false;
+ ercd = E_OK;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+ make_wait(&winfo);
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SLP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_slp_tsk */
+
+/*
+ * 起床待ち(タイムアウトあり)
+ */
+#ifdef TOPPERS_tslp_tsk
+
+ER
+tslp_tsk(TMO tmout)
+{
+ WINFO winfo;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_TSLP_TSK_ENTER(tmout);
+ CHECK_DISPATCH();
+ CHECK_TMOUT(tmout);
+
+ t_lock_cpu();
+ if (p_runtsk->wupque) {
+ p_runtsk->wupque = false;
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+ make_wait_tmout(&winfo, &tmevtb, tmout);
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TSLP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_tslp_tsk */
+
+/*
+ * タスクの起床
+ */
+#ifdef TOPPERS_wup_tsk
+
+ER
+wup_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_WUP_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+ if (wait_complete(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->wupque)) {
+ p_tcb->wupque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_WUP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_wup_tsk */
+
+/*
+ * タスクの起床(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iwup_tsk
+
+ER
+iwup_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_IWUP_TSK_ENTER(tskid);
+ CHECK_INTCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+
+ i_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+ if (wait_complete(p_tcb)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->wupque)) {
+ p_tcb->wupque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IWUP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iwup_tsk */
+
+/*
+ * タスク起床要求のキャンセル
+ */
+#ifdef TOPPERS_can_wup
+
+ER_UINT
+can_wup(ID tskid)
+{
+ TCB *p_tcb;
+ ER_UINT ercd;
+
+ LOG_CAN_WUP_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ ercd = p_tcb->wupque ? 1 : 0;
+ p_tcb->wupque = false;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CAN_WUP_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_can_wup */
+
+/*
+ * 待ち状態の強制解除
+ */
+#ifdef TOPPERS_rel_wai
+
+ER
+rel_wai(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_REL_WAI_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (!TSTAT_WAITING(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (wait_release(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REL_WAI_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rel_wai */
+
+/*
+ * 待ち状態の強制解除(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_irel_wai
+
+ER
+irel_wai(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_IREL_WAI_ENTER(tskid);
+ CHECK_INTCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+
+ i_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (!TSTAT_WAITING(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (wait_release(p_tcb)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IREL_WAI_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_irel_wai */
+
+/*
+ * 強制待ち状態への移行
+ */
+#ifdef TOPPERS_sus_tsk
+
+ER
+sus_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_SUS_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (p_tcb == p_runtsk && !dspflg) {
+ ercd = E_CTX;
+ }
+ else if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+ /*
+ * 実行できる状態から強制待ち状態への遷移
+ */
+ p_tcb->tstat = TS_SUSPENDED;
+ LOG_TSKSTAT(p_tcb);
+ if (make_non_runnable(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
+ ercd = E_QOVR;
+ }
+ else {
+ /*
+ * 待ち状態から二重待ち状態への遷移
+ */
+ p_tcb->tstat |= TS_SUSPENDED;
+ LOG_TSKSTAT(p_tcb);
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SUS_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_sus_tsk */
+
+/*
+ * 強制待ち状態からの再開
+ */
+#ifdef TOPPERS_rsm_tsk
+
+ER
+rsm_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_RSM_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+
+ t_lock_cpu();
+ if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
+ ercd = E_NOEXS;
+ }
+ else if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (!TSTAT_WAITING(p_tcb->tstat)) {
+ /*
+ * 強制待ち状態から実行できる状態への遷移
+ */
+ p_tcb->tstat = TS_RUNNABLE;
+ LOG_TSKSTAT(p_tcb);
+ if (make_runnable(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ /*
+ * 二重待ち状態から待ち状態への遷移
+ */
+ p_tcb->tstat &= ~TS_SUSPENDED;
+ LOG_TSKSTAT(p_tcb);
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_RSM_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rsm_tsk */
+
+/*
+ * 自タスクの遅延
+ */
+#ifdef TOPPERS_dly_tsk
+
+ER
+dly_tsk(RELTIM dlytim)
+{
+ WINFO winfo;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_DLY_TSK_ENTER(dlytim);
+ CHECK_DISPATCH();
+ CHECK_PAR(dlytim <= TMAX_RELTIM);
+
+ t_lock_cpu();
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
+ (void) make_non_runnable(p_runtsk);
+ p_runtsk->p_winfo = &winfo;
+ winfo.p_tmevtb = &tmevtb;
+ tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo.wercd;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DLY_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_dly_tsk */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2004-2010 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: sample1.c 1968 2010-11-20 11:00:07Z ertl-hiro $
+ */
+
+/*
+ * サンプルプログラム(1)の本体
+ *
+ * ASPカーネルの基本的な動作を確認するためのサンプルプログラム.
+ *
+ * プログラムの概要:
+ *
+ * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,優
+ * 先度: MAIN_PRIORITY)と,3つの並列実行されるタスク(タスクID:
+ * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周
+ * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
+ *
+ * 並列実行されるタスクは,task_loop回空ループを実行する度に,タスクが
+ * 実行中であることをあらわすメッセージを表示する.
+ *
+ * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
+ * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
+ * 周期ハンドラは停止状態になっている.
+ *
+ * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
+ * 待っている間は,並列実行されるタスクが実行されている),入力された
+ * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
+ * Control-Cまたは'Q'が入力されると,プログラムを終了する.
+ *
+ * '1' : 対象タスクをTASK1に切り換える(初期設定).
+ * '2' : 対象タスクをTASK2に切り換える.
+ * '3' : 対象タスクをTASK3に切り換える.
+ * 'a' : 対象タスクをact_tskにより起動する.
+ * 'A' : 対象タスクに対する起動要求をcan_actによりキャンセルする.
+ * 'e' : 対象タスクにext_tskを呼び出させ,終了させる.
+ * 't' : 対象タスクをter_tskにより強制終了する.
+ * '>' : 対象タスクの優先度をHIGH_PRIORITYにする.
+ * '=' : 対象タスクの優先度をMID_PRIORITYにする.
+ * '<' : 対象タスクの優先度をLOW_PRIORITYにする.
+ * 'G' : 対象タスクの優先度をget_priで読み出す.
+ * 's' : 対象タスクにslp_tskを呼び出させ,起床待ちにさせる.
+ * 'S' : 対象タスクにtslp_tsk(10秒)を呼び出させ,起床待ちにさせる.
+ * 'w' : 対象タスクをwup_tskにより起床する.
+ * 'W' : 対象タスクに対する起床要求をcan_wupによりキャンセルする.
+ * 'l' : 対象タスクをrel_waiにより強制的に待ち解除にする.
+ * 'u' : 対象タスクをsus_tskにより強制待ち状態にする.
+ * 'm' : 対象タスクの強制待ち状態をrsm_tskにより解除する.
+ * 'd' : 対象タスクにdly_tsk(10秒)を呼び出させ,時間経過待ちにさせる.
+ * 'x' : 対象タスクに例外パターン0x0001の例外処理を要求する.
+ * 'X' : 対象タスクに例外パターン0x0002の例外処理を要求する.
+ * 'y' : 対象タスクにdis_texを呼び出させ,タスク例外を禁止する.
+ * 'Y' : 対象タスクにena_texを呼び出させ,タスク例外を許可する.
+ * 'r' : 3つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレ
+ * ディキューを回転させる.
+ * 'c' : 周期ハンドラを動作開始させる.
+ * 'C' : 周期ハンドラを動作停止させる.
+ * 'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
+ * 'B' : アラームハンドラを動作停止させる.
+ * 'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる).
+ * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(プログラムを
+ * 終了する).
+ * '@' : タスク3をacre_tskにより生成し,def_texによりタスク例外処理
+ * ルーチンを設定する.
+ * '!' : 対象タスクをdel_tskにより削除する.
+ * 'V' : get_utmで性能評価用システム時刻を2回読む.
+ * 'v' : 発行したシステムコールを表示する(デフォルト).
+ * 'q' : 発行したシステムコールを表示しない.
+ */
+
+#include <kernel.h>
+#include <t_syslog.h>
+#include <t_stdlib.h>
+#include "syssvc/serial.h"
+#include "syssvc/syslog.h"
+#include "kernel_cfg.h"
+#include "sample1.h"
+
+/*
+ * サービスコールのエラーのログ出力
+ */
+Inline void
+svc_perror(const char *file, int_t line, const char *expr, ER ercd)
+{
+ if (ercd < 0) {
+ t_perror(LOG_ERROR, file, line, expr, ercd);
+ }
+}
+
+#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
+
+/*
+ * 並行実行されるタスクへのメッセージ領域
+ */
+char_t message[3];
+
+/*
+ * ループ回数
+ */
+ulong_t task_loop; /* タスク内でのループ回数 */
+ulong_t tex_loop; /* 例外処理ルーチン内でのループ回数 */
+
+/*
+ * 並行実行されるタスク
+ */
+void task(intptr_t exinf)
+{
+ volatile ulong_t i;
+ int_t n = 0;
+ int_t tskno = (int_t) exinf;
+ const char *graph[] = { "|", " +", " *" };
+ char_t c;
+
+ SVC_PERROR(ena_tex());
+ while (1) {
+ syslog(LOG_NOTICE, "task%d is running (%03d). %s",
+ tskno, ++n, graph[tskno-1]);
+ for (i = 0; i < task_loop; i++);
+ c = message[tskno-1];
+ message[tskno-1] = 0;
+ switch (c) {
+ case 'e':
+ syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
+ SVC_PERROR(ext_tsk());
+ assert(0);
+ case 's':
+ syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
+ SVC_PERROR(slp_tsk());
+ break;
+ case 'S':
+ syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
+ SVC_PERROR(tslp_tsk(10000));
+ break;
+ case 'd':
+ syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
+ SVC_PERROR(dly_tsk(10000));
+ break;
+ case 'y':
+ syslog(LOG_INFO, "#%d#dis_tex()", tskno);
+ SVC_PERROR(dis_tex());
+ break;
+ case 'Y':
+ syslog(LOG_INFO, "#%d#ena_tex()", tskno);
+ SVC_PERROR(ena_tex());
+ break;
+#ifdef CPUEXC1
+ case 'z':
+ syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
+ RAISE_CPU_EXCEPTION;
+ break;
+ case 'Z':
+ SVC_PERROR(loc_cpu());
+ syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
+ RAISE_CPU_EXCEPTION;
+ SVC_PERROR(unl_cpu());
+ break;
+#endif /* CPUEXC1 */
+ default:
+ break;
+ }
+ }
+}
+
+/*
+ * 並行して実行されるタスク用のタスク例外処理ルーチン
+ */
+void tex_routine(TEXPTN texptn, intptr_t exinf)
+{
+ volatile ulong_t i;
+ int_t tskno = (int_t) exinf;
+
+ syslog(LOG_NOTICE, "task%d receives exception 0x%04x.", tskno, texptn);
+ for (i = 0; i < tex_loop; i++);
+
+ if ((texptn & 0x8000U) != 0U) {
+ syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
+ SVC_PERROR(ext_tsk());
+ assert(0);
+ }
+}
+
+/*
+ * CPU例外ハンドラ
+ */
+#ifdef CPUEXC1
+
+void
+cpuexc_handler(void *p_excinf)
+{
+ ID tskid;
+
+ syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
+ if (sns_ctx() != true) {
+ syslog(LOG_WARNING,
+ "sns_ctx() is not true in CPU exception handler.");
+ }
+ if (sns_dpn() != true) {
+ syslog(LOG_WARNING,
+ "sns_dpn() is not true in CPU exception handler.");
+ }
+ syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d sns_tex = %d",
+ sns_loc(), sns_dsp(), sns_tex());
+ syslog(LOG_INFO, "xsns_dpn = %d xsns_xpn = %d",
+ xsns_dpn(p_excinf), xsns_xpn(p_excinf));
+
+ if (xsns_xpn(p_excinf)) {
+ syslog(LOG_NOTICE, "Sample program ends with exception.");
+ SVC_PERROR(ext_ker());
+ assert(0);
+ }
+
+ SVC_PERROR(iget_tid(&tskid));
+ SVC_PERROR(iras_tex(tskid, 0x8000U));
+}
+
+#endif /* CPUEXC1 */
+
+/*
+ * 周期ハンドラ
+ *
+ * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
+ * を回転させる.
+ */
+void cyclic_handler(intptr_t exinf)
+{
+ SVC_PERROR(irot_rdq(HIGH_PRIORITY));
+ SVC_PERROR(irot_rdq(MID_PRIORITY));
+ SVC_PERROR(irot_rdq(LOW_PRIORITY));
+}
+
+/*
+ * アラームハンドラ
+ *
+ * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
+ * を回転させる.
+ */
+void alarm_handler(intptr_t exinf)
+{
+ SVC_PERROR(irot_rdq(HIGH_PRIORITY));
+ SVC_PERROR(irot_rdq(MID_PRIORITY));
+ SVC_PERROR(irot_rdq(LOW_PRIORITY));
+}
+
+/*
+ * メインタスク
+ */
+void main_task(intptr_t exinf)
+{
+ char_t c;
+ ID tskid = TASK1;
+ int_t tskno = 1;
+ ER_UINT ercd;
+ PRI tskpri;
+#ifndef TASK_LOOP
+ volatile ulong_t i;
+ SYSTIM stime1, stime2;
+#endif /* TASK_LOOP */
+#ifdef TOPPERS_SUPPORT_GET_UTM
+ SYSUTM utime1, utime2;
+#endif /* TOPPERS_SUPPORT_GET_UTM */
+ T_CTSK ctsk;
+ T_DTEX dtex;
+ ID TASK3 = -1;
+
+ SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
+ syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
+
+ /*
+ * シリアルポートの初期化
+ *
+ * システムログタスクと同じシリアルポートを使う場合など,シリアル
+ * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
+ * ない.
+ */
+ ercd = serial_opn_por(TASK_PORTID);
+ if (ercd < 0 && MERCD(ercd) != E_OBJ) {
+ syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
+ itron_strerror(ercd), SERCD(ercd));
+ }
+ SVC_PERROR(serial_ctl_por(TASK_PORTID,
+ (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
+
+ /*
+ * ループ回数の設定
+ *
+ * TASK_LOOPがマクロ定義されている場合,測定せずに,TASK_LOOPに定
+ * 義された値を,タスク内でのループ回数とする.
+ *
+ * MEASURE_TWICEがマクロ定義されている場合,1回目の測定結果を捨て
+ * て,2回目の測定結果を使う.1回目の測定は長めの時間が出るため.
+ */
+#ifdef TASK_LOOP
+ task_loop = TASK_LOOP;
+#else /* TASK_LOOP */
+
+#ifdef MEASURE_TWICE
+ task_loop = LOOP_REF;
+ SVC_PERROR(get_tim(&stime1));
+ for (i = 0; i < task_loop; i++);
+ SVC_PERROR(get_tim(&stime2));
+#endif /* MEASURE_TWICE */
+
+ task_loop = LOOP_REF;
+ SVC_PERROR(get_tim(&stime1));
+ for (i = 0; i < task_loop; i++);
+ SVC_PERROR(get_tim(&stime2));
+ task_loop = LOOP_REF * 400UL / (stime2 - stime1);
+
+#endif /* TASK_LOOP */
+ tex_loop = task_loop / 5;
+
+ /*
+ * タスクの起動
+ */
+ SVC_PERROR(act_tsk(TASK1));
+ SVC_PERROR(act_tsk(TASK2));
+
+ /*
+ * メインループ
+ */
+ do {
+ SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1));
+ switch (c) {
+ case 'e':
+ case 's':
+ case 'S':
+ case 'd':
+ case 'y':
+ case 'Y':
+ case 'z':
+ case 'Z':
+ message[tskno-1] = c;
+ break;
+ case '1':
+ tskno = 1;
+ tskid = TASK1;
+ break;
+ case '2':
+ tskno = 2;
+ tskid = TASK2;
+ break;
+ case '3':
+ tskno = 3;
+ tskid = TASK3;
+ break;
+ case 'a':
+ syslog(LOG_INFO, "#act_tsk(%d)", tskno);
+ SVC_PERROR(act_tsk(tskid));
+ break;
+ case 'A':
+ syslog(LOG_INFO, "#can_act(%d)", tskno);
+ SVC_PERROR(ercd = can_act(tskid));
+ if (ercd >= 0) {
+ syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd);
+ }
+ break;
+ case 't':
+ syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
+ SVC_PERROR(ter_tsk(tskid));
+ break;
+ case '>':
+ syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
+ SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY));
+ break;
+ case '=':
+ syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
+ SVC_PERROR(chg_pri(tskid, MID_PRIORITY));
+ break;
+ case '<':
+ syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
+ SVC_PERROR(chg_pri(tskid, LOW_PRIORITY));
+ break;
+ case 'G':
+ syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
+ SVC_PERROR(ercd = get_pri(tskid, &tskpri));
+ if (ercd >= 0) {
+ syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
+ }
+ break;
+ case 'w':
+ syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
+ SVC_PERROR(wup_tsk(tskid));
+ break;
+ case 'W':
+ syslog(LOG_INFO, "#can_wup(%d)", tskno);
+ SVC_PERROR(ercd = can_wup(tskid));
+ if (ercd >= 0) {
+ syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd);
+ }
+ break;
+ case 'l':
+ syslog(LOG_INFO, "#rel_wai(%d)", tskno);
+ SVC_PERROR(rel_wai(tskid));
+ break;
+ case 'u':
+ syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
+ SVC_PERROR(sus_tsk(tskid));
+ break;
+ case 'm':
+ syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
+ SVC_PERROR(rsm_tsk(tskid));
+ break;
+ case 'x':
+ syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno);
+ SVC_PERROR(ras_tex(tskid, 0x0001U));
+ break;
+ case 'X':
+ syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno);
+ SVC_PERROR(ras_tex(tskid, 0x0002U));
+ break;
+ case 'r':
+ syslog(LOG_INFO, "#rot_rdq(three priorities)");
+ SVC_PERROR(rot_rdq(HIGH_PRIORITY));
+ SVC_PERROR(rot_rdq(MID_PRIORITY));
+ SVC_PERROR(rot_rdq(LOW_PRIORITY));
+ break;
+ case 'c':
+ syslog(LOG_INFO, "#sta_cyc(1)");
+ SVC_PERROR(sta_cyc(CYCHDR1));
+ break;
+ case 'C':
+ syslog(LOG_INFO, "#stp_cyc(1)");
+ SVC_PERROR(stp_cyc(CYCHDR1));
+ break;
+ case 'b':
+ syslog(LOG_INFO, "#sta_alm(1, 5000)");
+ SVC_PERROR(sta_alm(ALMHDR1, 5000));
+ break;
+ case 'B':
+ syslog(LOG_INFO, "#stp_alm(1)");
+ SVC_PERROR(stp_alm(ALMHDR1));
+ break;
+ case '@':
+ ctsk.tskatr = TA_NULL;
+ ctsk.exinf = 3;
+ ctsk.task = task;
+ ctsk.itskpri = MID_PRIORITY;
+ ctsk.stksz = STACK_SIZE;
+ ctsk.stk = NULL;
+ SVC_PERROR(TASK3 = acre_tsk(&ctsk));
+
+ dtex.texatr = TA_NULL;
+ dtex.texrtn = tex_routine;
+ SVC_PERROR(def_tex(TASK3, &dtex));
+
+ syslog(LOG_NOTICE, "task3 is created with tskid = %d.",
+ (int_t) TASK3);
+ break;
+ case '!':
+ syslog(LOG_INFO, "#del_tsk(%d)", tskno);
+ SVC_PERROR(del_tsk(tskid));
+ break;
+
+ case 'V':
+#ifdef TOPPERS_SUPPORT_GET_UTM
+ SVC_PERROR(get_utm(&utime1));
+ SVC_PERROR(get_utm(&utime2));
+ syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld",
+ (ulong_t) utime1, (ulong_t) utime2);
+#else /* TOPPERS_SUPPORT_GET_UTM */
+ syslog(LOG_NOTICE, "get_utm is not supported.");
+#endif /* TOPPERS_SUPPORT_GET_UTM */
+ break;
+
+ case 'v':
+ SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO),
+ LOG_UPTO(LOG_EMERG)));
+ break;
+ case 'q':
+ SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE),
+ LOG_UPTO(LOG_EMERG)));
+ break;
+
+#ifdef BIT_KERNEL
+ case ' ':
+ SVC_PERROR(loc_cpu());
+ {
+ extern ER bit_kernel(void);
+
+ SVC_PERROR(ercd = bit_kernel());
+ if (ercd >= 0) {
+ syslog(LOG_NOTICE, "bit_kernel passed.");
+ }
+ }
+ SVC_PERROR(unl_cpu());
+ break;
+#endif /* BIT_KERNEL */
+
+ default:
+ break;
+ }
+ } while (c != '\003' && c != 'Q');
+
+ syslog(LOG_NOTICE, "Sample program ends.");
+ SVC_PERROR(ext_ker());
+ assert(0);
+}
--- /dev/null
+/*
+ * @(#) $Id: sample1.cfg 1968 2010-11-20 11:00:07Z ertl-hiro $
+ */
+
+/*
+ * サンプルプログラム(1)のシステムコンフィギュレーションファイル
+ */
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/banner.cfg");
+INCLUDE("syssvc/serial.cfg");
+INCLUDE("syssvc/logtask.cfg");
+
+#include "sample1.h"
+CRE_TSK(TASK1, { TA_NULL, 1, task, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK2, { TA_NULL, 2, task, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL });
+AID_TSK(3);
+DEF_TEX(TASK1, { TA_NULL, tex_routine });
+DEF_TEX(TASK2, { TA_NULL, tex_routine });
+CRE_CYC(CYCHDR1, { TA_NULL, 0, cyclic_handler, 2000, 0 });
+CRE_ALM(ALMHDR1, { TA_NULL, 0, alarm_handler });
+#ifdef CPUEXC1
+DEF_EXC(CPUEXC1, { TA_NULL, cpuexc_handler });
+#endif /* CPUEXC1 */
+DEF_KMM( { KMM_SIZE, NULL } );
* TOPPERS/ASP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Advanced Standard Profile Kernel
- *
+ *
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
- *
+ *
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
* 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
* に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
- *
+ *
+ * @(#) $Id: sample1.h 1968 2010-11-20 11:00:07Z ertl-hiro $
+ */
+
+/*
+ * サンプルプログラム(1)のヘッダファイル
+ */
+
+/*
+ * ターゲット依存の定義
*/
+#include "target_test.h"
/*
- * ターゲット依存部 アセンブリ言語(CQ-STARM)
+ * 各タスクの優先度の定義
*/
-#define TOPPERS_MACRO_ONLY
-#define UINT_C(val) (val)
-#define ULONG_C(val) (val)
-#include "kernel_impl.h"
-#include "cq_starm.h"
+#define MAIN_PRIORITY 5 /* メインタスクの優先度 */
+ /* HIGH_PRIORITYより高くすること */
+#define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */
+#define MID_PRIORITY 10
+#define LOW_PRIORITY 11
/*
- * 低レベルのターゲット依存の初期化
- *
- * メモリ初期化の前に呼び出される
+ * ターゲットに依存する可能性のある定数の定義
+ */
+
+#ifndef TASK_PORTID
+#define TASK_PORTID 1 /* 文字入力するシリアルポートID */
+#endif /* TASK_PORTID */
+
+#ifndef STACK_SIZE
+#define STACK_SIZE 4096 /* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
+
+#ifndef KMM_SIZE
+#define KMM_SIZE (STACK_SIZE * 16) /* カーネルが割り付ける */
+#endif /* KMM_SIZE */ /* メモリ領域のサイズ */
+
+#ifndef LOOP_REF
+#define LOOP_REF ULONG_C(1000000) /* 速度計測用のループ回数 */
+#endif /* LOOP_REF */
+
+/*
+ * 関数のプロトタイプ宣言
*/
- .cpu cortex-m3
- .fpu softvfp
- .syntax unified
- .thumb
- .text
+#ifndef TOPPERS_MACRO_ONLY
-_hardware_init_hook:
- bx r14
+extern void task(intptr_t exinf);
+extern void main_task(intptr_t exinf);
+extern void tex_routine(TEXPTN texptn, intptr_t exinf);
+#ifdef CPUEXC1
+extern void cpuexc_handler(void *p_excinf);
+#endif /* CPUEXC1 */
+extern void cyclic_handler(intptr_t exinf);
+extern void alarm_handler(intptr_t exinf);
+#endif /* TOPPERS_MACRO_ONLY */
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ * @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
*/
/*
*/
#define TKERNEL_MAKER UINT_C(0x0118) /* カーネルのメーカーコード */
#define TKERNEL_PRID UINT_C(0x0007) /* カーネルの識別番号 */
-#define TKERNEL_SPVER UINT_C(0xf512) /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER UINT_C(0x1060) /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER UINT_C(0xf513) /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER UINT_C(0x1070) /* カーネルのバージョン番号 */
/*
* キューイング回数の最大値
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: check.h 1139 2008-06-19 07:03:34Z ertl-hiro $
+ * @(#) $Id: check.h 1965 2010-11-20 07:22:43Z ertl-hiro $
*/
/*
/*
* 割込み優先度のチェック(E_PAR)
*/
-#define CHECK_INTPRI_CHGIPM(inttpri) { \
+#define CHECK_INTPRI_CHGIPM(intpri) { \
if (!VALID_INTPRI_CHGIPM(intpri)) { \
ercd = E_PAR; \
goto error_exit; \
$ Advanced Standard Profile Kernel
$
$ Copyright (C) 2007 by TAKAGI Nobuhisa
-$ Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
+$ Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
$ Graduate School of Information Science, Nagoya Univ., JAPAN
$
$ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
$ の責任を負わない.
$
-$ $Id: kernel.tf 1845 2010-07-11 13:02:57Z ertl-hiro $
+$ $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
$
$ =====================================================================
$ タスクが1個以上存在することのチェック
$IF !LENGTH(TSK.ID_LIST)$
- $ERROR$$FORMAT("no task is registered")$$END$
+ $ERROR$$FORMAT(_("no task is registered"))$$END$
$END$
$ タスクID番号の最大値
$ エラーチェック
$FOREACH tskid TSK.ID_LIST$
$ // tskatrが([TA_ACT])でない場合(E_RSATR)
- $IF (TSK.TSKATR[tskid] & ~(TA_ACT|ALT(TARGET_TSKATR,0))) != 0$
+ $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
$ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
$END$
$ スタック領域の生成とそれに関するエラーチェック
$FOREACH tskid TSK.ID_LIST$
$ // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
- $IF TSK.STKSZ[tskid] == 0 || (LENGTH(TARGET_MIN_STKSZ) &&
- TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+ $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+ && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
$END$
$ // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
- $IF !EQ(TSK.STK[tskid], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+ $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
&& (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
$END$
$ // タスク属性,拡張情報,起動番地,起動時優先度
$TAB${
$SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
- $SPC$($TSK.TASK[tskid]$), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+ $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
$ // タスク初期化コンテキストブロック,スタック領域
- $IF ALT(USE_TSKINICTXB,0)$
+ $IF USE_TSKINICTXB$
$GENERATE_TSKINICTXB(tskid)$
$ELSE$
$SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
};$NL$
$NL$
-$ タスクコントロールブロックの生成
+$ タスク管理ブロックの生成
TCB _kernel_tcb_table[TNUM_TSKID];$NL$
$NL$
};$NL$
$NL$
-$ // セマフォコントロールブロック
+$ // セマフォ管理ブロック
SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ イベントフラグ
};$NL$
$NL$
-$ // イベントフラグコントロールブロック
+$ // イベントフラグ管理ブロック
FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ データキュー
$ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
$END$
-$ // データキュー領域
+$ // データキュー管理領域
$IF DTQ.DTQCNT[dtqid]$
- static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+ static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
$END$
$END$
};$NL$
$NL$
-$ // データキューコントロールブロック
+$ // データキュー管理ブロック
DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 優先度データキュー
$ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
$END$
-$ // 優先度データキュー領域
+$ // 優先度データキュー管理領域
$IF PDQ.PDQCNT[pdqid]$
static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
$END$
};$NL$
$NL$
-$ // 優先度データキューコントロールブロック
+$ // 優先度データキュー管理ブロック
PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ メールボックス
};$NL$
$NL$
-$ // メールボックスコントロールブロック
+$ // メールボックス管理ブロック
MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ ミューテックス
};$NL$
$NL$
-$ // ミューテックスコントロールブロック
+$ // ミューテックス管理ブロック
MTXCB _kernel_mtxcb_table[TNUM_MTXID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const MTXINIB, _kernel_mtxinib_table);$NL$
TOPPERS_EMPTY_LABEL(MTXCB, _kernel_mtxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 固定長メモリプール
};$NL$
$NL$
-$ // 固定長メモリプールコントロールブロック
+$ // 固定長メモリプール管理ブロック
MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 周期ハンドラ
};$NL$
$NL$
-$ // 周期ハンドラコントロールブロック
+$ // 周期ハンドラ管理ブロック
CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ アラームハンドラ
};$NL$
$NL$
-$ // アラームハンドラコントロールブロック
+$ // アラームハンドラ管理ブロック
ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 割込み管理機能
$END$
$ // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
- $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|ALT(TARGET_INTATR,0))) != 0$
+ $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
$ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
$END$
$END$
$ // inhatrが(TA_NULL)でない場合(E_RSATR)
- $IF (INH.INHATR[inhno] & ~ALT(TARGET_INHATR,0)) != 0$
+ $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
$ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
$END$
$IF LENGTH(INTNO[INH.INHNO[inhno]])$
$intno = INTNO[INH.INHNO[inhno]]$
- $IF LENGTH(FIND(INTNO_CFGINT_VALID, intno))$
-$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
- $IF !LENGTH(INT.INTNO[intno])$
- $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+ $IF !LENGTH(INT.INTNO[intno])$
+ $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+ $ELSE$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+ $END$
$ELSE$
- $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
-$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
-$ // するintnoに対してCFG_INTで設定された割込み優先度が
-$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
- $IF INT.INTPRI[intno] < TMIN_INTPRI$
- $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
- $END$
- $ELSE$
-$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
-$ // するintnoに対してCFG_INTで設定された割込み優先度が
-$ // TMIN_INTPRI以上である場合(E_OBJ)
- $IF INT.INTPRI[intno] >= TMIN_INTPRI$
- $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
- $END$
+$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRI以上である場合(E_OBJ)
+ $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
$END$
$END$
$END$
$ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
$FOREACH order ISR.ORDER_LIST$
$ // isratrが(TA_NULL)でない場合(E_RSATR)
- $IF (ISR.ISRATR[order] & ~ALT(TARGET_ISRATR,0)) != 0$
- $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "isratr", ISR.ISRATR[order], "isr", ISR.ISR[order], "ATT_ISR")$$END$
+ $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+ $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
$END$
$ // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
$ 割込み管理機能のための標準的な初期化情報の生成
$
$ 割込みハンドラの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINIB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
$ 割込みハンドラ数
#define TNUM_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$ 割込み要求ラインの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINTB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
$ 割込み要求ライン数
#define TNUM_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$
$END$
$ // excatrが(TA_NULL)でない場合(E_RSATR)
- $IF (EXC.EXCATR[excno] & ~ALT(TARGET_EXCATR,0)) != 0$
+ $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
$ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
$END$
$i = i + 1$
$END$
$ CPU例外ハンドラのための標準的な初期化情報の生成
-$IF !ALT(OMIT_INITIALIZE_EXCEPTION,0)$
+$IF !OMIT_INITIALIZE_EXCEPTION$
$ CPU例外ハンドラ数
#define TNUM_EXCNO $LENGTH(EXC.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$
$END$
$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
- $IF !EQ(ICS.ISTK[1], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+ $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
&& (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
$ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
$END$
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
TA_NULL,TA_NULL
TA_ACT,TA_ACT
TA_TPRI,TA_TPRI
OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
sizeof_ID,sizeof(ID)
sizeof_uint_t,sizeof(uint_t)
sizeof_SIZE,sizeof(SIZE)
sizeof_VP,sizeof(void*)
sizeof_intptr_t,sizeof(intptr_t)
sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
sizeof_TINIB,sizeof(TINIB)
offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
-sizeof_INHNO,sizeof(INHNO)
-sizeof_INTNO,sizeof(INTNO)
-sizeof_EXCNO,sizeof(EXCNO)
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
p_runtsk
p_schedtsk
reqflg
+ipmflg
disdsp
dspflg
ready_queue
#define p_runtsk _kernel_p_runtsk
#define p_schedtsk _kernel_p_schedtsk
#define reqflg _kernel_reqflg
+#define ipmflg _kernel_ipmflg
#define disdsp _kernel_disdsp
#define dspflg _kernel_dspflg
#define ready_queue _kernel_ready_queue
#define _p_runtsk __kernel_p_runtsk
#define _p_schedtsk __kernel_p_schedtsk
#define _reqflg __kernel_reqflg
+#define _ipmflg __kernel_ipmflg
#define _disdsp __kernel_disdsp
#define _dspflg __kernel_dspflg
#define _ready_queue __kernel_ready_queue
#undef p_runtsk
#undef p_schedtsk
#undef reqflg
+#undef ipmflg
#undef disdsp
#undef dspflg
#undef ready_queue
#undef _p_runtsk
#undef _p_schedtsk
#undef _reqflg
+#undef _ipmflg
#undef _disdsp
#undef _dspflg
#undef _ready_queue
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Advanced Standard Profile Kernel
*
- * Copyright (C) 2005-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: mutex.h 1694 2010-01-01 15:59:09Z ertl-hiro $
+ * @(#) $Id: mutex.h 1910 2010-08-25 06:30:21Z ertl-hiro $
*/
/*
* 態のタスクがある場合には,そのタスクにミューテックスをロックさせる.
*
* この関数は,タスクの終了時に使われるものであるため,p_tcbで指定され
- * ã\82\8bã\82¿ã\82¹ã\82¯ã\81®å\84ªå\85\88度ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bå\87¦ç\90\86ã\81¯è¡\8cã\82\8fã\81ªã\81\84ï¼\8eã\81\93ã\81®é\96¢æ\95°ã\81®ä¸ã\81§ã\82¿ã\82¹ã\82¯ã\81®å\84ª
- * 先度が変化し,実行すべきタスクが変わることがある.そのため,この関
- * 数から戻った後に,ディスパッチが必要か判別して,必要な場合にはディ
- * スパッチを行わなければならない.
+ * ã\82\8bã\82¿ã\82¹ã\82¯ã\81®å\84ªå\85\88度ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bå\87¦ç\90\86ã\81¯è¡\8cã\82\8fã\81ªã\81\84ï¼\8eã\81\9fã\81 ã\81\97ï¼\8cã\81\93ã\81®é\96¢æ\95°ã\81®ä¸ã\81§ä»\96
+ * のタスクの優先度が変化し,実行すべきタスクが変わることがある.その
+ * ため,この関数から戻った後に,ディスパッチが必要か判別して,必要な
+ * 場合にはディスパッチを行わなければならない.
*/
extern bool_t (*mtxhook_release_all)(TCB *p_tcb);
extern bool_t mutex_release_all(TCB *p_tcb);
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: sys_manage.c 762 2008-03-07 23:51:41Z hiro $
+ * @(#) $Id: sys_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
*/
/*
t_lock_cpu();
disdsp = false;
- if (t_get_ipm() == TIPM_ENAALL) {
+ if (ipmflg) {
dspflg = true;
if (p_runtsk != p_schedtsk) {
dispatch();
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: task.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ * $Id: task.c 2018 2010-12-31 13:43:05Z ertl-hiro $
*/
/*
bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*/
bool_t disdsp;
p_runtsk = p_schedtsk = NULL;
reqflg = false;
+ ipmflg = true;
disdsp = false;
dspflg = true;
* サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
* は,PRIMAP_BITをマクロ定義すればよい.
*
- * また,標準ライブラリにffsがあるなら,次のように定義して標準ライブ
- * ラリを使った方が効率が良い可能性もある.
+ * また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ * 使った方が効率が良い可能性もある.
* #define bitmap_search(bitmap) (ffs(bitmap) - 1)
*/
#ifndef PRIMAP_BIT
call_texrtn(void)
{
TEXPTN texptn;
- PRI saved_ipm;
- bool_t saved_disdsp, saved_dspflg;
+ bool_t saved_disdsp;
- saved_ipm = t_get_ipm();
saved_disdsp = disdsp;
- saved_dspflg = dspflg;
p_runtsk->enatex = false;
do {
texptn = p_runtsk->texptn;
if (!t_sense_lock()) {
t_lock_cpu();
}
- t_set_ipm(saved_ipm);
+ if (!ipmflg) {
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
disdsp = saved_disdsp;
- dspflg = saved_dspflg;
- /*
- * ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
- * チンから,タスク例外処理許可状態のままリターンした場合の対
- * 策である.
- */
+ dspflg = !disdsp;
p_runtsk->enatex = false;
if (p_runtsk != p_schedtsk && dspflg) {
/*
* ここでdispatchを呼び出す処理は,相互再帰呼出しになって
- * いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+ * いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
* おけば支障がない.その理由については,「TOPPERS/ASP カー
* ネル 設計メモ」を参照のこと.
*/
void
calltex(void)
{
- if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
call_texrtn();
}
}
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: task.h 1863 2010-07-25 12:23:05Z ertl-hiro $
+ * $Id: task.h 2018 2010-12-31 13:43:05Z ertl-hiro $
*/
/*
extern bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ *
+ * 割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*
* ディスパッチ禁止状態であることを示すフラグ.
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: task_manage.c 1694 2010-01-01 15:59:09Z ertl-hiro $
+ * @(#) $Id: task_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
*/
/*
*/
disdsp = false;
}
- if (t_get_ipm() != TIPM_ENAALL) {
+ if (!ipmflg) {
/*
* 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
* が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
* る.
*/
t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
}
dspflg = true;
(void) make_active(p_runtsk);
}
exit_and_dispatch();
- return(E_SYS);
+ ercd = E_SYS;
error_exit:
LOG_EXT_TSK_LEAVE(ercd);
#endif /* TOPPERS_ter_tsk */
/*
- * タスク優先度の変更
+ * タスクのベース優先度の変更
*/
#ifdef TOPPERS_chg_pri
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ * @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
*/
/*
*/
#define TKERNEL_MAKER UINT_C(0x0118) /* カーネルのメーカーコード */
#define TKERNEL_PRID UINT_C(0x0007) /* カーネルの識別番号 */
-#define TKERNEL_SPVER UINT_C(0xf512) /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER UINT_C(0x1060) /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER UINT_C(0xf513) /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER UINT_C(0x1070) /* カーネルのバージョン番号 */
/*
* キューイング回数の最大値
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: check.h 1717 2010-01-31 11:41:03Z ertl-hiro $
+ * @(#) $Id: check.h 1965 2010-11-20 07:22:43Z ertl-hiro $
*/
/*
/*
* 割込み優先度のチェック(E_PAR)
*/
-#define CHECK_INTPRI_CHGIPM(inttpri) { \
+#define CHECK_INTPRI_CHGIPM(intpri) { \
if (!VALID_INTPRI_CHGIPM(intpri)) { \
ercd = E_PAR; \
goto error_exit; \
$ Advanced Standard Profile Kernel
$
$ Copyright (C) 2007 by TAKAGI Nobuhisa
-$ Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
+$ Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
$ Graduate School of Information Science, Nagoya Univ., JAPAN
$
$ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
$ の責任を負わない.
$
-$ $Id: kernel.tf 1845 2010-07-11 13:02:57Z ertl-hiro $
+$ $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
$
$ =====================================================================
$ タスクが1個以上存在することのチェック
$IF !LENGTH(TSK.ID_LIST)$
- $ERROR$$FORMAT("no task is registered")$$END$
+ $ERROR$$FORMAT(_("no task is registered"))$$END$
$END$
$ タスクID番号の最大値
$ エラーチェック
$FOREACH tskid TSK.ID_LIST$
$ // tskatrが([TA_ACT])でない場合(E_RSATR)
- $IF (TSK.TSKATR[tskid] & ~(TA_ACT|ALT(TARGET_TSKATR,0))) != 0$
+ $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
$ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
$END$
$ スタック領域の生成とそれに関するエラーチェック
$FOREACH tskid TSK.ID_LIST$
$ // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
- $IF TSK.STKSZ[tskid] == 0 || (LENGTH(TARGET_MIN_STKSZ) &&
- TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+ $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+ && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
$END$
$ // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
- $IF !EQ(TSK.STK[tskid], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+ $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
&& (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
$END$
$ // タスク属性,拡張情報,起動番地,起動時優先度
$TAB${
$SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
- $SPC$($TSK.TASK[tskid]$), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+ $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
$ // タスク初期化コンテキストブロック,スタック領域
- $IF ALT(USE_TSKINICTXB,0)$
+ $IF USE_TSKINICTXB$
$GENERATE_TSKINICTXB(tskid)$
$ELSE$
$SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
};$NL$
$NL$
-$ タスクコントロールブロックの生成
+$ タスク管理ブロックの生成
TCB _kernel_tcb_table[TNUM_TSKID];$NL$
$NL$
};$NL$
$NL$
-$ // セマフォコントロールブロック
+$ // セマフォ管理ブロック
SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ イベントフラグ
};$NL$
$NL$
-$ // イベントフラグコントロールブロック
+$ // イベントフラグ管理ブロック
FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ データキュー
$ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
$END$
-$ // データキュー領域
+$ // データキュー管理領域
$IF DTQ.DTQCNT[dtqid]$
- static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+ static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
$END$
$END$
};$NL$
$NL$
-$ // データキューコントロールブロック
+$ // データキュー管理ブロック
DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 優先度データキュー
$ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
$END$
-$ // 優先度データキュー領域
+$ // 優先度データキュー管理領域
$IF PDQ.PDQCNT[pdqid]$
static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
$END$
};$NL$
$NL$
-$ // 優先度データキューコントロールブロック
+$ // 優先度データキュー管理ブロック
PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ メールボックス
};$NL$
$NL$
-$ // メールボックスコントロールブロック
+$ // メールボックス管理ブロック
MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 固定長メモリプール
};$NL$
$NL$
-$ // 固定長メモリプールコントロールブロック
+$ // 固定長メモリプール管理ブロック
MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 周期ハンドラ
};$NL$
$NL$
-$ // 周期ハンドラコントロールブロック
+$ // 周期ハンドラ管理ブロック
CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ アラームハンドラ
};$NL$
$NL$
-$ // アラームハンドラコントロールブロック
+$ // アラームハンドラ管理ブロック
ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ オーバランハンドラ
$END$
$ // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
- $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|ALT(TARGET_INTATR,0))) != 0$
+ $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
$ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
$END$
$END$
$ // inhatrが(TA_NULL)でない場合(E_RSATR)
- $IF (INH.INHATR[inhno] & ~ALT(TARGET_INHATR,0)) != 0$
+ $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
$ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
$END$
$IF LENGTH(INTNO[INH.INHNO[inhno]])$
$intno = INTNO[INH.INHNO[inhno]]$
- $IF LENGTH(FIND(INTNO_CFGINT_VALID, intno))$
-$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
- $IF !LENGTH(INT.INTNO[intno])$
- $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+ $IF !LENGTH(INT.INTNO[intno])$
+ $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+ $ELSE$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+ $END$
$ELSE$
- $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
-$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
-$ // するintnoに対してCFG_INTで設定された割込み優先度が
-$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
- $IF INT.INTPRI[intno] < TMIN_INTPRI$
- $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
- $END$
- $ELSE$
-$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
-$ // するintnoに対してCFG_INTで設定された割込み優先度が
-$ // TMIN_INTPRI以上である場合(E_OBJ)
- $IF INT.INTPRI[intno] >= TMIN_INTPRI$
- $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
- $END$
+$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRI以上である場合(E_OBJ)
+ $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
$END$
$END$
$END$
$ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
$FOREACH order ISR.ORDER_LIST$
$ // isratrが(TA_NULL)でない場合(E_RSATR)
- $IF (ISR.ISRATR[order] & ~ALT(TARGET_ISRATR,0)) != 0$
- $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "isratr", ISR.ISRATR[order], "isr", ISR.ISR[order], "ATT_ISR")$$END$
+ $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+ $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
$END$
$ // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
$ 割込み管理機能のための標準的な初期化情報の生成
$
$ 割込みハンドラの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINIB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
$ 割込みハンドラ数
#define TNUM_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$ 割込み要求ラインの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINTB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
$ 割込み要求ライン数
#define TNUM_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$
$END$
$ // excatrが(TA_NULL)でない場合(E_RSATR)
- $IF (EXC.EXCATR[excno] & ~ALT(TARGET_EXCATR,0)) != 0$
+ $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
$ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
$END$
$i = i + 1$
$END$
$ CPU例外ハンドラのための標準的な初期化情報の生成
-$IF !ALT(OMIT_INITIALIZE_EXCEPTION,0)$
+$IF !OMIT_INITIALIZE_EXCEPTION$
$ CPU例外ハンドラ数
#define TNUM_EXCNO $LENGTH(EXC.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$
$END$
$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
- $IF !EQ(ICS.ISTK[1], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+ $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
&& (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
$ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
$END$
$IF LENGTH(MPF.ID_LIST)$ _kernel_initialize_mempfix();$NL$$END$
$IF LENGTH(CYC.ID_LIST)$ _kernel_initialize_cyclic();$NL$$END$
$IF LENGTH(ALM.ID_LIST)$ _kernel_initialize_alarm();$NL$$END$
+#ifdef TOPPERS_SUPPORT_OVRHDR$NL$
$TAB$_kernel_initialize_overrun();$NL$
+#endif /* TOPPERS_SUPPORT_OVRHDR */$NL$
$TAB$_kernel_initialize_interrupt();$NL$
$TAB$_kernel_initialize_exception();$NL$
}$NL$
p_runtsk
p_schedtsk
reqflg
+ipmflg
disdsp
dspflg
ready_queue
#define p_runtsk _kernel_p_runtsk
#define p_schedtsk _kernel_p_schedtsk
#define reqflg _kernel_reqflg
+#define ipmflg _kernel_ipmflg
#define disdsp _kernel_disdsp
#define dspflg _kernel_dspflg
#define ready_queue _kernel_ready_queue
#define _p_runtsk __kernel_p_runtsk
#define _p_schedtsk __kernel_p_schedtsk
#define _reqflg __kernel_reqflg
+#define _ipmflg __kernel_ipmflg
#define _disdsp __kernel_disdsp
#define _dspflg __kernel_dspflg
#define _ready_queue __kernel_ready_queue
#undef p_runtsk
#undef p_schedtsk
#undef reqflg
+#undef ipmflg
#undef disdsp
#undef dspflg
#undef ready_queue
#undef _p_runtsk
#undef _p_schedtsk
#undef _reqflg
+#undef _ipmflg
#undef _disdsp
#undef _dspflg
#undef _ready_queue
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: overrun.c 1723 2010-01-31 13:05:57Z ertl-hiro $
+ * @(#) $Id: overrun.c 1902 2010-08-17 22:38:52Z ertl-hiro $
*/
/*
i_lock_cpu();
p_tcb->leftotm = 0U;
ercd = E_OK;
- t_unlock_cpu();
+ i_unlock_cpu();
error_exit:
LOG_ISTP_OVR_LEAVE(ercd);
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: task.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ * $Id: task.c 2044 2011-03-06 11:48:03Z ertl-hiro $
*/
/*
bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*/
bool_t disdsp;
p_runtsk = p_schedtsk = NULL;
reqflg = false;
+ ipmflg = true;
disdsp = false;
dspflg = true;
* サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
* は,PRIMAP_BITをマクロ定義すればよい.
*
- * また,標準ライブラリにffsがあるなら,次のように定義して標準ライブ
- * ラリを使った方が効率が良い可能性もある.
+ * また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ * 使った方が効率が良い可能性もある.
* #define bitmap_search(bitmap) (ffs(bitmap) - 1)
*/
#ifndef PRIMAP_BIT
p_tcb->wupque = false;
p_tcb->enatex = false;
p_tcb->texptn = 0U;
+#ifdef TOPPERS_SUPPORT_OVRTIM
p_tcb->leftotm = 0U;
+#endif /* TOPPERS_SUPPORT_OVRTIM */
LOG_TSKSTAT(p_tcb);
}
call_texrtn(void)
{
TEXPTN texptn;
- PRI saved_ipm;
- bool_t saved_disdsp, saved_dspflg;
+ bool_t saved_disdsp;
- saved_ipm = t_get_ipm();
saved_disdsp = disdsp;
- saved_dspflg = dspflg;
p_runtsk->enatex = false;
do {
texptn = p_runtsk->texptn;
if (!t_sense_lock()) {
t_lock_cpu();
}
- t_set_ipm(saved_ipm);
+ if (!ipmflg) {
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
disdsp = saved_disdsp;
- dspflg = saved_dspflg;
- /*
- * ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
- * チンから,タスク例外処理許可状態のままリターンした場合の対
- * 策である.
- */
+ dspflg = !disdsp;
p_runtsk->enatex = false;
if (p_runtsk != p_schedtsk && dspflg) {
/*
* ここでdispatchを呼び出す処理は,相互再帰呼出しになって
- * いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+ * いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
* おけば支障がない.その理由については,「TOPPERS/ASP カー
* ネル 設計メモ」を参照のこと.
*/
void
calltex(void)
{
- if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
call_texrtn();
}
}
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: task.h 1863 2010-07-25 12:23:05Z ertl-hiro $
+ * @(#) $Id: task.h 2044 2011-03-06 11:48:03Z ertl-hiro $
*/
/*
TEXPTN texptn; /* 保留例外要因 */
WINFO *p_winfo; /* 待ち情報ブロックへのポインタ */
+#ifdef TOPPERS_SUPPORT_OVRTIM
OVRTIM leftotm; /* 残りプロセッサ時間 */
+#endif /* TOPPERS_SUPPORT_OVRTIM */
TSKCTXB tskctxb; /* タスクコンテキストブロック */
} TCB;
extern bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ *
+ * 割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*
* ディスパッチ禁止状態であることを示すフラグ.
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: task_manage.c 1717 2010-01-31 11:41:03Z ertl-hiro $
+ * @(#) $Id: task_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
*/
/*
*/
disdsp = false;
}
- if (t_get_ipm() != TIPM_ENAALL) {
+ if (!ipmflg) {
/*
* 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
* が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
* る.
*/
t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
}
dspflg = true;
(void) make_active(p_runtsk);
}
exit_and_dispatch();
- return(E_SYS);
+ ercd = E_SYS;
error_exit:
LOG_EXT_TSK_LEAVE(ercd);
#endif /* TOPPERS_ter_tsk */
/*
- * タスク優先度の変更
+ * タスクのベース優先度の変更
*/
#ifdef TOPPERS_chg_pri
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: sample1.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ * @(#) $Id: sample1.c 1932 2010-09-19 06:57:36Z ertl-hiro $
*/
/*
int_t tskno = (int_t) exinf;
const char *graph[] = { "| ", " + ", " *" };
char_t c;
+#ifdef TOPPERS_SUPPORT_OVRHDR
T_ROVR pk_rovr;
+#endif /* TOPPERS_SUPPORT_OVRHDR */
SVC_PERROR(ena_tex());
while (1) {
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ * @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
*/
/*
*/
#define TKERNEL_MAKER UINT_C(0x0118) /* カーネルのメーカーコード */
#define TKERNEL_PRID UINT_C(0x0007) /* カーネルの識別番号 */
-#define TKERNEL_SPVER UINT_C(0xf512) /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER UINT_C(0x1060) /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER UINT_C(0xf513) /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER UINT_C(0x1070) /* カーネルのバージョン番号 */
/*
* キューイング回数の最大値
p_runtsk
p_schedtsk
reqflg
+ipmflg
disdsp
dspflg
ready_queue
#define p_runtsk _kernel_p_runtsk
#define p_schedtsk _kernel_p_schedtsk
#define reqflg _kernel_reqflg
+#define ipmflg _kernel_ipmflg
#define disdsp _kernel_disdsp
#define dspflg _kernel_dspflg
#define ready_queue _kernel_ready_queue
#define _p_runtsk __kernel_p_runtsk
#define _p_schedtsk __kernel_p_schedtsk
#define _reqflg __kernel_reqflg
+#define _ipmflg __kernel_ipmflg
#define _disdsp __kernel_disdsp
#define _dspflg __kernel_dspflg
#define _ready_queue __kernel_ready_queue
#undef p_runtsk
#undef p_schedtsk
#undef reqflg
+#undef ipmflg
#undef disdsp
#undef dspflg
#undef ready_queue
#undef _p_runtsk
#undef _p_schedtsk
#undef _reqflg
+#undef _ipmflg
#undef _disdsp
#undef _dspflg
#undef _ready_queue
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: task.c 1812 2010-06-27 13:07:15Z ertl-hiro $
+ * $Id: task.c 2018 2010-12-31 13:43:05Z ertl-hiro $
*/
/*
bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*/
bool_t disdsp;
p_runtsk = p_schedtsk = NULL;
reqflg = false;
+ ipmflg = true;
disdsp = false;
dspflg = true;
* サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
* は,PRIMAP_BITをマクロ定義すればよい.
*
- * また,標準ライブラリにffsがあるなら,次のように定義して標準ライブ
- * ラリを使った方が効率が良い可能性もある.
+ * また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ * 使った方が効率が良い可能性もある.
* #define bitmap_search(bitmap) (ffs(bitmap) - 1)
*/
#ifndef PRIMAP_BIT
call_texrtn(void)
{
TEXPTN texptn;
- PRI saved_ipm;
- bool_t saved_disdsp, saved_dspflg;
+ bool_t saved_disdsp;
- saved_ipm = t_get_ipm();
saved_disdsp = disdsp;
- saved_dspflg = dspflg;
p_runtsk->enatex = false;
do {
texptn = p_runtsk->texptn;
if (!t_sense_lock()) {
t_lock_cpu();
}
- t_set_ipm(saved_ipm);
+ if (!ipmflg) {
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
disdsp = saved_disdsp;
- dspflg = saved_dspflg;
- /*
- * ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
- * チンから,タスク例外処理許可状態のままリターンした場合の対
- * 策である.
- */
+ dspflg = !disdsp;
p_runtsk->enatex = false;
if (p_runtsk != p_schedtsk && dspflg) {
/*
* ここでdispatchを呼び出す処理は,相互再帰呼出しになって
- * いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+ * いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
* おけば支障がない.その理由については,「TOPPERS/ASP カー
* ネル 設計メモ」を参照のこと.
*/
void
calltex(void)
{
- if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
call_texrtn();
}
}
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: task.h 1863 2010-07-25 12:23:05Z ertl-hiro $
+ * $Id: task.h 2018 2010-12-31 13:43:05Z ertl-hiro $
*/
/*
extern bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ *
+ * 割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*
* ディスパッチ禁止状態であることを示すフラグ.
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2004-2010 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.h 1959 2010-11-20 02:17:27Z ertl-hiro $
+ */
+
+/*
+ * TOPPERS/ASPカーネル 標準ヘッダファイル
+ *
+ * TOPPERS/ASPカーネルがサポートするサービスコールの宣言と,必要なデー
+ * タ型,定数,マクロの定義を含むヘッダファイル.
+ *
+ * アセンブリ言語のソースファイルからこのファイルをインクルードする時
+ * は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
+ * 除くようになっている.
+ *
+ * このファイルをインクルードする前にインクルードしておくべきファイル
+ * はない.
+ */
+
+#ifndef TOPPERS_KERNEL_H
+#define TOPPERS_KERNEL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * TOPPERS共通のデータ型・定数・マクロ
+ */
+#include <t_stddef.h>
+
+/*
+ * ターゲット依存部
+ */
+#include "target_kernel.h"
+
+#ifndef TOPPERS_MACRO_ONLY
+
+/*
+ * データ型の定義
+ */
+
+/*
+ * ビットパターンやオブジェクト番号の型定義
+ */
+typedef uint_t TEXPTN; /* タスク例外要因のビットパターン */
+typedef uint_t FLGPTN; /* イベントフラグのビットパターン */
+typedef uint_t INTNO; /* 割込み番号 */
+typedef uint_t INHNO; /* 割込みハンドラ番号 */
+typedef uint_t EXCNO; /* CPU例外ハンドラ番号 */
+
+/*
+ * 処理単位の型定義
+ */
+typedef void (*TASK)(intptr_t exinf);
+typedef void (*TEXRTN)(TEXPTN texptn, intptr_t exinf);
+typedef void (*CYCHDR)(intptr_t exinf);
+typedef void (*ALMHDR)(intptr_t exinf);
+typedef void (*ISR)(intptr_t exinf);
+typedef void (*INTHDR)(void);
+typedef void (*EXCHDR)(void *p_excinf);
+typedef void (*INIRTN)(intptr_t exinf);
+typedef void (*TERRTN)(intptr_t exinf);
+
+/*
+ * メモリ領域確保のための型定義
+ */
+#ifndef TOPPERS_STK_T
+#define TOPPERS_STK_T intptr_t
+#endif /* TOPPERS_STK_T */
+typedef TOPPERS_STK_T STK_T; /* スタック領域を確保するための型 */
+
+#ifndef TOPPERS_MPF_T
+#define TOPPERS_MPF_T intptr_t
+#endif /* TOPPERS_MPF_T */
+typedef TOPPERS_MPF_T MPF_T; /* 固定長メモリプール領域を確保するための型 */
+
+/*
+ * メッセージヘッダの型定義
+ */
+typedef struct t_msg { /* メールボックスのメッセージヘッダ */
+ struct t_msg *pk_next;
+} T_MSG;
+
+typedef struct t_msg_pri { /* 優先度付きメッセージヘッダ */
+ T_MSG msgque; /* メッセージヘッダ */
+ PRI msgpri; /* メッセージ優先度 */
+} T_MSG_PRI;
+
+/*
+ * パケット形式の定義
+ */
+typedef struct t_rtsk {
+ STAT tskstat; /* タスク状態 */
+ PRI tskpri; /* タスクの現在優先度 */
+ PRI tskbpri; /* タスクのベース優先度 */
+ STAT tskwait; /* 待ち要因 */
+ ID wobjid; /* 待ち対象のオブジェクトのID */
+ TMO lefttmo; /* タイムアウトするまでの時間 */
+ uint_t actcnt; /* 起動要求キューイング数 */
+ uint_t wupcnt; /* 起床要求キューイング数 */
+} T_RTSK;
+
+typedef struct t_rtex {
+ STAT texstat; /* タスク例外処理の状態 */
+ TEXPTN pndptn; /* 保留例外要因 */
+} T_RTEX;
+
+typedef struct t_rsem {
+ ID wtskid; /* セマフォの待ち行列の先頭のタスクのID番号 */
+ uint_t semcnt; /* セマフォの現在の資源数 */
+} T_RSEM;
+
+typedef struct t_rflg {
+ ID wtskid; /* イベントフラグの待ち行列の先頭のタスクのID番号 */
+ FLGPTN flgptn; /* イベントフラグの現在のビットパターン */
+} T_RFLG;
+
+typedef struct t_rdtq {
+ ID stskid; /* データキューの送信待ち行列の先頭のタスクのID番号 */
+ ID rtskid; /* データキューの受信待ち行列の先頭のタスクのID番号 */
+ uint_t sdtqcnt; /* データキュー管理領域に格納されているデータの数 */
+} T_RDTQ;
+
+typedef struct t_rpdq {
+ ID stskid; /* 優先度データキューの送信待ち行列の先頭のタスク
+ のID番号 */
+ ID rtskid; /* 優先度データキューの受信待ち行列の先頭のタスク
+ のID番号 */
+ uint_t spdqcnt; /* 優先度データキュー管理領域に格納されているデー
+ タの数 */
+} T_RPDQ;
+
+typedef struct t_rmbx {
+ ID wtskid; /* メールボックスの待ち行列の先頭のタスクのID番号 */
+ T_MSG *pk_msg; /* メッセージキューの先頭につながれたメッセージ
+ の先頭番地 */
+} T_RMBX;
+
+typedef struct t_rmpf {
+ ID wtskid; /* 固定長メモリプールの待ち行列の先頭のタスクの
+ ID番号 */
+ uint_t fblkcnt; /* 固定長メモリプール領域の空きメモリ領域に割り
+ 付けることができる固定長メモリブロックの数 */
+} T_RMPF;
+
+typedef struct t_rcyc {
+ STAT cycstat; /* 周期ハンドラの動作状態 */
+ RELTIM lefttim; /* 次に周期ハンドラを起動する時刻までの相対時間 */
+} T_RCYC;
+
+typedef struct t_ralm {
+ STAT almstat; /* アラームハンドラの動作状態 */
+ RELTIM lefttim; /* アラームハンドラを起動する時刻までの相対時間 */
+} T_RALM;
+
+/*
+ * サービスコールの宣言
+ */
+
+/*
+ * タスク管理機能
+ */
+extern ER act_tsk(ID tskid) throw();
+extern ER iact_tsk(ID tskid) throw();
+extern ER_UINT can_act(ID tskid) throw();
+extern ER ext_tsk(void) throw();
+extern ER ter_tsk(ID tskid) throw();
+extern ER chg_pri(ID tskid, PRI tskpri) throw();
+extern ER ras_pri(PRI tskpri) throw();
+extern ER get_pri(ID tskid, PRI *p_tskpri) throw();
+extern ER get_inf(intptr_t *p_exinf) throw();
+extern ER ref_tsk(ID tskid, T_RTSK *pk_rtsk) throw();
+
+/*
+ * タスク付属同期機能
+ */
+extern ER slp_tsk(void) throw();
+extern ER tslp_tsk(TMO tmout) throw();
+extern ER wup_tsk(ID tskid) throw();
+extern ER iwup_tsk(ID tskid) throw();
+extern ER_UINT can_wup(ID tskid) throw();
+extern ER rel_wai(ID tskid) throw();
+extern ER irel_wai(ID tskid) throw();
+extern ER sus_tsk(ID tskid) throw();
+extern ER rsm_tsk(ID tskid) throw();
+extern ER dly_tsk(RELTIM dlytim) throw();
+
+/*
+ * タスク例外処理機能
+ */
+extern ER ras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER iras_tex(ID tskid, TEXPTN rasptn) throw();
+extern ER dis_tex(void) throw();
+extern ER ena_tex(void) throw();
+extern bool_t sns_tex(void) throw();
+extern ER ref_tex(ID tskid, T_RTEX *pk_rtex) throw();
+
+/*
+ * 同期・通信機能
+ */
+extern ER sig_sem(ID semid) throw();
+extern ER isig_sem(ID semid) throw();
+extern ER wai_sem(ID semid) throw();
+extern ER pol_sem(ID semid) throw();
+extern ER twai_sem(ID semid, TMO tmout) throw();
+extern ER ini_sem(ID semid) throw();
+extern ER ref_sem(ID semid, T_RSEM *pk_rsem) throw();
+
+extern ER set_flg(ID flgid, FLGPTN setptn) throw();
+extern ER iset_flg(ID flgid, FLGPTN setptn) throw();
+extern ER clr_flg(ID flgid, FLGPTN clrptn) throw();
+extern ER wai_flg(ID flgid, FLGPTN waiptn,
+ MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER pol_flg(ID flgid, FLGPTN waiptn,
+ MODE wfmode, FLGPTN *p_flgptn) throw();
+extern ER twai_flg(ID flgid, FLGPTN waiptn,
+ MODE wfmode, FLGPTN *p_flgptn, TMO tmout) throw();
+extern ER ini_flg(ID flgid) throw();
+extern ER ref_flg(ID flgid, T_RFLG *pk_rflg) throw();
+
+extern ER snd_dtq(ID dtqid, intptr_t data) throw();
+extern ER psnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER ipsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) throw();
+extern ER fsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER ifsnd_dtq(ID dtqid, intptr_t data) throw();
+extern ER rcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER prcv_dtq(ID dtqid, intptr_t *p_data) throw();
+extern ER trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) throw();
+extern ER ini_dtq(ID dtqid) throw();
+extern ER ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) throw();
+
+extern ER snd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER psnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) throw();
+extern ER tsnd_pdq(ID pdqid, intptr_t data,
+ PRI datapri, TMO tmout) throw();
+extern ER rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) throw();
+extern ER trcv_pdq(ID pdqid, intptr_t *p_data,
+ PRI *p_datapri, TMO tmout) throw();
+extern ER ini_pdq(ID pdqid) throw();
+extern ER ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) throw();
+
+extern ER snd_mbx(ID mbxid, T_MSG *pk_msg) throw();
+extern ER rcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER prcv_mbx(ID mbxid, T_MSG **ppk_msg) throw();
+extern ER trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) throw();
+extern ER ini_mbx(ID mbxid) throw();
+extern ER ref_mbx(ID mbxid, T_RMBX *pk_rmbx) throw();
+
+/*
+ * メモリプール管理機能
+ */
+extern ER get_mpf(ID mpfid, void **p_blk) throw();
+extern ER pget_mpf(ID mpfid, void **p_blk) throw();
+extern ER tget_mpf(ID mpfid, void **p_blk, TMO tmout) throw();
+extern ER rel_mpf(ID mpfid, void *blk) throw();
+extern ER ini_mpf(ID mpfid) throw();
+extern ER ref_mpf(ID mpfid, T_RMPF *pk_rmpf) throw();
+
+/*
+ * 時間管理機能
+ */
+extern ER get_tim(SYSTIM *p_systim) throw();
+extern ER get_utm(SYSUTM *p_sysutm) throw();
+
+extern ER sta_cyc(ID cycid) throw();
+extern ER stp_cyc(ID cycid) throw();
+extern ER ref_cyc(ID cycid, T_RCYC *pk_rcyc) throw();
+
+extern ER sta_alm(ID almid, RELTIM almtim) throw();
+extern ER ista_alm(ID almid, RELTIM almtim) throw();
+extern ER stp_alm(ID almid) throw();
+extern ER istp_alm(ID almid) throw();
+extern ER ref_alm(ID almid, T_RALM *pk_ralm) throw();
+
+/*
+ * システム状態管理機能
+ */
+extern ER rot_rdq(PRI tskpri) throw();
+extern ER irot_rdq(PRI tskpri) throw();
+extern ER get_tid(ID *p_tskid) throw();
+extern ER iget_tid(ID *p_tskid) throw();
+extern ER loc_cpu(void) throw();
+extern ER iloc_cpu(void) throw();
+extern ER unl_cpu(void) throw();
+extern ER iunl_cpu(void) throw();
+extern ER dis_dsp(void) throw();
+extern ER ena_dsp(void) throw();
+extern bool_t sns_ctx(void) throw();
+extern bool_t sns_loc(void) throw();
+extern bool_t sns_dsp(void) throw();
+extern bool_t sns_dpn(void) throw();
+extern bool_t sns_ker(void) throw();
+extern ER ext_ker(void) throw();
+
+/*
+ * 割込み管理機能
+ */
+extern ER dis_int(INTNO intno) throw();
+extern ER ena_int(INTNO intno) throw();
+extern ER chg_ipm(PRI intpri) throw();
+extern ER get_ipm(PRI *p_intpri) throw();
+
+/*
+ * CPU例外管理機能
+ */
+extern bool_t xsns_dpn(void *p_excinf) throw();
+extern bool_t xsns_xpn(void *p_excinf) throw();
+
+#endif /* TOPPERS_MACRO_ONLY */
+
+/*
+ * オブジェクト属性の定義
+ */
+#define TA_ACT UINT_C(0x02) /* タスクを起動された状態で生成 */
+#define TA_RSTR UINT_C(0x04) /* 制約タスク */
+
+#define TA_TPRI UINT_C(0x01) /* タスクの待ち行列を優先度順に */
+#define TA_MPRI UINT_C(0x02) /* メッセージキューを優先度順に */
+
+#define TA_WMUL UINT_C(0x02) /* 複数の待ちタスク */
+#define TA_CLR UINT_C(0x04) /* イベントフラグのクリア指定 */
+
+#define TA_STA UINT_C(0x02) /* 周期ハンドラを動作状態で生成 */
+
+#define TA_NONKERNEL UINT_C(0x02) /* カーネル管理外の割込み */
+
+#define TA_ENAINT UINT_C(0x01) /* 割込み要求禁止フラグをクリア */
+#define TA_EDGE UINT_C(0x02) /* エッジトリガ */
+
+/*
+ * サービスコールの動作モードの定義
+ */
+#define TWF_ORW UINT_C(0x01) /* イベントフラグのOR待ち */
+#define TWF_ANDW UINT_C(0x02) /* イベントフラグのAND待ち */
+
+/*
+ * オブジェクトの状態の定義
+ */
+#define TTS_RUN UINT_C(0x01) /* 実行状態 */
+#define TTS_RDY UINT_C(0x02) /* 実行可能状態 */
+#define TTS_WAI UINT_C(0x04) /* 待ち状態 */
+#define TTS_SUS UINT_C(0x08) /* 強制待ち状態 */
+#define TTS_WAS UINT_C(0x0c) /* 二重待ち状態 */
+#define TTS_DMT UINT_C(0x10) /* 休止状態 */
+
+#define TTW_SLP UINT_C(0x0001) /* 起床待ち */
+#define TTW_DLY UINT_C(0x0002) /* 時間経過待ち */
+#define TTW_SEM UINT_C(0x0004) /* セマフォの資源獲得待ち */
+#define TTW_FLG UINT_C(0x0008) /* イベントフラグ待ち */
+#define TTW_SDTQ UINT_C(0x0010) /* データキューへの送信待ち */
+#define TTW_RDTQ UINT_C(0x0020) /* データキューからの受信待ち */
+#define TTW_SPDQ UINT_C(0x0100) /* 優先度データキューへの送信待ち */
+#define TTW_RPDQ UINT_C(0x0200) /* 優先度データキューからの受信待ち */
+#define TTW_MBX UINT_C(0x0040) /* メールボックスからの受信待ち */
+#define TTW_MPF UINT_C(0x2000) /* 固定長メモリブロックの獲得待ち */
+
+#define TTEX_ENA UINT_C(0x01) /* タスク例外処理許可状態 */
+#define TTEX_DIS UINT_C(0x02) /* タスク例外処理禁止状態 */
+
+#define TCYC_STP UINT_C(0x01) /* 周期ハンドラが動作していない */
+#define TCYC_STA UINT_C(0x02) /* 周期ハンドラが動作している */
+
+#define TALM_STP UINT_C(0x01) /* アラームハンドラが動作していない */
+#define TALM_STA UINT_C(0x02) /* アラームハンドラが動作している */
+
+/*
+ * その他の定数の定義
+ */
+#define TSK_SELF 0 /* 自タスク指定 */
+#define TSK_NONE 0 /* 該当するタスクがない */
+
+#define TPRI_SELF 0 /* 自タスクのベース優先度 */
+#define TPRI_INI 0 /* タスクの起動時優先度 */
+
+#define TIPM_ENAALL 0 /* 割込み優先度マスク全解除 */
+
+/*
+ * 構成定数とマクロ
+ */
+
+/*
+ * サポートする機能
+ */
+#ifdef TOPPERS_TARGET_SUPPORT_DIS_INT
+#define TOPPERS_SUPPORT_DIS_INT /* dis_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_DIS_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_ENA_INT
+#define TOPPERS_SUPPORT_ENA_INT /* ena_intがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_ENA_INT */
+
+#ifdef TOPPERS_TARGET_SUPPORT_GET_UTM
+#define TOPPERS_SUPPORT_GET_UTM /* get_utmがサポートされている */
+#endif /* TOPPERS_TARGET_SUPPORT_GET_UTM */
+
+#define TOPPERS_SUPPORT_RSTR_TASK /* 制約タスク機能拡張 */
+
+/*
+ * 優先度の範囲
+ */
+#define TMIN_TPRI 1 /* タスク優先度の最小値(最高値)*/
+#define TMAX_TPRI 16 /* タスク優先度の最大値(最低値)*/
+#define TMIN_DPRI 1 /* データ優先度の最小値(最高値)*/
+#define TMAX_DPRI 16 /* データ優先度の最大値(最低値)*/
+#define TMIN_MPRI 1 /* メッセージ優先度の最小値(最高値)*/
+#define TMAX_MPRI 16 /* メッセージ優先度の最大値(最低値)*/
+#define TMIN_ISRPRI 1 /* 割込みサービスルーチン優先度の最小値 */
+#define TMAX_ISRPRI 16 /* 割込みサービスルーチン優先度の最大値 */
+
+/*
+ * バージョン情報
+ */
+#define TKERNEL_MAKER UINT_C(0x0118) /* カーネルのメーカーコード */
+#define TKERNEL_PRID UINT_C(0x0007) /* カーネルの識別番号 */
+#define TKERNEL_SPVER UINT_C(0xf513) /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER UINT_C(0x1070) /* カーネルのバージョン番号 */
+
+/*
+ * キューイング回数の最大値
+ */
+#define TMAX_ACTCNT UINT_C(1) /* 起動要求キューイング数の最大値 */
+#define TMAX_WUPCNT UINT_C(1) /* 起床要求キューイング数の最大値 */
+
+/*
+ * ビットパターンのビット数
+ */
+#ifndef TBIT_TEXPTN /* タスク例外要因のビット数 */
+#define TBIT_TEXPTN (sizeof(TEXPTN) * CHAR_BIT)
+#endif /* TBIT_TEXPTN */
+
+#ifndef TBIT_FLGPTN /* イベントフラグのビット数 */
+#define TBIT_FLGPTN (sizeof(FLGPTN) * CHAR_BIT)
+#endif /* TBIT_FLGPTN */
+
+/*
+ * メモリ領域確保のためのマクロ
+ *
+ * 以下のTOPPERS_COUNT_SZとTOPPERS_ROUND_SZの定義は,unitが2の巾乗であ
+ * ることを仮定している.
+ */
+#ifndef TOPPERS_COUNT_SZ
+#define TOPPERS_COUNT_SZ(sz, unit) (((sz) + (unit) - 1) / (unit))
+#endif /* TOPPERS_COUNT_SZ */
+#ifndef TOPPERS_ROUND_SZ
+#define TOPPERS_ROUND_SZ(sz, unit) (((sz) + (unit) - 1) & ~((unit) - 1))
+#endif /* TOPPERS_ROUND_SZ */
+
+#define COUNT_STK_T(sz) TOPPERS_COUNT_SZ(sz, sizeof(STK_T))
+#define ROUND_STK_T(sz) TOPPERS_ROUND_SZ(sz, sizeof(STK_T))
+
+#define COUNT_MPF_T(blksz) TOPPERS_COUNT_SZ(blksz, sizeof(MPF_T))
+#define ROUND_MPF_T(blksz) TOPPERS_ROUND_SZ(blksz, sizeof(MPF_T))
+
+/*
+ * その他の構成定数
+ */
+#define TMAX_MAXSEM UINT_MAX /* セマフォの最大資源数の最大値 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TOPPERS_KERNEL_H */
--- /dev/null
+#
+# TOPPERS/ASP Kernel
+# Toyohashi Open Platform for Embedded Real-Time Systems/
+# Advanced Standard Profile Kernel
+#
+# Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
+# Toyohashi Univ. of Technology, JAPAN
+# Copyright (C) 2005-2010 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: Makefile.kernel 1887 2010-08-06 06:15:19Z ertl-hiro $
+#
+
+#
+# カーネルのファイル構成の定義
+#
+
+#
+# 1つのソースファイルから複数のオブジェクトファイルを生成するように作
+# 成されたソースファイルのリスト
+#
+KERNEL_FCSRCS = startup.c task.c wait.c time_event.c \
+ task_manage.c task_refer.c task_sync.c task_except.c \
+ semaphore.c eventflag.c dataqueue.c pridataq.c mailbox.c \
+ mempfix.c time_manage.c cyclic.c alarm.c \
+ sys_manage.c interrupt.c exception.c
+
+#
+# 各ソースファイルから生成されるオブジェクトファイルのリスト
+#
+startup = sta_ker.o ext_ker.o
+
+task = tskini.o tsksched.o tskrun.o tsknrun.o \
+ tskdmt.o tskact.o tskpri.o tskrpri.o tskrot.o tsktex.o
+
+wait = waimake.o waicmp.o waitmo.o waitmook.o \
+ wairel.o wobjwai.o wobjwaitmo.o iniwque.o
+
+time_event = tmeini.o tmeup.o tmedown.o tmeins.o tmedel.o tmeltim.o sigtim.o
+
+task_manage = act_tsk.o iact_tsk.o can_act.o ext_tsk.o ter_tsk.o \
+ chg_pri.o ras_pri.o get_pri.o get_inf.o
+
+task_refer = ref_tsk.o
+
+task_sync = slp_tsk.o tslp_tsk.o wup_tsk.o iwup_tsk.o can_wup.o \
+ rel_wai.o irel_wai.o sus_tsk.o rsm_tsk.o dly_tsk.o
+
+task_except = ras_tex.o iras_tex.o dis_tex.o ena_tex.o sns_tex.o ref_tex.o
+
+semaphore = semini.o sig_sem.o isig_sem.o \
+ wai_sem.o pol_sem.o twai_sem.o ini_sem.o ref_sem.o
+
+eventflag = flgini.o flgcnd.o set_flg.o iset_flg.o clr_flg.o \
+ wai_flg.o pol_flg.o twai_flg.o ini_flg.o ref_flg.o
+
+dataqueue = dtqini.o dtqenq.o dtqfenq.o dtqdeq.o dtqsnd.o dtqfsnd.o dtqrcv.o \
+ snd_dtq.o psnd_dtq.o ipsnd_dtq.o tsnd_dtq.o fsnd_dtq.o ifsnd_dtq.o \
+ rcv_dtq.o prcv_dtq.o trcv_dtq.o ini_dtq.o ref_dtq.o
+
+pridataq = pdqini.o pdqenq.o pdqdeq.o pdqsnd.o pdqrcv.o \
+ snd_pdq.o psnd_pdq.o ipsnd_pdq.o tsnd_pdq.o \
+ rcv_pdq.o prcv_pdq.o trcv_pdq.o ini_pdq.o ref_pdq.o
+
+mailbox = mbxini.o snd_mbx.o rcv_mbx.o prcv_mbx.o trcv_mbx.o \
+ ini_mbx.o ref_mbx.o
+
+mempfix = mpfini.o mpfget.o get_mpf.o pget_mpf.o tget_mpf.o \
+ rel_mpf.o ini_mpf.o ref_mpf.o
+
+time_manage = get_tim.o get_utm.o
+
+cyclic = cycini.o sta_cyc.o stp_cyc.o ref_cyc.o cyccal.o
+
+alarm = almini.o sta_alm.o ista_alm.o stp_alm.o istp_alm.o ref_alm.o almcal.o
+
+sys_manage = rot_rdq.o irot_rdq.o get_tid.o iget_tid.o \
+ loc_cpu.o iloc_cpu.o unl_cpu.o iunl_cpu.o dis_dsp.o ena_dsp.o \
+ sns_ctx.o sns_loc.o sns_dsp.o sns_dpn.o sns_ker.o
+
+interrupt = intini.o dis_int.o ena_int.o chg_ipm.o get_ipm.o
+
+exception = excini.o xsns_dpn.o xsns_xpn.o
+
+#
+# 生成されるオブジェクトファイルの依存関係の定義
+#
+$(startup) $(startup:.o=.s) $(startup:.o=.d): startup.c
+$(task) $(task:.o=.s) $(task:.o=.d): task.c
+$(wait) $(wait:.o=.s) $(wait:.o=.d): wait.c
+$(time_event) $(time_event:.o=.s) $(time_event:.o=.d): time_event.c
+$(task_manage) $(task_manage:.o=.s) $(task_manage:.o=.d): task_manage.c
+$(task_refer) $(task_refer:.o=.s) $(task_refer:.o=.d): task_refer.c
+$(task_sync) $(task_sync:.o=.s) $(task_sync:.o=.d): task_sync.c
+$(task_except) $(task_except:.o=.s) $(task_except:.o=.d): task_except.c
+$(semaphore) $(semaphore:.o=.s) $(semaphore:.o=.d): semaphore.c
+$(eventflag) $(eventflag:.o=.s) $(eventflag:.o=.d): eventflag.c
+$(dataqueue) $(dataqueue:.o=.s) $(dataqueue:.o=.d): dataqueue.c
+$(pridataq) $(pridataq:.o=.s) $(pridataq:.o=.d): pridataq.c
+$(mailbox) $(mailbox:.o=.s) $(mailbox:.o=.d): mailbox.c
+$(mempfix) $(mempfix:.o=.s) $(mempfix:.o=.d): mempfix.c
+$(time_manage) $(time_manage:.o=.s) $(time_manage:.o=.d): time_manage.c
+$(cyclic) $(cyclic:.o=.s) $(cyclic:.o=.d): cyclic.c
+$(alarm) $(alarm:.o=.s) $(alarm:.o=.d): alarm.c
+$(sys_manage) $(sys_manage:.o=.s) $(sys_manage:.o=.d): sys_manage.c
+$(interrupt) $(interrupt:.o=.s) $(interrupt:.o=.d): interrupt.c
+$(exception) $(exception:.o=.s) $(exception:.o=.d): exception.c
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2005-2010 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: allfunc.h 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ * すべての関数をコンパイルするための定義
+ */
+
+#ifndef TOPPERS_ALLFUNC_H
+#define TOPPERS_ALLFUNC_H
+
+/* startup.c */
+#define TOPPERS_sta_ker
+#define TOPPERS_ext_ker
+
+/* task.c */
+#define TOPPERS_tskini
+#define TOPPERS_tsksched
+#define TOPPERS_tskrun
+#define TOPPERS_tsknrun
+#define TOPPERS_tskdmt
+#define TOPPERS_tskact
+#define TOPPERS_tskpri
+#define TOPPERS_tskrpri
+#define TOPPERS_tskrot
+#define TOPPERS_tsktex
+
+/* wait.c */
+#define TOPPERS_waimake
+#define TOPPERS_waicmp
+#define TOPPERS_waitmo
+#define TOPPERS_waitmook
+#define TOPPERS_wairel
+#define TOPPERS_wobjwai
+#define TOPPERS_wobjwaitmo
+#define TOPPERS_iniwque
+
+/* time_event.c */
+#define TOPPERS_tmeini
+#define TOPPERS_tmeup
+#define TOPPERS_tmedown
+#define TOPPERS_tmeins
+#define TOPPERS_tmedel
+#define TOPPERS_tmeltim
+#define TOPPERS_sigtim
+
+/* task_manage.c */
+#define TOPPERS_act_tsk
+#define TOPPERS_iact_tsk
+#define TOPPERS_can_act
+#define TOPPERS_ext_tsk
+#define TOPPERS_ter_tsk
+#define TOPPERS_chg_pri
+#define TOPPERS_ras_pri
+#define TOPPERS_get_pri
+#define TOPPERS_get_inf
+
+/* task_refer.c */
+#define TOPPERS_ref_tsk
+
+/* task_sync.c */
+#define TOPPERS_slp_tsk
+#define TOPPERS_tslp_tsk
+#define TOPPERS_wup_tsk
+#define TOPPERS_iwup_tsk
+#define TOPPERS_can_wup
+#define TOPPERS_rel_wai
+#define TOPPERS_irel_wai
+#define TOPPERS_sus_tsk
+#define TOPPERS_rsm_tsk
+#define TOPPERS_dly_tsk
+
+/* task_except.c */
+#define TOPPERS_ras_tex
+#define TOPPERS_iras_tex
+#define TOPPERS_dis_tex
+#define TOPPERS_ena_tex
+#define TOPPERS_sns_tex
+#define TOPPERS_ref_tex
+
+/* semaphore.c */
+#define TOPPERS_semini
+#define TOPPERS_sig_sem
+#define TOPPERS_isig_sem
+#define TOPPERS_wai_sem
+#define TOPPERS_pol_sem
+#define TOPPERS_twai_sem
+#define TOPPERS_ini_sem
+#define TOPPERS_ref_sem
+
+/* eventflag.c */
+#define TOPPERS_flgini
+#define TOPPERS_flgcnd
+#define TOPPERS_set_flg
+#define TOPPERS_iset_flg
+#define TOPPERS_clr_flg
+#define TOPPERS_wai_flg
+#define TOPPERS_pol_flg
+#define TOPPERS_twai_flg
+#define TOPPERS_ini_flg
+#define TOPPERS_ref_flg
+
+/* dataqueue.c */
+#define TOPPERS_dtqini
+#define TOPPERS_dtqenq
+#define TOPPERS_dtqfenq
+#define TOPPERS_dtqdeq
+#define TOPPERS_dtqsnd
+#define TOPPERS_dtqfsnd
+#define TOPPERS_dtqrcv
+#define TOPPERS_snd_dtq
+#define TOPPERS_psnd_dtq
+#define TOPPERS_ipsnd_dtq
+#define TOPPERS_tsnd_dtq
+#define TOPPERS_fsnd_dtq
+#define TOPPERS_ifsnd_dtq
+#define TOPPERS_rcv_dtq
+#define TOPPERS_prcv_dtq
+#define TOPPERS_trcv_dtq
+#define TOPPERS_ini_dtq
+#define TOPPERS_ref_dtq
+
+/* pridataq.c */
+#define TOPPERS_pdqini
+#define TOPPERS_pdqenq
+#define TOPPERS_pdqdeq
+#define TOPPERS_pdqsnd
+#define TOPPERS_pdqrcv
+#define TOPPERS_snd_pdq
+#define TOPPERS_psnd_pdq
+#define TOPPERS_ipsnd_pdq
+#define TOPPERS_tsnd_pdq
+#define TOPPERS_rcv_pdq
+#define TOPPERS_prcv_pdq
+#define TOPPERS_trcv_pdq
+#define TOPPERS_ini_pdq
+#define TOPPERS_ref_pdq
+
+/* mailbox.c */
+#define TOPPERS_mbxini
+#define TOPPERS_snd_mbx
+#define TOPPERS_rcv_mbx
+#define TOPPERS_prcv_mbx
+#define TOPPERS_trcv_mbx
+#define TOPPERS_ini_mbx
+#define TOPPERS_ref_mbx
+
+/* mempfix.c */
+#define TOPPERS_mpfini
+#define TOPPERS_mpfget
+#define TOPPERS_get_mpf
+#define TOPPERS_pget_mpf
+#define TOPPERS_tget_mpf
+#define TOPPERS_rel_mpf
+#define TOPPERS_ini_mpf
+#define TOPPERS_ref_mpf
+
+/* time_manage.c */
+#define TOPPERS_get_tim
+#define TOPPERS_get_utm
+
+/* cyclic.c */
+#define TOPPERS_cycini
+#define TOPPERS_sta_cyc
+#define TOPPERS_stp_cyc
+#define TOPPERS_ref_cyc
+#define TOPPERS_cyccal
+
+/* alarm.c */
+#define TOPPERS_almini
+#define TOPPERS_sta_alm
+#define TOPPERS_ista_alm
+#define TOPPERS_stp_alm
+#define TOPPERS_istp_alm
+#define TOPPERS_ref_alm
+#define TOPPERS_almcal
+
+/* sys_manage.c */
+#define TOPPERS_rot_rdq
+#define TOPPERS_irot_rdq
+#define TOPPERS_get_tid
+#define TOPPERS_iget_tid
+#define TOPPERS_loc_cpu
+#define TOPPERS_iloc_cpu
+#define TOPPERS_unl_cpu
+#define TOPPERS_iunl_cpu
+#define TOPPERS_dis_dsp
+#define TOPPERS_ena_dsp
+#define TOPPERS_sns_ctx
+#define TOPPERS_sns_loc
+#define TOPPERS_sns_dsp
+#define TOPPERS_sns_dpn
+#define TOPPERS_sns_ker
+
+/* interrupt.c */
+#define TOPPERS_intini
+#define TOPPERS_dis_int
+#define TOPPERS_ena_int
+#define TOPPERS_chg_ipm
+#define TOPPERS_get_ipm
+
+/* exception.c */
+#define TOPPERS_excini
+#define TOPPERS_xsns_dpn
+#define TOPPERS_xsns_xpn
+
+#endif /* TOPPERS_ALLFUNC_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: check.h 1965 2010-11-20 07:22:43Z ertl-hiro $
+ */
+
+/*
+ * エラーチェック用マクロ
+ */
+
+#ifndef TOPPERS_CHECK_H
+#define TOPPERS_CHECK_H
+
+/*
+ * 優先度の範囲の判定
+ */
+#define VALID_TPRI(tpri) (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI)
+
+#ifndef VALID_INTPRI_CHGIPM
+#define VALID_INTPRI_CHGIPM(intpri) \
+ (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
+#endif /* VALID_INTPRI_CHGIPM */
+
+/*
+ * タスク優先度のチェック(E_PAR)
+ */
+#define CHECK_TPRI(tpri) { \
+ if (!VALID_TPRI(tpri)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_TPRI_INI(tpri) { \
+ if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_TPRI_SELF(tpri) { \
+ if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * タイムアウト指定値のチェック(E_PAR)
+ */
+#define CHECK_TMOUT(tmout) { \
+ if (!(TMO_FEVR <= (tmout))) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 割込み優先度のチェック(E_PAR)
+ */
+#define CHECK_INTPRI_CHGIPM(intpri) { \
+ if (!VALID_INTPRI_CHGIPM(intpri)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 割込み番号のチェック(E_PAR)
+ */
+#define CHECK_INTNO_DISINT(intno) { \
+ if (!VALID_INTNO_DISINT(intno)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * その他のパラメータエラーのチェック(E_PAR)
+ */
+#define CHECK_PAR(exp) { \
+ if (!(exp)) { \
+ ercd = E_PAR; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * オブジェクトIDの範囲の判定
+ */
+#define VALID_TSKID(tskid) (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)
+#define VALID_SEMID(semid) (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
+#define VALID_FLGID(flgid) (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid)
+#define VALID_DTQID(dtqid) (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid)
+#define VALID_PDQID(pdqid) (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid)
+#define VALID_MBXID(mbxid) (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid)
+#define VALID_MPFID(mpfid) (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
+#define VALID_CYCID(cycid) (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
+#define VALID_ALMID(almid) (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
+
+/*
+ * オブジェクトIDのチェック(E_ID)
+ */
+#define CHECK_TSKID(tskid) { \
+ if (!VALID_TSKID(tskid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_TSKID_SELF(tskid) { \
+ if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_SEMID(semid) { \
+ if (!VALID_SEMID(semid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_FLGID(flgid) { \
+ if (!VALID_FLGID(flgid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_DTQID(dtqid) { \
+ if (!VALID_DTQID(dtqid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_PDQID(pdqid) { \
+ if (!VALID_PDQID(pdqid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_MBXID(mbxid) { \
+ if (!VALID_MBXID(mbxid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_MPFID(mpfid) { \
+ if (!VALID_MPFID(mpfid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_CYCID(cycid) { \
+ if (!VALID_CYCID(cycid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_ALMID(almid) { \
+ if (!VALID_ALMID(almid)) { \
+ ercd = E_ID; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 呼出しコンテキストのチェック(E_CTX)
+ */
+#define CHECK_TSKCTX() { \
+ if (sense_context()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_INTCTX() { \
+ if (!sense_context()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 呼出しコンテキストとCPUロック状態のチェック(E_CTX)
+ */
+#define CHECK_TSKCTX_UNL() { \
+ if (sense_context() || t_sense_lock()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+#define CHECK_INTCTX_UNL() { \
+ if (!sense_context() || i_sense_lock()) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * ディスパッチ保留状態でないかのチェック(E_CTX)
+ * 自タスクが制約タスクでないかのチェック(E_NOSPT)
+ */
+#define CHECK_DISPATCH() { \
+ if (sense_context() || t_sense_lock() || !dspflg) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+ if ((p_runtsk->p_tinib->tskatr & TA_RSTR) != 0U) { \
+ ercd = E_NOSPT; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 対象タスクが制約タスクでないかのチェック(E_NOSPT)
+ */
+#define CHECK_NONRSTR(p_tcb) { \
+ if (((p_tcb)->p_tinib->tskatr & TA_RSTR) != 0U) { \
+ ercd = E_NOSPT; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * その他のコンテキストエラーのチェック(E_CTX)
+ */
+#define CHECK_CTX(exp) { \
+ if (!(exp)) { \
+ ercd = E_CTX; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * 自タスクを指定していないかのチェック(E_ILUSE)
+ */
+#define CHECK_NONSELF(p_tcb) { \
+ if ((p_tcb) == p_runtsk) { \
+ ercd = E_ILUSE; \
+ goto error_exit; \
+ } \
+}
+
+/*
+ * その他の不正使用エラーのチェック(E_ILUSE)
+ */
+#define CHECK_ILUSE(exp) { \
+ if (!(exp)) { \
+ ercd = E_ILUSE; \
+ goto error_exit; \
+ } \
+}
+
+#endif /* TOPPERS_CHECK_H */
--- /dev/null
+$ ======================================================================
+$
+$ TOPPERS/ASP Kernel
+$ Toyohashi Open Platform for Embedded Real-Time Systems/
+$ Advanced Standard Profile Kernel
+$
+$ Copyright (C) 2007 by TAKAGI Nobuhisa
+$ Copyright (C) 2007-2011 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.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
+$
+$ =====================================================================
+
+$ =====================================================================
+$ kernel_cfg.hの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.h"$
+/* kernel_cfg.h */$NL$
+#ifndef TOPPERS_KERNEL_CFG_H$NL$
+#define TOPPERS_KERNEL_CFG_H$NL$
+$NL$
+#define TNUM_TSKID $LENGTH(TSK.ID_LIST)$$NL$
+#define TNUM_SEMID $LENGTH(SEM.ID_LIST)$$NL$
+#define TNUM_FLGID $LENGTH(FLG.ID_LIST)$$NL$
+#define TNUM_DTQID $LENGTH(DTQ.ID_LIST)$$NL$
+#define TNUM_PDQID $LENGTH(PDQ.ID_LIST)$$NL$
+#define TNUM_MBXID $LENGTH(MBX.ID_LIST)$$NL$
+#define TNUM_MPFID $LENGTH(MPF.ID_LIST)$$NL$
+#define TNUM_CYCID $LENGTH(CYC.ID_LIST)$$NL$
+#define TNUM_ALMID $LENGTH(ALM.ID_LIST)$$NL$
+$NL$
+$FOREACH id TSK.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id SEM.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id FLG.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id DTQ.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id PDQ.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id MBX.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id MPF.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id CYC.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$FOREACH id ALM.ID_LIST$
+ #define $id$ $+id$$NL$
+$END$
+$NL$
+#endif /* TOPPERS_KERNEL_CFG_H */$NL$
+
+$ =====================================================================
+$ kernel_cfg.cの生成
+$ =====================================================================
+
+$FILE "kernel_cfg.c"$
+/* kernel_cfg.c */$NL$
+#include "kernel/kernel_int.h"$NL$
+#include "kernel_cfg.h"$NL$
+$NL$
+#ifndef TOPPERS_EMPTY_LABEL$NL$
+#define TOPPERS_EMPTY_LABEL(x,y) x y[0]$NL$
+#endif$NL$
+$NL$
+#if TKERNEL_PRID != 0x07u$NL$
+#error The kernel does not match this configuration file.$NL$
+#endif$NL$
+$NL$
+
+$
+$ インクルードディレクティブ(#include)
+$
+/*$NL$
+$SPC$* Include Directives (#include)$NL$
+$SPC$*/$NL$
+$NL$
+$INCLUDES$
+$NL$
+
+$
+$ オブジェクトのID番号を保持する変数
+$
+$IF USE_EXTERNAL_ID$
+ /*$NL$
+ $SPC$* Variables for Object ID$NL$
+ $SPC$*/$NL$
+ $NL$
+ $FOREACH id TSK.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id SEM.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id FLG.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id DTQ.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id PDQ.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id MBX.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id MPF.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id CYC.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+ $FOREACH id ALM.ID_LIST$
+ const ID $id$_id$SPC$=$SPC$$+id$;$NL$
+ $END$
+$END$
+
+$
+$ トレースログマクロのデフォルト定義
+$
+/*$NL$
+$SPC$* Default Definitions of Trace Log Macros$NL$
+$SPC$*/$NL$
+$NL$
+#ifndef LOG_ISR_ENTER$NL$
+#define LOG_ISR_ENTER(intno)$NL$
+#endif /* LOG_ISR_ENTER */$NL$
+$NL$
+#ifndef LOG_ISR_LEAVE$NL$
+#define LOG_ISR_LEAVE(intno)$NL$
+#endif /* LOG_ISR_LEAVE */$NL$
+$NL$
+
+$
+$ タスク
+$
+/*$NL$
+$SPC$* Task Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ タスクが1個以上存在することのチェック
+$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が([TA_ACT|TA_RSTR])でない場合(E_RSATR)
+ $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TA_RSTR|TARGET_TSKATR)) != 0$
+ $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+
+$ // (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
+ $IF !(TMIN_TPRI <= TSK.ITSKPRI[tskid] && TSK.ITSKPRI[tskid] <= TMAX_TPRI)$
+ $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "itskpri", TSK.ITSKPRI[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+
+$ // texatrが(TA_NULL)でない場合(E_RSATR)
+ $IF LENGTH(TSK.TEXATR[tskid]) && TSK.TEXATR[tskid] != 0$
+ $ERROR DEF_TEX.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "texatr", TSK.TEXATR[tskid], tskid, "DEF_TEX")$$END$
+ $END$
+$END$
+
+$ スタック領域に関するエラーチェック
+$FOREACH tskid TSK.ID_LIST$
+$ // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
+ $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+ && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+ $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+$ // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
+ $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
+ && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
+ $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $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$
+ $IF EQ(TSK.STK[tskid], "NULL")$
+ $IF (TSK.TSKATR[tskid] & TA_RSTR) == 0$
+ static STK_T _kernel_stack_$tskid$[COUNT_STK_T($TSK.STKSZ[tskid]$)];$NL$
+ $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$
+ $TSK.TINIB_STK[tskid] = CONCAT("_kernel_stack_", tskid)$
+ $ELSE$
+ $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$
+ $TSK.TINIB_STK[tskid] = CONCAT("_kernel_shared_stack_", +TSK.ITSKPRI[tskid])$
+$ // 制約タスク用の共有スタックのサイズを求める
+ $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] = TSK.STKSZ[tskid]$
+ $TSK.TINIB_STK[tskid] = TSK.STK[tskid]$
+ $END$
+$END$
+$FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
+ $IF LENGTH(shared_stack_size[tskpri])$
+ static STK_T _kernel_shared_stack_$tskpri$[COUNT_STK_T($shared_stack_size[tskpri]$)];$NL$
+ $END$
+$END$
+$NL$
+
+$ タスク初期化ブロックの生成(タスクは1個以上存在する)
+const TINIB _kernel_tinib_table[TNUM_TSKID] = {$NL$
+$JOINEACH tskid TSK.ID_LIST ",\n"$
+$ // タスク属性,拡張情報,起動番地,起動時優先度
+ $TAB${
+ $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
+ $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+
+$ // タスク初期化コンテキストブロック,スタック領域
+ $IF USE_TSKINICTXB$
+ $GENERATE_TSKINICTXB(tskid)$
+ $ELSE$
+ $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
+ $END$
+
+$ // タスク例外処理ルーチンの属性と起動番地
+ $SPC$($ALT(TSK.TEXATR[tskid],"TA_NULL")$), ($ALT(TSK.TEXRTN[tskid],"NULL")$) }
+$END$$NL$
+};$NL$
+$NL$
+
+$ タスク管理ブロックの生成
+TCB _kernel_tcb_table[TNUM_TSKID];$NL$
+$NL$
+
+$ タスク生成順序テーブルの生成
+const ID _kernel_torder_table[TNUM_TSKID] = {$NL$
+$TAB$$JOINEACH tskid TSK.ORDER_LIST ", "$$tskid$$END$$NL$
+};$NL$
+$NL$
+
+$
+$ セマフォ
+$
+/*$NL$
+$SPC$* Semaphore Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ セマフォID番号の最大値
+const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1);$NL$
+$NL$
+
+$ セマフォ初期化ブロックの生成
+$IF LENGTH(SEM.ID_LIST)$
+ const SEMINIB _kernel_seminib_table[TNUM_SEMID] = {$NL$
+ $JOINEACH semid SEM.ID_LIST ",\n"$
+$ // sematrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (SEM.SEMATR[semid] & ~TA_TPRI) != 0$
+ $ERROR SEM.TEXT_LINE[semid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "sematr", SEM.SEMATR[semid], semid, "CRE_SEM")$$END$
+ $END$
+
+$ // (0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
+ $IF !(0 <= SEM.ISEMCNT[semid] && SEM.ISEMCNT[semid] <= SEM.MAXSEM[semid])$
+ $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("too large %1% `%2%\' of `%3%\' in %4%"), "isemcnt", SEM.ISEMCNT[semid], semid, "CRE_SEM")$$END$
+ $END$
+
+$ // (1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
+ $IF !(1 <= SEM.MAXSEM[semid] && SEM.MAXSEM[semid] <= TMAX_MAXSEM)$
+ $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxsem", SEM.MAXSEM[semid], semid, "CRE_SEM")$$END$
+ $END$
+
+$ // セマフォ初期化ブロック
+ $TAB${ ($SEM.SEMATR[semid]$), ($SEM.ISEMCNT[semid]$), ($SEM.MAXSEM[semid]$) }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // セマフォ管理ブロック
+ SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
+ TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
+$END$$NL$
+
+$
+$ イベントフラグ
+$
+/*$NL$
+$SPC$* Eventflag Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ イベントフラグID番号の最大値
+const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1);$NL$
+$NL$
+
+$ イベントフラグ初期化ブロックの生成
+$IF LENGTH(FLG.ID_LIST)$
+ const FLGINIB _kernel_flginib_table[TNUM_FLGID] = {$NL$
+ $JOINEACH flgid FLG.ID_LIST ",\n"$
+$ // flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
+ $IF (FLG.FLGATR[flgid] & ~(TA_TPRI|TA_WMUL|TA_CLR)) != 0$
+ $ERROR FLG.TEXT_LINE[flgid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgatr", FLG.FLGATR[flgid], flgid, "CRE_FLG")$$END$
+ $END$
+
+$ // イベントフラグ初期化ブロック
+ $TAB${ ($FLG.FLGATR[flgid]$), ($FLG.IFLGPTN[flgid]$) }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // イベントフラグ管理ブロック
+ FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
+ TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
+$END$$NL$
+
+$
+$ データキュー
+$
+/*$NL$
+$SPC$* Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ データキューID番号の最大値
+const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1);$NL$
+$NL$
+
+$IF LENGTH(DTQ.ID_LIST)$
+ $FOREACH dtqid DTQ.ID_LIST$
+$ // dtqatrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (DTQ.DTQATR[dtqid] & ~TA_TPRI) != 0$
+ $ERROR DTQ.TEXT_LINE[dtqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqatr", DTQ.DTQATR[dtqid], dtqid, "CRE_DTQ")$$END$
+ $END$
+
+$ // dtqmbがNULLでない場合(E_NOSPT)
+ $IF !EQ(DTQ.DTQMB[dtqid], "NULL")$
+ $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
+ $END$
+
+$ // データキュー管理領域
+ $IF DTQ.DTQCNT[dtqid]$
+ static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+ $END$
+ $END$
+
+$ // データキュー初期化ブロックの生成
+ const DTQINIB _kernel_dtqinib_table[TNUM_DTQID] = {$NL$
+ $JOINEACH dtqid DTQ.ID_LIST ",\n"$
+ $TAB${ ($DTQ.DTQATR[dtqid]$), ($DTQ.DTQCNT[dtqid]$), $IF DTQ.DTQCNT[dtqid]$(_kernel_dtqmb_$dtqid$)$ELSE$NULL$END$ }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // データキュー管理ブロック
+ DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
+ TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
+$END$$NL$
+
+$
+$ 優先度データキュー
+$
+/*$NL$
+$SPC$* Priority Dataqueue Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 優先度データキューID番号の最大値
+const ID _kernel_tmax_pdqid = (TMIN_PDQID + TNUM_PDQID - 1);$NL$
+$NL$
+
+$IF LENGTH(PDQ.ID_LIST)$
+ $FOREACH pdqid PDQ.ID_LIST$
+$ // pdqatrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (PDQ.PDQATR[pdqid] & ~TA_TPRI) != 0$
+ $ERROR PDQ.TEXT_LINE[pdqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqatr", PDQ.PDQATR[pdqid], pdqid, "CRE_PDQ")$$END$
+ $END$
+
+$ // (TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
+ $IF !(TMIN_DPRI <= PDQ.MAXDPRI[pdqid] && PDQ.MAXDPRI[pdqid] <= TMAX_DPRI)$
+ $ERROR PDQ.TEXT_LINE[pdqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxdpri", PDQ.MAXDPRI[pdqid], pdqid, "CRE_PDQ")$$END$
+ $END$
+
+$ // pdqmbがNULLでない場合(E_NOSPT)
+ $IF !EQ(PDQ.PDQMB[pdqid], "NULL")$
+ $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
+ $END$
+
+$ // 優先度データキュー管理領域
+ $IF PDQ.PDQCNT[pdqid]$
+ static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
+ $END$
+ $END$
+
+$ // 優先度データキュー初期化ブロックの生成
+ const PDQINIB _kernel_pdqinib_table[TNUM_PDQID] = {$NL$
+ $JOINEACH pdqid PDQ.ID_LIST ",\n"$
+ $TAB${ ($PDQ.PDQATR[pdqid]$), ($PDQ.PDQCNT[pdqid]$), ($PDQ.MAXDPRI[pdqid]$), $IF PDQ.PDQCNT[pdqid]$(_kernel_pdqmb_$pdqid$)$ELSE$NULL$END$ }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // 優先度データキュー管理ブロック
+ PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
+ TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
+$END$$NL$
+
+$
+$ メールボックス
+$
+/*$NL$
+$SPC$* Mailbox Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ メールボックスID番号の最大値
+const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1);$NL$
+$NL$
+
+$ メールボックス初期化ブロックの生成
+$IF LENGTH(MBX.ID_LIST)$
+ const MBXINIB _kernel_mbxinib_table[TNUM_MBXID] = {$NL$
+ $JOINEACH mbxid MBX.ID_LIST ",\n"$
+$ // mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
+ $IF (MBX.MBXATR[mbxid] & ~(TA_TPRI|TA_MPRI)) != 0$
+ $ERROR MBX.TEXT_LINE[mbxid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mbxatr", MBX.MBXATR[mbxid], mbxid, "CRE_MBX")$$END$
+ $END$
+
+$ // (TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
+ $IF !(TMIN_MPRI <= MBX.MAXMPRI[mbxid] && MBX.MAXMPRI[mbxid] <= TMAX_MPRI)$
+ $ERROR MBX.TEXT_LINE[mbxid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxmpri", MBX.MAXMPRI[mbxid], mbxid, "CRE_MBX")$$END$
+ $END$
+
+$ // mprihdがNULLでない場合(E_NOSPT)
+ $IF !EQ(MBX.MPRIHD[mbxid], "NULL")$
+ $ERROR MBX.TEXT_LINE[mbxid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mprihd", MBX.MPRIHD[mbxid], mbxid, "CRE_MBX")$$END$
+ $END$
+
+$ // メールボックス初期化ブロック
+ $TAB${ ($MBX.MBXATR[mbxid]$), ($MBX.MAXMPRI[mbxid]$) }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // メールボックス管理ブロック
+ MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
+ TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
+$END$$NL$
+
+$
+$ 固定長メモリプール
+$
+/*$NL$
+$SPC$* Fixed-sized Memorypool Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 固定長メモリプールID番号の最大値
+const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1);$NL$
+$NL$
+
+$IF LENGTH(MPF.ID_LIST)$
+ $FOREACH mpfid MPF.ID_LIST$
+$ // mpfatrが([TA_TPRI])でない場合(E_RSATR)
+ $IF (MPF.MPFATR[mpfid] & ~TA_TPRI) != 0$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfatr", MPF.MPFATR[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // blkcntが0の場合(E_PAR)
+ $IF MPF.BLKCNT[mpfid] == 0$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blkcnt", MPF.BLKCNT[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // blkszが0の場合(E_PAR)
+ $IF MPF.BLKSZ[mpfid] == 0$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blksz", MPF.BLKSZ[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // 固定長メモリプール領域
+ $IF EQ(MPF.MPF[mpfid], "NULL")$
+ static MPF_T _kernel_mpf_$mpfid$[($MPF.BLKCNT[mpfid]$) * COUNT_MPF_T($MPF.BLKSZ[mpfid]$)];$NL$
+ $END$
+
+$ // mpfmbがNULLでない場合(E_NOSPT)
+ $IF !EQ(MPF.MPFMB[mpfid], "NULL")$
+ $ERROR MPF.TEXT_LINE[mpfid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfmb", MPF.MPFMB[mpfid], mpfid, "CRE_MPF")$$END$
+ $END$
+
+$ // 固定長メモリプール管理領域
+ static MPFMB _kernel_mpfmb_$mpfid$[$MPF.BLKCNT[mpfid]$];$NL$
+ $END$
+
+$ // 固定長メモリプール初期化ブロックの生成
+ const MPFINIB _kernel_mpfinib_table[TNUM_MPFID] = {$NL$
+ $JOINEACH mpfid MPF.ID_LIST ",\n"$
+ $TAB${ ($MPF.MPFATR[mpfid]$), ($MPF.BLKCNT[mpfid]$), ROUND_MPF_T($MPF.BLKSZ[mpfid]$), $IF EQ(MPF.MPF[mpfid],"NULL")$(_kernel_mpf_$mpfid$)$ELSE$($MPF.MPF[mpfid]$)$END$, (_kernel_mpfmb_$mpfid$) }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // 固定長メモリプール管理ブロック
+ MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
+ TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
+$END$$NL$
+
+$
+$ 周期ハンドラ
+$
+/*$NL$
+$SPC$* Cyclic Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 周期ハンドラID番号の最大値
+const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1);$NL$
+$NL$
+
+$ 周期ハンドラ初期化テーブルの生成
+$IF LENGTH(CYC.ID_LIST)$
+ const CYCINIB _kernel_cycinib_table[TNUM_CYCID] = {$NL$
+ $JOINEACH cycid CYC.ID_LIST ",\n"$
+$ // cycatrが([TA_STA])でない場合(E_RSATR)
+ $IF (CYC.CYCATR[cycid] & ~TA_STA) != 0$
+ $ERROR CYC.TEXT_LINE[cycid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycatr", CYC.CYCATR[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+
+$ // (0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
+ $IF !(0 < CYC.CYCTIM[cycid] && CYC.CYCTIM[cycid] <= TMAX_RELTIM)$
+ $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cyctim", CYC.CYCTIM[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+
+$ // (0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
+ $IF !(0 <= CYC.CYCPHS[cycid] && CYC.CYCPHS[cycid] <= TMAX_RELTIM)$
+ $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycphs", CYC.CYCPHS[cycid], cycid, "CRE_CYC")$$END$
+ $END$
+
+$ // 警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
+ $IF (CYC.CYCATR[cycid] & TA_STA) != 0 && CYC.CYCPHS[cycid] == 0$
+ $WARNING CYC.TEXT_LINE[cycid]$$FORMAT(_("%1% is not recommended when %2% is set to %3% in %4%"), "cycphs==0", "TA_STA", "cycatr", "CRE_CYC")$$END$
+ $END$
+
+$ // 周期ハンドラ初期化ブロック
+ $TAB${ ($CYC.CYCATR[cycid]$), (intptr_t)($CYC.EXINF[cycid]$), ($CYC.CYCHDR[cycid]$), ($CYC.CYCTIM[cycid]$), ($CYC.CYCPHS[cycid]$) }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // 周期ハンドラ管理ブロック
+ CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
+ TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
+$END$$NL$
+
+$
+$ アラームハンドラ
+$
+/*$NL$
+$SPC$* Alarm Handler Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ アラームハンドラID番号の最大値
+const ID _kernel_tmax_almid = (TMIN_ALMID + TNUM_ALMID - 1);$NL$
+$NL$
+
+$ アラームハンドラ初期化ブロックの生成
+$IF LENGTH(ALM.ID_LIST)$
+ const ALMINIB _kernel_alminib_table[TNUM_ALMID] = {$NL$
+ $JOINEACH almid ALM.ID_LIST ",\n"$
+$ // almatrが(TA_NULL)でない場合(E_RSATR)
+ $IF ALM.ALMATR[almid] != 0$
+ $ERROR ALM.TEXT_LINE[almid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "almatr", ALM.ALMATR[almid], almid, "CRE_ALM")$$END$
+ $END$
+
+$ // アラームハンドラ初期化ブロック
+ $TAB${ ($ALM.ALMATR[almid]$), (intptr_t)($ALM.EXINF[almid]$), ($ALM.ALMHDR[almid]$) }
+ $END$$NL$
+ };$NL$
+ $NL$
+
+$ // アラームハンドラ管理ブロック
+ ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
+ TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
+$END$$NL$
+
+$
+$ 割込み管理機能
+$
+/*$NL$
+$SPC$* Interrupt Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ 割込み番号と割込みハンドラ番号の変換テーブルの作成
+$IF LENGTH(INTNO_ATTISR_VALID) != LENGTH(INHNO_ATTISR_VALID)$
+ $ERROR$length of `INTNO_ATTISR_VALID' is different from length of `INHNO_ATTISR_VALID'$END$
+$END$
+$i = 0$
+$FOREACH intno INTNO_ATTISR_VALID$
+ $inhno = AT(INHNO_ATTISR_VALID, i)$
+ $INHNO[intno] = inhno$
+ $INTNO[inhno] = intno$
+ $i = i + 1$
+$END$
+
+$ 割込み要求ラインに関するエラーチェック
+$i = 0$
+$FOREACH intno INT.ORDER_LIST$
+$ // intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INTNO_CFGINT_VALID, INT.INTNO[intno]))$
+ $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+ $END$
+
+$ // intnoがCFG_INTによって設定済みの場合(E_OBJ)
+ $j = 0$
+ $FOREACH intno2 INT.ORDER_LIST$
+ $IF INT.INTNO[intno] == INT.INTNO[intno2] && j < i$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
+ $END$
+ $j = j + 1$
+ $END$
+
+$ // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
+ $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
+ $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
+ $END$
+
+$ // intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$
+ $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intpri", INT.INTPRI[intno], "CFG_INT")$$END$
+ $END$
+
+$ // カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRI
+$ // よりも小さい値が指定された場合(E_OBJ)
+ $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must not have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+
+$ // カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
+$ // よりも小さい値が指定されなかった場合(E_OBJ)
+ $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$
+ $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+ $i = i + 1$
+$END$
+
+$ 割込みハンドラに関するエラーチェック
+$i = 0$
+$FOREACH inhno INH.ORDER_LIST$
+$ // inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INHNO_DEFINH_VALID, INH.INHNO[inhno]))$
+ $ERROR INH.TEXT_LINE[inhno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+ $END$
+
+$ // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
+ $j = 0$
+ $FOREACH inhno2 INH.ORDER_LIST$
+ $IF INH.INHNO[inhno] == INH.INHNO[inhno2] && j < i$
+ $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+ $END$
+ $j = j + 1$
+ $END$
+
+$ // inhatrが(TA_NULL)でない場合(E_RSATR)
+ $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
+ $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
+ $END$
+
+$ // カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$ // が指定されている場合(E_RSATR)
+ $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$
+ $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must not be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+ $END$
+ $END$
+
+$ // カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNEL
+$ // が指定されていない場合(E_RSATR)
+ $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+ $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
+ $END$
+ $END$
+
+ $IF LENGTH(INTNO[INH.INHNO[inhno]])$
+ $intno = INTNO[INH.INHNO[inhno]]$
+$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+ $IF !LENGTH(INT.INTNO[intno])$
+ $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+ $ELSE$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+ $END$
+ $ELSE$
+$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRI以上である場合(E_OBJ)
+ $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+ $END$
+ $END$
+ $i = i + 1$
+$END$
+
+$ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
+$FOREACH order ISR.ORDER_LIST$
+$ // isratrが(TA_NULL)でない場合(E_RSATR)
+ $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+ $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
+ $END$
+
+$ // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(INTNO_ATTISR_VALID, ISR.INTNO[order]))$
+ $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", ISR.INTNO[order], "ATT_ISR")$$END$
+ $END$
+
+$ // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
+ $IF !(TMIN_ISRPRI <= ISR.ISRPRI[order] && ISR.ISRPRI[order] <= TMAX_ISRPRI)$
+ $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isrpri", ISR.ISRPRI[order], "ATT_ISR")$$END$
+ $END$
+$END$
+
+$FOREACH intno INTNO_ATTISR_VALID$
+ $inhno = INHNO[intno]$
+
+$ // 割込み番号intnoに対して登録されたISRのリストの作成
+ $isr_order_list = {}$
+ $FOREACH order ISR.ORDER_LIST$
+ $IF ISR.INTNO[order] == intno$
+ $isr_order_list = APPEND(isr_order_list, order)$
+ $order_for_error = order$
+ $END$
+ $END$
+
+$ // 割込み番号intnoに対して登録されたISRが存在する場合
+ $IF LENGTH(isr_order_list) > 0$
+$ // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
+ $IF LENGTH(INH.INHNO[inhno])$
+ $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"), "intno", ISR.INTNO[order_for_error], "ATT_ISR", "inhno", INH.INHNO[inhno])$$END$
+ $END$
+
+$ // intnoに対するCFG_INTがない場合(E_OBJ)
+ $IF !LENGTH(INT.INTNO[intno])$
+ $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' is not configured with %3%"), "intno", ISR.INTNO[order_for_error], "CFG_INT")$$END$
+ $ELSE$
+$ // intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRI
+$ // よりも小さい場合(E_OBJ)
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "intno", ISR.INTNO[order_for_error], "TMIN_INTPRI")$$END$
+ $END$
+ $END$
+
+$ // DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
+ $INH.INHNO[inhno] = inhno$
+ $INH.INHATR[inhno] = VALUE("TA_NULL", 0)$
+ $INH.INTHDR[inhno] = CONCAT("_kernel_inthdr_", intno)$
+ $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$
+
+$ // ISR用の割込みハンドラ
+ void$NL$
+ _kernel_inthdr_$intno$(void)$NL$
+ {$NL$
+ $IF LENGTH(isr_order_list) > 1$
+ $TAB$PRI saved_ipm;$NL$
+ $NL$
+ $TAB$i_begin_int($intno$);$NL$
+ $TAB$saved_ipm = i_get_ipm();$NL$
+ $ELSE$
+ $TAB$i_begin_int($intno$);$NL$
+ $END$
+$ // ISRを優先度順に呼び出す
+ $JOINEACH order SORT(isr_order_list, "ISR.ISRPRI") "\tif (i_sense_lock()) {\n\t\ti_unlock_cpu();\n\t}\n\ti_set_ipm(saved_ipm);\n"$
+ $TAB$LOG_ISR_ENTER($intno$);$NL$
+ $TAB$((ISR)($ISR.ISR[order]$))((intptr_t)($ISR.EXINF[order]$));$NL$
+ $TAB$LOG_ISR_LEAVE($intno$);$NL$
+ $END$
+ $TAB$i_end_int($intno$);$NL$
+ }$NL$
+ $END$
+$END$
+$NL$
+
+$
+$ 割込み管理機能のための標準的な初期化情報の生成
+$
+$ 割込みハンドラの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
+
+$ 割込みハンドラ数
+#define TNUM_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_inhno = TNUM_INHNO;$NL$
+$NL$
+$FOREACH inhno INH.ORDER_LIST$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+ INTHDR_ENTRY($INH.INHNO[inhno]$, $+INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)$NL$
+ $END$
+$END$
+$NL$
+
+$ 割込みハンドラ初期化テーブル
+$IF LENGTH(INH.ORDER_LIST)$
+ const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {$NL$
+ $JOINEACH inhno INH.ORDER_LIST ",\n"$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+ $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)(INT_ENTRY($INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)) }
+ $ELSE$
+ $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)($INH.INTHDR[inhno]$) }
+ $END$
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
+$END$$NL$
+$END$
+
+$ 割込み要求ラインの初期化に必要な情報
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
+
+$ 割込み要求ライン数
+#define TNUM_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_intno = TNUM_INTNO;$NL$
+$NL$
+
+$ 割込み要求ライン初期化テーブル
+$IF LENGTH(INT.ORDER_LIST)$
+ const INTINIB _kernel_intinib_table[TNUM_INTNO] = {$NL$
+ $JOINEACH intno INT.ORDER_LIST ",\n"$
+ $TAB${ ($INT.INTNO[intno]$), ($INT.INTATR[intno]$), ($INT.INTPRI[intno]$) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
+$END$$NL$
+$END$
+
+$
+$ CPU例外管理機能
+$
+/*$NL$
+$SPC$* CPU Exception Management Functions$NL$
+$SPC$*/$NL$
+$NL$
+
+$ CPU例外ハンドラに関するエラーチェック
+$i = 0$
+$FOREACH excno EXC.ORDER_LIST$
+$ // excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
+ $IF !LENGTH(FIND(EXCNO_DEFEXC_VALID, EXC.EXCNO[excno]))$
+ $ERROR EXC.TEXT_LINE[excno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+ $END$
+
+$ // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
+ $j = 0$
+ $FOREACH excno2 EXC.ORDER_LIST$
+ $IF EXC.EXCNO[excno] == EXC.EXCNO[excno2] && j < i$
+ $ERROR EXC.TEXT_LINE[excno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+ $END$
+ $j = j + 1$
+ $END$
+
+$ // excatrが(TA_NULL)でない場合(E_RSATR)
+ $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
+ $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
+ $END$
+ $i = i + 1$
+$END$
+
+$ CPU例外ハンドラのための標準的な初期化情報の生成
+$IF !OMIT_INITIALIZE_EXCEPTION$
+
+$ CPU例外ハンドラ数
+#define TNUM_EXCNO $LENGTH(EXC.ORDER_LIST)$$NL$
+const uint_t _kernel_tnum_excno = TNUM_EXCNO;$NL$
+$NL$
+$FOREACH excno EXC.ORDER_LIST$
+ EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
+$END$
+$NL$
+
+$ CPU例外ハンドラ初期化テーブル
+$IF LENGTH(EXC.ORDER_LIST)$
+ const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
+ $JOINEACH excno EXC.ORDER_LIST ",\n"$
+ $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
+ $END$$NL$
+ };$NL$
+$ELSE$
+ TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
+$END$$NL$
+$END$
+
+$
+$ 非タスクコンテキスト用のスタック領域
+$
+/*$NL$
+$SPC$* Stack Area for Non-task Context$NL$
+$SPC$*/$NL$
+$NL$
+
+$IF !LENGTH(ICS.ORDER_LIST)$
+$ // DEF_ICSがない場合のデフォルト値の設定
+ #ifdef DEFAULT_ISTK$NL$
+ $NL$
+ #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ$NL$
+ #define TOPPERS_ISTK DEFAULT_ISTK$NL$
+ $NL$
+ #else /* DEAULT_ISTK */$NL$
+ $NL$
+ static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];$NL$
+ #define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)$NL$
+ #define TOPPERS_ISTK _kernel_istack$NL$
+ $NL$
+ #endif /* DEAULT_ISTK */$NL$
+$ELSE$
+
+$ // 静的API「DEF_ICS」が複数ある(E_OBJ)
+ $IF LENGTH(ICS.ORDER_LIST) > 1$
+ $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$
+ $END$
+
+$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
+ $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
+ && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
+ $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
+ $END$
+
+ $IF EQ(ICS.ISTK[1], "NULL")$
+$ // スタック領域の自動割付け
+ static STK_T _kernel_istack[COUNT_STK_T($ICS.ISTKSZ[1]$)];$NL$
+ #define TOPPERS_ISTKSZ ROUND_STK_T($ICS.ISTKSZ[1]$)$NL$
+ #define TOPPERS_ISTK _kernel_istack$NL$
+ $ELSE$
+ #define TOPPERS_ISTKSZ ($ICS.ISTKSZ[1]$)$NL$
+ #define TOPPERS_ISTK ($ICS.ISTK[1]$)$NL$
+ $END$
+$END$
+$NL$
+
+$ 非タスクコンテキスト用のスタック領域
+const SIZE _kernel_istksz = TOPPERS_ISTKSZ;$NL$
+STK_T *const _kernel_istk = TOPPERS_ISTK;$NL$
+$NL$
+#ifdef TOPPERS_ISTKPT$NL$
+STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);$NL$
+#endif /* TOPPERS_ISTKPT */$NL$
+$NL$
+
+$
+$ タイムイベント管理
+$
+/*$NL$
+$SPC$* Time Event Management$NL$
+$SPC$*/$NL$
+$NL$
+TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];$NL$
+$NL$
+
+$
+$ 各モジュールの初期化関数
+$
+/*$NL$
+$SPC$* Module Initialization Function$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_initialize_object(void)$NL$
+{$NL$
+$TAB$_kernel_initialize_task();$NL$
+$IF LENGTH(SEM.ID_LIST)$ _kernel_initialize_semaphore();$NL$$END$
+$IF LENGTH(FLG.ID_LIST)$ _kernel_initialize_eventflag();$NL$$END$
+$IF LENGTH(DTQ.ID_LIST)$ _kernel_initialize_dataqueue();$NL$$END$
+$IF LENGTH(PDQ.ID_LIST)$ _kernel_initialize_pridataq();$NL$$END$
+$IF LENGTH(MBX.ID_LIST)$ _kernel_initialize_mailbox();$NL$$END$
+$IF LENGTH(MPF.ID_LIST)$ _kernel_initialize_mempfix();$NL$$END$
+$IF LENGTH(CYC.ID_LIST)$ _kernel_initialize_cyclic();$NL$$END$
+$IF LENGTH(ALM.ID_LIST)$ _kernel_initialize_alarm();$NL$$END$
+$TAB$_kernel_initialize_interrupt();$NL$
+$TAB$_kernel_initialize_exception();$NL$
+}$NL$
+$NL$
+
+$
+$ 初期化ルーチンの実行関数
+$
+/*$NL$
+$SPC$* Initialization Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_inirtn(void)$NL$
+{$NL$
+$FOREACH order INI.ORDER_LIST$
+$ // iniatrが(TA_NULL)でない場合(E_RSATR)
+ $IF INI.INIATR[order] != 0$
+ $ERROR INI.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "iniatr", INI.INIATR[order], "inirtn", INI.INIRTN[order], "ATT_INI")$$END$
+ $END$
+ $TAB$((INIRTN)($INI.INIRTN[order]$))((intptr_t)($INI.EXINF[order]$));$NL$
+$END$
+}$NL$
+$NL$
+
+$
+$ 終了処理ルーチンの実行関数
+$
+/*$NL$
+$SPC$* Termination Routine$NL$
+$SPC$*/$NL$
+$NL$
+void$NL$
+_kernel_call_terrtn(void)$NL$
+{$NL$
+$FOREACH rorder TER.RORDER_LIST$
+$ // teratrが(TA_NULL)でない場合(E_RSATR)
+ $IF TER.TERATR[rorder] != 0$
+ $ERROR TER.TEXT_LINE[rorder]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "teratr", TER.TERATR[rorder], "terrtn", TER.TERRTN[rorder], "ATT_TER")$$END$
+ $END$
+ $TAB$((TERRTN)($TER.TERRTN[rorder]$))((intptr_t)($TER.EXINF[rorder]$));$NL$
+$END$
+}$NL$
+$NL$
--- /dev/null
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
+TA_NULL,TA_NULL
+TA_ACT,TA_ACT
+TA_RSTR,TA_RSTR
+TA_TPRI,TA_TPRI
+TA_MPRI,TA_MPRI
+TA_WMUL,TA_WMUL
+TA_CLR,TA_CLR
+TA_STA,TA_STA
+TA_NONKERNEL,TA_NONKERNEL
+TA_ENAINT,TA_ENAINT
+TA_EDGE,TA_EDGE
+TMIN_TPRI,TMIN_TPRI,signed
+TMAX_TPRI,TMAX_TPRI,signed
+TMIN_DPRI,TMIN_DPRI,signed
+TMAX_DPRI,TMAX_DPRI,signed
+TMIN_MPRI,TMIN_MPRI,signed
+TMAX_MPRI,TMAX_MPRI,signed
+TMIN_ISRPRI,TMIN_ISRPRI,signed
+TMAX_ISRPRI,TMAX_ISRPRI,signed
+TMAX_MAXSEM,TMAX_MAXSEM
+TMAX_RELTIM,TMAX_RELTIM
+TMIN_INTPRI,TMIN_INTPRI,signed
+OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
+OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
+USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
+sizeof_ID,sizeof(ID)
+sizeof_uint_t,sizeof(uint_t)
+sizeof_SIZE,sizeof(SIZE)
+sizeof_ATR,sizeof(ATR)
+sizeof_PRI,sizeof(PRI)
+sizeof_void_ptr,sizeof(void*)
+sizeof_VP,sizeof(void*)
+sizeof_intptr_t,sizeof(intptr_t)
+sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
+sizeof_TINIB,sizeof(TINIB)
+offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
+offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
+offsetof_TINIB_task,"offsetof(TINIB,task)"
+offsetof_TINIB_ipriority,"offsetof(TINIB,ipriority)"
+offsetof_TINIB_stksz,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stksz)"
+offsetof_TINIB_stk,#!defined(USE_TSKINICTXB),,"offsetof(TINIB,stk)"
+offsetof_TINIB_texatr,"offsetof(TINIB,texatr)"
+offsetof_TINIB_texrtn,"offsetof(TINIB,texrtn)"
+sizeof_SEMINIB,sizeof(SEMINIB)
+offsetof_SEMINIB_sematr,"offsetof(SEMINIB,sematr)"
+offsetof_SEMINIB_isemcnt,"offsetof(SEMINIB,isemcnt)"
+offsetof_SEMINIB_maxsem,"offsetof(SEMINIB,maxsem)"
+sizeof_FLGPTN,sizeof(FLGPTN)
+sizeof_FLGINIB,sizeof(FLGINIB)
+offsetof_FLGINIB_flgatr,"offsetof(FLGINIB,flgatr)"
+offsetof_FLGINIB_iflgptn,"offsetof(FLGINIB,iflgptn)"
+sizeof_DTQINIB,sizeof(DTQINIB)
+offsetof_DTQINIB_dtqatr,"offsetof(DTQINIB,dtqatr)"
+offsetof_DTQINIB_dtqcnt,"offsetof(DTQINIB,dtqcnt)"
+offsetof_DTQINIB_p_dtqmb,"offsetof(DTQINIB,p_dtqmb)"
+sizeof_PDQINIB,sizeof(PDQINIB)
+offsetof_PDQINIB_pdqatr,"offsetof(PDQINIB,pdqatr)"
+offsetof_PDQINIB_pdqcnt,"offsetof(PDQINIB,pdqcnt)"
+offsetof_PDQINIB_maxdpri,"offsetof(PDQINIB,maxdpri)"
+offsetof_PDQINIB_p_pdqmb,"offsetof(PDQINIB,p_pdqmb)"
+sizeof_MBXINIB,sizeof(MBXINIB)
+offsetof_MBXINIB_mbxatr,"offsetof(MBXINIB,mbxatr)"
+offsetof_MBXINIB_maxmpri,"offsetof(MBXINIB,maxmpri)"
+sizeof_MPFINIB,sizeof(MPFINIB)
+offsetof_MPFINIB_mpfatr,"offsetof(MPFINIB,mpfatr)"
+offsetof_MPFINIB_blkcnt,"offsetof(MPFINIB,blkcnt)"
+offsetof_MPFINIB_blksz,"offsetof(MPFINIB,blksz)"
+offsetof_MPFINIB_mpf,"offsetof(MPFINIB,mpf)"
+offsetof_MPFINIB_p_mpfmb,"offsetof(MPFINIB,p_mpfmb)"
+sizeof_CYCINIB,sizeof(CYCINIB)
+offsetof_CYCINIB_cycatr,"offsetof(CYCINIB,cycatr)"
+offsetof_CYCINIB_exinf,"offsetof(CYCINIB,exinf)"
+offsetof_CYCINIB_cychdr,"offsetof(CYCINIB,cychdr)"
+offsetof_CYCINIB_cyctim,"offsetof(CYCINIB,cyctim)"
+offsetof_CYCINIB_cycphs,"offsetof(CYCINIB,cycphs)"
+sizeof_ALMINIB,sizeof(ALMINIB)
+offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
+offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
+offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
--- /dev/null
+# startup.c
+kerflg
+exit_kernel
+
+# task.c
+p_runtsk
+p_schedtsk
+reqflg
+ipmflg
+disdsp
+dspflg
+ready_queue
+ready_primap
+initialize_task
+search_schedtsk
+make_runnable
+make_non_runnable
+make_dormant
+make_active
+change_priority
+raise_priority
+rotate_ready_queue
+call_texrtn
+calltex
+
+# wait.c
+make_wait_tmout
+wait_complete
+wait_tmout
+wait_tmout_ok
+wait_release
+wobj_make_wait
+wobj_make_wait_tmout
+init_wait_queue
+
+# time_event.c
+current_time
+min_time
+next_time
+next_subtime
+last_index
+initialize_tmevt
+tmevt_up
+tmevt_down
+tmevtb_insert
+tmevtb_delete
+tmevt_lefttim
+signal_time
+
+# semaphore.c
+initialize_semaphore
+
+# eventflag.c
+initialize_eventflag
+check_flg_cond
+
+# dataqueue.c
+initialize_dataqueue
+enqueue_data
+force_enqueue_data
+dequeue_data
+send_data
+force_send_data
+receive_data
+
+# pridataq.c
+initialize_pridataq
+enqueue_pridata
+dequeue_pridata
+send_pridata
+receive_pridata
+
+# mailbox.c
+initialize_mailbox
+
+# mempfix.c
+initialize_mempfix
+get_mpf_block
+
+# cyclic.c
+initialize_cyclic
+call_cychdr
+
+# alarm.c
+initialize_alarm
+call_almhdr
+
+# interrupt.c
+initialize_interrupt
+
+# exception.c
+initialize_exception
+
+# kernel_cfg.c
+initialize_object
+call_inirtn
+call_terrtn
+tmax_tskid
+tinib_table
+torder_table
+tcb_table
+tmax_semid
+seminib_table
+semcb_table
+tmax_flgid
+flginib_table
+flgcb_table
+tmax_dtqid
+dtqcb_table
+dtqinib_table
+tmax_pdqid
+pdqcb_table
+pdqinib_table
+tmax_mbxid
+mbxcb_table
+mbxinib_table
+tmax_mpfid
+mpfinib_table
+mpfcb_table
+tmax_cycid
+cycinib_table
+cyccb_table
+tmax_almid
+alminib_table
+almcb_table
+tnum_inhno
+inhinib_table
+tnum_intno
+intinib_table
+tnum_excno
+excinib_table
+tmevt_heap
+istksz
+istk
+istkpt
+
+INCLUDE "target"
--- /dev/null
+/* This file is generated from kernel_rename.def by genrename. */
+
+#ifndef TOPPERS_KERNEL_RENAME_H
+#define TOPPERS_KERNEL_RENAME_H
+
+/*
+ * startup.c
+ */
+#define kerflg _kernel_kerflg
+#define exit_kernel _kernel_exit_kernel
+
+/*
+ * task.c
+ */
+#define p_runtsk _kernel_p_runtsk
+#define p_schedtsk _kernel_p_schedtsk
+#define reqflg _kernel_reqflg
+#define ipmflg _kernel_ipmflg
+#define disdsp _kernel_disdsp
+#define dspflg _kernel_dspflg
+#define ready_queue _kernel_ready_queue
+#define ready_primap _kernel_ready_primap
+#define initialize_task _kernel_initialize_task
+#define search_schedtsk _kernel_search_schedtsk
+#define make_runnable _kernel_make_runnable
+#define make_non_runnable _kernel_make_non_runnable
+#define make_dormant _kernel_make_dormant
+#define make_active _kernel_make_active
+#define change_priority _kernel_change_priority
+#define raise_priority _kernel_raise_priority
+#define rotate_ready_queue _kernel_rotate_ready_queue
+#define call_texrtn _kernel_call_texrtn
+#define calltex _kernel_calltex
+
+/*
+ * wait.c
+ */
+#define make_wait_tmout _kernel_make_wait_tmout
+#define wait_complete _kernel_wait_complete
+#define wait_tmout _kernel_wait_tmout
+#define wait_tmout_ok _kernel_wait_tmout_ok
+#define wait_release _kernel_wait_release
+#define wobj_make_wait _kernel_wobj_make_wait
+#define wobj_make_wait_tmout _kernel_wobj_make_wait_tmout
+#define init_wait_queue _kernel_init_wait_queue
+
+/*
+ * time_event.c
+ */
+#define current_time _kernel_current_time
+#define min_time _kernel_min_time
+#define next_time _kernel_next_time
+#define next_subtime _kernel_next_subtime
+#define last_index _kernel_last_index
+#define initialize_tmevt _kernel_initialize_tmevt
+#define tmevt_up _kernel_tmevt_up
+#define tmevt_down _kernel_tmevt_down
+#define tmevtb_insert _kernel_tmevtb_insert
+#define tmevtb_delete _kernel_tmevtb_delete
+#define tmevt_lefttim _kernel_tmevt_lefttim
+#define signal_time _kernel_signal_time
+
+/*
+ * semaphore.c
+ */
+#define initialize_semaphore _kernel_initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#define initialize_eventflag _kernel_initialize_eventflag
+#define check_flg_cond _kernel_check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#define initialize_dataqueue _kernel_initialize_dataqueue
+#define enqueue_data _kernel_enqueue_data
+#define force_enqueue_data _kernel_force_enqueue_data
+#define dequeue_data _kernel_dequeue_data
+#define send_data _kernel_send_data
+#define force_send_data _kernel_force_send_data
+#define receive_data _kernel_receive_data
+
+/*
+ * pridataq.c
+ */
+#define initialize_pridataq _kernel_initialize_pridataq
+#define enqueue_pridata _kernel_enqueue_pridata
+#define dequeue_pridata _kernel_dequeue_pridata
+#define send_pridata _kernel_send_pridata
+#define receive_pridata _kernel_receive_pridata
+
+/*
+ * mailbox.c
+ */
+#define initialize_mailbox _kernel_initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#define initialize_mempfix _kernel_initialize_mempfix
+#define get_mpf_block _kernel_get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#define initialize_cyclic _kernel_initialize_cyclic
+#define call_cychdr _kernel_call_cychdr
+
+/*
+ * alarm.c
+ */
+#define initialize_alarm _kernel_initialize_alarm
+#define call_almhdr _kernel_call_almhdr
+
+/*
+ * interrupt.c
+ */
+#define initialize_interrupt _kernel_initialize_interrupt
+
+/*
+ * exception.c
+ */
+#define initialize_exception _kernel_initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#define initialize_object _kernel_initialize_object
+#define call_inirtn _kernel_call_inirtn
+#define call_terrtn _kernel_call_terrtn
+#define tmax_tskid _kernel_tmax_tskid
+#define tinib_table _kernel_tinib_table
+#define torder_table _kernel_torder_table
+#define tcb_table _kernel_tcb_table
+#define tmax_semid _kernel_tmax_semid
+#define seminib_table _kernel_seminib_table
+#define semcb_table _kernel_semcb_table
+#define tmax_flgid _kernel_tmax_flgid
+#define flginib_table _kernel_flginib_table
+#define flgcb_table _kernel_flgcb_table
+#define tmax_dtqid _kernel_tmax_dtqid
+#define dtqcb_table _kernel_dtqcb_table
+#define dtqinib_table _kernel_dtqinib_table
+#define tmax_pdqid _kernel_tmax_pdqid
+#define pdqcb_table _kernel_pdqcb_table
+#define pdqinib_table _kernel_pdqinib_table
+#define tmax_mbxid _kernel_tmax_mbxid
+#define mbxcb_table _kernel_mbxcb_table
+#define mbxinib_table _kernel_mbxinib_table
+#define tmax_mpfid _kernel_tmax_mpfid
+#define mpfinib_table _kernel_mpfinib_table
+#define mpfcb_table _kernel_mpfcb_table
+#define tmax_cycid _kernel_tmax_cycid
+#define cycinib_table _kernel_cycinib_table
+#define cyccb_table _kernel_cyccb_table
+#define tmax_almid _kernel_tmax_almid
+#define alminib_table _kernel_alminib_table
+#define almcb_table _kernel_almcb_table
+#define tnum_inhno _kernel_tnum_inhno
+#define inhinib_table _kernel_inhinib_table
+#define tnum_intno _kernel_tnum_intno
+#define intinib_table _kernel_intinib_table
+#define tnum_excno _kernel_tnum_excno
+#define excinib_table _kernel_excinib_table
+#define tmevt_heap _kernel_tmevt_heap
+#define istksz _kernel_istksz
+#define istk _kernel_istk
+#define istkpt _kernel_istkpt
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ * startup.c
+ */
+#define _kerflg __kernel_kerflg
+#define _exit_kernel __kernel_exit_kernel
+
+/*
+ * task.c
+ */
+#define _p_runtsk __kernel_p_runtsk
+#define _p_schedtsk __kernel_p_schedtsk
+#define _reqflg __kernel_reqflg
+#define _ipmflg __kernel_ipmflg
+#define _disdsp __kernel_disdsp
+#define _dspflg __kernel_dspflg
+#define _ready_queue __kernel_ready_queue
+#define _ready_primap __kernel_ready_primap
+#define _initialize_task __kernel_initialize_task
+#define _search_schedtsk __kernel_search_schedtsk
+#define _make_runnable __kernel_make_runnable
+#define _make_non_runnable __kernel_make_non_runnable
+#define _make_dormant __kernel_make_dormant
+#define _make_active __kernel_make_active
+#define _change_priority __kernel_change_priority
+#define _raise_priority __kernel_raise_priority
+#define _rotate_ready_queue __kernel_rotate_ready_queue
+#define _call_texrtn __kernel_call_texrtn
+#define _calltex __kernel_calltex
+
+/*
+ * wait.c
+ */
+#define _make_wait_tmout __kernel_make_wait_tmout
+#define _wait_complete __kernel_wait_complete
+#define _wait_tmout __kernel_wait_tmout
+#define _wait_tmout_ok __kernel_wait_tmout_ok
+#define _wait_release __kernel_wait_release
+#define _wobj_make_wait __kernel_wobj_make_wait
+#define _wobj_make_wait_tmout __kernel_wobj_make_wait_tmout
+#define _init_wait_queue __kernel_init_wait_queue
+
+/*
+ * time_event.c
+ */
+#define _current_time __kernel_current_time
+#define _min_time __kernel_min_time
+#define _next_time __kernel_next_time
+#define _next_subtime __kernel_next_subtime
+#define _last_index __kernel_last_index
+#define _initialize_tmevt __kernel_initialize_tmevt
+#define _tmevt_up __kernel_tmevt_up
+#define _tmevt_down __kernel_tmevt_down
+#define _tmevtb_insert __kernel_tmevtb_insert
+#define _tmevtb_delete __kernel_tmevtb_delete
+#define _tmevt_lefttim __kernel_tmevt_lefttim
+#define _signal_time __kernel_signal_time
+
+/*
+ * semaphore.c
+ */
+#define _initialize_semaphore __kernel_initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#define _initialize_eventflag __kernel_initialize_eventflag
+#define _check_flg_cond __kernel_check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#define _initialize_dataqueue __kernel_initialize_dataqueue
+#define _enqueue_data __kernel_enqueue_data
+#define _force_enqueue_data __kernel_force_enqueue_data
+#define _dequeue_data __kernel_dequeue_data
+#define _send_data __kernel_send_data
+#define _force_send_data __kernel_force_send_data
+#define _receive_data __kernel_receive_data
+
+/*
+ * pridataq.c
+ */
+#define _initialize_pridataq __kernel_initialize_pridataq
+#define _enqueue_pridata __kernel_enqueue_pridata
+#define _dequeue_pridata __kernel_dequeue_pridata
+#define _send_pridata __kernel_send_pridata
+#define _receive_pridata __kernel_receive_pridata
+
+/*
+ * mailbox.c
+ */
+#define _initialize_mailbox __kernel_initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#define _initialize_mempfix __kernel_initialize_mempfix
+#define _get_mpf_block __kernel_get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#define _initialize_cyclic __kernel_initialize_cyclic
+#define _call_cychdr __kernel_call_cychdr
+
+/*
+ * alarm.c
+ */
+#define _initialize_alarm __kernel_initialize_alarm
+#define _call_almhdr __kernel_call_almhdr
+
+/*
+ * interrupt.c
+ */
+#define _initialize_interrupt __kernel_initialize_interrupt
+
+/*
+ * exception.c
+ */
+#define _initialize_exception __kernel_initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#define _initialize_object __kernel_initialize_object
+#define _call_inirtn __kernel_call_inirtn
+#define _call_terrtn __kernel_call_terrtn
+#define _tmax_tskid __kernel_tmax_tskid
+#define _tinib_table __kernel_tinib_table
+#define _torder_table __kernel_torder_table
+#define _tcb_table __kernel_tcb_table
+#define _tmax_semid __kernel_tmax_semid
+#define _seminib_table __kernel_seminib_table
+#define _semcb_table __kernel_semcb_table
+#define _tmax_flgid __kernel_tmax_flgid
+#define _flginib_table __kernel_flginib_table
+#define _flgcb_table __kernel_flgcb_table
+#define _tmax_dtqid __kernel_tmax_dtqid
+#define _dtqcb_table __kernel_dtqcb_table
+#define _dtqinib_table __kernel_dtqinib_table
+#define _tmax_pdqid __kernel_tmax_pdqid
+#define _pdqcb_table __kernel_pdqcb_table
+#define _pdqinib_table __kernel_pdqinib_table
+#define _tmax_mbxid __kernel_tmax_mbxid
+#define _mbxcb_table __kernel_mbxcb_table
+#define _mbxinib_table __kernel_mbxinib_table
+#define _tmax_mpfid __kernel_tmax_mpfid
+#define _mpfinib_table __kernel_mpfinib_table
+#define _mpfcb_table __kernel_mpfcb_table
+#define _tmax_cycid __kernel_tmax_cycid
+#define _cycinib_table __kernel_cycinib_table
+#define _cyccb_table __kernel_cyccb_table
+#define _tmax_almid __kernel_tmax_almid
+#define _alminib_table __kernel_alminib_table
+#define _almcb_table __kernel_almcb_table
+#define _tnum_inhno __kernel_tnum_inhno
+#define _inhinib_table __kernel_inhinib_table
+#define _tnum_intno __kernel_tnum_intno
+#define _intinib_table __kernel_intinib_table
+#define _tnum_excno __kernel_tnum_excno
+#define _excinib_table __kernel_excinib_table
+#define _tmevt_heap __kernel_tmevt_heap
+#define _istksz __kernel_istksz
+#define _istk __kernel_istk
+#define _istkpt __kernel_istkpt
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_rename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
--- /dev/null
+/* This file is generated from kernel_rename.def by genrename. */
+
+/* This file is included only when kernel_rename.h has been included. */
+#ifdef TOPPERS_KERNEL_RENAME_H
+#undef TOPPERS_KERNEL_RENAME_H
+
+/*
+ * startup.c
+ */
+#undef kerflg
+#undef exit_kernel
+
+/*
+ * task.c
+ */
+#undef p_runtsk
+#undef p_schedtsk
+#undef reqflg
+#undef ipmflg
+#undef disdsp
+#undef dspflg
+#undef ready_queue
+#undef ready_primap
+#undef initialize_task
+#undef search_schedtsk
+#undef make_runnable
+#undef make_non_runnable
+#undef make_dormant
+#undef make_active
+#undef change_priority
+#undef raise_priority
+#undef rotate_ready_queue
+#undef call_texrtn
+#undef calltex
+
+/*
+ * wait.c
+ */
+#undef make_wait_tmout
+#undef wait_complete
+#undef wait_tmout
+#undef wait_tmout_ok
+#undef wait_release
+#undef wobj_make_wait
+#undef wobj_make_wait_tmout
+#undef init_wait_queue
+
+/*
+ * time_event.c
+ */
+#undef current_time
+#undef min_time
+#undef next_time
+#undef next_subtime
+#undef last_index
+#undef initialize_tmevt
+#undef tmevt_up
+#undef tmevt_down
+#undef tmevtb_insert
+#undef tmevtb_delete
+#undef tmevt_lefttim
+#undef signal_time
+
+/*
+ * semaphore.c
+ */
+#undef initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#undef initialize_eventflag
+#undef check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#undef initialize_dataqueue
+#undef enqueue_data
+#undef force_enqueue_data
+#undef dequeue_data
+#undef send_data
+#undef force_send_data
+#undef receive_data
+
+/*
+ * pridataq.c
+ */
+#undef initialize_pridataq
+#undef enqueue_pridata
+#undef dequeue_pridata
+#undef send_pridata
+#undef receive_pridata
+
+/*
+ * mailbox.c
+ */
+#undef initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#undef initialize_mempfix
+#undef get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#undef initialize_cyclic
+#undef call_cychdr
+
+/*
+ * alarm.c
+ */
+#undef initialize_alarm
+#undef call_almhdr
+
+/*
+ * interrupt.c
+ */
+#undef initialize_interrupt
+
+/*
+ * exception.c
+ */
+#undef initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#undef initialize_object
+#undef call_inirtn
+#undef call_terrtn
+#undef tmax_tskid
+#undef tinib_table
+#undef torder_table
+#undef tcb_table
+#undef tmax_semid
+#undef seminib_table
+#undef semcb_table
+#undef tmax_flgid
+#undef flginib_table
+#undef flgcb_table
+#undef tmax_dtqid
+#undef dtqcb_table
+#undef dtqinib_table
+#undef tmax_pdqid
+#undef pdqcb_table
+#undef pdqinib_table
+#undef tmax_mbxid
+#undef mbxcb_table
+#undef mbxinib_table
+#undef tmax_mpfid
+#undef mpfinib_table
+#undef mpfcb_table
+#undef tmax_cycid
+#undef cycinib_table
+#undef cyccb_table
+#undef tmax_almid
+#undef alminib_table
+#undef almcb_table
+#undef tnum_inhno
+#undef inhinib_table
+#undef tnum_intno
+#undef intinib_table
+#undef tnum_excno
+#undef excinib_table
+#undef tmevt_heap
+#undef istksz
+#undef istk
+#undef istkpt
+
+
+#ifdef TOPPERS_LABEL_ASM
+
+/*
+ * startup.c
+ */
+#undef _kerflg
+#undef _exit_kernel
+
+/*
+ * task.c
+ */
+#undef _p_runtsk
+#undef _p_schedtsk
+#undef _reqflg
+#undef _ipmflg
+#undef _disdsp
+#undef _dspflg
+#undef _ready_queue
+#undef _ready_primap
+#undef _initialize_task
+#undef _search_schedtsk
+#undef _make_runnable
+#undef _make_non_runnable
+#undef _make_dormant
+#undef _make_active
+#undef _change_priority
+#undef _raise_priority
+#undef _rotate_ready_queue
+#undef _call_texrtn
+#undef _calltex
+
+/*
+ * wait.c
+ */
+#undef _make_wait_tmout
+#undef _wait_complete
+#undef _wait_tmout
+#undef _wait_tmout_ok
+#undef _wait_release
+#undef _wobj_make_wait
+#undef _wobj_make_wait_tmout
+#undef _init_wait_queue
+
+/*
+ * time_event.c
+ */
+#undef _current_time
+#undef _min_time
+#undef _next_time
+#undef _next_subtime
+#undef _last_index
+#undef _initialize_tmevt
+#undef _tmevt_up
+#undef _tmevt_down
+#undef _tmevtb_insert
+#undef _tmevtb_delete
+#undef _tmevt_lefttim
+#undef _signal_time
+
+/*
+ * semaphore.c
+ */
+#undef _initialize_semaphore
+
+/*
+ * eventflag.c
+ */
+#undef _initialize_eventflag
+#undef _check_flg_cond
+
+/*
+ * dataqueue.c
+ */
+#undef _initialize_dataqueue
+#undef _enqueue_data
+#undef _force_enqueue_data
+#undef _dequeue_data
+#undef _send_data
+#undef _force_send_data
+#undef _receive_data
+
+/*
+ * pridataq.c
+ */
+#undef _initialize_pridataq
+#undef _enqueue_pridata
+#undef _dequeue_pridata
+#undef _send_pridata
+#undef _receive_pridata
+
+/*
+ * mailbox.c
+ */
+#undef _initialize_mailbox
+
+/*
+ * mempfix.c
+ */
+#undef _initialize_mempfix
+#undef _get_mpf_block
+
+/*
+ * cyclic.c
+ */
+#undef _initialize_cyclic
+#undef _call_cychdr
+
+/*
+ * alarm.c
+ */
+#undef _initialize_alarm
+#undef _call_almhdr
+
+/*
+ * interrupt.c
+ */
+#undef _initialize_interrupt
+
+/*
+ * exception.c
+ */
+#undef _initialize_exception
+
+/*
+ * kernel_cfg.c
+ */
+#undef _initialize_object
+#undef _call_inirtn
+#undef _call_terrtn
+#undef _tmax_tskid
+#undef _tinib_table
+#undef _torder_table
+#undef _tcb_table
+#undef _tmax_semid
+#undef _seminib_table
+#undef _semcb_table
+#undef _tmax_flgid
+#undef _flginib_table
+#undef _flgcb_table
+#undef _tmax_dtqid
+#undef _dtqcb_table
+#undef _dtqinib_table
+#undef _tmax_pdqid
+#undef _pdqcb_table
+#undef _pdqinib_table
+#undef _tmax_mbxid
+#undef _mbxcb_table
+#undef _mbxinib_table
+#undef _tmax_mpfid
+#undef _mpfinib_table
+#undef _mpfcb_table
+#undef _tmax_cycid
+#undef _cycinib_table
+#undef _cyccb_table
+#undef _tmax_almid
+#undef _alminib_table
+#undef _almcb_table
+#undef _tnum_inhno
+#undef _inhinib_table
+#undef _tnum_intno
+#undef _intinib_table
+#undef _tnum_excno
+#undef _excinib_table
+#undef _tmevt_heap
+#undef _istksz
+#undef _istk
+#undef _istkpt
+
+
+#endif /* TOPPERS_LABEL_ASM */
+
+#include "target_unrename.h"
+
+#endif /* TOPPERS_KERNEL_RENAME_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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: sys_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * システム状態管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ROT_RDQ_ENTER
+#define LOG_ROT_RDQ_ENTER(tskpri)
+#endif /* LOG_ROT_RDQ_ENTER */
+
+#ifndef LOG_ROT_RDQ_LEAVE
+#define LOG_ROT_RDQ_LEAVE(ercd)
+#endif /* LOG_ROT_RDQ_LEAVE */
+
+#ifndef LOG_IROT_RDQ_ENTER
+#define LOG_IROT_RDQ_ENTER(tskpri)
+#endif /* LOG_IROT_RDQ_ENTER */
+
+#ifndef LOG_IROT_RDQ_LEAVE
+#define LOG_IROT_RDQ_LEAVE(ercd)
+#endif /* LOG_IROT_RDQ_LEAVE */
+
+#ifndef LOG_GET_TID_ENTER
+#define LOG_GET_TID_ENTER(p_tskid)
+#endif /* LOG_GET_TID_ENTER */
+
+#ifndef LOG_GET_TID_LEAVE
+#define LOG_GET_TID_LEAVE(ercd, tskid)
+#endif /* LOG_GET_TID_LEAVE */
+
+#ifndef LOG_IGET_TID_ENTER
+#define LOG_IGET_TID_ENTER(p_tskid)
+#endif /* LOG_IGET_TID_ENTER */
+
+#ifndef LOG_IGET_TID_LEAVE
+#define LOG_IGET_TID_LEAVE(ercd, tskid)
+#endif /* LOG_IGET_TID_LEAVE */
+
+#ifndef LOG_LOC_CPU_ENTER
+#define LOG_LOC_CPU_ENTER()
+#endif /* LOG_LOC_CPU_ENTER */
+
+#ifndef LOG_LOC_CPU_LEAVE
+#define LOG_LOC_CPU_LEAVE(ercd)
+#endif /* LOG_LOC_CPU_LEAVE */
+
+#ifndef LOG_ILOC_CPU_ENTER
+#define LOG_ILOC_CPU_ENTER()
+#endif /* LOG_ILOC_CPU_ENTER */
+
+#ifndef LOG_ILOC_CPU_LEAVE
+#define LOG_ILOC_CPU_LEAVE(ercd)
+#endif /* LOG_ILOC_CPU_LEAVE */
+
+#ifndef LOG_UNL_CPU_ENTER
+#define LOG_UNL_CPU_ENTER()
+#endif /* LOG_UNL_CPU_ENTER */
+
+#ifndef LOG_UNL_CPU_LEAVE
+#define LOG_UNL_CPU_LEAVE(ercd)
+#endif /* LOG_UNL_CPU_LEAVE */
+
+#ifndef LOG_IUNL_CPU_ENTER
+#define LOG_IUNL_CPU_ENTER()
+#endif /* LOG_IUNL_CPU_ENTER */
+
+#ifndef LOG_IUNL_CPU_LEAVE
+#define LOG_IUNL_CPU_LEAVE(ercd)
+#endif /* LOG_IUNL_CPU_LEAVE */
+
+#ifndef LOG_DIS_DSP_ENTER
+#define LOG_DIS_DSP_ENTER()
+#endif /* LOG_DIS_DSP_ENTER */
+
+#ifndef LOG_DIS_DSP_LEAVE
+#define LOG_DIS_DSP_LEAVE(ercd)
+#endif /* LOG_DIS_DSP_LEAVE */
+
+#ifndef LOG_ENA_DSP_ENTER
+#define LOG_ENA_DSP_ENTER()
+#endif /* LOG_ENA_DSP_ENTER */
+
+#ifndef LOG_ENA_DSP_LEAVE
+#define LOG_ENA_DSP_LEAVE(ercd)
+#endif /* LOG_ENA_DSP_LEAVE */
+
+#ifndef LOG_SNS_CTX_ENTER
+#define LOG_SNS_CTX_ENTER()
+#endif /* LOG_SNS_CTX_ENTER */
+
+#ifndef LOG_SNS_CTX_LEAVE
+#define LOG_SNS_CTX_LEAVE(state)
+#endif /* LOG_SNS_CTX_LEAVE */
+
+#ifndef LOG_SNS_LOC_ENTER
+#define LOG_SNS_LOC_ENTER()
+#endif /* LOG_SNS_LOC_ENTER */
+
+#ifndef LOG_SNS_LOC_LEAVE
+#define LOG_SNS_LOC_LEAVE(state)
+#endif /* LOG_SNS_LOC_LEAVE */
+
+#ifndef LOG_SNS_DSP_ENTER
+#define LOG_SNS_DSP_ENTER()
+#endif /* LOG_SNS_DSP_ENTER */
+
+#ifndef LOG_SNS_DSP_LEAVE
+#define LOG_SNS_DSP_LEAVE(state)
+#endif /* LOG_SNS_DSP_LEAVE */
+
+#ifndef LOG_SNS_DPN_ENTER
+#define LOG_SNS_DPN_ENTER()
+#endif /* LOG_SNS_DPN_ENTER */
+
+#ifndef LOG_SNS_DPN_LEAVE
+#define LOG_SNS_DPN_LEAVE(state)
+#endif /* LOG_SNS_DPN_LEAVE */
+
+#ifndef LOG_SNS_KER_ENTER
+#define LOG_SNS_KER_ENTER()
+#endif /* LOG_SNS_KER_ENTER */
+
+#ifndef LOG_SNS_KER_LEAVE
+#define LOG_SNS_KER_LEAVE(state)
+#endif /* LOG_SNS_KER_LEAVE */
+
+/*
+ * タスクの優先順位の回転
+ */
+#ifdef TOPPERS_rot_rdq
+
+ER
+rot_rdq(PRI tskpri)
+{
+ uint_t pri;
+ QUEUE *p_queue;
+ ER ercd;
+
+ LOG_ROT_RDQ_ENTER(tskpri);
+ CHECK_TSKCTX_UNL();
+ CHECK_TPRI_SELF(tskpri);
+
+ t_lock_cpu();
+ pri = (tskpri == TPRI_SELF) ? p_runtsk->priority : INT_PRIORITY(tskpri);
+ p_queue = &(ready_queue[pri]);
+ if (queue_empty(p_queue)) {
+ ercd = E_OK;
+ }
+ else if ((((TCB *)(p_queue->p_next))->p_tinib->tskatr & TA_RSTR) != 0U) {
+ ercd = E_NOSPT;
+ }
+ else {
+ if (rotate_ready_queue(p_queue)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ROT_RDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rot_rdq */
+
+/*
+ * タスクの優先順位の回転(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_irot_rdq
+
+ER
+irot_rdq(PRI tskpri)
+{
+ QUEUE *p_queue;
+ ER ercd;
+
+ LOG_IROT_RDQ_ENTER(tskpri);
+ CHECK_INTCTX_UNL();
+ CHECK_TPRI(tskpri);
+
+ i_lock_cpu();
+ p_queue = &(ready_queue[INT_PRIORITY(tskpri)]);
+ if (queue_empty(p_queue)) {
+ ercd = E_OK;
+ }
+ else if ((((TCB *)(p_queue->p_next))->p_tinib->tskatr & TA_RSTR) != 0U) {
+ ercd = E_NOSPT;
+ }
+ else {
+ if (rotate_ready_queue(p_queue)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IROT_RDQ_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_irot_rdq */
+
+/*
+ * 実行状態のタスクIDの参照
+ */
+#ifdef TOPPERS_get_tid
+
+ER
+get_tid(ID *p_tskid)
+{
+ ER ercd;
+
+ LOG_GET_TID_ENTER(p_tskid);
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ *p_tskid = TSKID(p_runtsk);
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_GET_TID_LEAVE(ercd, *p_tskid);
+ return(ercd);
+}
+
+#endif /* TOPPERS_get_tid */
+
+/*
+ * 実行状態のタスクIDの参照(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iget_tid
+
+ER
+iget_tid(ID *p_tskid)
+{
+ ER ercd;
+
+ LOG_IGET_TID_ENTER(p_tskid);
+ CHECK_INTCTX_UNL();
+
+ i_lock_cpu();
+ *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
+ ercd = E_OK;
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IGET_TID_LEAVE(ercd, *p_tskid);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iget_tid */
+
+/*
+ * CPUロック状態への移行
+ */
+#ifdef TOPPERS_loc_cpu
+
+ER
+loc_cpu(void)
+{
+ ER ercd;
+
+ LOG_LOC_CPU_ENTER();
+ CHECK_TSKCTX();
+
+ if (!t_sense_lock()) {
+ t_lock_cpu();
+ }
+ ercd = E_OK;
+
+ error_exit:
+ LOG_LOC_CPU_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_loc_cpu */
+
+/*
+ * CPUロック状態への移行(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iloc_cpu
+
+ER
+iloc_cpu(void)
+{
+ ER ercd;
+
+ LOG_ILOC_CPU_ENTER();
+ CHECK_INTCTX();
+
+ if (!i_sense_lock()) {
+ i_lock_cpu();
+ }
+ ercd = E_OK;
+
+ error_exit:
+ LOG_ILOC_CPU_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iloc_cpu */
+
+/*
+ * CPUロック状態の解除
+ *
+ * CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
+ * とはできないため,CPUロック状態の解除時にディスパッチャを起動する
+ * 必要はない.
+ */
+#ifdef TOPPERS_unl_cpu
+
+ER
+unl_cpu(void)
+{
+ ER ercd;
+
+ LOG_UNL_CPU_ENTER();
+ CHECK_TSKCTX();
+
+ if (t_sense_lock()) {
+ t_unlock_cpu();
+ }
+ ercd = E_OK;
+
+ error_exit:
+ LOG_UNL_CPU_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_unl_cpu */
+
+/*
+ * CPUロック状態の解除(非タスクコンテキスト用)
+ *
+ * CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
+ * とはできないため,CPUロック状態の解除時にディスパッチャの起動を要
+ * 求する必要はない.
+ */
+#ifdef TOPPERS_iunl_cpu
+
+ER
+iunl_cpu(void)
+{
+ ER ercd;
+
+ LOG_IUNL_CPU_ENTER();
+ CHECK_INTCTX();
+
+ if (i_sense_lock()) {
+ i_unlock_cpu();
+ }
+ ercd = E_OK;
+
+ error_exit:
+ LOG_IUNL_CPU_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iunl_cpu */
+
+/*
+ * ディスパッチの禁止
+ */
+#ifdef TOPPERS_dis_dsp
+
+ER
+dis_dsp(void)
+{
+ ER ercd;
+
+ LOG_DIS_DSP_ENTER();
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ disdsp = true;
+ dspflg = false;
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DIS_DSP_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_dis_dsp */
+
+/*
+ * ディスパッチの許可
+ */
+#ifdef TOPPERS_ena_dsp
+
+ER
+ena_dsp(void)
+{
+ ER ercd;
+
+ LOG_ENA_DSP_ENTER();
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ disdsp = false;
+ if (ipmflg) {
+ dspflg = true;
+ if (p_runtsk != p_schedtsk) {
+ dispatch();
+ }
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ENA_DSP_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ena_dsp */
+
+/*
+ * コンテキストの参照
+ */
+#ifdef TOPPERS_sns_ctx
+
+bool_t
+sns_ctx(void)
+{
+ bool_t state;
+
+ LOG_SNS_CTX_ENTER();
+ state = sense_context() ? true : false;
+ LOG_SNS_CTX_LEAVE(state);
+ return(state);
+}
+
+#endif /* TOPPERS_sns_ctx */
+
+/*
+ * CPUロック状態の参照
+ */
+#ifdef TOPPERS_sns_loc
+
+bool_t
+sns_loc(void)
+{
+ bool_t state;
+
+ LOG_SNS_LOC_ENTER();
+ state = x_sense_lock() ? true : false;
+ LOG_SNS_LOC_LEAVE(state);
+ return(state);
+}
+
+#endif /* TOPPERS_sns_loc */
+
+/*
+ * ディスパッチ禁止状態の参照
+ */
+#ifdef TOPPERS_sns_dsp
+
+bool_t
+sns_dsp(void)
+{
+ bool_t state;
+
+ LOG_SNS_DSP_ENTER();
+ state = disdsp;
+ LOG_SNS_DSP_LEAVE(state);
+ return(state);
+}
+
+#endif /* TOPPERS_sns_dsp */
+
+/*
+ * ディスパッチ保留状態の参照
+ */
+#ifdef TOPPERS_sns_dpn
+
+bool_t
+sns_dpn(void)
+{
+ bool_t state;
+
+ LOG_SNS_DPN_ENTER();
+ state = (sense_context() || t_sense_lock() || !dspflg) ? true : false;
+ LOG_SNS_DPN_LEAVE(state);
+ return(state);
+}
+
+#endif /* TOPPERS_sns_dpn */
+
+/*
+ * カーネル非動作状態の参照
+ */
+#ifdef TOPPERS_sns_ker
+
+bool_t
+sns_ker(void)
+{
+ bool_t state;
+
+ LOG_SNS_KER_ENTER();
+ state = kerflg ? false : true;
+ LOG_SNS_KER_LEAVE(state);
+ return(state);
+}
+
+#endif /* TOPPERS_sns_ker */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * タスク管理モジュール
+ */
+
+#include "kernel_impl.h"
+#include "wait.h"
+#include "task.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TEX_ENTER
+#define LOG_TEX_ENTER(p_tcb, texptn)
+#endif /* LOG_TEX_ENTER */
+
+#ifndef LOG_TEX_LEAVE
+#define LOG_TEX_LEAVE(p_tcb)
+#endif /* LOG_TEX_LEAVE */
+
+#ifdef TOPPERS_tskini
+
+/*
+ * 実行状態のタスク
+ */
+TCB *p_runtsk;
+
+/*
+ * 最高優先順位のタスク
+ */
+TCB *p_schedtsk;
+
+/*
+ * タスクディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ */
+bool_t reqflg;
+
+/*
+ * 割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
+ * ディスパッチ禁止状態
+ */
+bool_t disdsp;
+
+/*
+ * タスクディスパッチ可能状態
+ */
+bool_t dspflg;
+
+/*
+ * レディキュー
+ */
+QUEUE ready_queue[TNUM_TPRI];
+
+/*
+ * レディキューサーチのためのビットマップ
+ */
+uint16_t ready_primap;
+
+/*
+ * タスク管理モジュールの初期化
+ */
+void
+initialize_task(void)
+{
+ uint_t i, j;
+ TCB *p_tcb;
+
+ p_runtsk = p_schedtsk = NULL;
+ reqflg = false;
+ ipmflg = true;
+ disdsp = false;
+ dspflg = true;
+
+ for (i = 0; i < TNUM_TPRI; i++) {
+ queue_initialize(&(ready_queue[i]));
+ }
+ ready_primap = 0U;
+
+ for (i = 0; i < tnum_tsk; i++) {
+ j = INDEX_TSK(torder_table[i]);
+ p_tcb = &(tcb_table[j]);
+ p_tcb->p_tinib = &(tinib_table[j]);
+ p_tcb->actque = false;
+ make_dormant(p_tcb);
+ if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
+ make_active(p_tcb);
+ }
+ }
+}
+
+#endif /* TOPPERS_tskini */
+
+/*
+ * ビットマップサーチ関数
+ *
+ * bitmap内の1のビットの内,最も下位(右)のものをサーチし,そのビッ
+ * ト番号を返す.ビット番号は,最下位ビットを0とする.bitmapに0を指定
+ * してはならない.この関数では,bitmapが16ビットであることを仮定し,
+ * uint16_t型としている.
+ *
+ * ビットサーチ命令を持つプロセッサでは,ビットサーチ命令を使うように
+ * 書き直した方が効率が良い場合がある.このような場合には,ターゲット
+ * 依存部でビットサーチ命令を使ったbitmap_searchを定義し,
+ * OMIT_BITMAP_SEARCHをマクロ定義すればよい.また,ビットサーチ命令の
+ * サーチ方向が逆などの理由で優先度とビットとの対応を変更したい場合に
+ * は,PRIMAP_BITをマクロ定義すればよい.
+ *
+ * また,ライブラリにffsがあるなら,次のように定義してライブラリ関数を
+ * 使った方が効率が良い可能性もある.
+ * #define bitmap_search(bitmap) (ffs(bitmap) - 1)
+ */
+#ifndef PRIMAP_BIT
+#define PRIMAP_BIT(pri) (1U << (pri))
+#endif /* PRIMAP_BIT */
+
+#ifndef OMIT_BITMAP_SEARCH
+
+static const unsigned char bitmap_search_table[] = { 0, 1, 0, 2, 0, 1, 0,
+ 3, 0, 1, 0, 2, 0, 1, 0 };
+
+Inline uint_t
+bitmap_search(uint16_t bitmap)
+{
+ uint_t n = 0U;
+
+ assert(bitmap != 0U);
+ if ((bitmap & 0x00ffU) == 0U) {
+ bitmap >>= 8;
+ n += 8;
+ }
+ if ((bitmap & 0x0fU) == 0U) {
+ bitmap >>= 4;
+ n += 4;
+ }
+ return(n + bitmap_search_table[(bitmap & 0x0fU) - 1]);
+}
+
+#endif /* OMIT_BITMAP_SEARCH */
+
+/*
+ * 優先度ビットマップが空かのチェック
+ */
+Inline bool_t
+primap_empty(void)
+{
+ return(ready_primap == 0U);
+}
+
+/*
+ * 優先度ビットマップのサーチ
+ */
+Inline uint_t
+primap_search(void)
+{
+ return(bitmap_search(ready_primap));
+}
+
+/*
+ * 優先度ビットマップのセット
+ */
+Inline void
+primap_set(uint_t pri)
+{
+ ready_primap |= PRIMAP_BIT(pri);
+}
+
+/*
+ * 優先度ビットマップのクリア
+ */
+Inline void
+primap_clear(uint_t pri)
+{
+ ready_primap &= ~PRIMAP_BIT(pri);
+}
+
+/*
+ * 最高優先順位タスクのサーチ
+ */
+#ifdef TOPPERS_tsksched
+
+TCB *
+search_schedtsk(void)
+{
+ uint_t schedpri;
+
+ schedpri = primap_search();
+ return((TCB *)(ready_queue[schedpri].p_next));
+}
+
+#endif /* TOPPERS_tsksched */
+
+/*
+ * 実行できる状態への遷移
+ *
+ * 最高優先順位のタスクを更新するのは,実行できるタスクがなかった場合
+ * と,p_tcbの優先度が最高優先順位のタスクの優先度よりも高い場合であ
+ * る.
+ */
+#ifdef TOPPERS_tskrun
+
+bool_t
+make_runnable(TCB *p_tcb)
+{
+ uint_t pri = p_tcb->priority;
+
+ queue_insert_prev(&(ready_queue[pri]), &(p_tcb->task_queue));
+ primap_set(pri);
+
+ if (p_schedtsk == (TCB *) NULL || pri < p_schedtsk->priority) {
+ p_schedtsk = p_tcb;
+ return(dspflg);
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tskrun */
+
+/*
+ * 実行できる状態から他の状態への遷移
+ *
+ * 最高優先順位のタスクを更新するのは,p_tcbが最高優先順位のタスクで
+ * あった場合である.p_tcbと同じ優先度のタスクが他にある場合は,p_tcb
+ * の次のタスクが最高優先順位になる.そうでない場合は,レディキューを
+ * サーチする必要がある.
+ */
+#ifdef TOPPERS_tsknrun
+
+bool_t
+make_non_runnable(TCB *p_tcb)
+{
+ uint_t pri = p_tcb->priority;
+ QUEUE *p_queue = &(ready_queue[pri]);
+
+ queue_delete(&(p_tcb->task_queue));
+ if (queue_empty(p_queue)) {
+ primap_clear(pri);
+ if (p_schedtsk == p_tcb) {
+ p_schedtsk = primap_empty() ? (TCB *) NULL : search_schedtsk();
+ return(dspflg);
+ }
+ }
+ else {
+ if (p_schedtsk == p_tcb) {
+ p_schedtsk = (TCB *)(p_queue->p_next);
+ return(dspflg);
+ }
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tsknrun */
+
+/*
+ * 休止状態への遷移
+ */
+#ifdef TOPPERS_tskdmt
+
+void
+make_dormant(TCB *p_tcb)
+{
+ p_tcb->tstat = TS_DORMANT;
+ p_tcb->priority = p_tcb->p_tinib->ipriority;
+ p_tcb->wupque = false;
+ p_tcb->enatex = false;
+ p_tcb->texptn = 0U;
+ LOG_TSKSTAT(p_tcb);
+}
+
+#endif /* TOPPERS_tskdmt */
+
+/*
+ * 休止状態から実行できる状態への遷移
+ */
+#ifdef TOPPERS_tskact
+
+bool_t
+make_active(TCB *p_tcb)
+{
+ activate_context(p_tcb);
+ p_tcb->tstat = TS_RUNNABLE;
+ LOG_TSKSTAT(p_tcb);
+ return(make_runnable(p_tcb));
+}
+
+#endif /* TOPPERS_tskact */
+
+/*
+ * タスクの優先度の変更
+ *
+ * タスクが実行できる状態の場合には,レディキューの中での位置を変更す
+ * る.オブジェクトの待ちキューの中で待ち状態になっている場合には,待
+ * ちキューの中での位置を変更する.
+ *
+ * 最高優先順位のタスクを更新するのは,(1) p_tcbが最高優先順位のタス
+ * クであって,その優先度を下げた場合,(2) p_tcbが最高優先順位のタス
+ * クではなく,変更後の優先度が最高優先順位のタスクの優先度よりも高い
+ * 場合である.(1)の場合には,レディキューをサーチする必要がある.
+ */
+#ifdef TOPPERS_tskpri
+
+bool_t
+change_priority(TCB *p_tcb, uint_t newpri)
+{
+ uint_t oldpri;
+
+ oldpri = p_tcb->priority;
+ p_tcb->priority = newpri;
+
+ if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+ /*
+ * タスクが実行できる状態の場合
+ */
+ queue_delete(&(p_tcb->task_queue));
+ if (queue_empty(&(ready_queue[oldpri]))) {
+ primap_clear(oldpri);
+ }
+ queue_insert_prev(&(ready_queue[newpri]), &(p_tcb->task_queue));
+ primap_set(newpri);
+
+ if (p_schedtsk == p_tcb) {
+ if (newpri >= oldpri) {
+ p_schedtsk = search_schedtsk();
+ return(p_schedtsk != p_tcb && dspflg);
+ }
+ }
+ else {
+ if (newpri < p_schedtsk->priority) {
+ p_schedtsk = p_tcb;
+ return(dspflg);
+ }
+ }
+ }
+ else {
+ if (TSTAT_WAIT_WOBJCB(p_tcb->tstat)) {
+ /*
+ * タスクが,同期・通信オブジェクトの管理ブロックの共通部
+ * 分(WOBJCB)の待ちキューにつながれている場合
+ */
+ wobj_change_priority(((WINFO_WOBJ *)(p_tcb->p_winfo))->p_wobjcb,
+ p_tcb);
+ }
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tskpri */
+
+/*
+ * 自タスクの優先度の引き上げ
+ */
+#ifdef TOPPERS_tskrpri
+
+bool_t
+raise_priority(uint_t newpri)
+{
+ uint_t oldpri;
+
+ oldpri = p_runtsk->priority;
+ p_runtsk->priority = newpri;
+
+ queue_delete(&(p_runtsk->task_queue));
+ if (queue_empty(&(ready_queue[oldpri]))) {
+ primap_clear(oldpri);
+ }
+ queue_insert_next(&(ready_queue[newpri]), &(p_runtsk->task_queue));
+ primap_set(newpri);
+
+ if (p_schedtsk == p_runtsk) {
+ if (newpri > oldpri) {
+ p_schedtsk = search_schedtsk();
+ return(p_schedtsk != p_runtsk && dspflg);
+ }
+ }
+ else {
+ assert(!dspflg);
+ if (newpri <= p_schedtsk->priority) {
+ p_schedtsk = p_runtsk;
+ }
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tskrpri */
+
+/*
+ * レディキューの回転
+ *
+ * 最高優先順位のタスクを更新するのは,最高優先順位のタスクがタスクキ
+ * ューの末尾に移動した場合である.
+ */
+#ifdef TOPPERS_tskrot
+
+bool_t
+rotate_ready_queue(QUEUE *p_queue)
+{
+ QUEUE *p_entry;
+
+ if (p_queue->p_next->p_next != p_queue) {
+ p_entry = queue_delete_next(p_queue);
+ queue_insert_prev(p_queue, p_entry);
+ if (p_schedtsk == (TCB *) p_entry) {
+ p_schedtsk = (TCB *)(p_queue->p_next);
+ return(dspflg);
+ }
+ }
+ return(false);
+}
+
+#endif /* TOPPERS_tskrot */
+
+/*
+ * タスク例外処理ルーチンの呼出し
+ *
+ * ASPカーネルでは,タスク例外処理ルーチン内でCPUロック状態に遷移し,
+ * 元の状態に戻さずにリターンした場合,カーネルが元の状態に戻す.
+ */
+#ifdef TOPPERS_tsktex
+
+void
+call_texrtn(void)
+{
+ TEXPTN texptn;
+ bool_t saved_disdsp;
+
+ saved_disdsp = disdsp;
+ p_runtsk->enatex = false;
+ do {
+ texptn = p_runtsk->texptn;
+ p_runtsk->texptn = 0U;
+
+ t_unlock_cpu();
+ LOG_TEX_ENTER(p_runtsk, texptn);
+ (*((TEXRTN)(p_runtsk->p_tinib->texrtn)))(texptn,
+ p_runtsk->p_tinib->exinf);
+ LOG_TEX_LEAVE(p_runtsk);
+ if (!t_sense_lock()) {
+ t_lock_cpu();
+ }
+ if (!ipmflg) {
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
+ disdsp = saved_disdsp;
+ dspflg = !disdsp;
+ p_runtsk->enatex = false;
+ if (p_runtsk != p_schedtsk && dspflg) {
+ /*
+ * ここでdispatchを呼び出す処理は,相互再帰呼出しになって
+ * いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
+ * おけば支障がない.その理由については,「TOPPERS/ASP カー
+ * ネル 設計メモ」を参照のこと.
+ */
+ dispatch();
+ }
+ } while (p_runtsk->texptn != 0U);
+ p_runtsk->enatex = true;
+}
+
+/*
+ * タスク例外処理ルーチンの起動
+ */
+#ifndef OMIT_CALLTEX
+
+void
+calltex(void)
+{
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
+ call_texrtn();
+ }
+}
+
+#endif /* OMIT_CALLTEX */
+#endif /* TOPPERS_tsktex */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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.h 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * タスク管理モジュール
+ */
+
+#ifndef TOPPERS_TASK_H
+#define TOPPERS_TASK_H
+
+#include <queue.h>
+#include "time_event.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_TSKSTAT
+#define LOG_TSKSTAT(p_tcb)
+#endif /* LOG_TSKSTAT */
+
+/*
+ * タスク優先度の内部表現・外部表現変換マクロ
+ */
+#define INT_PRIORITY(x) ((uint_t)((x) - TMIN_TPRI))
+#define EXT_TSKPRI(x) ((PRI)(x) + TMIN_TPRI)
+
+/*
+ * タスク状態の内部表現
+ *
+ * TCB中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY)
+ * は区別しない.両状態を総称して,実行できる状態(RUNNABLE)と呼ぶ.
+ * 二重待ち状態は,(TS_WAITING | TS_SUSPENDED)で表す.TS_WAIT_???は待
+ * ち要因を表し,待ち状態(二重待ち状態を含む)の場合にのみ設定する.
+ */
+#define TS_DORMANT 0x00U /* 休止状態 */
+#define TS_RUNNABLE 0x01U /* 実行できる状態 */
+#define TS_WAITING 0x02U /* 待ち状態 */
+#define TS_SUSPENDED 0x04U /* 強制待ち状態 */
+
+#define TS_WAIT_DLY (0x00U << 3) /* 時間経過待ち */
+#define TS_WAIT_SLP (0x01U << 3) /* 起床待ち */
+#define TS_WAIT_RDTQ (0x02U << 3) /* データキューからの受信待ち */
+#define TS_WAIT_RPDQ (0x03U << 3) /* 優先度データキューからの受信待ち */
+#define TS_WAIT_SEM (0x04U << 3) /* セマフォ資源の獲得待ち */
+#define TS_WAIT_FLG (0x05U << 3) /* イベントフラグ待ち */
+#define TS_WAIT_SDTQ (0x06U << 3) /* データキューへの送信待ち */
+#define TS_WAIT_SPDQ (0x07U << 3) /* 優先度データキューへの送信待ち */
+#define TS_WAIT_MBX (0x08U << 3) /* メールボックスからの受信待ち */
+#define TS_WAIT_MPF (0x09U << 3) /* 固定長メモリブロックの獲得待ち */
+
+/*
+ * タスク状態判別マクロ
+ *
+ * TSTAT_DORMANTはタスクが休止状態であるかどうかを,TSTAT_RUNNABLEは
+ * タスクが実行できる状態であるかどうかを判別する.TSTAT_WAITINGは待
+ * ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDEDは
+ * 強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する.
+ */
+#define TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT)
+#define TSTAT_RUNNABLE(tstat) (((tstat) & TS_RUNNABLE) != 0U)
+#define TSTAT_WAITING(tstat) (((tstat) & TS_WAITING) != 0U)
+#define TSTAT_SUSPENDED(tstat) (((tstat) & TS_SUSPENDED) != 0U)
+
+/*
+ * タスク待ち要因判別マクロ
+ *
+ * TSTAT_WAIT_SLPはタスクが起床待ちであるかどうかを,TSTAT_WAIT_WOBJ
+ * はタスクが同期・通信オブジェクトに対する待ちであるか(言い換えると,
+ * 同期通信オブジェクトの待ちキューにつながれているか)どうかを判別す
+ * る.また,TSTAT_WAIT_WOBJCBはタスクが同期・通信オブジェクトの管理
+ * ブロックの共通部分(WOBJCB)の待ちキューにつながれているかどうかを
+ * 判別する.
+ *
+ * TSTAT_WAIT_SLPは,任意のタスク状態の中から,タスクが起床待ちである
+ * ことを判別できる.すなわち,TSTAT_WAITINGにより待ち状態であることを
+ * 判別せずに,TSTAT_SLPだけを用いて起床待ち状態であることを判別できる.
+ * これを効率的に実現するために,TS_WAIT_SLPの値を,(0x00U << 3)ではな
+ * く(0x01U << 3)としている.そのため,タスクが時間経過待ち状態である
+ * ことを判別するためのTSTAT_WAIT_DLYを,TSTAT_WAIT_SLPと同様の方法で
+ * 実現することはできない.
+ */
+#define TS_WAIT_MASK (0x0fU << 3) /* 待ち要因の取出しマスク */
+
+#define TSTAT_WAIT_SLP(tstat) (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP)
+#define TSTAT_WAIT_WOBJ(tstat) (((tstat) & TS_WAIT_MASK) >= TS_WAIT_RDTQ)
+#define TSTAT_WAIT_WOBJCB(tstat) (((tstat) & TS_WAIT_MASK) >= TS_WAIT_SEM)
+
+/*
+ * 待ち情報ブロック(WINFO)の定義
+ *
+ * タスクが待ち状態の間は,TCBおよびそのp_winfoで指されるWINFOを次の
+ * ように設定しなければならない.
+ *
+ * (a) TCBのタスク状態を待ち状態(TS_WAITING)にする.その際に,待ち
+ * 要因(TS_WAIT_???)も設定する.
+ *
+ * (b) タイムアウトを監視するために,タイムイベントブロックを登録する.
+ * 登録するタイムイベントブロックは,待ちに入るサービスコール処理関数
+ * のローカル変数として確保し,それへのポインタをWINFOのp_tmevtbに記
+ * 憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には,
+ * p_tmevtbをNULLにする.
+ *
+ * 同期・通信オブジェクトに対する待ち状態の場合には,標準のWINFOに
+ * p_wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.hで定義)を使
+ * う.また,以下の(c)〜(e)の設定を行う必要がある.同期・通信オブジェ
+ * クトに関係しない待ち(起床待ち,時間経過待ち)の場合には,(c)〜(e)
+ * は必要ない.
+ *
+ * (c) TCBを待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待
+ * ちキューにつなぐために,task_queueを使う.
+ *
+ * (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを,
+ * WINFO_WOBJのp_wobjcbに記憶する.
+ *
+ * (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な
+ * 情報がある場合には,WINFO_WOBJに必要な情報のためのフィールドを追加
+ * した構造体を定義し,WINFO_WOBJの代わりに用いる.
+ *
+ * 待ち状態を解除する際には,待ち解除したタスクに対する返値をWINFOの
+ * wercdに設定する.wercdが必要なのは待ち解除以降であるのに対して,
+ * p_tmevtbは待ち解除後は必要ないため,メモリ節約のために共用体を使っ
+ * ている.そのため,wercdへエラーコードを設定するのは,タイムイベント
+ * ブロックを登録解除した後にしなければならない.
+ */
+typedef union waiting_information {
+ ER wercd; /* 待ち解除時のエラーコード */
+ TMEVTB *p_tmevtb; /* 待ち状態用のタイムイベントブロック */
+} WINFO;
+
+/*
+ * タスク初期化ブロック
+ *
+ * タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク
+ * 初期化ブロック)と,値が変化するためにRAMに置かなければならない部
+ * 分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化
+ * ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する
+ * TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい
+ * が,実行効率が悪くなるために採用していない.他のオブジェクトについ
+ * ても同様に扱う.
+ *
+ * タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ
+ * ンに関する情報も含む.
+ */
+typedef struct task_initialization_block {
+ ATR tskatr; /* タスク属性 */
+ intptr_t exinf; /* タスクの拡張情報 */
+ TASK task; /* タスクの起動番地 */
+ uint_t ipriority; /* タスクの起動時優先度(内部表現) */
+
+#ifdef USE_TSKINICTXB
+ TSKINICTXB tskinictxb; /* タスク初期化コンテキストブロック */
+#else /* USE_TSKINICTXB */
+ SIZE stksz; /* スタック領域のサイズ(丸めた値) */
+ void *stk; /* スタック領域の先頭番地 */
+#endif /* USE_TSKINICTXB */
+
+ ATR texatr; /* タスク例外処理ルーチン属性 */
+ TEXRTN texrtn; /* タスク例外処理ルーチンの起動番地 */
+} TINIB;
+
+/*
+ * TCB中のフィールドのビット幅の定義
+ *
+ * プロセッサによっては,TCB中のフィールドのビット幅でメモリ使用量と
+ * 性能がトレードオフになるため,ターゲット依存にフィールドのビット幅
+ * を変更することを許している.
+ */
+#ifndef TBIT_TCB_PRIORITY
+#define TBIT_TCB_PRIORITY 8 /* priorityフィールドのビット幅 */
+#endif /* TBIT_TCB_PRIORITY */
+
+/*
+ * タスク管理ブロック(TCB)
+ *
+ * ASPカーネルでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT)
+ * と起床要求キューイング数の最大値(TMAX_WUPCNT)は1に固定されている
+ * ため,キューイングされているかどうかの真偽値で表現することができる.
+ * また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が1に固定されてい
+ * るので,強制待ち要求ネスト数(suscnt)は必要ない.
+ *
+ * TCBのいくつかのフィールドは,特定のタスク状態でのみ有効な値を保持し,
+ * それ以外の場合は値が保証されない(よって,参照してはならない).各
+ * フィールドが有効な値を保持する条件は次の通り.
+ *
+ * ・初期化後は常に有効:
+ * p_tinib,tstat,actque
+ * ・休止状態以外で有効(休止状態では初期値になっている):
+ * priority,wupque,enatex,texptn
+ * ・待ち状態(二重待ち状態を含む)で有効:
+ * p_winfo
+ * ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効:
+ * task_queue
+ * ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効:
+ * tskctxb
+ */
+typedef struct task_control_block {
+ QUEUE task_queue; /* タスクキュー */
+ const TINIB *p_tinib; /* 初期化ブロックへのポインタ */
+
+#ifdef UINT8_MAX
+ uint8_t tstat; /* タスク状態(内部表現)*/
+#else /* UINT8_MAX */
+ BIT_FIELD_UINT tstat : 8; /* タスク状態(内部表現)*/
+#endif /* UINT8_MAX */
+#if defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8)
+ uint8_t priority; /* 現在の優先度(内部表現)*/
+#else /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+ BIT_FIELD_UINT priority : TBIT_TCB_PRIORITY;
+ /* 現在の優先度(内部表現)*/
+#endif /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */
+ BIT_FIELD_BOOL actque : 1; /* 起動要求キューイング */
+ BIT_FIELD_BOOL wupque : 1; /* 起床要求キューイング */
+ BIT_FIELD_BOOL enatex : 1; /* タスク例外処理許可状態 */
+
+ TEXPTN texptn; /* 保留例外要因 */
+ WINFO *p_winfo; /* 待ち情報ブロックへのポインタ */
+ TSKCTXB tskctxb; /* タスクコンテキストブロック */
+} TCB;
+
+/*
+ * 実行状態のタスク
+ *
+ * 実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の
+ * TCBを指すポインタ.実行状態のタスクがない場合はNULLにする.
+ *
+ * サービスコールの処理中で,自タスク(サービスコールを呼び出したタス
+ * ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え
+ * るのは,ディスパッチャ(と初期化処理)のみである.
+ */
+extern TCB *p_runtsk;
+
+/*
+ * 最高優先順位のタスク
+ *
+ * 実行できるタスクの中で最高優先順位のタスクのTCBを指すポインタ.実
+ * 行できるタスクがない場合はNULLにする.
+ *
+ * ディスパッチ禁止状態など,ディスパッチが保留されている間はp_runtsk
+ * と一致しているとは限らない.
+ */
+extern TCB *p_schedtsk;
+
+/*
+ * ディスパッチ/タスク例外処理ルーチン起動要求フラグ
+ *
+ * 割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは
+ * タスク例外処理ルーチンの起動を要求することを示すフラグ.
+ */
+extern bool_t reqflg;
+
+/*
+ * 割込み優先度マスク全解除状態
+ *
+ * 割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t ipmflg;
+
+/*
+ * ディスパッチ禁止状態
+ *
+ * ディスパッチ禁止状態であることを示すフラグ.
+ */
+extern bool_t disdsp;
+
+/*
+ * タスクディスパッチ可能状態
+ *
+ * 割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ
+ * スパッチ禁止状態でない)ことを示すフラグ.
+ */
+extern bool_t dspflg;
+
+/*
+ * レディキュー
+ *
+ * レディキューは,実行できる状態のタスクを管理するためのキューである.
+ * 実行状態のタスクも管理しているため,レディ(実行可能)キューという
+ * 名称は正確ではないが,レディキューという名称が定着しているため,こ
+ * の名称で呼ぶことにする.
+ *
+ * レディキューは,優先度ごとのタスクキューで構成されている.タスクの
+ * TCBは,該当する優先度のキューに登録される.
+ */
+extern QUEUE ready_queue[TNUM_TPRI];
+
+/*
+ * レディキューサーチのためのビットマップ
+ *
+ * レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー
+ * にタスクが入っているかどうかを示すビットマップを用意している.ビッ
+ * トマップを使うことで,メモリアクセスの回数を減らすことができるが,
+ * ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない
+ * 場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち
+ * る可能性もある.
+ *
+ * 優先度が16段階であることを仮定しているため,uint16_t型としている.
+ */
+extern uint16_t ready_primap;
+
+/*
+ * タスクIDの最大値(kernel_cfg.c)
+ */
+extern const ID tmax_tskid;
+
+/*
+ * タスク初期化ブロックのエリア(kernel_cfg.c)
+ */
+extern const TINIB tinib_table[];
+
+/*
+ * タスク生成順序テーブル(kernel_cfg.c)
+ */
+extern const ID torder_table[];
+
+/*
+ * TCBのエリア(kernel_cfg.c)
+ */
+extern TCB tcb_table[];
+
+/*
+ * タスクの数
+ */
+#define tnum_tsk ((uint_t)(tmax_tskid - TMIN_TSKID + 1))
+
+/*
+ * タスクIDからTCBを取り出すためのマクロ
+ */
+#define INDEX_TSK(tskid) ((uint_t)((tskid) - TMIN_TSKID))
+#define get_tcb(tskid) (&(tcb_table[INDEX_TSK(tskid)]))
+#define get_tcb_self(tskid) ((tskid) == TSK_SELF ? p_runtsk : get_tcb(tskid))
+
+/*
+ * TCBからタスクIDを取り出すためのマクロ
+ */
+#define TSKID(p_tcb) ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID))
+
+/*
+ * タスク管理モジュールの初期化
+ */
+extern void initialize_task(void);
+
+/*
+ * 最高優先順位タスクのサーチ
+ *
+ * レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ
+ * を返す.レディキューが空の場合には,この関数を呼び出してはならない.
+ */
+extern TCB *search_schedtsk(void);
+
+/*
+ * 実行できる状態への遷移
+ *
+ * p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入
+ * したタスクの優先度が,最高優先順位のタスクの優先度よりも高い場合は,
+ * 最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを返
+ * す.そうでない場合はfalseを返す.
+ */
+extern bool_t make_runnable(TCB *p_tcb);
+
+/*
+ * 実行できる状態から他の状態への遷移
+ *
+ * p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した
+ * タスクが最高優先順位のタスクであった場合には,最高優先順位のタスク
+ * を設定しなおし,ディスパッチ許可状態であればtrueを返す.そうでない
+ * 場合はfalseを返す.タスクの状態は更新しない.
+ */
+extern bool_t make_non_runnable(TCB *p_tcb);
+
+/*
+ * 休止状態への遷移
+ *
+ * p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動
+ * 時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設
+ * 定する.
+ */
+extern void make_dormant(TCB *p_tcb);
+
+/*
+ * 休止状態から実行できる状態への遷移
+ *
+ * p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする.
+ * 実行できる状態に遷移したタスクへのディスパッチが必要な場合はtrue,
+ * そうでない場合はfalseを返す.
+ */
+extern bool_t make_active(TCB *p_tcb);
+
+/*
+ * タスクの優先度の変更
+ *
+ * p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また,
+ * 必要な場合には最高優先順位のタスクを更新し,ディスパッチ許可状態で
+ * あればtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t change_priority(TCB *p_tcb, uint_t newpri);
+
+/*
+ * 自タスクの優先度の引き上げ
+ *
+ * 自タスクの優先度をnewpri(内部表現)に変更する.また,必要な場合に
+ * は最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを
+ * 返す.そうでない場合はfalseを返す.
+ */
+extern bool_t raise_priority(uint_t newpri);
+
+/*
+ * レディキューの回転
+ *
+ * レディキュー中の,p_queueで指定されるタスクキューを回転させる.また,
+ * 必要な場合には最高優先順位のタスクを変更し,ディスパッチが保留され
+ * ていなければtrueを返す.そうでない場合はfalseを返す.
+ */
+extern bool_t rotate_ready_queue(QUEUE *p_queue);
+
+/*
+ * タスク例外処理ルーチンの呼出し
+ *
+ * タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの
+ * 保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解
+ * 除する.
+ *
+ * タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間
+ * に保留例外要因が0でなくなっていれば,再びタスク例外処理ルーチンを
+ * 呼び出す.保留例外要因が0の場合には,例外処理許可状態にして関数か
+ * らリターンする.
+ *
+ * この関数は,実行状態のタスクが,タスク例外処理許可状態(enatexが
+ * true)で,保留例外要因が0でない(texptnが0でない)場合に呼び出すこ
+ * とを想定している.この関数は,CPUロック状態で呼び出さなければなら
+ * ない.
+ */
+extern void call_texrtn(void);
+
+/*
+ * タスク例外処理ルーチンの起動
+ *
+ * 実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば,
+ * タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時
+ * は,一時的にCPUロックを解除する.
+ *
+ * この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口
+ * 処理から呼び出されることを想定している.この関数は,CPUロック状態
+ * で呼び出さなければならない.
+ *
+ * 実行効率を上げるために,この関数をターゲット依存部で記述してもよい.
+ * その場合には,OMIT_CALLTEXをマクロ定義する.
+ */
+extern void calltex(void);
+
+#endif /* TOPPERS_TASK_H */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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_manage.c 2018 2010-12-31 13:43:05Z ertl-hiro $
+ */
+
+/*
+ * タスク管理機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_ACT_TSK_ENTER
+#define LOG_ACT_TSK_ENTER(tskid)
+#endif /* LOG_ACT_TSK_ENTER */
+
+#ifndef LOG_ACT_TSK_LEAVE
+#define LOG_ACT_TSK_LEAVE(ercd)
+#endif /* LOG_ACT_TSK_LEAVE */
+
+#ifndef LOG_IACT_TSK_ENTER
+#define LOG_IACT_TSK_ENTER(tskid)
+#endif /* LOG_IACT_TSK_ENTER */
+
+#ifndef LOG_IACT_TSK_LEAVE
+#define LOG_IACT_TSK_LEAVE(ercd)
+#endif /* LOG_IACT_TSK_LEAVE */
+
+#ifndef LOG_CAN_ACT_ENTER
+#define LOG_CAN_ACT_ENTER(tskid)
+#endif /* LOG_CAN_ACT_ENTER */
+
+#ifndef LOG_CAN_ACT_LEAVE
+#define LOG_CAN_ACT_LEAVE(ercd)
+#endif /* LOG_CAN_ACT_LEAVE */
+
+#ifndef LOG_EXT_TSK_ENTER
+#define LOG_EXT_TSK_ENTER()
+#endif /* LOG_EXT_TSK_ENTER */
+
+#ifndef LOG_EXT_TSK_LEAVE
+#define LOG_EXT_TSK_LEAVE(ercd)
+#endif /* LOG_EXT_TSK_LEAVE */
+
+#ifndef LOG_TER_TSK_ENTER
+#define LOG_TER_TSK_ENTER(tskid)
+#endif /* LOG_TER_TSK_ENTER */
+
+#ifndef LOG_TER_TSK_LEAVE
+#define LOG_TER_TSK_LEAVE(ercd)
+#endif /* LOG_TER_TSK_LEAVE */
+
+#ifndef LOG_CHG_PRI_ENTER
+#define LOG_CHG_PRI_ENTER(tskid, tskpri)
+#endif /* LOG_CHG_PRI_ENTER */
+
+#ifndef LOG_CHG_PRI_LEAVE
+#define LOG_CHG_PRI_LEAVE(ercd)
+#endif /* LOG_CHG_PRI_LEAVE */
+
+#ifndef LOG_RAS_PRI_ENTER
+#define LOG_RAS_PRI_ENTER(tskpri)
+#endif /* LOG_RAS_PRI_ENTER */
+
+#ifndef LOG_RAS_PRI_LEAVE
+#define LOG_RAS_PRI_LEAVE(ercd)
+#endif /* LOG_RAS_PRI_LEAVE */
+
+#ifndef LOG_GET_PRI_ENTER
+#define LOG_GET_PRI_ENTER(tskid, p_tskpri)
+#endif /* LOG_GET_PRI_ENTER */
+
+#ifndef LOG_GET_PRI_LEAVE
+#define LOG_GET_PRI_LEAVE(ercd, tskpri)
+#endif /* LOG_GET_PRI_LEAVE */
+
+#ifndef LOG_GET_INF_ENTER
+#define LOG_GET_INF_ENTER(p_exinf)
+#endif /* LOG_GET_INF_ENTER */
+
+#ifndef LOG_GET_INF_LEAVE
+#define LOG_GET_INF_LEAVE(ercd, exinf)
+#endif /* LOG_GET_INF_LEAVE */
+
+/*
+ * タスクの起動
+ */
+#ifdef TOPPERS_act_tsk
+
+ER
+act_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_ACT_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ if (make_active(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->actque)) {
+ p_tcb->actque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_ACT_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_act_tsk */
+
+/*
+ * タスクの起動(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iact_tsk
+
+ER
+iact_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_IACT_TSK_ENTER(tskid);
+ CHECK_INTCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+
+ i_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ if (make_active(p_tcb)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->actque)) {
+ p_tcb->actque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IACT_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iact_tsk */
+
+/*
+ * タスク起動要求のキャンセル
+ */
+#ifdef TOPPERS_can_act
+
+ER_UINT
+can_act(ID tskid)
+{
+ TCB *p_tcb;
+ ER_UINT ercd;
+
+ LOG_CAN_ACT_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ ercd = p_tcb->actque ? 1 : 0;
+ p_tcb->actque = false;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CAN_ACT_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_can_act */
+
+/*
+ * 自タスクの終了
+ */
+#ifdef TOPPERS_ext_tsk
+
+ER
+ext_tsk(void)
+{
+ ER ercd;
+
+ LOG_EXT_TSK_ENTER();
+ CHECK_TSKCTX();
+
+ if (t_sense_lock()) {
+ /*
+ * CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
+ * てからタスクを終了する.実装上は,サービスコール内でのCPU
+ * ロックを省略すればよいだけ.
+ */
+ }
+ else {
+ t_lock_cpu();
+ }
+ if (disdsp) {
+ /*
+ * ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
+ * チ許可状態にしてからタスクを終了する.
+ */
+ disdsp = false;
+ }
+ if (!ipmflg) {
+ /*
+ * 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
+ * が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
+ * る.
+ */
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
+ dspflg = true;
+
+ (void) make_non_runnable(p_runtsk);
+ make_dormant(p_runtsk);
+ if (p_runtsk->actque) {
+ p_runtsk->actque = false;
+ (void) make_active(p_runtsk);
+ }
+ exit_and_dispatch();
+ ercd = E_SYS;
+
+ error_exit:
+ LOG_EXT_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ext_tsk */
+
+/*
+ * タスクの強制終了
+ */
+#ifdef TOPPERS_ter_tsk
+
+ER
+ter_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_TER_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+ CHECK_NONSELF(p_tcb);
+
+ t_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+ /*
+ * p_tcbは自タスクでないため,(シングルプロセッサでは)実
+ * 行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ
+ * チが必要になることはない.
+ */
+ (void) make_non_runnable(p_tcb);
+ }
+ else if (TSTAT_WAITING(p_tcb->tstat)) {
+ wait_dequeue_wobj(p_tcb);
+ wait_dequeue_tmevtb(p_tcb);
+ }
+ make_dormant(p_tcb);
+ if (p_tcb->actque) {
+ p_tcb->actque = false;
+ if (make_active(p_tcb)) {
+ dispatch();
+ }
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TER_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ter_tsk */
+
+/*
+ * タスクのベース優先度の変更
+ */
+#ifdef TOPPERS_chg_pri
+
+ER
+chg_pri(ID tskid, PRI tskpri)
+{
+ TCB *p_tcb;
+ uint_t newpri;
+ ER ercd;
+
+ LOG_CHG_PRI_ENTER(tskid, tskpri);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ CHECK_TPRI_INI(tskpri);
+ p_tcb = get_tcb_self(tskid);
+ CHECK_NONRSTR(p_tcb);
+ newpri = (tskpri == TPRI_INI) ? p_tcb->p_tinib->ipriority
+ : INT_PRIORITY(tskpri);
+
+ t_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (change_priority(p_tcb, newpri)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CHG_PRI_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_chg_pri */
+
+/*
+ * 自タスクの優先度の引き上げ
+ */
+#ifdef TOPPERS_ras_pri
+
+ER
+ras_pri(PRI tskpri)
+{
+ uint_t newpri;
+ ER ercd;
+
+ LOG_RAS_PRI_ENTER(tskpri);
+ CHECK_TSKCTX_UNL();
+ CHECK_TPRI_INI(tskpri);
+ if (tskpri == TPRI_INI) {
+ newpri = p_runtsk->p_tinib->ipriority;
+ }
+ else {
+ newpri = INT_PRIORITY(tskpri);
+ CHECK_ILUSE(newpri <= p_runtsk->p_tinib->ipriority);
+ }
+
+ t_lock_cpu();
+ if (raise_priority(newpri)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_RAS_PRI_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_ras_pri */
+
+/*
+ * タスク優先度の参照
+ */
+#ifdef TOPPERS_get_pri
+
+ER
+get_pri(ID tskid, PRI *p_tskpri)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_GET_PRI_ENTER(tskid, p_tskpri);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+
+ t_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ *p_tskpri = EXT_TSKPRI(p_tcb->priority);
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_GET_PRI_LEAVE(ercd, *p_tskpri);
+ return(ercd);
+}
+
+#endif /* TOPPERS_get_pri */
+
+/*
+ * 自タスクの拡張情報の参照
+ */
+#ifdef TOPPERS_get_inf
+
+ER
+get_inf(intptr_t *p_exinf)
+{
+ ER ercd;
+
+ LOG_GET_INF_ENTER(p_exinf);
+ CHECK_TSKCTX_UNL();
+
+ t_lock_cpu();
+ *p_exinf = p_runtsk->p_tinib->exinf;
+ ercd = E_OK;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_GET_INF_LEAVE(ercd, *p_exinf);
+ return(ercd);
+}
+
+#endif /* TOPPERS_get_inf */
--- /dev/null
+/*
+ * TOPPERS/ASP Kernel
+ * Toyohashi Open Platform for Embedded Real-Time Systems/
+ * Advanced Standard Profile Kernel
+ *
+ * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
+ * Toyohashi Univ. of Technology, JAPAN
+ * Copyright (C) 2005-2010 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_sync.c 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ * タスク付属同期機能
+ */
+
+#include "kernel_impl.h"
+#include "check.h"
+#include "task.h"
+#include "wait.h"
+
+/*
+ * トレースログマクロのデフォルト定義
+ */
+#ifndef LOG_SLP_TSK_ENTER
+#define LOG_SLP_TSK_ENTER()
+#endif /* LOG_SLP_TSK_ENTER */
+
+#ifndef LOG_SLP_TSK_LEAVE
+#define LOG_SLP_TSK_LEAVE(ercd)
+#endif /* LOG_SLP_TSK_LEAVE */
+
+#ifndef LOG_TSLP_TSK_ENTER
+#define LOG_TSLP_TSK_ENTER(tmout)
+#endif /* LOG_TSLP_TSK_ENTER */
+
+#ifndef LOG_TSLP_TSK_LEAVE
+#define LOG_TSLP_TSK_LEAVE(ercd)
+#endif /* LOG_TSLP_TSK_LEAVE */
+
+#ifndef LOG_WUP_TSK_ENTER
+#define LOG_WUP_TSK_ENTER(tskid)
+#endif /* LOG_WUP_TSK_ENTER */
+
+#ifndef LOG_WUP_TSK_LEAVE
+#define LOG_WUP_TSK_LEAVE(ercd)
+#endif /* LOG_WUP_TSK_LEAVE */
+
+#ifndef LOG_IWUP_TSK_ENTER
+#define LOG_IWUP_TSK_ENTER(tskid)
+#endif /* LOG_IWUP_TSK_ENTER */
+
+#ifndef LOG_IWUP_TSK_LEAVE
+#define LOG_IWUP_TSK_LEAVE(ercd)
+#endif /* LOG_IWUP_TSK_LEAVE */
+
+#ifndef LOG_CAN_WUP_ENTER
+#define LOG_CAN_WUP_ENTER(tskid)
+#endif /* LOG_CAN_WUP_ENTER */
+
+#ifndef LOG_CAN_WUP_LEAVE
+#define LOG_CAN_WUP_LEAVE(ercd)
+#endif /* LOG_CAN_WUP_LEAVE */
+
+#ifndef LOG_REL_WAI_ENTER
+#define LOG_REL_WAI_ENTER(tskid)
+#endif /* LOG_REL_WAI_ENTER */
+
+#ifndef LOG_REL_WAI_LEAVE
+#define LOG_REL_WAI_LEAVE(ercd)
+#endif /* LOG_REL_WAI_LEAVE */
+
+#ifndef LOG_IREL_WAI_ENTER
+#define LOG_IREL_WAI_ENTER(tskid)
+#endif /* LOG_IREL_WAI_ENTER */
+
+#ifndef LOG_IREL_WAI_LEAVE
+#define LOG_IREL_WAI_LEAVE(ercd)
+#endif /* LOG_IREL_WAI_LEAVE */
+
+#ifndef LOG_SUS_TSK_ENTER
+#define LOG_SUS_TSK_ENTER(tskid)
+#endif /* LOG_SUS_TSK_ENTER */
+
+#ifndef LOG_SUS_TSK_LEAVE
+#define LOG_SUS_TSK_LEAVE(ercd)
+#endif /* LOG_SUS_TSK_LEAVE */
+
+#ifndef LOG_RSM_TSK_ENTER
+#define LOG_RSM_TSK_ENTER(tskid)
+#endif /* LOG_RSM_TSK_ENTER */
+
+#ifndef LOG_RSM_TSK_LEAVE
+#define LOG_RSM_TSK_LEAVE(ercd)
+#endif /* LOG_RSM_TSK_LEAVE */
+
+#ifndef LOG_DLY_TSK_ENTER
+#define LOG_DLY_TSK_ENTER(dlytim)
+#endif /* LOG_DLY_TSK_ENTER */
+
+#ifndef LOG_DLY_TSK_LEAVE
+#define LOG_DLY_TSK_LEAVE(ercd)
+#endif /* LOG_DLY_TSK_LEAVE */
+
+/*
+ * 起床待ち
+ */
+#ifdef TOPPERS_slp_tsk
+
+ER
+slp_tsk(void)
+{
+ WINFO winfo;
+ ER ercd;
+
+ LOG_SLP_TSK_ENTER();
+ CHECK_DISPATCH();
+
+ t_lock_cpu();
+ if (p_runtsk->wupque) {
+ p_runtsk->wupque = false;
+ ercd = E_OK;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+ make_wait(&winfo);
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SLP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_slp_tsk */
+
+/*
+ * 起床待ち(タイムアウトあり)
+ */
+#ifdef TOPPERS_tslp_tsk
+
+ER
+tslp_tsk(TMO tmout)
+{
+ WINFO winfo;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_TSLP_TSK_ENTER(tmout);
+ CHECK_DISPATCH();
+ CHECK_TMOUT(tmout);
+
+ t_lock_cpu();
+ if (p_runtsk->wupque) {
+ p_runtsk->wupque = false;
+ ercd = E_OK;
+ }
+ else if (tmout == TMO_POL) {
+ ercd = E_TMOUT;
+ }
+ else {
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
+ make_wait_tmout(&winfo, &tmevtb, tmout);
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo.wercd;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_TSLP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_tslp_tsk */
+
+/*
+ * タスクの起床
+ */
+#ifdef TOPPERS_wup_tsk
+
+ER
+wup_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_WUP_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+ CHECK_NONRSTR(p_tcb);
+
+ t_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+ if (wait_complete(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->wupque)) {
+ p_tcb->wupque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_WUP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_wup_tsk */
+
+/*
+ * タスクの起床(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_iwup_tsk
+
+ER
+iwup_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_IWUP_TSK_ENTER(tskid);
+ CHECK_INTCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+ CHECK_NONRSTR(p_tcb);
+
+ i_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
+ if (wait_complete(p_tcb)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ else if (!(p_tcb->wupque)) {
+ p_tcb->wupque = true;
+ ercd = E_OK;
+ }
+ else {
+ ercd = E_QOVR;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IWUP_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_iwup_tsk */
+
+/*
+ * タスク起床要求のキャンセル
+ */
+#ifdef TOPPERS_can_wup
+
+ER_UINT
+can_wup(ID tskid)
+{
+ TCB *p_tcb;
+ ER_UINT ercd;
+
+ LOG_CAN_WUP_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+ CHECK_NONRSTR(p_tcb);
+
+ t_lock_cpu();
+ if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ ercd = p_tcb->wupque ? 1 : 0;
+ p_tcb->wupque = false;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_CAN_WUP_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_can_wup */
+
+/*
+ * 待ち状態の強制解除
+ */
+#ifdef TOPPERS_rel_wai
+
+ER
+rel_wai(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_REL_WAI_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+ CHECK_NONRSTR(p_tcb);
+
+ t_lock_cpu();
+ if (!TSTAT_WAITING(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (wait_release(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_REL_WAI_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rel_wai */
+
+/*
+ * 待ち状態の強制解除(非タスクコンテキスト用)
+ */
+#ifdef TOPPERS_irel_wai
+
+ER
+irel_wai(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_IREL_WAI_ENTER(tskid);
+ CHECK_INTCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+ CHECK_NONRSTR(p_tcb);
+
+ i_lock_cpu();
+ if (!TSTAT_WAITING(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else {
+ if (wait_release(p_tcb)) {
+ reqflg = true;
+ }
+ ercd = E_OK;
+ }
+ i_unlock_cpu();
+
+ error_exit:
+ LOG_IREL_WAI_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_irel_wai */
+
+/*
+ * 強制待ち状態への移行
+ */
+#ifdef TOPPERS_sus_tsk
+
+ER
+sus_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_SUS_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID_SELF(tskid);
+ p_tcb = get_tcb_self(tskid);
+ CHECK_NONRSTR(p_tcb);
+
+ t_lock_cpu();
+ if (p_tcb == p_runtsk && !dspflg) {
+ ercd = E_CTX;
+ }
+ else if (TSTAT_DORMANT(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
+ /*
+ * 実行できる状態から強制待ち状態への遷移
+ */
+ p_tcb->tstat = TS_SUSPENDED;
+ LOG_TSKSTAT(p_tcb);
+ if (make_non_runnable(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
+ ercd = E_QOVR;
+ }
+ else {
+ /*
+ * 待ち状態から二重待ち状態への遷移
+ */
+ p_tcb->tstat |= TS_SUSPENDED;
+ LOG_TSKSTAT(p_tcb);
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_SUS_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_sus_tsk */
+
+/*
+ * 強制待ち状態からの再開
+ */
+#ifdef TOPPERS_rsm_tsk
+
+ER
+rsm_tsk(ID tskid)
+{
+ TCB *p_tcb;
+ ER ercd;
+
+ LOG_RSM_TSK_ENTER(tskid);
+ CHECK_TSKCTX_UNL();
+ CHECK_TSKID(tskid);
+ p_tcb = get_tcb(tskid);
+ CHECK_NONRSTR(p_tcb);
+
+ t_lock_cpu();
+ if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
+ ercd = E_OBJ;
+ }
+ else if (!TSTAT_WAITING(p_tcb->tstat)) {
+ /*
+ * 強制待ち状態から実行できる状態への遷移
+ */
+ p_tcb->tstat = TS_RUNNABLE;
+ LOG_TSKSTAT(p_tcb);
+ if (make_runnable(p_tcb)) {
+ dispatch();
+ }
+ ercd = E_OK;
+ }
+ else {
+ /*
+ * 二重待ち状態から待ち状態への遷移
+ */
+ p_tcb->tstat &= ~TS_SUSPENDED;
+ LOG_TSKSTAT(p_tcb);
+ ercd = E_OK;
+ }
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_RSM_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_rsm_tsk */
+
+/*
+ * 自タスクの遅延
+ */
+#ifdef TOPPERS_dly_tsk
+
+ER
+dly_tsk(RELTIM dlytim)
+{
+ WINFO winfo;
+ TMEVTB tmevtb;
+ ER ercd;
+
+ LOG_DLY_TSK_ENTER(dlytim);
+ CHECK_DISPATCH();
+ CHECK_PAR(dlytim <= TMAX_RELTIM);
+
+ t_lock_cpu();
+ p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
+ (void) make_non_runnable(p_runtsk);
+ p_runtsk->p_winfo = &winfo;
+ winfo.p_tmevtb = &tmevtb;
+ tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
+ LOG_TSKSTAT(p_runtsk);
+ dispatch();
+ ercd = winfo.wercd;
+ t_unlock_cpu();
+
+ error_exit:
+ LOG_DLY_TSK_LEAVE(ercd);
+ return(ercd);
+}
+
+#endif /* TOPPERS_dly_tsk */
--- /dev/null
+/*
+ * TOPPERS Software
+ * Toyohashi Open Platform for Embedded Real-Time Systems
+ *
+ * Copyright (C) 2010 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: test_rstr1.c 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ * 制約タスクのテスト(1)
+ *
+ * 【テストの目的】
+ *
+ * 制約タスクの基本的な振舞い(ras_priサービスコール以外の動作)をテス
+ * トする.
+ *
+ * 【テスト項目】
+ *
+ * (A) 制約タスクが,自タスクを待ち状態にする可能性のあるサービスコー
+ * ルを呼び出した場合,E_NOSPTエラーとなる
+ * (A-1) slp_tsk
+ * (A-2) tslp_tsk
+ * (A-3) dly_tsk
+ * ※ 他にもあるが,これだけに留める
+ * (B) 制約タスクを対象として,chg_pri,wup_tsk,iwup_tsk,can_wup,
+ * rel_wai,irel_wai,sus_tsk,rsm_tskを呼び出した場合,E_NOSPTエ
+ * ラーとなる
+ * (B-1) chg_pri
+ * (B-2) wup_tsk
+ * (B-3) iwup_tsk
+ * (B-4) can_wup
+ * (B-5) rel_wai
+ * (B-6) irel_wai
+ * (B-7) sus_tsk
+ * (B-8) rsm_tsk
+ * (C) rot_rdq,irot_rdqは,対象優先度を持つ実行できる状態のタスクの中
+ * で最も優先順位が高いタスクが制約タスクである場合,E_NOSPTエラー
+ * となる
+ * (C-1) rot_rdqが正しく動作する
+ * (C-2) rot_rdqがE_NOSPTを返す
+ * (C-3) irot_rdqが正しく動作する
+ * (C-4) irot_rdqがE_NOSPTを返す
+ *
+ * 【使用リソース】
+ *
+ * TASK1: 中優先度タスク,メインタスク,最初から起動
+ * TASK2: 高優先度タスク,制約タスク
+ * TASK3: 中優先度タスク,制約タスク
+ * TASK4: 中優先度タスク,制約タスク
+ * ALM1: アラームハンドラ
+ *
+ * 【テストシーケンス】
+ *
+ * == TASK1(優先度:中)==
+ * 1: act_tsk(TASK2)
+ * == TASK2-1(優先度:高)==
+ * 2: slp_tsk() -> E_NOSPT ... (A-1)
+ * 3: tslp_tsk(10) -> E_NOSPT ... (A-2)
+ * 4: dly_tsk(10) -> E_NOSPT ... (A-3)
+ * 5: ext_tsk()
+ * == TASK1(続き)==
+ * 6: chg_pri(TASK3, HIGH_PRIORITY) -> E_NOSPT ... (B-1)
+ * 7: wup_tsk(TASK3) -> E_NOSPT ... (B-2)
+ * 8: can_wup(TASK3) -> E_NOSPT ... (B-4)
+ * 9: rel_wai(TASK3) -> E_NOSPT ... (B-5)
+ * 10: sus_tsk(TASK3) -> E_NOSPT ... (B-7)
+ * 11: rsm_tsk(TASK3) -> E_NOSPT ... (B-8)
+ * 12: sta_alm(ALM1, 10)
+ * 13: slp_tsk()
+ * == ALM1 ==
+ * 14: iwup_tsk(TASK3) -> E_NOSPT ... (B-3)
+ * 15: irel_wai(TASK3) -> E_NOSPT ... (B-6)
+ * 16: iwup_tsk(TASK1)
+ * 17: iact_tsk(TASK3)
+ * 18: iact_tsk(TASK4)
+ * 19: irot_rdq(MID_PRIORITY) ... (C-3)
+ * 20: irot_rdq(MID_PRIORITY) -> E_NOSPT ... (C-4)
+ * 21: RETURN
+ * == TASK3-1(優先度:中)==
+ * 22: act_tsk(TASK2)
+ * == TASK2-2(優先度:高)2回め ==
+ * 23: rot_rdq(MID_PRIORITY) -> E_NOSPT ... (C-2)
+ * 24: ext_tsk()
+ * == TASK3-1(続き)==
+ * 25: ext_tsk()
+ * == TASK4-1(優先度:中)1回め ==
+ * 26: ext_tsk()
+ * == TASK1(続き)==
+ * 27: act_tsk(TASK3)
+ * 28: act_tsk(TASK4)
+ * 29: act_tsk(TASK2)
+ * == TASK2-3(優先度:高)3回め ==
+ * 30: rot_rdq(MID_PRIORITY) ... (C-1)
+ * 31: ext_tsk()
+ * == TASK3-2(優先度:中)2回め ==
+ * 32: ext_tsk()
+ * == TASK4-2(優先度:中)2回め ==
+ * 33: ext_tsk()
+ * == TASK1(続き)==
+ * 34: END
+ */
+
+#include <kernel.h>
+#include <test_lib.h>
+#include <t_syslog.h>
+#include "kernel_cfg.h"
+#include "test_rstr1.h"
+
+void
+alarm1_handler(intptr_t exinf)
+{
+ ER ercd;
+
+ check_point(14);
+ ercd = iwup_tsk(TASK3);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(15);
+ ercd = irel_wai(TASK3);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(16);
+ ercd = iwup_tsk(TASK1);
+ check_ercd(ercd, E_OK);
+
+ check_point(17);
+ ercd = iact_tsk(TASK3);
+ check_ercd(ercd, E_OK);
+
+ check_point(18);
+ ercd = iact_tsk(TASK4);
+ check_ercd(ercd, E_OK);
+
+ check_point(19);
+ ercd = irot_rdq(MID_PRIORITY);
+ check_ercd(ercd, E_OK);
+
+ check_point(20);
+ ercd = irot_rdq(MID_PRIORITY);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(21);
+ return;
+
+ check_point(0);
+}
+
+void
+task1(intptr_t exinf)
+{
+ ER ercd;
+
+ check_point(1);
+ ercd = act_tsk(TASK2);
+ check_ercd(ercd, E_OK);
+
+ check_point(6);
+ ercd = chg_pri(TASK3, HIGH_PRIORITY);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(7);
+ ercd = wup_tsk(TASK3);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(8);
+ ercd = can_wup(TASK3);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(9);
+ ercd = rel_wai(TASK3);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(10);
+ ercd = sus_tsk(TASK3);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(11);
+ ercd = rsm_tsk(TASK3);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(12);
+ ercd = sta_alm(ALM1, 10);
+ check_ercd(ercd, E_OK);
+
+ check_point(13);
+ ercd = slp_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(27);
+ ercd = act_tsk(TASK3);
+ check_ercd(ercd, E_OK);
+
+ check_point(28);
+ ercd = act_tsk(TASK4);
+ check_ercd(ercd, E_OK);
+
+ check_point(29);
+ ercd = act_tsk(TASK2);
+ check_ercd(ercd, E_OK);
+
+ check_finish(34);
+
+ check_point(0);
+}
+
+static uint_t task2_count = 0;
+
+void
+task2(intptr_t exinf)
+{
+ ER ercd;
+
+ switch (++task2_count) {
+ case 1:
+ check_point(2);
+ ercd = slp_tsk();
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(3);
+ ercd = tslp_tsk(10);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(4);
+ ercd = dly_tsk(10);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(5);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+
+ case 2:
+ check_point(23);
+ ercd = rot_rdq(MID_PRIORITY);
+ check_ercd(ercd, E_NOSPT);
+
+ check_point(24);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+
+ case 3:
+ check_point(30);
+ ercd = rot_rdq(MID_PRIORITY);
+ check_ercd(ercd, E_OK);
+
+ check_point(31);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+ }
+ check_point(0);
+}
+
+static uint_t task3_count = 0;
+
+void
+task3(intptr_t exinf)
+{
+ ER ercd;
+
+ switch (++task3_count) {
+ case 1:
+ check_point(22);
+ ercd = act_tsk(TASK2);
+ check_ercd(ercd, E_OK);
+
+ check_point(25);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+
+ case 2:
+ check_point(32);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+ }
+ check_point(0);
+}
+
+static uint_t task4_count = 0;
+
+void
+task4(intptr_t exinf)
+{
+ ER ercd;
+
+ switch (++task4_count) {
+ case 1:
+ check_point(26);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+
+ case 2:
+ check_point(33);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+ }
+ check_point(0);
+}
--- /dev/null
+/*
+ * $Id: test_rstr1.cfg 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ * 制約タスクのテスト(1)のシステムコンフィギュレーションファイル
+ */
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/banner.cfg");
+INCLUDE("syssvc/serial.cfg");
+
+#include "test_rstr1.h"
+
+CRE_TSK(TASK1, { TA_ACT, 1, task1, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK2, { TA_RSTR, 2, task2, HIGH_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK3, { TA_RSTR, 3, task3, MID_PRIORITY, STACK_SIZE + 256, NULL });
+CRE_TSK(TASK4, { TA_RSTR, 4, task4, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_ALM(ALM1, { TA_NULL, 1, alarm1_handler });
/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
+ * TOPPERS Software
+ * Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: lm3s8962.h 1309 2008-08-27 07:48:51Z ertl-honda $
+ * $Id: test_rstr1.h 1887 2010-08-06 06:15:19Z ertl-hiro $
*/
-/*
- * LM3S8962に関する定義
+/*
+ * 制約タスクのテスト(1)
*/
-#ifndef TOPPERS_LM3S8962_H
-#define TOPPERS_LM3S8962_H
-
-#include <sil.h>
-
/*
- * 割込み番号の最大値
+ * ターゲット依存の定義
*/
-#define TMAX_INTNO (15 + 32)
+#include "target_test.h"
/*
- * å\89²è¾¼ã\81¿å\84ªå\85\88度ã\81®ã\83\93ã\83\83ã\83\88å¹\85
+ * å\84ªå\85\88度ã\81®å®\9a義
*/
-#define TBITW_IPRI 3
+#define HIGH_PRIORITY 4 /* 高優先度 */
+#define MID_PRIORITY 9 /* 中優先度 */
+#define LOW_PRIORITY 14 /* 低優先度 */
/*
- * 割込み優先度ビット幅中のサブ優先度のビット幅
+ * ターゲットに依存する可能性のある定数の定義
*/
-#define TBITW_SUBIPRI 0
+#ifndef STACK_SIZE
+#define STACK_SIZE 4096 /* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
+/*
+ * 関数のプロトタイプ宣言
+ */
#ifndef TOPPERS_MACRO_ONLY
-#endif /* TOPPERS_MACRO_ONLY */
+extern void task1(intptr_t exinf);
+extern void task2(intptr_t exinf);
+extern void task3(intptr_t exinf);
+extern void task4(intptr_t exinf);
+extern void alarm1_handler(intptr_t exinf);
-#endif /* TOPPERS_LM3S8962_H */
+#endif /* TOPPERS_MACRO_ONLY */
--- /dev/null
+/*
+ * TOPPERS Software
+ * Toyohashi Open Platform for Embedded Real-Time Systems
+ *
+ * Copyright (C) 2010 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: test_rstr2.c 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ * 制約タスクのテスト(2)
+ *
+ * 【テストの目的】
+ *
+ * ras_priサービスコールの動作をテストする.
+ *
+ * 【テスト項目】
+ *
+ * (A) 制約タスクからras_priを呼び出し,優先度を上げる
+ * (A-1) ディスパッチ許可状態で呼び出した場合
+ * (A-2) ディスパッチ禁止状態で,最高優先順位タスクが実行状態でな
+ * い場合に呼び出した場合
+ * (B) 優先度が上がった制約タスクからras_pri(TPRI_INI)を呼び出し,起動
+ * 時優先度に戻す
+ * (B-1) 起動時優先度よりも高い優先度のタスクが実行可能の場合に,
+ * タスク切換えが起こることを確認する
+ * (B-2) 起動時優先度と同じ優先度のタスクが実行可能の場合に,タス
+ * ク切換えが起こらないことを確認する
+ * (B-3) 起動時優先度よりも低い優先度のタスクが実行可能の場合に,
+ * タスク切換えが起こらないことを確認する
+ * (C) 制約タスクからras_priを呼び出し,起動時優先度よりも低い優先度に
+ * 変更しようとすると,E_ILUSEになることを確認する
+ *
+ * 【使用リソース】
+ *
+ * TASK1: 中優先度タスク,メインタスク,最初から起動
+ * TASK2: 中優先度タスク,制約タスク
+ * TASK3: 高優先度タスク
+ *
+ * 【テストシーケンス】
+ *
+ * == TASK1(優先度:中)==
+ * 1: act_tsk(TASK2)
+ * 2: slp_tsk()
+ * == TASK2(優先度:中)==
+ * 3: get_pri(TSK_SELF, &tskpri)
+ * assert(tskpri == MID_PRIORITY)
+ * 4: ras_pri(HIGH_PRIORITY)
+ * 5: get_pri(TSK_SELF, &tskpri)
+ * assert(tskpri == HIGH_PRIORITY)
+ * 6: act_tsk(TASK3)
+ * 7: ras_pri(LOW_PRIORITY) -> E_ILUSE ... (C)
+ * 8: ras_pri(TPRI_INI) ... (B-1)
+ * == TASK3(優先度:高)==
+ * 9: get_pri(TASK2, &tskpri)
+ * assert(tskpri == MID_PRIORITY)
+ * 10: slp_tsk()
+ * == TASK2(続き)==
+ * 11: dis_dsp()
+ * 12: wup_tsk(TASK3)
+ * 13: ras_pri(HIGH_PRIORITY) ... (A-2)
+ * 14: ena_dsp()
+ * 15: ras_pri(TPRI_INI) ... (B-3)
+ * == TASK3(続き)==
+ * 16: chg_pri(TSK_SELF, LOW_PRIORITY)
+ * == TASK2(続き)==
+ * 17: ras_pri(HIGH_PRIORITY)
+ * 18: wup_tsk(TASK1)
+ * 19: ras_pri(TPRI_INI) ... (B-2)
+ * 20: ext_tsk()
+ * == TASK1(続き)==
+ * 21: END
+ */
+
+#include <kernel.h>
+#include <test_lib.h>
+#include <t_syslog.h>
+#include "kernel_cfg.h"
+#include "test_rstr1.h"
+
+void
+task1(intptr_t exinf)
+{
+ ER ercd;
+
+ check_point(1);
+ ercd = act_tsk(TASK2);
+ check_ercd(ercd, E_OK);
+
+ check_point(2);
+ ercd = slp_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_finish(21);
+
+ check_point(0);
+}
+
+void
+task2(intptr_t exinf)
+{
+ ER ercd;
+ PRI tskpri;
+
+ check_point(3);
+ ercd = get_pri(TSK_SELF, &tskpri);
+ check_ercd(ercd, E_OK);
+ check_assert(tskpri == MID_PRIORITY);
+
+ check_point(4);
+ ercd = ras_pri(HIGH_PRIORITY);
+ check_ercd(ercd, E_OK);
+
+ check_point(5);
+ ercd = get_pri(TSK_SELF, &tskpri);
+ check_ercd(ercd, E_OK);
+ check_assert(tskpri == HIGH_PRIORITY);
+
+ check_point(6);
+ ercd = act_tsk(TASK3);
+ check_ercd(ercd, E_OK);
+
+ check_point(7);
+ ercd = ras_pri(LOW_PRIORITY);
+ check_ercd(ercd, E_ILUSE);
+
+ check_point(8);
+ ercd = ras_pri(TPRI_INI);
+ check_ercd(ercd, E_OK);
+
+ check_point(11);
+ ercd = dis_dsp();
+ check_ercd(ercd, E_OK);
+
+ check_point(12);
+ ercd = wup_tsk(TASK3);
+ check_ercd(ercd, E_OK);
+
+ check_point(13);
+ ercd = ras_pri(HIGH_PRIORITY);
+ check_ercd(ercd, E_OK);
+
+ check_point(14);
+ ercd = ena_dsp();
+ check_ercd(ercd, E_OK);
+
+ check_point(15);
+ ercd = ras_pri(TPRI_INI);
+ check_ercd(ercd, E_OK);
+
+ check_point(17);
+ ercd = ras_pri(HIGH_PRIORITY);
+ check_ercd(ercd, E_OK);
+
+ check_point(18);
+ ercd = wup_tsk(TASK1);
+ check_ercd(ercd, E_OK);
+
+ check_point(19);
+ ercd = ras_pri(TPRI_INI);
+ check_ercd(ercd, E_OK);
+
+ check_point(20);
+ ercd = ext_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+}
+
+void
+task3(intptr_t exinf)
+{
+ ER ercd;
+ PRI tskpri;
+
+ check_point(9);
+ ercd = get_pri(TASK2, &tskpri);
+ check_ercd(ercd, E_OK);
+ check_assert(tskpri == MID_PRIORITY);
+
+ check_point(10);
+ ercd = slp_tsk();
+ check_ercd(ercd, E_OK);
+
+ check_point(16);
+ ercd = chg_pri(TSK_SELF, LOW_PRIORITY);
+ check_ercd(ercd, E_OK);
+
+ check_point(0);
+}
--- /dev/null
+/*
+ * $Id: test_rstr2.cfg 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ * 制約タスクのテスト(2)のシステムコンフィギュレーションファイル
+ */
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/banner.cfg");
+INCLUDE("syssvc/serial.cfg");
+
+#include "test_rstr2.h"
+
+CRE_TSK(TASK1, { TA_ACT, 1, task1, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK2, { TA_RSTR, 2, task2, MID_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK3, { TA_NULL, 3, task3, HIGH_PRIORITY, STACK_SIZE, NULL });
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: target_sil.h 1309 2008-08-27 07:48:51Z ertl-honda $
+ * $Id: test_rstr2.h 1887 2010-08-06 06:15:19Z ertl-hiro $
+ */
+
+/*
+ * 制約タスクのテスト(2)
*/
/*
- * sil.hのチップ依存部(LM3S8962用)
- *
- * このインクルードファイルは,sil.hの先頭でインクルードされる.他のファ
- * イルからは直接インクルードすることはない.このファイルをインクルー
- * ドする前に,t_stddef.hがインクルードされるので,それらに依存しても
- * よい.
+ * ターゲット依存の定義
*/
+#include "target_test.h"
-#ifndef TOPPERS_TARGET_SIL_H
-#define TOPPERS_TARGET_SIL_H
+/*
+ * 優先度の定義
+ */
+#define HIGH_PRIORITY 4 /* 高優先度 */
+#define MID_PRIORITY 9 /* 中優先度 */
+#define LOW_PRIORITY 14 /* 低優先度 */
/*
- * ã\83\97ã\83ã\82»ã\83\83ã\82µã\81®ã\82¨ã\83³ã\83\87ã\82£ã\82¢ã\83³
+ * ã\82¿ã\83¼ã\82²ã\83\83ã\83\88ã\81«ä¾\9då\98ã\81\99ã\82\8bå\8f¯è\83½æ\80§ã\81®ã\81\82ã\82\8bå®\9aæ\95°ã\81®å®\9a義
*/
-#define SIL_ENDIAN_LITTLE
+#ifndef STACK_SIZE
+#define STACK_SIZE 4096 /* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
/*
- * プロセッサ依存で共通な定義
+ * 関数のプロトタイプ宣言
*/
-#include "arm_m_gcc/prc_sil.h"
+#ifndef TOPPERS_MACRO_ONLY
+
+extern void task1(intptr_t exinf);
+extern void task2(intptr_t exinf);
+extern void task3(intptr_t exinf);
-#endif /* TOPPERS_TARGET_SIL_H */
+#endif /* TOPPERS_MACRO_ONLY */
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: kernel.h 1862 2010-07-25 11:49:51Z ertl-hiro $
+ * @(#) $Id: kernel.h 1959 2010-11-20 02:17:27Z ertl-hiro $
*/
/*
*/
#define TKERNEL_MAKER UINT_C(0x0118) /* カーネルのメーカーコード */
#define TKERNEL_PRID UINT_C(0x0007) /* カーネルの識別番号 */
-#define TKERNEL_SPVER UINT_C(0xf512) /* カーネル仕様のバージョン番号 */
-#define TKERNEL_PRVER UINT_C(0x1060) /* カーネルのバージョン番号 */
+#define TKERNEL_SPVER UINT_C(0xf513) /* カーネル仕様のバージョン番号 */
+#define TKERNEL_PRVER UINT_C(0x1070) /* カーネルのバージョン番号 */
/*
* キューイング回数の最大値
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2004-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: sil.h 1844 2010-07-11 12:59:26Z ertl-hiro $
+ * @(#) $Id: sil.h 2037 2011-03-06 07:56:49Z ertl-hiro $
*/
/*
#ifdef UINT8_MAX
Inline uint8_t
-sil_reb_mem(void *mem)
+sil_reb_mem(uint8_t *mem)
{
uint8_t data;
}
Inline void
-sil_wrb_mem(void *mem, uint8_t data)
+sil_wrb_mem(uint8_t *mem, uint8_t data)
{
*((volatile uint8_t *) mem) = data;
}
*/
Inline uint16_t
-sil_reh_mem(void *mem)
+sil_reh_mem(uint16_t *mem)
{
uint16_t data;
}
Inline void
-sil_wrh_mem(void *mem, uint16_t data)
+sil_wrh_mem(uint16_t *mem, uint16_t data)
{
*((volatile uint16_t *) mem) = data;
}
#ifndef TOPPERS_OMIT_SIL_REH_LEM
Inline uint16_t
-sil_reh_lem(void *mem)
+sil_reh_lem(uint16_t *mem)
{
uint16_t data;
#ifndef TOPPERS_OMIT_SIL_WRH_LEM
Inline void
-sil_wrh_lem(void *mem, uint16_t data)
+sil_wrh_lem(uint16_t *mem, uint16_t data)
{
*((volatile uint16_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT16(data);
}
#ifndef TOPPERS_OMIT_SIL_REH_BEM
Inline uint16_t
-sil_reh_bem(void *mem)
+sil_reh_bem(uint16_t *mem)
{
uint16_t data;
#ifndef TOPPERS_OMIT_SIL_WRH_BEM
Inline void
-sil_wrh_bem(void *mem, uint16_t data)
+sil_wrh_bem(uint16_t *mem, uint16_t data)
{
*((volatile uint16_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT16(data);
}
*/
Inline uint32_t
-sil_rew_mem(void *mem)
+sil_rew_mem(uint32_t *mem)
{
uint32_t data;
}
Inline void
-sil_wrw_mem(void *mem, uint32_t data)
+sil_wrw_mem(uint32_t *mem, uint32_t data)
{
*((volatile uint32_t *) mem) = data;
}
#ifndef TOPPERS_OMIT_SIL_REW_LEM
Inline uint32_t
-sil_rew_lem(void *mem)
+sil_rew_lem(uint32_t *mem)
{
uint32_t data;
#ifndef TOPPERS_OMIT_SIL_WRW_LEM
Inline void
-sil_wrw_lem(void *mem, uint32_t data)
+sil_wrw_lem(uint32_t *mem, uint32_t data)
{
*((volatile uint32_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT32(data);
}
#ifndef TOPPERS_OMIT_SIL_REW_BEM
Inline uint32_t
-sil_rew_bem(void *mem)
+sil_rew_bem(uint32_t *mem)
{
uint32_t data;
#ifndef TOPPERS_OMIT_SIL_WRW_BEM
Inline void
-sil_wrw_bem(void *mem, uint32_t data)
+sil_wrw_bem(uint32_t *mem, uint32_t data)
{
*((volatile uint32_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT32(data);
}
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2004-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: t_stddef.h 1513 2009-04-22 07:35:20Z ertl-hiro $
+ * @(#) $Id: t_stddef.h 1958 2010-11-20 02:15:29Z ertl-hiro $
*/
/*
typedef int_t ER_ID; /* エラーコードまたはID番号 */
typedef int_t ER_UINT; /* エラーコードまたは符号無し整数 */
+typedef uintptr_t MB_T; /* 管理領域を確保するためのデータ型 */
+
typedef uint32_t ACPTN; /* アクセス許可パターン */
typedef struct acvct { /* アクセス許可ベクタ */
ACPTN acptn1; /* 通常操作1のアクセス許可パターン */
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: t_syslog.h 1176 2008-07-01 10:24:46Z ertl-hiro $
+ * @(#) $Id: t_syslog.h 1900 2010-08-14 02:31:44Z ertl-hiro $
*/
/*
uint_t lowmask; /* 低レベル出力すべき重要度 */
} T_SYSLOG_RLOG;
-#ifndef TOPPERS_OMIT_SYSLOG
-
/*
* ログ情報を出力するためのライブラリ関数
*/
+#ifndef TOPPERS_OMIT_SYSLOG
+
extern ER syslog_wri_log(uint_t prio, const SYSLOG *p_syslog) throw();
Inline void
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: check.h 1139 2008-06-19 07:03:34Z ertl-hiro $
+ * @(#) $Id: check.h 1940 2010-10-03 15:09:34Z ertl-hiro $
*/
/*
/*
* 割込み優先度のチェック(E_PAR)
*/
-#define CHECK_INTPRI_CHGIPM(inttpri) { \
+#define CHECK_INTPRI_CHGIPM(intpri) { \
if (!VALID_INTPRI_CHGIPM(intpri)) { \
ercd = E_PAR; \
goto error_exit; \
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: dataqueue.c 1774 2010-03-19 12:45:46Z ertl-hiro $
+ * @(#) $Id: dataqueue.c 1960 2010-11-20 02:20:40Z ertl-hiro $
*/
/*
void
enqueue_data(DTQCB *p_dtqcb, intptr_t data)
{
- *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
+ (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
p_dtqcb->count++;
p_dtqcb->tail++;
if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
void
force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
{
- *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
+ (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
p_dtqcb->tail++;
if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
p_dtqcb->tail = 0U;
void
dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
{
- *p_data = *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head);
+ *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
p_dtqcb->count--;
p_dtqcb->head++;
if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: dataqueue.h 748 2008-03-07 17:18:06Z hiro $
+ * @(#) $Id: dataqueue.h 1960 2010-11-20 02:20:40Z ertl-hiro $
*/
/*
#include <queue.h>
/*
+ * データ管理ブロック
+ */
+typedef struct data_management_block {
+ intptr_t data; /* データ本体 */
+} DTQMB;
+
+/*
* データキュー初期化ブロック
*
* この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分
typedef struct dataqueue_initialization_block {
ATR dtqatr; /* データキュー属性 */
uint_t dtqcnt; /* データキューの容量 */
- intptr_t *p_dtqmb; /* データキュー管理領域の先頭番地 */
+ DTQMB *p_dtqmb; /* データキュー管理領域の先頭番地 */
} DTQINIB;
/*
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: exception.c 1653 2009-10-10 18:04:15Z ertl-hiro $
+ * @(#) $Id: exception.c 2010 2010-12-31 12:44:33Z ertl-hiro $
*/
/*
bool_t state;
LOG_XSNS_XPN_ENTER(p_excinf);
- state = (exc_sense_unlock(p_excinf) && p_runtsk->enatex) ? false : true;
+ state = (exc_sense_intmask(p_excinf) && p_runtsk->enatex) ? false : true;
LOG_XSNS_XPN_LEAVE(state);
return(state);
}
--- /dev/null
+$ ======================================================================
+$
+$ TOPPERS/ASP Kernel
+$ Toyohashi Open Platform for Embedded Real-Time Systems/
+$ Advanced Standard Profile Kernel
+$
+$ Copyright (C) 2011 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: genoffset.tf 2046 2011-04-03 02:33:08Z ertl-hiro $
+$
+$ =====================================================================
+
+$
+$ #defineディレクティブの生成
+$
+$FUNCTION DEFINE$
+ #define $ARGV[1]$$TAB$$FORMAT("%d", +ARGV[2])$$NL$
+$END$
+
+$
+$ ビットのサーチ
+$
+$FUNCTION SEARCH_BIT$
+ $_val = ARGV[1]$
+ $FOREACH _val_bit RANGE(0,7)$
+ $IF (_val & 1) != 0$
+ $RESULT = _val_bit$
+ $END$
+ $_val = _val >> 1$
+ $END$
+$END$
+
+$
+$ ビットフィールドのオフセットとビット位置の定義の生成
+$
+$FUNCTION DEFINE_BIT$
+ $label = ARGV[1]$
+ $struct_size = ARGV[2]$
+ $output_size = ARGV[3]$
+
+ $top = SYMBOL(label)$
+ $IF !LENGTH(top)$
+ $ERROR$$FORMAT("label %1% not found", label)$$END$
+ $ELSE$
+ $val = 0$
+ $FOREACH i RANGE(0,struct_size-1)$
+ $tmp_val = PEEK(top + i, 1)$
+ $IF val == 0 && tmp_val != 0$
+ $val = tmp_val$
+ $offset = i$
+ $END$
+ $END$
+
+ $IF val == 0$
+ $ERROR$$FORMAT("bit not found in %1%", ARGV[1])$$END$
+ $ELSE$
+ $val_bit = SEARCH_BIT(val)$
+ $RESULT = {}$
+ $IF EQ(output_size, "W")$
+ $IF SIL_ENDIAN_BIG$
+ $val_bit = val_bit + 24 - ((offset & 0x03) << 3)$
+ $ELSE$
+ $val_bit = val_bit + ((offset & 0x03) << 3)$
+ $END$
+ $offset = offset & ~0x03$
+ $ELSE$$IF EQ(output_size, "H")$
+ $IF SIL_ENDIAN_BIG$
+ $val_bit = val_bit + 8 - ((offset & 0x01) << 3)$
+ $ELSE$
+ $val_bit = val_bit + ((offset & 0x01) << 3)$
+ $END$
+ $offset = offset & ~0x01$
+ $END$$END$
+ $END$
+
+ #define $label$$TAB$$FORMAT("%d", +offset)$$NL$
+ #define $label$_bit$TAB$$FORMAT("%d", +val_bit)$$NL$
+ #define $label$_mask$TAB$$FORMAT("0x%x", 1 << val_bit)$$NL$
+ $END$
+$END$
+
+$
+$ バイト配置のチェック
+$
+$FUNCTION MAGIC_CHECK$
+ $size = ARGV[1]$
+ $check = ARGV[2]$
+
+ $label = FORMAT("MAGIC_%d", +size)$
+ $top = SYMBOL(label)$
+ $IF !LENGTH(top)$
+ $ERROR$$FORMAT("label %1% not found", label)$$END$
+ $ELSE$
+ $FOREACH offset RANGE(1,size)$
+ $IF SIL_ENDIAN_BIG$
+ $val = PEEK(top + offset - 1, 1)$
+ $ELSE$
+ $val = PEEK(top + size - offset, 1)$
+ $END$
+ $IF val != AT(check, offset - 1)$
+ $ERROR$$FORMAT("value check of %1% failed", label)$$END$
+ $END$
+ $END$
+ $END$
+$END$
+
+$MAGIC_CHECK(1, { 0x12 })$
+$MAGIC_CHECK(2, { 0x12, 0x34 })$
+$MAGIC_CHECK(4, { 0x12, 0x34, 0x56, 0x78 })$
+
+$
+$ ファイルヘッダの生成
+$
+$FILE "offset.h"$
+/* offset.h */$NL$
+$NL$
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: interrupt.c 1646 2009-10-01 05:19:30Z ertl-hiro $
+ * @(#) $Id: interrupt.c 2009 2010-12-31 12:43:54Z ertl-hiro $
*/
/*
t_lock_cpu();
t_set_ipm(intpri);
- if (intpri != TIPM_ENAALL) {
- dspflg = false;
- }
- else if (!disdsp) {
- dspflg = true;
- if (p_runtsk != p_schedtsk) {
- dispatch();
+ if (intpri == TIPM_ENAALL) {
+ ipmflg = true;
+ if (!disdsp) {
+ dspflg = true;
+ if (p_runtsk != p_schedtsk) {
+ dispatch();
+ }
+ }
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+ call_texrtn();
}
}
+ else {
+ ipmflg = false;
+ dspflg = false;
+ }
ercd = E_OK;
t_unlock_cpu();
$ Advanced Standard Profile Kernel
$
$ Copyright (C) 2007 by TAKAGI Nobuhisa
-$ Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
+$ Copyright (C) 2007-2011 by Embedded and Real-Time Systems Laboratory
$ Graduate School of Information Science, Nagoya Univ., JAPAN
$
$ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
$ の責任を負わない.
$
-$ $Id: kernel.tf 1845 2010-07-11 13:02:57Z ertl-hiro $
+$ $Id: kernel.tf 2024 2011-01-02 08:59:23Z ertl-hiro $
$
$ =====================================================================
$ タスクが1個以上存在することのチェック
$IF !LENGTH(TSK.ID_LIST)$
- $ERROR$$FORMAT("no task is registered")$$END$
+ $ERROR$$FORMAT(_("no task is registered"))$$END$
$END$
$ タスクID番号の最大値
$ エラーチェック
$FOREACH tskid TSK.ID_LIST$
$ // tskatrが([TA_ACT])でない場合(E_RSATR)
- $IF (TSK.TSKATR[tskid] & ~(TA_ACT|ALT(TARGET_TSKATR,0))) != 0$
+ $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
$ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
$END$
$ スタック領域の生成とそれに関するエラーチェック
$FOREACH tskid TSK.ID_LIST$
$ // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR)
- $IF TSK.STKSZ[tskid] == 0 || (LENGTH(TARGET_MIN_STKSZ) &&
- TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
+ $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_STKSZ
+ && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
$END$
$ // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
- $IF !EQ(TSK.STK[tskid], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+ $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
&& (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
$END$
$ // タスク属性,拡張情報,起動番地,起動時優先度
$TAB${
$SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
- $SPC$($TSK.TASK[tskid]$), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
+ $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
$ // タスク初期化コンテキストブロック,スタック領域
- $IF ALT(USE_TSKINICTXB,0)$
+ $IF USE_TSKINICTXB$
$GENERATE_TSKINICTXB(tskid)$
$ELSE$
$SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
};$NL$
$NL$
-$ タスクコントロールブロックの生成
+$ タスク管理ブロックの生成
TCB _kernel_tcb_table[TNUM_TSKID];$NL$
$NL$
};$NL$
$NL$
-$ // セマフォコントロールブロック
+$ // セマフォ管理ブロック
SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ イベントフラグ
};$NL$
$NL$
-$ // イベントフラグコントロールブロック
+$ // イベントフラグ管理ブロック
FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ データキュー
$ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
$END$
-$ // データキュー領域
+$ // データキュー管理領域
$IF DTQ.DTQCNT[dtqid]$
- static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
+ static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
$END$
$END$
};$NL$
$NL$
-$ // データキューコントロールブロック
+$ // データキュー管理ブロック
DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 優先度データキュー
$ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
$END$
-$ // 優先度データキュー領域
+$ // 優先度データキュー管理領域
$IF PDQ.PDQCNT[pdqid]$
static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
$END$
};$NL$
$NL$
-$ // 優先度データキューコントロールブロック
+$ // 優先度データキュー管理ブロック
PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ メールボックス
};$NL$
$NL$
-$ // メールボックスコントロールブロック
+$ // メールボックス管理ブロック
MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 固定長メモリプール
};$NL$
$NL$
-$ // 固定長メモリプールコントロールブロック
+$ // 固定長メモリプール管理ブロック
MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 周期ハンドラ
};$NL$
$NL$
-$ // 周期ハンドラコントロールブロック
+$ // 周期ハンドラ管理ブロック
CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ アラームハンドラ
};$NL$
$NL$
-$ // アラームハンドラコントロールブロック
+$ // アラームハンドラ管理ブロック
ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
-$END$
-$NL$
+$END$$NL$
$
$ 割込み管理機能
$END$
$ // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
- $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|ALT(TARGET_INTATR,0))) != 0$
+ $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
$ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
$END$
$END$
$ // inhatrが(TA_NULL)でない場合(E_RSATR)
- $IF (INH.INHATR[inhno] & ~ALT(TARGET_INHATR,0)) != 0$
+ $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
$ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
$END$
$IF LENGTH(INTNO[INH.INHNO[inhno]])$
$intno = INTNO[INH.INHNO[inhno]]$
- $IF LENGTH(FIND(INTNO_CFGINT_VALID, intno))$
-$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
- $IF !LENGTH(INT.INTNO[intno])$
- $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
+ $IF !LENGTH(INT.INTNO[intno])$
+ $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
+ $ELSE$
+ $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
+$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
+ $IF INT.INTPRI[intno] < TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
+ $END$
$ELSE$
- $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
-$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
-$ // するintnoに対してCFG_INTで設定された割込み優先度が
-$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
- $IF INT.INTPRI[intno] < TMIN_INTPRI$
- $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
- $END$
- $ELSE$
-$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
-$ // するintnoに対してCFG_INTで設定された割込み優先度が
-$ // TMIN_INTPRI以上である場合(E_OBJ)
- $IF INT.INTPRI[intno] >= TMIN_INTPRI$
- $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
- $END$
+$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
+$ // するintnoに対してCFG_INTで設定された割込み優先度が
+$ // TMIN_INTPRI以上である場合(E_OBJ)
+ $IF INT.INTPRI[intno] >= TMIN_INTPRI$
+ $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
$END$
$END$
$END$
$ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
$FOREACH order ISR.ORDER_LIST$
$ // isratrが(TA_NULL)でない場合(E_RSATR)
- $IF (ISR.ISRATR[order] & ~ALT(TARGET_ISRATR,0)) != 0$
- $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "isratr", ISR.ISRATR[order], "isr", ISR.ISR[order], "ATT_ISR")$$END$
+ $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
+ $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
$END$
$ // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
$ 割込み管理機能のための標準的な初期化情報の生成
$
$ 割込みハンドラの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINIB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
$ 割込みハンドラ数
#define TNUM_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$ 割込み要求ラインの初期化に必要な情報
-$IF !ALT(OMIT_INITIALIZE_INTERRUPT,0) || ALT(USE_INHINTB_TABLE,0)$
+$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINTB_TABLE,0)$
$ 割込み要求ライン数
#define TNUM_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$
$END$
$ // excatrが(TA_NULL)でない場合(E_RSATR)
- $IF (EXC.EXCATR[excno] & ~ALT(TARGET_EXCATR,0)) != 0$
+ $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
$ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
$END$
$i = i + 1$
$END$
$ CPU例外ハンドラのための標準的な初期化情報の生成
-$IF !ALT(OMIT_INITIALIZE_EXCEPTION,0)$
+$IF !OMIT_INITIALIZE_EXCEPTION$
$ CPU例外ハンドラ数
#define TNUM_EXCNO $LENGTH(EXC.ORDER_LIST)$$NL$
};$NL$
$ELSE$
TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
-$END$
-$NL$
+$END$$NL$
$END$
$
$END$
$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
- $IF !EQ(ICS.ISTK[1], "NULL") && LENGTH(CHECK_STKSZ_ALIGN)
+ $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
&& (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
$ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
$END$
$ Toyohashi Open Platform for Embedded Real-Time Systems/
$ Advanced Standard Profile Kernel
$
-$ Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
+$ Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
$ Graduate School of Information Science, Nagoya Univ., JAPAN
$
$ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
$ の責任を負わない.
$
-$ @(#) $Id: kernel_check.tf 1755 2010-02-14 02:37:36Z ertl-hiro $
+$ @(#) $Id: kernel_check.tf 2062 2011-04-10 16:27:41Z ertl-hiro $
$
$ =====================================================================
$
$ 関数の先頭番地のチェック
$
-$IF LENGTH(CHECK_FUNC_ALIGN) || LENGTH(CHECK_FUNC_NONNULL)$
+$IF CHECK_FUNC_ALIGN || CHECK_FUNC_NONNULL$
$ // タスクとタスク例外処理ルーチンの先頭番地のチェック
$tinib = SYMBOL("_kernel_tinib_table")$
$FOREACH tskid TSK.ID_LIST$
$task = PEEK(tinib + offsetof_TINIB_task, sizeof_FP)$
- $IF LENGTH(CHECK_FUNC_ALIGN) && (task & (CHECK_FUNC_ALIGN - 1))$
+ $IF CHECK_FUNC_ALIGN && (task & (CHECK_FUNC_ALIGN - 1)) != 0$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
"task", TSK.TASK[tskid], tskid, "CRE_TSK")$$END$
$END$
- $IF LENGTH(CHECK_FUNC_NONNULL) && (task == 0)$
+ $IF CHECK_FUNC_NONNULL && task == 0$
$ERROR TSK.TEXT_LINE[tskid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
"task", TSK.TASK[tskid], tskid, "CRE_TSK")$$END$
$END$
$texrtn = PEEK(tinib + offsetof_TINIB_texrtn, sizeof_FP)$
- $IF LENGTH(CHECK_FUNC_ALIGN) && (texrtn & (CHECK_FUNC_ALIGN - 1))$
+ $IF CHECK_FUNC_ALIGN && (texrtn & (CHECK_FUNC_ALIGN - 1)) != 0$
$ERROR DEF_TEX.TEXT_LINE[tskid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
"texrtn", TSK.TEXRTN[tskid], tskid, "DEF_TEX")$$END$
$cycinib = SYMBOL("_kernel_cycinib_table")$
$FOREACH cycid CYC.ID_LIST$
$cychdr = PEEK(cycinib + offsetof_CYCINIB_cychdr, 4)$
- $IF LENGTH(CHECK_FUNC_ALIGN) && (cychdr & (CHECK_FUNC_ALIGN - 1))$
+ $IF CHECK_FUNC_ALIGN && (cychdr & (CHECK_FUNC_ALIGN - 1)) != 0$
$ERROR CYC.TEXT_LINE[cycid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
"cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
$END$
- $IF LENGTH(CHECK_FUNC_NONNULL) && (cychdr == 0)$
+ $IF CHECK_FUNC_NONNULL && cychdr == 0$
$ERROR CYC.TEXT_LINE[cycid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
"cychdr", CYC.CYCHDR[cycid], cycid, "CRE_CYC")$$END$
$alminib = SYMBOL("_kernel_alminib_table")$
$FOREACH almid ALM.ID_LIST$
$almhdr = PEEK(alminib + offsetof_ALMINIB_almhdr, 4)$
- $IF LENGTH(CHECK_FUNC_ALIGN) && (almhdr & (CHECK_FUNC_ALIGN - 1))$
+ $IF CHECK_FUNC_ALIGN && (almhdr & (CHECK_FUNC_ALIGN - 1)) != 0$
$ERROR ALM.TEXT_LINE[almid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
"almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
$END$
- $IF LENGTH(CHECK_FUNC_NONNULL) && (almhdr == 0)$
+ $IF CHECK_FUNC_NONNULL && almhdr == 0$
$ERROR ALM.TEXT_LINE[almid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
"almhdr", ALM.ALMHDR[almid], almid, "CRE_ALM")$$END$
$
$ スタック領域の先頭番地のチェック
$
-$IF LENGTH(CHECK_STACK_ALIGN) || LENGTH(CHECK_STACK_NONNULL)$
+$IF CHECK_STACK_ALIGN || CHECK_STACK_NONNULL$
$ // タスクのスタック領域の先頭番地のチェック
- $IF !ALT(USE_TSKINICTXB,0)$
- $tinib = SYMBOL("_kernel_tinib_table")$
- $FOREACH tskid TSK.ID_LIST$
+ $tinib = SYMBOL("_kernel_tinib_table")$
+ $FOREACH tskid TSK.ID_LIST$
+ $IF USE_TSKINICTXB$
+ $stk = GET_STK_TSKINICTXB(tinib)$
+ $ELSE$
$stk = PEEK(tinib + offsetof_TINIB_stk, sizeof_void_ptr)$
- $IF LENGTH(CHECK_STACK_ALIGN) && (stk & (CHECK_STACK_ALIGN - 1))$
- $ERROR TSK.TEXT_LINE[tskid]$E_PAR:
- $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
- "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
- $END$
- $IF LENGTH(CHECK_STACK_NONNULL) && (stk == 0)$
- $ERROR TSK.TEXT_LINE[tskid]$E_PAR:
- $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
- "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
- $END$
- $tinib = tinib + sizeof_TINIB$
$END$
+ $IF CHECK_STACK_ALIGN && (stk & (CHECK_STACK_ALIGN - 1)) != 0$
+ $ERROR TSK.TEXT_LINE[tskid]$E_PAR:
+ $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:
+ $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
+ "stk", TSK.STK[tskid], tskid, "CRE_TSK")$$END$
+ $END$
+ $tinib = tinib + sizeof_TINIB$
$END$
$ // 非タスクコンテキスト用のスタック領域の先頭番地のチェック
$istk = PEEK(SYMBOL("_kernel_istk"), sizeof_void_ptr)$
- $IF LENGTH(CHECK_STACK_ALIGN) && (istk & (CHECK_STACK_ALIGN - 1))$
+ $IF CHECK_STACK_ALIGN && (istk & (CHECK_STACK_ALIGN - 1)) != 0$
$ERROR ICE.TEXT_LINE[1]$E_PAR:
$FORMAT(_("%1% `%2%\' in %3% is not aligned"),
"istk", ICS.ISTK[1], "DEF_ICS")$$END$
$END$
- $IF LENGTH(CHECK_STACK_NONNULL) && (istk == 0)$
+ $IF CHECK_STACK_NONNULL && istk == 0$
$ERROR ICE.TEXT_LINE[1]$E_PAR:
$FORMAT(_("%1% `%2%\' in %3% is null"),
"istk", ICS.ISTK[1], "DEF_ICS")$$END$
$
$ 固定長メモリプール領域の先頭番地のチェック
$
-$IF LENGTH(CHECK_MPF_ALIGN) || LENGTH(CHECK_MPF_NONNULL)$
+$IF CHECK_MPF_ALIGN || CHECK_MPF_NONNULL$
$ // 固定長メモリプール領域の先頭番地のチェック
$mpfinib = SYMBOL("_kernel_mpfinib_table")$
$FOREACH mpfid MPF.ID_LIST$
$mpf = PEEK(mpfinib + offsetof_MPFINIB_mpf, sizeof_void_ptr)$
- $IF LENGTH(CHECK_MPF_ALIGN) && (mpf & (CHECK_MPF_ALIGN - 1))$
+ $IF CHECK_MPF_ALIGN && (mpf & (CHECK_MPF_ALIGN - 1)) != 0$
$ERROR MPF.TEXT_LINE[mpfid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
"mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$$END$
$END$
- $IF LENGTH(CHECK_MPF_NONNULL) && (mpf == 0)$
+ $IF CHECK_MPF_NONNULL && mpf == 0$
$ERROR MPF.TEXT_LINE[mpfid]$E_PAR:
$FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
"mpf", MPF.MPF[mpfid], mpfid, "CRE_MPF")$$END$
+SIL_ENDIAN_BIG,#defined(SIL_ENDIAN_BIG)
+SIL_ENDIAN_LITTLE,#defined(SIL_ENDIAN_LITTLE)
TA_NULL,TA_NULL
TA_ACT,TA_ACT
TA_TPRI,TA_TPRI
OMIT_INITIALIZE_INTERRUPT,#defined(OMIT_INITIALIZE_INTERRUPT)
OMIT_INITIALIZE_EXCEPTION,#defined(OMIT_INITIALIZE_EXCEPTION)
USE_TSKINICTXB,#defined(USE_TSKINICTXB)
+TARGET_TSKATR,#defined(TARGET_TSKATR),,TARGET_TSKATR
+TARGET_INTATR,#defined(TARGET_INTATR),,TARGET_INTATR
+TARGET_INHATR,#defined(TARGET_INHATR),,TARGET_INHATR
+TARGET_ISRATR,#defined(TARGET_ISRATR),,TARGET_ISRATR
+TARGET_EXCATR,#defined(TARGET_EXCATR),,TARGET_EXCATR
+TARGET_MIN_STKSZ,#defined(TARGET_MIN_STKSZ),,TARGET_MIN_STKSZ
+CHECK_STKSZ_ALIGN,#defined(CHECK_STKSZ_ALIGN),,CHECK_STKSZ_ALIGN
+CHECK_FUNC_ALIGN,#defined(CHECK_FUNC_ALIGN),,CHECK_FUNC_ALIGN
+CHECK_FUNC_NONNULL,#defined(CHECK_FUNC_NONNULL)
+CHECK_STACK_ALIGN,#defined(CHECK_STACK_ALIGN),,CHECK_STACK_ALIGN
+CHECK_STACK_NONNULL,#defined(CHECK_STACK_NONNULL)
+CHECK_MPF_ALIGN,#defined(CHECK_MPF_ALIGN),,CHECK_MPF_ALIGN
+CHECK_MPF_NONNULL,#defined(CHECK_MPF_NONNULL)
sizeof_ID,sizeof(ID)
sizeof_uint_t,sizeof(uint_t)
sizeof_SIZE,sizeof(SIZE)
sizeof_VP,sizeof(void*)
sizeof_intptr_t,sizeof(intptr_t)
sizeof_FP,sizeof(FP)
+sizeof_INHNO,sizeof(INHNO)
+sizeof_INTNO,sizeof(INTNO)
+sizeof_EXCNO,sizeof(EXCNO)
sizeof_TINIB,sizeof(TINIB)
offsetof_TINIB_tskatr,"offsetof(TINIB,tskatr)"
offsetof_TINIB_exinf,"offsetof(TINIB,exinf)"
offsetof_ALMINIB_almatr,"offsetof(ALMINIB,almatr)"
offsetof_ALMINIB_exinf,"offsetof(ALMINIB,exinf)"
offsetof_ALMINIB_almhdr,"offsetof(ALMINIB,almhdr)"
-sizeof_INHNO,sizeof(INHNO)
-sizeof_INTNO,sizeof(INTNO)
-sizeof_EXCNO,sizeof(EXCNO)
+sizeof_INHINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INHINIB)
+offset_INHINIB_inhno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhno)"
+offset_INHINIB_inhatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,inhatr)"
+offset_INHINIB_int_entry,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INHINIB,int_entry)"
+sizeof_INTINIB,#!defined(OMIT_INITIALIZE_INTERRUPT),,sizeof(INTINIB)
+offset_INTINIB_intno,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intno)"
+offset_INTINIB_intatr,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intatr)"
+offset_INTINIB_intpri,#!defined(OMIT_INITIALIZE_INTERRUPT),,"offsetof(INTINIB,intpri)"
+sizeof_EXCINIB,#!defined(OMIT_INITIALIZE_EXCEPTION),,sizeof(EXCINIB)
+offset_EXCINIB_excno,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excno)"
+offset_EXCINIB_excatr,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,excatr)"
+offset_EXCINIB_exc_entry,#!defined(OMIT_INITIALIZE_EXCEPTION),,"offsetof(EXCINIB,exc_entry)"
p_runtsk
p_schedtsk
reqflg
+ipmflg
disdsp
dspflg
ready_queue
#define p_runtsk _kernel_p_runtsk
#define p_schedtsk _kernel_p_schedtsk
#define reqflg _kernel_reqflg
+#define ipmflg _kernel_ipmflg
#define disdsp _kernel_disdsp
#define dspflg _kernel_dspflg
#define ready_queue _kernel_ready_queue
#define _p_runtsk __kernel_p_runtsk
#define _p_schedtsk __kernel_p_schedtsk
#define _reqflg __kernel_reqflg
+#define _ipmflg __kernel_ipmflg
#define _disdsp __kernel_disdsp
#define _dspflg __kernel_dspflg
#define _ready_queue __kernel_ready_queue
#undef p_runtsk
#undef p_schedtsk
#undef reqflg
+#undef ipmflg
#undef disdsp
#undef dspflg
#undef ready_queue
#undef _p_runtsk
#undef _p_schedtsk
#undef _reqflg
+#undef _ipmflg
#undef _disdsp
#undef _dspflg
#undef _ready_queue
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: startup.c 1430 2009-01-14 17:37:56Z ertl-hiro $
+ * @(#) $Id: startup.c 2067 2011-05-05 00:46:29Z ertl-hiro $
*/
/*
* 非タスクコンテキストに切り換えて,exit_kernelを呼び出す.
*/
call_exit_kernel();
- assert(0);
+
+ /*
+ * コンパイラの警告対策(ここへ来ることはないはず)
+ */
+ SIL_UNL_INT();
+ LOG_EXT_KER_LEAVE(E_SYS);
+ return(E_SYS);
}
/*
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: sys_manage.c 748 2008-03-07 17:18:06Z hiro $
+ * @(#) $Id: sys_manage.c 2008 2010-12-31 12:41:42Z ertl-hiro $
*/
/*
t_lock_cpu();
disdsp = false;
- if (t_get_ipm() == TIPM_ENAALL) {
+ if (ipmflg) {
dspflg = true;
if (p_runtsk != p_schedtsk) {
dispatch();
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: task.c 1874 2010-07-29 14:23:02Z ertl-hiro $
+ * $Id: task.c 2011 2010-12-31 12:45:41Z ertl-hiro $
*/
/*
bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ */
+bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*/
bool_t disdsp;
p_runtsk = p_schedtsk = NULL;
reqflg = false;
+ ipmflg = true;
disdsp = false;
dspflg = true;
call_texrtn(void)
{
TEXPTN texptn;
- PRI saved_ipm;
- bool_t saved_disdsp, saved_dspflg;
+ bool_t saved_disdsp;
- saved_ipm = t_get_ipm();
saved_disdsp = disdsp;
- saved_dspflg = dspflg;
p_runtsk->enatex = false;
do {
texptn = p_runtsk->texptn;
if (!t_sense_lock()) {
t_lock_cpu();
}
- t_set_ipm(saved_ipm);
+ if (!ipmflg) {
+ t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
+ }
disdsp = saved_disdsp;
- dspflg = saved_dspflg;
- /*
- * ここでp_runtsk->enatexをfalseにするのは,タスク例外処理ルー
- * チンから,タスク例外処理許可状態のままリターンした場合の対
- * 策である.
- */
+ dspflg = !disdsp;
p_runtsk->enatex = false;
if (p_runtsk != p_schedtsk && dspflg) {
/*
* ここでdispatchを呼び出す処理は,相互再帰呼出しになって
- * いるが,dispatchを呼ぶ前にp_runtsk->enatexをflaseにして
+ * いるが,dispatchを呼ぶ前にp_runtsk->enatexをfalseにして
* おけば支障がない.その理由については,「TOPPERS/ASP カー
* ネル 設計メモ」を参照のこと.
*/
void
calltex(void)
{
- if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
+ if (p_runtsk->enatex && p_runtsk->texptn != 0U && ipmflg) {
call_texrtn();
}
}
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * $Id: task.h 1839 2010-07-10 17:27:27Z ertl-hiro $
+ * $Id: task.h 2008 2010-12-31 12:41:42Z ertl-hiro $
*/
/*
extern bool_t reqflg;
/*
+ * 割込み優先度マスク全解除状態
+ *
+ * 割込み優先度マスク全解除状態であることを示すフラグ.
+ */
+extern bool_t ipmflg;
+
+/*
* ディスパッチ禁止状態
*
* ディスパッチ禁止状態であることを示すフラグ.
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: task_except.c 748 2008-03-07 17:18:06Z hiro $
+ * $Id: task_except.c 2023 2011-01-02 08:59:06Z ertl-hiro $
*/
/*
}
else {
p_tcb->texptn |= rasptn;
- if (p_tcb == p_runtsk && p_runtsk->enatex) {
+ if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
call_texrtn();
}
ercd = E_OK;
}
else {
p_tcb->texptn |= rasptn;
- if (p_tcb == p_runtsk && p_runtsk->enatex) {
+ if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
reqflg = true;
}
ercd = E_OK;
}
else {
p_runtsk->enatex = true;
- if (p_runtsk->texptn != 0U) {
+ if (p_runtsk->texptn != 0U && ipmflg) {
call_texrtn();
}
ercd = E_OK;
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: task_manage.c 1595 2009-06-26 01:59:29Z ertl-hiro $
+ * @(#) $Id: task_manage.c 2008 2010-12-31 12:41:42Z ertl-hiro $
*/
/*
*/
disdsp = false;
}
- if (t_get_ipm() != TIPM_ENAALL) {
+ if (!ipmflg) {
/*
* 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
* が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
* る.
*/
t_set_ipm(TIPM_ENAALL);
+ ipmflg = true;
}
dspflg = true;
(void) make_active(p_runtsk);
}
exit_and_dispatch();
- return(E_SYS);
+ ercd = E_SYS;
error_exit:
LOG_EXT_TSK_LEAVE(ercd);
#endif /* TOPPERS_ter_tsk */
/*
- * タスク優先度の変更
+ * タスクのベース優先度の変更
*/
#ifdef TOPPERS_chg_pri
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2005-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_lib.c 1573 2009-05-31 13:47:28Z ertl-hiro $
+ * @(#) $Id: test_lib.c 2067 2011-05-05 00:46:29Z ertl-hiro $
*/
/*
SIL_LOC_INT();
syslog_flush();
ext_ker();
+
+ /* ここへ来ることはないはず */
+ SIL_UNL_INT();
}
/*
#
# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
# Toyohashi Univ. of Technology, JAPAN
-# Copyright (C) 2006-2010 by Embedded and Real-Time Systems Laboratory
+# Copyright (C) 2006-2011 by Embedded and Real-Time Systems Laboratory
# Graduate School of Information Science, Nagoya Univ., JAPAN
#
# 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
# の責任を負わない.
#
-# @(#) $Id: Makefile 1786 2010-05-16 20:27:00Z ertl-hiro $
+# @(#) $Id: Makefile 2048 2011-04-03 02:36:03Z ertl-hiro $
#
#
KERNEL_CFLAGS := $(KERNEL_CFLAGS) -I$(SRCDIR)/kernel
ifdef OMIT_MAKEOFFSET
OFFSET_H =
- KERNEL_AUX_COBJS =
else
OFFSET_H = offset.h
- KERNEL_AUX_COBJS = makeoffset.o
+ifndef OFFSET_TF
+ KERNEL_AUX_COBJS := $(KERNEL_AUX_COBJS) makeoffset.o
+endif
endif
#
#
vpath %.c $(KERNEL_DIR) $(SYSSVC_DIR) $(APPL_DIR)
vpath %.S $(KERNEL_DIR) $(SYSSVC_DIR) $(APPL_DIR)
+vpath %.cfg $(APPL_DIR)
#
# コンパイルのための変数の定義
endif
#
-# offset.h の生成規則(構造体内のオフセット値の算出)
+# オフセットファイル(offset.h)の生成規則
#
+ifdef OFFSET_TF
+offset.h: kernel_cfg.timestamp
+ $(CFG) --pass 3 --kernel asp $(INCLUDES) \
+ --rom-image cfg1_out.srec --symbol-table cfg1_out.syms \
+ -T $(OFFSET_TF) $(CFG_TABS) $(APPL_CFG)
+else
offset.h: makeoffset.s $(SRCDIR)/utils/genoffset
$(PERL) $(SRCDIR)/utils/genoffset makeoffset.s > offset.h
+endif
#
# カーネルのコンフィギュレーションファイルの生成
#
-cfg1_out.c:
- $(CFG) --pass 1 --kernel asp $(INCLUDES) $(CFG_TABS) $(APPL_CFG)
+cfg1_out.c: $(APPL_CFG)
+ $(CFG) --pass 1 --kernel asp $(INCLUDES) $(CFG_TABS) $<
kernel_cfg.timestamp: $(START_OBJS) cfg1_out.o $(END_OBJS) $(HIDDEN_OBJS)
-kernel_cfg.timestamp $(CFG2_OUT):
+kernel_cfg.timestamp $(CFG2_OUT): $(APPL_CFG)
$(LINK) $(CFLAGS) $(LDFLAGS) $(CFG1_OUT_LDFLAGS) -o $(CFG1_OUT) \
$(START_OBJS) cfg1_out.o $(END_OBJS)
$(NM) -C $(CFG1_OUT) > cfg1_out.syms
$(OBJCOPY) -O srec -S $(CFG1_OUT) cfg1_out.srec
$(CFG) --pass 2 --kernel asp $(INCLUDES) \
- -T $(TARGETDIR)/target.tf $(CFG_TABS) $(APPL_CFG)
+ -T $(TARGETDIR)/target.tf $(CFG_TABS) $<
touch kernel_cfg.timestamp
#
#
# 全体のリンク
#
-$(OBJFILE): kernel_cfg.timestamp $(ALL_OBJS) $(filter %.a,$(ALL_LIBS))
+$(OBJFILE): $(APPL_CFG) kernel_cfg.timestamp $(ALL_OBJS) \
+ $(filter %.a,$(ALL_LIBS))
$(LINK) $(CFLAGS) $(LDFLAGS) -o $(OBJFILE) $(START_OBJS) \
$(APPL_OBJS) $(SYSSVC_OBJS) $(CFG_OBJS) $(ALL_LIBS) $(END_OBJS)
$(NM) -C $(OBJFILE) > $(OBJNAME).syms
$(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec
$(CFG) --pass 3 --kernel asp $(INCLUDES) \
--rom-image $(OBJNAME).srec --symbol-table $(OBJNAME).syms \
- -T $(TARGETDIR)/target_check.tf $(CFG_TABS) $(APPL_CFG)
+ -T $(TARGETDIR)/target_check.tf $(CFG_TABS) $<
#
# バイナリファイルの生成
#
# 特殊な依存関係作成ルールの定義
#
-cfg1_out.depend:
- @$(CFG) -M cfg1_out.c $(INCLUDES) $(APPL_CFG) >> Makefile.depend
+cfg1_out.depend: $(APPL_CFG)
+ @$(CFG) -M cfg1_out.c $(INCLUDES) $< >> Makefile.depend
makeoffset.d: makeoffset.c
@$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: banner.c 1691 2010-01-01 15:55:49Z ertl-hiro $
+ * @(#) $Id: banner.c 2042 2011-03-06 11:26:14Z ertl-hiro $
*/
/*
" (" __DATE__ ", " __TIME__ ")\n"
"Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory\n"
" Toyohashi Univ. of Technology, JAPAN\n"
-"Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory\n"
+"Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory\n"
" Graduate School of Information Science, Nagoya Univ., JAPAN\n"
TARGET_COPYRIGHT;
#endif /* LOGTASK_STACK_SIZE */
#ifndef LOGTASK_PORTID
-#define LOGTASK_PORTID SIO_PORTID /* システムログ用のシリアルポート番号 */
+#define LOGTASK_PORTID 1 /* システムログ用のシリアルポート番号 */
#endif /* LOGTASK_PORTID */
#ifndef LOGTASK_INTERVAL
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2006-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2006-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: serial.c 1176 2008-07-01 10:24:46Z ertl-hiro $
+ * @(#) $Id: serial.c 2055 2011-04-10 11:36:13Z ertl-hiro $
*/
/*
/*
- * @(#) $Id: serial.cfg 823 2008-03-18 13:02:11Z hiro $
+ * @(#) $Id: serial.cfg 2060 2011-04-10 15:36:38Z ertl-hiro $
*/
/*
+++ /dev/null
-E_PACKAGE asp_cq_starm_gcc
-VERSION %date
-
-INCLUDE ../../MANIFEST
-INCLUDE ../../arch/arm_m_gcc/MANIFEST
+++ /dev/null
-PACKAGE asp_arch_arm_m_gcc
-
-E_PACKAGE
-MANIFEST
-Makefile.target
-cq_starm.h
-cq_starm.ld
-target.tf
-target_cfg1_out.h
-target_check.tf
-target_config.c
-target_config.h
-target_def.csv
-target_kernel.h
-target_rename.def
-target_rename.h
-target_serial.c
-target_serial.cfg
-target_serial.h
-target_sil.h
-target_stddef.h
-target_support.S
-target_syssvc.h
-target_test.h
-target_timer.cfg
-target_timer.h
-target_unrename.h
-target_user.txt
+++ /dev/null
-#
-# Makefile のターゲット依存部(CQ-STARM用)
-#
-
-#
-# ボード名,プロセッサ名,開発環境名の定義
-#
-BOARD = cq_starm
-PRC = arm_m
-TOOL = gcc
-
-#
-# GNU開発環境のターゲットアーキテクチャの定義
-#
-GCC_TARGET = arm-none-eabi
-
-#
-# 各セグメントの開始アドレスの定義
-#
-TEXT_START_ADDRESS = 0x08000000
-DATA_START_ADDRESS = 0x20000000
-
-#
-# 非タスクコンテキスト用のスタックの初期値(底)
-#
-DEFAULT_STK_TOP = 0x20005000
-
-#
-# コンパイルオプション
-#
-INCLUDES := $(INCLUDES) -I$(TARGETDIR)
-CDEFS := $(CDEFS)
-COPTS := $(COPTS) -mcpu=cortex-m3
-
-#
-# カーネルに関する定義
-#
-KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
-KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) target_support.o
-KERNEL_COBJS := $(KERNEL_COBJS) target_config.o prc_timer.o
-KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing -mcpu=cortex-m3
-
-#
-# システムサービスに関する定義
-#
-SYSSVC_DIR := $(SYSSVC_DIR)
-SYSSVC_COBJS := $(SYSSVC_COBJS) target_serial.o
-
-#
-# コンフィギュレータ関係の変数の定義
-#
-CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
-
-#
-# トレースログに関する設定
-#
-ifeq ($(ENABLE_TRACE),true)
- COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE
- KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/logtrace
- KERNEL_COBJS := $(KERNEL_COBJS) trace_config.o trace_dump.o
-endif
-
-#
-# ROM化時は ROM_BOOTをtrueに定義する
-#
-ifeq ($(ROM_BOOT),true)
- CDEFS := $(CDEFS) -DROM_BOOT
-endif
-
-#
-# リンカスクリプトの定義
-#
-LDSCRIPT = $(SRCDIR)/target/$(BOARD)_$(TOOL)/cq_starm.ld
-
-#
-# スタートアップモジュールに関する定義
-#
-# cq_starm.ldに「STARTUP(start.o)」を記述したため,スタートアップモジュー
-# ルの名前をHIDDEN_OBJSに定義する.また,LDFLAGSに-nostdlibを追加している.
-#
-HIDDEN_OBJS = start.o
-
-$(HIDDEN_OBJS): %.o: %.S
- $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
-
-$(HIDDEN_OBJS:.o=.d): %.d: %.S
- @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \
- -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
-
-LDFLAGS := -nostdlib $(LDFLAGS)
-
-#
-# 依存関係の定義
-#
-cfg1_out.c: $(TARGETDIR)/target_def.csv
-kernel_cfg.timestamp: $(TARGETDIR)/target.tf
-$(OBJFILE): $(TARGETDIR)/target_check.tf
-
-#
-# プロセッサ依存部のインクルード
-#
-include $(SRCDIR)/arch/$(PRC)_$(TOOL)/Makefile.prc
+++ /dev/null
-/*
- * TOPPERS/JSP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Just Standard Profile Kernel
- *
- * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
- * Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
- * Graduate School of Information Science, Nagoya Univ., JAPAN
- *
- * 上記著作権者は,Free Software Foundation によって公表されている
- * GNU General Public License の Version 2 に記述されている条件か,以
- * 下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
- * アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
- * 利用と呼ぶ)することを無償で許諾する.
- * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
- * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
- * スコード中に含まれていること.
- * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
- * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
- * に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示,
- * この利用条件および下記の無保証規定を掲載すること.
- * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
- * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
- * (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
- * 権表示,この利用条件および下記の無保証規定を掲載すること.
- * (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
- * こと.
- * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
- * 害からも,上記著作権者を免責すること.
- *
- * 本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
- * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
- * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
- * かなる損害に関しても,その責任を負わない.
- *
- */
-#ifndef TOPPERS_CQ_STARM_H
-#define TOPPERS_CQ_STARM_H
-
-#include <sil.h>
-
-/*
- * CORTEX-M3 CPUの依存部のインクルード
- */
-#include "arm_m_gcc/arm_m.h"
-
-/*
- * システムクロックの定義(発振子周波数8MHz)
- */
-#define HSE_CLOCK (8000000)
-#define SYS_CLOCK (HSE_CLOCK * 9)
-#define PCLK1_CLOCK ((HSE_CLOCK * 9) >> 1)
-#define PCLK2_CLOCK (HSE_CLOCK * 9)
-
-/*
- * 割込み番号の最大値
- */
-#define TMAX_INTNO (16 + 42)
-
-/*
- * 割込み優先度のビット幅
- */
-#define TBITW_IPRI 4
-
-/*
- * 割込み優先度ビット幅中のサブ優先度のビット幅
- */
-#define TBITW_SUBIPRI 0
-
-/*
- * 割込みベクタ番号定義
- */
-#define IRQ_VECTOR_USART1 (16 + 37)
-#define IRQ_VECTOR_USART2 (16 + 38)
-
-
-/* STM32F10Xのペリフェラルレジスタ定義 */
-#define PERIPH_REG_BASE (0x40000000UL)
-#define SRAM_BASE (0x20000000UL)
-
-#define APB1_PERIPH (PERIPH_REG_BASE)
-#define APB2_PERIPH (PERIPH_REG_BASE + 0x10000)
-#define AHB_PERIPH (PERIPH_REG_BASE + 0x20000)
-
-/* BUS:APB1 */
-#define TIM2_BASE (APB1_PERIPH)
-#define TIM3_BASE (APB1_PERIPH + 0x400)
-#define TIM4_BASE (APB1_PERIPH + 0x800)
-#define RTC_BASE (APB1_PERIPH + 0x2800)
-#define WWDG_BASE (APB1_PERIPH + 0x2C00)
-#define IWDG_BASE (APB1_PERIPH + 0x3000)
-#define SPI2_BASE (APB1_PERIPH + 0x3800)
-#define USART2_BASE (APB1_PERIPH + 0x4400)
-#define USART3_BASE (APB1_PERIPH + 0x4800)
-#define I2C1_BASE (APB1_PERIPH + 0x5400)
-#define I2C2_BASE (APB1_PERIPH + 0x5800)
-#define USB_BASE (APB1_PERIPH + 0x5C00)
-#define CAN_BASE (APB1_PERIPH + 0x6400)
-#define BKP_BASE (APB1_PERIPH + 0x6C00)
-#define PWR_BASE (APB1_PERIPH + 0x7000)
-
-/* BUS:APB2 */
-#define AFIO_BASE (APB2_PERIPH)
-#define EXTI_BASE (APB2_PERIPH + 0x400)
-#define GPIOA_BASE (APB2_PERIPH + 0x800)
-#define GPIOB_BASE (APB2_PERIPH + 0xC00)
-#define GPIOC_BASE (APB2_PERIPH + 0x1000)
-#define GPIOD_BASE (APB2_PERIPH + 0x1400)
-#define GPIOE_BASE (APB2_PERIPH + 0x1800)
-#define ADC1_BASE (APB2_PERIPH + 0x2400)
-#define ADC2_BASE (APB2_PERIPH + 0x2800)
-#define TIM1_BASE (APB2_PERIPH + 0x2C00)
-#define SPI1_BASE (APB2_PERIPH + 0x3000)
-#define USART1_BASE (APB2_PERIPH + 0x3800)
-
-/* BUS:AHB */
-#define DMA_BASE (AHB_PERIPH)
-#define RCC_BASE (AHB_PERIPH + 0x1000)
-#define FLASH_BASE (AHB_PERIPH + 0x2000)
-
-/* System Control space */
-#define SCS_BASE (0xE000E000)
-#define SYSTM_BASE (SCS_BASE + 0x0010)
-#define NVIC_BASE (SCS_BASE + 0x0100)
-#define SYSCB_BASE (SCS_BASE + 0x0D00)
-
-/* RCC */
-#define RCC_CR (RCC_BASE)
-#define RCC_CFGR (RCC_BASE + 0x04)
-#define RCC_CIR (RCC_BASE + 0x08)
-#define RCC_APB2RSTR (RCC_BASE + 0x0C)
-#define RCC_APB1RSTR (RCC_BASE + 0x10)
-#define RCC_AHBENR (RCC_BASE + 0x14)
-#define RCC_APB2ENR (RCC_BASE + 0x18)
-#define RCC_APB1ENR (RCC_BASE + 0x1C)
-#define RCC_BDCR (RCC_BASE + 0x20)
-#define RCC_CSR (RCC_BASE + 0x24)
-
-
-/* NVIC */
-#define NVIC_ENAVLE_REG(ch) (NVIC_BASE + ((ch) >> 5))
-#define NVIC_DISABLE_REG(ch) (NVIC_BASE + 0x80 + ((ch) >> 5))
-#define NVIC_SET_PEND_REG(ch) (NVIC_BASE + 0x100 + ((ch) >> 5))
-#define NVIC_CLEAR_PEND_REG(ch) (NVIC_BASE + 0x180 + ((ch) >> 5))
-#define NVIC_ACTIVE_REG(ch) (NVIC_BASE + 0x200 + ((ch) >> 5))
-#define NVIC_PRIO_REG(ch) (NVIC_BASE + 0x300 + ((ch) >> 2))
-
-/* GPIOx */
-#define GPIO_CRL(x) (x)
-#define GPIO_CRH(x) ((x) + 0x04)
-#define GPIO_IDR(x) ((x) + 0x08)
-#define GPIO_ODR(x) ((x) + 0x0C)
-#define GPIO_BSRR(x) ((x) + 0x10)
-#define GPIO_BRR(x) ((x) + 0x14)
-#define GPIO_LCKR(x) ((x) + 0x18)
-
-/* AFIO */
-#define AFIO_EVCR (AFIO_BASE)
-#define AFIO_MAPR (AFIO_BASE + 0x04)
-#define AFIO_EXTICR1 (AFIO_BASE + 0x08)
-#define AFIO_EXTICR2 (AFIO_BASE + 0x0C)
-#define AFIO_EXTICR3 (AFIO_BASE + 0x10)
-#define AFIO_EXTICR4 (AFIO_BASE + 0x14)
-
-/* FLASH */
-#define FLASH_ACR (FLASH_BASE)
-
-/* RCCレジスタ定義 */
-#define CR_PLL_RDY (0x02000000)
-#define CR_PLL_ON (0x01000000)
-#define CR_HSE_RDY (0x00020000)
-#define CR_HSE_ON (0x00010000)
-#define CR_HSI_RDY (0x00000002)
-#define CR_HSI_ON (0x00000001)
-#define CFGR_PLLMUL_MASK (0x003C0000)
-#define CFGR_PLL_XTPRE (0x00020000)
-#define CFGR_PLL_SRC (0x00010000)
-#define CFGR_HPRE_MASK (0x000000F0)
-#define CFGR_PPRE2_MASK (0x00003800)
-#define CFGR_PPRE1_MASK (0x00000700)
-#define CFGR_SWS_MASK (0x0000000C)
-#define CFGR_SW_MASK (0x00000003)
-#define CFGR_SW_PLL (0x02)
-#define APB1ENR_USART2_EN (0x00020000)
-#define APB2ENR_ADC3_EN (0x8000)
-#define APB2ENR_USART1_EN (0x4000)
-#define APB2ENR_TIM8_EN (0x2000)
-#define APB2ENR_SPI1_EN (0x1000)
-#define APB2ENR_TIM1_EN (0x0800)
-#define APB2ENR_ADC2_EN (0x0400)
-#define APB2ENR_ADC1_EN (0x0200)
-#define APB2ENR_IOPG_EN (0x0100)
-#define APB2ENR_IOPF_EN (0x0080)
-#define APB2ENR_IOPE_EN (0x0040)
-#define APB2ENR_IOPD_EN (0x0020)
-#define APB2ENR_IOPC_EN (0x0010)
-#define APB2ENR_IOPB_EN (0x0008)
-#define APB2ENR_IOPA_EN (0x0004)
-#define APB2ENR_AFIO_EN (0x0001)
-#define AHBENR_SDIO_EN (0x0400)
-#define AHBENR_FSMC_EN (0x0100)
-#define AHBENR_CRCE_EN (0x0040)
-#define AHBENR_FLITF_EN (0x0010)
-#define AHBENR_SRAM_EN (0x0004)
-#define AHBENR_DMA_EN (0x0001)
-
-/* FLASHレジスタ定義 */
-#define ACR_LATENCY_MASK (0x07)
-#define ACR_LATENCY_ZERO (0x00)
-#define ACR_LATENCY_ONE (0x01)
-#define ACR_LATENCY_TWO (0x02)
-
-/* GPIOxレジスタ定義 */
-#define CNF_IN_ANALOG (0x00)
-#define CNF_IN_FLOATING (0x01)
-#define CNF_IN_PULL (0x02)
-#define CNF_OUT_GP_PP (0x00)
-#define CNF_OUT_GP_OD (0x01)
-#define CNF_OUT_AF_PP (0x02)
-#define CNF_OUT_AF_OD (0x03)
-#define MODE_INPUT (0x00)
-#define MODE_OUTPUT_10MHZ (0x01)
-#define MODE_OUTPUT_2MHZ (0x02)
-#define MODE_OUTPUT_50MHZ (0x03)
-
-#define CR_MODE_MASK(x) (0x03 << ((x) << 2))
-#define CR_CNF_MASK(x) (0x0C << ((x) << 2))
-#define CR_MODE(x,v) (((v) & 0x03) << ((x) << 2))
-#define CR_CNF(x,v) ((((v) << 2) & 0x0C) << ((x) << 2))
-
-/* AFIOレジスタ定義 */
-#define MAPR_USART2_REMAP (0x0008)
-
-#ifndef TOPPERS_MACRO_ONLY
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_CQ_STARM_H */
+++ /dev/null
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
- SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
-}
-
-PROVIDE(hardware_init_hook = 0);
-PROVIDE(software_init_hook = 0);
-PROVIDE(software_term_hook = 0);
-STARTUP(start.o)
-
-SECTIONS
-{
- .text :
- {
- __text = .;
- *(.vector)
- *(.text)
- *(.text.*)
- } > FLASH
- _etext = .;
- PROVIDE(etext = .);
-
- .rodata :
- {
- *(.rodata)
- *(.rodata.*)
- } > FLASH
-
- .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
- __exidx_start = .;
- .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
- __exidx_end = .;
-
- __idata_start = .;
- .data : AT (__idata_start)
- {
- __data_start = .;
- *(vtable)
- *(.data)
- *(.data.*)
- } > SRAM
- __idata_end = __idata_start + SIZEOF(.data);
- _edata = .;
- PROVIDE(edata = .);
-
- . = ALIGN(4);
-
- .bss :
- {
- __bss_start = .;
- *(.bss)
- *(COMMON)
- . = ALIGN(4);
- } > SRAM
- . = ALIGN(4);
- _end = .;
- __bss_end = .;
- PROVIDE(end = .);
-}
+++ /dev/null
-$
-$ パス2のターゲット依存テンプレート(CQ-STARM用)
-$
-
-$
-$ プロセッサ依存のテンプレートファイルのインクルード
-$
-$INCLUDE"arm_m_gcc/prc.tf"$
+++ /dev/null
-/*
- * cfg1_out.cをリンクするために必要なスタブの定義
- */
-
-/*
- * コア依存のスタブの定義
- */
-#include "arm_m_gcc/prc_cfg1_out.h"
+++ /dev/null
-$
-$ パス3のターゲット依存テンプレート(CQ-STARM用)
-$
-
-$
-$ パス3のプロセッサ依存のテンプレートのインクルード
-$
-$INCLUDE"arm_m_gcc/prc_check.tf"$
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
- * Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2007 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プロジェクトは,本ソフトウェアに関して,特定の使用目的
- * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- * の責任を負わない.
- *
- */
-
-/*
- * ターゲット依存モジュール(CQ-STARM用)
- */
-#include "kernel_impl.h"
-#include <sil.h>
-#include "cq_starm.h"
-#include "target_serial.h"
-#include "target_syssvc.h"
-
-
-/*
- * GPIOレジスタ操作関数
- */
-Inline void set_cr_mode(uint32_t reg, uint_t p, int_t v)
-{
- if (p < 8) {
- sil_andw((void*)GPIO_CRL(reg), ~CR_MODE_MASK(p));
- sil_orw((void*)GPIO_CRL(reg), CR_MODE(p, v));
- } else if (8 <= p && p < 16) {
- sil_andw((void*)GPIO_CRH(reg), ~CR_MODE_MASK(p - 8));
- sil_orw((void*)GPIO_CRH(reg), CR_MODE(p - 8, v));
- }
-}
-
-Inline void set_cr_cnf(uint32_t reg, uint_t p, int_t v)
-{
- if (p < 8) {
- sil_andw((void*)GPIO_CRL(reg), ~CR_CNF_MASK(p));
- sil_orw((void*)GPIO_CRL(reg), CR_CNF(p, v));
- } else if (8 <= p && p < 16) {
- sil_andw((void*)GPIO_CRH(reg), ~CR_CNF_MASK(p - 8));
- sil_orw((void*)GPIO_CRH(reg), CR_CNF(p - 8, v));
- }
-}
-
-Inline void set_port_pull(uint32_t reg, uint_t p, bool_t up)
-{
- if (up) {
- sil_wrw_mem((void*)GPIO_BSRR(reg), 0x01 << p);
- } else {
- sil_wrw_mem((void*)GPIO_BRR(reg), 0x01 << p);
- }
-}
-
-/*
- * ターゲット依存部 初期化処理
- */
-void target_initialize(void)
-{
- /*
- * プロセッサクロック(RCC)の初期化
- */
- /* HSEの有効化 */
- sil_orw((void*)RCC_CR, CR_HSE_ON);
-
- /* HSE有効待ち */
- while ((sil_rew_mem((void*)RCC_CR) & CR_HSE_RDY) == 0) ;
-
- /* FLASH ROMは2wait待ち */
- sil_andw((void*)FLASH_ACR, ~ACR_LATENCY_MASK);
- sil_orw((void*)FLASH_ACR, ACR_LATENCY_TWO);
-
- /* HCLK = SYSCLK, PCLK2 = HCLK, PCLK1 = HCLK/2 */
- sil_orw((void*)RCC_CFGR, 0x00 | (0x00 << 11) | (0x04 << 8));
-
- /* PLLCLK = 8MHz x 9 = 72MHz, HSE as PLL clock */
- sil_orw((void*)RCC_CFGR, 0x07 << 18);
- sil_orw((void*)RCC_CFGR, CFGR_PLL_SRC);
-
- /* PLLの有効化 */
- sil_orw((void*)RCC_CR, CR_PLL_ON);
-
- /* PLL有効待ち */
- while ((sil_rew_mem((void*)RCC_CR) & CR_PLL_RDY) == 0) ;
-
- /* PLLをシステムクロックに選択 */
- sil_orw((void*)RCC_CFGR, CFGR_SW_PLL);
-
- /* PLLのシステムクロック選択待ち */
- while ((sil_rew_mem((void*)RCC_CFGR) & CFGR_SWS_MASK) != (CFGR_SW_PLL << 2)) ;
-
-
- /*
- * プロセッサ依存部の初期化
- */
- prc_initialize();
-
- /*
- * ペリフェラルの有効化
- */
- sil_orw((void*)RCC_APB2ENR, APB2ENR_USART1_EN | APB2ENR_IOPA_EN |
- APB2ENR_IOPC_EN | APB2ENR_AFIO_EN);
-#if (TNUM_PORT >= 2)
- sil_orw((void*)RCC_APB2ENR, APB2ENR_IOPD_EN);
- sil_orw((void*)RCC_APB1ENR, APB1ENR_USART2_EN);
-#endif
- /*
- * I/Oポートの初期化
- */
- /* USART1(RX) プルアップ */
- set_cr_mode(GPIOA_BASE, 10, MODE_INPUT);
- set_cr_cnf(GPIOA_BASE, 10, CNF_IN_FLOATING);
-
- /* USART1(TX) */
- set_cr_mode(GPIOA_BASE, 9, MODE_OUTPUT_50MHZ);
- set_cr_cnf(GPIOA_BASE, 9, CNF_OUT_AF_PP);
-
-#if (TNUM_PORT >= 2)
- /* USART2(RX) プルアップ */
- set_cr_mode(GPIOD_BASE, 6, MODE_INPUT);
- set_cr_cnf(GPIOD_BASE, 6, CNF_IN_FLOATING);
-
- /* USART2(TX) */
- set_cr_mode(GPIOD_BASE, 5, MODE_OUTPUT_50MHZ);
- set_cr_cnf(GPIOD_BASE, 5, CNF_OUT_AF_PP);
-
- /* USART2ポートのリマップ(PD5,6) */
- sil_orw((void*)AFIO_MAPR, MAPR_USART2_REMAP);
-#endif
- /* LEDポート */
- set_cr_mode(GPIOC_BASE, 6, MODE_OUTPUT_50MHZ);
- set_cr_cnf(GPIOC_BASE, 6, CNF_OUT_GP_PP);
-
- /*
- * バーナー出力用のシリアル初期化
- */
- target_usart_init(SIO_PORTID);
-}
-
-/*
- * ターゲット依存部 終了処理
- */
-void target_exit(void)
-{
- /* プロセッサ依存部の終了処理 */
- prc_terminate();
-}
-
-/*
- * システムログの低レベル出力のための文字出力
- */
-void target_fput_log(char_t c)
-{
- if (c == '\n') {
- sio_pol_snd_chr('\r', SIO_PORTID);
- }
- sio_pol_snd_chr(c, SIO_PORTID);
-}
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2007 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プロジェクトは,本ソフトウェアに関して,特定の使用目的
- * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- * の責任を負わない.
- *
- */
-
-/*
- * kernel.hのターゲット依存部(CQ-STARM用)
- *
- * このインクルードファイルは,kernel.hでインクルードされる.他のファ
- * イルから直接インクルードすることはない.このファイルをインクルード
- * する前に,t_stddef.hがインクルードされるので,それらに依存してもよ
- * い.
- */
-
-#ifndef TOPPERS_TARGET_KERNEL_H
-#define TOPPERS_TARGET_KERNEL_H
-
-#define TMIN_INTPRI (-15) /* 割込み優先度の最小値(最高値)*/
-
-/*
- * サポートする機能の定義
- */
-#define TOPPERS_SUPPORT_GET_UTM /* get_utmをサポートする */
-
-/*
- * タイムティックの定義
- */
-#define TIC_NUME 1U /* タイムティックの周期の分子 */
-#define TIC_DENO 1U /* タイムティックの周期の分母 */
-
-/*
- * プロセッサで共通な定義
- */
-#include "arm_m_gcc/prc_kernel.h"
-
-#endif /* TOPPERS_TARGET_KERNEL_H */
+++ /dev/null
-INCLUDE "arm_m_gcc/prc"
+++ /dev/null
-/* This file is generated from target_rename.def by genrename. */
-
-#ifndef TOPPERS_TARGET_RENAME_H
-#define TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_rename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2007 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プロジェクトは,本ソフトウェアに関して,特定の使用目的
- * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- * の責任を負わない.
- *
- */
-
-/*
- * シリアルドライバ(CQ-STARM用)
- */
-
-#include <kernel.h>
-#include <sil.h>
-#include "target_serial.h"
-#include "target_syssvc.h"
-
-/*
- * レジスタ設定値
- */
-#define PORT2SIOPID(x) ((x) + 1)
-#define INDEX_PORT(x) ((x) - 1)
-#define GET_SIOPCB(x) (&siopcb_table[INDEX_PORT(x)])
-
-/*
- * USARTレジスタ定義
- */
-#define USART_SR(x) (x)
-#define USART_DR(x) (x + 0x04)
-#define USART_BRR(x) (x + 0x08)
-#define USART_CR1(x) (x + 0x0C)
-#define USART_CR2(x) (x + 0x10)
-#define USART_CR3(x) (x + 0x14)
-#define USART_GTPR(x) (x + 0x18)
-
-#define SR_TXE (0x0080)
-#define SR_RXNE (0x0020)
-#define SR_ORE (0x0008)
-#define SR_FE (0x0002)
-#define SR_PE (0x0001)
-#define CR1_UE (0x2000)
-#define CR1_TXEIE (0x0080)
-#define CR1_RXNEIE (0x0020)
-#define CR1_TE (0x0008)
-#define CR1_RE (0x0004)
-#define CR3_EIE (0x0001)
-
-/*
- * シリアルI/Oポート管理ブロックエリア
- */
-SIOPCB siopcb_table[TNUM_PORT];
-
-static const uint32_t sioreg_table[TNUM_PORT] = {
- USART1_BASE,
-#if (TNUM_PORT >= 2)
- USART2_BASE
-#endif
-};
-
-Inline bool_t sio_putready(SIOPCB* siopcb)
-{
- return (sil_rew_mem((void*)USART_SR(siopcb->reg)) & SR_TXE) != 0;
-}
-
-Inline bool_t sio_getready(SIOPCB* siopcb)
-{
- return (sil_rew_mem((void*)USART_SR(siopcb->reg)) & SR_RXNE) != 0;
-}
-
-/*
- * ターゲットのシリアル初期化
- */
-void target_usart_init(ID siopid)
-{
- uint32_t tmp, usartdiv, fraction;
- uint32_t reg = sioreg_table[INDEX_PORT(siopid)];
- uint32_t src_clock;
-
- /* USARTの無効化 */
- sil_andw((void*)USART_CR1(reg), ~CR1_UE);
-
- /* 1STOP BIT */
- sil_wrw_mem((void*)USART_CR2(reg), 0);
-
- /* 1START BIT, 8DATA bits, Parityなし */
- sil_wrw_mem((void*)USART_CR1(reg), 0);
-
- /* CR3初期化 */
- sil_wrw_mem((void*)USART_CR3(reg), 0);
-
- /* 通信速度設定 */
- if (siopid == 1) {
- /* fck=72MHz */
- src_clock = PCLK2_CLOCK;
- } else {
- /* fck=36MHz */
- src_clock = PCLK1_CLOCK;
- }
- tmp = (1000 * (src_clock / 100)) / ((BPS_SETTING / 100) * 16);
- usartdiv = (tmp / 1000) << 4;
- fraction = tmp - ((usartdiv >> 4) * 1000);
- fraction = ((16 * fraction) + 500) / 1000;
- usartdiv |= (fraction & 0x0F);
- sil_wrw_mem((void*)USART_BRR(reg), usartdiv);
-
- /* 送受信の有効化、エラー割込みの有効化 */
- sil_orw((void*)USART_CR1(reg), CR1_RE | CR1_TE);
- sil_orw((void*)USART_CR3(reg), CR3_EIE);
-
- /* USARTの有効化 */
- sil_orw((void*)USART_CR1(reg), CR1_UE);
-}
-
-/*
- * ターゲットのシリアル終了
- */
-void target_usart_term(ID siopid)
-{
- uint32_t reg = sioreg_table[INDEX_PORT(siopid)];
-
- /* USARTの無効化 */
- sil_andw((void*)USART_CR1(reg), ~CR1_UE);
-}
-
-/*
- * SIO初期化
- */
-void sio_initialize(intptr_t exinf)
-{
- int i;
-
- for (i = 0; i < TNUM_PORT; i++) {
- siopcb_table[i].port = i;
- siopcb_table[i].reg = sioreg_table[i];
- siopcb_table[i].exinf = 0;
- }
-}
-
-/*
- * シリアルオープン
- */
-SIOPCB *sio_opn_por(ID siopid, intptr_t exinf)
-{
- SIOPCB* siopcb;
-
- if (siopid > TNUM_PORT) {
- return NULL;
- }
-
- siopcb = GET_SIOPCB(siopid);
- siopcb->exinf = exinf;
-
- target_usart_init(siopid);
-
- return siopcb;
-}
-
-/*
- * シリアルクローズ
- */
-void sio_cls_por(SIOPCB *p_siopcb)
-{
- target_usart_term(PORT2SIOPID(p_siopcb->port));
-}
-
-/*
- * 割込みハンドラ
- */
-void sio_isr(intptr_t exinf)
-{
- SIOPCB* siopcb = GET_SIOPCB(exinf);
-
- if (sio_putready(siopcb)) {
- sio_irdy_snd(siopcb->exinf);
- }
- if (sio_getready(siopcb)) {
- sio_irdy_rcv(siopcb->exinf);
- }
-}
-
-/*
- * 1文字送信
- */
-bool_t sio_snd_chr(SIOPCB *siopcb, char_t c)
-{
- if (sio_putready(siopcb)) {
- sil_wrw_mem((void*)USART_DR(siopcb->reg), c);
-
- return true;
- }
-
- return false;
-}
-
-/*
- * 1文字受信
- */
-int_t sio_rcv_chr(SIOPCB *siopcb)
-{
- int_t c = -1;
-
- if (sio_getready(siopcb)) {
- c = sil_rew_mem((void*)USART_DR(siopcb->reg)) & 0xFF;
- }
-
- return c;
-}
-
-/*
- * コールバックの許可
- */
-void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
-{
- switch (cbrtn) {
- case SIO_RDY_SND:
- sil_orw((void*)USART_CR1(siopcb->reg), CR1_TXEIE);
- break;
- case SIO_RDY_RCV:
- sil_orw((void*)USART_CR1(siopcb->reg), CR1_RXNEIE);
- break;
- default:
- break;
- }
-}
-
-/*
- * コールバックの禁止
- */
-void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
-{
- switch (cbrtn) {
- case SIO_RDY_SND:
- sil_andw((void*)USART_CR1(siopcb->reg), ~CR1_TXEIE);
- break;
- case SIO_RDY_RCV:
- sil_andw((void*)USART_CR1(siopcb->reg), ~CR1_RXNEIE);
- break;
- default:
- break;
- }
-}
-
-/*
- * 1文字出力(ポーリングでの出力)
- */
-void sio_pol_snd_chr(char_t c, ID siopid)
-{
- uint32_t reg = sioreg_table[INDEX_PORT(siopid)];
-
- sil_wrw_mem((void*)USART_DR(reg), c);
-
- while ((sil_rew_mem((void*)USART_SR(reg)) & SR_TXE) == 0) ;
-}
+++ /dev/null
-/*
- * SIOドライバ(CQ-STARM用)のコンフィグレーションファイル
- */
-
-#include "target_serial.h"
-ATT_INI({ TA_NULL, 0, sio_initialize });
-ATT_ISR({ TA_NULL, SIO_PORTID, INTNO_SIO, sio_isr, 1 });
-CFG_INT(INTNO_SIO, { TA_ENAINT|INTATR_SIO, INTPRI_SIO });
+++ /dev/null
-/*
- * TOPPERS Software
- * Toyohashi Open Platform for Embedded Real-Time Systems
- *
- * Copyright (C) 2007 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プロジェクトは,本ソフトウェアに関して,特定の使用目的
- * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- * の責任を負わない.
- *
- */
-
-/*
- * sil.hのターゲット依存部(APSH2A用)
- *
- * このインクルードファイルは,sil.hの先頭でインクルードされる.他のファ
- * イルからは直接インクルードすることはない.このファイルをインクルー
- * ドする前に,t_stddef.hがインクルードされるので,それらに依存しても
- * よい.
- */
-
-#ifndef TOPPERS_TARGET_SIL_H
-#define TOPPERS_TARGET_SIL_H
-
-/*
- * プロセッサのインディアン定義
- * STM32F10Xはリトルエンディアン
- */
-#define SIL_ENDIAN_LITTLE
-
-/*
- * プロセッサで共通な定義
- */
-#include "arm_m_gcc/prc_sil.h"
-
-/*
- * STM32F10X用一般共通レジスタ操作関数
- */
-#define sil_orb( mem, val ) sil_wrb_mem( mem, sil_reb_mem( mem ) | val )
-#define sil_andb( mem, val ) sil_wrb_mem( mem, sil_reb_mem( mem ) & val )
-#define sil_orh( mem, val ) sil_wrh_mem( mem, sil_reh_mem( mem ) | val )
-#define sil_andh( mem, val ) sil_wrh_mem( mem, sil_reh_mem( mem ) & val )
-#define sil_orw( mem, val ) sil_wrw_mem( mem, sil_rew_mem( mem ) | val )
-#define sil_andw( mem, val ) sil_wrw_mem( mem, sil_rew_mem( mem ) & val )
-
-
-#endif /* TOPPERS_TARGET_SIL_H */
+++ /dev/null
-/*
- * TOPPERS Software
- * Toyohashi Open Platform for Embedded Real-Time Systems
- *
- * Copyright (C) 2007 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プロジェクトは,本ソフトウェアに関して,特定の使用目的
- * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- * の責任を負わない.
- *
- */
-
-/*
- * t_stddef.hのターゲット依存部(APSH2A用)
- *
- * このインクルードファイルは,t_stddef.hの先頭でインクルードされる.
- * 他のファイルからは直接インクルードすることはない.他のインクルード
- * ファイルに先立って処理されるため,他のインクルードファイルに依存し
- * てはならない.
- */
-
-#ifndef TOPPERS_TARGET_STDDEF_H
-#define TOPPERS_TARGET_STDDEF_H
-
-/*
- * ターゲットを識別するためのマクロの定義
- */
-#define TOPPERS_CQSTARM /* システム略称 */
-
-
-/*
- * 開発環境で共通な定義
- */
-#define TOPPERS_STDINT_TYPE1
-#define TOPPERS_STDFLOAT_TYPE1
-#include "gcc/tool_stddef.h"
-
-/*
- * プロセッサで共通な定義
- */
-#include "arm_m_gcc/prc_stddef.h"
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- * アサーションの失敗時の実行中断処理(T.B.D)
- */
-Inline void
-TOPPERS_assert_abort(void)
-{
- while(1);
-}
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_STDDEF_H */
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2007 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プロジェクトは,本ソフトウェアに関して,特定の使用目的
- * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- * の責任を負わない.
- *
- */
-
-/*
- * テストプログラムのターゲット依存定義(CQ-STARM用)
- */
-
-#ifndef TOPPERS_TARGET_TEST_H
-#define TOPPERS_TARGET_TEST_H
-
-#define STACK_SIZE (1024)
-
-/*
- * プロセッサ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_test.h"
-
-#endif /* TOPPERS_TARGET_TEST_H */
+++ /dev/null
-#include "target_timer.h"
-
-INCLUDE("arm_m_gcc/prc_timer.cfg");
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2007 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プロジェクトは,本ソフトウェアに関して,特定の使用目的
- * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
- * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
- * の責任を負わない.
- *
- */
-
-/*
- * タイマドライバ(CQ-STARM用)
- */
-
-#ifndef TOPPERS_TARGET_TIMER_H
-#define TOPPERS_TARGET_TIMER_H
-
-/*
- * タイマ値の内部表現とミリ秒単位との変換
- */
-#define TIMER_CLOCK (SYS_CLOCK / 1000)
-
-/*
- * タイマ割込みハンドラ登録のための定数
- */
-#define INTPRI_TIMER (-6) /* 割込み優先度 */
-#define INTATR_TIMER 0U /* 割込み属性 */
-
-/*
- * プロセッサ依存部で定義する
- */
-#include "arm_m_gcc/prc_timer.h"
-
-#endif /* TOPPERS_TARGET_TIMER_H */
+++ /dev/null
-/* This file is generated from target_rename.def by genrename. */
-
-/* This file is included only when target_rename.h has been included. */
-#ifdef TOPPERS_TARGET_RENAME_H
-#undef TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_unrename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
+++ /dev/null
-=====================================================================
- CQ-STARMターゲット依存部 (asp-1.3.1対応)
- Last Modified: '08/07/31
-=====================================================================
-
-○概要
-
-CQ-STARMターゲット依存部は,プロセッサにSTM32F10x(Cortex-M3)を搭載した,
-(株)ESP企画製のCQ-STARM+CQ-STARMBBをサポートしている.
-
-
-○カーネルの使用リソース
-
-カーネルは以下のリソースを使用する.
-
- ・ROM
- コードを配置する.
- 使用量は使用するAPIの数に依存する.
-
- ・RAM
- データを配置する.
- 使用量はオブジェクト数に依存する.
-
- ・SysTick
- カーネル内部のティックの生成に用いる.
-
- ・USARTチャネル1
- コンソールの出力に使用.
-
-
-○他のターゲットへの移植
-
-CQ-STARMターゲット依存部で使用するシリアルは,STM32F10xの内蔵機能の
-みを使用するため,STM32F10x系のCotex-M3を用いた環境には容易にポーティ
-ングが可能である.ポーティングに関しては,以下の初期化ルーチンにターゲ
-ット毎の初期化を追加すればよい.
-
- ・target_initialize() : target_config.c
- ターゲット依存部の初期化(C言語)
- ・_hardware_init_hook : target_support.S
- 低レベルのターゲット依存の初期化
- スタートアップモジュールの中で,メモリの初期化の前に呼び出される
-
-
-○デバッグ環境
-
-デバッグ環境としては,JTAGデバッガの使用を前提とする.
-デバッガはGDBを使用.
-JTAGハードウェアは,limex製のARM-USB-TINYを使用.
-ソフトウェアとして,OpenOCDを使用.バージョンは、r657-20080516.
-
-OpenOCDについては、以下のサイトを参照
- http://openocd.berlios.de/web/
-
-OpenOCDを使用してデバッグする場合,TOPPERS_CUSTOM_IDELを定義して,アイドル時に
-サスペンドしないように注意すること.WFI命令でサスペンドした場合,OpenOCDを使っ
-てデバックできなくなるという問題があるためである.
-
-○コンパイラ
-
-GCC 4.2.3 で動作確認を行った.動作確認した GCC 4.2.3 は,以下のサイトから
-バイナリパッケージをダウンロードして用いた.
-
- http://www.codesourcery.com/gnu_toolchains/arm/download.html
-
-
-○割込み優先度
-
-割込み優先度として指定可能な範囲は,-15 〜 -1 である.
-
-○コンソール出力
-
-コンソール出力には,USARTのチャネル1を用いる.CQ-STRM+CQ-STARMBB上ではUSARTの
-チャネル1は,P2に接続されている.通信フォーマットは以下の通りである.
-
- ・1152200bps, Data 8bit, Parity none, Stop 1bit, Flow control none
-
-○アドレスマッピング
-
- 0x0800,0000 - 0x0802,0000 内蔵FlashROM 128KB
- ・vectorセクション
- ・textセクション
- ・rodataセクション
- 0x2000,0000 - 0x2000,5000 内蔵RAM 20KB
- ・dataセクション
- ・bssセクション
-
-○各種設定の変更
-
-幾つかのパラメータは変更可能になっている.設定ファイル毎に設定可能項目
-は次のようになっている.
-
-●Makefile.target の設定項目
-
-・GCC_TARGET
- GCCの suffix を定義
-
-・TEXT_START_ADDRESS/DATA_START_ADDRESS
- テキストセクション,データセクションの開始アドレス
-
-・DEFAULT_STK_TOP
- ディフォルトの非タスクコンテキスト用のスタックの終了番地
- ・非タスクコンテキスト用スタックポインタの初期値(底)
-
-・INCLUDES
- インクルード指定
-
-・COPTS
- Cコンパイラへのオプション
-
-・LDFLAGS
- リンカへのオプション
-
-●target_config.h の設定項目
-
-・DEFAULT_ISTKSZ
- ディフォルトの非タスクコンテキスト用のスタックサイズ
-
-・SIL_DLY_TIM1/2
- 微少時間待ちのための定義
-
-●target_syssvc.h の設定項目
-
-・BPS_SETTING
- コンソールに使用するポート(SCIFのポート1)のボーレート
-
-
-○変更履歴
#
-# @(#) $Id: Makefile.target 1526 2009-04-29 03:53:12Z ertl-hiro $
-#
-
-#
-# Makefile のターゲット依存部(DVE68K/40用)
+# Makefileのターゲット依存部(DVE68K/40用)
#
#
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: dve68k.h 817 2008-03-18 01:33:12Z hiro $
+ * @(#) $Id: dve68k.h 2066 2011-05-03 12:29:54Z ertl-hiro $
*/
/*
/*
* DGAへのアクセス関数
*/
-#define dga_rew_reg(addr) sil_rew_mem(addr)
-#define dga_wrw_reg(addr, val) sil_wrw_mem(addr, val)
+#define dga_rew_reg(addr) sil_rew_mem(((uint32_t *) addr))
+#define dga_wrw_reg(addr, val) sil_wrw_mem(((uint32_t *) addr), val)
/*
* DGAのレジスタへのアクセス関数
Inline uint32_t
dga_read(void *addr)
{
- return((uint32_t) dga_rew_reg(addr));
+ return(dga_rew_reg(addr));
}
Inline void
/*
* μPD72001へのアクセス関数
*/
-#define upd72001_reb_reg(addr) sil_reb_mem(addr)
-#define upd72001_wrb_reg(addr, val) sil_wrb_mem(addr, val)
+#define upd72001_reb_reg(addr) sil_reb_mem(((uint8_t *) addr))
+#define upd72001_wrb_reg(addr, val) sil_wrb_mem(((uint8_t *) addr), val)
/*
* 開発環境依存の処理
$INTPRI_CFGINT_VALID = { -7,-6,...,-1 }$
$
-$ カーネル管理外の割込み
-$
-$TARGET_INHATR = TA_NONKERNEL$
-
-$
-$ チェック方法の指定
-$
-$CHECK_STKSZ_ALIGN = 4$
-
-$
$ 標準テンプレートファイルのインクルード
$
$INCLUDE "kernel/kernel.tf"$
$
$
-$ チェック方法の指定
-$
-$CHECK_FUNC_ALIGN = 2$
-$CHECK_FUNC_NONNULL = 1$
-$CHECK_STACK_ALIGN = 4$
-$CHECK_STACK_NONNULL = 1$
-$CHECK_MPF_ALIGN = 4$
-$CHECK_MPF_NONNULL = 1$
-
-$
$ 標準テンプレートファイルのインクルード
$
$INCLUDE "kernel/kernel_check.tf"$
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
- * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: target_config.h 887 2008-04-11 11:16:07Z hiro $
+ * @(#) $Id: target_config.h 1952 2010-10-24 00:44:26Z ertl-hiro $
*/
/*
#include "dve68k.h"
/*
+ * ターゲット定義のオブジェクト属性
+ */
+#define TARGET_INHATR TA_NONKERNEL /* カーネル管理外の割込み */
+
+/*
+ * エラーチェック方法の指定
+ */
+#define CHECK_STKSZ_ALIGN 4 /* スタックサイズのアライン単位 */
+#define CHECK_FUNC_ALIGN 2 /* 関数のアライン単位 */
+#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
+#define CHECK_STACK_ALIGN 4 /* スタック領域のアライン単位 */
+#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
+#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
+#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
+#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
+
+/*
* トレースログに関する設定
*/
#ifdef TOPPERS_ENABLE_TRACE
* ビットパターンを求めるのを容易にするために,8は欠番になっている.
*/
#define VALID_INTNO(intno) (1U <= (intno) && (intno) <= 31U && (intno) != 8U)
+#define VALID_INTNO_CREISR(intno) VALID_INTNO(intno)
#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
+++ /dev/null
-PACKAGE asp_arch_arm_m_gcc
-
-MANIFEST
-Makefile.target
-lm3s8962.h
-lm3s8962_ram.ld
-lm3s8962_rom.ld
-target.tf
-target_cfg1_out.h
-target_check.tf
-target_config.c
-target_config.h
-target_def.csv
-target_kernel.h
-target_rename.def
-target_rename.h
-target_serial.c
-target_serial.cfg
-target_serial.h
-target_sil.h
-target_stddef.h
-target_syssvc.h
-target_test.h
-target_timer.cfg
-target_timer.h
-target_unrename.h
-target_user.txt
+++ /dev/null
-#
-# @(#) $Id: Makefile.target 1309 2008-08-27 07:48:51Z ertl-honda $
-#
-
-#
-# Makefile のターゲット依存部(LM3S8962用)
-#
-
-#
-# ボード名,プロセッサ名,開発環境名の定義
-#
-BOARD = lm3s8962
-PRC = arm_m
-TOOL = gcc
-
-DRIVER_DIR = ../../../target/cortex_m3/prog_luminary/LuminaryMicro_driver/
-
-#
-# コンパイルオプション
-#
-INCLUDES := $(INCLUDES) -I$(TARGETDIR) -I$(DRIVER_DIR)
-COPTS := $(COPTS) -mlittle-endian -mcpu=cortex-m3
-LDFLAGS := $(LDFLAGS) -mlittle-endian
-LIBS := $(LIBS) $(DRIVER_DIR)/arm-none-eabi-gcc/libdriver.a $(DRIVER_DIR)/arm-none-eabi-gcc/libgr.a
-
-#
-# カーネルに関する定義
-#
-KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
-KERNEL_ASMOBJS := $(KERNEL_ASMOBJS)
-KERNEL_COBJS := $(KERNEL_COBJS) target_config.o prc_timer.o
-
-#
-# システムサービスに関する定義
-#
-SYSSVC_DIR := $(SYSSVC_DIR)
-SYSSVC_COBJS := $(SYSSVC_COBJS) target_serial.o
-
-#
-# コンフィギュレータ関係の変数の定義
-#
-CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
-
-#
-# トレースログに関する設定
-#
-ifeq ($(ENABLE_TRACE),true)
- COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE
- KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/logtrace
- KERNEL_COBJS := $(KERNEL_COBJS) trace_config.o trace_dump.o
-endif
-
-#
-# GNU開発環境のターゲットアーキテクチャの定義
-#
-GCC_TARGET = arm-none-eabi
-
-#
-# リンカスクリプトの定義
-#
-#LDSCRIPT = $(TARGETDIR)/lm3s8962_ram.ld
-LDSCRIPT = $(TARGETDIR)/lm3s8962_rom.ld
-
-#
-# スタートアップモジュールに関する定義
-#
-# lm3s8962.ldに「STARTUP(start.o)」を記述したため,スタートアップモジュー
-# ルの名前をHIDDEN_OBJSに定義する.また,LDFLAGSに-nostdlibを追加している.
-#
-HIDDEN_OBJS = start.o
-
-$(HIDDEN_OBJS): %.o: %.S
- $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
-
-$(HIDDEN_OBJS:.o=.d): %.d: %.S
- @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) \
- -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
-
-LDFLAGS := -nostdlib $(LDFLAGS)
-
-#
-# 依存関係の定義
-#
-cfg1_out.c: $(TARGETDIR)/target_def.csv
-kernel_cfg.timestamp: $(TARGETDIR)/target.tf
-$(OBJFILE): $(TARGETDIR)/target_check.tf
-
-#
-# プロセッサ依存部のインクルード
-#
-include $(SRCDIR)/arch/$(PRC)_$(TOOL)/Makefile.prc
+++ /dev/null
-MEMORY
-{
- ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K
- RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
-}
-
-OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm","elf32-littlearm")
-OUTPUT_ARCH(arm)
-
-PROVIDE(hardware_init_hook = 0);
-PROVIDE(software_init_hook = 0);
-PROVIDE(software_term_hook = 0);
-STARTUP(start.o)
-ENTRY(_start)
-
-SECTIONS
-{
- .text :
- {
- __text = . ;
- KEEP(*(.vector))
- *(.text*)
- *(.glue_7t)
- *(.glue_7)
- } > RAM
- _etext = . ;
- PROVIDE (etext = .) ;
-
- .rodata : {
- *(.rodata*)
- } > RAM
-
- . = ALIGN(4);
- __idata_start = . ;
- .data : AT(__idata_start)
- {
- __data_start = . ;
- *(vtable)
- *(.data*)
- } > RAM
- __idata_end = __idata_start + SIZEOF(.data);
- _edata = . ;
- PROVIDE (edata = .);
- . = ALIGN(4);
-
- .bss :
- {
- __bss_start = . ;
- *(.bss*)
- *(COMMON)
- . = ALIGN(32 / 8);
- } > RAM
- . = ALIGN(32 / 8);
- _end = . ;
- __bss_end = .;
- PROVIDE (end = .) ;
-
- .comment 0 : { *(.comment) }
-
- /* DWARF debug sections.
- Symbols in the DWARF debugging sections are relative to
- the beginning of the section so we begin them at 0. */
-
- /* DWARF 1 */
- .debug 0 : { *(.debug) }
- .line 0 : { *(.line) }
-
- /* GNU DWARF 1 extensions */
- .debug_srcinfo 0 : { *(.debug_srcinfo) }
- .debug_sfnames 0 : { *(.debug_sfnames) }
-
- /* DWARF 1.1 and DWARF 2 */
- .debug_aranges 0 : { *(.debug_aranges) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
-
- /* DWARF 2 */
- .debug_info 0 : { *(.debug_info) }
- .debug_abbrev 0 : { *(.debug_abbrev) }
- .debug_line 0 : { *(.debug_line) }
- .debug_frame 0 : { *(.debug_frame) }
- .debug_str 0 : { *(.debug_str) }
- .debug_loc 0 : { *(.debug_loc) }
- .debug_macinfo 0 : { *(.debug_macinfo) }
-
- /* SGI/MIPS DWARF 2 extensions */
- .debug_weaknames 0 : { *(.debug_weaknames) }
- .debug_funcnames 0 : { *(.debug_funcnames) }
- .debug_typenames 0 : { *(.debug_typenames) }
- .debug_varnames 0 : { *(.debug_varnames) }
-}
\ No newline at end of file
+++ /dev/null
-MEMORY
-{
- ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K
- RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
-}
-
-OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm","elf32-littlearm")
-OUTPUT_ARCH(arm)
-
-PROVIDE(hardware_init_hook = 0);
-PROVIDE(software_init_hook = 0);
-PROVIDE(software_term_hook = 0);
-STARTUP(start.o)
-
-SECTIONS
-{
- .text :
- {
- __text = . ;
- *(.vector)
- *(.text*)
- *(.glue_7t)
- *(.glue_7)
- } > ROM
- _etext = . ;
- PROVIDE (etext = .) ;
-
- .rodata : {
- *(.rodata*)
- } > ROM
-
- . = ALIGN(4);
- __idata_start = . ;
- .data : AT(__idata_start)
- {
- __data_start = . ;
- *(vtable)
- *(.data*)
- } > RAM
- __idata_end = __idata_start + SIZEOF(.data);
- _edata = . ;
- PROVIDE (edata = .);
- . = ALIGN(4);
-
- .bss :
- {
- __bss_start = . ;
- *(.bss*)
- *(COMMON)
- . = ALIGN(32 / 8);
- } > RAM
- . = ALIGN(32 / 8);
- _end = . ;
- __bss_end = .;
- PROVIDE (end = .) ;
-
- .comment 0 : { *(.comment) }
-
- /* DWARF debug sections.
- Symbols in the DWARF debugging sections are relative to
- the beginning of the section so we begin them at 0. */
-
- /* DWARF 1 */
- .debug 0 : { *(.debug) }
- .line 0 : { *(.line) }
-
- /* GNU DWARF 1 extensions */
- .debug_srcinfo 0 : { *(.debug_srcinfo) }
- .debug_sfnames 0 : { *(.debug_sfnames) }
-
- /* DWARF 1.1 and DWARF 2 */
- .debug_aranges 0 : { *(.debug_aranges) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
-
- /* DWARF 2 */
- .debug_info 0 : { *(.debug_info) }
- .debug_abbrev 0 : { *(.debug_abbrev) }
- .debug_line 0 : { *(.debug_line) }
- .debug_frame 0 : { *(.debug_frame) }
- .debug_str 0 : { *(.debug_str) }
- .debug_loc 0 : { *(.debug_loc) }
- .debug_macinfo 0 : { *(.debug_macinfo) }
-
- /* SGI/MIPS DWARF 2 extensions */
- .debug_weaknames 0 : { *(.debug_weaknames) }
- .debug_funcnames 0 : { *(.debug_funcnames) }
- .debug_typenames 0 : { *(.debug_typenames) }
- .debug_varnames 0 : { *(.debug_varnames) }
-}
\ No newline at end of file
+++ /dev/null
-$
-$ パス2のターゲット依存テンプレート(LM3S8962用)
-$
-
-$
-$ プロセッサ依存テンプレートのインクルード
-$
-$INCLUDE"arm_m_gcc/prc.tf"$
+++ /dev/null
-/*
- * @(#) $Id: target_cfg1_out.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * cfg1_out.cをリンクするために必要なスタブの定義
- */
-
-/*
- * プロセッサ依存のスタブの定義
- */
-#include "arm_m_gcc/prc_cfg1_out.h"
+++ /dev/null
-$
-$ パス3のターゲット依存テンプレート(LM3S8962用)
-$
-
-$
-$ パス3のチップ依存のテンプレートのインクルード
-$
-$INCLUDE"arm_m_gcc/prc_check.tf"$
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2008 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: target_config.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * チップ依存モジュール(LM3S8962用)
- *
- * カーネルのターゲット依存部のインクルードファイル.kernel_impl.hのター
- * ゲット依存部の位置付けとなる.
- */
-
-#ifndef TOPPERS_TARGET_CONFIG_H
-#define TOPPERS_TARGET_CONFIG_H
-
-/*
- * ターゲット依存部のハードウェア資源の定義
- */
-#include "lm3s8962.h"
-
-/*
- * トレースログに関する設定
- */
-#ifdef TOPPERS_ENABLE_TRACE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_ENABLE_TRACE */
-
-/*
- * デフォルトの非タスクコンテキスト用のスタック領域の定義
- * 8byte単位で取得される.
- */
-#define DEFAULT_ISTKSZ (0x1000U/8U) /* 4KByte */
-
-/*
- * 微少時間待ちのための定義(本来はSILのターゲット依存部)
- */
-#define SIL_DLY_TIM1 162
-#define SIL_DLY_TIM2 100
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- * ターゲットシステム依存の初期化
- */
-extern void target_initialize(void);
-
-/*
- * ターゲットシステムの終了
- *
- * システムを終了する時に使う.
- */
-extern void target_exit(void) NoReturn;
-
-#endif /* TOPPERS_MACRO_ONLY */
-
-/*
- * チップ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_config.h"
-
-#endif /* TOPPERS_TARGET_CONFIG_H */
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2008 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: target_kernel.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * kernel.hのチップ依存部(LM3S8962用)
- *
- * このインクルードファイルは,kernel.hでインクルードされる.他のファ
- * イルから直接インクルードすることはない.このファイルをインクルード
- * する前に,t_stddef.hがインクルードされるので,それらに依存してもよ
- * い.
- */
-
-#ifndef TOPPERS_TARGET_KERNEL_H
-#define TOPPERS_TARGET_KERNEL_H
-
-/*
- * カーネル管理の割込み優先度の範囲
- *
- * TMIN_INTPRIの定義を変更することで,このレベルよりも高い割込み優先度
- * を持つものをカーネル管理外の割込みとするかを変更できる.
- *
- * TMIN_INTPRIに設定できる値は,
- * -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) 〜 -1
- * の範囲である.
- * 例えば優先度のビット幅(TBITW_IPRI)が8bit,そのうち,subpriorityのビット幅
- * (TBITW_SUBIPRI) が1bitの場合は,-254 〜 -1 の範囲である.
- * この場合,TMIN_INTPRIを -252 とすると,-253,-254の割込みがカーネル管理外
- * となる.-254とすると,NMI以外はカーネル管理外の割込みは設けないことになる.
- * なお,TMIN_INTPRIは,subpriorityに相当する部分は,'0'となるように指定する
- * こと.
- */
-#define TMIN_INTPRI (-7) /* 割込み優先度の最小値(最高値)*/
-
-/*
- * サポートする機能の定義
- */
-#define TOPPERS_SUPPORT_GET_UTM /* get_utmをサポートする */
-
-/*
- * タイムティックの定義
- */
-#define TIC_NUME 1U /* タイムティックの周期の分子 */
-#define TIC_DENO 1U /* タイムティックの周期の分母 */
-
-/*
- * チップ依存で共通な定義
- */
-#include "arm_m_gcc/prc_kernel.h"
-
-#endif /* TOPPERS_TARGET_KERNEL_H */
+++ /dev/null
-INCLUDE "arm_m_gcc/prc"
+++ /dev/null
-/* This file is generated from target_rename.def by genrename. */
-
-#ifndef TOPPERS_TARGET_RENAME_H
-#define TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_rename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2008 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: target_serial.c 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * シリアルI/Oデバイス(SIO)ドライバ(LM3S8962用)
- */
-
-#include <kernel.h>
-#include <t_syslog.h>
-#include "target_serial.h"
-#include "hw_memmap.h"
-#include "hw_types.h"
-#include "uart.h"
-
-/*
- * シリアルI/Oポート初期化ブロックの定義
- */
-typedef struct sio_port_initialization_block {
- uint32_t base;
- INTNO intno;
-} SIOPINIB;
-
-/*
- * シリアルI/Oポート管理ブロックの定義
- */
-struct sio_port_control_block {
- const SIOPINIB *p_siopinib; /* シリアルI/Oポート初期化ブロック */
- intptr_t exinf; /* 拡張情報 */
- bool_t opnflg; /* オープン済みフラグ */
-};
-
-/*
- * シリアルI/Oポート初期化ブロック
- */
-const SIOPINIB siopinib_table[TNUM_SIOP] = {
- {(uint32_t)UART0_BASE, (INTNO)INTNO_SIO}
-};
-
-/*
- * シリアルI/Oポート管理ブロックのエリア
- */
-SIOPCB siopcb_table[TNUM_SIOP];
-
-/*
- * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
- */
-#define INDEX_SIOP(siopid) ((uint_t)((siopid) - 1))
-#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
-
-/*
- * SIOドライバの初期化
- */
-void
-sio_initialize(intptr_t exinf)
-{
- SIOPCB *p_siopcb;
- uint_t i;
-
- /*
- * シリアルI/Oポート管理ブロックの初期化
- */
- for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
- p_siopcb->p_siopinib = &(siopinib_table[i]);
- p_siopcb->opnflg = false;
- }
-}
-
-
-/*
- * シリアルI/Oポートのオープン
- */
-SIOPCB *
-sio_opn_por(ID siopid, intptr_t exinf)
-{
- SIOPCB *p_siopcb;
- const SIOPINIB *p_siopinib;
- bool_t opnflg;
- ER ercd;
-
- p_siopcb = get_siopcb(siopid);
- p_siopinib = p_siopcb->p_siopinib;
-
- /*
- * オープンしたポートがあるかをopnflgに読んでおく.
- */
- opnflg = p_siopcb->opnflg;
-
- p_siopcb->exinf = exinf;
-
- /*
- * ハードウェアの初期化
- */
- UARTConfigSetExpClk(p_siopinib->base, SysCtlClockGet(), 115200,
- (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
- UART_CONFIG_PAR_NONE));
-
- /*
- * シリアルI/O割込みのマスクを解除する.
- */
- if (!opnflg) {
- ercd = ena_int(p_siopinib->intno);
- assert(ercd == E_OK);
- }
-
- return(p_siopcb);
-}
-
-/*
- * シリアルI/Oポートのクローズ
- */
-void
-sio_cls_por(SIOPCB *p_siopcb)
-{
- /*
- * デバイス依存のクローズ処理.
- */
-
-
- /*
- * シリアルI/O割込みをマスクする.
- */
- if (!(p_siopcb->opnflg)) {
- dis_int(p_siopcb->p_siopinib->intno);
- }
-}
-
-/*
- * SIOの割込みサービスルーチン
- */
-void
-sio_isr(intptr_t exinf)
-{
- SIOPCB *p_siopcb;
-
- p_siopcb = get_siopcb(exinf);
-
- /*
- * 割込みのクリア
- */
- UARTIntClear(p_siopcb->p_siopinib->base,
- UARTIntStatus(p_siopcb->p_siopinib->base, true));
-
- if (UARTCharsAvail(p_siopcb->p_siopinib->base)) {
- /*
- * 受信通知コールバックルーチンを呼び出す.
- */
- sio_irdy_rcv(p_siopcb->exinf);
- }
- if (UARTSpaceAvail(p_siopcb->p_siopinib->base)) {
- /*
- * 送信可能コールバックルーチンを呼び出す.
- */
- sio_irdy_snd(p_siopcb->exinf);
- }
-}
-
-/*
- * シリアルI/Oポートへの文字送信
- */
-bool_t
-sio_snd_chr(SIOPCB *p_siopcb, char c)
-{
- if(UARTSpaceAvail(p_siopcb->p_siopinib->base)){
- UARTCharPutNonBlocking(p_siopcb->p_siopinib->base, c);
- return(true);
- }
- return(false);
-}
-
-/*
- * シリアルI/Oポートからの文字受信
- */
-int_t
-sio_rcv_chr(SIOPCB *p_siopcb)
-{
- if(UARTCharsAvail(p_siopcb->p_siopinib->base)){
- return(UARTCharGetNonBlocking(p_siopcb->p_siopinib->base));
- }
- return(-1);
-}
-
-/*
- * シリアルI/Oポートからのコールバックの許可
- */
-void
-sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
-{
- switch (cbrtn) {
- case SIO_RDY_SND:
- UARTIntEnable(p_siopcb->p_siopinib->base, UART_INT_TX);
- break;
- case SIO_RDY_RCV:
- UARTIntEnable(p_siopcb->p_siopinib->base, UART_INT_RX|UART_INT_RT);
- break;
- }
-}
-
-/*
- * シリアルI/Oポートからのコールバックの禁止
- */
-void
-sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
-{
- switch (cbrtn) {
- case SIO_RDY_SND:
- UARTIntDisable(p_siopcb->p_siopinib->base, UART_INT_TX);
- break;
- case SIO_RDY_RCV:
- UARTIntDisable(p_siopcb->p_siopinib->base, UART_INT_RX|UART_INT_RT);
- break;
- }
-}
+++ /dev/null
-/*
- * @(#) $Id: target_serial.cfg 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * SIOドライバ(PL011用)のコンフィギュレーションファイル
- */
-
-#include "target_serial.h"
-ATT_INI({ TA_NULL, 0, sio_initialize });
-ATT_ISR({TA_NULL, 1, INTNO_SIO, sio_isr, 1});
-CFG_INT(INTNO_SIO, { INTATR_SIO, INTPRI_SIO });
-
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2008 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: target_serial.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * シリアルI/Oデバイス(SIO)ドライバ
- */
-
-#ifndef TOPPERS_TARGET_SERIAL_H
-#define TOPPERS_TARGET_SERIAL_H
-
-#include "lm3s8962.h"
-#include "hw_ints.h"
-
-/*
- * SIOの割込みハンドラのベクタ番号
- */
-#define INHNO_SIO INT_UART0 /* 割込みハンドラ番号 */
-#define INTNO_SIO INT_UART0 /* 割込み番号 */
-#define INTPRI_SIO -3 /* 割込み優先度 */
-#define INTATR_SIO 0 /* 割込み属性 */
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- * シリアルI/Oポート管理ブロックの定義
- */
-typedef struct sio_port_control_block SIOPCB;
-
-/*
- * コールバックルーチンの識別番号
- */
-#define SIO_RDY_SND 1U /* 送信可能コールバック */
-#define SIO_RDY_RCV 2U /* 受信通知コールバック */
-
-/*
- * シリアルI/Oポート数の定義
- */
-#define TNUM_SIOP 1 /* サポートするシリアルI/Oポートの数 */
-
-/*
- * SIOドライバの初期化
- */
-extern void sio_initialize(intptr_t exinf);
-
-/*
- * シリアルI/Oポートのオープン
- */
-extern SIOPCB *sio_opn_por(ID siopid, intptr_t exinf);
-
-/*
- * シリアルI/Oポートのクローズ
- */
-extern void sio_cls_por(SIOPCB *p_siopcb);
-
-/*
- * SIOの割込みサービスルーチン
- */
-extern void sio_isr(intptr_t exinf);
-
-/*
- * シリアルI/Oポートへの文字送信
- */
-extern bool_t sio_snd_chr(SIOPCB *p_siopcb, char c);
-
-/*
- * シリアルI/Oポートからの文字受信
- */
-extern int_t sio_rcv_chr(SIOPCB *p_siopcb);
-
-/*
- * シリアルI/Oポートからのコールバックの許可
- */
-extern void sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn);
-
-/*
- * シリアルI/Oポートからのコールバックの禁止
- */
-extern void sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn);
-
-/*
- * シリアルI/Oポートからの送信可能コールバック
- */
-extern void sio_irdy_snd(intptr_t exinf);
-
-/*
- * シリアルI/Oポートからの受信通知コールバック
- */
-extern void sio_irdy_rcv(intptr_t exinf);
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_SERIAL_H */
+++ /dev/null
-/*
- * TOPPERS Software
- * Toyohashi Open Platform for Embedded Real-Time Systems
- *
- * Copyright (C) 2008 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: target_stddef.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * t_stddef.hのターゲット依存部(LM3S8962用)
- *
- * このインクルードファイルは,t_stddef.hの先頭でインクルードされる.
- * 他のファイルからは直接インクルードすることはない.他のインクルード
- * ファイルに先立って処理されるため,他のインクルードファイルに依存し
- * てはならない.
- */
-
-#ifndef TOPPERS_TARGET_STDDEF_H
-#define TOPPERS_TARGET_STDDEF_H
-
-/*
- * ターゲットを識別するためのマクロの定義
- */
-#define TOPPERS_LM3S8962 /* システム略称 */
-
-/*
- * 開発環境で共通な定義
- *
- * 開発環境でstdint.hが用意されている場合には,TOPPERS_STDINT_TYPE1の
- * マクロ定義を削除し,stdint.hをインクルードすればよい.
- */
-#define TOPPERS_STDINT_TYPE1
-#define TOPPERS_STDFLOAT_TYPE1
-#include "gcc/tool_stddef.h"
-
-/*
- * プロセッサ依存で共通な定義
- */
-#include "arm_m_gcc/prc_stddef.h"
-
-
-#ifndef TOPPERS_MACRO_ONLY
-
-/*
- * アサーションの失敗時の実行中断処理(T.B.D)
- */
-Inline void
-TOPPERS_assert_abort(void)
-{
-
-}
-
-#endif /* TOPPERS_MACRO_ONLY */
-#endif /* TOPPERS_TARGET_STDDEF_H */
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2008 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: target_syssvc.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * システムサービスのターゲット依存部(LM3S8962用)
- *
- * システムサービスのターゲット依存部のインクルードファイル.このファ
- * イルの内容は,コンポーネント記述ファイルに記述され,このファイルは
- * 無くなる見込み.
- */
-
-#ifndef TOPPERS_TARGET_SYSSVC_H
-#define TOPPERS_TARGET_SYSSVC_H
-
-/*
- * ターゲットシステムのハードウェア資源の定義
- */
-#include "lm3s8962.h"
-
-/*
- * トレースログに関する設定
- */
-#ifdef TOPPERS_ENABLE_TRACE
-#include "logtrace/trace_config.h"
-#endif /* TOPPERS_ENABLE_TRACE */
-
-/*
- * 起動メッセージのターゲットシステム名
- */
-#define TARGET_NAME "LM3S8962(ARM Cortex-M3)"
-
-/*
- * システムログの低レベル出力のための文字出力
- *
- * ターゲット依存の方法で,文字cを表示/出力/保存する.
- */
-extern void target_fput_log(char_t c);
-
-/*
- * サポートするシリアルポートの数
- */
-#define TNUM_PORT 1
-
-/*
- * システムログタスク関連の定数の定義
- *
- * デフォルト値の通り.
- */
-
-#endif /* TOPPERS_TARGET_SYSSVC_H */
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2008 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: target_test.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * テストプログラムのターゲット依存定義(LM3S8962用)
- */
-
-#ifndef TOPPERS_TARGET_TEST_H
-#define TOPPERS_TARGET_TEST_H
-
-/*
- * プロセッサ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_test.h"
-
-#endif /* TOPPERS_TARGET_TEST_H */
+++ /dev/null
-/*
- * @(#) $Id: target_timer.cfg 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * タイマドライバのコンフィギュレーションファイル
- */
-#include "target_timer.h"
-INCLUDE("arm_m_gcc/prc_timer.cfg");
+++ /dev/null
-/*
- * TOPPERS/ASP Kernel
- * Toyohashi Open Platform for Embedded Real-Time Systems/
- * Advanced Standard Profile Kernel
- *
- * Copyright (C) 2008 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: target_timer.h 1309 2008-08-27 07:48:51Z ertl-honda $
- */
-
-/*
- * タイマドライバ(LM3S8962用)
- */
-
-#ifndef TOPPERS_TARGET_TIMER_H
-#define TOPPERS_TARGET_TIMER_H
-
-/*
- * タイマ値の内部表現とミリ秒単位との変換
- */
-#define TIMER_CLOCK 50000
-
-/*
- * タイマ割込みハンドラ登録のための定数
- */
-#define INTPRI_TIMER (-6) /* 割込み優先度 */
-#define INTATR_TIMER 0U /* 割込み属性 */
-
-/*
- * チップ依存モジュール(ARM-M用)
- */
-#include "arm_m_gcc/prc_timer.h"
-
-#endif /* TOPPERS_TARGET_TIMER_H */
+++ /dev/null
-/* This file is generated from target_rename.def by genrename. */
-
-/* This file is included only when target_rename.h has been included. */
-#ifdef TOPPERS_TARGET_RENAME_H
-#undef TOPPERS_TARGET_RENAME_H
-
-
-#ifdef TOPPERS_LABEL_ASM
-
-
-#endif /* TOPPERS_LABEL_ASM */
-
-#include "arm_m_gcc/prc_unrename.h"
-
-#endif /* TOPPERS_TARGET_RENAME_H */
+++ /dev/null
-=====================================================================
- LM3S8962依存部
- Last Modified: 27 Aug 2008 17:56:46
-=====================================================================
-
-(1) 対応しているターゲットシステムの種類・構成
-
-LM3S8962依存部は,LUMINARY MICRO社のLM3S8962をサポートしている.使用し
-ているリソースはSYSTICとUART0だけであるので,LUMINARY MICRO社の他のチ
-ップでも容易に動作する.チップ初期化やUARTに関するデバイスドライバは
-LUMINARY MICRO社 から提供されている,"Stellaris Peripheral Driver
-Libary"を用いる.
-
-(2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
-
-コンパイラはGCCを用いる動作確認に用いたコンパイラは以下の通りである.
-
- gcc version 4.2.3 (Sourcery G++ Lite 2008q1-126)
-
-デバッグ環境は,LM3S8962を搭載したLUMINARY MICRO社の評価ボード
-LM3S8962 Ethernet+CAN Evaluation Kits のデバッグモジュール経由でのフラ
-ッシュメモリへの書き込みとデバッグを確認した.
-
-(3) ターゲット定義事項の規定
-
-(3-1) 割込み優先度
-
-割込み優先度として指定可能な範囲は,-7 〜 -1 である.TMIN_INTPRIに-7よ
-り小さな値を設定することにより,カーネル管理外の割込みをサポートする.
-
-(4) メモリマップ
-
-プログラムはFLASHへデータはRAMへ配置する.配置を変更するには,
-lm3s8962_rom.ld を変更すること.
-
-(5) シリアルインタフェースドライバの情報
-
-シリアルインタフェースドライバでは,UART0を用いる.通信フォーマットは,
-115200bps, 8bit, non-parity, 1topbitである.
-
-(6) システムログ機能の情報
-
-システムログの低レベル出力は,UART0を用いる.通信フォーマットは,
-115200bps, 8bit, non-parity, 1topbitである.
-
-(7) ライブラリの指定
-
-"Stellaris Peripheral Driver Libary" に含まれる,libdriver.a と
-libgr.a をリンク対象とする必要がある.指定方法は,Makefile.target の
-LIBS に指定すればよい.
-
-(8) ディレクトリ構成・ファイル構成
-
- ./lm3s8962_gcc
- ./Makefile.target
- ./lm3s8962.h
- ./lm3s8962_ram.ld
- ./lm3s8962_rom.ld
- ./target.tf
- ./target_cfg1_out.h
- ./target_check.tf
- ./target_config.c
- ./target_config.h
- ./target_def.csv
- ./target_kernel.h
- ./target_rename.def
- ./target_rename.h
- ./target_serial.c
- ./target_serial.cfg
- ./target_serial.h
- ./target_sil.h
- ./target_stddef.h
- ./target_syssvc.h
- ./target_test.h
- ./target_timer.cfg
- ./target_timer.h
- ./target_unrename.h
- ./target_user.txt
-
-(9) バージョン履歴
-
-2008/08/27
- ・ライブラリのリンク方法を明記.
-
-2008/07/11
- ・最初のリリース
・タスクコンテキスト
・割込みロック解除状態
・CPUロック解除状態
+ ・割込み優先度マスク全解除状態
・タスク例外許可状態
(J) xsns_dpnが正しい値を返すこと
(7) (d-1)(e-1)(f-2) → タスク例外によるリカバリー可能
-(8) (d-2)(e-2)(f-2) â\86\92 ã\82¿ã\82¹ã\82¯ä¾\8bå¤\96ã\81«ã\82\88ã\82\8bã\83ªã\82«ã\83\90ã\83ªã\83¼å\8f¯è\83½
+(8) (d-2)(e-2)(f-2) â\86\92 ã\83ªã\82«ã\83\90ã\83ªã\83¼ä¸\8då\8f¯
!(d-2)(e-1)(f-2)のテストは省く.
-(9) (d-3)(e-2)(f-2) â\86\92 ã\82¿ã\82¹ã\82¯ä¾\8bå¤\96ã\81«ã\82\88ã\82\8bã\83ªã\82«ã\83\90ã\83ªã\83¼å\8f¯è\83½
+(9) (d-3)(e-2)(f-2) â\86\92 ã\83ªã\82«ã\83\90ã\83ªã\83¼ä¸\8då\8f¯
!(d-3)(e-1)(f-2)のテストは省く.
-(10) (d-4)(e-2)(f-2) â\86\92 ã\82¿ã\82¹ã\82¯ä¾\8bå¤\96ã\81«ã\82\88ã\82\8bã\83ªã\82«ã\83\90ã\83ªã\83¼å\8f¯è\83½
+(10) (d-4)(e-2)(f-2) â\86\92 ã\83ªã\82«ã\83\90ã\83ªã\83¼ä¸\8då\8f¯
!(d-4)(e-1)(f-2)のテストは省く.
(11) (d-1)(e-2)(f-2) → 両方法によるリカバリー可能
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc10.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc10.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* 【テストの目的】
*
* 割込み優先度マスク=TMIN_INTPRI-1,ディスパッチ許可状態,タスク例外
- * 許可状態で発生したCPU例外におけるシステム状態のテスト.タスク例外に
- * よりリカバリーできることもテストする.
+ * 許可状態で発生したCPU例外におけるシステム状態のテスト.
*
* このテストは,割込み優先度マスクをTMIN_INTPRI-1に設定できる場合のみ
* 実施する.
* (C) CPU例外ハンドラ実行開始時にディスパッチ禁止フラグが変化しないこと
* (D) CPU例外ハンドラ実行開始時にタスク例外処理禁止フラグが変化しないこと
* (E) CPU例外ハンドラリターン時にCPUロックフラグが元に戻ること
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (F) CPU例外ハンドラリターン時に割込み優先度マスクが元に戻ること
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (G) CPU例外ハンドラリターン時にディスパッチ禁止フラグが変化しないこと
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (H) CPU例外ハンドラリターン時にタスク例外処理禁止フラグが変化しないこと
- * (I) xsns_xpnがfalseを返すこと.ただし,trueを返すことも許されている
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
+ * (I) xsns_xpnがtrueを返すこと
* (J) xsns_dpnがtrueを返すこと
- * (L) タスク例外によるリカバリーができること
*
* 【使用リソース】
*
*
* 【テストシーケンス】
*
- * == TASK1ï¼\88ä¸å\84ªå\85\88度ï¼\8c1å\9b\9eç\9b®ï¼\89==
+ * == TASK1(中優先度)==
* 1: 状態のチェック
* chg_ipm(TMIN_INTPRI-1)
* ena_tex()
* 2: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1 ==
- * 3: 状態のチェック ... (A),(C),(D)
- * xsns_xpn() == false ... (I)
- * !trueであってもテストプログラムを続行する
+ * 3: 状態のチェック ... (A)(C)(D)
+ * xsns_xpn() == true ... (I)
* xsns_dpn() == true ... (J)
- * 4: iras_tex(TASK1, 1U)
- * iloc_cpu()
- * リターン
- * == TASK1のタスク例外処理ルーチン ==
- * 5: 状態のチェック ... (E),(F),(G),(H)
- * 6: act_tsk(TASK1) ... (L)
- * 7: ext_tsk() ... (L)
- * == TASK1(中優先度,2回目)==
- * 8: 状態のチェック ... (L)
- * 9: テスト終了
+ * 4: CPU例外ハンドラからリターンできない場合は,ここで終了
+ * 4: リターン
+ * == TASK1(続き)==
+ * 5: 状態のチェック ... (E)(F)(G)(H)
+ * 6: テスト終了
*/
#include <kernel.h>
#include "kernel_cfg.h"
#include "test_cpuexc.h"
-int_t task1_count = 0;
-
void
task1(intptr_t exinf)
{
ER ercd;
- switch (++task1_count) {
- case 1:
- check_point(1);
- check_state(false, false, TIPM_ENAALL, false, false, true);
- ercd = chg_ipm(TMAX_INTPRI - 1);
- if (ercd == E_PAR) {
- syslog_0(LOG_NOTICE, "This test program is not necessary.");
- ext_ker();
- }
- check_ercd(ercd, E_OK);
- ercd = ena_tex();
- check_ercd(ercd, E_OK);
-
- check_point(2);
- check_state(false, false, TMAX_INTPRI - 1, false, true, false);
- RAISE_CPU_EXCEPTION;
-
- check_point(0);
- break;
+ check_point(1);
+ check_state(false, false, TIPM_ENAALL, false, false, true);
+ ercd = chg_ipm(TMAX_INTPRI - 1);
+ if (ercd == E_PAR) {
+ syslog_0(LOG_NOTICE, "This test program is not necessary.");
+ ext_ker();
+ }
+ check_ercd(ercd, E_OK);
+ ercd = ena_tex();
+ check_ercd(ercd, E_OK);
- case 2:
- check_point(8);
- check_state(false, false, TIPM_ENAALL, false, false, true);
+ check_point(2);
+ check_state(false, false, TMAX_INTPRI - 1, false, true, false);
+ RAISE_CPU_EXCEPTION;
- check_finish(9);
- break;
+ check_point(5);
+ check_state(false, false, TMAX_INTPRI - 1, false, true, false);
- default:
- check_point(0);
- break;
- }
+ check_finish(6);
}
void
tex_task1(TEXPTN texptn, intptr_t exinf)
{
- ER ercd;
-
- check_point(5);
- check_state(false, false, TMAX_INTPRI - 1, false, true, true);
-
- check_point(6);
- ercd = act_tsk(TASK1);
- check_ercd(ercd, E_OK);
-
- check_point(7);
- ercd = ext_tsk();
- check_ercd(ercd, E_OK);
-
check_point(0);
}
void
cpuexc_handler(void *p_excinf)
{
- ER ercd;
-
check_point(3);
check_state_i(true, false, false, true, false);
- if (xsns_xpn(p_excinf) == true) {
- syslog_0(LOG_WARNING, "xsns_xpn returns true.");
- }
+ check_assert(xsns_xpn(p_excinf) == true);
check_assert(xsns_dpn(p_excinf) == true);
+#ifdef CANNOT_RETURN_CPUEXC
+ check_finish(4);
+#endif /* CANNOT_RETURN_CPUEXC */
+
check_point(4);
- ercd = iras_tex(TASK1, 1U);
- check_ercd(ercd, E_OK);
- ercd = iloc_cpu();
- check_ercd(ercd, E_OK);
}
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc11.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc11.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* 2: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1(1回目)==
- * 3: 状態のチェック ... (A),(C),(D)
+ * 3: 状態のチェック ... (A)(C)(D)
* xsns_xpn() == false ... (I)
* xsns_dpn() == false ... (J)
* 4: iact_tsk(TASK2)
* iloc_cpu()
* リターン
* == TASK2(高優先度)==
- * 5: 状態のチェック ... (E),(F),(G),(H)
+ * 5: 状態のチェック ... (E)(F)(G)(H)
* 6: ter_tsk(TASK1) ... (K)
* 7: act_tsk(TASK1) ... (K)
* 8: ext_tsk()
* 10: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1(2回目)==
- * 11: 状態のチェック ... (A),(C),(D)
+ * 11: 状態のチェック ... (A)(C)(D)
* xsns_xpn() == false ... (I)
* xsns_dpn() == false ... (J)
* 12: iras_tex(TASK1, 1U)
* iloc_cpu()
* リターン
* == TASK1のタスク例外処理ルーチン ==
- * 13: 状態のチェック ... (E),(F),(G),(H)
+ * 13: 状態のチェック ... (E)(F)(G)(H)
* 14: act_tsk(TASK1) ... (L)
* 15: ext_tsk() ... (L)
* == TASK1(中優先度,3回目)==
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc12.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc12.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* 2: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1 ==
- * 3: 状態のチェック ... (A),(C),(D)
+ * 3: 状態のチェック ... (A)(C)(D)
* xsns_xpn() == true ... (I)
* xsns_dpn() == true ... (J)
* 4: CPU例外ハンドラからリターンできない場合は,ここで終了
- * 4: iloc_cpu()
- * リターン
+ * 4: リターン
* == TASK1(続き)==
* 5: 状態のチェック ... (E)(F)(G)(H)
* 6: テスト終了
void
cpuexc_handler(void *p_excinf)
{
- ER ercd;
-
check_point(3);
check_state_i(true, false, true, true, true);
check_assert(xsns_xpn(p_excinf) == true);
#endif /* CANNOT_RETURN_CPUEXC */
check_point(4);
- ercd = iloc_cpu();
- check_ercd(ercd, E_OK);
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc13.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc13.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* 2: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1 ==
- * 3: 状態のチェック ... (A),(C),(D)
+ * 3: 状態のチェック ... (A)(C)(D)
* xsns_xpn() == true ... (I)
* xsns_dpn() == true ... (J)
* 4: CPU例外ハンドラからリターンできない場合は,ここで終了
- * 4: iloc_cpu()
- * リターン
+ * 4: リターン
* == TASK1(続き)==
* 5: 状態のチェック ... (E)(F)(G)(H)
* 6: テスト終了
void
cpuexc_handler(void *p_excinf)
{
- ER ercd;
-
check_point(3);
check_state_i(true, false, false, true, true);
check_assert(xsns_xpn(p_excinf) == true);
#endif /* CANNOT_RETURN_CPUEXC */
check_point(4);
- ercd = iloc_cpu();
- check_ercd(ercd, E_OK);
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc2.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc2.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* xsns_xpn() == true ... (I)
* xsns_dpn() == true ... (J)
* 5: CPU例外ハンドラからリターンできない場合は,ここで終了
- * 5: iunl_cpu()
- * リターン
+ * 5: リターン
* == ALM1(続き)==
* 6: 状態のチェック ... (E)(G)(H)
* リターン
void
cpuexc_handler(void *p_excinf)
{
- ER ercd;
-
check_point(4);
check_state_i(true, true, true, true, false);
check_assert(xsns_xpn(p_excinf) == true);
#endif /* CANNOT_RETURN_CPUEXC */
check_point(5);
- ercd = iunl_cpu();
- check_ercd(ercd, E_OK);
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc3.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc3.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* 3: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1 ==
- * 4: 状態のチェック ... (A),(C),(D)
+ * 4: 状態のチェック ... (A)(C)(D)
* xsns_xpn() == true ... (I)
* xsns_dpn() == true ... (J)
* 5: CPU例外ハンドラからリターンできない場合は,ここで終了
- * 5: iloc_cpu()
- * リターン
+ * 5: リターン
* == ALM1(続き)==
* 6: 状態のチェック ... (E)(G)(H)
* リターン
void
cpuexc_handler(void *p_excinf)
{
- ER ercd;
-
check_point(4);
check_state_i(true, false, true, true, false);
check_assert(xsns_xpn(p_excinf) == true);
#endif /* CANNOT_RETURN_CPUEXC */
check_point(5);
- ercd = iloc_cpu();
- check_ercd(ercd, E_OK);
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc8.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc8.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* 【テストの目的】
*
* 割込み優先度マスク=TMAX_INTPRI,ディスパッチ許可状態,タスク例外許
- * 可状態で発生したCPU例外におけるシステム状態のテスト.タスク例外によ
- * りリカバリーできることもテストする.
+ * 可状態で発生したCPU例外におけるシステム状態のテスト.
*
* このテストは,TMAX_INTPRIとTMIN_INTPRIが異なる場合のみ実施する.
*
* (C) CPU例外ハンドラ実行開始時にディスパッチ禁止フラグが変化しないこと
* (D) CPU例外ハンドラ実行開始時にタスク例外処理禁止フラグが変化しないこと
* (E) CPU例外ハンドラリターン時にCPUロックフラグが元に戻ること
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (F) CPU例外ハンドラリターン時に割込み優先度マスクが元に戻ること
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (G) CPU例外ハンドラリターン時にディスパッチ禁止フラグが変化しないこと
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (H) CPU例外ハンドラリターン時にタスク例外処理禁止フラグが変化しないこと
- * (I) xsns_xpnがfalseを返すこと
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
+ * (I) xsns_xpnがtrueを返すこと
* (J) xsns_dpnがtrueを返すこと
- * (L) タスク例外によるリカバリーができること
*
* 【使用リソース】
*
*
* 【テストシーケンス】
*
- * == TASK1ï¼\88ä¸å\84ªå\85\88度ï¼\8c1å\9b\9eç\9b®ï¼\89==
+ * == TASK1(中優先度)==
* 1: 状態のチェック
* chg_ipm(TMAX_INTPRI)
* ena_tex()
* 2: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1 ==
- * 3: 状態のチェック ... (A),(C),(D)
- * xsns_xpn() == false ... (I)
+ * 3: 状態のチェック ... (A)(C)(D)
+ * xsns_xpn() == true ... (I)
* xsns_dpn() == true ... (J)
- * 4: iras_tex(TASK1, 1U)
- * iloc_cpu()
- * リターン
- * == TASK1のタスク例外処理ルーチン ==
- * 5: 状態のチェック ... (E),(F),(G),(H)
- * 6: act_tsk(TASK1) ... (L)
- * 7: ext_tsk() ... (L)
- * == TASK1(中優先度,2回目)==
- * 8: 状態のチェック ... (L)
- * 9: テスト終了
+ * 4: CPU例外ハンドラからリターンできない場合は,ここで終了
+ * 4: リターン
+ * == TASK1(続き)==
+ * 5: 状態のチェック ... (E)(F)(G)(H)
+ * 6: テスト終了
*/
#include <kernel.h>
#include "kernel_cfg.h"
#include "test_cpuexc.h"
-int_t task1_count = 0;
-
void
task1(intptr_t exinf)
{
ER ercd;
- switch (++task1_count) {
- case 1:
- if (TMAX_INTPRI == TMIN_INTPRI) {
- syslog_0(LOG_NOTICE, "This test program is not necessary.");
- ext_ker();
- }
-
- check_point(1);
- check_state(false, false, TIPM_ENAALL, false, false, true);
- ercd = chg_ipm(TMAX_INTPRI);
- check_ercd(ercd, E_OK);
- ercd = ena_tex();
- check_ercd(ercd, E_OK);
-
- check_point(2);
- check_state(false, false, TMAX_INTPRI, false, true, false);
- RAISE_CPU_EXCEPTION;
+ if (TMAX_INTPRI == TMIN_INTPRI) {
+ syslog_0(LOG_NOTICE, "This test program is not necessary.");
+ ext_ker();
+ }
- check_point(0);
- break;
+ check_point(1);
+ check_state(false, false, TIPM_ENAALL, false, false, true);
+ ercd = chg_ipm(TMAX_INTPRI);
+ check_ercd(ercd, E_OK);
+ ercd = ena_tex();
+ check_ercd(ercd, E_OK);
- case 2:
- check_point(8);
- check_state(false, false, TIPM_ENAALL, false, false, true);
+ check_point(2);
+ check_state(false, false, TMAX_INTPRI, false, true, false);
+ RAISE_CPU_EXCEPTION;
- check_finish(9);
- break;
+ check_point(5);
+ check_state(false, false, TMAX_INTPRI, false, true, false);
- default:
- check_point(0);
- break;
- }
+ check_finish(6);
}
void
tex_task1(TEXPTN texptn, intptr_t exinf)
{
- ER ercd;
-
- check_point(5);
- check_state(false, false, TMAX_INTPRI, false, true, true);
-
- check_point(6);
- ercd = act_tsk(TASK1);
- check_ercd(ercd, E_OK);
-
- check_point(7);
- ercd = ext_tsk();
- check_ercd(ercd, E_OK);
-
check_point(0);
}
void
cpuexc_handler(void *p_excinf)
{
- ER ercd;
-
check_point(3);
check_state_i(true, false, false, true, false);
- check_assert(xsns_xpn(p_excinf) == false);
+ check_assert(xsns_xpn(p_excinf) == true);
check_assert(xsns_dpn(p_excinf) == true);
+#ifdef CANNOT_RETURN_CPUEXC
+ check_finish(4);
+#endif /* CANNOT_RETURN_CPUEXC */
+
check_point(4);
- ercd = iras_tex(TASK1, 1U);
- check_ercd(ercd, E_OK);
- ercd = iloc_cpu();
- check_ercd(ercd, E_OK);
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2007-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2007-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_cpuexc9.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_cpuexc9.c 2005 2010-12-31 04:20:08Z ertl-hiro $
*/
/*
* 【テストの目的】
*
* 割込み優先度マスク=TMIN_INTPRI,ディスパッチ許可状態,タスク例外許
- * 可状態で発生したCPU例外におけるシステム状態のテスト.タスク例外によ
- * りリカバリーできることもテストする.
+ * 可状態で発生したCPU例外におけるシステム状態のテスト.
*
* 【テスト項目】
*
* (C) CPU例外ハンドラ実行開始時にディスパッチ禁止フラグが変化しないこと
* (D) CPU例外ハンドラ実行開始時にタスク例外処理禁止フラグが変化しないこと
* (E) CPU例外ハンドラリターン時にCPUロックフラグが元に戻ること
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (F) CPU例外ハンドラリターン時に割込み優先度マスクが元に戻ること
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (G) CPU例外ハンドラリターン時にディスパッチ禁止フラグが変化しないこと
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
* (H) CPU例外ハンドラリターン時にタスク例外処理禁止フラグが変化しないこと
- * (I) xsns_xpnがfalseを返すこと.ただし,trueを返すことも許されている
+ * !CPU例外ハンドラからリターンできる場合のみテストする.
+ * (I) xsns_xpnがtrueを返すこと
* (J) xsns_dpnがtrueを返すこと
- * (L) タスク例外によるリカバリーができること
*
* 【使用リソース】
*
*
* 【テストシーケンス】
*
- * == TASK1ï¼\88ä¸å\84ªå\85\88度ï¼\8c1å\9b\9eç\9b®ï¼\89==
+ * == TASK1(中優先度)==
* 1: 状態のチェック
* chg_ipm(TMIN_INTPRI)
* ena_tex()
* 2: 状態のチェック
* RAISE_CPU_EXCEPTION
* == CPUEXC1 ==
- * 3: 状態のチェック ... (A),(C),(D)
- * xsns_xpn() == false ... (I)
- * !trueであってもテストプログラムを続行する
+ * 3: 状態のチェック ... (A)(C)(D)
+ * xsns_xpn() == true ... (I)
* xsns_dpn() == true ... (J)
- * 4: iras_tex(TASK1, 1U)
- * iloc_cpu()
- * リターン
- * == TASK1のタスク例外処理ルーチン ==
- * 5: 状態のチェック ... (E),(F),(G),(H)
- * 6: act_tsk(TASK1) ... (L)
- * 7: ext_tsk() ... (L)
- * == TASK1(中優先度,2回目)==
- * 8: 状態のチェック ... (L)
- * 9: テスト終了
+ * 4: CPU例外ハンドラからリターンできない場合は,ここで終了
+ * 4: リターン
+ * == TASK1(続き)==
+ * 5: 状態のチェック ... (E)(F)(G)(H)
+ * 6: テスト終了
*/
#include <kernel.h>
#include "kernel_cfg.h"
#include "test_cpuexc.h"
-int_t task1_count = 0;
-
void
task1(intptr_t exinf)
{
ER ercd;
- switch (++task1_count) {
- case 1:
- check_point(1);
- check_state(false, false, TIPM_ENAALL, false, false, true);
- ercd = chg_ipm(TMAX_INTPRI);
- check_ercd(ercd, E_OK);
- ercd = ena_tex();
- check_ercd(ercd, E_OK);
-
- check_point(2);
- check_state(false, false, TMAX_INTPRI, false, true, false);
- RAISE_CPU_EXCEPTION;
-
- check_point(0);
- break;
+ check_point(1);
+ check_state(false, false, TIPM_ENAALL, false, false, true);
+ ercd = chg_ipm(TMIN_INTPRI);
+ check_ercd(ercd, E_OK);
+ ercd = ena_tex();
+ check_ercd(ercd, E_OK);
- case 2:
- check_point(8);
- check_state(false, false, TIPM_ENAALL, false, false, true);
+ check_point(2);
+ check_state(false, false, TMIN_INTPRI, false, true, false);
+ RAISE_CPU_EXCEPTION;
- check_finish(9);
- break;
+ check_point(5);
+ check_state(false, false, TMIN_INTPRI, false, true, false);
- default:
- check_point(0);
- break;
- }
+ check_finish(6);
}
void
tex_task1(TEXPTN texptn, intptr_t exinf)
{
- ER ercd;
-
- check_point(5);
- check_state(false, false, TMAX_INTPRI, false, true, true);
-
- check_point(6);
- ercd = act_tsk(TASK1);
- check_ercd(ercd, E_OK);
-
- check_point(7);
- ercd = ext_tsk();
- check_ercd(ercd, E_OK);
-
check_point(0);
}
void
cpuexc_handler(void *p_excinf)
{
- ER ercd;
-
check_point(3);
check_state_i(true, false, false, true, false);
- if (xsns_xpn(p_excinf) == true) {
- syslog_0(LOG_WARNING, "xsns_xpn returns true.");
- }
+ check_assert(xsns_xpn(p_excinf) == true);
check_assert(xsns_dpn(p_excinf) == true);
+#ifdef CANNOT_RETURN_CPUEXC
+ check_finish(4);
+#endif /* CANNOT_RETURN_CPUEXC */
+
check_point(4);
- ercd = iras_tex(TASK1, 1U);
- check_ercd(ercd, E_OK);
- ercd = iloc_cpu();
- check_ercd(ercd, E_OK);
}
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2006-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2006-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_sysstat1.c 1652 2009-10-10 18:01:05Z ertl-hiro $
+ * @(#) $Id: test_sysstat1.c 2006 2010-12-31 04:20:56Z ertl-hiro $
*/
/*
* 8: ena_dsp()
* 9: dis_tex()
* 10: dis_dsp() ... タスク例外処理ルーチンを呼び出す準備
- * chg_ipm(TMIN_INTPRI)
* ena_tex()
* 11: ras_tex(TSK_SELF, 0x0001)
* == TASK1タスク例外処理ルーチン(1回目)==
* 12: 初期状態のチェック
* 13: ena_dsp() ... 3つの状態を変化させ,リターンで元にもどるか調べる
- * chg_ipm(TIPM_ENAALL)
+ * chg_ipm(TMIN_INTPRI)
* ena_tex()
* リターン
* == TASK1(続き)==
switch (texptn) {
case 0x0001:
check_point(12);
- check_state(false, false, TMIN_INTPRI, true, true, true);
+ check_state(false, false, TIPM_ENAALL, true, true, true);
/*
* ディスパッチ許可,割込み優先度マスク変更,タスク例外処理許可
check_point(13);
ercd = ena_dsp();
check_ercd(ercd, E_OK);
- ercd = chg_ipm(TIPM_ENAALL);
+ ercd = chg_ipm(TMIN_INTPRI);
check_ercd(ercd, E_OK);
ercd = ena_tex();
check_ercd(ercd, E_OK);
- check_state(false, false, TIPM_ENAALL, false, false, false);
+ check_state(false, false, TMIN_INTPRI, false, true, false);
break;
default:
check_state(false, false, TIPM_ENAALL, false, false, true);
/*
- * ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理許可
+ * ディスパッチ禁止,タスク例外処理許可
*/
check_point(10);
ercd = dis_dsp();
check_ercd(ercd, E_OK);
- ercd = chg_ipm(TMIN_INTPRI);
- check_ercd(ercd, E_OK);
ercd = ena_tex();
check_ercd(ercd, E_OK);
- check_state(false, false, TMIN_INTPRI, true, true, false);
+ check_state(false, false, TIPM_ENAALL, true, true, false);
/*
* タスク例外処理を要求
* チェック
*/
check_point(14);
- check_state(false, false, TMIN_INTPRI, true, true, false);
+ check_state(false, false, TIPM_ENAALL, true, true, false);
/*
* CPUロック状態に
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
- * Copyright (C) 2006-2009 by Embedded and Real-Time Systems Laboratory
+ * Copyright (C) 2006-2010 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
- * @(#) $Id: test_tex1.c 1577 2009-05-31 14:30:51Z ertl-hiro $
+ * @(#) $Id: test_tex1.c 2007 2010-12-31 05:48:15Z ertl-hiro $
*/
/*
*
* 【テスト項目】
*
- * (A) ras_tex,ref_texのエラー検出
+ * (A) ras_texのエラー検出
* (A-1) 対象タスクが休止状態
* (A-2) 対象タスクのタスク例外処理ルーチンが定義されていない
- * (B) dis_tex,ena_texのエラー検出
+ * (B) dis_texのエラー検出
* (B-1) 自タスクのタスク例外処理ルーチンが定義されていない
- * (C) ras_texの正常処理
- * (C-1) 対象タスクが自タスクかつタスク例外処理許可で,すぐに起動
- * (C-2) 対象タスクが自タスクでない
- * (C-3) 対象タスクが自タスクだがタスク例外処理禁止
- * (D) ena_texの正常処理
- * (D-1) タスク例外処理要求があり,すぐに起動
- * (D-2) タスク例外処理要求がない
- * (E) タスクディスパッチャによる起動
- * (E-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
+ * (C) ena_texのエラー検出
+ * (C-1) 自タスクのタスク例外処理ルーチンが定義されていない
+ * (D) ref_texのエラー検出
+ * (D-1) 対象タスクが休止状態
+ * (D-2) 対象タスクのタスク例外処理ルーチンが定義されていない
+ * (E) ras_texの正常処理
+ * (E-1) 対象タスクが自タスク,タスク例外処理許可,かつ割込み優先
+ * 度マスク全解除状態で,すぐに実行開始
+ * (E-2) 対象タスクが自タスクでない
+ * (E-3) 対象タスクが自タスクだが,タスク例外処理禁止
+ * (E-4) 対象タスクが自タスクでタスク例外処理許可だが,割込み優先
+ * 度マスクが全解除でない
+ * (F) ena_texの正常処理
+ * (F-1) タスク例外処理要求があり,かつ割込み優先度マスク全解除状
+ * 態で,すぐに実行開始
+ * (F-2) タスク例外処理要求がない
+ * (F-3) タスク例外処理要求があるが,割込み優先度マスクが全解除で
+ * ない
+ * (G) chg_ipmの正常処理
+ * (G-1) タスク例外処理要求があり,かつタスク例外処理許可で,すぐ
+ * に実行開始
+ * (G-2) タスク例外処理要求がない
+ * (G-3) タスク例外処理要求があるが,タスク例外処理禁止
+ * (H) タスクディスパッチャによる起動
+ * (H-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
* 求あり
- * (F) タスク例外処理ルーチンからのリターンによる起動(連続起動)
- * (G) タスク例外処理ルーチンからの戻り時による状態復帰
- * (G-1) タスクに戻ってくる時
- * (G-2) タスク例外処理ルーチンが連続起動される時
- * (H) タスク例外処理ルーチンの多重起動
- * (I) タスク例外処理ルーチンからの戻り時のタスク切換え
+ * (I) タスク例外処理ルーチンからのリターンによる起動(連続起動)
+ * (J) タスク例外処理ルーチンからの戻り時による状態復帰
+ * (J-1) タスクに戻ってくる時
+ * (J-2) タスク例外処理ルーチンが連続起動される時
+ * (K) タスク例外処理ルーチンの多重起動
+ * (L) タスク例外処理ルーチンからの戻り時のタスク切換え
*
* 【使用リソース】
*
* == TASK1(優先度:10)==
* 1: 初期状態のチェック
* ref_tex(TSK_SELF, &rtex)
- * ras_tex(TASK3, 0x0001) ... (A-2)
- * ras_tex(TASK4, 0x0001) ... (A-1)
- * ref_tex(TASK3, &rtex) ... (A-2)
- * ref_tex(TASK4, &rtex) ... (A-1)
- * 2: ena_tex() ... (D-2)
+ * ras_tex(TASK3, 0x0001) -> E_OBJ ... (A-2)
+ * ras_tex(TASK4, 0x0001) -> E_OBJ ... (A-1)
+ * ref_tex(TASK3, &rtex) -> E_OBJ ... (D-2)
+ * ref_tex(TASK4, &rtex) -> E_OBJ ... (D-1)
+ * 2: ena_tex() ... (F-2)
* ref_tex(TSK_SELF, &rtex)
- * 3: ras_tex(TSK_SELF, 0x0001) ... (C-1)
+ * 3: ras_tex(TSK_SELF, 0x0001) ... (E-1)
* == TASK1タスク例外処理ルーチン(1回目)==
* 4: 初期状態のチェック
* 5: dis_dsp() ... 4つの状態をそれぞれ変化させる
* loc_cpu()
* リターン
* == TASK1(続き)==
- * 6: 戻ってきた状態のチェック ... (G-1)
- * 7: dis_dsp() ... 3つの状態をそれぞれ変化させる
- * chg_ipm(TMIN_INTPRI)
+ * 6: 戻ってきた状態のチェック ... (J-1)
+ * 7: dis_dsp() ... ディスパッチ禁止,タスク例外処理禁止
* dis_tex()
- * 8: ras_tex(TASK1, 0x0002) ... (C-3)
+ * 8: ras_tex(TASK1, 0x0002) ... (E-3)
* ref_tex(TSK_SELF, &rtex)
- * 9: ena_tex() ... (D-1)
+ * 9: ena_tex() ... (F-1)
* == TASK1タスク例外処理ルーチン(2回目)==
* 10: 初期状態のチェック
- * 11: ras_tex(TASK1, 0x0001) ... (C-3)
- * ras_tex(TASK1, 0x0002) ... (C-3)
+ * 11: ras_tex(TASK1, 0x0001) ... (E-3)
+ * ras_tex(TASK1, 0x0002) ... (E-3)
* 12: ena_dsp() ... 3つの状態をそれぞれ変化させる
* chg_ipm(TMAX_INTPRI)
* loc_cpu()
- * リターン ... (F)
+ * リターン ... (I)
* == TASK1タスク例外処理ルーチン(3回目)==
* 13: 初期状態のチェック
- * 14: ena_dsp() ... 3つの状態をそれぞれ変化させる
+ * 14: ena_dsp() ... ディスパッチ許可,タスク例外許可
* chg_ipm(TMAX_INTPRI)
* ena_tex()
- * 15: ras_tex(TSK_SELF, 0x0004) ... (H)
+ * chg_ipm(TIPM_ENAALL) ... (G-2)
+ * chg_ipm(TMAX_INTPRI)
+ * 15: ras_tex(TSK_SELF, 0x0004) ... (E-4)
+ * dis_tex()
+ * chg_ipm(TIPM_ENAALL) ... (G-3)
+ * chg_ipm(TMAX_INTPRI)
+ * ena_tex() ... (F-3)
+ * 16: chg_ipm(TIPM_ENAALL) ... (G-1)(K)
* == TASK1タスク例外処理ルーチン(4回目)==
- * 16: 初期状態のチェック
- * 17: dis_dsp() ... 3つの状態をそれぞれ変化させる
- * chg_ipm(TIPM_ENAALL)
+ * 17: 初期状態のチェック
+ * 18: dis_dsp() ... 3つの状態をそれぞれ変化させる
+ * chg_ipm(TMAX_INTPRI)
* loc_cpu()
* リターン
* == TASK1タスク例外処理ルーチン(3回目続き)==
- * 18: 戻ってきた状態のチェック ... (G-2)
+ * 19: 戻ってきた状態のチェック ... (J-2)
* リターン
* == TASK1(続き)==
- * 19: 戻ってきた状態のチェック ... (G-1)
- * 20: ena_dsp()
- * chg_ipm(TIPM_ENAALL)
+ * 20: 戻ってきた状態のチェック ... (J-1)
+ * 21: ena_dsp()
* rot_rdq(TPRI_SELF)
* == TASK2(優先度:10) ==
- * 21: 初期状態のチェック
- * 22: ena_tex()
+ * 22: 初期状態のチェック
+ * 23: ena_tex()
* rot_rdq(TPRI_SELF)
* == TASK3(優先度:10) ==
- * 23: 初期状態のチェック
- * 24: ena_tex()
- * 25: dis_tex() ... (B-1)
- * ext_tsk() ... (B-1)
+ * 24: 初期状態のチェック
+ * 25: ena_tex() -> E_OBJ ... (C-1)
+ * 26: dis_tex() -> E_OBJ ... (B-1)
+ * ext_tsk()
* == TASK1(続き)==
- * 26: ras_tex(TASK2, 0x0001) ... (C-2)
+ * 27: ras_tex(TASK2, 0x0001) ... (E-2)
* ref_tex(TASK2, &rtex)
- * 27: rot_rdq(TPRI_SELF) ... (E-1)
+ * 28: rot_rdq(TPRI_SELF) ... (H-1)
* == TASK2タスク例外処理ルーチン(1回目)==
- * 28: 初期状態のチェック
+ * 29: 初期状態のチェック
* リターン
* == TASK2(続き)==
- * 29: ras_tex(TSK_SELF, 0x0002)
+ * 30: ras_tex(TSK_SELF, 0x0002)
* == TASK2タスク例外処理ルーチン(2回目)==
- * 30: 初期状態のチェック
- * 31: dis_dsp
+ * 31: 初期状態のチェック
+ * 32: dis_dsp()
* rot_rdq(TPRI_SELF)
- * 32: リターン ... (I)
+ * 33: リターン ... (L)
* == TASK1(続き)==
- * 33: リターン(タスク終了)
+ * 34: リターン(タスク終了)
* == TASK2(続き)==
- * 34: テスト終了
+ * 35: テスト終了
*/
#include <kernel.h>
case 0x0002:
check_point(10);
- check_state(false, false, TMIN_INTPRI, true, true, true);
+ check_state(false, false, TIPM_ENAALL, true, true, true);
/*
* タスク例外処理を要求
case 0x0003:
check_point(13);
- check_state(false, false, TMIN_INTPRI, true, true, true);
+ check_state(false, false, TIPM_ENAALL, true, true, true);
/*
* ディスパッチ許可,割込み優先度マスク変更,タスク例外許可
check_ercd(ercd, E_OK);
check_state(false, false, TMAX_INTPRI, false, true, false);
+ ercd = chg_ipm(TIPM_ENAALL);
+ check_ercd(ercd, E_OK);
+ ercd = chg_ipm(TMAX_INTPRI);
+ check_ercd(ercd, E_OK);
+
/*
* タスク例外処理を要求
*/
check_point(15);
ercd = ras_tex(TSK_SELF, 0x0004);
+
+ ercd = dis_tex();
+ check_ercd(ercd, E_OK);
+ ercd = chg_ipm(TIPM_ENAALL);
+ check_ercd(ercd, E_OK);
+ ercd = chg_ipm(TMAX_INTPRI);
+ check_ercd(ercd, E_OK);
+ ercd = ena_tex();
+ check_ercd(ercd, E_OK);
+
+ check_point(16);
+ ercd = chg_ipm(TIPM_ENAALL);
/* ここでタスク例外処理ルーチンが動作する */
check_ercd(ercd, E_OK);
* タスク例外処理からのリターンにより元の状態に戻っていること
* をチェック
*/
- check_point(18);
- check_state(false, false, TMAX_INTPRI, false, true, false);
+ check_point(19);
+ check_state(false, false, TIPM_ENAALL, false, false, false);
break;
case 0x0004:
- check_point(16);
- check_state(false, false, TMAX_INTPRI, false, true, true);
+ check_point(17);
+ check_state(false, false, TIPM_ENAALL, false, false, true);
/*
* ディスパッチ禁止,割込み優先度マスク変更,CPUロック
*/
- check_point(17);
+ check_point(18);
ercd = dis_dsp();
check_ercd(ercd, E_OK);
- ercd = chg_ipm(TIPM_ENAALL);
+ ercd = chg_ipm(TMAX_INTPRI);
check_ercd(ercd, E_OK);
ercd = loc_cpu();
check_ercd(ercd, E_OK);
- check_state(false, true, TIPM_ENAALL, true, true, true);
+ check_state(false, true, TMAX_INTPRI, true, true, true);
break;
default:
check_state(false, false, TIPM_ENAALL, false, false, false);
/*
- * ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理禁止
+ * ディスパッチ禁止,タスク例外処理禁止
*/
check_point(7);
ercd = dis_dsp();
check_ercd(ercd, E_OK);
- ercd = chg_ipm(TMIN_INTPRI);
- check_ercd(ercd, E_OK);
ercd = dis_tex();
check_ercd(ercd, E_OK);
- check_state(false, false, TMIN_INTPRI, true, true, true);
+ check_state(false, false, TIPM_ENAALL, true, true, true);
/*
* タスク例外処理を要求
* タスク例外処理からのリターンにより元の状態に戻っていることを
* チェック
*/
- check_point(19);
- check_state(false, false, TMIN_INTPRI, true, true, false);
+ check_point(20);
+ check_state(false, false, TIPM_ENAALL, true, true, false);
/*
* タスク2に切り換える
*/
- check_point(20);
+ check_point(21);
ercd = ena_dsp();
check_ercd(ercd, E_OK);
- ercd = chg_ipm(TIPM_ENAALL);
- check_ercd(ercd, E_OK);
ercd = rot_rdq(TPRI_SELF);
/* ここで他のタスクが動作する */
check_ercd(ercd, E_OK);
/*
* タスク2に対してタスク例外処理を要求
*/
- check_point(26);
+ check_point(27);
ercd = ras_tex(TASK2, 0x0001);
check_ercd(ercd, E_OK);
ercd = ref_tex(TASK2, &rtex);
/*
* タスク2に切り換える
*/
- check_point(27);
+ check_point(28);
ercd = rot_rdq(TPRI_SELF);
/* ここで他のタスクが動作する */
check_ercd(ercd, E_OK);
/*
* タスク終了
*/
- check_point(33);
+ check_point(34);
}
void
switch (texptn) {
case 0x0001:
- check_point(28);
+ check_point(29);
check_state(false, false, TIPM_ENAALL, false, false, true);
break;
case 0x0002:
- check_point(30);
+ check_point(31);
check_state(false, false, TIPM_ENAALL, false, false, true);
/*
* ディスパッチを禁止して,タスク切換えを要求する.
*/
- check_point(31);
+ check_point(32);
ercd = dis_dsp();
check_ercd(ercd, E_OK);
ercd = rot_rdq(TPRI_SELF);
* タスク例外処理ルーチンからのリターンで,タスク切換えが発生
* する.
*/
- check_point(32);
+ check_point(33);
break;
default:
/*
* 初期状態のチェック
*/
- check_point(21);
+ check_point(22);
check_state(false, false, TIPM_ENAALL, false, false, true);
/*
* タスク例外処理の許可
*/
- check_point(22);
+ check_point(23);
ercd = ena_tex();
check_ercd(ercd, E_OK);
check_state(false, false, TIPM_ENAALL, false, false, false);
/*
* タスク例外処理を要求
*/
- check_point(29);
+ check_point(30);
ercd = ras_tex(TSK_SELF, 0x0002);
/* ここでタスク例外処理ルーチンが動作する */
check_ercd(ercd, E_OK);
/*
* テスト終了
*/
- check_finish(34);
+ check_finish(35);
}
void
/*
* 初期状態のチェック
*/
- check_point(23);
+ check_point(24);
check_state(false, false, TIPM_ENAALL, false, false, true);
/*
* タスク例外処理の許可
*/
- check_point(24);
+ check_point(25);
ercd = ena_tex();
check_ercd(ercd, E_OBJ);
check_state(false, false, TIPM_ENAALL, false, false, true);
/*
* タスク例外処理の禁止
*/
- check_point(25);
+ check_point(26);
ercd = dis_tex();
check_ercd(ercd, E_OBJ);
check_state(false, false, TIPM_ENAALL, false, false, true);
# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
# の責任を負わない.
#
-# @(#) $Id: genoffset 1840 2010-07-10 17:29:42Z ertl-hiro $
+# @(#) $Id: genoffset 1891 2010-08-06 10:22:51Z ertl-hiro $
#
#
elsif ($line =~ /^[ \t]*_?BIT_REF_([0-9]+):/) {
do ref_bit($1);
}
- elsif ($line =~ /^[ \t]*_?BIT_([BL])([BHW])_([^ \t]+):/) {
- do parse_bit($1, $2, $3);
- }
elsif ($line =~ /^[ \t]*SIL_ENDIAN = ([BL])/) {
$sil_endian = $1;
}
}
+#
+# コンパイラがグローバル変数の配置順序を変更すると,BIT_REF_?が下にな
+# る可能性があるため,頭から読み直す.
+#
+seek(INFILE, 0, SEEK_SET);
+while ($line = <INFILE>) {
+ chomp $line;
+
+ if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])_([^ \t]+):/) {
+ do parse_bit($1, $2, $3);
+ }
+}
close(INFILE);
exit($error);
# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
# の責任を負わない.
#
-# @(#) $Id: makedep 1524 2009-04-29 03:37:27Z ertl-hiro $
+# @(#) $Id: makedep 2004 2010-12-31 00:43:36Z ertl-hiro $
#
require "getopt.pl";
# -O <cc_opts> Cコンパイラ/CPPに渡すオプション
# -X ソースファイルを強制的にCヘッダファイルと見なす
#
-# -T <target> ターゲットのファイル名
-# -D <t_dir> ターゲットのディレクトリ名を指定する
-# -d ターゲットのディレクトリ部を保持する
+# -T <target> ターゲット名(のリスト)
+# -D <t_dir> ターゲットのディレクトリ名を指定する(-Tを用いた場
+# 合は無効)
+# -d ターゲットのディレクトリ部を保持する(-Tを用いた場
+# 合は無効)
+# -S 複数のターゲットがある依存ルールを,ターゲット毎に
+# 分割する(こうしないと対応できないmakeがあるらしい)
#
# -R <dirname> Cygwin環境におけるルートディレクトリ名を指定する
# (デフォルトはcygdrive)
$cc_opts = $opt_O;
if ($opt_T) {
- $target_file = $opt_T;
+ $target_name = $opt_T;
}
elsif ($opt_D) {
$target_dir = $opt_D;
# %dependlist に作られた依存関係を出力する
#
sub output_dependlist {
- local($file) = @_;
- local($target, $column, $len);
+ local($target) = @_;
+ local($column, $len, $file);
- if ($target_file) {
- $target = $target_file;
- }
- else {
- $target = $file;
- $target =~ s/(.*)\.(.*)/$1.o/;
- }
- if (defined($target_dir)) {
- $target =~ s/^.*\/([^\/]+)$/$1/;
- if ($target_dir) {
- $target = $target_dir."/".$target;
- }
- }
print $target, ": ";
$column = length($target) + 2;
-
+
foreach $file (keys(%dependlist)) {
$len = length($file) + 1;
if ($column > 8 && $column + $len >= 70) {
foreach $file (@ARGV) {
%dependlist = ();
do makedepend_one($file);
- do output_dependlist($file) if (%dependlist);
+ if (%dependlist) {
+ if ($target_name) {
+ if ($opt_S) {
+ foreach $target (split(/[ \t]+/, $target_name)) {
+ do output_dependlist($target);
+ }
+ }
+ else {
+ do output_dependlist($target_name);
+ }
+ }
+ else {
+ $target = $file;
+ $target =~ s/(.*)\.(.*)/$1.o/;
+ if (defined($target_dir)) {
+ $target =~ s/^.*\/([^\/]+)$/$1/;
+ if ($target_dir) {
+ $target = $target_dir."/".$target;
+ }
+ }
+ do output_dependlist($target);
+ }
+ }
}