Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/kernel/kernel.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.trb
r321 r429 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.trb 1167 2019-02-03 17:06:17Z ertl-hiro $ 41 41 # 42 42 … … 75 75 76 76 # 77 # インクルードディレクティブ(#include) 77 # インクルードディレクティブ(#include)の生成 78 78 # 79 79 $kernelCfgC.comment_header("Include Directives") 80 $includeFiles.each do |file| 81 $kernelCfgC.add("#include #{file}") 82 end 80 GenerateIncludes($kernelCfgC) 83 81 $kernelCfgC.add() 84 82 … … 91 89 def AllocStack(stack, size) 92 90 # 大きい方に丸めたサイズで確保する[NGKI1050][NGKI3220] 93 $kernelCfgC.add(" /*static*/STK_T #{stack}[COUNT_STK_T(#{size})];")91 $kernelCfgC.add("static STK_T #{stack}[COUNT_STK_T(#{size})];") 94 92 return("ROUND_STK_T(#{size})") 95 93 end … … 107 105 @OBJ_S = obj_s.tr("a-z", "A-Z") 108 106 @objid = (obj + "id").to_sym 107 @noobj = ("no" + obj).to_sym 109 108 @api = "CRE_#{@OBJ}".to_sym 109 @aidapi = "AID_#{@OBJ}".to_sym 110 110 @inibList = { "#{@OBJ_S}INIB" => "a#{@obj_s}inib_table"} 111 111 end … … 114 114 # AID_@OBJの処理 115 115 numAutoObjid = 0 116 $cfgData[ "AID_#{@OBJ}".to_sym].each do |key, params|117 numAutoObjid += params[ "no#{@obj}".to_sym]116 $cfgData[@aidapi].each do |_, params| 117 numAutoObjid += params[@noobj] 118 118 end 119 119 numObjid = $cfgData[@api].size + numAutoObjid … … 123 123 124 124 # オブジェクトのID番号のマクロ定義の生成 125 $cfgData[@api].sort.each do | key, params|125 $cfgData[@api].sort.each do |_, params| 126 126 $kernelCfgH.add("#define #{params[@objid]}\t#{params[@objid].val}") 127 127 end … … 130 130 # オブジェクトのID番号を保持する変数 131 131 if $USE_EXTERNAL_ID 132 $cfgData[@api].sort.each do | key, params|132 $cfgData[@api].sort.each do |_, params| 133 133 $kernelCfgC.add("const ID #{params[@objid]}_id" \ 134 134 " = #{params[@objid].val};") … … 203 203 nfymode1 = nfymode & 0x0f 204 204 nfymode2 = nfymode & ~0x0f 205 par1 = params[:par1]205 # par1 = params[:par1] 206 206 par2 = params[:par2] 207 207 … … 232 232 error_api(params, "too many parameters for nfymode `#{nfymode}' " \ 233 233 "in %apiname of %#{objid}") 234 elsif nfymode == $TNFY_HANDLER234 elsif nfymode1 == $TNFY_HANDLER && nfymode2 == 0 #[NGKI3721] 235 235 # タイムイベントハンドラの呼出し 236 236 funcname = "(NFYHDR)(#{par2})" … … 269 269 270 270 # イベント通知処理の処理 271 if nfymode1 == $TNFY_SETVAR && nfymode2 == 0 271 if nfymode1 == $TNFY_SETVAR && nfymode2 == 0 #[NGKI3721] 272 272 # 変数の設定 273 273 $kernelCfgC.add("\t*((intptr_t *) exinf) = (#{par2});") 274 elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0 274 elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0 #[NGKI3721] 275 275 # 変数のインクリメント 276 276 $kernelCfgC.add("\t(void) loc_cpu();") … … 293 293 $kernelCfgC.add("\t#{errorCode}psnd_dtq(((ID) exinf), #{par2});") 294 294 else 295 # nfymodeの値が正しくない場合(E_PAR)[NGKI3730] 295 296 error_illegal_id("E_PAR", params, :nfymode, objid) 296 297 end 297 298 298 299 if nfymode2 != 0 299 300 # エラー通知処理の処理 300 301 $kernelCfgC.add("\tif (ercd != E_OK) {") 301 302 302 303 303 if nfymode2 == $TENFY_SETVAR … … 326 326 " (intptr_t) ercd);") 327 327 else 328 # nfymodeの値が正しくない場合(E_PAR)[NGKI3730] 328 329 error_illegal_id("E_PAR", params, :nfymode, objid) 329 330 end … … 360 361 if $cfgData[:DEF_ICS].size == 0 361 362 # DEF_ICSがない場合のデフォルト値の設定 362 if $DEFAULT_ISTK.nil?363 if !defined?($DEFAULT_ISTK) 363 364 # スタック領域の自動割付け 364 365 istksz = AllocStack("_kernel_istack", "DEFAULT_ISTKSZ") … … 369 370 end 370 371 else 371 # 静的API「DEF_ICS」が複数ある (E_OBJ)[NGKI3216]372 # 静的API「DEF_ICS」が複数ある場合(E_OBJ)[NGKI3216] 372 373 if $cfgData[:DEF_ICS].size > 1 373 374 error("E_OBJ: too many DEF_ICS") … … 375 376 376 377 # DEF_ICSがある場合の処理 377 params = $cfgData[:DEF_ICS][1]378 params0 = $cfgData[:DEF_ICS][1] 378 379 379 380 # パラメータが省略された時のデフォルト値の設定 380 params [:istk] ||= "NULL"381 params0[:istk] ||= "NULL" 381 382 382 383 # istkszがターゲット定義の最小値(TARGET_MIN_ISTKSZ,未定義の場合は1) 383 384 # よりも小さい場合(E_PAR)[NGKI3254] 384 if params [:istksz] < $TARGET_MIN_ISTKSZ385 error_wrong("E_PAR", params , :istksz, "too small")386 end 387 388 if params [:istk] == "NULL"385 if params0[:istksz] < $TARGET_MIN_ISTKSZ 386 error_wrong("E_PAR", params0, :istksz, "too small") 387 end 388 389 if params0[:istk] == "NULL" 389 390 # スタック領域の自動割付け 390 istksz = AllocStack("_kernel_istack", params [:istksz])391 istksz = AllocStack("_kernel_istack", params0[:istksz]) 391 392 istk = "_kernel_istack" 392 393 else 393 # istkszが スタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]394 if (params [:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0395 error_wrong("E_PAR", params , :istksz, "not aligned")396 end 397 398 istksz = "(#{params [:istksz]})"399 istk = "(void *)(#{params [:istk]})"394 # istkszがターゲット定義の制約に合致しない場合(E_PAR)[NGKI3222] 395 if (params0[:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0 396 error_wrong("E_PAR", params0, :istksz, "not aligned") 397 end 398 399 istksz = "(#{params0[:istksz]})" 400 istk = "(void *)(#{params0[:istk]})" 400 401 end 401 402 end … … 411 412 412 413 # 413 # カーネル が割り付けるメモリ領域414 # 415 $kernelCfgC.comment_header(" Memory Area Allocated by Kernel")416 417 if $cfgData[:DEF_ KMM].size == 0418 # DEF_ KMMがない場合のデフォルト値の設定419 kmmsz = "0"420 kmm= "NULL"414 # カーネルメモリプール領域 415 # 416 $kernelCfgC.comment_header("Kernel Memory Pool Area") 417 418 if $cfgData[:DEF_MPK].size == 0 419 # DEF_MPKがない場合のデフォルト値の設定 420 mpksz = "0" 421 mpk = "NULL" 421 422 else 422 # 静的API「DEF_ KMM」が複数ある(E_OBJ)423 if ($cfgData[:DEF_ KMM].size > 1)424 error("E_OBJ: too many DEF_ KMM")425 end 426 427 # DEF_ KMMがある場合の処理428 params = $cfgData[:DEF_KMM][1]423 # 静的API「DEF_MPK」が複数ある(E_OBJ)[NGKI5073] 424 if ($cfgData[:DEF_MPK].size > 1) 425 error("E_OBJ: too many DEF_MPK") 426 end 427 428 # DEF_MPKがある場合の処理 429 params0 = $cfgData[:DEF_MPK][1] 429 430 430 431 # パラメータが省略された時のデフォルト値の設定 431 params [:kmm] ||= "NULL"432 433 # kmmszが0の場合(E_PAR)434 if params [:kmmsz] == 0435 error_wrong("E_PAR", params , :kmmsz, "zero")436 end 437 438 if params [:kmm] == "NULL"439 # カーネル が割り付けるメモリ領域の自動割付け440 $kernelCfgC.add("static MB_T _kernel_memory " \441 "[ TOPPERS_COUNT_SZ(#{params[:kmmsz]}, sizeof(MB_T))];")442 kmmsz = "TOPPERS_ROUND_SZ(#{params[:kmmsz]}, sizeof(MB_T))"443 kmm = "_kernel_memory"432 params0[:mpk] ||= "NULL" 433 434 # mpkszが0の場合(E_PAR)[NGKI5071] 435 if params0[:mpksz] == 0 436 error_wrong("E_PAR", params0, :mpksz, "zero") 437 end 438 439 if params0[:mpk] == "NULL" 440 # カーネルメモリプール領域の自動割付け 441 $kernelCfgC.add("static MB_T _kernel_memory_pool" \ 442 "[COUNT_MB_T(#{params0[:mpksz]})];") 443 mpksz = "ROUND_MB_T(#{params0[:mpksz]})" 444 mpk = "_kernel_memory_pool" 444 445 else 445 # kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場合 446 # (E_PAR) 447 if (params[:kmmsz] & ($CHECK_MB_ALIGN - 1)) != 0 448 error_wrong("E_PAR", params, :kmmsz, "not aligned") 449 end 450 451 kmmsz = "(#{params[:kmmsz]})" 452 kmm = "(void *)(#{params[:kmm]})" 446 # mpkszがターゲット定義の制約に合致しない場合(E_PAR)[NGKI5083] 447 if (params0[:mpksz] & ($CHECK_MB_ALIGN - 1)) != 0 448 error_wrong("E_PAR", params0, :mpksz, "not aligned") 449 end 450 451 mpksz = "(#{params0[:mpksz]})" 452 mpk = "(void *)(#{params0[:mpk]})" 453 453 end 454 454 end 455 455 456 456 $kernelCfgC.add(<<EOS) 457 const size_t _kernel_ kmmsz = #{kmmsz};458 MB_T *const _kernel_ kmm = #{kmm};457 const size_t _kernel_mpksz = #{mpksz}; 458 MB_T *const _kernel_mpk = #{mpk}; 459 459 EOS 460 460 … … 484 484 # 初期化ルーチン機能 485 485 # 486 487 # kernel_cfg.hの生成 488 $kernelCfgH.add2("#define TNUM_INIRTN\t#{$cfgData[:ATT_INI].size}") 489 490 # kernel_cfg.cの生成 486 491 $kernelCfgC.comment_header("Initialization Routine") 487 492 488 493 # エラーチェック 489 $cfgData[:ATT_INI].each do | key, params|490 # iniatrが無効の場合(E_RSATR)[NGKI3241] 494 $cfgData[:ATT_INI].each do |_, params| 495 # iniatrが無効の場合(E_RSATR)[NGKI3241][NGKI3202][NGKI3203] 491 496 #(TA_NULLでない場合) 492 497 if (params[:iniatr] != $TA_NULL) … … 495 500 end 496 501 497 # 初期化ルーチンの実行関数の生成 498 $kernelCfgC.append(<<EOS) 499 void 500 _kernel_call_inirtn(void) 501 { 502 EOS 503 $cfgData[:ATT_INI].each do |key, params| 504 $kernelCfgC.add("\t((INIRTN)(#{params[:inirtn]}))" \ 505 "((intptr_t)(#{params[:exinf]}));") 506 end 507 $kernelCfgC.add2("}") 502 # 初期化ルーチンの数の定義 503 $kernelCfgC.add2("const uint_t _kernel_tnum_inirtn = TNUM_INIRTN;"); 504 505 # 初期化ルーチンテーブルの生成 506 if $cfgData[:ATT_INI].size > 0 507 $kernelCfgC.add("const INIRTNB _kernel_inirtnb_table[TNUM_INIRTN] = {") 508 $cfgData[:ATT_INI].each_with_index do |(_, params), index| 509 $kernelCfgC.add(",") if index > 0 510 $kernelCfgC.append("\t{ (INIRTN)(#{params[:inirtn]}), " \ 511 "(intptr_t)(#{params[:exinf]}) }") 512 end 513 $kernelCfgC.add 514 $kernelCfgC.add2("};") 515 else 516 $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const INIRTNB, " \ 517 "_kernel_inirtnb_table);") 518 end 508 519 509 520 # 510 521 # 終了処理ルーチン機能 511 522 # 523 524 # kernel_cfg.hの生成 525 $kernelCfgH.add2("#define TNUM_TERRTN\t#{$cfgData[:ATT_TER].size}") 526 527 # kernel_cfg.cの生成 512 528 $kernelCfgC.comment_header("Termination Routine") 513 529 514 530 # エラーチェック 515 $cfgData[:ATT_TER].each do | key, params|516 # teratrが無効の場合(E_RSATR)[NGKI3248] 531 $cfgData[:ATT_TER].each do |_, params| 532 # teratrが無効の場合(E_RSATR)[NGKI3248][NGKI3208][NGKI3209] 517 533 #(TA_NULLでない場合) 518 534 if (params[:teratr] != $TA_NULL) … … 521 537 end 522 538 523 # 終了処理ルーチンの実行関数の生成 524 $kernelCfgC.append(<<EOS) 525 void 526 _kernel_call_terrtn(void) 527 { 528 EOS 529 $cfgData[:ATT_TER].reverse_each do |key, params| 530 $kernelCfgC.add("\t((TERRTN)(#{params[:terrtn]}))" \ 531 "((intptr_t)(#{params[:exinf]}));") 532 end 533 $kernelCfgC.add2("}") 539 # 終了処理ルーチンの数の定義 540 $kernelCfgC.add2("const uint_t _kernel_tnum_terrtn = TNUM_TERRTN;"); 541 542 # 終了処理ルーチンテーブルの生成 543 if $cfgData[:ATT_TER].size > 0 544 $kernelCfgC.add("const TERRTNB _kernel_terrtnb_table[TNUM_TERRTN] = {") 545 $cfgData[:ATT_TER].reverse_each.each_with_index do |(_, params), index| 546 $kernelCfgC.add(",") if index > 0 547 $kernelCfgC.append("\t{ (TERRTN)(#{params[:terrtn]}), " \ 548 "(intptr_t)(#{params[:exinf]}) }") 549 end 550 $kernelCfgC.add 551 $kernelCfgC.add2("};") 552 else 553 $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const TERRTNB, " \ 554 "_kernel_terrtnb_table);") 555 end 534 556 535 557 #
Note:
See TracChangeset
for help on using the changeset viewer.