Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_check.trb
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_check.trb
r321 r429 1 1 # -*- coding: utf-8 -*- 2 # 2 # 3 3 # TOPPERS/ASP Kernel 4 4 # Toyohashi Open Platform for Embedded Real-Time Systems/ … … 6 6 # 7 7 # Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN 8 # Copyright (C) 2015 ,2016by Embedded and Real-Time Systems Laboratory8 # Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory 9 9 # Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 # … … 38 38 # の責任を負わない. 39 39 # 40 # $Id $40 # $Id: kernel_check.trb 1167 2019-02-03 17:06:17Z ertl-hiro $ 41 41 # 42 42 … … 45 45 # 46 46 47 # 47 # 48 48 # タイムスタンプファイルの指定 49 # 49 # 50 50 $timeStampFileName = "check.timestamp" 51 51 … … 53 53 # データセクションのLMAからVMAへのコピー 54 54 # 55 if !$lmaList.nil?55 if defined?($lmaList) 56 56 $lmaList.each do |lma| 57 57 startData = SYMBOL(lma[:START_DATA]) … … 92 92 # 通知処理のパラメータが2つの場合 93 93 epar1 = params[:par3] 94 epar2 = params[:par4]94 # epar2 = params[:par4] 95 95 else 96 96 # 通知処理のパラメータが1つの場合 97 97 epar1 = params[:par2] 98 epar2 = params[:par3] 99 end 100 101 # タイムイベントハンドラの先頭番地のチェック[NGKI3693] 98 # epar2 = params[:par3] 99 end 100 101 # タイムイベントハンドラの先頭番地が,プログラムの先頭番地として正し 102 # くない場合(E_PAR)[NGKI3693] 102 103 if nfymode == $TNFY_HANDLER 103 104 tmehdr = nfyhdr … … 112 113 end 113 114 114 # 115 # イベント通知処理の変数の番地とオブジェクトIDのチェック 115 116 if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_INCVAR 116 117 # 変数の設定/インクリメントによるタイムイベントの通知 … … 119 120 params1[:p_var] = par1 120 121 121 # 変数の番地のチェック[NGKI3699][NGKI3897] 122 # 通知方法中の変数の番地が,intptr_t型の変数の番地として正しくない 123 # 場合(E_PAR)[NGKI3699][NGKI3897] 122 124 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0 123 125 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned") … … 132 134 params1[:tskid] = par1 133 135 134 # タスクIDのチェック[NGKI3704]136 # 通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704] 135 137 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid) 136 138 error_illegal_id("E_ID", params1, :tskid, objid) … … 142 144 params1[:semid] = par1 143 145 144 # セマフォIDのチェック[NGKI3707]146 # 通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707] 145 147 if !($TMIN_SEMID <= semid && semid <= $tmax_semid) 146 148 error_illegal_id("E_ID", params1, :semid, objid) … … 152 154 params1[:flgid] = par1 153 155 154 # イベントフラグIDのチェック[NGKI3710]156 # 通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710] 155 157 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid) 156 158 error_illegal_id("E_ID", params1, :flgid, objid) … … 162 164 params1[:dtqid] = par1 163 165 164 # データキューIDのチェック[NGKI3713]166 # 通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3713] 165 167 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid) 166 168 error_illegal_id("E_ID", params1, :dtqid, objid) … … 175 177 params1[:p_var] = epar1 176 178 177 # 変数の番地のチェック[NGKI3701][NGKI3897] 179 # 通知方法中の変数の番地が,intptr_t型の変数の番地として正しくない 180 # 場合(E_PAR)[NGKI3701][NGKI3897] 178 181 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0 179 182 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned") … … 188 191 params1[:tskid] = epar1 189 192 190 # タスクIDのチェック[NGKI3704]193 # 通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704] 191 194 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid) 192 195 error_illegal_id("E_ID", params1, :tskid, objid) … … 198 201 params1[:semid] = epar1 199 202 200 # セマフォIDのチェック[NGKI3707]203 # 通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707] 201 204 if !($TMIN_SEMID <= semid && semid <= $tmax_semid) 202 205 error_illegal_id("E_ID", params1, :semid, objid) … … 208 211 params1[:flgid] = epar1 209 212 210 # イベントフラグIDのチェック[NGKI3710]213 # 通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710] 211 214 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid) 212 215 error_illegal_id("E_ID", params1, :flgid, objid) … … 218 221 params1[:dtqid] = epar1 219 222 220 # データキューIDのチェック[NGKI3715]223 # 通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3715] 221 224 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid) 222 225 error_illegal_id("E_ID", params1, :dtqid, objid) … … 225 228 end 226 229 227 # 230 # 228 231 # タスクに関するチェック 229 # 232 # 230 233 tinib = SYMBOL("_kernel_tinib_table") 231 234 $cfgData[:CRE_TSK].sort.each do |key, params| 235 # taskがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI1033] 232 236 task = PEEK(tinib + $offsetof_TINIB_task, $sizeof_TASK) 233 234 # タスクの先頭番地のチェック[NGKI1033]235 237 if (task & ($CHECK_FUNC_ALIGN - 1)) != 0 236 238 error_wrong_id("E_PAR", params, :task, :tskid, "not aligned") … … 240 242 end 241 243 242 # タスクのスタック領域の先頭番地のチェック[NGKI1056]244 # stkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI1056] 243 245 if $USE_TSKINICTXB 244 246 stk = GetStackTskinictxb(key, params, tinib) … … 256 258 end 257 259 258 # 260 # 259 261 # 固定長メモリプールに関するチェック 260 # 262 # 261 263 mpfinib = SYMBOL("_kernel_mpfinib_table") 262 $cfgData[:CRE_MPF].sort.each do | key, params|264 $cfgData[:CRE_MPF].sort.each do |_, params| 263 265 mpf = PEEK(mpfinib + $offsetof_MPFINIB_mpf, $sizeof_void_ptr) 264 266 265 # 固定長メモリプール領域の先頭番地のチェック[NGKI2249]267 # mpfがターゲット定義の制約に合致しない場合(E_PAR)[NGKI2249] 266 268 if (mpf & ($CHECK_MPF_ALIGN - 1)) != 0 267 269 error_wrong_id("E_PAR", params, :mpf, :mpfid, "not aligned") … … 274 276 end 275 277 276 # 278 # 277 279 # 周期通知に関するチェック 278 # 280 # 279 281 cycinib = SYMBOL("_kernel_cycinib_table") 280 282 $cfgData[:CRE_CYC].sort.each do |key, params| … … 282 284 nfyhdr = PEEK(cycinib + $offsetof_CYCINIB_nfyhdr, $sizeof_NFYHDR) 283 285 284 # 286 # 通知情報のチェック 285 287 checkNotifyHandler(key, params, :cycid, exinf, nfyhdr) 286 288 … … 288 290 end 289 291 290 # 292 # 291 293 # アラーム通知に関するチェック 292 # 294 # 293 295 alminib = SYMBOL("_kernel_alminib_table") 294 296 $cfgData[:CRE_ALM].sort.each do |key, params| … … 296 298 nfyhdr = PEEK(alminib + $offsetof_ALMINIB_nfyhdr, $sizeof_NFYHDR) 297 299 298 # 300 # 通知情報のチェック 299 301 checkNotifyHandler(key, params, :almid, exinf, nfyhdr) 300 302 … … 306 308 # 307 309 isrinib = SYMBOL("_kernel_isrinib_table") 308 $cfgData[:CRE_ISR].sort.each do | key, params|310 $cfgData[:CRE_ISR].sort.each do |_, params| 309 311 isr = PEEK(isrinib + $offsetof_ISRINIB_isr, $sizeof_ISR) 310 312 311 # 割込みサービスルーチンの先頭番地のチェック[NGKI3004]313 # isrがプログラムの先頭番地として正しくない場合[NGKI3004] 312 314 if (isr & ($CHECK_FUNC_ALIGN - 1)) != 0 313 315 error_wrong_id("E_PAR", params, :isr, :isrid, "not aligned") … … 320 322 end 321 323 322 # 324 # 323 325 # 非タスクコンテキスト用のスタック領域に関するチェック 324 # 325 i stkAddr = SYMBOL("_kernel_istk")326 if !istkAddr.nil? 327 istk = PEEK( istkAddr, $sizeof_void_ptr)328 329 # 非タスクコンテキスト用のスタック領域の先頭番地のチェック[NGKI3222]326 # 327 if $cfgData[:DEF_ICS].size > 0 328 params0 = $cfgData[:DEF_ICS][1] 329 istk = PEEK(SYMBOL("_kernel_istk"), $sizeof_void_ptr) 330 331 # istkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI3222] 330 332 if (istk & ($CHECK_STACK_ALIGN - 1)) != 0 331 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "not aligned")333 error_wrong("E_PAR", params0, :istk, "not aligned") 332 334 end 333 335 if $CHECK_STACK_NONNULL && istk == 0 334 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "null") 335 end 336 end 337 338 # 339 # カーネルが割り付けるメモリ領域に関するチェック 340 # 341 kmmAddr = SYMBOL("_kernel_kmm") 342 if !kmmAddr.nil? 343 kmm = PEEK(kmmAddr, $sizeof_void_ptr) 344 345 # カーネルが割り付けるメモリ領域の先頭番地のチェック 346 if (kmm & ($CHECK_MB_ALIGN - 1)) != 0 347 error_wrong("E_PAR", $cfgData[:DEF_KMM][1], :kmm, "not aligned") 348 end 349 end 336 error_wrong("E_PAR", params0, :istk, "null") 337 end 338 end 339 340 # 341 # カーネルメモリプール領域に関するチェック 342 # 343 if $cfgData[:DEF_MPK].size > 0 344 params0 = $cfgData[:DEF_MPK][1] 345 mpk = PEEK(SYMBOL("_kernel_mpk"), $sizeof_void_ptr) 346 347 # mpkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI5083] 348 if (mpk & ($CHECK_MPK_ALIGN - 1)) != 0 349 error_wrong("E_PAR", params0, :mpk, "not aligned") 350 end 351 if $CHECK_MPK_NONNULL && mpk == 0 352 error_wrong("E_PAR", params0, :mpk, "null") 353 end 354 end 355 356 # 357 # 初期化ルーチンに関するチェック 358 # 359 inirtnb = SYMBOL("_kernel_inirtnb_table") 360 $cfgData[:ATT_INI].each do |_, params| 361 inirtn = PEEK(inirtnb + $offsetof_INIRTNB_inirtn, $sizeof_INIRTN) 362 363 # inirtnがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI3243] 364 if (inirtn & ($CHECK_FUNC_ALIGN - 1)) != 0 365 error_wrong("E_PAR", params, :inirtn, "not aligned") 366 end 367 if $CHECK_FUNC_NONNULL && inirtn == 0 368 error_wrong("E_PAR", params, :inirtn, "null") 369 end 370 371 inirtnb += $sizeof_INIRTNB 372 end 373 374 # 375 # 終了処理ルーチンに関するチェック 376 # 377 terrtnb = SYMBOL("_kernel_terrtnb_table") 378 $cfgData[:ATT_TER].each do |_, params| 379 terrtn = PEEK(terrtnb + $offsetof_TERRTNB_terrtn, $sizeof_TERRTN) 380 381 # terrtnがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI3250] 382 if (terrtn & ($CHECK_FUNC_ALIGN - 1)) != 0 383 error_wrong("E_PAR", params, :terrtn, "not aligned") 384 end 385 if $CHECK_FUNC_NONNULL && terrtn == 0 386 error_wrong("E_PAR", params, :terrtn, "null") 387 end 388 389 terrtnb += $sizeof_TERRTNB 390 end
Note:
See TracChangeset
for help on using the changeset viewer.