Index: EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_check.trb
===================================================================
--- EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_check.trb	(revision 321)
+++ EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_check.trb	(revision 429)
@@ -1,4 +1,4 @@
 # -*- coding: utf-8 -*-
-# 
+#
 #   TOPPERS/ASP Kernel
 #       Toyohashi Open Platform for Embedded Real-Time Systems/
@@ -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_check.trb 1167 2019-02-03 17:06:17Z ertl-hiro $
 #  
 
@@ -45,7 +45,7 @@
 #
 
-# 
+#
 #  タイムスタンプファイルの指定
-# 
+#
 $timeStampFileName = "check.timestamp"
 
@@ -53,5 +53,5 @@
 #  データセクションのLMAからVMAへのコピー
 #
-if !$lmaList.nil?
+if defined?($lmaList)
   $lmaList.each do |lma|
     startData = SYMBOL(lma[:START_DATA])
@@ -92,12 +92,13 @@
     # 通知処理のパラメータが2つの場合
     epar1 = params[:par3]
-    epar2 = params[:par4]
+    # epar2 = params[:par4]
   else
     # 通知処理のパラメータが1つの場合
     epar1 = params[:par2]
-    epar2 = params[:par3]
-  end
-
-  #	タイムイベントハンドラの先頭番地のチェック［NGKI3693］
+    # epar2 = params[:par3]
+  end
+
+  # タイムイベントハンドラの先頭番地が，プログラムの先頭番地として正し
+  # くない場合（E_PAR）［NGKI3693］
   if nfymode == $TNFY_HANDLER
     tmehdr = nfyhdr
@@ -112,5 +113,5 @@
   end
 
-  #	イベント通知処理の変数の番地とオブジェクトIDのチェック
+  # イベント通知処理の変数の番地とオブジェクトIDのチェック
   if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_INCVAR
     # 変数の設定／インクリメントによるタイムイベントの通知
@@ -119,5 +120,6 @@
     params1[:p_var] = par1
 
-    # 変数の番地のチェック［NGKI3699］［NGKI3897］
+    # 通知方法中の変数の番地が，intptr_t型の変数の番地として正しくない
+    # 場合（E_PAR）［NGKI3699］［NGKI3897］
     if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
       error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
@@ -132,5 +134,5 @@
     params1[:tskid] = par1
 
-    # タスクIDのチェック［NGKI3704］
+    # 通知方法中のタスクIDが有効範囲外の場合（E_ID）［NGKI3704］
     if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
       error_illegal_id("E_ID", params1, :tskid, objid)
@@ -142,5 +144,5 @@
     params1[:semid] = par1
 
-    # セマフォIDのチェック［NGKI3707］
+    # 通知方法中のセマフォIDが有効範囲外の場合（E_ID）［NGKI3707］
     if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
       error_illegal_id("E_ID", params1, :semid, objid)
@@ -152,5 +154,5 @@
     params1[:flgid] = par1
 
-    # イベントフラグIDのチェック［NGKI3710］
+    # 通知方法中のイベントフラグIDが有効範囲外の場合（E_ID）［NGKI3710］
     if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
       error_illegal_id("E_ID", params1, :flgid, objid)
@@ -162,5 +164,5 @@
     params1[:dtqid] = par1
 
-    # データキューIDのチェック［NGKI3713］
+    # 通知方法中のデータキューIDが有効範囲外の場合（E_ID）［NGKI3713］
     if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
       error_illegal_id("E_ID", params1, :dtqid, objid)
@@ -175,5 +177,6 @@
     params1[:p_var] = epar1
 
-    # 変数の番地のチェック［NGKI3701］［NGKI3897］
+    # 通知方法中の変数の番地が，intptr_t型の変数の番地として正しくない
+    # 場合（E_PAR）［NGKI3701］［NGKI3897］
     if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
       error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
@@ -188,5 +191,5 @@
     params1[:tskid] = epar1
 
-    # タスクIDのチェック［NGKI3704］
+    # 通知方法中のタスクIDが有効範囲外の場合（E_ID）［NGKI3704］
     if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
       error_illegal_id("E_ID", params1, :tskid, objid)
@@ -198,5 +201,5 @@
     params1[:semid] = epar1
 
