Index: EcnlProtoTool/trunk/asp3_dcre/kernel/kernel.trb
===================================================================
--- EcnlProtoTool/trunk/asp3_dcre/kernel/kernel.trb	(revision 321)
+++ EcnlProtoTool/trunk/asp3_dcre/kernel/kernel.trb	(revision 429)
@@ -6,5 +6,5 @@
 # 
 #   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
-#   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
+#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
 #               Graduate School of Information Science, Nagoya Univ., JAPAN
 # 
@@ -38,5 +38,5 @@
 #   の責任を負わない．
 # 
-#   $Id$
+#   $Id: kernel.trb 1167 2019-02-03 17:06:17Z ertl-hiro $
 # 
 
@@ -75,10 +75,8 @@
 
 #
-#  インクルードディレクティブ（#include）
+#  インクルードディレクティブ（#include）の生成
 #
 $kernelCfgC.comment_header("Include Directives")
-$includeFiles.each do |file|
-  $kernelCfgC.add("#include #{file}")
-end
+GenerateIncludes($kernelCfgC)
 $kernelCfgC.add()
 
@@ -91,5 +89,5 @@
   def AllocStack(stack, size)
     # 大きい方に丸めたサイズで確保する［NGKI1050］［NGKI3220］
-    $kernelCfgC.add("/*static*/ STK_T #{stack}[COUNT_STK_T(#{size})];")
+    $kernelCfgC.add("static STK_T #{stack}[COUNT_STK_T(#{size})];")
     return("ROUND_STK_T(#{size})")
   end
@@ -107,5 +105,7 @@
     @OBJ_S = obj_s.tr("a-z", "A-Z")
     @objid = (obj + "id").to_sym
+    @noobj = ("no" + obj).to_sym
     @api = "CRE_#{@OBJ}".to_sym
+    @aidapi = "AID_#{@OBJ}".to_sym
     @inibList = { "#{@OBJ_S}INIB" => "a#{@obj_s}inib_table"}
   end
@@ -114,6 +114,6 @@
     # AID_@OBJの処理
     numAutoObjid = 0
-    $cfgData["AID_#{@OBJ}".to_sym].each do |key, params|
-      numAutoObjid += params["no#{@obj}".to_sym]
+    $cfgData[@aidapi].each do |_, params|
+      numAutoObjid += params[@noobj]
     end
     numObjid = $cfgData[@api].size + numAutoObjid
@@ -123,5 +123,5 @@
 
     # オブジェクトのID番号のマクロ定義の生成
-    $cfgData[@api].sort.each do |key, params|
+    $cfgData[@api].sort.each do |_, params|
       $kernelCfgH.add("#define #{params[@objid]}\t#{params[@objid].val}")
     end
@@ -130,5 +130,5 @@
     # オブジェクトのID番号を保持する変数
     if $USE_EXTERNAL_ID
-      $cfgData[@api].sort.each do |key, params|
+      $cfgData[@api].sort.each do |_, params|
         $kernelCfgC.add("const ID #{params[@objid]}_id" \
 										" = #{params[@objid].val};")
@@ -203,5 +203,5 @@
   nfymode1 = nfymode & 0x0f
   nfymode2 = nfymode & ~0x0f
-  par1 = params[:par1]
+  # par1 = params[:par1]
   par2 = params[:par2]
 
@@ -232,5 +232,5 @@
     error_api(params, "too many parameters for nfymode `#{nfymode}' " \
 											"in %apiname of %#{objid}")
-  elsif nfymode == $TNFY_HANDLER
+  elsif nfymode1 == $TNFY_HANDLER && nfymode2 == 0		#［NGKI3721］
     # タイムイベントハンドラの呼出し
     funcname = "(NFYHDR)(#{par2})"
@@ -269,8 +269,8 @@
 
     # イベント通知処理の処理
