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/interrupt.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: interrupt.trb 1167 2019-02-03 17:06:17Z ertl-hiro $
    4141#
    4242
     
    5454#  フォルト定義
    5555#
    56 if $INTNO_CREISR_VALID.nil?
     56if !defined?($INTNO_CREISR_VALID)
    5757  $INTNO_CREISR_VALID = $INTNO_VALID
    5858end
    59 if $INHNO_CREISR_VALID.nil?
     59if !defined?($INHNO_CREISR_VALID)
    6060  $INHNO_CREISR_VALID = $INHNO_VALID
    6161end
     
    6464#  CFG_INTで使用できる割込み優先度のデフォルト定義
    6565#
    66 if $INTPRI_CFGINT_VALID.nil?
     66if !defined?($INTPRI_CFGINT_VALID)
    6767  $INTPRI_CFGINT_VALID = $TMIN_INTPRI.upto($TMAX_INTPRI).to_a
    6868end
     
    8787#  割込み要求ラインに関するエラーチェック
    8888#
    89 $cfgData[:CFG_INT].each do |key, params|
    90   #     intnoが割込み番号として正しくない場合(E_PAR)[NGKI2972]
    91   if $INTNO_VALID.index(params[:intno]).nil?
     89$cfgData[:CFG_INT].each do |_, params|
     90  # intnoが有効範囲外の場合(E_PAR)[NGKI2972]
     91  if !$INTNO_VALID.include?(params[:intno])
    9292    error_illegal("E_PAR", params, :intno)
    9393  end
    9494
    95   #     intatrが無効の場合(E_RSATR)[NGKI2969
     95  # intatrが無効の場合(E_RSATR)[NGKI2969][NGKI2944][NGKI2945
    9696  #(TA_ENAINT,TA_EDGE,TARGET_INTATR以外のビットがセットされている場合)
    9797  if (params[:intatr] & ~($TA_ENAINT|$TA_EDGE|$TARGET_INTATR)) != 0
     
    9999  end
    100100
    101   #     intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
    102   #     [NGKI2973]
    103   if $INTPRI_CFGINT_VALID.index(params[:intpri]).nil?
    104     error_illegal_sym("E_OBJ", params, :intpri, :intno)
    105   end
    106 
    107   # カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
    108   #     りも小さい値が指定されなかった場合(E_OBJ)[NGKI2983]
    109   if !$INTNO_FIX_NONKERNEL.nil?
    110     if !$INTNO_FIX_NONKERNEL.index(params[:intno]).nil?
    111       if params[:intpri] >= $TMIN_INTPRI
    112         error_ercd("E_OBJ", params, "%%intno must have higher priority " \
     101  # intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
     102  # [NGKI2973]
     103  if !$INTPRI_CFGINT_VALID.include?(params[:intpri])
     104    error_illegal_sym("E_PAR", params, :intpri, :intno)
     105  end
     106
     107  # カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
     108  # 上の値が指定された場合(E_OBJ)[NGKI2983]
     109  if defined?($INTNO_FIX_NONKERNEL) \
     110                                && $INTNO_FIX_NONKERNEL.include?(params[:intno])
     111    if params[:intpri] >= $TMIN_INTPRI
     112      error_ercd("E_OBJ", params, "%%intno must have higher priority " \
    113113                                                                                        "than TMIN_INTPRI in %apiname")
    114       end
    115     end
    116   end
    117 
    118   #     カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIより
    119   #     も小さい値が指定された場合(E_OBJ)[NGKI2984]
    120   if !$INTNO_FIX_KERNEL.nil?
    121     if !$INTNO_FIX_KERNEL.index(params[:intno]).nil?
    122       if params[:intpri] < $TMIN_INTPRI
    123         error_ercd("E_OBJ", params, "%%intno must have lower or equal " \
     114    end
     115  end
     116
     117  # カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIより
     118  # も小さい値が指定された場合(E_OBJ)[NGKI2984]
     119  if defined?($INTNO_FIX_KERNEL) \
     120                                && $INTNO_FIX_KERNEL.include?(params[:intno])
     121    if params[:intpri] < $TMIN_INTPRI
     122      error_ercd("E_OBJ", params, "%%intno must have lower or equal " \
    124123                                                                        "priority to TMIN_INTPRI in %apiname")
    125       end
    126     end
     124    end
     125  end
     126
     127  # ターゲット依存のエラーチェック[NGKI2985]
     128  if defined? TargetCheckCfgInt()
     129    TargetCheckCfgInt(params)
    127130  end
    128131end
     
    131134#  割込みハンドラに関するエラーチェック
    132135#
    133 $cfgData[:DEF_INH].each do |key, params|
    134   # inhnoが割込みハンドラ番号として正しくない場合(E_PAR)[NGKI3055]
    135   if $INHNO_VALID.index(params[:inhno]).nil?
     136$cfgData[:DEF_INH].each do |_, params|
     137  # inhnoが有効範囲外の場合(E_PAR)[NGKI3055]
     138  if !$INHNO_VALID.include?(params[:inhno])
    136139    error_illegal("E_PAR", params, :inhno)
    137140  end
    138141
    139   # inhatrが無効の場合(E_RSATR)[NGKI3052]
     142  # inhatrが無効の場合(E_RSATR)[NGKI3052][NGKI2957][NGKI2959]
    140143  #(TARGET_INHATR以外のビットがセットされている場合)
    141144  if (params[:inhatr] & ~($TARGET_INHATR)) != 0
     
    143146  end
    144147
    145   #     カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが
    146   #     指定されていない場合(E_RSATR)[NGKI3067]
    147   if !$INHNO_FIX_NONKERNEL.nil?
    148     if !$INHNO_FIX_NONKERNEL.index(params[:inhno]).nil?
    149       if (params[:inhatr] & $TA_NONKERNEL) == 0
    150         error_ercd("E_RSATR", params, "%%inhno must be " \
     148  # カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが
     149  # 指定されていない場合(E_RSATR)[NGKI3067]
     150  if defined?($INHNO_FIX_NONKERNEL) \
     151                                && $INHNO_FIX_NONKERNEL.include?(params[:inhno])
     152    if (params[:inhatr] & $TA_NONKERNEL) == 0
     153      error_ercd("E_RSATR", params, "%%inhno must be " \
    151154                                                                "non-kernel interrupt in %apiname")
    152       end
    153     end
    154   end
    155 
    156   #     カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
    157   #     定されている場合(E_RSATR)[NGKI3068]
    158   if !$INHNO_FIX_KERNEL.nil?
    159     if !$INHNO_FIX_KERNEL.index(params[:inhno]).nil?
    160       if (params[:inhatr] & $TA_NONKERNEL) != 0
    161         error_ercd("E_RSATR", params, "%%inhno must not be " \
     155    end
     156  end
     157
     158  # カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
     159  # 定されている場合(E_RSATR)[NGKI3068]
     160  if defined?($INHNO_FIX_KERNEL) \
     161                                && $INHNO_FIX_KERNEL.include?(params[:inhno])
     162    if (params[:inhatr] & $TA_NONKERNEL) != 0
     163      error_ercd("E_RSATR", params, "%%inhno must not be " \
    162164                                                                "non-kernel interrupt in %apiname")
    163       end
    164     end
    165   end
    166 
    167   if $toIntnoVal.has_key?(params[:inhno].val)
     165    end
     166  end
     167
     168  if $INHNO_CREISR_VALID.include?(params[:inhno])
     169    # 割込みハンドラ番号に対応する割込み番号がある場合
    168170    intnoVal = $toIntnoVal[params[:inhno].val]
    169171
     
    174176    else
    175177      intnoParams = $cfgData[:CFG_INT][intnoVal]
     178
    176179      if (params[:inhatr] & $TA_NONKERNEL) == 0
    177180        # inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintno
     
    193196    end
    194197  end
     198
     199  # ターゲット依存のエラーチェック[NGKI3078]
     200  if defined? TargetCheckDefInh()
     201    TargetCheckDefInh(params)
     202  end
    195203end
    196204
     
    198206#  割込みサービスルーチン(ISR)に関するエラーチェック
    199207#
    200 $cfgData[:CRE_ISR].sort.each do |key, params|
    201   #     isratrが無効の場合(E_RSATR)[NGKI2998
     208$cfgData[:CRE_ISR].sort.each do |_, params|
     209  # isratrが無効の場合(E_RSATR)[NGKI2998][NGKI2952][NGKI5176
    202210  #(TARGET_ISRATR以外のビットがセットされている場合)
    203211  if (params[:isratr] & ~($TARGET_ISRATR)) != 0
     
    205213  end
    206214
    207   #     intnoがCRE_ISRに対する割込み番号として正しくない場合(E_PAR)
    208   #     [NGKI3003]
    209   if $INTNO_CREISR_VALID.index(params[:intno]).nil?
     215  # intnoが有効範囲外の場合(E_PAR)[NGKI3003]
     216  if !$INTNO_CREISR_VALID.include?(params[:intno])
    210217    error_illegal("E_PAR", params, "intno")
    211218  end
    212219
    213   #     (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
    214   #     [NGKI3005]
     220  # isrpriが有効範囲外の場合(E_PAR)[NGKI3005]
     221  #(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRIでない場合)
    215222  if !($TMIN_ISRPRI <= params[:isrpri] && params[:isrpri] <= $TMAX_ISRPRI)
    216223    error_illegal("E_PAR", params, "isrpri")
    217224  end
    218 end
    219 
    220 $INTNO_CREISR_VALID.each do |intnoVal|
    221   # 割込み番号intnoに対して登録されたISRのリストの作成
    222   isrParamsList = []
    223   $cfgData[:CRE_ISR].sort.each do |key, params|
    224     if params[:intno] == intnoVal
    225       isrParamsList.push(params)
    226     end
    227   end
    228 
    229   #     割込み番号intnoに対して登録されたISRが存在する場合
    230   if isrParamsList.size > 0
    231     inhnoVal = $toInhnoVal[intnoVal]
    232 
    233     # intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
    234     if $cfgData[:DEF_INH].has_key?(inhnoVal)
    235       inhnoParams = $cfgData[:DEF_INH][inhnoVal]
    236       error_ercd("E_OBJ", isrParamsList[0], "%%intno in %apiname " \
    237                                         "is duplicated with inhno #{inhnoParams[:inhno]}")
    238     end
    239 
    240     # intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
    241     if !$cfgData[:CFG_INT].has_key?(intnoVal)
    242       error_ercd("E_OBJ", isrParamsList[0], "%%intno in %apiname " \
     225
     226  # intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
     227  inhnoVal = $toInhnoVal[params[:intno].val]
     228  if $cfgData[:DEF_INH].has_key?(inhnoVal)
     229    error_ercd("E_OBJ", params, "%%intno in %apiname is duplicated " \
     230                                        "with inhno #{$cfgData[:DEF_INH][inhnoVal][:inhno]}")
     231  end
     232
     233  # intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
     234  if !$cfgData[:CFG_INT].has_key?(params[:intno])
     235    error_ercd("E_OBJ", params, "%%intno in %apiname " \
    243236                                                                        "is not configured with CFG_INT")
    244     else
    245       intnoParams = $cfgData[:CFG_INT][intnoVal]
    246 
    247       # intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRIよりも
    248       # 小さい場合(E_OBJ)[NGKI3014]
    249       if intnoParams[:intpri] < $TMIN_INTPRI
    250         error_ercd("E_OBJ", isrParamsList[0],
    251                                                 "intpri `#{intnoParams[:intpri]}' configured for " \
    252                                                 "%%intno with CFG_INT in higher than TMIN_INTPRI")
    253       end
    254     end
     237  else
     238    intnoParams = $cfgData[:CFG_INT][params[:intno]]
     239
     240    # intnoでカーネル管理外の割込みを指定した場合(E_OBJ)[NGKI3014]
     241    #(intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRIよりも小
     242    #  さい場合)
     243    if intnoParams[:intpri] < $TMIN_INTPRI
     244      error_ercd("E_OBJ", params,
     245                                        "intpri `#{intnoParams[:intpri]}' configured for " \
     246                                        "%%intno with CFG_INT in higher than TMIN_INTPRI")
     247    end
     248  end
     249
     250  # ターゲット依存のエラーチェック
     251  if defined? TargetCheckCreIsr()
     252    TargetCheckCreIsr(params)
    255253  end
    256254end
     
    298296  inhnoVal = $toInhnoVal[intnoVal]
    299297
    300   # 次のDEF_INHに相当するデータを生成
     298  # 次の静的APIに相当するデータを生成
    301299  # DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
    302300  $cfgData[:DEF_INH][inhnoVal] = {
     
    306304  }
    307305
    308   # 割込みサービスルーチン用の割込みハンドラ
     306  # 割込みサービスルーチンを呼び出す割込みハンドラの生成[NGKI2941]
    309307  $kernelCfgC.add("void")
    310308  $kernelCfgC.add("_kernel_inthdr_#{intnoVal}(void)")
     
    335333
    336334# 割込みサービスルーチン生成順序テーブルの生成
    337 $kernelCfgC.add("const ID _kernel_isrorder_table[TNUM_SISRID] = { ")
    338 $kernelCfgC.append("\t")
    339 $cfgData[:CRE_ISR].each_with_index do |(key, params), index|
    340   $kernelCfgC.append(", ") if index > 0
    341   $kernelCfgC.append("#{params[:isrid]}")
    342 end
    343 $kernelCfgC.add
    344 $kernelCfgC.add2("};")
     335if $cfgData[:CRE_ISR].size != 0
     336  $kernelCfgC.add("const ID _kernel_isrorder_table[TNUM_SISRID] = { ")
     337  $kernelCfgC.append("\t")
     338  $cfgData[:CRE_ISR].each_with_index do |(_, params), index|
     339    $kernelCfgC.append(", ") if index > 0
     340    $kernelCfgC.append("#{params[:isrid]}")
     341  end
     342  $kernelCfgC.add
     343  $kernelCfgC.add2("};")
     344else
     345  $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const ID, " \
     346                                                                                "_kernel_isrorder_table);")
     347end
    345348
    346349#
     
    360363    #  割込みハンドラのエントリ
    361364    #
    362     $cfgData[:DEF_INH].each do |key, params|
     365    $cfgData[:DEF_INH].each do |_, params|
    363366      if (params[:inhatr] & $TA_NONKERNEL) == 0
    364367        $kernelCfgC.add("INTHDR_ENTRY(#{params[:inhno]}, " \
     
    372375    #
    373376    $kernelCfgC.add("const INHINIB _kernel_inhinib_table[TNUM_DEF_INHNO] = {")
    374     $cfgData[:DEF_INH].each_with_index do |(key, params), index|
     377    $cfgData[:DEF_INH].each_with_index do |(_, params), index|
    375378      $kernelCfgC.add(",") if index > 0
    376379      if (params[:inhatr] & $TA_NONKERNEL) == 0
     
    407410  if $cfgData[:CFG_INT].size != 0
    408411    $kernelCfgC.add("const INTINIB _kernel_intinib_table[TNUM_CFG_INTNO] = {")
    409     $cfgData[:CFG_INT].each_with_index do |(key, params), index|
     412    $cfgData[:CFG_INT].each_with_index do |(_, params), index|
    410413      $kernelCfgC.add(",") if index > 0
    411414      $kernelCfgC.append("\t{ (#{params[:intno]}), (#{params[:intatr]}), " \
Note: See TracChangeset for help on using the changeset viewer.