Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/kernel/kernel.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    3838#   の責任を負わない.
    3939#
    40 #   $Id$
     40#   $Id: kernel.trb 1167 2019-02-03 17:06:17Z ertl-hiro $
    4141#
    4242
     
    7575
    7676#
    77 #  インクルードディレクティブ(#include)
     77#  インクルードディレクティブ(#include)の生成
    7878#
    7979$kernelCfgC.comment_header("Include Directives")
    80 $includeFiles.each do |file|
    81   $kernelCfgC.add("#include #{file}")
    82 end
     80GenerateIncludes($kernelCfgC)
    8381$kernelCfgC.add()
    8482
     
    9189  def AllocStack(stack, size)
    9290    # 大きい方に丸めたサイズで確保する[NGKI1050][NGKI3220]
    93     $kernelCfgC.add("/*static*/ STK_T #{stack}[COUNT_STK_T(#{size})];")
     91    $kernelCfgC.add("static STK_T #{stack}[COUNT_STK_T(#{size})];")
    9492    return("ROUND_STK_T(#{size})")
    9593  end
     
    107105    @OBJ_S = obj_s.tr("a-z", "A-Z")
    108106    @objid = (obj + "id").to_sym
     107    @noobj = ("no" + obj).to_sym
    109108    @api = "CRE_#{@OBJ}".to_sym
     109    @aidapi = "AID_#{@OBJ}".to_sym
    110110    @inibList = { "#{@OBJ_S}INIB" => "a#{@obj_s}inib_table"}
    111111  end
     
    114114    # AID_@OBJの処理
    115115    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]
    118118    end
    119119    numObjid = $cfgData[@api].size + numAutoObjid
     
    123123
    124124    # オブジェクトのID番号のマクロ定義の生成
    125     $cfgData[@api].sort.each do |key, params|
     125    $cfgData[@api].sort.each do |_, params|
    126126      $kernelCfgH.add("#define #{params[@objid]}\t#{params[@objid].val}")
    127127    end
     
    130130    # オブジェクトのID番号を保持する変数
    131131    if $USE_EXTERNAL_ID
    132       $cfgData[@api].sort.each do |key, params|
     132      $cfgData[@api].sort.each do |_, params|
    133133        $kernelCfgC.add("const ID #{params[@objid]}_id" \
    134134                                                                                " = #{params[@objid].val};")
     
    203203  nfymode1 = nfymode & 0x0f
    204204  nfymode2 = nfymode & ~0x0f
    205   par1 = params[:par1]
     205  # par1 = params[:par1]
    206206  par2 = params[:par2]
    207207
     
    232232    error_api(params, "too many parameters for nfymode `#{nfymode}' " \
    233233                                                                                        "in %apiname of %#{objid}")
    234   elsif nfymode == $TNFY_HANDLER
     234  elsif nfymode1 == $TNFY_HANDLER && nfymode2 == 0              #[NGKI3721]
    235235    # タイムイベントハンドラの呼出し
    236236    funcname = "(NFYHDR)(#{par2})"
     
    269269
    270270    # イベント通知処理の処理
    271     if nfymode1 == $TNFY_SETVAR && nfymode2 == 0
     271    if nfymode1 == $TNFY_SETVAR && nfymode2 == 0                #[NGKI3721]
    272272      # 変数の設定
    273273      $kernelCfgC.add("\t*((intptr_t *) exinf) = (#{par2});")
    274     elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0
     274    elsif nfymode1 == $TNFY_INCVAR && nfymode2 == 0             #[NGKI3721]
    275275      # 変数のインクリメント
    276276      $kernelCfgC.add("\t(void) loc_cpu();")
     
    293293      $kernelCfgC.add("\t#{errorCode}psnd_dtq(((ID) exinf), #{par2});")
    294294    else
     295      # nfymodeの値が正しくない場合(E_PAR)[NGKI3730]
    295296      error_illegal_id("E_PAR", params, :nfymode, objid)
    296297    end
    297                        
     298
    298299    if nfymode2 != 0
    299300      # エラー通知処理の処理
    300301      $kernelCfgC.add("\tif (ercd != E_OK) {")
    301 
    302302
    303303      if nfymode2 == $TENFY_SETVAR
     
    326326                                                                                                        " (intptr_t) ercd);")
    327327      else
     328        # nfymodeの値が正しくない場合(E_PAR)[NGKI3730]
    328329        error_illegal_id("E_PAR", params, :nfymode, objid)
    329330      end
     
    360361if $cfgData[:DEF_ICS].size == 0
    361362  # DEF_ICSがない場合のデフォルト値の設定
    362   if $DEFAULT_ISTK.nil?
     363  if !defined?($DEFAULT_ISTK)
    363364    # スタック領域の自動割付け
    364365    istksz = AllocStack("_kernel_istack", "DEFAULT_ISTKSZ")
     
    369370  end
    370371else
    371   # 静的API「DEF_ICS」が複数ある(E_OBJ)[NGKI3216]
     372  # 静的API「DEF_ICS」が複数ある場合(E_OBJ)[NGKI3216]
    372373  if $cfgData[:DEF_ICS].size > 1
    373374    error("E_OBJ: too many DEF_ICS")
     
    375376
    376377  # DEF_ICSがある場合の処理
    377   params = $cfgData[:DEF_ICS][1]
     378  params0 = $cfgData[:DEF_ICS][1]
    378379
    379380  # パラメータが省略された時のデフォルト値の設定
    380   params[:istk] ||= "NULL"
     381  params0[:istk] ||= "NULL"
    381382
    382383  # istkszがターゲット定義の最小値(TARGET_MIN_ISTKSZ,未定義の場合は1)
    383384  # よりも小さい場合(E_PAR)[NGKI3254]
    384   if params[:istksz] < $TARGET_MIN_ISTKSZ
    385     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"
    389390    # スタック領域の自動割付け
    390     istksz = AllocStack("_kernel_istack", params[:istksz])
     391    istksz = AllocStack("_kernel_istack", params0[:istksz])
    391392    istk = "_kernel_istack"
    392393  else
    393     # istkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]
    394     if (params[:istksz] & ($CHECK_STKSZ_ALIGN - 1)) != 0
    395       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]})"
    400401  end
    401402end
     
    411412
    412413#
    413 #  カーネルが割り付けるメモリ領域
    414 #
    415 $kernelCfgC.comment_header("Memory Area Allocated by Kernel")
    416 
    417 if $cfgData[:DEF_KMM].size == 0
    418   # DEF_KMMがない場合のデフォルト値の設定
    419   kmmsz = "0"
    420   kmm = "NULL"
     414#  カーネルメモリプール領域
     415#
     416$kernelCfgC.comment_header("Kernel Memory Pool Area")
     417
     418if $cfgData[:DEF_MPK].size == 0
     419  # DEF_MPKがない場合のデフォルト値の設定
     420  mpksz = "0"
     421  mpk = "NULL"
    421422else
    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]
    429430
    430431  # パラメータが省略された時のデフォルト値の設定
    431   params[:kmm] ||= "NULL"
    432 
    433   # kmmszが0の場合(E_PAR)
    434   if params[:kmmsz] == 0
    435     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"
    444445  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]})"
    453453  end
    454454end
    455455
    456456$kernelCfgC.add(<<EOS)
    457 const size_t _kernel_kmmsz = #{kmmsz};
    458 MB_T *const _kernel_kmm = #{kmm};
     457const size_t _kernel_mpksz = #{mpksz};
     458MB_T *const _kernel_mpk = #{mpk};
    459459EOS
    460460
     
    484484#  初期化ルーチン機能
    485485#
     486
     487# kernel_cfg.hの生成
     488$kernelCfgH.add2("#define TNUM_INIRTN\t#{$cfgData[:ATT_INI].size}")
     489
     490# kernel_cfg.cの生成
    486491$kernelCfgC.comment_header("Initialization Routine")
    487492
    488493# エラーチェック
    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]
    491496  #(TA_NULLでない場合)
    492497  if (params[:iniatr] != $TA_NULL)
     
    495500end
    496501
    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# 初期化ルーチンテーブルの生成
     506if $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("};")
     515else
     516  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const INIRTNB, " \
     517                                                                                "_kernel_inirtnb_table);")
     518end
    508519
    509520#
    510521#  終了処理ルーチン機能
    511522#
     523
     524# kernel_cfg.hの生成
     525$kernelCfgH.add2("#define TNUM_TERRTN\t#{$cfgData[:ATT_TER].size}")
     526
     527# kernel_cfg.cの生成
    512528$kernelCfgC.comment_header("Termination Routine")
    513529
    514530# エラーチェック
    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]
    517533  #(TA_NULLでない場合)
    518534  if (params[:teratr] != $TA_NULL)
     
    521537end
    522538
    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# 終了処理ルーチンテーブルの生成
     543if $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("};")
     552else
     553  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const TERRTNB, " \
     554                                                                                "_kernel_terrtnb_table);")
     555end
    534556
    535557#
Note: See TracChangeset for help on using the changeset viewer.