Changeset 95 for ssp_qb_r5f100le_cs/trunk/kernel/kernel.tf
- Timestamp:
- Jun 2, 2015, 3:39:53 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ssp_qb_r5f100le_cs/trunk/kernel/kernel.tf
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 10 10 $ Nagoya Municipal Industrial Research Institute, JAPAN 11 11 $ 12 $ ãLì ÒÍCÈºÌ (1)`(4) Ìðð½·êÉÀèC{\tgEF 13 $ Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»EüÏE 14 $ ÄzziȺCpÆÄÔj·é±Æð³Åø·éD 15 $ (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 16 $ \¦C±Ìpð¨æѺL̳ÛØKèªC»ÌÜÜÌ`Å\[X 17 $ R[hÉÜÜêÄ¢é±ÆD 18 $ (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉgp 19 $ Å«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 20 gipÒ} 21 $ j 22 AÈÇjÉCãLÌì \¦C±Ìpð¨æѺLÌ³Û 23 $ ØKèðfÚ·é±ÆD 24 $ (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉgp 25 $ Å«È¢`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·±ÆD 26 $ (a) Äzzɺ¤hL 27 gipÒ}j 28 AÈÇjÉCãLÌì 29 $ \¦C±Ìpð¨æѺL̳ÛØKèðfÚ·é±ÆD 30 $ (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉñ 31 $ ·é±ÆD 32 $ (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹Q 33 $ ©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆDܽC 34 $ {\tgEFAÌ[UܽÍGh[U©çÌ¢©ÈéRÉîà 35 $ ¿©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 36 $ 37 $ {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨æ 38 $ ÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚIÉη 39 $ éK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEFAÌp 40 $ Éæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»ÌÓCð 41 $ íÈ¢D 12 $ 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ 13 $ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・ 14 $ 再配布(以下,利用と呼ぶ)することを無償で許諾する. 15 $ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権 16 $ 表示,この利用条件および下記の無保証規定が,そのままの形でソース 17 $ コード中に含まれていること. 18 $ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用 19 $ できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ 20 $ ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保 21 $ 証規定を掲載すること. 22 $ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用 23 $ できない形で再配布する場合には,次のいずれかの条件を満たすこと. 24 $ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作 25 $ 権表示,この利用条件および下記の無保証規定を掲載すること. 26 $ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報 27 $ 告すること. 28 $ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害 29 $ からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また, 30 $ 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ 31 $ く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 32 $ 33 $ 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ 34 $ びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す 35 $ る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用 36 $ により直接的または間接的に生じたいかなる損害に関しても,その責任を負 37 $ わない. 42 38 $ 43 39 $ ====================================================================== 44 40 45 $ OoÍ46 $ wèµ½¾¯sªÉ^uð¯Ä\¦·éD47 $ R[hyÑoÍÌÂÇ«ð°é½ßÉg¤D48 $ ø : ARGV[1] : sªÉ}ü·é^uÌ49 $ Ôl : ó¶ñ50 $ Ó : RESULTðìµÄ¢é½ßC¼ÌÖÌoÍðÛ¶·éOÉÄÑo·Æ㫳êéD41 $ ログ出力 42 $ 指定した数だけ行頭にタブをつけて表示する. 43 $ コード及び出力の可読性を挙げるために使う. 44 $ 引数 : ARGV[1] : 行頭に挿入するタブの数 45 $ 返値 : 空文字列 46 $ 注意 : RESULTを操作しているため,他の関数の出力を保存する前に呼び出すと上書きされる. 51 47 $ 52 48 $FUNCTION LOG$ … … 56 52 57 53 $ ===================================================================== 58 $ OÌ`FbN54 $ 処理前のチェック 59 55 $ ===================================================================== 60 56 61 $ ^XNª1ÂÈã¶Ý·é±ÆÌ`FbN57 $ タスクが1個以上存在することのチェック 62 58 $IF !LENGTH(TSK.ID_LIST)$ 63 59 $ERROR$$FORMAT("no task is registered")$$END$ … … 65 61 66 62 $ ===================================================================== 67 $ kernel_cfg.h ̶¬63 $ kernel_cfg.h の生成 68 64 $ ===================================================================== 69 65 … … 81 77 $NL$ 82 78 83 $ // ^XNIDðN®Dæx(tskapri)Ì¢É reallocate_tskapri ÖèÄC84 $ // è`ð kernel_cfg.h ÖoÍ·éD79 $ // タスクIDを起動優先度(tskapri)の高い順に reallocate_tskapri へ割り当て, 80 $ // 定義を kernel_cfg.h へ出力する. 85 81 $tsk_apriorder_list={}$ 86 82 $tsk_epri_list={}$ … … 91 87 #define $TSK.TSKID[id]$ $tsk_index$$NL$ 92 88 93 $ DEF_EPR Åè`³êĢȢ^XNÌÀsDæxªCN®DæxƯ¶ÉÈéæ¤É·éD89 $ DEF_EPR で定義されていないタスクの実行時優先度が,起動優先度と同じになるようにする. 94 90 $tsk_epri_list = APPEND(tsk_epri_list, ALT(TSK.EXEPRI[TSK.TSKID[id]], TSK.ATSKPRI[TSK.TSKID[id]]))$ 95 91 $tsk_index = tsk_index + 1$ … … 111 107 112 108 $ ===================================================================== 113 $ kernel_cfg.c ̶¬109 $ kernel_cfg.cの生成 114 110 $ ===================================================================== 115 111 … … 126 122 127 123 $ --------------------------------------------------------------------- 128 $ CN[hfBNeBui#includej124 $ インクルードディレクティブ(#include) 129 125 $ --------------------------------------------------------------------- 130 126 /*$NL$ … … 136 132 137 133 $ --------------------------------------------------------------------- 138 $ IuWFNgÌIDÔðÛ·éÏ134 $ オブジェクトのID番号を保持する変数 139 135 $ --------------------------------------------------------------------- 140 136 $IF USE_EXTERNAL_ID$ … … 161 157 162 158 $ --------------------------------------------------------------------- 163 $ g[XO}NÌftHgè`159 $ トレースログマクロのデフォルト定義 164 160 $ --------------------------------------------------------------------- 165 161 /*$NL$ … … 178 174 179 175 $ --------------------------------------------------------------------- 180 $ ^XNÉÖ·éoÍ 181 $ --------------------------------------------------------------------- 182 183 $ 184 $ ÀsDæxÌRtBM 185 [Vɬ÷µ½©Ç¤© 186 $ 187 $ DEF_EPR ÉG[ª¶µ½êC±ÌϪ0ÉÈéD 188 $ DEF_EPR ÉG[ª¶µ½©Ç¤©ð»fµÄ 189 $ ÁèÌÀsðubN·é½ßÉgp·éD 176 $ タスクに関する出力 177 $ --------------------------------------------------------------------- 178 179 $ 180 $ 実行時優先度のコンフィギュレーションに成功したかどうか 181 $ 182 $ DEF_EPR 処理中にエラーが発生した場合,この変数が0になる. 183 $ DEF_EPR 処理中にエラーが発生したかどうかを判断して 184 $ 特定処理の実行をブロックするために使用する. 190 185 $ 191 186 $configurated_defepr_successfully = 1$ … … 196 191 $NL$ 197 192 198 $ ^XNIDÔÌÅål193 $ タスクID番号の最大値 199 194 const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);$NL$ 200 195 $NL$ 201 196 202 $ ready_primap Ìúl197 $ ready_primap の初期値 203 198 $init_rdypmap = 0$ 204 199 $tsk_index = 1$ 205 200 206 $ ^XN®«D201 $ タスク属性. 207 202 const ATR _kernel_tinib_tskatr[TNUM_TSKID] = { 208 203 $JOINEACH tskid tsk_apriorder_list ","$ 209 $ // TA_ACT , TA_RSTR Ü½Í TA_NULL Å éiE_RSATRj204 $ // TA_ACT , TA_RSTR または TA_NULL である(E_RSATR) 210 205 $IF (TSK.TSKATR[tskid] & ~(TA_ACT | TA_RSTR | ALT(TARGET_TSKATR,0))) != 0$ 211 206 $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$ … … 223 218 const uint_t$TAB$_kernel_init_rdypmap = $init_rdypmap$U;$NL$ 224 219 225 $ g£îñ(exinf)D G[ÍRpCܽÍAvÌeXgÅo·é½ßC±±Å͵ȢD220 $ 拡張情報(exinf). エラーはコンパイル時またはアプリのテストで検出するため,ここではしない. 226 221 const intptr_t _kernel_tinib_exinf[TNUM_TSKID] = { 227 222 $JOINEACH tskid tsk_apriorder_list ","$ … … 230 225 };$NL$ 231 226 232 $ N®Ôn(task)DG[ÍRpCܽÍAvÌeXgÅo·é½ßC±±Å͵ȢD227 $ 起動番地(task).エラーはコンパイル時またはアプリのテストで検出するため,ここではしない. 233 228 const TASK _kernel_tinib_task[TNUM_TSKID] = { 234 229 $JOINEACH tskid tsk_apriorder_list ","$ … … 237 232 };$NL$ 238 233 239 $ N®Dæx(atskpri)D234 $ 起動優先度(atskpri). 240 235 $FOREACH tskid tsk_apriorder_list$ 241 $ // atskpri Í TMIN_TPRI ÈãCTMAX_TPRI ȺŠéDiE_PARj236 $ // atskpri は TMIN_TPRI 以上,TMAX_TPRI 以下である.(E_PAR) 242 237 $IF !(TMIN_TPRI <= TSK.ATSKPRI[tskid] && TSK.ATSKPRI[tskid] <= TMAX_TPRI)$ 243 238 $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "atskpri", TSK.ATSKPRI[tskid], tskid, "CRE_TSK")$$END$ 244 239 $END$ 245 240 246 $ // atskpri Íd¡ªÈ¢DiE_PARj241 $ // atskpri は重複がない.(E_PAR) 247 242 $FOREACH tskid2 tsk_apriorder_list$ 248 243 $IF tskid != tskid2 && TSK.ATSKPRI[tskid] == TSK.ATSKPRI[tskid2] $ … … 252 247 $END$ 253 248 254 $ ÀsDæx(exepri)D249 $ 実行時優先度(exepri). 255 250 const uint_t _kernel_tinib_epriority[TNUM_TSKID] = { 256 251 $epri_allocated = 0$ … … 259 254 $epri = AT(tsk_epri_list, tsk_index)$ 260 255 261 $ // exepri Í TMIN_TPRI Èã©Â TMAX_TPRI ȺŠéD(E_PAR)256 $ // exepri は TMIN_TPRI 以上かつ TMAX_TPRI 以下である.(E_PAR) 262 257 $IF TMIN_TPRI > epri || TMAX_TPRI < epri$ 263 258 $configurated_defepr_successfully = 0$ … … 265 260 $END$ 266 261 267 $ // exepri Í atskpri ȺÌlðàÂ(DæxƵÄͯ¶©»êæè¢)D(E_ILUSE)262 $ // exepri は atskpri 以下の値をもつ(優先度としては同じかそれより高い).(E_ILUSE) 268 263 $IF epri <= TMAX_TPRI && epri > TSK.ATSKPRI[tskid]$ 269 264 $configurated_defepr_successfully = 0$ … … 271 266 $END$ 272 267 273 $ // exepri Ìà\»ðèµ reallocate_tskepri Éi[D268 $ // exepri の内部表現を決定し reallocate_tskepri に格納. 274 269 $FOREACH tskid2 tsk_apriorder_list $ 275 270 $IF epri_allocated != 1 && epri <= TSK.ATSKPRI[tskid2]$ … … 285 280 286 281 $ 287 $ // DæxèÄÊðoÍ282 $ // 優先度割り当て結果を出力 288 283 $ 289 284 /*$NL$ … … 295 290 296 291 $ 297 $ ^XNÌÅåX^bNgpÊÌvZ298 $ 299 300 $ X^bNTCYÉÖ·éG[`FbN292 $ タスクの最大スタック使用量の計算 293 $ 294 295 $ スタックサイズに関するエラーチェック 301 296 $FOREACH tskid TSK.ID_LIST$ 302 $ // stksz ª0©C^[Qbgè`ÌŬliTARGET_MIN_STKSZjæèଳ¢êiE_PARj297 $ // stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場合(E_PAR) 303 298 $IF TSK.STKSZ[tskid] == 0 || (LENGTH(TARGET_MIN_STKSZ) && 304 299 TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$ … … 308 303 309 304 $ 310 $ Öè`311 $ 312 $ 313 $ Ö1: N®DæxÌá¢É\[eBO·é½ßÌärÖ305 $ 関数定義 306 $ 307 $ 308 $ 関数1: 起動時優先度の低い順にソーティングするための比較関数 314 309 $ 315 310 $FUNCTION compare_tskapri_rev$ … … 318 313 319 314 $ 320 $ Ö2: wèµ½^XNÉηéX^bNgpÊÌÅåðvZ·éÖ321 $ ø : ARGV[1] : ^XNID(à\», N®DæxÌà\»Éµ¢)322 $ Ôl : RESULT : Y^XNÉηéX^bNgpÊÌÅålD323 $ ±ÌlÍCY^XNÌÀsJn©çI¹ÜÅÌÔÉ324 $ »Ì^XNÉηévGvgðl¶µÄX^bNgpÊð325 $ vZµ½êÉCÂ\«Ì égÝí¹ÌÅÅåÆÈélðÔ·D315 $ 関数2: 指定したタスクに対するスタック使用量の最大を計算する関数 316 $ 引数 : ARGV[1] : タスクID(内部表現, 起動時優先度の内部表現に等しい) 317 $ 返値 : RESULT : 当該タスクに対するスタック使用量の最大値. 318 $ この値は,当該タスクの実行開始から終了までの間に 319 $ そのタスクに対するプリエンプトを考慮してスタック使用量を 320 $ 計算した場合に,可能性のある組み合わせの中で最大となる値を返す. 326 321 $ 327 322 $nest_level = 0$ 328 323 $ 329 324 $FUNCTION calc_stksz$ 330 $ // ÏXg325 $ // 変数リスト 331 326 $nest_level = nest_level + 1$ 332 327 $arg[nest_level] = ARGV[1]$ 333 328 $calculated_stack_size = 0$ 334 329 335 $ // Jn330 $ // 処理開始 336 331 $SPC$* $LOG(nest_level-1)$Calculation start (Task ID = $arg[nest_level]$, StackSize[$arg[nest_level]$]=$TSK.STKSZ[arg[nest_level]]$)$NL$ 337 332 338 $ // wèµ½^XNID ÌX^bNvZª®¹µÄ¢é©333 $ // 指定したタスクID のスタック計算が完了しているか 339 334 $IF LENGTH(done[arg[nest_level]]) == 0$ 340 335 341 336 $SPC$* $LOG(nest_level)$Task list with higher priority than $arg[nest_level]$ = $higher_pri_tsklist[arg[nest_level]]$$NL$ 342 337 343 $ // (1) ®¹µÄ¢È¢ê344 $ // ÏÌú»338 $ // (1) 完了していない場合 339 $ // 変数の初期化 345 340 $max_stksz[arg[nest_level]] = 0$ 346 341 $higher_pri_maxstksz[arg[nest_level]] = 0$ 347 342 348 $ // Y^XNID ÌÀsDæxæè¢N®DæxðÂ^XNª¶Ý·éê343 $ // 当該タスクID の実行時優先度より高い起動優先度を持つタスクが存在する場合 349 344 $IF LENGTH(higher_pri_tsklist[arg[nest_level]]) > 0$ 350 $ // »ê¼êÌDæx^XNÉε345 $ // それぞれの高優先度タスクに対し 351 346 $FOREACH id higher_pri_tsklist[arg[nest_level]]$ 352 $ // ÄAÄo·éÆϪ㫳êé½ßCÛ¶µÄ¨347 $ // 再帰呼出すると変数が上書きされるため,保存しておく 353 348 $id_saved[nest_level] = id$ 354 $ // X^bNvZðÀs·é349 $ // スタック計算を実行する 355 350 $calculated_stack_size = calc_stksz(id_saved[nest_level])$ 356 $ // Û¶µ½ÏðA351 $ // 保存した変数を復帰 357 352 $id = id_saved[nest_level]$ 358 353 359 354 $IF higher_pri_maxstksz[arg[nest_level]] < calculated_stack_size$ 360 $ // L¯µÄ¨355 $ // 記憶しておく 361 356 $higher_pri_maxstksz[arg[nest_level]] = calculated_stack_size$ 362 357 $END$ … … 366 361 $SPC$* $LOG(nest_level)$higher_pri_maxstksz[$arg[nest_level]$] = $higher_pri_maxstksz[arg[nest_level]]$$NL$ 367 362 368 $ // Dæx^XNÌX^bNgpÊÉCY^XNÌgpÊðÁZ·é363 $ // 高優先度タスクのスタック使用量に,当該タスクの使用量を加算する 369 364 $max_stksz[arg[nest_level]] = higher_pri_maxstksz[arg[nest_level]] + TSK.STKSZ[arg[nest_level]]$ 370 365 371 366 $SPC$* $LOG(nest_level)$DONE(max_stksz[$arg[nest_level]$] = $max_stksz[arg[nest_level]]$)$NL$ 372 367 373 $ // Y^XNIDÉεÄÍvZðÏܹ½Æ¢¤L^ðcµÄ¨368 $ // 当該タスクIDに対しては計算を済ませたという記録を残しておく 374 369 $done[arg[nest_level]] = 1$ 375 370 376 371 $ELSE$ 377 $ // (2) vZªùÉ®¹µÄ¢éêCvZðXLbv·éD372 $ // (2) 計算が既に完了している場合,計算をスキップする. 378 373 379 374 $SPC$* $LOG(nest_level)$SKIP(max_stksz[$arg[nest_level]$] = $max_stksz[arg[nest_level]]$)$NL$ 380 375 $END$ 381 376 382 $ // ©ÏàèÌÅålðÔ·377 $ // 見積もりの最大値を返す 383 378 $RESULT = max_stksz[arg[nest_level]]$ 384 379 $nest_level = nest_level - 1$ … … 386 381 387 382 $ 388 $ Öè`±±ÜÅC±±©çX^bNvZÌJn389 $ 390 391 $ 392 $ ܸÍØ\¢Ìf[^\¢ì¬383 $ 関数定義ここまで,ここからスタック計算処理の開始 384 $ 385 386 $ 387 $ まずは木構造のデータ構造作成 393 388 $ 394 389 $FOREACH id LSORT(tsk_apriorder_list, "compare_tskapri_rev")$ 395 390 396 $ // e^XNÉC»ÌÀsDæxæèà¢N®DæxðÂ^XNÌXgðìéD397 $ // »êÍvGvg³êéÂ\«Ì é^XNÌêÆÈéD391 $ // 各タスク毎に,その実行時優先度よりも高い起動時優先度を持つタスクのリストを作る. 392 $ // それはプリエンプトされる可能性のあるタスクの一覧となる. 398 393 $FOREACH id2 LSORT(tsk_apriorder_list, "compare_tskapri_rev")$ 399 394 $IF reallocate_tskepri[id] > reallocate_tskapri[id2]$ … … 402 397 $END$ 403 398 404 $ // vGvg·éE³êéÖWð¦·Ø\¢Ìª(root)ÆÈé^XNÌTõD405 $ // ÎÛ^XN(id)ÌN®Dæx(reallocate_tskapri[id])æèá¢406 $ // ( lƵÄÍå«¢)N®DæxðàÂ^XNÌ higher_pri_tsklist ÉC407 $ // ÎÛ^XN(id) ªÜÜêȯêÎCªÆÈéD399 $ // プリエンプトする・される関係を示す木構造の根(root)となるタスクの探索. 400 $ // 対象タスク(id)の起動時優先度(reallocate_tskapri[id])より低い 401 $ // (値としては大きい)起動時優先度をもつタスクの higher_pri_tsklist に, 402 $ // 対象タスク(id) が含まれなければ,根となる. 408 403 $is_root = 1$ 409 404 $FOREACH id2 LSORT(tsk_apriorder_list, "compare_tskapri_rev")$ … … 414 409 $END$ 415 410 $END$ 416 $ // ª(root)ÆÈé^XNÈçÎCXgÖÇÁ411 $ // 根(root)となるタスクならば,リストへ追加 417 412 $IF is_root == 1$ 418 413 $root_apri = APPEND(root_apri, id)$ … … 421 416 422 417 $ 423 $ oÍJn418 $ 出力開始 424 419 $ 425 420 … … 428 423 $SPC$* $NL$ 429 424 430 $ // ªÆÈée^XNÉεÄC»ÌÅå^XNgpÊðvZµCXgÖÇÁ·éD425 $ // 根となる各タスクに対して,その最大タスク使用量を計算し,リストへ追加する. 431 426 $FOREACH root_id root_apri$ 432 427 $stksz_estimated = APPEND(stksz_estimated, calc_stksz(root_id))$ 433 428 $END$ 434 429 435 $ // ^XNÌX^bNgpÊÌÅålðè436 $ // XgÌvfÌÅålª^XNÌÅåX^bNgpÊÆÈéD430 $ // タスクのスタック使用量の最大値を決定 431 $ // リスト中の要素の最大値がタスクの最大スタック使用量となる. 437 432 $max_tsk_stksz = 0$ 438 433 $FOREACH size stksz_estimated$ … … 442 437 $END$ 443 438 444 $ // mF439 $ // 確認 445 440 $SPC$* List of Estimated Total Stack Sizes of Tasks = $stksz_estimated$$NL$ 446 441 $SPC$* Estimated Maximum Total Stack Size of Tasks = $max_tsk_stksz$$NL$ … … 449 444 450 445 451 $ SÄÌPÊÌX^bNͤL³êéD452 $ »Ì½ßCX^bNTCYÉÖ·é`FbNÍ453 $ ¤LX^bNÝèÌƱëÅÜÆßÄs¤D454 455 $ X^bNÌæªÔn(stk)D446 $ 全ての処理単位のスタックは共有される. 447 $ そのため,スタックサイズに関するチェックは 448 $ 共有スタック設定のところでまとめて行う. 449 450 $ スタックの先頭番地(stk). 456 451 $FOREACH tskid tsk_apriorder_list$ 457 $ // íÉ NULL Å éD(E_PAR)452 $ // 常に NULL である.(E_PAR) 458 453 $IF !EQ(TSK.STK[tskid], "NULL")$ 459 454 $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(("'%1%' of %2% must be NULL."), "stk", "CRE_TSK")$$END$ … … 462 457 463 458 $ --------------------------------------------------------------------- 464 $ CxgtO459 $ イベントフラグ 465 460 $ --------------------------------------------------------------------- 466 461 /*$NL$ … … 469 464 $NL$ 470 465 471 $ Ggª (UINT8_MAX - TMIN_FLGID)Âæè½¢êÍCG[Æ·é --> »_ÅÍRgAEg466 $ エントリが (UINT8_MAX - TMIN_FLGID)個より多い場合は,エラーとする --> 現時点ではコメントアウト 472 467 $ $IF LENGTH(ALM.ORDER_LIST) > (UINT8_MAX - TMIN_FLGID)$ 473 468 $ $ERROR$$FORMAT("The number of CRE_FLG must be equal to or less than (UINT8_MAX - TMIN_FLGID).")$$END$ 474 469 $ $END$ 475 470 476 $ CxgtOIDÔÌÅål471 $ イベントフラグID番号の最大値 477 472 const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1);$NL$ 478 473 $NL$ 479 474 480 $ // iflgptn ªFLGPTNÉi[Å«È¢êiE_PARj475 $ // iflgptnがFLGPTNに格納できない場合(E_PAR) 481 476 $FOREACH flgid FLG.ORDER_LIST$ 482 477 $IF (FLG.IFLGPTN[flgid] & ~((1 << TBIT_FLGPTN) - 1)) != 0$ … … 485 480 $END$ 486 481 487 $ CxgtOú»ubN̶¬482 $ イベントフラグ初期化ブロックの生成 488 483 $IF LENGTH(FLG.ID_LIST)$ 489 484 490 $ CxgtO®«485 $ イベントフラグ属性 491 486 const ATR _kernel_flginib_atr[TNUM_FLGID] = { 492 487 $JOINEACH flgid FLG.ORDER_LIST ","$ 493 $ // flgatr ªimTA_CLRnjÅÈ¢êiE_RSATRj488 $ // flgatrが([TA_CLR])でない場合(E_RSATR) 494 489 $IF (FLG.FLGATR[flgid] & ~(TA_CLR)) != 0$ 495 490 $ERROR FLG.TEXT_LINE[flgid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgatr", FLG.FLGATR[flgid], flgid, "CRE_FLG")$$END$ … … 499 494 };$NL$ 500 495 501 $ CxgtOp^[Ìúl496 $ イベントフラグパターンの初期値 502 497 const FLGPTN _kernel_flginib_iflgptn[TNUM_FLGID] = { 503 498 $JOINEACH flgid FLG.ORDER_LIST ","$ … … 506 501 };$NL$ 507 502 508 $ // CxgtOÌ»ÝÌtOp^[ði[·éÏ503 $ // イベントフラグの現在のフラグパターンを格納する変数 509 504 FLGPTN _kernel_flgcb_flgptn[TNUM_FLGID];$NL$ 510 505 $ELSE$ … … 516 511 517 512 $ --------------------------------------------------------------------- 518 $ f[^L 519 [ 513 $ データキュー 520 514 $ --------------------------------------------------------------------- 521 515 /*$NL$ … … 524 518 $NL$ 525 519 526 $ f[^L 527 [IDÔÌÅål 520 $ データキューID番号の最大値 528 521 const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1);$NL$ 529 522 $NL$ … … 531 524 $IF LENGTH(DTQ.ID_LIST)$ 532 525 $FOREACH dtqid DTQ.ORDER_LIST$ 533 $ // dtqatr ª TA_NULL ÅÈ¢êiE_RSATRj526 $ // dtqatrが TA_NULL でない場合(E_RSATR) 534 527 $IF (DTQ.DTQATR[dtqid] != TA_NULL) $ 535 528 $ERROR DTQ.TEXT_LINE[dtqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqatr", DTQ.DTQATR[dtqid], dtqid, "CRE_DTQ")$$END$ 536 529 $END$ 537 530 538 $ // dtqmb ªNULLÅÈ¢êiE_NOSPTj531 $ // dtqmbがNULLでない場合(E_NOSPT) 539 532 $IF !EQ(DTQ.DTQMB[dtqid], "NULL")$ 540 533 $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$ 541 534 $END$ 542 535 543 $ // dtqcnt ª0Å éê536 $ // dtqcntが0である場合 544 537 $IF EQ(+DTQ.DTQCNT[dtqid], 0)$ 545 538 $ERROR DTQ.TEXT_LINE[dtqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQCNT[dtqid], dtqid, "CRE_DTQ")$$END$ … … 547 540 548 541 549 $ // f[^L 550 [Ìæ 542 $ // データキュー領域 551 543 $IF DTQ.DTQCNT[dtqid]$ 552 544 static intptr_t _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$ … … 554 546 $END$ 555 547 556 $ // f[^L 557 [ú»ubN̶¬(®«) 548 $ // データキュー初期化ブロックの生成(属性) 558 549 const ATR _kernel_dtqinib_atr[TNUM_DTQID] = { 559 550 $JOINEACH dtqid DTQ.ORDER_LIST ",\n"$ … … 563 554 $NL$ 564 555 565 $ // f[^L 566 [ú»ubN̶¬(TCY) 556 $ // データキュー初期化ブロックの生成(サイズ) 567 557 const uint8_t _kernel_dtqinib_size[TNUM_DTQID] = { 568 558 $JOINEACH dtqid DTQ.ORDER_LIST ",\n"$ … … 572 562 $NL$ 573 563 574 $ // f[^L 575 [ú»ubN̶¬(ÇÌæ) 564 $ // データキュー初期化ブロックの生成(管理領域) 576 565 intptr_t * const _kernel_dtqinib_data[TNUM_DTQID] = { 577 566 $JOINEACH dtqid DTQ.ORDER_LIST ",\n"$ … … 581 570 $NL$ 582 571 583 $ // f[^L 584 [Rg[ubN 572 $ // データキューコントロールブロック 585 573 uint8_t _kernel_dtqcb_count[TNUM_DTQID];$NL$ 586 574 uint8_t _kernel_dtqcb_head[TNUM_DTQID];$NL$ … … 598 586 599 587 $ --------------------------------------------------------------------- 600 $ ÝÇ@\588 $ 割込み管理機能 601 589 $ --------------------------------------------------------------------- 602 590 /*$NL$ … … 605 593 $NL$ 606 594 607 $ // INTNO_ATTISR_VALID Ìvfªd¡µÄ¢È¢©Ç¤©Ì`FbN595 $ // INTNO_ATTISR_VALID の要素が重複していないかどうかのチェック 608 596 $i = 0$ 609 597 $FOREACH intno INTNO_ATTISR_VALID$ … … 618 606 $END$ 619 607 620 $ // INHNO_ATTISR_VALID Ìvfªd¡µÄ¢È¢©Ç¤©Ì`FbN608 $ // INHNO_ATTISR_VALID の要素が重複していないかどうかのチェック 621 609 $i = 0$ 622 610 $FOREACH intno INHNO_ATTISR_VALID$ … … 632 620 633 621 634 $ // ATT_ISR ÅgpÂ\ÈÝÔÆC»êÉηéÝnhÔ̪¯¶©Ç¤©635 $ // eXgÌvfÍd¡µÄ¢È¢±ÆðOñƵĢéD622 $ // ATT_ISR で使用可能な割込み番号と,それに対応する割込みハンドラ番号の数が同じかどうか 623 $ // 各リストの要素は重複していないことを前提としている. 636 624 $IF LENGTH(INTNO_ATTISR_VALID) != LENGTH(INHNO_ATTISR_VALID)$ 637 625 $ERROR$length of `INTNO_ATTISR_VALID' is different from length of `INHNO_ATTISR_VALID'$END$ … … 639 627 640 628 641 $ // ÝÔÆÝnhÔÌÏ·e[uÌì¬642 $ // ÝÔÌXgÆÝnhÔÌXgÍηévfª¯¶ÔÅ643 $ // »êéæ¤ÉÀ×çêÄ¢é±ÆðOñÆ·éD629 $ // 割込み番号と割込みハンドラ番号の変換テーブルの作成 630 $ // 割込み番号のリストと割込みハンドラ番号のリストは対応する要素が同じ順番で 631 $ // 現れるように並べられていることを前提とする. 644 632 $i = 0$ 645 633 $FOREACH intno INTNO_ATTISR_VALID$ 646 634 647 $ // INTNO_ATTISR_VALID ÉÜÜêélÍ INTNO_CFGINT_VALID ÉàÜÜêé׫ŠéD648 $ // INTNO_ATTISR_VALID Í INTNO_CFGINT_VALID ̪WÉÈé͸D635 $ // INTNO_ATTISR_VALID に含まれる値は INTNO_CFGINT_VALID にも含まれるべきである. 636 $ // INTNO_ATTISR_VALID は INTNO_CFGINT_VALID の部分集合になるはず. 649 637 $IF LENGTH(FIND(INTNO_CFGINT_VALID, intno)) == 0$ 650 638 $ERROR$all elements of `INTNO_ATTISR_VALID' must be included in `INTNO_CFGINT_VALID'$END$ … … 658 646 659 647 660 $ // INTNO_CFGINT_VALID Ìvfª INTNO_VALID ÉÜÜêé©Ç¤©Ì`FbN661 $ // INTNO_CFGINT_VALID Í INTNO_VALID ̪WÉÈé͸D648 $ // INTNO_CFGINT_VALID の要素が INTNO_VALID に含まれるかどうかのチェック 649 $ // INTNO_CFGINT_VALID は INTNO_VALID の部分集合になるはず. 662 650 $FOREACH intno INTNO_CFGINT_VALID$ 663 651 $IF LENGTH(FIND(INTNO_VALID, intno)) == 0$ … … 667 655 668 656 669 $ // INHNO_ATTISR_VALID Ìvfª INHNO_VALID ÉÜÜêé©Ç¤©Ì`FbN670 $ // INHNO_ATTISR_VALID Í INHNO_VALID ̪WÉÈé͸D657 $ // INHNO_ATTISR_VALID の要素が INHNO_VALID に含まれるかどうかのチェック 658 $ // INHNO_ATTISR_VALID は INHNO_VALID の部分集合になるはず. 671 659 $FOREACH inhno INHNO_ATTISR_VALID$ 672 660 $IF LENGTH(FIND(INHNO_VALID, inhno)) == 0$ … … 676 664 677 665 678 $ // ÝvCÉÖ·éG[`FbN666 $ // 割込み要求ラインに関するエラーチェック 679 667 $i = 0$ 680 668 $FOREACH intno INT.ORDER_LIST$ 681 $ // intno ªCFG_INTÉηéÝÔƵijµÈ¢êiE_PARj669 $ // intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR) 682 670 $IF !LENGTH(FIND(INTNO_CFGINT_VALID, INT.INTNO[intno]))$ 683 671 $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", INT.INTNO[intno], "CFG_INT")$$END$ 684 672 $END$ 685 673 686 $ // intno ªCFG_INTÉæÁÄÝèÏÝÌêiE_OBJj674 $ // intnoがCFG_INTによって設定済みの場合(E_OBJ) 687 675 $j = 0$ 688 676 $FOREACH intno2 INT.ORDER_LIST$ … … 693 681 $END$ 694 682 695 $ // intatr ª TA_ENAINT, TA_EDGE, ܽͻ̼^[QbgÅpÂ\È®«Ì¢¸êÅàÈ¢êiE_RSATRj683 $ // intatrが TA_ENAINT, TA_EDGE, またはその他ターゲットで利用可能な属性のいずれでもない場合(E_RSATR) 696 684 $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|ALT(TARGET_INTATR,0))) != 0$ 697 685 $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$ 698 686 $END$ 699 687 700 $ // intpri ªCFG_INTÉηéÝDæxƵijµÈ¢êiE_PARj688 $ // intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR) 701 689 $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$ 702 690 $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intpri", INT.INTPRI[intno], "CFG_INT")$$END$ 703 691 $END$ 704 692 705 $ // J[lÇÌÝƵÄÅè³êÄ¢éÝÉCTMIN_INTPRI æèଳ¢lªwè³ê½êiE_OBJj693 $ // カーネル管理の割込みとして固定されている割込みに,TMIN_INTPRI よりも小さい値が指定された場合(E_OBJ) 706 694 $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$ 707 695 $IF INT.INTPRI[intno] < TMIN_INTPRI$ … … 710 698 $END$ 711 699 712 $ // J[lÇOÌÝƵÄÅè³êÄ¢éÝÉCTMIN_INTPRI æèଳ¢lªwè³êÈ©Á½êiE_OBJj700 $ // カーネル管理外の割込みとして固定されている割込みに,TMIN_INTPRI よりも小さい値が指定されなかった場合(E_OBJ) 713 701 $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$ 714 702 $IF INT.INTPRI[intno] >= TMIN_INTPRI$ … … 720 708 721 709 722 $ ÝnhÉÖ·éG[`FbN710 $ 割込みハンドラに関するエラーチェック 723 711 $i = 0$ 724 712 $FOREACH inhno INH.ORDER_LIST$ 725 $ // ÝnhÔ(inhno)ª³µÈ¢êiE_PARj713 $ // 割込みハンドラ番号(inhno)が正しくない場合(E_PAR) 726 714 $IF !LENGTH(FIND(INHNO_DEFINH_VALID, INH.INHNO[inhno]))$ 727 715 $ERROR INH.TEXT_LINE[inhno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$ 728 716 $END$ 729 717 730 $ // ¯¶ÝnhÔÉηéDEF_INHª¡¶Ý·éêiE_OBJj718 $ // 同じ割込みハンドラ番号に対するDEF_INHが複数存在する場合(E_OBJ) 731 719 $j = 0$ 732 720 $FOREACH inhno2 INH.ORDER_LIST$ … … 737 725 $END$ 738 726 739 $ // Ýnh®«(inhatr) ª TA_NULL, TA_NONKERNEL, yѻ̼^[Qbg˶ÅpÂ\È®«Ì¢¸êÅàÈ¢iE_RSATRj727 $ // 割込みハンドラ属性(inhatr) が TA_NULL, TA_NONKERNEL, 及びその他ターゲット依存で利用可能な属性のいずれでもない(E_RSATR) 740 728 $IF (INH.INHATR[inhno] & ~(TA_NONKERNEL|ALT(TARGET_INHATR,0))) != 0$ 741 729 $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$ 742 730 $END$ 743 731 744 $ // J[lÇÉÅè³êÄ¢éÝnhÉCTA_NONKERNEL ®«ªÝè³êÄ¢éiE_RSATRj732 $ // カーネル管理に固定されている割込みハンドラに,TA_NONKERNEL 属性が設定されている(E_RSATR) 745 733 $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$ 746 734 $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$ … … 749 737 $END$ 750 738 751 $ // J[lÇOÉÅè³êÄ¢éÝnhÉCTA_NONKERNEL ®«ªÝè³êĢȢiE_RSATRj739 $ // カーネル管理外に固定されている割込みハンドラに,TA_NONKERNEL 属性が設定されていない(E_RSATR) 752 740 $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$ 753 741 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$ … … 757 745 758 746 759 $ // ÝÔÆ1Î1ηéÝnhÔ(ATT_ISRÅwèÂ\ÈÝnhÔ)ÍCȺÌ`FbNàs¤D760 $ // INHNO_ATTISR_VALID ÉÜÜêÈ¢ÝnhÔÍ`FbN³êÈ¢±ÆÉÈéD747 $ // 割込み番号と1対1対応する割込みハンドラ番号(ATT_ISRで指定可能な割込みハンドラ番号)は,以下のチェックも行う. 748 $ // INHNO_ATTISR_VALID に含まれない割込みハンドラ番号はチェックされないことになる. 761 749 $IF LENGTH(INTNO[INH.INHNO[inhno]]) > 0$ 762 750 $intno = INTNO[INH.INHNO[inhno]]$ 763 751 764 $ // Ýnho^æÌÝvCª®«Ýè³êĢȢ(CFG_INTªÈ¢)iE_OBJj752 $ // 割込みハンドラ登録先の割込み要求ラインが属性設定されていない(CFG_INTがない)(E_OBJ) 765 753 $IF !LENGTH(INT.INTNO[intno])$ 766 754 $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$ 767 755 $ELSE$ 768 756 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$ 769 $ // inhatr ÉTA_NONKERNELªwè³êĨç¸CinhnoÉÎ770 $ // ·éintnoÉεÄCFG_INTÅÝè³ê½ÝDæxª771 $ // TMIN_INTPRI æèଳ¢êiE_OBJj757 $ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応 758 $ // するintnoに対してCFG_INTで設定された割込み優先度が 759 $ // TMIN_INTPRIよりも小さい場合(E_OBJ) 772 760 $IF INT.INTPRI[intno] < TMIN_INTPRI$ 773 761 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$ 774 762 $END$ 775 763 $ELSE$ 776 $ // inhatr ÉTA_NONKERNELªwè³êĨèCinhnoÉÎ777 $ // ·éintnoÉεÄCFG_INTÅÝè³ê½ÝDæxª778 $ // TMIN_INTPRI ÈãÅ éêiE_OBJj764 $ // inhatrにTA_NONKERNELが指定されており,inhnoに対応 765 $ // するintnoに対してCFG_INTで設定された割込み優先度が 766 $ // TMIN_INTPRI以上である場合(E_OBJ) 779 767 $IF INT.INTPRI[intno] >= TMIN_INTPRI$ 780 768 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$ … … 786 774 $END$ 787 775 788 $ ÝT[rX[`iISRjÉÖ·éG[`FbNÆÝnh̶¬776 $ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成 789 777 $FOREACH order ISR.ORDER_LIST$ 790 $ // isratr ªiTA_NULLjÅÈ¢êiE_RSATRj778 $ // isratrが(TA_NULL)でない場合(E_RSATR) 791 779 $IF (ISR.ISRATR[order] & ~ALT(TARGET_ISRATR,0)) != 0$ 792 780 $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "isratr", ISR.ISRATR[order], "isr", ISR.ISR[order], "ATT_ISR")$$END$ 793 781 $END$ 794 782 795 $ // intno ªATT_ISRÉηéÝÔƵijµÈ¢êiE_PARj783 $ // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR) 796 784 $IF !LENGTH(FIND(INTNO_ATTISR_VALID, ISR.INTNO[order]))$ 797 785 $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", ISR.INTNO[order], "ATT_ISR")$$END$ 798 786 $END$ 799 787 800 $ // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI) ÅÈ¢êiE_PARj788 $ // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR) 801 789 $IF !(TMIN_ISRPRI <= ISR.ISRPRI[order] && ISR.ISRPRI[order] <= TMAX_ISRPRI)$ 802 790 $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isrpri", ISR.ISRPRI[order], "ATT_ISR")$$END$ … … 808 796 $inhno = INHNO[intno]$ 809 797 810 $ // ÝÔintnoÉεÄo^³ê½ISRÌXgÌì¬798 $ // 割込み番号intnoに対して登録されたISRのリストの作成 811 799 $isr_order_list = {}$ 812 800 $FOREACH order ISR.ORDER_LIST$ … … 817 805 $END$ 818 806 819 $ // ÝÔintnoÉεÄo^³ê½ISRª¶Ý·éê807 $ // 割込み番号intnoに対して登録されたISRが存在する場合 820 808 $IF LENGTH(isr_order_list) > 0$ 821 $ // intno ÉηéinhnoÉεÄDEF_INHª éêiE_OBJj809 $ // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ) 822 810 $IF LENGTH(INH.INHNO[inhno])$ 823 811 $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"), "intno", ISR.INTNO[order_for_error], "ATT_ISR", "inhno", INH.INHNO[inhno])$$END$ 824 812 $END$ 825 813 826 $ // intno ÉηéCFG_INTªÈ¢êiE_OBJj814 $ // intnoに対するCFG_INTがない場合(E_OBJ) 827 815 $IF !LENGTH(INT.INTNO[intno])$ 828 816 $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' is not configured with %3%"), "intno", ISR.INTNO[order_for_error], "CFG_INT")$$END$ 829 817 $ELSE$ 830 $ // intno ÉεÄCFG_INTÅÝè³ê½ÝDæxªTMIN_INTPRI831 $ // æèଳ¢êiE_OBJj818 $ // intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRI 819 $ // よりも小さい場合(E_OBJ) 832 820 $IF INT.INTPRI[intno] < TMIN_INTPRI$ 833 821 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "intno", ISR.INTNO[order_for_error], "TMIN_INTPRI")$$END$ … … 841 829 $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$ 842 830 843 $ // ISR pÌÝnh831 $ // ISR用の割込みハンドラ 844 832 void$NL$ 845 833 _kernel_inthdr_$intno$(void)$NL$ … … 853 841 $TAB$i_begin_int($intno$);$NL$ 854 842 $END$ 855 $ // ISR ðDæxÉÄÑo·843 $ // ISRを優先度順に呼び出す 856 844 $JOINEACH order SORT(isr_order_list, "ISR.ISRPRI") "\tif (i_sense_lock()) {\n\t\ti_unlock_cpu();\n\t}\n\ti_set_ipm(saved_ipm);\n"$ 857 845 $TAB$LOG_ISR_ENTER($intno$);$NL$ … … 866 854 867 855 $ 868 $ ÝÇ@\̽ßÌWIÈú»îñ̶¬869 $ 870 $ ÝnhÌú»ÉKvÈîñ856 $ 割込み管理機能のための標準的な初期化情報の生成 857 $ 858 $ 割込みハンドラの初期化に必要な情報 871 859 $IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$ 872 860 873 $ Ýnh861 $ 割込みハンドラ数 874 862 #define TNUM_INHNO $LENGTH(INH.ORDER_LIST)$$NL$ 875 863 const uint_t _kernel_tnum_inhno = TNUM_INHNO;$NL$ … … 879 867 $END$ 880 868 881 $ Ýnhú»e[u869 $ 割込みハンドラ初期化テーブル 882 870 $IF LENGTH(INH.ORDER_LIST)$ 883 871 const INHNO _kernel_inhinib_inhno[TNUM_INHNO] = { … … 905 893 $END$ 906 894 907 $ ÝvCÌú»ÉKvÈîñ895 $ 割込み要求ラインの初期化に必要な情報 908 896 $IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INTINIB_TABLE,0)$ 909 897 910 $ ÝvC898 $ 割込み要求ライン数 911 899 #define TNUM_INTNO $LENGTH(INT.ORDER_LIST)$$NL$ 912 900 const uint_t _kernel_tnum_intno = TNUM_INTNO;$NL$ 913 901 $NL$ 914 902 915 $ ÝvCú»e[u903 $ 割込み要求ライン初期化テーブル 916 904 $IF LENGTH(INT.ORDER_LIST)$ 917 905 const INTNO _kernel_intinib_intno[TNUM_INTNO] = { … … 941 929 942 930 $ --------------------------------------------------------------------- 943 $ CPU áOnh931 $ CPU例外ハンドラ 944 932 $ --------------------------------------------------------------------- 945 933 /*$NL$ … … 948 936 $NL$ 949 937 950 $ // EXCNO_DEFEXC_VALID Ìvfª EXCNO_VALID ÉÜÜêé©Ç¤©Ì`FbN951 $ // EXCNO_DEFEXC_VALID Í EXCNO_VALID ̪WÉÈé͸D938 $ // EXCNO_DEFEXC_VALID の要素が EXCNO_VALID に含まれるかどうかのチェック 939 $ // EXCNO_DEFEXC_VALID は EXCNO_VALID の部分集合になるはず. 952 940 $FOREACH excno EXCNO_DEFEXC_VALID$ 953 941 $IF LENGTH(FIND(EXCNO_VALID, excno)) == 0$ … … 957 945 958 946 959 $ CPU áOnhÉÖ·éG[`FbN947 $ CPU例外ハンドラに関するエラーチェック 960 948 $i = 0$ 961 949 $FOREACH excno EXC.ORDER_LIST$ 962 $ // excno ªDEF_EXCÉηéCPUáOnhÔƵijµÈ¢êiE_PARj950 $ // excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR) 963 951 $IF !LENGTH(FIND(EXCNO_DEFEXC_VALID, EXC.EXCNO[excno]))$ 964 952 $ERROR EXC.TEXT_LINE[excno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$ 965 953 $END$ 966 954 967 $ // excno ªDEF_EXCÉæÁÄÝèÏÝÌêiE_OBJj955 $ // excnoがDEF_EXCによって設定済みの場合(E_OBJ) 968 956 $j = 0$ 969 957 $FOREACH excno2 EXC.ORDER_LIST$ … … 974 962 $END$ 975 963 976 $ // excatr ªiTA_NULLjÅÈ¢êiE_RSATRj964 $ // excatrが(TA_NULL)でない場合(E_RSATR) 977 965 $IF (EXC.EXCATR[excno] & ~ALT(TARGET_EXCATR,0)) != 0$ 978 966 $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$ … … 981 969 $END$ 982 970 983 $ CPU áOnh̽ßÌWIÈú»îñ̶¬971 $ CPU例外ハンドラのための標準的な初期化情報の生成 984 972 $IF !ALT(OMIT_INITIALIZE_EXCEPTION,0)$ 985 973 986 $ CPU áOnh974 $ CPU例外ハンドラ数 987 975 #define TNUM_EXCNO $LENGTH(EXC.ORDER_LIST)$$NL$ 988 976 const uint_t _kernel_tnum_excno = TNUM_EXCNO;$NL$ … … 992 980 $END$ 993 981 994 $ CPU áOnhú»e[u982 $ CPU例外ハンドラ初期化テーブル 995 983 $IF LENGTH(EXC.ORDER_LIST)$ 996 984 const EXCNO _kernel_excinib_excno[TNUM_EXCNO] = { … … 1021 1009 1022 1010 $ --------------------------------------------------------------------- 1023 $ üúnh1011 $ 周期ハンドラ 1024 1012 $ --------------------------------------------------------------------- 1025 1013 … … 1029 1017 $NL$ 1030 1018 1031 $ üúnhIDÔÌÅål1019 $ 周期ハンドラID番号の最大値 1032 1020 const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1);$NL$ 1033 1021 1034 $ üúnhÌ^CCxgIDItZbg1035 $ üúnhÌ^CCxgIDÍ0©çJn1022 $ 周期ハンドラのタイムイベントIDオフセット 1023 $ 周期ハンドラのタイムイベントIDは0から開始 1036 1024 const uint_t _kernel_cycevtid_offset = 0;$NL$ 1037 1025 $NL$ 1038 1026 1039 $ Ggª TMAX_MAXCYC(kernel.h) Âæè½¢êÍCG[Æ·é1027 $ エントリが TMAX_MAXCYC(kernel.h) 個より多い場合は,エラーとする 1040 1028 $IF LENGTH(CYC.ORDER_LIST) > TMAX_MAXCYC$ 1041 1029 $ERROR$$FORMAT(_("The number of CRE_CYC must be equal to or less than %1%."), +VALUE("TMAX_MAXCYC", TMAX_MAXCYC))$$END$ … … 1043 1031 1044 1032 $IF LENGTH(CYC.ORDER_LIST)$ 1045 $ üúnh®«1033 $ 周期ハンドラ属性 1046 1034 $CYCACT = 0$ 1047 1035 $FOREACH cycid CYC.ORDER_LIST$ 1048 $ // üúnh®«(cycatr) ª TA_NULL, TA_STA Ì¢¸êÅàÈ¢iE_RSATRj1036 $ // 周期ハンドラ属性(cycatr) が TA_NULL, TA_STA のいずれでもない(E_RSATR) 1049 1037 $IF (CYC.CYCATR[cycid] & ~TA_STA) != 0$ 1050 1038 $ERROR CYC.TEXT_LINE[cycid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycatr", CYC.CYCATR[cycid], cycid, "CRE_CYC")$$END$ … … 1057 1045 const uint16_t _kernel_cycinib_cycact = $CYCACT$;$NL$ 1058 1046 1059 $ üúnhg£îñ1047 $ 周期ハンドラ拡張情報 1060 1048 const intptr_t _kernel_cycinib_exinf[TNUM_CYCID] = { 1061 1049 $JOINEACH cycid CYC.ORDER_LIST ","$ … … 1064 1052 };$NL$ 1065 1053 1066 $ üúnhAhX1054 $ 周期ハンドラアドレス 1067 1055 const CYCHDR _kernel_cycinib_cychdr[TNUM_CYCID] = { 1068 1056 $JOINEACH cycid CYC.ORDER_LIST ","$ … … 1071 1059 };$NL$ 1072 1060 1073 $ üúnhüú1061 $ 周期ハンドラ周期 1074 1062 const RELTIM _kernel_cycinib_cyctim[TNUM_CYCID] = { 1075 1063 $JOINEACH cycid CYC.ORDER_LIST ","$ 1076 $ // cyctim Í 0 æèå«CTMAX_RELTIM ȺŠéD(E_PAR)1064 $ // cyctim は 0 より大きく,TMAX_RELTIM 以下である.(E_PAR) 1077 1065 $IF CYC.CYCTIM[cycid] <= 0 || TMAX_RELTIM < CYC.CYCTIM[cycid] $ 1078 1066 $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cyctim", CYC.CYCTIM[cycid], cycid, "CRE_CYC")$$END$ … … 1083 1071 };$NL$ 1084 1072 1085 $ üúnhÊ1073 $ 周期ハンドラ位相 1086 1074 const RELTIM _kernel_cycinib_cycphs[TNUM_CYCID] = { 1087 1075 $JOINEACH cycid CYC.ORDER_LIST ","$ 1088 $ // cycphs Í 0 ÈãCTMAX_RELTIM ȺŠéD(E_PAR)1076 $ // cycphs は 0 以上,TMAX_RELTIM 以下である.(E_PAR) 1089 1077 $IF CYC.CYCPHS[cycid] < 0 || TMAX_RELTIM < CYC.CYCPHS[cycid] $ 1090 1078 $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycphs", CYC.CYCPHS[cycid], cycid, "CRE_CYC")$$END$ 1091 1079 $END$ 1092 1080 1093 $ // ʪ0©ÂC®«ª TA_STA ÌêÍx1081 $ // 位相が0かつ,属性が TA_STA の場合は警告 1094 1082 $IF CYC.CYCPHS[cycid] == 0 && (CYC.CYCATR[cycid] & TA_STA) != 0$ 1095 1083 $WARNING CYC.TEXT_LINE[cycid]$$FORMAT(_("%1% is not recommended when %2% is set to %3% in %4%"), "cycphs==0", "TA_STA", "cycatr", "CRE_CYC")$$END$ … … 1101 1089 $NL$ 1102 1090 1103 $ üúnhÌñN®1091 $ 周期ハンドラの次回起動時刻 1104 1092 EVTTIM _kernel_cyccb_evttim[TNUM_CYCID];$NL$ 1105 1093 … … 1113 1101 $END$ 1114 1102 1115 $ üúnh®ìóÔ1103 $ 周期ハンドラ動作状態 1116 1104 uint16_t _kernel_cyccb_cycact;$NL$ 1117 1105 … … 1120 1108 1121 1109 $ --------------------------------------------------------------------- 1122 $ A[nh1110 $ アラームハンドラ 1123 1111 $ --------------------------------------------------------------------- 1124 1112 … … 1128 1116 $NL$ 1129 1117 1130 $ Ggª TMAX_MAXALM(kernel.h) Âæè½¢êÍCG[Æ·é1118 $ エントリが TMAX_MAXALM(kernel.h) 個より多い場合は,エラーとする 1131 1119 $IF LENGTH(ALM.ORDER_LIST) > TMAX_MAXALM$ 1132 1120 $ERROR$$FORMAT(_("The number of CRE_ALM must be equal to or less than %1%."), +VALUE("TMAX_MAXALM",TMAX_MAXALM))$$END$ 1133 1121 $END$ 1134 1122 1135 $ A[nhÌÅåIDl1123 $ アラームハンドラの最大ID値 1136 1124 const ID _kernel_tmax_almid = (TMIN_ALMID + TNUM_ALMID - 1);$NL$ 1137 1125 1138 $ A[nhÌ^CCxgIDItZbg1126 $ アラームハンドラのタイムイベントIDオフセット 1139 1127 const uint_t _kernel_almevtid_offset = $LENGTH(CYC.ORDER_LIST)$;$NL$ 1140 1128 $NL$ 1141 1129 1142 1130 $FOREACH almid ALM.ORDER_LIST$ 1143 $ // almatr ªiTA_NULLjÅÈ¢êiE_RSATRj1131 $ // almatrが(TA_NULL)でない場合(E_RSATR) 1144 1132 $IF ALM.ALMATR[almid] != 0$ 1145 1133 $ERROR ALM.TEXT_LINE[almid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "almatr", ALM.ALMATR[almid], almid, "CRE_ALM")$$END$ … … 1148 1136 1149 1137 $IF LENGTH(ALM.ORDER_LIST)$ 1150 $ A[nhæªÔn1138 $ アラームハンドラ先頭番地 1151 1139 const ALMHDR _kernel_alminib_almhdr[TNUM_ALMID] = { 1152 1140 $JOINEACH almid ALM.ORDER_LIST ","$ … … 1155 1143 };$NL$ 1156 1144 1157 $ A[nhg£îñ1145 $ アラームハンドラ拡張情報 1158 1146 const intptr_t _kernel_alminib_exinf[TNUM_ALMID] = { 1159 1147 $JOINEACH almid ALM.ORDER_LIST ","$ … … 1168 1156 $END$ 1169 1157 1170 $ A[nhóÔ1158 $ アラームハンドラ状態 1171 1159 uint16_t _kernel_almcb_almact;$NL$ 1172 1160 $NL$ … … 1174 1162 1175 1163 $ --------------------------------------------------------------------- 1176 $ ^CCxgÇ1164 $ タイムイベント管理 1177 1165 $ --------------------------------------------------------------------- 1178 1166 … … 1187 1175 $NL$ 1188 1176 1189 $ ^CCxgubNÌTCY1177 $ タイムイベントブロックのサイズ 1190 1178 const uint_t _kernel_tnum_tmevt_queue = TNUM_TMEVT;$NL$$NL$ 1191 1179 1192 1180 $IF TNUM_TMEVT != 0$ 1193 $ ^CCxgL 1194 [ 1181 $ タイムイベントキュー 1195 1182 QUEUE _kernel_tmevt_queue[TNUM_TMEVT+1];$NL$ 1196 $ ^CCxgÔ1183 $ タイムイベント時間 1197 1184 EVTTIM _kernel_tmevt_time[TNUM_TMEVT];$NL$ 1198 $ ^CCxgÌR[obN1185 $ タイムイベントのコールバック 1199 1186 CBACK _kernel_tmevt_callback[TNUM_TMEVT];$NL$ 1200 $ ^CCxgR[obNÌø1187 $ タイムイベントコールバックの引数 1201 1188 uintptr_t _kernel_tmevt_arg[TNUM_TMEVT];$NL$ 1202 1189 $NL$$NL$ … … 1210 1197 1211 1198 $ --------------------------------------------------------------------- 1212 $ ñ^XNReLXgpX^bNÌæ1199 $ 非タスクコンテキスト用スタック領域 1213 1200 $ --------------------------------------------------------------------- 1214 1201 /*$NL$ … … 1216 1203 $SPC$*/$NL$$NL$ 1217 1204 1218 $ // Ïè`1219 $ // ñ^XNReLXgpX^bNÌæÌTCY1205 $ // 変数定義 1206 $ // 非タスクコンテキスト用スタック領域のサイズ 1220 1207 $interrupt_context_stksz = 0$ 1221 1208 1222 $ // DEF_ICS ÌGgª¶Ý·é©?1209 $ // DEF_ICS のエントリが存在するか? 1223 1210 $IF !LENGTH(ICS.ORDER_LIST)$ 1224 $ // È¢êDTCYÍùèl (DEFAULT_ISTKSZ) ðg¤1211 $ // ない場合.サイズは既定値 (DEFAULT_ISTKSZ) を使う 1225 1212 #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ$NL$$NL$ 1226 1213 $interrupt_context_stksz = DEFAULT_ISTKSZ$ 1227 1214 $ELSE$ 1228 $ // DEF_ICS ÌGgª éê1229 1230 $ 1231 $ // G[`FbN1232 $ 1233 $ // ÃIAPIuDEF_ICSvª¡ éiE_OBJj1215 $ // DEF_ICS のエントリがある場合 1216 1217 $ 1218 $ // エラーチェック 1219 $ 1220 $ // 静的API「DEF_ICS」が複数ある(E_OBJ) 1234 1221 $IF LENGTH(ICS.ORDER_LIST) > 1$ 1235 1222 $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$ 1236 1223 $END$ 1237 $ // DEF_ICS Å0ðwèµ½ê(E_PAR)1224 $ // DEF_ICS で0を指定した場合(E_PAR) 1238 1225 $IF ICS.ISTKSZ[1] == 0$ 1239 1226 $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% in %2% is 0"), "istksz", "DEF_ICS")$$END$ 1240 1227 $END$ 1241 $ // íÉ NULL Å éD(E_PAR)1228 $ // 常に NULL である.(E_PAR) 1242 1229 $IF !EQ(ICS.ISTK[1], "NULL")$ 1243 1230 $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(("'%1%' of %2% must be NULL."), "istk", "DEF_ICS")$$END$ … … 1251 1238 1252 1239 $ --------------------------------------------------------------------- 1253 $ ¤LX^bNÌæ 1254 $ SSPÅÍ·×ÄÌPÊÌX^bNð¤L·é½ßC 1255 $ ±±ÅVXeSÌÌX^bNÌæðmÛ·éD 1256 $ --------------------------------------------------------------------- 1257 1258 $ 1259 $ ¤LX^bNÌRtBM 1260 [Vɬ÷µ½©Ç¤© 1261 $ 1262 $ DEF_STK ÉG[ª¶µ½êC±ÌϪ0ÉÈéD 1263 $ DEF_STK ÉG[ª¶µ½©Ç¤©ð»fµÄ 1264 $ ÁèÌÀsðubN·é½ßÉgp·éD 1240 $ 共有スタック領域 1241 $ SSPではすべての処理単位のスタックを共有するため, 1242 $ ここでシステム全体のスタック領域を確保する. 1243 $ --------------------------------------------------------------------- 1244 1245 $ 1246 $ 共有スタックのコンフィギュレーションに成功したかどうか 1247 $ 1248 $ DEF_STK 処理中にエラーが発生した場合,この変数が0になる. 1249 $ DEF_STK 処理中にエラーが発生したかどうかを判断して 1250 $ 特定処理の実行をブロックするために使用する. 1265 1251 $ 1266 1252 $configurated_defstk_successfully = 1$ … … 1271 1257 $NL$ 1272 1258 1273 $ // Ïè`1274 $ // èÄç꽤LX^bNÌæÌTCY1259 $ // 変数定義 1260 $ // 割り当てられた共有スタック領域のサイズ 1275 1261 $allocated_stack_size = 0$ 1276 1262 1277 $ // DEF_STK ÌGgª¶Ý·é©?1263 $ // DEF_STK のエントリが存在するか? 1278 1264 $IF !LENGTH(STK.ORDER_LIST)$ 1279 $ // (1) DEF_STK ÌGgªÈ¢ê1265 $ // (1) DEF_STK のエントリがない場合 1280 1266 static STK_T _kernel_stack[COUNT_STK_T(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ)];$NL$ 1281 1267 #define TOPPERS_STK _kernel_stack$NL$ … … 1285 1271 $allocated_stack_size = max_tsk_stksz + interrupt_context_stksz$ 1286 1272 $ELSE$ 1287 $ // (2) DEF_STK ÌGgª éê1288 1289 $ // G[`FbN1290 $ // ÃIAPIuDEF_STKvª¡ éiE_OBJj1273 $ // (2) DEF_STK のエントリがある場合 1274 1275 $ // エラーチェック 1276 $ // 静的API「DEF_STK」が複数ある(E_OBJ) 1291 1277 $IF LENGTH(STK.ORDER_LIST) > 1$ 1292 1278 $configurated_defstk_successfully = 0$ 1293 1279 $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_STK")$$END$ 1294 1280 $END$ 1295 $ // DEF_STK Ì stksz Å 0 ðwèµ½ê(E_PAR)1281 $ // DEF_STK の stksz で 0 を指定した場合(E_PAR) 1296 1282 $IF STK.STKSZ[1] == 0$ 1297 1283 $configurated_defstk_successfully = 0$ … … 1300 1286 1301 1287 $IF EQ(STK.STK[1], "NULL")$ 1302 $ // stk ª NULL ÌêCX^bNÌæð©®t¯1288 $ // stk が NULL の場合,スタック領域を自動割付け 1303 1289 static STK_T _kernel_stack[COUNT_STK_T($STK.STKSZ[1]$)];$NL$ 1304 1290 #define TOPPERS_STK _kernel_stack$NL$ 1305 1291 #define TOPPERS_STKSZ ROUND_STK_T($STK.STKSZ[1]$)$NL$ 1306 1292 $ELSE$ 1307 $ // stk ª NULL ÈOÌêiAv¤ÅX^bNÌæðpÓ·éêj1308 1309 $ // stksz ª^[QbgÉèÜéACgTCYÌ{ÉACg³êĢȢêiE_PARj1293 $ // stk が NULL 以外の場合(アプリ側でスタック領域を用意する場合) 1294 1295 $ // stkszがターゲット毎に定まるアライメントサイズの倍数にアライメントされていない場合(E_PAR) 1310 1296 $IF LENGTH(CHECK_STKSZ_ALIGN) && (STK.STKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$ 1311 1297 $configurated_defstk_successfully = 0$ … … 1321 1307 $NL$ 1322 1308 1323 $ ¤LX^bNpÌX^bNÌæ1309 $ 共有スタック用のスタック領域 1324 1310 const SIZE _kernel_stksz = TOPPERS_STKSZ;$NL$ 1325 1311 STK_T *const _kernel_stk = TOPPERS_STK;$NL$ … … 1331 1317 1332 1318 $ 1333 $ // DæxèĨæÑX^bNÝèÉÖ·éÊðWoÍÖ\¦1319 $ // 優先度割り当ておよびスタック設定に関する結果を標準出力へ表示 1334 1320 $ 1335 1321 $IF configurated_defepr_successfully == 1 && configurated_defstk_successfully == 1$ … … 1347 1333 $TAB$Specified interrupt stack size = $interrupt_context_stksz$(value=$FORMAT("%d",+interrupt_context_stksz)$)$NL$ 1348 1334 $TAB$Allocated total stack size = $allocated_stack_size$(value=$FORMAT("%d",+allocated_stack_size)$)$NL$ 1349 $ // TCYÌ`FbNDX^bNTCYÌèlªÀÛÉÄçê½TCYæèå«¢êCx·éD1335 $ // サイズのチェック.スタックサイズの推定値が実際に割当てられたサイズより大きい場合,警告する. 1350 1336 $IF (max_tsk_stksz+interrupt_context_stksz) > allocated_stack_size$ 1351 1337 $TAB$!!!WARNING!!!: Estimated stack size is more than the allocated stack size.$NL$ … … 1355 1341 $END$ 1356 1342 $ 1357 $ // oÍæð³ÉߵĨ1343 $ // 出力先を元に戻しておく 1358 1344 $ 1359 1345 $FILE "kernel_cfg.c"$ … … 1361 1347 1362 1348 $ --------------------------------------------------------------------- 1363 $ eW 1364 [Ìú»Ö 1349 $ 各モジュールの初期化関数 1365 1350 $ --------------------------------------------------------------------- 1366 1351 /*$NL$ … … 1393 1378 1394 1379 $ --------------------------------------------------------------------- 1395 $ ú»[`ÌÀsÖ1380 $ 初期化ルーチンの実行関数 1396 1381 $ --------------------------------------------------------------------- 1397 1382 /*$NL$ … … 1403 1388 {$NL$ 1404 1389 $FOREACH order INI.ORDER_LIST$ 1405 $ // iniatr ªiTA_NULLjÅÈ¢êiE_RSATRj1390 $ // iniatrが(TA_NULL)でない場合(E_RSATR) 1406 1391 $IF INI.INIATR[order] != 0$ 1407 1392 $ERROR INI.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "iniatr", INI.INIATR[order], "inirtn", INI.INIRTN[order], "ATT_INI")$$END$ … … 1413 1398 1414 1399 $ --------------------------------------------------------------------- 1415 $ I¹[`ÌÀsÖ1400 $ 終了処理ルーチンの実行関数 1416 1401 $ --------------------------------------------------------------------- 1417 1402 /*$NL$ … … 1423 1408 {$NL$ 1424 1409 $FOREACH rorder TER.RORDER_LIST$ 1425 $ // teratr ªiTA_NULLjÅÈ¢êiE_RSATRj1410 $ // teratrが(TA_NULL)でない場合(E_RSATR) 1426 1411 $IF TER.TERATR[rorder] != 0$ 1427 1412 $ERROR TER.TEXT_LINE[rorder]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "teratr", TER.TERATR[rorder], "terrtn", TER.TERRTN[rorder], "ATT_TER")$$END$ -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.