-    # セマフォIDのチェック［NGKI3707］
+    # 通知方法中のセマフォIDが有効範囲外の場合（E_ID）［NGKI3707］
     if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
       error_illegal_id("E_ID", params1, :semid, objid)
@@ -208,5 +211,5 @@
     params1[:flgid] = epar1
 
-    # イベントフラグIDのチェック［NGKI3710］
+    # 通知方法中のイベントフラグIDが有効範囲外の場合（E_ID）［NGKI3710］
     if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
       error_illegal_id("E_ID", params1, :flgid, objid)
@@ -218,5 +221,5 @@
     params1[:dtqid] = epar1
 
-    # データキューIDのチェック［NGKI3715］
+    # 通知方法中のデータキューIDが有効範囲外の場合（E_ID）［NGKI3715］
     if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
       error_illegal_id("E_ID", params1, :dtqid, objid)
@@ -225,12 +228,11 @@
 end
 
-# 
+#
 #  タスクに関するチェック
-# 
+#
 tinib = SYMBOL("_kernel_tinib_table")
 $cfgData[:CRE_TSK].sort.each do |key, params|
+  # taskがプログラムの先頭番地として正しくない場合（E_PAR）［NGKI1033］
   task = PEEK(tinib + $offsetof_TINIB_task, $sizeof_TASK)
-
-  # タスクの先頭番地のチェック［NGKI1033］
   if (task & ($CHECK_FUNC_ALIGN - 1)) != 0
     error_wrong_id("E_PAR", params, :task, :tskid, "not aligned")
@@ -240,5 +242,5 @@
   end
 
-  # タスクのスタック領域の先頭番地のチェック［NGKI1056］
+  # stkがターゲット定義の制約に合致しない場合（E_PAR）［NGKI1056］
   if $USE_TSKINICTXB
     stk = GetStackTskinictxb(key, params, tinib)
@@ -256,12 +258,12 @@
 end
 
-# 
+#
 #  固定長メモリプールに関するチェック
-# 
+#
 mpfinib = SYMBOL("_kernel_mpfinib_table")
-$cfgData[:CRE_MPF].sort.each do |key, params|
+$cfgData[:CRE_MPF].sort.each do |_, params|
   mpf = PEEK(mpfinib + $offsetof_MPFINIB_mpf, $sizeof_void_ptr)
 
-  # 固定長メモリプール領域の先頭番地のチェック［NGKI2249］
+  # mpfがターゲット定義の制約に合致しない場合（E_PAR）［NGKI2249］
   if (mpf & ($CHECK_MPF_ALIGN - 1)) != 0
     error_wrong_id("E_PAR", params, :mpf, :mpfid, "not aligned")
@@ -274,7 +276,7 @@
 end
 
-# 
+#
 #  周期通知に関するチェック
-# 
+#
 cycinib = SYMBOL("_kernel_cycinib_table")
 $cfgData[:CRE_CYC].sort.each do |key, params|
@@ -282,5 +284,5 @@
   nfyhdr = PEEK(cycinib + $offsetof_CYCINIB_nfyhdr, $sizeof_NFYHDR)
 
-  #	通知情報のチェック
+  # 通知情報のチェック
   checkNotifyHandler(key, params, :cycid, exinf, nfyhdr)
 
@@ -288,7 +290,7 @@
 end
 
-# 
+#
 #  アラーム通知に関するチェック
-# 
+#
 alminib = SYMBOL("_kernel_alminib_table")
 $cfgData[:CRE_ALM].sort.each do |key, params|
@@ -296,5 +298,5 @@
   nfyhdr = PEEK(alminib + $offsetof_ALMINIB_nfyhdr, $sizeof_NFYHDR)
 
-  #	通知情報のチェック
+  # 通知情報のチェック
   checkNotifyHandler(key, params, :almid, exinf, nfyhdr)
 
@@ -306,8 +308,8 @@
 #
 isrinib = SYMBOL("_kernel_isrinib_table")
-$cfgData[:CRE_ISR].sort.each do |key, params|
+$cfgData[:CRE_ISR].sort.each do |_, params|
   isr = PEEK(isrinib + $offsetof_ISRINIB_isr, $sizeof_ISR)
 