-    if nfymode1 == $TNFY_SETVAR && nfymode2 == 0
+    if nfymode1 == $TNFY_SETVAR && nfymode2 == 0		#［NGKI3721］
       # 変数の設定
       $kernelCfgC.add("\t*((intptr_t *) exinf) = (#{par2});")
-    elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0
+    elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0		#［NGKI3721］
       # 変数のインクリメント
       $kernelCfgC.add("\t(void) loc_cpu();")
@@ -293,11 +293,11 @@
       $kernelCfgC.add("\t#{errorCode}psnd_dtq(((ID) exinf), #{par2});")
     else
+      # nfymodeの値が正しくない場合（E_PAR）［NGKI3730］
       error_illegal_id("E_PAR", params, :nfymode, objid)
     end
-			
+
     if nfymode2 != 0
       # エラー通知処理の処理
       $kernelCfgC.add("\tif (ercd != E_OK) {")
-
 
       if nfymode2 == $TENFY_SETVAR
@@ -326,4 +326,5 @@
 													" (intptr_t) ercd);")
       else
+        # nfymodeの値が正しくない場合（E_PAR）［NGKI3730］
         error_illegal_id("E_PAR", params, :nfymode, objid)
       end
@@ -360,5 +361,5 @@
 if $cfgData[:DEF_ICS].size == 0
   # DEF_ICSがない場合のデフォルト値の設定
-  if $DEFAULT_ISTK.nil?
+  if !defined?($DEFAULT_ISTK)
     # スタック領域の自動割付け
     istksz = AllocStack("_kernel_istack", "DEFAULT_ISTKSZ")
@@ -369,5 +370,5 @@
   end
 else
-  # 静的API「DEF_ICS」が複数ある（E_OBJ）［NGKI3216］
+  # 静的API「DEF_ICS」が複数ある場合（E_OBJ）［NGKI3216］
   if $cfgData[:DEF_ICS].size > 1
     error("E_OBJ: too many DEF_ICS")
@@ -375,27 +376,27 @@
 
   # DEF_ICSがある場合の処理
-  params = $cfgData[:DEF_ICS][1]
+  params0 = $cfgData[:DEF_ICS][1]
 
   # パラメータが省略された時のデフォルト値の設定
-  params[:istk] ||= "NULL"
+  params0[:istk] ||= "NULL"
 
   # istkszがターゲット定義の最小値（TARGET_MIN_ISTKSZ，未定義の場合は1）
   # よりも小さい場合（E_PAR）［NGKI3254］
-  if params[:istksz] < $TARGET_MIN_ISTKSZ
-    error_wrong("E_PAR", params, :istksz, "too small")
-  end
-
-  if params[:istk] == "NULL"
+  if params0[:istksz] < $TARGET_MIN_ISTKSZ
+    error_wrong("E_PAR", params0, :istksz, "too small")
+  end
+
+  if params0[:istk] == "NULL"
     # スタック領域の自動割付け
-    istksz = AllocStack("_kernel_istack", params[:istksz])
+    istksz = AllocStack("_kernel_istack", params0[:istksz])
     istk = "_kernel_istack"
   else
