Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/kernel/interrupt.trb
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/kernel/interrupt.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: interrupt.trb 1167 2019-02-03 17:06:17Z ertl-hiro $ 41 41 # 42 42 … … 54 54 # フォルト定義 55 55 # 56 if $INTNO_CREISR_VALID.nil?56 if !defined?($INTNO_CREISR_VALID) 57 57 $INTNO_CREISR_VALID = $INTNO_VALID 58 58 end 59 if $INHNO_CREISR_VALID.nil?59 if !defined?($INHNO_CREISR_VALID) 60 60 $INHNO_CREISR_VALID = $INHNO_VALID 61 61 end … … 64 64 # CFG_INTで使用できる割込み優先度のデフォルト定義 65 65 # 66 if $INTPRI_CFGINT_VALID.nil?66 if !defined?($INTPRI_CFGINT_VALID) 67 67 $INTPRI_CFGINT_VALID = $TMIN_INTPRI.upto($TMAX_INTPRI).to_a 68 68 end … … 87 87 # 割込み要求ラインに関するエラーチェック 88 88 # 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]) 92 92 error_illegal("E_PAR", params, :intno) 93 93 end 94 94 95 # intatrが無効の場合(E_RSATR)[NGKI2969]95 # intatrが無効の場合(E_RSATR)[NGKI2969][NGKI2944][NGKI2945] 96 96 #(TA_ENAINT,TA_EDGE,TARGET_INTATR以外のビットがセットされている場合) 97 97 if (params[:intatr] & ~($TA_ENAINT|$TA_EDGE|$TARGET_INTATR)) != 0 … … 99 99 end 100 100 101 # 102 # 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 112 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 " \ 113 113 "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 " \ 124 123 "priority to TMIN_INTPRI in %apiname") 125 end 126 end 124 end 125 end 126 127 # ターゲット依存のエラーチェック[NGKI2985] 128 if defined? TargetCheckCfgInt() 129 TargetCheckCfgInt(params) 127 130 end 128 131 end … … 131 134 # 割込みハンドラに関するエラーチェック 132 135 # 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]) 136 139 error_illegal("E_PAR", params, :inhno) 137 140 end 138 141 139 # inhatrが無効の場合(E_RSATR)[NGKI3052] 142 # inhatrが無効の場合(E_RSATR)[NGKI3052][NGKI2957][NGKI2959] 140 143 #(TARGET_INHATR以外のビットがセットされている場合) 141 144 if (params[:inhatr] & ~($TARGET_INHATR)) != 0 … … 143 146 end 144 147 145 # 146 # 147 if !$INHNO_FIX_NONKERNEL.nil?148 if !$INHNO_FIX_NONKERNEL.index(params[:inhno]).nil? 149 150 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 " \ 151 154 "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 " \ 162 164 "non-kernel interrupt in %apiname") 163 164 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 # 割込みハンドラ番号に対応する割込み番号がある場合 168 170 intnoVal = $toIntnoVal[params[:inhno].val] 169 171 … … 174 176 else 175 177 intnoParams = $cfgData[:CFG_INT][intnoVal] 178 176 179 if (params[:inhatr] & $TA_NONKERNEL) == 0 177 180 # inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintno … … 193 196 end 194 197 end 198 199 # ターゲット依存のエラーチェック[NGKI3078] 200 if defined? TargetCheckDefInh() 201 TargetCheckDefInh(params) 202 end 195 203 end 196 204 … … 198 206 # 割込みサービスルーチン(ISR)に関するエラーチェック 199 207 # 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] 202 210 #(TARGET_ISRATR以外のビットがセットされている場合) 203 211 if (params[:isratr] & ~($TARGET_ISRATR)) != 0 … … 205 213 end 206 214 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]) 210 217 error_illegal("E_PAR", params, "intno") 211 218 end 212 219 213 # (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)214 # [NGKI3005]220 # isrpriが有効範囲外の場合(E_PAR)[NGKI3005] 221 #(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRIでない場合) 215 222 if !($TMIN_ISRPRI <= params[:isrpri] && params[:isrpri] <= $TMAX_ISRPRI) 216 223 error_illegal("E_PAR", params, "isrpri") 217 224 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 " \ 243 236 "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) 255 253 end 256 254 end … … 298 296 inhnoVal = $toInhnoVal[intnoVal] 299 297 300 # 次の DEF_INHに相当するデータを生成298 # 次の静的APIに相当するデータを生成 301 299 # DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } ); 302 300 $cfgData[:DEF_INH][inhnoVal] = { … … 306 304 } 307 305 308 # 割込みサービスルーチン 用の割込みハンドラ306 # 割込みサービスルーチンを呼び出す割込みハンドラの生成[NGKI2941] 309 307 $kernelCfgC.add("void") 310 308 $kernelCfgC.add("_kernel_inthdr_#{intnoVal}(void)") … … 335 333 336 334 # 割込みサービスルーチン生成順序テーブルの生成 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("};") 335 if $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("};") 344 else 345 $kernelCfgC.add2("TOPPERS_EMPTY_LABEL(const ID, " \ 346 "_kernel_isrorder_table);") 347 end 345 348 346 349 # … … 360 363 # 割込みハンドラのエントリ 361 364 # 362 $cfgData[:DEF_INH].each do | key, params|365 $cfgData[:DEF_INH].each do |_, params| 363 366 if (params[:inhatr] & $TA_NONKERNEL) == 0 364 367 $kernelCfgC.add("INTHDR_ENTRY(#{params[:inhno]}, " \ … … 372 375 # 373 376 $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| 375 378 $kernelCfgC.add(",") if index > 0 376 379 if (params[:inhatr] & $TA_NONKERNEL) == 0 … … 407 410 if $cfgData[:CFG_INT].size != 0 408 411 $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| 410 413 $kernelCfgC.add(",") if index > 0 411 414 $kernelCfgC.append("\t{ (#{params[:intno]}), (#{params[:intatr]}), " \
Note:
See TracChangeset
for help on using the changeset viewer.