-  # 割込みサービスルーチンの先頭番地のチェック［NGKI3004］
+  # isrがプログラムの先頭番地として正しくない場合［NGKI3004］
   if (isr & ($CHECK_FUNC_ALIGN - 1)) != 0
     error_wrong_id("E_PAR", params, :isr, :isrid, "not aligned")
@@ -320,30 +322,69 @@
 end
 
-# 
+#
 #  非タスクコンテキスト用のスタック領域に関するチェック
-# 
-istkAddr = SYMBOL("_kernel_istk")
-if !istkAddr.nil?
-  istk = PEEK(istkAddr, $sizeof_void_ptr)
-
-  # 非タスクコンテキスト用のスタック領域の先頭番地のチェック［NGKI3222］
+#
+if $cfgData[:DEF_ICS].size > 0
+  params0 = $cfgData[:DEF_ICS][1]
+  istk = PEEK(SYMBOL("_kernel_istk"), $sizeof_void_ptr)
+
+  # istkがターゲット定義の制約に合致しない場合（E_PAR）［NGKI3222］
   if (istk & ($CHECK_STACK_ALIGN - 1)) != 0
-    error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "not aligned")
+    error_wrong("E_PAR", params0, :istk, "not aligned")
   end
   if $CHECK_STACK_NONNULL && istk == 0
-    error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "null")
-  end
-end
-
-# 
-#  カーネルが割り付けるメモリ領域に関するチェック
-# 
-kmmAddr = SYMBOL("_kernel_kmm")
-if !kmmAddr.nil?
-  kmm = PEEK(kmmAddr, $sizeof_void_ptr)
-
-  # カーネルが割り付けるメモリ領域の先頭番地のチェック
-  if (kmm & ($CHECK_MB_ALIGN - 1)) != 0
-    error_wrong("E_PAR", $cfgData[:DEF_KMM][1], :kmm, "not aligned")
-  end
-end
+    error_wrong("E_PAR", params0, :istk, "null")
+  end
+end
+
+#
+#  カーネルメモリプール領域に関するチェック
+#
+if $cfgData[:DEF_MPK].size > 0
+  params0 = $cfgData[:DEF_MPK][1]
+  mpk = PEEK(SYMBOL("_kernel_mpk"), $sizeof_void_ptr)
+
+  # mpkがターゲット定義の制約に合致しない場合（E_PAR）［NGKI5083］
+  if (mpk & ($CHECK_MPK_ALIGN - 1)) != 0
+    error_wrong("E_PAR", params0, :mpk, "not aligned")
+  end
+  if $CHECK_MPK_NONNULL && mpk == 0
+    error_wrong("E_PAR", params0, :mpk, "null")
+  end
+end
+
+#
+#  初期化ルーチンに関するチェック
+#
+inirtnb = SYMBOL("_kernel_inirtnb_table")
+$cfgData[:ATT_INI].each do |_, params|
+  inirtn = PEEK(inirtnb + $offsetof_INIRTNB_inirtn, $sizeof_INIRTN)
+
+  # inirtnがプログラムの先頭番地として正しくない場合（E_PAR）［NGKI3243］
+  if (inirtn & ($CHECK_FUNC_ALIGN - 1)) != 0
+    error_wrong("E_PAR", params, :inirtn, "not aligned")
+  end
+  if $CHECK_FUNC_NONNULL && inirtn == 0
+    error_wrong("E_PAR", params, :inirtn, "null")
+  end
+
+  inirtnb += $sizeof_INIRTNB
+end
+
+#
+#  終了処理ルーチンに関するチェック
+#
+terrtnb = SYMBOL("_kernel_terrtnb_table")
+$cfgData[:ATT_TER].each do |_, params|
+  terrtn = PEEK(terrtnb + $offsetof_TERRTNB_terrtn, $sizeof_TERRTN)
+
+  # terrtnがプログラムの先頭番地として正しくない場合（E_PAR）［NGKI3250］
+  if (terrtn & ($CHECK_FUNC_ALIGN - 1)) != 0
+    error_wrong("E_PAR", params, :terrtn, "not aligned")
+  end
+  if $CHECK_FUNC_NONNULL && terrtn == 0
+    error_wrong("E_PAR", params, :terrtn, "null")
+  end
+
+  terrtnb += $sizeof_TERRTNB
+end