-    # istkszがスタック領域のサイズとして正しくない場合（E_PAR）［NGKI3222］
-    if (params[:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0
-      error_wrong("E_PAR", params, :istksz, "not aligned")
-    end
-
-    istksz = "(#{params[:istksz]})"
-    istk = "(void *)(#{params[:istk]})"
+    # istkszがターゲット定義の制約に合致しない場合（E_PAR）［NGKI3222］
+    if (params0[:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0
+      error_wrong("E_PAR", params0, :istksz, "not aligned")
+    end
+
+    istksz = "(#{params0[:istksz]})"
+    istk = "(void *)(#{params0[:istk]})"
   end
 end
@@ -411,50 +412,49 @@
 
 #
-#  カーネルが割り付けるメモリ領域
-#
-$kernelCfgC.comment_header("Memory Area Allocated by Kernel")
-
-if $cfgData[:DEF_KMM].size == 0
-  # DEF_KMMがない場合のデフォルト値の設定
-  kmmsz = "0"
-  kmm = "NULL"
+#  カーネルメモリプール領域
+#
+$kernelCfgC.comment_header("Kernel Memory Pool Area")
+
+if $cfgData[:DEF_MPK].size == 0
+  # DEF_MPKがない場合のデフォルト値の設定
+  mpksz = "0"
+  mpk = "NULL"
 else
-  # 静的API「DEF_KMM」が複数ある（E_OBJ）
-  if ($cfgData[:DEF_KMM].size > 1)
-    error("E_OBJ: too many DEF_KMM")
-  end
-
-  # DEF_KMMがある場合の処理
-  params = $cfgData[:DEF_KMM][1]
+  # 静的API「DEF_MPK」が複数ある（E_OBJ）［NGKI5073］
+  if ($cfgData[:DEF_MPK].size > 1)
+    error("E_OBJ: too many DEF_MPK")
+  end
+
+  # DEF_MPKがある場合の処理
+  params0 = $cfgData[:DEF_MPK][1]
 
   # パラメータが省略された時のデフォルト値の設定
-  params[:kmm] ||= "NULL"
-
-  # kmmszが0の場合（E_PAR）
-  if params[:kmmsz] == 0
-    error_wrong("E_PAR", params, :kmmsz, "zero")
-  end
-
-  if params[:kmm] == "NULL"
-    # カーネルが割り付けるメモリ領域の自動割付け
-    $kernelCfgC.add("static MB_T _kernel_memory" \
-					"[TOPPERS_COUNT_SZ(#{params[:kmmsz]}, sizeof(MB_T))];")
-    kmmsz = "TOPPERS_ROUND_SZ(#{params[:kmmsz]}, sizeof(MB_T))"
-    kmm = "_kernel_memory"
+  params0[:mpk] ||= "NULL"
+
+  # mpkszが0の場合（E_PAR）［NGKI5071］
+  if params0[:mpksz] == 0
+    error_wrong("E_PAR", params0, :mpksz, "zero")
+  end
+
+  if params0[:mpk] == "NULL"
+    # カーネルメモリプール領域の自動割付け
+    $kernelCfgC.add("static MB_T _kernel_memory_pool" \
+					"[COUNT_MB_T(#{params0[:mpksz]})];")
+    mpksz = "ROUND_MB_T(#{params0[:mpksz]})"
+    mpk = "_kernel_memory_pool"
   else
-    # kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場合
-    # （E_PAR）
-    if (params[:kmmsz] & ($CHECK_MB_ALIGN - 1)) != 0
-      error_wrong("E_PAR", params, :kmmsz, "not aligned")
-    end
-
-    kmmsz = "(#{params[:kmmsz]})"
-    kmm = "(void *)(#{params[:kmm]})"
+    # mpkszがターゲット定義の制約に合致しない場合（E_PAR）［NGKI5083］
+    if (params0[:mpksz] & ($CHECK_MB_ALIGN - 1)) != 0
+      error_wrong("E_PAR", params0, :mpksz, "not aligned")
+    end
+
+    mpksz = "(#{params0[:mpksz]})"
+    mpk = "(void *)(#{params0[:mpk]})"
   end
 end
 
 $kernelCfgC.add(<<EOS)
-const size_t _kernel_kmmsz = #{kmmsz};
-MB_T *const _kernel_kmm = #{kmm};
+const size_t _kernel_mpksz = #{mpksz};
+MB_T *const _kernel_mpk = #{mpk};
 EOS
 
@@ -484,9 +484,14 @@
 #  初期化ルーチン機能
 #
+
+# kernel_cfg.hの生成
+$kernelCfgH.add2("#define TNUM_INIRTN\t#{$cfgData[:ATT_INI].size}")
+
+# kernel_cfg.cの生成
 $kernelCfgC.comment_header("Initialization Routine")
 
 # エラーチェック
-$cfgData[:ATT_INI].each do |key, params|
-  # iniatrが無効の場合（E_RSATR）［NGKI3241］
+$cfgData[:ATT_INI].each do |_, params|
+  # iniatrが無効の場合（E_RSATR）［NGKI3241］［NGKI3202］［NGKI3203］
   #（TA_NULLでない場合）
   if (params[:iniatr] != $TA_NULL)
@@ -495,24 +500,35 @@
 end
 
-# 初期化ルーチンの実行関数の生成
-$kernelCfgC.append(<<EOS)
-void
-_kernel_call_inirtn(void)
-{
-EOS
-$cfgData[:ATT_INI].each do |key, params|
-  $kernelCfgC.add("\t((INIRTN)(#{params[:inirtn]}))" \
-								"((intptr_t)(#{params[:exinf]}));")
-end
-$kernelCfgC.add2("}")
+# 初期化ルーチンの数の定義
+$kernelCfgC.add2("const uint_t _kernel_tnum_inirtn = TNUM_INIRTN;");
+
+# 初期化ルーチンテーブルの生成
+if $cfgData[:ATT_INI].size > 0
+  $kernelCfgC.add("const INIRTNB _kernel_inirtnb_table[TNUM_INIRTN] = {")
+  $cfgData[:ATT_INI].each_with_index do |(_, params), index|
+    $kernelCfgC.add(",") if index > 0
+    $kernelCfgC.append("\t{ (INIRTN)(#{params[:inirtn]}), " \
+								"(intptr_t)(#{params[:exinf]}) }")
+  end
+  $kernelCfgC.add
+  $kernelCfgC.add2("};")
+else
+  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const INIRTNB, " \
+										"_kernel_inirtnb_table);")
+end
 
 #
 #  終了処理ルーチン機能
 #
+
+# kernel_cfg.hの生成
+$kernelCfgH.add2("#define TNUM_TERRTN\t#{$cfgData[:ATT_TER].size}")
+
+# kernel_cfg.cの生成
 $kernelCfgC.comment_header("Termination Routine")
 
 # エラーチェック
-$cfgData[:ATT_TER].each do |key, params|
-  # teratrが無効の場合（E_RSATR）［NGKI3248］
+$cfgData[:ATT_TER].each do |_, params|
+  # teratrが無効の場合（E_RSATR）［NGKI3248］［NGKI3208］［NGKI3209］
   #（TA_NULLでない場合）
   if (params[:teratr] != $TA_NULL)
@@ -521,15 +537,21 @@
 end
 
-# 終了処理ルーチンの実行関数の生成
-$kernelCfgC.append(<<EOS)
-void
-_kernel_call_terrtn(void)
-{
-EOS
-$cfgData[:ATT_TER].reverse_each do |key, params|
-  $kernelCfgC.add("\t((TERRTN)(#{params[:terrtn]}))" \
-								"((intptr_t)(#{params[:exinf]}));")
-end
-$kernelCfgC.add2("}")
+# 終了処理ルーチンの数の定義
+$kernelCfgC.add2("const uint_t _kernel_tnum_terrtn = TNUM_TERRTN;");
+
+# 終了処理ルーチンテーブルの生成
+if $cfgData[:ATT_TER].size > 0
+  $kernelCfgC.add("const TERRTNB _kernel_terrtnb_table[TNUM_TERRTN] = {")
+  $cfgData[:ATT_TER].reverse_each.each_with_index do |(_, params), index|
+    $kernelCfgC.add(",") if index > 0
+    $kernelCfgC.append("\t{ (TERRTN)(#{params[:terrtn]}), " \
+								"(intptr_t)(#{params[:exinf]}) }")
+  end
+  $kernelCfgC.add
+  $kernelCfgC.add2("};")
+else
+  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const TERRTNB, " \
+										"_kernel_terrtnb_table);")
+end
 
 #
