Ignore:
Timestamp:
Jun 2, 2015, 3:39:53 PM (9 years ago)
Author:
nmir-saito
Message:

ファイルの mime-type 変更

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_qb_r5f100le_cs/trunk/doc/configurator.txt

    • Property svn:mime-type set to text/plain; charset=shift_jis
    r93 r95  
    11
    2                 TOPPERS/SSPƒJ[ƒlƒ‹
    3                 ƒRƒ“ƒtƒBƒMƒ
    4 ƒŒ[ƒ^Žd—l
    5 
    6                 ‘Ήžƒo[ƒWƒ‡ƒ“: Release 1.3.0
    7                 ÅIXV: 2014”N 5ŒŽ 19“ú
    8 
    9 ‚±‚̃hƒLƒ
    10 ƒƒ“ƒg‚́CTOPPERS/SSPƒJ[ƒlƒ‹‚̃Rƒ“ƒtƒBƒMƒ
    11 ƒŒ[ƒ^‚ª•W€“I‚ɐ¶
    12 ¬‚·‚ׂ«ƒtƒ@ƒCƒ‹‚Ì“à—e‚ɂ‚¢‚ĉðà‚µ‚½‚à‚Ì‚Å‚ ‚éDƒ^[ƒQƒbƒgˆË‘¶‚ɐ¶¬
    13 ‚·‚é“à—e‚ɂ‚¢‚ẮC‚±‚̃hƒLƒ
    14 ƒƒ“ƒg‚͈̔͊O‚Å‚ ‚éD
     2                TOPPERS/SSPカーネル
     3                コンフィギュレータ仕様
     4
     5                対応バージョン: Release 1.3.0
     6                最終更新: 2014年 5月 19日
     7
     8このドキュメントは,TOPPERS/SSPカーネルのコンフィギュレータが標準的に生
     9成すべきファイルの内容について解説したものである.ターゲット依存に生成
     10する内容については,このドキュメントの範囲外である.
    1511
    1612----------------------------------------------------------------------
     
    2420             Nagoya Municipal Industrial Research Institute, JAPAN
    2521
    26  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    27  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    28  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    29  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    30      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    31      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    32  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    33      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    34 ƒƒ“ƒgi—˜—p
    35      ŽÒƒ}ƒjƒ
    36 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    37      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    38  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    39      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    40      ‚ƁD
    41    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    42 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    43 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    44        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    45    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    46        •ñ‚·‚邱‚ƁD
    47  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    48      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    49      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    50      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    51      –Ɛӂ·‚邱‚ƁD
     22 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     23 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     24 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     25 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     26     権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     27     スコード中に含まれていること.
     28 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     29     用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     30     者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     31     の無保証規定を掲載すること.
     32 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     33     用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     34     と.
     35   (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     36       作権表示,この利用条件および下記の無保証規定を掲載すること.
     37   (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     38       報告すること.
     39 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     40     害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     41     また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     42     由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     43     免責すること.
    5244 
    53  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    54  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    55  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    56  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    57  ‚̐ӔC‚𕉂í‚È‚¢D
     45 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     46 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     47 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     48 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     49 の責任を負わない.
    5850 
    5951 $Id: configurator.txt 659 2015-05-19 09:45:26Z nmir-saito $
    6052----------------------------------------------------------------------
    6153
    62 ›–ÚŽŸ
    63 
    64 E¶¬‚·‚éƒtƒ@ƒCƒ‹‚ÌŽí—Þ
    65 EÃ“IAPIˆê——
    66 EƒJ[ƒlƒ‹\¬E‰Šú‰»ƒwƒbƒ_ƒtƒ@ƒCƒ‹ikernel_cfg.hj
    67         (1) ŒÅ’萶¬•”•ª
    68         (2) ƒIƒuƒWƒFƒNƒg”‚Ì’è‹`
    69         (3) ƒIƒuƒWƒFƒNƒg‚ÌID”ԍ†‚Ì’è‹`
    70 EƒJ[ƒlƒ‹\¬E‰Šú‰»ƒtƒ@ƒCƒ‹ikernel_cfg.cj
    71         (1) ŒÅ’萶¬•”•ª
    72         (2) ƒCƒ“ƒNƒ‹[ƒhƒfƒBƒŒƒNƒeƒBƒui#includej‚̏ˆ—
    73         (3) ƒIƒuƒWƒFƒNƒg‚ÌID”ԍ†‚ð•ÛŽ‚·‚é•Ï”‚Ì’è‹`
    74         (4) ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
    75         (5) ŠeƒJ[ƒlƒ‹ƒIƒuƒWƒFƒNƒg‚ÉŠÖ‚·‚é’è‹`
    76                 (5-1) ƒ^ƒXƒN‚ÉŠÖ‚·‚é’è‹`
    77                 (5-2) ƒCƒxƒ“ƒgƒtƒ‰ƒO‚ÉŠÖ‚·‚é’è‹`
    78                 (5-3) ƒf[ƒ^ƒLƒ
    79 [‚ÉŠÖ‚·‚é’è‹`
    80                 (5-4) ŽüŠúƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚é’è‹`
    81                 (5-5) ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚é’è‹`
    82         (6) Š„ž‚Ý‚ÉŠÖ‚·‚é’è‹`
    83                 (6-1) Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ÉŠÖ‚·‚é’è‹`
    84                 (6-2) Š„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ÉŠÖ‚·‚é’è‹`
    85                 (6-3) Š„ž‚݃nƒ“ƒhƒ‰‚ÉŠÖ‚·‚é’è‹`
    86         (7) CPU—áŠO‚ÉŠÖ‚·‚é’è‹`
    87         (8) ‹¤—LƒXƒ^ƒbƒN—̈æ‚ÉŠÖ‚·‚é’è‹`
    88         (9) ƒ^ƒCƒ€ƒCƒxƒ“ƒgŠÇ—‚ÉŠÖ‚·‚é’è‹`
    89         (10)Šeƒ‚ƒWƒ
    90 [ƒ‹‚̏‰Šú‰»ŠÖ”‚Ì’è‹`
    91         (11)‰Šú‰»ƒ‹[ƒ`ƒ“‚ÌŽÀsŠÖ”‚Ì’è‹`
    92         (12)I—¹ˆ—ƒ‹[ƒ`ƒ“‚ÌŽÀsŠÖ”‚Ì’è‹`
    93 
    94 ›¶¬‚·‚éƒtƒ@ƒCƒ‹‚ÌŽí—Þ
    95 
    96 SSPƒJ[ƒlƒ‹‚̃Rƒ“ƒtƒBƒMƒ
    97 ƒŒ[ƒ^‚́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    98 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒC
    99 ƒ‹‚ðˆ—‚µ‚āCƒJ[ƒlƒ‹\¬E‰Šú‰»ƒtƒ@ƒCƒ‹ikernel_cfg.cj‚ƍ\¬E‰Šú
    100 ‰»ƒwƒbƒ_ƒtƒ@ƒCƒ‹ikernel_cfg.hj‚𐶐¬‚·‚éD‚Ü‚½CƒRƒ“ƒtƒBƒMƒ
    101 ƒŒ[ƒ^‚Ì
    102 ˆ—‚Ì“r’†‚ɁC•K—v‚È’†ŠÔƒtƒ@ƒCƒ‹‚𐶐¬‚·‚éD
    103 
    104 
    105 ›Ã“IAPIˆê——
    106 
    107 SSPƒJ[ƒlƒ‹‚̃Rƒ“ƒtƒBƒMƒ
    108 ƒŒ[ƒ^‚ªˆ—‚·‚éÃ“IAPI‚ÍŽŸ‚Ì’Ê‚èD
    109 
    110 (1) ƒ^ƒXƒNŠÇ—‹@”\
     54○目次
     55
     56・生成するファイルの種類
     57・静的API一覧
     58・カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
     59        (1) 固定生成部分
     60        (2) オブジェクト数の定義
     61        (3) オブジェクトのID番号の定義
     62・カーネル構成・初期化ファイル(kernel_cfg.c)
     63        (1) 固定生成部分
     64        (2) インクルードディレクティブ(#include)の処理
     65        (3) オブジェクトのID番号を保持する変数の定義
     66        (4) トレースログマクロのデフォルト定義
     67        (5) 各カーネルオブジェクトに関する定義
     68                (5-1) タスクに関する定義
     69                (5-2) イベントフラグに関する定義
     70                (5-3) データキューに関する定義
     71                (5-4) 周期ハンドラに関する定義
     72                (5-5) アラームハンドラに関する定義
     73        (6) 割込みに関する定義
     74                (6-1) 割込み要求ラインに関する定義
     75                (6-2) 割込みサービスルーチンに関する定義
     76                (6-3) 割込みハンドラに関する定義
     77        (7) CPU例外に関する定義
     78        (8) 共有スタック領域に関する定義
     79        (9) タイムイベント管理に関する定義
     80        (10)各モジュールの初期化関数の定義
     81        (11)初期化ルーチンの実行関数の定義
     82        (12)終了処理ルーチンの実行関数の定義
     83
     84○生成するファイルの種類
     85
     86SSPカーネルのコンフィギュレータは,システムコンフィギュレーションファイ
     87ルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初期
     88化ヘッダファイル(kernel_cfg.h)を生成する.また,コンフィギュレータの
     89処理の途中に,必要な中間ファイルを生成する.
     90
     91
     92○静的API一覧
     93
     94SSPカーネルのコンフィギュレータが処理する静的APIは次の通り.
     95
     96(1) タスク管理機能
    11197        CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
    11298                                                PRI itskpri, SIZE stksz, STK_T *stk })
    11399        DEF_EPR (ID tskid, { PRI exepri })
    114100
    115 (2) “¯ŠúE’ʐM‹@”\
     101(2) 同期・通信機能
    116102        CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
    117103        CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
    118104
    119 ¦ dtqmb ‚ª NULL ‚Å‚È‚¢ê‡‚̓Tƒ|[ƒg‚µ‚È‚¢D
    120 
    121 (3) ŽžŠÔŠÇ—‹@”\
     105※ dtqmb が NULL でない場合はサポートしない.
     106
     107(3) 時間管理機能
    122108        CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,
    123109                                                RELTIM cyctim, RELTIM cycphs })
    124110        CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })
    125111
    126 (4) Š„ž‚ÝŠÇ—‹@”\
     112(4) 割込み管理機能
    127113        CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
    128114        ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri })
    129115        DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
    130116
    131 (5) CPU—áŠOŠÇ—‹@”\
     117(5) CPU例外管理機能
    132118        DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
    133119
    134 (6) ƒVƒXƒeƒ€\¬ŠÇ—‹@”\
     120(6) システム構成管理機能
    135121        DEF_ICS({ SIZE istksz, STK_T *istk })
    136122        DEF_STK({ SIZE stksz, STK_T *stk })
     
    138124        ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
    139125
    140 ‚±‚ê‚ç‚̐ÓIAPI‚̃pƒ‰ƒ[ƒ^‚Ì“àCIDŒ^‚̃pƒ‰ƒ[ƒ^‚̓IƒuƒWƒFƒNƒgŽ¯•Ê–¼C
    141 ƒ|ƒCƒ“ƒ^Œ^iTASKCCYCHDRCALMHDRCISRCINTHDRCEXCHDRCINIRTNCTERRTNC
    142 STK_T *j‚¨‚æ‚Ñ intptr_t Œ^‚̃pƒ‰ƒ[ƒ^‚͈ê”ʒ萔Ž®ƒpƒ‰ƒ[ƒ^‚Æ‚·‚éD
    143 ‚»‚Ì‘¼‚̃pƒ‰ƒ[ƒ^‚́C®”’萔Ž®ƒpƒ‰ƒ[ƒ^‚Æ‚·‚éD
    144 
    145 
    146 ›ƒJ[ƒlƒ‹\¬E‰Šú‰»ƒwƒbƒ_ƒtƒ@ƒCƒ‹ikernel_cfg.hj
    147 
    148 ƒJ[ƒlƒ‹\¬E‰Šú‰»ƒwƒbƒ_ƒtƒ@ƒCƒ‹ikernel_cfg.hj‚ɂ́CŽŸ‚Ì’è‹`‚𐶐¬‚·‚éD
    149 
    150 (1) ŒÅ’萶¬•”•ª
    151 
    152 kernel_cfg.h‚ª•¡”‰ñƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚é‚Ì‚ð–h‚®‚½‚ß‚Ì‹Lq‚𐶐¬‚·‚éD‹ï
    153 ‘Ì“I‚ɂ́Cƒtƒ@ƒCƒ‹‚̐擪‚ÉŽŸ‚̍s‚𐶐¬‚·‚éD
     126これらの静的APIのパラメータの内,ID型のパラメータはオブジェクト識別名,
     127ポインタ型(TASK,CYCHDR,ALMHDR,ISR,INTHDR,EXCHDR,INIRTN,TERRTN,
     128STK_T *)および intptr_t 型のパラメータは一般定数式パラメータとする.
     129その他のパラメータは,整数定数式パラメータとする.
     130
     131
     132○カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
     133
     134カーネル構成・初期化ヘッダファイル(kernel_cfg.h)には,次の定義を生成する.
     135
     136(1) 固定生成部分
     137
     138kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.具
     139体的には,ファイルの先頭に次の行を生成する.
    154140
    155141#ifndef TOPPERS_KERNEL_CFG_H
    156142#define TOPPERS_KERNEL_CFG_H
    157143
    158 ‚Ü‚½Cƒtƒ@ƒCƒ‹‚Ì––”ö‚ÉŽŸ‚̍s‚𐶐¬‚·‚éD
     144また,ファイルの末尾に次の行を生成する.
    159145
    160146#endif  /* TOPPERS_KERNEL_CFG_H */
    161147
    162 (2) ƒIƒuƒWƒFƒNƒg”‚Ì’è‹`
    163 
    164 ƒJ[ƒlƒ‹‚ªƒTƒ|[ƒg‚·‚éƒIƒuƒWƒFƒNƒg‚̐”‚ðƒ}ƒNƒ’è‹`‚·‚éƒvƒŠƒvƒƒZƒbƒTƒfƒB
    165 ƒŒƒNƒeƒBƒui#definej‚𐶐¬‚·‚éD‹ï‘Ì“I‚ɂ́CŽŸ‚̂悤‚È‹Lq‚𐶐¬‚·‚éD
    166 
    167 #define TNUM_TSKID      <ƒ^ƒXƒN‚̐”>
    168 #define TNUM_FLGID      <ƒCƒxƒ“ƒgƒtƒ‰ƒO‚̐”>
    169 #define TNUM_DTQID      <ƒf[ƒ^ƒLƒ
    170 [‚̐”>
    171 #define TNUM_CYCID      <ŽüŠúƒnƒ“ƒhƒ‰‚̐”>
    172 #define TNUM_ALMID      <ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̐”>
    173 
    174 (3) ƒIƒuƒWƒFƒNƒg‚ÌID”ԍ†‚Ì’è‹`
    175 
    176 ƒRƒ“ƒtƒBƒMƒ
    177 ƒŒ[ƒ^‚ªID”ԍ†‚ðŠ„‚è•t‚¯‚½ƒIƒuƒWƒFƒNƒg‚Ì–¼‘O‚ðCŠ„‚è•t‚¯‚½
    178 ID”ԍ†‚Ƀ}ƒNƒ’è‹`‚·‚éƒvƒŠƒvƒƒZƒbƒTƒfƒBƒŒƒNƒeƒBƒui#definej‚𐶐¬‚·‚éD
    179 —Ⴆ‚΁CŽŸ‚̂悤‚È‹Lq‚𐶐¬‚·‚éD
     148(2) オブジェクト数の定義
     149
     150カーネルがサポートするオブジェクトの数をマクロ定義するプリプロセッサディ
     151レクティブ(#define)を生成する.具体的には,次のような記述を生成する.
     152
     153#define TNUM_TSKID      <タスクの数>
     154#define TNUM_FLGID      <イベントフラグの数>
     155#define TNUM_DTQID      <データキューの数>
     156#define TNUM_CYCID      <周期ハンドラの数>
     157#define TNUM_ALMID      <アラームハンドラの数>
     158
     159(3) オブジェクトのID番号の定義
     160
     161コンフィギュレータがID番号を割り付けたオブジェクトの名前を,割り付けた
     162ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
     163例えば,次のような記述を生成する.
    180164
    181165#define TASK1   1
     
    184168
    185169**************************************************************************
    186 SSPƒJ[ƒlƒ‹‚̏ꍇCCRE_TSK ‚É‚¨‚¯‚é‹N“®Žž—Dæ“x‚̍‚‚¢i’l‚Æ‚µ‚Ă͏¬‚³‚¢j
    187 ‡”ԂɁC1‚©‚ç˜A‘±‚µ‚½’l‚ªID”ԍ†‚Æ‚µ‚Ä‚»‚ꂼ‚ê‚̃^ƒXƒN‚ÉŠ„‚è“–‚Ä‚ç‚ê‚éD
     170SSPカーネルの場合,CRE_TSK における起動時優先度の高い(値としては小さい)
     171順番に,1から連続した値がID番号としてそれぞれのタスクに割り当てられる.
    188172**************************************************************************
    189173
    190174
    191 ›ƒJ[ƒlƒ‹\¬E‰Šú‰»ƒtƒ@ƒCƒ‹ikernel_cfg.cj
    192 
    193 (1) ŒÅ’萶¬•”•ª
    194 
    195 kernel_cfg.c—p‚̃wƒbƒ_ƒtƒ@ƒCƒ‹‚ÆIDŽ©“®Š„•t‚¯Œ‹‰Êƒtƒ@ƒCƒ‹‚ðƒCƒ“ƒNƒ‹[ƒh
    196 ‚·‚éƒvƒŠƒvƒƒZƒbƒTƒfƒBƒŒƒNƒeƒBƒui#includej‚𐶐¬‚·‚éD‹ï‘Ì“I‚ɂ́CŽŸ
    197 ‚̍s‚𐶐¬‚·‚éD
     175○カーネル構成・初期化ファイル(kernel_cfg.c)
     176
     177(1) 固定生成部分
     178
     179kernel_cfg.c用のヘッダファイルとID自動割付け結果ファイルをインクルード
     180するプリプロセッサディレクティブ(#include)を生成する.具体的には,次
     181の行を生成する.
    198182
    199183#include "kernel/kernel_int.h"
    200184#include "kernel_cfg.h"
    201185
    202 (2) ƒCƒ“ƒNƒ‹[ƒhƒfƒBƒŒƒNƒeƒBƒui#includej‚̏ˆ—
    203 
    204 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    205 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŠÜ‚Ü‚ê‚éCŒ¾ŒêƒvƒŠƒvƒƒZƒbƒT‚̃C
    206 ƒ“ƒNƒ‹[ƒhƒfƒBƒŒƒNƒeƒBƒui#includej‚Æ“¯ˆê‚̃fƒBƒŒƒNƒeƒBƒui#includej
    207 ‚𐶐¬‚·‚éD—Ⴆ‚΁C
     186(2) インクルードディレクティブ(#include)の処理
     187
     188システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイ
     189ンクルードディレクティブ(#include)と同一のディレクティブ(#include)
     190を生成する.例えば,
    208191
    209192#include "sample1.h"
    210193
    211 ‚Æ‚¢‚¤ƒCƒ“ƒNƒ‹[ƒhƒfƒBƒŒƒNƒeƒBƒu‚ɑ΂µ‚āC
     194というインクルードディレクティブに対して,
    212195
    213196#include "sample1.h"
    214197
    215 ‚Æ‚¢‚¤ƒfƒBƒŒƒNƒeƒBƒu‚𐶐¬‚·‚éD¶¬‚·‚éƒfƒBƒŒƒNƒeƒBƒu‚̏‡˜‚́CƒVƒXƒe
    216 ƒ€ƒRƒ“ƒtƒBƒMƒ
    217 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ł̃Cƒ“ƒNƒ‹[ƒhƒfƒBƒŒƒNƒeƒBƒu‚̏‡˜
    218 ‚Ɉê’v‚³‚¹‚éD
    219 
    220 (3) ƒIƒuƒWƒFƒNƒg‚ÌID”ԍ†‚ð•ÛŽ‚·‚é•Ï”‚Ì’è‹`
    221 
    222 ƒRƒ“ƒtƒBƒMƒ
    223 ƒŒ[ƒ^‚ɑ΂·‚éƒIƒvƒVƒ‡ƒ“Žw’èi--external-idj‚É‚æ‚èCƒRƒ“ƒtƒB
    224 ƒMƒ
    225 ƒŒ[ƒ^‚͕ϐ”‚𐶐¬‚·‚éD•Ï”–¼‚Í ID ”ԍ†‚ðŠ„‚è•t‚¯‚½ƒIƒuƒWƒFƒNƒg–¼
    226 ‚Ì––”ö‚É "_id" ‚ð•t‰Á‚µ‚½–¼Ì‚Æ‚·‚éD•Ï”‚ÌŒ^‚́Cconst‘®«‚ð•t‰Á‚µ‚½IDŒ^
    227 ‚Æ‚µC•Ï”‚Ì’l‚ÍŠ„‚è•t‚¯‚½ID”ԍ†‚Æ‚·‚éD—Ⴆ‚΁CŽŸ‚̂悤‚È‹Lq‚𐶐¬‚·‚éD
     198というディレクティブを生成する.生成するディレクティブの順序は,システ
     199ムコンフィギュレーションファイル中でのインクルードディレクティブの順序
     200に一致させる.
     201
     202(3) オブジェクトのID番号を保持する変数の定義
     203
     204コンフィギュレータに対するオプション指定(--external-id)により,コンフィ
     205ギュレータは変数を生成する.変数名は ID 番号を割り付けたオブジェクト名
     206の末尾に "_id" を付加した名称とする.変数の型は,const属性を付加したID型
     207とし,変数の値は割り付けたID番号とする.例えば,次のような記述を生成する.
    228208
    229209const ID TASK1_id = 1;
     
    231211const ID ALM1_id = 1;
    232212
    233 (4) ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
    234 
    235 kernel_cfg.c‚Ì’†‚ÅŽg—p‚·‚éƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`‚𐶐¬‚·‚éD
    236 ‹ï‘Ì“I‚ɂ́CŽŸ‚̍s‚𐶐¬‚·‚éD
     213(4) トレースログマクロのデフォルト定義
     214
     215kernel_cfg.cの中で使用するトレースログマクロのデフォルト定義を生成する.
     216具体的には,次の行を生成する.
    237217
    238218#ifndef LOG_ISR_ENTER
     
    245225
    246226
    247 (5) ŠeƒJ[ƒlƒ‹ƒIƒuƒWƒFƒNƒg‚ÉŠÖ‚·‚é’è‹`
    248 
    249 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    250 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ɁCƒIƒuƒWƒFƒNƒg‚𐶐¬‚·‚éÃ“I
    251 APIuCRE_XXXv‚ªŠÜ‚Ü‚ê‚éŠeƒJ[ƒlƒ‹ƒIƒuƒWƒFƒNƒg‚ÉŠÖ‚µ‚āCƒIƒuƒWƒFƒNƒg¶
    252 ¬‚Ì‚½‚ß‚Ì’è‹`‚𐶐¬‚·‚éD
    253 
    254 ƒRƒ“ƒtƒBƒMƒ
    255 ƒŒ[ƒ^‚́C“¯‚¶Ží—ނ̃IƒuƒWƒFƒNƒg‚𐶐¬‚·‚éÃ“IAPI‚ðW‚߁CŠe
    256 ƒIƒuƒWƒFƒNƒg‚ÉID”ԍ†‚ðŠ„‚è•t‚¯‚éDID”ԍ†‚́C‘¼‚̃IƒuƒWƒFƒNƒg‚ÌID”ԍ†‚Æ
    257 d•¡‚ª‚È‚­CID”ԍ†‚ª˜A‘±‚·‚é‚悤‚ÉŠ„‚è•t‚¯‚éD
    258 
    259 ƒRƒ“ƒtƒBƒMƒ
    260 ƒŒ[ƒ^‚́CƒIƒuƒWƒFƒNƒg‚ÉŠ„‚è•t‚¯‚éID”ԍ†‚ðŽw’è‚·‚邽‚ß‚Ì
    261 ƒIƒvƒVƒ‡ƒ“i--id-input-filej•À‚Ñ‚É ID”ԍ†‚ðŠ„‚è•t‚¯‚½ƒIƒuƒWƒFƒNƒg‚Ì–¼‘O
    262 ‚¨‚æ‚ÑŠ„‚è•t‚¯‚½ID”ԍ†‚Ì‘g‚ðƒtƒ@ƒCƒ‹‚ɏo—Í‚·‚邽‚߂̃IƒvƒVƒ‡ƒ“
    263 i--id-output-filej‚ðŽ‚ÂD‚µ‚©‚µCSSPƒJ[ƒlƒ‹‚Å‚Í‚±‚ê‚ç‚̃IƒvƒVƒ‡ƒ“‚Ì
    264 Žg—p‚ðŒ´‘¥‚Æ‚µ‚Ä ***‹ÖŽ~*** ‚·‚éi——R‚ÍŒãqjD
     227(5) 各カーネルオブジェクトに関する定義
     228
     229システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
     230API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
     231成のための定義を生成する.
     232
     233コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,各
     234オブジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と
     235重複がなく,ID番号が連続するように割り付ける.
     236
     237コンフィギュレータは,オブジェクトに割り付けるID番号を指定するための
     238オプション(--id-input-file)並びに ID番号を割り付けたオブジェクトの名前
     239および割り付けたID番号の組をファイルに出力するためのオプション
     240(--id-output-file)を持つ.しかし,SSPカーネルではこれらのオプションの
     241使用を原則として ***禁止*** する(理由は後述).
    265242
    266243**************************************************************************
    267 y——Rz
    268 SSPƒJ[ƒlƒ‹‚̏ꍇCuƒ^ƒXƒNID‚̏ꍇ‚ÉŒÀ‚èvƒRƒ“ƒtƒBƒMƒ
    269 ƒŒ[ƒ^‚Í
    270 --id-input-file ‚ÌŽw’è“à—e‚𖳎‹‚·‚éD‚»‚ê‚́CCRE_TSK‚ÅŽw’肵‚½‹N“®Žž—Dæ
    271 “x‚̐ݒè’l‚ª—Dæ‚³‚ê‚邽‚ß‚Å‚ ‚éD‚Ü‚½C--id-output-file ‚ÅŽw’肵‚½ƒtƒ@ƒC
    272 ƒ‹‚ւ̏o—Í“à—e‚à --id-input-file ‚ÅŽw’肵‚½ƒ^ƒXƒNID‚Ì’l‚ª‚»‚̂܂܏o—Í‚³‚ê
    273 ‚éD‚»‚̏o—Í“à—e‚Í kernel_cfg.h ‚֏o—Í‚³‚ê‚éƒ^ƒXƒNID‚Ì’l‚Æ‚Í–³ŠÖŒW‚Å‚ ‚éD
    274 ]‚Á‚āC¬—‚ª¶‚¶‚é‹°‚ꂪ‚ ‚邱‚Æ‚©‚çCSSPƒJ[ƒlƒ‹‚Å‚Í --id-input-file
    275 ‚¨‚æ‚Ñ --id-output-file ƒIƒvƒVƒ‡ƒ“‚ðŽw’肵‚Ä‚Í‚È‚ç‚È‚¢D
    276 
    277 –{—ˆ‚È‚ç‚΁C--kernel=ssp ‚¨‚æ‚Ñ --id-input-file ‚𓯎ž‚ÉŽw’肵‚½ê‡‚É
    278 ƒRƒ“ƒtƒBƒMƒ
    279 ƒŒ[ƒVƒ‡ƒ“ƒGƒ‰[‚Æ‚·‚ׂ«‚Æ‚±‚ë‚Å‚ ‚éD‚µ‚©‚µC‚±‚ê‚ç‚̃IƒvƒVƒ‡
    280 ƒ“‚ɑ΂·‚鏈—‚Í‘S‚ăRƒ“ƒtƒBƒMƒ
    281 ƒŒ[ƒ^“à•”‚ÅŽÀŽ{‚³‚êCƒeƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹
    282 (kernel.tf)‚ł͏ˆ—‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢DŒ»Žž“_‚ł̓Rƒ“ƒtƒBƒMƒ
    283 ƒŒ[ƒ^‚̑Ήž
    284 ‚ɂ‚¢‚Ä–¢’è‚Å‚ ‚邽‚ߎb’è“I‚É‚±‚̂悤‚Ȉµ‚¢‚Æ‚µ‚Ä‚¢‚éD
     244【理由】
     245SSPカーネルの場合,「タスクIDの場合に限り」コンフィギュレータは
     246--id-input-file の指定内容を無視する.それは,CRE_TSKで指定した起動時優先
     247度の設定値が優先されるためである.また,--id-output-file で指定したファイ
     248ルへの出力内容も --id-input-file で指定したタスクIDの値がそのまま出力され
     249る.その出力内容は kernel_cfg.h へ出力されるタスクIDの値とは無関係である.
     250従って,混乱が生じる恐れがあることから,SSPカーネルでは --id-input-file
     251および --id-output-file オプションを指定してはならない.
     252
     253本来ならば,--kernel=ssp および --id-input-file を同時に指定した場合に
     254コンフィギュレーションエラーとすべきところである.しかし,これらのオプショ
     255ンに対する処理は全てコンフィギュレータ内部で実施され,テンプレートファイル
     256(kernel.tf)では処理することができない.現時点ではコンフィギュレータの対応
     257について未定であるため暫定的にこのような扱いとしている.
    285258**************************************************************************
    286259
    287 ŠeƒJ[ƒlƒ‹ƒIƒuƒWƒFƒNƒg‚ÉŠÖ‚·‚é’è‹`‚Ì•W€“I‚ȍ\¬‚́CŽŸ‚Ì’Ê‚è‚Å‚ ‚éDƒI
    288 ƒuƒWƒFƒNƒg‚É‚æ‚Á‚Ä—áŠO‚ª‚ ‚éê‡‚ɂ́CƒIƒuƒWƒFƒNƒg–ˆ‚̍€‚Åà–¾‚·‚éD
    289 
    290 (a) Å‘å‚̃IƒuƒWƒFƒNƒgID‚̕ϐ”‚Ì’è‹`
    291 
    292 Å‘å‚̃IƒuƒWƒFƒNƒgID‚ðŽ‚Â•Ï”‚Ì’è‹`‚𐶐¬‚·‚éD‹ï‘Ì“I‚ɂ́CƒIƒuƒWƒFƒN
    293 ƒg‚̏ȗª‹L†‚ðuXXX^xxxv‚Æ‚·‚é‚ƁCŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
     260各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
     261ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する.
     262
     263(a) 最大のオブジェクトIDの変数の定義
     264
     265最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク
     266トの省略記号を「XXX/xxx」とすると,次のような行を生成する.
    294267
    295268const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
    296269
    297 (b) ƒIƒuƒWƒFƒNƒg‚É•K—v‚ȃƒ‚ƒŠ—̈æ‚Ì’è‹`
    298 
    299 ƒIƒuƒWƒFƒNƒg‚É‚æ‚Á‚ẮCƒIƒuƒWƒFƒNƒg‚É•K—v‚ȃƒ‚ƒŠ—̈æ‚Ì’è‹`‚𐶐¬‚·‚éD
    300 ‹ï‘Ì“I‚ɂ́CƒIƒuƒWƒFƒNƒg–ˆ‚̍€‚Åà–¾‚·‚éD
    301 
    302 (c) ƒIƒuƒWƒFƒNƒg‚̏‰Šú‰»ƒuƒƒbƒN‚Ì’è‹`
    303 
    304 ƒIƒuƒWƒFƒNƒg‚̏‰Šú‰»ƒuƒƒbƒN‚Ì’è‹`‚𐶐¬‚·‚éD‹ï‘Ì“I‚ɂ́C
    305         EƒIƒuƒWƒFƒNƒg‚̏ȗª‹L†‚ðuXXX^xxxv
    306         E‘®«€–ڂ̃f[ƒ^Œ^‚ðuYYYv
    307         E‘®«€–Ú‚Ì–¼Ì‚ðuzzzv
    308 ‚Æ‚·‚é‚ƁCƒIƒuƒWƒFƒNƒg‚Ì‘®«€–Ú–ˆ‚ÉŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
     270(b) オブジェクトに必要なメモリ領域の定義
     271
     272オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する.
     273具体的には,オブジェクト毎の項で説明する.
     274
     275(c) オブジェクトの初期化ブロックの定義
     276
     277オブジェクトの初期化ブロックの定義を生成する.具体的には,
     278        ・オブジェクトの省略記号を「XXX/xxx」
     279        ・属性項目のデータ型を「YYY」
     280        ・属性項目の名称を「zzz」
     281とすると,オブジェクトの属性項目毎に次のような行を生成する.
    309282
    310283const YYY _kernel_xxxinib_zzz[TNUM_XXXID] = {
    311         <ƒIƒuƒWƒFƒNƒgID‚ª1‚̃IƒuƒWƒFƒNƒg‚ɑ΂·‚é zzz ‚̏‰Šú‰»î•ñ>,
    312         <ƒIƒuƒWƒFƒNƒgID‚ª2‚̃IƒuƒWƒFƒNƒg‚ɑ΂·‚é zzz ‚̏‰Šú‰»î•ñ>,
    313                                 cc
    314         <ƒIƒuƒWƒFƒNƒgID‚ªTNUM_XXXID‚̃IƒuƒWƒFƒNƒg‚ɑ΂·‚é zzz ‚̏‰Šú‰»î•ñ>,
     284        <オブジェクトIDが1のオブジェクトに対する zzz の初期化情報>,
     285        <オブジェクトIDが2のオブジェクトに対する zzz の初期化情報>,
     286                                ……
     287        <オブジェクトIDがTNUM_XXXIDのオブジェクトに対する zzz の初期化情報>,
    315288};
    316289
    317 ƒIƒuƒWƒFƒNƒg‚̏‰Šú‰»î•ñ‚ÌŒ`Ž®‚́CƒIƒuƒWƒFƒNƒg‚¨‚æ‚Ñ‘®«€–Ú–ˆ‚ɈقȂéD
    318 ‹ï‘Ì“I‚ɂ̓IƒuƒWƒFƒNƒg–ˆ‚̍€‚Åà–¾‚·‚éD
    319 
    320 (d) ƒIƒuƒWƒFƒNƒg‚̃Rƒ“ƒgƒ[ƒ‹ƒuƒƒbƒN‚Ì’è‹`
    321 
    322 ƒIƒuƒWƒFƒNƒg‚̃Rƒ“ƒgƒ[ƒ‹ƒuƒƒbƒN‚Ì’è‹`‚𐶐¬‚·‚éD‹ï‘Ì“I‚ɂ́C
    323         EƒIƒuƒWƒFƒNƒg‚̏ȗª‹L†‚ðuXXX^xxxv
    324         E‘®«€–ڂ̃f[ƒ^Œ^‚ðuYYYv
    325         E‘®«€–Ú‚Ì–¼Ì‚ðuzzzv
    326 ‚Æ‚·‚é‚ƁCƒIƒuƒWƒFƒNƒg‚Ì‘®«€–Ú–ˆ‚ÉŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
     290オブジェクトの初期化情報の形式は,オブジェクトおよび属性項目毎に異なる.
     291具体的にはオブジェクト毎の項で説明する.
     292
     293(d) オブジェクトのコントロールブロックの定義
     294
     295オブジェクトのコントロールブロックの定義を生成する.具体的には,
     296        ・オブジェクトの省略記号を「XXX/xxx」
     297        ・属性項目のデータ型を「YYY」
     298        ・属性項目の名称を「zzz」
     299とすると,オブジェクトの属性項目毎に次のような行を生成する.
    327300
    328301YYY _kernel_xxxcb_zzz[TNUM_XXXID];
    329302
    330 ƒIƒuƒWƒFƒNƒg‚̃Rƒ“ƒgƒ[ƒ‹ƒuƒƒbƒN‚ÌŒ`Ž®‚́CƒIƒuƒWƒFƒNƒg‚¨‚æ‚Ñ‘®«€–Ú–ˆ‚ɈقȂéD
    331 ‹ï‘Ì“I‚ɂ̓IƒuƒWƒFƒNƒg–ˆ‚̍€‚Åà–¾‚·‚éD
    332 
    333 
    334 (5-1) ƒ^ƒXƒN‚ÉŠÖ‚·‚é’è‹`
    335 
    336 SSPƒJ[ƒlƒ‹‚́Cƒ^ƒXƒN‚ªˆê‚‚à‚È‚¢ƒP[ƒX‚ɑΉž‚µ‚Ä‚¢‚È‚¢‚½‚߁Cƒ^ƒXƒN‚ÉŠÖ‚·‚é
    337 ’è‹`‚Í•K‚¸¶¬‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    338 
    339 ƒ^ƒXƒN‚̏ȗª‹L†‚́uTSKvutskv‚Å‚ ‚éD
    340 ‚½‚¾‚µCƒ^ƒXƒN‰Šú‰»ƒuƒƒbƒN‚̕ϐ”–¼‚Í _kernel_tinib_<‘®«€–Ú–¼> ‚Å‚ ‚éD
    341 iuTSK^tskv‚ɑウ‚āuT^tv‚ð—p‚¢‚Ä‚¢‚éjD
    342 ƒ^ƒXƒNƒRƒ“ƒgƒ[ƒ‹ƒuƒƒbƒN‚Í‘¶Ý‚µ‚È‚¢D
    343 
    344 ƒ^ƒXƒN‰Šú‰»ƒuƒƒbƒN‚ɂ́CuCRE_TSKvÃ“IAPI‚ÅŽw’肳‚ê‚éî•ñ‚ɉÁ‚¦‚āC
    345 uDEF_EPRvÃ“IAPI‚ÅŽw’肳‚ê‚éî•ñ‚ðŠÜ‚ß‚éD
    346 
    347 ˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    348 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê‚Ä
    349 ‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚ɂ‚¢‚ďq‚ׂéD
     303オブジェクトのコントロールブロックの形式は,オブジェクトおよび属性項目毎に異なる.
     304具体的にはオブジェクト毎の項で説明する.
     305
     306
     307(5-1) タスクに関する定義
     308
     309SSPカーネルは,タスクが一つもないケースに対応していないため,タスクに関する
     310定義は必ず生成しなければならない.
     311
     312タスクの省略記号は「TSK」「tsk」である.
     313ただし,タスク初期化ブロックの変数名は _kernel_tinib_<属性項目名> である.
     314(「TSK/tsk」に代えて「T/t」を用いている).
     315タスクコントロールブロックは存在しない.
     316
     317タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて,
     318「DEF_EPR」静的APIで指定される情報を含める.
     319
     320以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
     321いる時に生成すべき情報について述べる.
    350322
    351323CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
    352324DEF_EPR(tskid, { exepri });
    353325
    354 ¦ ˆÈ~‚̏‰Šú‰»î•ñ‚Ì”z—ñ‚ÉŠi”[‚³‚ê‚鏇˜‚́C‹N“®Žž—Dæ“x‚̍‚‚¢‡‚Æ‚È‚éD
    355 ¦ ‚È‚º‚È‚çCƒ^ƒXƒNID ‚ª‹N“®Žž—Dæ“x‚̍‚‚¢‡”Ô‚ÅŠ„‚è“–‚Ä‚ç‚ê‚é‚©‚ç‚Å‚ ‚éD
    356 
    357 (5-1-1) ƒ^ƒXƒN‚̏‰Šú‰»î•ñiƒ^ƒXƒN‘®«j
    358 
    359 ƒ^ƒXƒN‘®«‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     326※ 以降の初期化情報の配列に格納される順序は,起動時優先度の高い順となる.
     327※ なぜなら,タスクID が起動時優先度の高い順番で割り当てられるからである.
     328
     329(5-1-1) タスクの初期化情報(タスク属性)
     330
     331タスク属性の初期化情報は,次の形式とする.
    360332
    361333const ATR _kernel_tinib_tskatr[TNUM_TSKID] = {(tskatr)};
    362334
    363 (5-1-2) ƒ^ƒXƒN‚̏‰Šú‰»î•ñiŠg’£î•ñj
    364 
    365 ƒ^ƒXƒN‚ÌŠg’£î•ñ‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     335(5-1-2) タスクの初期化情報(拡張情報)
     336
     337タスクの拡張情報の初期化情報は,次の形式とする.
    366338
    367339const intptr_t _kernel_tinib_exinf[TNUM_TSKID] = {(intptr_t)(exinf)};
    368340
    369 (5-1-3) ƒ^ƒXƒN‚̏‰Šú‰»î•ñi‹N“®”Ô’nj
    370 
    371 ƒ^ƒXƒN‚Ì‹N“®”Ô’n‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     341(5-1-3) タスクの初期化情報(起動番地)
     342
     343タスクの起動番地の初期化情報は,次の形式とする.
    372344
    373345const TASK _kernel_tinib_task[TNUM_TSKID] = {(task)};
    374346
    375 (5-1-4) ƒ^ƒXƒN‚̏‰Šú‰»î•ñiŽÀsŽž—Dæ“xj
    376 
    377 ƒ^ƒXƒN‚ÌŽÀsŽž—Dæ“x‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
    378 iŽÀÛ‚ɂ͉üs‚³‚ꂸC1s‚ŏo—Í‚³‚ê‚éj
     347(5-1-4) タスクの初期化情報(実行時優先度)
     348
     349タスクの実行時優先度の初期化情報は,次の形式とする.
     350(実際には改行されず,1行で出力される)
    379351
    380352const TASK _kernel_tinib_epriority[TNUM_TSKID] = {
    381         INT_PRIORITY(ŽÀsŽž—Dæ“x)};
    382 
    383 ŽÀsŽž—Dæ“x‚Ì’l‚Í CRE_TSK ‚Ì‹N“®Žž—Dæ“x(itskpri) ‚¨‚æ‚Ñ
    384 DEF_EPR ‚ÌŽÀsŽž—Dæ“x(exepri) ‚̐ݒè’l‚ðŒ³‚ÉŽZo‚³‚ê‚éD
    385 ŽZo•û–@‚ɂ‚¢‚Ä‚Í(5-1-6)‚ÉŒãq‚·‚éD
    386 
    387 (5-1-5) ready_primap ‚̏‰Šú’l‚Ì’è‹`
    388 
    389 ƒ^ƒXƒN‚ɑ΂µ‚ẮCƒrƒbƒgƒ}ƒbƒv ready_primap ‚̏‰Šú’lî•ñ‚𐶐¬‚·‚éD
    390 ƒ^ƒXƒN‘®«‚̐ݒè’l‚©‚çˆêˆÓ‚É’è‚߂邱‚Æ‚ª‚Å‚«‚é‚©‚ç‚Å‚ ‚éD
    391 
    392 ‹ï‘Ì“I‚ɂ͈ȉº‚̂悤‚È’è‹`‚𐶐¬‚·‚éD
    393 
    394 const uint_t _kernel_init_rdypri = <ready_primap‚̏‰Šú’l>;
    395 
    396 ‚±‚±‚Å ready_primap ‚̏‰Šú’l‚́Cƒ^ƒXƒN‘®«(tskatr)‚Ì’l‚©‚çŽZo‚³‚ê‚éD
    397 
    398 •Ï” _kernel_init_rdypri ‚ÌŠeƒrƒbƒg‚Í‚»‚ꂼ‚ê‚̃^ƒXƒN‚ɑΉž‚·‚éD
    399 ƒ^ƒXƒNID‚ª1‚̃^ƒXƒN‚͍ʼnºˆÊƒrƒbƒg(LSB)‚ɑΉž‚¯‚ç‚ê‚Ä‚¨‚èC
    400 ƒ^ƒXƒNID‚Ì’l‚ª1‚‘‚¦‚é–ˆ‚É1‚‚ˆÊ‚̃rƒbƒg‚ª‚»‚ꂼ‚ê‘Ήž‚¯‚ç‚ê‚éD
    401 —Ⴆ‚΁Cƒ^ƒXƒNID‚ª4‚̃^ƒXƒN‚͍ʼnºˆÊ‚©‚琔‚¦‚Ä4”Ԗڂ̃rƒbƒg‚ª‘Ήž‚·‚éD
    402 
    403 ƒ^ƒXƒN‘®«‚Æ‚µ‚Ä TA_ACT ‚ðŽ‚Âƒ^ƒXƒN‚́C‚»‚̃^ƒXƒN‚ɑΉž‚·‚éƒrƒbƒg‚ª
    404 1‚É‚È‚éDTA_ACT ‚ðŽ‚½‚È‚¢ê‡‚͑Ήž‚·‚éƒrƒbƒg‚ª0‚É‚È‚éD
    405 
    406 (5-1-6) —Dæ“x‚Ì•\Œ»
    407 
    408 —Dæ“x‚Ì’l‚́CƒRƒ“ƒtƒBƒMƒ
    409 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚Ì CRE_TSK ‹y‚Ñ DEF_EPR ‚É‚Ä
    410 Žw’肵‚½’l‚ðŒ³‚ÉCƒRƒ“ƒtƒBƒMƒ
    411 ƒŒ[ƒ^‚ªŽ©“®“I‚ÉŠ„‚è“–‚Ä‚éD
    412 ’l‚Ì”ÍˆÍ‚Í TMIN_TPRI(=1) ‚©‚ç TMAX_TPRI ‚͈̔͂̒l‚ð‚Æ‚éD
    413 
    414 ‚Ü‚½CƒRƒ“ƒtƒBƒMƒ
    415 ƒŒ[ƒ^‚É‚æ‚芄‚è“–‚Ä‚ç‚ê‚é—Dæ“x‚Ì’l‚Ƃ͕ʂɁCˆ—Œø—¦‚Ì
    416 ŠÏ“_‚©‚çƒvƒƒOƒ‰ƒ€’†‚ÅŽg—p‚³‚ê‚é—Dæ“x‚Ì“à•”•\Œ»‚ª‚ ‚éD
    417 “à•”•\Œ»‚Ì’l‚Í 0 ‚©‚ç (TMAX_TPRI-TMIN_TPRI) ‚͈̔͂̒l‚ð‚Æ‚éD
    418 —Dæ“x‚Æ‚»‚Ì“à•”•\Œ»‚Æ‚ÌŠÔ‚É‚Í (“à•”•\Œ» = —Dæ“x - TMIN_TPRI)‚ÌŠÖŒW‚ª‚ ‚éD
    419 
    420 ƒ^ƒXƒN‚Ì‹N“®Žž—Dæ“x‚́CCRE_TSK ‚ÅŽw’肵‚½‹N“®Žž—Dæ“x‚̍‚‚¢‡‚Ɂi’l‚Æ‚µ‚Ä‚Í
    421 ¬‚³‚¢‡‚ɁjCTMIN_TPRI(=1) ‚©‚ç‚Í‚¶‚Ü‚é˜A‘±‚µ‚½’l‚ªŠ„‚è“–‚Ä‚ç‚ê‚éD
    422 ‚‚܂èCƒ^ƒXƒN‚Ì‹N“®Žž—Dæ“x‚Ì’l‚̓^ƒXƒNID ‚É“™‚µ‚¢D
    423 
    424 ƒ^ƒXƒN‚ÌŽÀsŽž—Dæ“x‚Ì’l‚́CˆÈ‰º‚Ì•û–@‚ÅŽZo‚³‚ê‚éD
    425 
    426 i‚Pj“–ŠYƒ^ƒXƒN‚ɑ΂µ DEF_EPR ‚ÅŽÀsŽž—Dæ“x‚ð’è‹`‚µ‚È‚¢ê‡
    427 
    428 “–ŠYƒ^ƒXƒN‚ɑ΂µ DEF_EPR ‚ÅŽÀsŽž—Dæ“x‚ð’è‹`‚µ‚È‚¢ê‡C
    429 ‹N“®Žž—Dæ“x‚Ì’l‚Æ“¯‚¶’l‚ðŽÀsŽž—Dæ“x‚Ì’l‚Æ‚·‚éD
    430 
    431 i‚Qj“–ŠYƒ^ƒXƒN‚ɑ΂µ DEF_EPR ‚ÅŽÀsŽž—Dæ“x‚ð’è‹`‚·‚éê‡
    432 
    433 “–ŠYƒ^ƒXƒN‚ɑ΂µ DEF_EPR ‚ÅŽÀsŽž—Dæ“x‚ð’è‹`‚µ‚½ê‡C
    434 DEF_EPR ‚ÅŽw’肵‚½ŽÀsŽž—Dæ“x‚̐ݒè’lC•À‚тɁC‘S‚Ẵ^ƒXƒN‚ɑ΂·‚é
    435 ‹N“®Žž—Dæ“x‚̐ݒè’l‚¨‚æ‚уRƒ“ƒtƒBƒMƒ
    436 ƒŒ[ƒVƒ‡ƒ“Œ‹‰Ê‚Æ‚µ‚Ä“¾‚ç‚ê‚é‹N“®Žž—Dæ“x
    437 ‚Ì’l‚ð‚à‚ƂɁCŽÀsŽž—Dæ“x‚Ì’l‚ðŽZo‚·‚éD
    438 
    439 ŽÀsŽž—Dæ“x‚Ì’l‚ðŽZo‚·‚é•û–@‚́CuŽÀs’†‚̃^ƒXƒN‚ªƒvƒŠƒGƒ“ƒvƒg‚³‚ê‚é/‚³‚ê‚È‚¢v
    440 ‚Æ‚¢‚¤ŠÖŒW‚ª•Û‘¶‚³‚ê‚é”͈͂œKØ‚È’l‚ªŽZo‚³‚ê‚邱‚Æ‚ðˆÓ}‚µ‚½‚à‚̂ŁC
    441 ‹ï‘Ì“I‚Ȏ菇‚ÍŽŸ‚̂悤‚É‚È‚éD
    442 
    443 yŽÀsŽž—Dæ“x‚ÌŽZoŽè‡ ¦‚±‚ê‚ð‘S‚Ẵ^ƒXƒN‚ɑ΂µ‚čs‚¤z
    444 
    445 (1) ‚ ‚éƒ^ƒXƒN‚ð‘I‚Ô(T1‚Æ‚·‚é)
    446 (2) T1 ‚ÌŽÀsŽž—Dæ“x‚̐ݒè’l‚Æ“¯‚¶C‚Ü‚½‚́C‚»‚ê‚æ‚è‚à’á‚¢(’l‚Æ‚µ‚Ä‚Í
    447 ‘å‚«‚¢)‹N“®Žž—Dæ“x‚̐ݒè’l‚ðŽ‚Âƒ^ƒXƒN‚̏W‡‚Ì’†‚ŁC‹N“®Žž—Dæ“x‚Ì
    448 Ý’è’l‚ªÅ‚à‚‚¢i’l‚Æ‚µ‚Ä‚ÍÅ‚à¬‚³‚¢jƒ^ƒXƒN‚ð’T‚·(T2)
    449 (3) T2 ‚Ì‹N“®Žž—Dæ“x‚Ì’l‚ð T1 ‚ÌŽÀsŽž—Dæ“x‚Ì’l‚Æ‚·‚éD
    450 
    451 —áj
     353        INT_PRIORITY(実行時優先度)};
     354
     355実行時優先度の値は CRE_TSK の起動時優先度(itskpri) および
     356DEF_EPR の実行時優先度(exepri) の設定値を元に算出される.
     357算出方法については(5-1-6)に後述する.
     358
     359(5-1-5) ready_primap の初期値の定義
     360
     361タスクに対しては,ビットマップ ready_primap の初期値情報を生成する.
     362タスク属性の設定値から一意に定めることができるからである.
     363
     364具体的には以下のような定義を生成する.
     365
     366const uint_t _kernel_init_rdypri = <ready_primapの初期値>;
     367
     368ここで ready_primap の初期値は,タスク属性(tskatr)の値から算出される.
     369
     370変数 _kernel_init_rdypri の各ビットはそれぞれのタスクに対応する.
     371タスクIDが1のタスクは最下位ビット(LSB)に対応づけられており,
     372タスクIDの値が1つ増える毎に1つ高位のビットがそれぞれ対応づけられる.
     373例えば,タスクIDが4のタスクは最下位から数えて4番目のビットが対応する.
     374
     375タスク属性として TA_ACT を持つタスクは,そのタスクに対応するビットが
     3761になる.TA_ACT を持たない場合は対応するビットが0になる.
     377
     378(5-1-6) 優先度の表現
     379
     380優先度の値は,コンフィギュレーションファイルの CRE_TSK 及び DEF_EPR にて
     381指定した値を元に,コンフィギュレータが自動的に割り当てる.
     382値の範囲は TMIN_TPRI(=1) から TMAX_TPRI の範囲の値をとる.
     383
     384また,コンフィギュレータにより割り当てられる優先度の値とは別に,処理効率の
     385観点からプログラム中で使用される優先度の内部表現がある.
     386内部表現の値は 0 から (TMAX_TPRI-TMIN_TPRI) の範囲の値をとる.
     387優先度とその内部表現との間には (内部表現 = 優先度 - TMIN_TPRI)の関係がある.
     388
     389タスクの起動時優先度は,CRE_TSK で指定した起動時優先度の高い順に(値としては
     390小さい順に),TMIN_TPRI(=1) からはじまる連続した値が割り当てられる.
     391つまり,タスクの起動時優先度の値はタスクID に等しい.
     392
     393タスクの実行時優先度の値は,以下の方法で算出される.
     394
     395(1)当該タスクに対し DEF_EPR で実行時優先度を定義しない場合
     396
     397当該タスクに対し DEF_EPR で実行時優先度を定義しない場合,
     398起動時優先度の値と同じ値を実行時優先度の値とする.
     399
     400(2)当該タスクに対し DEF_EPR で実行時優先度を定義する場合
     401
     402当該タスクに対し DEF_EPR で実行時優先度を定義した場合,
     403DEF_EPR で指定した実行時優先度の設定値,並びに,全てのタスクに対する
     404起動時優先度の設定値およびコンフィギュレーション結果として得られる起動時優先度
     405の値をもとに,実行時優先度の値を算出する.
     406
     407実行時優先度の値を算出する方法は,「実行中のタスクがプリエンプトされる/されない」
     408という関係が保存される範囲で適切な値が算出されることを意図したもので,
     409具体的な手順は次のようになる.
     410
     411【実行時優先度の算出手順 ※これを全てのタスクに対して行う】
     412
     413(1) あるタスクを選ぶ(T1とする)
     414(2) T1 の実行時優先度の設定値と同じ,または,それよりも低い(値としては
     415大きい)起動時優先度の設定値を持つタスクの集合の中で,起動時優先度の
     416設定値が最も高い(値としては最も小さい)タスクを探す(T2)
     417(3) T2 の起動時優先度の値を T1 の実行時優先度の値とする.
     418
     419例)
    452420CRE_TSK(TASK1, { TA_NULL, 1, task1, 2, 10, NULL });
    453421CRE_TSK(TASK2, { TA_NULL, 3, task2, 6, 30, NULL });
     
    460428DEF_IPR(TASK4, { 4 } );
    461429
    462 Œ‹‰Ê‚ÍŽŸ‚̂悤‚É‚È‚éF
    463 
    464 y‹N“®Žž—Dæ“xz
    465         TASK1FÝ’è’l=2 ¨ (Š„‚è“–‚Ä‚ç‚ê‚é)‹N“®Žž—Dæ“x=1
    466         TASK2FÝ’è’l=6 ¨ (Š„‚è“–‚Ä‚ç‚ê‚é)‹N“®Žž—Dæ“x=3
    467         TASK3FÝ’è’l=4 ¨ (Š„‚è“–‚Ä‚ç‚ê‚é)‹N“®Žž—Dæ“x=2
    468         TASK4FÝ’è’l=8 ¨ (Š„‚è“–‚Ä‚ç‚ê‚é)‹N“®Žž—Dæ“x=4
    469 
    470         ‹N“®Žž—Dæ“x‚̍‚‚¢‡‚É•À‚Ñ‘Ö‚¦‚é‚Æ
    471         TASK1FÝ’è’l=2 ¨ ‹N“®Žž—Dæ“x=1
    472         TASK3FÝ’è’l=4 ¨ ‹N“®Žž—Dæ“x=2
    473         TASK2FÝ’è’l=6 ¨ ‹N“®Žž—Dæ“x=3
    474         TASK4FÝ’è’l=8 ¨ ‹N“®Žž—Dæ“x=4
    475 
    476 yŽÀsŽž—Dæ“xz
    477         TASK1FÝ’è’l=1
    478         TASK3FÝ’è’l=3
    479         TASK2FÝ’è’l=5
    480         TASK4FÝ’è’l=4
    481 
    482 E‚½‚ß‚µ‚É TASK4 ‚̏ꍇ‚ÌŽÀsŽž—Dæ“x‚Ì’l‚ðŽZo‚µ‚Ä‚Ý‚éD
    483         ETASK4 ‚ÌŽÀsŽž—Dæ“x‚̐ݒè’l(4)‚Æ“¯‚¶‚Ü‚½‚Í‚»‚ê‚æ‚è‚à’á‚¢‹N“®Žž
    484         @—Dæ“x‚̐ݒè’l‚ð‚à‚ƒ^ƒXƒN‚̏W‡ = {TASK2,TASK3,TASK4}
    485         Eã‹Lƒ^ƒXƒN‚̏W‡‚Ì’†‚ōłà‹N“®Žž—Dæ“x‚̐ݒè’l‚ª‚‚¢‚à‚Ì = TASK3
    486         Eã‹Lƒ^ƒXƒN‚Ì‹N“®Žž—Dæ“x‚Ì’l = 2
    487         E]‚Á‚ÄTASK4 ‚ÌŽÀsŽž—Dæ“x‚Ì’l‚Í 2
    488 
    489 E“¯—l‚ɁCTASK3 ‚̏ꍇ‚́D
    490         ETASK3 ‚ÌŽÀsŽž—Dæ“x‚̐ݒè’l(3)‚Æ“¯‚¶‚Ü‚½‚Í‚»‚ê‚æ‚è‚à’á‚¢‹N“®Žž
    491         @—Dæ“x‚̐ݒè’l‚ð‚à‚ƒ^ƒXƒN‚̏W‡ = {TASK2,TASK3,TASK4}
    492         Eã‹Lƒ^ƒXƒN‚̏W‡‚Ì’†‚ōłà‹N“®Žž—Dæ“x‚̐ݒè’l‚ª‚‚¢‚à‚Ì = TASK3
    493         Eã‹Lƒ^ƒXƒN‚Ì‹N“®Žž—Dæ“x‚Ì’l = 2
    494         E]‚Á‚ÄTASK3 ‚ÌŽÀsŽž—Dæ“x‚Ì’l‚Í 2
    495 
    496 ŽÀsŽž—Dæ“x‚ɑ΂·‚鏉Šú‰»î•ñ‚Ì kernel_cfg.c ‚Ö‚ÌŒ‹‰Ê‚ÍŽŸ‚̂悤‚É‚È‚éD
    497 ŽÀÛ‚Í1s‚Å•\Œ»‚³‚ê‚éD‚Ü‚½C”z—ñ‚Ö‚ÌŠi”[‡˜‚Í TASK1, TASK3, TASK2,
    498 TASK4 ‚̏‡˜‚ÅŠi”[‚³‚ê‚邱‚Æ‚É’ˆÓ‚·‚éD
    499 ‚¿‚Ȃ݂ɁCINT_PRIORITY ƒ}ƒNƒ‚Í—Dæ“x‚Ì’l‚ð‚»‚Ì“à•”•\Œ»‚É•ÏŠ·‚·‚éƒ}ƒNƒ‚Å
    500 ‚ ‚èCtask.h ‚Å’è‹`‚³‚ê‚Ä‚¢‚éD
     430結果は次のようになる:
     431
     432【起動時優先度】
     433        TASK1:設定値=2 → (割り当てられる)起動時優先度=1
     434        TASK2:設定値=6 → (割り当てられる)起動時優先度=3
     435        TASK3:設定値=4 → (割り当てられる)起動時優先度=2
     436        TASK4:設定値=8 → (割り当てられる)起動時優先度=4
     437
     438        起動時優先度の高い順に並び替えると
     439        TASK1:設定値=2 → 起動時優先度=1
     440        TASK3:設定値=4 → 起動時優先度=2
     441        TASK2:設定値=6 → 起動時優先度=3
     442        TASK4:設定値=8 → 起動時優先度=4
     443
     444【実行時優先度】
     445        TASK1:設定値=1
     446        TASK3:設定値=3
     447        TASK2:設定値=5
     448        TASK4:設定値=4
     449
     450・ためしに TASK4 の場合の実行時優先度の値を算出してみる.
     451        ・TASK4 の実行時優先度の設定値(4)と同じまたはそれよりも低い起動時
     452         優先度の設定値をもつタスクの集合 = {TASK2,TASK3,TASK4}
     453        ・上記タスクの集合の中で最も起動時優先度の設定値が高いもの = TASK3
     454        ・上記タスクの起動時優先度の値 = 2
     455        ・従ってTASK4 の実行時優先度の値は 2
     456
     457・同様に,TASK3 の場合は.
     458        ・TASK3 の実行時優先度の設定値(3)と同じまたはそれよりも低い起動時
     459         優先度の設定値をもつタスクの集合 = {TASK2,TASK3,TASK4}
     460        ・上記タスクの集合の中で最も起動時優先度の設定値が高いもの = TASK3
     461        ・上記タスクの起動時優先度の値 = 2
     462        ・従ってTASK3 の実行時優先度の値は 2
     463
     464実行時優先度に対する初期化情報の kernel_cfg.c への結果は次のようになる.
     465実際は1行で表現される.また,配列への格納順序は TASK1, TASK3, TASK2,
     466TASK4 の順序で格納されることに注意する.
     467ちなみに,INT_PRIORITY マクロは優先度の値をその内部表現に変換するマクロで
     468あり,task.h で定義されている.
    501469
    502470const uint_t _kernel_tinib_epriority[TNUM_TSKID] =
    503471         {INT_PRIORITY(1),INT_PRIORITY(2),INT_PRIORITY(3),INT_PRIORITY(2)};
    504472
    505 (5-1-7) ƒXƒ^ƒbƒN—̈æÝ’è
    506 
    507 SSPƒJ[ƒlƒ‹‚ł́Cƒ^ƒXƒN‚ðŠÜ‚Þ‘S‚Ă̏ˆ—’PˆÊ‚ª“¯‚¶ƒXƒ^ƒbƒN—̈æ‚ð‹¤—p‚·‚é
    508 ‚悤‚ɐ݌v‚³‚ê‚Ä‚¢‚éD
    509 ‹¤—p‚³‚ê‚éƒXƒ^ƒbƒN—̈æ‚Ì‚±‚Æ‚ðu‹¤—LƒXƒ^ƒbƒN—̈æv‚ƌĂԁD
    510 ‹¤—LƒXƒ^ƒbƒN—̈æ‚Ì’è‹`‚Í DEF_STK ‚ð—p‚¢‚čs‚¤DÚ‚µ‚­‚Í(9)‚ðŽQÆ‚Ì‚±‚ƁD
    511 
    512 ƒRƒ“ƒtƒBƒMƒ
    513 ƒŒ[ƒ^‚Í‹¤—LƒXƒ^ƒbƒN—̈æ‚Ì‚ÝŠm•Û‚µCƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgê—p‚Ì
    514 ƒXƒ^ƒbƒN—̈æ‚ÍŠm•Û‚µ‚È‚¢D
    515 ‚±‚Ì‚½‚߁CCRE_TSK ‚ł͐擪”Ô’n stk ‚Æ‚µ‚Ä NULL ‚̂ݎ󂯕t‚¯‚éD
    516 NULL ˆÈŠO‚Ì’l‚ðŽw’肵‚½ê‡CƒGƒ‰[‚Æ‚È‚éD
    517 
    518 ‚Ü‚½CCRE_TSK ‚ÅŽw’è‚·‚éƒ^ƒXƒN‚̃Xƒ^ƒbƒNƒTƒCƒY stksz ‚Ì’l‚́C
    519 DEF_STK ‚ð—p‚¢‚È‚¢ê‡‚É‚Í‹¤—LƒXƒ^ƒbƒN—̈æ‚̃TƒCƒY‚ðŒˆ’è‚·‚邽‚ß‚É—p‚¢‚ç‚êC
    520 DEF_STK ‚ð—p‚¢‚éê‡‚É‚Í DEF_STK ‚ÅŽw’肵‚½‹¤—LƒXƒ^ƒbƒN—̈æ‚̃TƒCƒY‚ð
    521 ƒ`ƒFƒbƒN‚·‚邽‚ß‚É—p‚¢‚ç‚ê‚éD¦ (9-4) ‚àŽQÆ‚Ì‚±‚ƁD
    522 
    523 ‘Sƒ^ƒXƒN‚É‚æ‚éƒXƒ^ƒbƒNŽg—p—ʁi‚̐„’è’lj‚́CCRE_TSK ‚ÅŽw’è‚·‚é
    524 ƒXƒ^ƒbƒNƒTƒCƒY stksz, ‚¨‚æ‚Ñ‹N“®Žž—Dæ“x itskpriC‚È‚ç‚Ñ‚É DEF_EPR ‚Å
    525 Žw’è‚·‚éŽÀsŽž—Dæ“x exepri ‚©‚çŽZo‚³‚ê‚éDŽZoŽè‡‚ɂ‚¢‚Ä‚ÍŽŸß‚Åà–¾‚·‚éD
    526 
    527 (5-1-8) ‘Sƒ^ƒXƒN‚É‚æ‚éƒXƒ^ƒbƒNŽg—p—Ê‚ÌŽZo•û–@
    528 
    529 ‘Sƒ^ƒXƒN‚̃Xƒ^ƒbƒNŽg—p—ʂɑ΂·‚éŒvŽZ‚ÌŠî–{“I‚ȍl‚¦•û‚́C‚»‚ꂼ‚ê‚Ì—Dæ“x‚²‚ƂɁC
    530 “¯‚¶—Dæ“x‚ð‚à‚ƒ^ƒXƒN‚Ì’†‚ōłàƒXƒ^ƒbƒNŽg—p—Ê‚ª‘å‚«‚¢‚à‚Ì‚ð‘I‚сC‚»‚ê‚ç‚Ì
    531 ƒXƒ^ƒbƒNŽg—p—Ê‚ð‚·‚×‚Ä‰ÁŽZ‚µ‚½‚à‚̂ƍl‚¦‚邱‚Æ‚Å‚ ‚éDŽÀÛ‚ɂ̓vƒƒOƒ‰ƒ€‚É‚æ‚è
    532 ‚»‚ê‚æ‚菭‚È‚­‚È‚éƒP[ƒX‚à‘¶Ý‚µ“¾‚邪CŒ»Ý‚ÌŽÀ‘•‚ł͍l‚¦•û‚ð’Pƒ‰»‚µ‚Ä‚¢‚éD
    533 
    534 SSPƒJ[ƒlƒ‹‚ÌŽd—l‚ł́C‚ЂƂ‚̋N“®Žž—Dæ“x‚ɂ‚«“o˜^‰Â”\‚ȃ^ƒXƒN‚Í
    535 ‚Xˆê‚‚ł ‚éD‚»‚Ì‚½‚߁CDEF_EPR ‚É‚æ‚èŽÀsŽž—Dæ“x‚ðÝ’肵‚È‚¢ê‡C
    536 ‚·‚È‚í‚¿C‘S‚Ẵ^ƒXƒN‚ÌŽÀsŽž—Dæ“x‚ª‚»‚ꂼ‚ê‚Ì‹N“®Žž—Dæ“x‚É“™‚µ‚¢
    537 ê‡CŠeƒ^ƒXƒN‚̃Xƒ^ƒbƒNŽg—p—Ê‚ð’Pƒ‚ɉÁŽZ‚µ‚½‚à‚Ì‚ªC‘Sƒ^ƒXƒN‚É‚æ‚é
    538 ƒXƒ^ƒbƒNŽg—p—Ê‚Æ‚È‚éD
    539 
    540 ‚»‚ê‚ɑ΂µCDEF_EPR ‚ð—p‚¢‚Ä“Á’è‚̃^ƒXƒN‚ɑ΂·‚éŽÀsŽž—Dæ“x‚ðŽw’肵C
    541 “–ŠYƒ^ƒXƒNŽÀs’†‚Ì—Dæ“x‚ðˆø‚«ã‚°‚é‚悤‚ɐݒ肵‚½ê‡C–{—ˆ‚È‚ç‚΃vƒŠ
    542 ƒGƒ“ƒvƒg‚³‚ê‚é‚Í‚¸‚Ì‚à‚Ì‚ª‚³‚ê‚È‚­‚È‚éƒP[ƒX‚ª¶‚¶CŒ‹‰Ê‚Æ‚µ‚Ä‘Sƒ^ƒXƒN‚Ì
    543 ƒXƒ^ƒbƒNŽg—p—Ê‚ð­‚È‚­‚Å‚«‚éê‡‚ª‚ ‚éD
    544 
    545 ŽÀsŽž—Dæ“x‚ðl—¶‚µ‚½u‘Sƒ^ƒXƒN‚É‚æ‚éƒXƒ^ƒbƒNŽg—p—ʁv‚ÌŽZoŽè‡‚Í
    546 ŽŸ‚̂悤‚É‚È‚éi¦j
    547 (a) ‚ ‚éƒ^ƒXƒN‚©‚çŽÀsŠJŽn‚µC‘¼‚̂ǂ̂悤‚ȃ^ƒXƒN‚ɃvƒŠƒGƒ“ƒvƒg‚³‚ê‚é‚©C
    548     ‚»‚µ‚ÄŒ‹‰Ê“I‚É‚Ç‚¤‚¢‚¤ƒvƒƒOƒ‰ƒ€‚ÌŽÀsŒo˜H‚ª‘¶Ý‚µ“¾‚é‚©‚ð‘S‚Ä—ñ‹“‚·‚éD
    549 (b) ‚»‚ꂼ‚ê‚̏ꍇ‚́u‘Sƒ^ƒXƒN‚É‚æ‚éƒXƒ^ƒbƒNŽg—p—ʁv‚ð‹‚ß‚éD
    550 (c) ‹‚ß‚½’l‚Ì’†‚̍őå’l‚ð‘I‚ԁD
    551 
    552 ¦ ŽÀ‘•‚ł́C•s—v‚ȏˆ—‚̏ȗª“™‚às‚Á‚Ä‚¢‚邪C‚±‚±‚Å‚ÍŠî–{“I‚ȍl‚¦•û
    553    ‚Ì‚Ý‚ðŽ¦‚·D
    554 
    555 ŽZoŽè‡‚ð‹ï‘Ì“I‚È—á‚ð—p‚¢‚Äà–¾‚·‚éD
    556 —á‚Æ‚µ‚Đæ‚Ì (5-1-6) ‚Ì—á‚ð—p‚¢‚éD
    557 ‰º‚̎菇 (a), (b), (c) ‚͏ã‚É‹“‚°‚½Še€–ڂɑΉž‚µ‚Ä‚¢‚éD
     473(5-1-7) スタック領域設定
     474
     475SSPカーネルでは,タスクを含む全ての処理単位が同じスタック領域を共用する
     476ように設計されている.
     477共用されるスタック領域のことを「共有スタック領域」と呼ぶ.
     478共有スタック領域の定義は DEF_STK を用いて行う.詳しくは(9)を参照のこと.
     479
     480コンフィギュレータは共有スタック領域のみ確保し,タスクコンテキスト専用の
     481スタック領域は確保しない.
     482このため,CRE_TSK では先頭番地 stk として NULL のみ受け付ける.
     483NULL 以外の値を指定した場合,エラーとなる.
     484
     485また,CRE_TSK で指定するタスクのスタックサイズ stksz の値は,
     486DEF_STK を用いない場合には共有スタック領域のサイズを決定するために用いられ,
     487DEF_STK を用いる場合には DEF_STK で指定した共有スタック領域のサイズを
     488チェックするために用いられる.※ (9-4) も参照のこと.
     489
     490全タスクによるスタック使用量(の推定値)は,CRE_TSK で指定する
     491スタックサイズ stksz, および起動時優先度 itskpri,ならびに DEF_EPR で
     492指定する実行時優先度 exepri から算出される.算出手順については次節で説明する.
     493
     494(5-1-8) 全タスクによるスタック使用量の算出方法
     495
     496全タスクのスタック使用量に対する計算の基本的な考え方は,それぞれの優先度ごとに,
     497同じ優先度をもつタスクの中で最もスタック使用量が大きいものを選び,それらの
     498スタック使用量をすべて加算したものと考えることである.実際にはプログラムにより
     499それより少なくなるケースも存在し得るが,現在の実装では考え方を単純化している.
     500
     501SSPカーネルの仕様では,ひとつの起動時優先度につき登録可能なタスクは
     502高々一つである.そのため,DEF_EPR により実行時優先度を設定しない場合,
     503すなわち,全てのタスクの実行時優先度がそれぞれの起動時優先度に等しい
     504場合,各タスクのスタック使用量を単純に加算したものが,全タスクによる
     505スタック使用量となる.
     506
     507それに対し,DEF_EPR を用いて特定のタスクに対する実行時優先度を指定し,
     508当該タスク実行中の優先度を引き上げるように設定した場合,本来ならばプリ
     509エンプトされるはずのものがされなくなるケースが生じ,結果として全タスクの
     510スタック使用量を少なくできる場合がある.
     511
     512実行時優先度を考慮した「全タスクによるスタック使用量」の算出手順は
     513次のようになる(※)
     514(a) あるタスクから実行開始し,他のどのようなタスクにプリエンプトされるか,
     515    そして結果的にどういうプログラムの実行経路が存在し得るかを全て列挙する.
     516(b) それぞれの場合の「全タスクによるスタック使用量」を求める.
     517(c) 求めた値の中の最大値を選ぶ.
     518
     519※ 実装では,不要な処理の省略等も行っているが,ここでは基本的な考え方
     520   のみを示す.
     521
     522算出手順を具体的な例を用いて説明する.
     523例として先の (5-1-6) の例を用いる.
     524下の手順 (a), (b), (c) は上に挙げた各項目に対応している.
    558525
    559526CRE_TSK(TASK1, { TA_NULL, 1, task1, 2, 10, NULL });
     
    567534DEF_IPR(TASK4, { 4 } );
    568535
    569 (a) ‚ ‚éƒ^ƒXƒN(TASKn, n = 1,2,3,4)‚ð‘I‘ð‚·‚é.
    570     TASKn ‚ÌŽÀsŽž—Dæ“x‚æ‚è‚à‚‚¢‹N“®Žž—Dæ“x(’l‚Æ‚µ‚Ă͏¬‚³‚¢)‚ð‚à‚Â
    571     ƒ^ƒXƒN‚̏W‡‚ð’T‚·D
    572     ‚»‚µ‚āuƒvƒŠƒGƒ“ƒvƒg‚³‚ê‚éƒ^ƒXƒN¨ƒvƒŠƒGƒ“ƒvƒg‚·‚éƒ^ƒXƒNv‚Ì‘g‚ð—ñ‹“‚·‚éD
    573 
    574 ETASK1 ‚É’
    575 –Ú‚·‚é‚ƁC‚±‚ê‚ðƒvƒŠƒGƒ“ƒvƒg‰Â”\‚ȃ^ƒXƒN‚Í‘¶Ý‚µ‚È‚¢D
    576 ETASK2 ‚É’
    577 –Ú‚·‚é‚ƁCŽÀs’†‚Í—Dæ“x 5 ‚É‚È‚èC‚±‚ê‚ðƒvƒŠƒGƒ“ƒvƒg‰Â”\‚È
    578 @ƒ^ƒXƒN‚Í TASK1 ‚¨‚æ‚Ñ TASK3D
    579 ETASK3 ‚É’
    580 –Ú‚·‚é‚ƁCŽÀs’†‚Í—Dæ“x 3 ‚É‚È‚èC‚±‚ê‚ðƒvƒŠƒGƒ“ƒvƒg‰Â”\‚È
    581 @ƒ^ƒXƒN‚Í TASK1 ‚¾‚¯D
    582 ETASK4 ‚É’
    583 –Ú‚·‚é‚ƁCŽÀs’†‚Í—Dæ“x 4 ‚É‚È‚èC‚±‚ê‚ðƒvƒŠƒGƒ“ƒvƒg‰Â”\‚È
    584 @ƒ^ƒXƒN‚Í TASK1 ‚¾‚¯D
    585 
    586 ‚µ‚½‚ª‚Á‚Ä‚±‚±‚ł́CŽŸ‚Ì‘g‚ª“¾‚ç‚ê‚éD
    587         TASK2 ¨ TASK1
    588         TASK2 ¨ TASK3
    589         TASK3 ¨ TASK1
    590         TASK4 ¨ TASK1
    591 
    592 ‘S‚­ƒvƒŠƒGƒ“ƒvƒg‚³‚ê‚È‚¢ƒP[ƒXC‚¨‚æ‚сCƒvƒŠƒGƒ“ƒvƒg‚µ‚½ƒ^ƒXƒN‚ª‚³‚ç‚É
    593 •Ê‚̃^ƒXƒN‚ɃvƒŠƒGƒ“ƒvƒg‚³‚ê‚éƒP[ƒX‚܂ōl—¶‚·‚é‚ƁCŒ‹‰Ê“I‚ɃvƒƒOƒ‰ƒ€‚Ì
    594 ŽÀsŒo˜H‚ÍŽŸ‚̂悤‚É‚È‚é‚ƍl‚¦‚ç‚ê‚éD
    595 
    596 ETASK1 ‚©‚çŽn‚Ü‚éƒP[ƒXF
    597         TASK1 (ƒvƒŠƒGƒ“ƒvƒg‚³‚ꂸ‚ɏI—¹)
    598 
    599 ETASK2 ‚©‚çŽn‚Ü‚éƒP[ƒXF
     536(a) あるタスク(TASKn, n = 1,2,3,4)を選択する.
     537    TASKn の実行時優先度よりも高い起動時優先度(値としては小さい)をもつ
     538    タスクの集合を探す.
     539    そして「プリエンプトされるタスク→プリエンプトするタスク」の組を列挙する.
     540
     541・TASK1 に着目すると,これをプリエンプト可能なタスクは存在しない.
     542・TASK2 に着目すると,実行中は優先度 5 になり,これをプリエンプト可能な
     543 タスクは TASK1 および TASK3.
     544・TASK3 に着目すると,実行中は優先度 3 になり,これをプリエンプト可能な
     545 タスクは TASK1 だけ.
     546・TASK4 に着目すると,実行中は優先度 4 になり,これをプリエンプト可能な
     547 タスクは TASK1 だけ.
     548
     549したがってここでは,次の組が得られる.
     550        TASK2 → TASK1
     551        TASK2 → TASK3
     552        TASK3 → TASK1
     553        TASK4 → TASK1
     554
     555全くプリエンプトされないケース,および,プリエンプトしたタスクがさらに
     556別のタスクにプリエンプトされるケースまで考慮すると,結果的にプログラムの
     557実行経路は次のようになると考えられる.
     558
     559・TASK1 から始まるケース:
     560        TASK1 (プリエンプトされずに終了)
     561
     562・TASK2 から始まるケース:
    600563        TASK2
    601         TASK2 ¨ TASK1 (TASK2‚©‚çŽÀsŠJŽn‚µ‚āCTASK1‚ɃvƒŠƒGƒ“ƒvƒg‚³‚ꂽ)
    602         TASK2 ¨ TASK3
    603         TASK2 ¨ TASK3 ¨ TASK1
    604 
    605 ETASK3 ‚©‚çŽn‚Ü‚éƒP[ƒXF
     564        TASK2 → TASK1 (TASK2から実行開始して,TASK1にプリエンプトされた)
     565        TASK2 TASK3
     566        TASK2 → TASK3 → TASK1
     567
     568・TASK3 から始まるケース:
    606569        TASK3
    607         TASK3 ¨ TASK1
    608 
    609 ETASK4 ‚©‚çŽn‚Ü‚éƒP[ƒXF
     570        TASK3 TASK1
     571
     572・TASK4 から始まるケース:
    610573        TASK4
    611         TASK4 ¨ TASK1
    612 
    613 (b) ‚»‚ꂼ‚ê‚̃P[ƒX‚ŃXƒ^ƒbƒNŽg—p—Ê‚ðŒvŽZ‚·‚éD
    614 
    615 ETASK1 ‚©‚çŽn‚Ü‚éƒP[ƒXF
    616         TASK1F10
    617 
    618 ETASK2 ‚©‚çŽn‚Ü‚éƒP[ƒXF
    619         TASK2F30
    620         TASK2 ¨ TASK1F30+10
    621         TASK2 ¨ TASK3F30+50
    622         TASK2 ¨ TASK3 ¨ TASK1F30+50+10
    623 
    624 ETASK3 ‚©‚çŽn‚Ü‚éƒP[ƒXF
    625         TASK3F50
    626         TASK3 ¨ TASK1F50+10
    627 
    628 ETASK4 ‚©‚çŽn‚Ü‚éƒP[ƒXF
    629         TASK4F100
    630         TASK4 ¨ TASK1F100+10
    631 
    632 (c) Å‚à’l‚ª‘å‚«‚­‚È‚éŒo˜H‚ð‘I‚ԁD
    633 
    634 ‚±‚±‚Å‚Í TASK4 ¨ TASK1 ‚̏ꍇ‚ªÅ‘å‚ŁCŒ©Ï‚à‚è’l‚Í 110
    635 
    636 
    637 (5-1-9) ‘Sƒ^ƒXƒN‚É‚æ‚éƒXƒ^ƒbƒNŽg—p—Ê‚Ì’è‹`
    638 
    639 ƒRƒ“ƒtƒBƒMƒ
    640 ƒŒ[ƒ^‚́C‘Sƒ^ƒXƒN‚É‚æ‚éƒXƒ^ƒbƒNŽg—p—Ê‚ÌŒ©Ï‚à‚è‰ß’ö‚ð
    641 kernel_cfg.c ‚ɃRƒƒ“ƒg‚Æ‚µ‚ďo—Í‚·‚éD
     574        TASK4 → TASK1
     575
     576(b) それぞれのケースでスタック使用量を計算する.
     577
     578・TASK1 から始まるケース:
     579        TASK1:10
     580
     581・TASK2 から始まるケース:
     582        TASK2:30
     583        TASK2 → TASK1:30+10
     584        TASK2 → TASK3:30+50
     585        TASK2 → TASK3 → TASK1:30+50+10
     586
     587・TASK3 から始まるケース:
     588        TASK3:50
     589        TASK3 → TASK1:50+10
     590
     591・TASK4 から始まるケース:
     592        TASK4:100
     593        TASK4 → TASK1:100+10
     594
     595(c) 最も値が大きくなる経路を選ぶ.
     596
     597ここでは TASK4 → TASK1 の場合が最大で,見積もり値は 110
     598
     599
     600(5-1-9) 全タスクによるスタック使用量の定義
     601
     602コンフィギュレータは,全タスクによるスタック使用量の見積もり過程を
     603kernel_cfg.c にコメントとして出力する.
    642604
    643605/*
    644606 * Task Stack Size Estimation:
    645607 *
    646  i‚±‚±‚ÉŽZo‚̉ߒö‚ªo—Í‚³‚ê‚éj
     608 (ここに算出の過程が出力される)
    647609 */
    648610
    649 ‚»‚µ‚āCŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
    650 
    651 #define TOPPERS_TSTKSZ     <‘Sƒ^ƒXƒN‚É‚æ‚éƒXƒ^ƒbƒNŽg—p—Ê‚ÌŒvŽZ’l>
    652 
    653 
    654 (5-1-10) ƒGƒ‰[ðŒ
    655 
    656 ƒ^ƒXƒN‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    657 
    658 –ƒRƒ“ƒtƒBƒMƒ
    659 ƒŒ[ƒ^–{‘Ì‚ªŒŸo‚·‚é‚à‚Ì
    660 Eƒ^ƒXƒN‚ªˆê‚Â‚à‘¶Ý‚µ‚È‚¢ê‡D
    661 E“¯‚¶tskid‚ɑ΂·‚éCRE_TSK‚ª•¡”‚ ‚éê‡iE_OBJj
    662 EDEF_EPR‚ɑΉž‚·‚éCRE_TSK‚ª‚È‚¢ê‡iE_NOEXSj
    663 E“¯‚¶tskid‚ɑ΂·‚éDEF_EPR‚ª•¡”‚ ‚éê‡iE_OBJj
    664 
    665 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    666 Etskatr‚ªi[[TA_ACT]|[TA_RSTR]j‚Å‚È‚¢ê‡iE_RSATRj
    667         ¦ ƒ^[ƒQƒbƒgˆË‘¶•”‚Ń^ƒXƒN‘®«‚ð’ljÁ‰ÂiTARGET_TSKATRj
    668 E(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)‚Å‚È‚¢ê‡iE_PARj
    669 E“¯‚¶ itskpri ‚ɑ΂·‚é CRE_TSK ‚ª•¡”‚ ‚éê‡ (E_PAR)
    670 Estksz‚ª0‚©Cƒ^[ƒQƒbƒg’è‹`‚̍ŏ¬’liTARGET_MIN_STKSZj‚æ‚è‚à¬‚³‚¢ê
    671 @‡iE_PARj
    672 Estk ‚ª NULL ‚Å‚È‚¢ê‡iE_PARj
    673 E(TMIN_TPRI <= exepri && exepri <= TMAX_TPRI) ‚Å‚È‚¢ê‡FE_PAR ƒGƒ‰[
    674 E(itskpri < exepri && exepri <= TMAX_TPRI) ‚Å‚ ‚éê‡FE_ILUSEƒGƒ‰[
    675 
    676 –ƒpƒX3‚ÅŒŸo‚·‚é‚à‚Ì
    677 Etask ‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    678         - ƒ^[ƒQƒbƒgˆË‘¶‚Ì’liCHECK_FUNC_ALIGNj‚Ì”{”‚Å‚È‚¢ê‡
    679         - NULL‚̏ꍇiƒ^[ƒQƒbƒgˆË‘¶CCHECK_FUNC_NONNULLj
    680 
    681 
    682 (5-2) ƒCƒxƒ“ƒgƒtƒ‰ƒO‚ÉŠÖ‚·‚é’è‹`
    683 
    684 ƒCƒxƒ“ƒgƒtƒ‰ƒO‚̏ȗª‹L†‚́uFLG^flgv‚Å‚ ‚éDˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒB
    685 ƒMƒ
    686 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚É‚Â
    687 ‚¢‚ďq‚ׂéD
     611そして,次のような行を生成する.
     612
     613#define TOPPERS_TSTKSZ     <全タスクによるスタック使用量の計算値>
     614
     615
     616(5-1-10) エラー条件
     617
     618タスクに関するエラー条件は次の通りである.
     619
     620*コンフィギュレータ本体が検出するもの
     621・タスクが一つも存在しない場合.
     622・同じtskidに対するCRE_TSKが複数ある場合(E_OBJ)
     623・DEF_EPRに対応するCRE_TSKがない場合(E_NOEXS)
     624・同じtskidに対するDEF_EPRが複数ある場合(E_OBJ)
     625
     626*パス2で検出するもの
     627・tskatrが([[TA_ACT]|[TA_RSTR])でない場合(E_RSATR)
     628        ※ ターゲット依存部でタスク属性を追加可(TARGET_TSKATR)
     629・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
     630・同じ itskpri に対する CRE_TSK が複数ある場合 (E_PAR)
     631・stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場
     632 合(E_PAR)
     633・stk が NULL でない場合(E_PAR)
     634・(TMIN_TPRI <= exepri && exepri <= TMAX_TPRI) でない場合:E_PAR エラー
     635・(itskpri < exepri && exepri <= TMAX_TPRI) である場合:E_ILUSEエラー
     636
     637*パス3で検出するもの
     638・task がプログラムの開始番地として正しくない場合(E_PAR)
     639        - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
     640        - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
     641
     642
     643(5-2) イベントフラグに関する定義
     644
     645イベントフラグの省略記号は「FLG/flg」である.以下では,システムコンフィ
     646ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
     647いて述べる.
    688648
    689649CRE_FLG(flgid, { flgatr, iflgptn });
    690650
    691 (5-2-1) ƒCƒxƒ“ƒgƒtƒ‰ƒO‚̏‰Šú‰»î•ñiƒCƒxƒ“ƒgƒtƒ‰ƒO‘®«j
    692 
    693 ƒCƒxƒ“ƒgƒtƒ‰ƒO‚Ì‘®«î•ñ‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     651(5-2-1) イベントフラグの初期化情報(イベントフラグ属性)
     652
     653イベントフラグの属性情報の初期化情報は,次の形式とする.
    694654
    695655const ATR _kernel_flginib_atr[TNUM_FLGID] = {(flgatr)};
    696656
    697 (5-2-2) ƒCƒxƒ“ƒgƒtƒ‰ƒO‚̏‰Šú‰»î•ñiƒtƒ‰ƒOƒpƒ^[ƒ“‰Šú’lj
    698 
    699 ƒCƒxƒ“ƒgƒtƒ‰ƒO‚̃tƒ‰ƒOƒpƒ^[ƒ“‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     657(5-2-2) イベントフラグの初期化情報(フラグパターン初期値)
     658
     659イベントフラグのフラグパターンの初期化情報は,次の形式とする.
    700660
    701661const FLGPTN _kernel_flginib_iflgptn[TNUM_FLGID] = {(iflgptn)};
    702662
    703 (5-2-3) ƒCƒxƒ“ƒgƒtƒ‰ƒO‚̃tƒ‰ƒOƒpƒ^[ƒ“
    704 
    705 ƒCƒxƒ“ƒgƒtƒ‰ƒO‚̃tƒ‰ƒOƒpƒ^[ƒ“‚ðŠi”[‚·‚é”z—ñ‚́CˆÈ‰º‚ÌŒ`Ž®‚Æ‚·‚éD
     663(5-2-3) イベントフラグのフラグパターン
     664
     665イベントフラグのフラグパターンを格納する配列は,以下の形式とする.
    706666
    707667FLGPTN _kernel_flgcb_flgptn[TNUM_FLGID];
    708668
    709 (5-2-4) ƒGƒ‰[ðŒ
    710 
    711 ƒCƒxƒ“ƒgƒtƒ‰ƒO‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    712 
    713 –ƒRƒ“ƒtƒBƒMƒ
    714 ƒŒ[ƒ^–{‘Ì‚ªŒŸo‚·‚é‚à‚Ì
    715 E“¯‚¶flgid‚ɑ΂·‚éCRE_FLG‚ª•¡”‚ ‚éê‡iE_OBJj
    716 
    717 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    718 Etskatr‚ªi[[TA_CLR]|[TA_NULL]j‚Å‚È‚¢ê‡iE_RSATRj
    719         ¦ TA_CLR ‚Æ TA_NULL ‚𓯎ž‚ÉŽw’肵‚½ê‡CTA_CLR ‚Ì‚Ý‚ðŽw’肵‚½ê‡‚Æ“¯—l‚ɐU‚é•‘‚¤
    720 Eiflgptn ‚ªFLGPTN ‚ÉŠi”[‚Å‚«‚È‚¢(iflgptn‚Ì’l‚ªFLGPTNŒ^‚̍őå’l‚æ‚è‚à‘å‚«‚¢)ê‡iE_PARj
    721 
    722 
    723 (5-3) ƒf[ƒ^ƒLƒ
    724 [‚ÉŠÖ‚·‚é’è‹`
    725 
    726 ƒf[ƒ^ƒLƒ
    727 [‚̏ȗª‹L†‚́uDTQ^dtqv‚Å‚ ‚éDˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    728 
    729 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚ɂ‚¢‚Ä
    730 q‚ׂéD
     669(5-2-4) エラー条件
     670
     671イベントフラグに関するエラー条件は次の通りである.
     672
     673*コンフィギュレータ本体が検出するもの
     674・同じflgidに対するCRE_FLGが複数ある場合(E_OBJ)
     675
     676*パス2で検出するもの
     677・tskatrが([[TA_CLR]|[TA_NULL])でない場合(E_RSATR)
     678        ※ TA_CLR と TA_NULL を同時に指定した場合,TA_CLR のみを指定した場合と同様に振る舞う
     679・iflgptn がFLGPTN に格納できない(iflgptnの値がFLGPTN型の最大値よりも大きい)場合(E_PAR)
     680
     681
     682(5-3) データキューに関する定義
     683
     684データキューの省略記号は「DTQ/dtq」である.以下では,システムコンフィギュ
     685レーションファイルに次の静的APIが含まれている時に生成すべき情報について
     686述べる.
    731687
    732688CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb });
    733689
    734 (5-3-1) ƒf[ƒ^ƒLƒ
    735 [‚É•K—v‚ȃƒ‚ƒŠ—̈æ‚Ì’è‹`
    736 
    737 ƒf[ƒ^ƒLƒ
    738 [‚É•K—v‚ȃƒ‚ƒŠ—̈æ‚Æ‚µ‚āCƒf[ƒ^ƒLƒ
    739 [ŠÇ——̈悪‚ ‚éD¶¬
    740 ‚·‚éƒf[ƒ^ƒLƒ
    741 [–ˆ‚ɁC•K—v‚ȃTƒCƒY‚̃f[ƒ^ƒLƒ
    742 [ŠÇ——̈æ‚ð’è‹`‚·‚éD‹ï
    743 ‘Ì“I‚ɂ́Cã‹L‚̐ÓIAPI‚ɑ΂µ‚āCŽŸ‚Ì’è‹`‚𐶐¬‚·‚éD
    744 
    745 –dtqcnt‚ª0‚Å‚È‚¢ê‡‚̂ݐ¶¬
    746 static intptr_t _kernel_dtqmb_<ƒf[ƒ^ƒLƒ
    747 [–¼>[dtqcnt];
    748 
    749 (5-3-2) ƒf[ƒ^ƒLƒ
    750 [‚̏‰Šú‰»î•ñ(ƒf[ƒ^ƒLƒ
    751 [‘®«)
    752 
    753 ƒf[ƒ^ƒLƒ
    754 [‚Ì‘®«î•ñ‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     690(5-3-1) データキューに必要なメモリ領域の定義
     691
     692データキューに必要なメモリ領域として,データキュー管理領域がある.生成
     693するデータキュー毎に,必要なサイズのデータキュー管理領域を定義する.具
     694体的には,上記の静的APIに対して,次の定義を生成する.
     695
     696*dtqcntが0でない場合のみ生成
     697static intptr_t _kernel_dtqmb_<データキュー名>[dtqcnt];
     698
     699(5-3-2) データキューの初期化情報(データキュー属性)
     700
     701データキューの属性情報の初期化情報は,次の形式とする.
    755702
    756703const ATR _kernel_dtqinib_atr[TNUM_DTQID] = {(dtqatr)};
    757704
    758 (5-3-3) ƒf[ƒ^ƒLƒ
    759 [‚̏‰Šú‰»î•ñ(ƒf[ƒ^ƒLƒ
    760 [ŠÇ——̈æ)
    761 
    762 ƒf[ƒ^ƒLƒ
    763 [‚̃f[ƒ^ƒLƒ
    764 [ŠÇ——̈æ‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
    765 
    766 intptr_t * const _kernel_dtqinib_data[TNUM_DTQID] = {(_kernel_dtqmb_<ƒf[ƒ^ƒLƒ
    767 [–¼>)};
    768 
    769 ¦ SSPƒJ[ƒlƒ‹‚Å‚Í‘Ò‚¿ó‘Ô‚ðƒTƒ|[ƒg‚µ‚È‚¢‚½‚߁C“¯ŠúŒÄo‚µ‚ªŽÀŒ»‚Å‚«‚È‚¢D
    770 @‚»‚Ì‚½‚ß dtqcnt ‚ª 0 ‚̏ꍇCƒRƒ“ƒtƒBƒMƒ
    771 ƒŒ[ƒVƒ‡ƒ“ƒGƒ‰[(E_PAR)‚Æ‚È‚éD
    772 
    773 (5-3-4) ƒf[ƒ^ƒLƒ
    774 [‚̏‰Šú‰»î•ñ(ƒf[ƒ^ƒLƒ
    775 [‚̃TƒCƒY)
    776 
    777 ƒf[ƒ^ƒLƒ
    778 [‚̃TƒCƒY‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     705(5-3-3) データキューの初期化情報(データキュー管理領域)
     706
     707データキューのデータキュー管理領域の初期化情報は,次の形式とする.
     708
     709intptr_t * const _kernel_dtqinib_data[TNUM_DTQID] = {(_kernel_dtqmb_<データキュー名>)};
     710
     711※ SSPカーネルでは待ち状態をサポートしないため,同期呼出しが実現できない.
     712 そのため dtqcnt が 0 の場合,コンフィギュレーションエラー(E_PAR)となる.
     713
     714(5-3-4) データキューの初期化情報(データキューのサイズ)
     715
     716データキューのサイズの初期化情報は,次の形式とする.
    779717
    780718const uint8_t _kernel_dtqinib_size[TNUM_DTQID] = {(dtqcnt)};
    781719
    782 (5-3-5) ƒf[ƒ^ƒLƒ
    783 [‚ÉŠi”[‚³‚ê‚Ä‚¢‚é—v‘f”
    784 
    785 ƒf[ƒ^ƒLƒ
    786 [‚ÉŠi”[‚³‚ê‚Ä‚¢‚é—v‘f”‚Ì”z—ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     720(5-3-5) データキューに格納されている要素数
     721
     722データキューに格納されている要素数の配列は,次の形式とする.
    787723
    788724uint8_t _kernel_dtqcb_count[TNUM_DTQID];
    789725
    790 (5-3-6) ƒf[ƒ^ƒLƒ
    791 [‚̐擪E––”ö—v‘f
    792 
    793 ƒf[ƒ^ƒLƒ
    794 [‚ÉŠi”[‚³‚ê‚Ä‚¢‚éæ“ª—v‘fE––”ö—v‘f‚ðŠi”[‚·‚é”z—ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     726(5-3-6) データキューの先頭・末尾要素
     727
     728データキューに格納されている先頭要素・末尾要素を格納する配列は,次の形式とする.
    795729
    796730uint8_t _kernel_dtqcb_head[TNUM_DTQID];
    797731uint8_t _kernel_dtqcb_tail[TNUM_DTQID];
    798732
    799 (5-3-7) ƒGƒ‰[ðŒ
    800 
    801 ƒf[ƒ^ƒLƒ
    802 [‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    803 
    804 –ƒRƒ“ƒtƒBƒMƒ
    805 ƒŒ[ƒ^–{‘Ì‚ªŒŸo‚·‚é‚à‚Ì
    806 E“¯‚¶dtqid‚ɑ΂·‚éCRE_DTQ‚ª•¡”‚ ‚éê‡iE_OBJj
    807 
    808 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    809 Edtqatr‚ªimTA_NULLnj‚Å‚È‚¢ê‡iE_RSATRj
    810 Edtqcnt‚ª 0 ‚̏ꍇ (E_PAR)
    811 Edtqmb ‚ª NULL ‚Å‚È‚¢ê‡iE_NOSPTj
    812 
    813 
    814 (5-4) ŽüŠúƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚é’è‹`
    815 
    816 ŽüŠúƒnƒ“ƒhƒ‰‚̏ȗª‹L†‚́uCYC^cycv‚Å‚ ‚éDˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒB
    817 ƒMƒ
    818 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚É‚Â
    819 ‚¢‚ďq‚ׂéD
     733(5-3-7) エラー条件
     734
     735データキューに関するエラー条件は次の通りである.
     736
     737*コンフィギュレータ本体が検出するもの
     738・同じdtqidに対するCRE_DTQが複数ある場合(E_OBJ)
     739
     740*パス2で検出するもの
     741・dtqatrが([TA_NULL])でない場合(E_RSATR)
     742・dtqcntが 0 の場合 (E_PAR)
     743・dtqmb が NULL でない場合(E_NOSPT)
     744
     745
     746(5-4) 周期ハンドラに関する定義
     747
     748周期ハンドラの省略記号は「CYC/cyc」である.以下では,システムコンフィ
     749ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
     750いて述べる.
    820751
    821752CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs });
    822753
    823 (5-4-1) ŽüŠúƒnƒ“ƒhƒ‰‚̏‰Šú‰»î•ñiŠg’£î•ñj
    824 
    825 ŽüŠúƒnƒ“ƒhƒ‰‚ÌŠg’£î•ñ‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     754(5-4-1) 周期ハンドラの初期化情報(拡張情報)
     755
     756周期ハンドラの拡張情報の初期化情報は,次の形式とする.
    826757
    827758const intptr_t _kernel_cycinib_exinf[TNUM_CYCID] = {(intptr_t)(exinf)};
    828759
    829 (5-4-2) ŽüŠúƒnƒ“ƒhƒ‰‚̏‰Šú‰»î•ñi‹N“®”Ô’nj
    830 
    831 ŽüŠúƒnƒ“ƒhƒ‰‚̃AƒhƒŒƒX‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     760(5-4-2) 周期ハンドラの初期化情報(起動番地)
     761
     762周期ハンドラのアドレスの初期化情報は,次の形式とする.
    832763
    833764const CYCHDR _kernel_cycinib_cychdr[TNUM_CYCID] = {(cycdhr)};
    834765
    835 (5-4-3) ŽüŠúƒnƒ“ƒhƒ‰‚̏‰Šú‰»î•ñi‹N“®ŽüŠúj
    836 
    837 ŽüŠúƒnƒ“ƒhƒ‰‚Ì‹N“®ŽüŠú‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     766(5-4-3) 周期ハンドラの初期化情報(起動周期)
     767
     768周期ハンドラの起動周期の初期化情報は,次の形式とする.
    838769
    839770const RELTIM _kernel_cycinib_cyctim[TNUM_CYCID] = {(cyctim)};
    840771
    841 (5-4-4) ŽüŠúƒnƒ“ƒhƒ‰‚̏‰Šú‰»î•ñiˆÊ‘Šj
    842 
    843 ŽüŠúƒnƒ“ƒhƒ‰‚̈ʑŠ‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     772(5-4-4) 周期ハンドラの初期化情報(位相)
     773
     774周期ハンドラの位相の初期化情報は,次の形式とする.
    844775
    845776const RELTIM _kernel_cycinib_cycphs[TNUM_CYCID] = {(cycphs)};
    846777
    847 (5-4-5) ŽüŠúƒnƒ“ƒhƒ‰‚Ì“®ìó‘Ô
    848 
    849 ŽüŠúƒnƒ“ƒhƒ‰‚Ì“®ìó‘Ô‚ðŠi”[‚·‚é•Ï”‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     778(5-4-5) 周期ハンドラの動作状態
     779
     780周期ハンドラの動作状態を格納する変数は,次の形式とする.
    850781
    851782uint_t _kernel_cyccb_cycact;
    852783
    853 •Ï” _kernel_cyccb_cycact ‚ÌŠeƒrƒbƒg‚Í‚»‚ꂼ‚ê‚ÌŽüŠúƒnƒ“ƒhƒ‰‚ɑΉž‚·‚éD
    854 ŽüŠúƒnƒ“ƒhƒ‰ID‚ª1‚̃^ƒXƒN‚͍ʼnºˆÊƒrƒbƒg(LSB)‚ɑΉž‚¯‚ç‚ê‚Ä‚¨‚èC
    855 ID‚Ì’l‚ª1‚‘‚¦‚é–ˆ‚É1‚‚ˆÊ‚̃rƒbƒg‚ª‚»‚ꂼ‚ê‘Ήž‚¯‚ç‚ê‚éD
    856 —Ⴆ‚΁Cƒnƒ“ƒhƒ‰ID‚ª4‚ÌŽüŠúƒnƒ“ƒhƒ‰‚͍ʼnºˆÊ‚©‚琔‚¦‚Ä4”Ԗڂ̃rƒbƒg‚ª
    857 ‘Ήž‚·‚éD
    858 
    859 “®ì‚µ‚Ä‚¢‚éó‘Ô‚ÌŽüŠúƒnƒ“ƒhƒ‰‚́C‚»‚ÌŽüŠúƒnƒ“ƒhƒ‰‚ɑΉž‚·‚éƒrƒbƒg‚ª
    860 1‚Æ‚È‚éD“®ì‚µ‚Ä‚¢‚È‚¢ó‘Ô‚ÌŽüŠúƒnƒ“ƒhƒ‰‚͑Ήž‚·‚éƒrƒbƒg‚ª0‚É‚È‚éD
    861 
    862 (5-4-6) ŽüŠúƒnƒ“ƒhƒ‰‚ÌŽŸ‰ñ‹N“®Žž‚Ì’è‹`
    863 
    864 ŽüŠúƒnƒ“ƒhƒ‰‚ÌŽŸ‰ñ‹N“®Žž‚ðŠi”[‚·‚é•Ï”‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     784変数 _kernel_cyccb_cycact の各ビットはそれぞれの周期ハンドラに対応する.
     785周期ハンドラIDが1のタスクは最下位ビット(LSB)に対応づけられており,
     786IDの値が1つ増える毎に1つ高位のビットがそれぞれ対応づけられる.
     787例えば,ハンドラIDが4の周期ハンドラは最下位から数えて4番目のビットが
     788対応する.
     789
     790動作している状態の周期ハンドラは,その周期ハンドラに対応するビットが
     7911となる.動作していない状態の周期ハンドラは対応するビットが0になる.
     792
     793(5-4-6) 周期ハンドラの次回起動時刻の定義
     794
     795周期ハンドラの次回起動時刻を格納する変数は,次の形式とする.
    865796
    866797EVTTIM _kernel_cyccb_evttim[TNUM_CYCID];
    867798
    868 (5-4-7) ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    869 [‚Ì’†‚̃IƒtƒZƒbƒgî•ñ‚Ì’è‹`
    870 
    871 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    872 [‚Ì’†‚ÅŽüŠúƒnƒ“ƒhƒ‰—p‚ÉŠ„‚è“–‚Ä‚ç‚ꂽ—̈æ‚̐擪ˆÊ’u‚ð
    873 Ž¦‚·î•ñ‚ð•Ï”‚É•ÛŽ‚·‚éDƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    874 [‚Í”z—ñ‚Å•\Œ»‚³‚ê‚Ä‚¨‚èC
    875 æ“ªˆÊ’u‚Í”z—ñ‚̐擪‚©‚ç‚̃IƒtƒZƒbƒgi‚‚܂è”z—ñ‚̃Cƒ“ƒfƒbƒNƒXj‚Æ‚µ‚Ä
    876 •\Œ»‚³‚ê‚éDŽüŠúƒnƒ“ƒhƒ‰‚ɑ΂µ‚Ă̓^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    877 [”z—ñ‚̐擪‚©‚犄‚è
    878 “–‚Ä‚ç‚ê‚邽‚߁C‚±‚Ì’l‚͏í‚É 0 ‚Æ‚È‚éD]‚Á‚ĕϐ”’è‹`‚́CŽŸ‚ÌŒ`Ž®‚Æ‚È‚éD
     799(5-4-7) タイムイベントキューの中のオフセット情報の定義
     800
     801タイムイベントキューの中で周期ハンドラ用に割り当てられた領域の先頭位置を
     802示す情報を変数に保持する.タイムイベントキューは配列で表現されており,
     803先頭位置は配列の先頭からのオフセット(つまり配列のインデックス)として
     804表現される.周期ハンドラに対してはタイムイベントキュー配列の先頭から割り
     805当てられるため,この値は常に 0 となる.従って変数定義は,次の形式となる.
    879806
    880807const uint_t _kernel_cycevtid_offset = 0;
    881808
    882 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    883 [‚ɂ‚¢‚Ä‚Í(9-3)‚ðŽQÆ‚Ì‚±‚ƁD
    884 
    885 (5-4-8) ƒGƒ‰[ðŒ
    886 
    887 ŽüŠúƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    888 
    889 –ƒRƒ“ƒtƒBƒMƒ
    890 ƒŒ[ƒ^–{‘Ì‚ªŒŸo‚·‚é‚à‚Ì
    891 E“¯‚¶cycid‚ɑ΂·‚éCRE_CYC‚ª•¡”‚ ‚éê‡iE_OBJj
    892 
    893 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    894 Ecycatr‚ªimTA_STAnj‚Å‚È‚¢ê‡iE_RSATRj
    895 E(0 < cyctim && cyctim <= TMAX_RELTIM)‚Å‚È‚¢ê‡iE_PARj
    896 E(0 <= cycphs && cycphs <= TMAX_RELTIM)‚Å‚È‚¢ê‡iE_PARj
    897 EŒxFcycatr‚ÉTA_STA‚ªÝ’肳‚ê‚Ä‚¢‚āC(cycphs == 0)‚̏ꍇ
    898 ECRE_CYC ‚̃Gƒ“ƒgƒŠ‚ª16ŒÂ‚æ‚葽‚¢ ¦SSPŽÀ‘•’è‹`Ž–€
    899 
    900 –ƒpƒX3‚ÅŒŸo‚·‚é‚à‚Ì
    901 Ecychdr‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    902         - ƒ^[ƒQƒbƒgˆË‘¶‚Ì’liCHECK_FUNC_ALIGNj‚Ì”{”‚Å‚È‚¢ê‡
    903         - NULL‚̏ꍇiƒ^[ƒQƒbƒgˆË‘¶CCHECK_FUNC_NONNULLj
    904 
    905 (5-5) ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚é’è‹`
    906 
    907 ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̏ȗª‹L†‚́uALM^almv‚Å‚ ‚éDˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“
    908 ƒtƒBƒMƒ
    909 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ
    910 ‚ɂ‚¢‚ďq‚ׂéD
     809タイムイベントキューについては(9-3)を参照のこと.
     810
     811(5-4-8) エラー条件
     812
     813周期ハンドラに関するエラー条件は次の通りである.
     814
     815*コンフィギュレータ本体が検出するもの
     816・同じcycidに対するCRE_CYCが複数ある場合(E_OBJ)
     817
     818*パス2で検出するもの
     819・cycatrが([TA_STA])でない場合(E_RSATR)
     820・(0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
     821・(0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
     822・警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
     823・CRE_CYC のエントリが16個より多い ※SSP実装定義事項
     824
     825*パス3で検出するもの
     826・cychdrがプログラムの開始番地として正しくない場合(E_PAR)
     827        - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
     828        - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
     829
     830(5-5) アラームハンドラに関する定義
     831
     832アラームハンドラの省略記号は「ALM/alm」である.以下では,システムコン
     833フィギュレーションファイルに次の静的APIが含まれている時に生成すべき情報
     834について述べる.
    911835
    912836CRE_ALM(ID almid, { almatr, (intptr_t)(exinf), almhdr });
    913837
    914 (5-5-1) ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̏‰Šú‰»î•ñiŠg’£î•ñj
    915 
    916 ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ÌŠg’£î•ñ‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     838(5-5-1) アラームハンドラの初期化情報(拡張情報)
     839
     840アラームハンドラの拡張情報の初期化情報は,次の形式とする.
    917841
    918842const intptr_t _kernel_alminib_exinf[TNUM_ALMID] = {(intptr_t)(exinf)};
    919843
    920 (5-5-2) ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̏‰Šú‰»î•ñi‹N“®”Ô’nj
    921 
    922 ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚Ì‹N“®”Ô’n‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     844(5-5-2) アラームハンドラの初期化情報(起動番地)
     845
     846アラームハンドラの起動番地の初期化情報は,次の形式とする.
    923847
    924848const ALMHDR _kernel_alminib_almhdr[TNUM_ALMID] = {(almhdr)};
    925849
    926 (5-5-3) ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚Ì“®ìó‘Ô
    927 
    928 ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚Ì“®ìó‘Ô‚ðŠi”[‚·‚é•Ï”‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     850(5-5-3) アラームハンドラの動作状態
     851
     852アラームハンドラの動作状態を格納する変数は,次の形式とする.
    929853
    930854uint_t _kernel_almcb_almact;
    931855
    932 •Ï” _kernel_almcb_almact ‚ÌŠeƒrƒbƒg‚͌X‚̃Aƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ɑΉž‚·‚éD
    933 ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰ID‚ª1‚̃^ƒXƒN‚͍ʼnºˆÊƒrƒbƒg(LSB)‚ɑΉž‚¯‚ç‚ê‚Ä‚¨‚èC
    934 ID‚Ì’l‚ª1‚‘‚¦‚é–ˆ‚É1‚‚ˆÊ‚̃rƒbƒg‚ª‚»‚ꂼ‚ê‘Ήž‚¯‚ç‚ê‚éD
    935 —Ⴆ‚΁Cƒnƒ“ƒhƒ‰ID‚ª4‚̃Aƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚͍ʼnºˆÊ‚©‚琔‚¦‚Ä4”Ԗڂ̃rƒbƒg‚ª
    936 ‘Ήž‚·‚éD
    937 
    938 “®ì‚µ‚Ä‚¢‚éó‘Ԃ̃Aƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚́C‚»‚ÌŽüŠúƒnƒ“ƒhƒ‰‚ɑΉž‚·‚éƒrƒbƒg‚ª
    939 1‚Æ‚È‚éD“®ì‚µ‚Ä‚¢‚È‚¢ó‘Ô‚ÌŽüŠúƒnƒ“ƒhƒ‰‚͑Ήž‚·‚éƒrƒbƒg‚ª0‚É‚È‚éD
    940 
    941 (5-5-4) ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    942 [‚Ì’†‚̃IƒtƒZƒbƒgî•ñ‚Ì’è‹`
    943 
    944 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    945 [‚Ì’†‚ŃAƒ‰[ƒ€ƒnƒ“ƒhƒ‰—p‚ÉŠ„‚è“–‚Ä‚ç‚ꂽ—̈æ‚̐擪
    946 ˆÊ’u‚ðŽ¦‚·î•ñ‚ð•Ï”‚É•ÛŽ‚·‚éDƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    947 [‚Í”z—ñ‚Å•\Œ»‚³‚ê‚Ä‚¨‚èC
    948 æ“ªˆÊ’u‚Í”z—ñ‚̐擪‚©‚ç‚̃IƒtƒZƒbƒgi‚‚܂è”z—ñ‚̃Cƒ“ƒfƒbƒNƒXj‚Æ‚µ‚Ä
    949 •\Œ»‚³‚ê‚éDƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ɑ΂µ‚Ä‚ÍŽüŠúƒnƒ“ƒhƒ‰—p—̈æ‚ÌŽŸ‚Ì—v‘f‚©‚ç
    950 Š„‚è“–‚Ä‚ç‚ê‚邽‚߁C‚±‚Ì’l‚͏í‚ÉŽüŠúƒnƒ“ƒhƒ‰‚̌”‚É“™‚µ‚¢D
    951 •Ï”’è‹`‚́CŽŸ‚ÌŒ`Ž®‚Æ‚È‚éD
    952 
    953 const uint_t _kernel_almevtid_offset = <ŽüŠúƒnƒ“ƒhƒ‰‚̌”>;
    954 
    955 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    956 [‚ɂ‚¢‚Ä‚Í(9-3)‚ðŽQÆ‚Ì‚±‚ƁD
    957 
    958 (5-5-5) ƒGƒ‰[ðŒ
    959 
    960 ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    961 
    962 –ƒRƒ“ƒtƒBƒMƒ
    963 ƒŒ[ƒ^–{‘Ì‚ªŒŸo‚·‚é‚à‚Ì
    964 E“¯‚¶almid‚ɑ΂·‚éCRE_ALM‚ª•¡”‚ ‚éê‡iE_OBJj
    965 
    966 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    967 Ealmatr‚ªiTA_NULLj‚Å‚È‚¢ê‡iE_RSATRj
    968 ECRE_ALM ‚̃Gƒ“ƒgƒŠ‚ª16ŒÂ‚æ‚葽‚¢ ¦SSPŽÀ‘•’è‹`Ž–€
    969 
    970 –ƒpƒX3‚ÅŒŸo‚·‚é‚à‚Ì
    971 Ealmhdr‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    972         - ƒ^[ƒQƒbƒgˆË‘¶‚Ì’liCHECK_FUNC_ALIGNj‚Ì”{”‚Å‚È‚¢ê‡
    973         - NULL‚̏ꍇiƒ^[ƒQƒbƒgˆË‘¶CCHECK_FUNC_NONNULLj
    974 
    975 (6) Š„ž‚Ý‚ÉŠÖ‚·‚é’è‹`
    976 
    977 Š„ž‚Ý‚ÉŠÖ‚µ‚ж¬‚·‚éî•ñ‚́Cƒ^[ƒQƒbƒg–ˆ‚É’è‚߂邱‚Æ‚ª‚Å‚«‚éD
    978 ƒ^[ƒQƒbƒg–ˆ‚É’è‚ß‚È‚¢ê‡‚ɂ́CˆÈ‰º‚ŏq‚ׂéƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚È‚¢•W€“I‚È
    979 î•ñ‚𐶐¬‚·‚éDƒ^[ƒQƒbƒg–ˆ‚É’è‚ß‚éê‡‚ɂ́C(6-1)‚Æ(6-3)‚ɏq‚ׂéî•ñ‚͐¶
    980 ¬‚µ‚È‚¢i(6-2)‚ɏq‚ׂéî•ñ‚͐¶¬‚·‚éjD
    981 
    982 (6-1) Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ÉŠÖ‚·‚é’è‹`
    983 
    984 Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚ðÝ’è‚·‚éÃ“IAPIuCFG_INTv‚Őݒ肵‚½Š„ž‚Ý—v‹
    985 ƒ‰ƒCƒ“‚ÉŠÖ‚·‚é’è‹`‚𐶐¬‚·‚éD‹ï‘Ì“I‚É‚ÍŽŸ‚Ì’Ê‚èD
    986 
    987 ˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    988 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê
    989 ‚Ä‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚ɂ‚¢‚ďq‚ׂéD
     856変数 _kernel_almcb_almact の各ビットは個々のアラームハンドラに対応する.
     857アラームハンドラIDが1のタスクは最下位ビット(LSB)に対応づけられており,
     858IDの値が1つ増える毎に1つ高位のビットがそれぞれ対応づけられる.
     859例えば,ハンドラIDが4のアラームハンドラは最下位から数えて4番目のビットが
     860対応する.
     861
     862動作している状態のアラームハンドラは,その周期ハンドラに対応するビットが
     8631となる.動作していない状態の周期ハンドラは対応するビットが0になる.
     864
     865(5-5-4) タイムイベントキューの中のオフセット情報の定義
     866
     867タイムイベントキューの中でアラームハンドラ用に割り当てられた領域の先頭
     868位置を示す情報を変数に保持する.タイムイベントキューは配列で表現されており,
     869先頭位置は配列の先頭からのオフセット(つまり配列のインデックス)として
     870表現される.アラームハンドラに対しては周期ハンドラ用領域の次の要素から
     871割り当てられるため,この値は常に周期ハンドラの個数に等しい.
     872変数定義は,次の形式となる.
     873
     874const uint_t _kernel_almevtid_offset = <周期ハンドラの個数>;
     875
     876タイムイベントキューについては(9-3)を参照のこと.
     877
     878(5-5-5) エラー条件
     879
     880アラームハンドラに関するエラー条件は次の通りである.
     881
     882*コンフィギュレータ本体が検出するもの
     883・同じalmidに対するCRE_ALMが複数ある場合(E_OBJ)
     884
     885*パス2で検出するもの
     886・almatrが(TA_NULL)でない場合(E_RSATR)
     887・CRE_ALM のエントリが16個より多い ※SSP実装定義事項
     888
     889*パス3で検出するもの
     890・almhdrがプログラムの開始番地として正しくない場合(E_PAR)
     891        - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
     892        - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
     893
     894(6) 割込みに関する定義
     895
     896割込みに関して生成する情報は,ターゲット毎に定めることができる.
     897ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない標準的な
     898情報を生成する.ターゲット毎に定める場合には,(6-1)と(6-3)に述べる情報は生
     899成しない((6-2)に述べる情報は生成する).
     900
     901(6-1) 割込み要求ラインに関する定義
     902
     903割込み要求ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求
     904ラインに関する定義を生成する.具体的には次の通り.
     905
     906以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
     907ている時に生成すべき情報について述べる.
    990908
    991909CFG_INT(INTNO intno, { intatr, intpri });
    992910
    993 (6-1-1) Ý’è‚·‚銄ž‚Ý—v‹ƒ‰ƒCƒ“‚̐”
    994 
    995 Ý’è‚·‚銄ž‚Ý—v‹ƒ‰ƒCƒ“‚̐”‚ðƒ}ƒNƒ’è‹`‚·‚éƒvƒŠƒvƒƒZƒbƒTƒfƒBƒŒƒNƒeƒB
    996 ƒui#definej‚𐶐¬‚·‚éD‚Ü‚½C‚»‚Ì’l‚ðŽ‚Â•Ï”‚Ì’è‹`‚𐶐¬‚·‚éD‹ï‘Ì“I
    997 ‚ɂ́CŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
    998 
    999 #define TNUM_INTNO <Ý’è‚·‚銄ž‚Ý—v‹ƒ‰ƒCƒ“‚̐”>
     911(6-1-1) 設定する割込み要求ラインの数
     912
     913設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ
     914ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
     915には,次のような行を生成する.
     916
     917#define TNUM_INTNO <設定する割込み要求ラインの数>
    1000918const uint_t    _kernel_tnum_intno = TNUM_INTNO;
    1001919
    1002 (6-1-2) Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚̏‰Šú‰»î•ñiŠ„ž‚ݔԍ†j
    1003 
    1004 Š„ž‚ݔԍ†‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     920(6-1-2) 割込み要求ラインの初期化情報(割込み番号)
     921
     922割込み番号の初期化情報は,次の形式とする.
    1005923
    1006924const INTNO _kernel_intinib_intno[TNUM_INTNO] = {(intno)};
    1007925
    1008 (6-1-3) Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚̏‰Šú‰»î•ñiŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‘®«j
    1009 
    1010 Š„ž‚Ý—v‹ƒ‰ƒCƒ“‘®«‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     926(6-1-3) 割込み要求ラインの初期化情報(割込み要求ライン属性)
     927
     928割込み要求ライン属性の初期化情報は,次の形式とする.
    1011929
    1012930const ATR _kernel_intinib_intatr[TNUM_INTNO] = {(intatr)};
    1013931
    1014 (6-1-4) Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚̏‰Šú‰»î•ñiŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‘®«j
    1015 
    1016 Š„ž‚Ý—Dæ“x‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     932(6-1-4) 割込み要求ラインの初期化情報(割込み要求ライン属性)
     933
     934割込み優先度の初期化情報は,次の形式とする.
    1017935
    1018936const PRI _kernel_intinib_intpri[TNUM_INTNO] = {(intpri)};
    1019937
    1020 (6-1-5) ƒGƒ‰[ðŒ
    1021 
    1022 Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1023 
    1024 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1025 Eintno ‚ª CFG_INT‚ɑ΂·‚銄ž‚ݔԍ†‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1026 Eintno ‚ª CFG_INT‚É‚æ‚Á‚ĐݒèÏ‚݂̏ꍇiE_OBJj
    1027 Eintatr‚ªimTA_ENAINTnbmTA_EDGEnj‚Å‚È‚¢ê‡iE_RSATRj
    1028         ¦ ƒ^[ƒQƒbƒgˆË‘¶•”‚ÅŠ„ž‚Ý‘®«‚ð’ljÁ‰ÂiTARGET_INTATRj
    1029 EƒJ[ƒlƒ‹ŠÇ—‚ɌŒ肳‚ê‚Ä‚¢‚é intno ‚ɑ΂µ‚āCintpri‚ÉTMIN_INTPRI
    1030 @‚æ‚è‚à¬‚³‚¢’li‚‚܂èC—Dæ“x‚Æ‚µ‚Ă͍‚‚¢’lj‚ªŽw’肳‚ꂽê‡iE_OBJj
    1031 EƒJ[ƒlƒ‹ŠÇ—ŠO‚ɌŒ肳‚ê‚Ä‚¢‚é intno ‚ɑ΂µ‚āCintpri ‚É TMIN_INTPRI
    1032 @‚Æ“¯‚¶‚©‚Ü‚½‚Í‚»‚ê‚æ‚è‚à‘å‚«‚¢’li‚‚܂èC—Dæ“x‚Æ‚µ‚Ä‚Í“¯‚¶‚©‚Ü‚½‚Í
    1033 @‚»‚ê‚æ‚è’á‚¢’lj‚ªŽw’肳‚ꂽê‡iE_OBJj
    1034 Eintpri ‚ª CFG_INT ‚ɑ΂·‚銄ž‚Ý—Dæ“x‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1035 
    1036 –•K—v‚ɉž‚¶‚ă^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚·‚é‚à‚Ì
    1037 Eintatr ‚ªŠ„ž‚Ý‘®«‚Æ‚µ‚Đݒè‚Å‚«‚È‚¢’l‚̏ꍇiE_RSATRj
    1038 Eintpri ‚ªŠ„ž‚Ý—Dæ“x‚Æ‚µ‚Đݒè‚Å‚«‚È‚¢’l‚̏ꍇiE_PARj
    1039 E“¯ˆê‚ÌŠ„ž‚Ý—Dæ“x‚µ‚©Ý’è‚Å‚«‚È‚¢Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚āCˆÙ‚Ȃ銄
    1040 @ž‚Ý—Dæ“x‚ðÝ’肵‚½ê‡iE_PARj
    1041 
    1042 (6-2) Š„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ÉŠÖ‚·‚é’è‹`
    1043 
    1044 (6-2-1) Š„ž‚݃nƒ“ƒhƒ‰‚̐¶¬
    1045 
    1046 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1047 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ÉŠÜ‚Ü‚ê‚銄ž‚݃T[ƒrƒXƒ‹[ƒ`
    1048 ƒ“‚ð’ljÁ‚·‚éÃ“IAPIuATT_ISRv‚ÉŠî‚«C“¯ˆê‚ÌŠ„ž‚ݔԍ†‚ɑ΂µ‚ĒljÁ‚³
    1049 ‚ꂽŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ð‡‚ÉŒÄ‚Ño‚·ŠÖ”‚𐶐¬‚·‚éD
    1050 
    1051 ‹ï‘Ì“I‚ɂ́C“¯ˆê‚ÌŠ„ž‚ݔԍ†‚ɑ΂µ‚ÄŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ð’ljÁ‚·‚é
     938(6-1-5) エラー条件
     939
     940割込み要求ラインに関するエラー条件は次の通りである.
     941
     942*パス2で検出するもの
     943・intno が CFG_INTに対する割込み番号として正しくない場合(E_PAR)
     944・intno が CFG_INTによって設定済みの場合(E_OBJ)
     945・intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
     946        ※ ターゲット依存部で割込み属性を追加可(TARGET_INTATR)
     947・カーネル管理に固定されている intno に対して,intpriにTMIN_INTPRI
     948 よりも小さい値(つまり,優先度としては高い値)が指定された場合(E_OBJ)
     949・カーネル管理外に固定されている intno に対して,intpri に TMIN_INTPRI
     950 と同じかまたはそれよりも大きい値(つまり,優先度としては同じかまたは
     951 それより低い値)が指定された場合(E_OBJ)
     952・intpri が CFG_INT に対する割込み優先度として正しくない場合(E_PAR)
     953
     954*必要に応じてターゲット依存部で検出するもの
     955・intatr が割込み属性として設定できない値の場合(E_RSATR)
     956・intpri が割込み優先度として設定できない値の場合(E_PAR)
     957・同一の割込み優先度しか設定できない割込み要求ラインに対して,異なる割
     958 込み優先度を設定した場合(E_PAR)
     959
     960(6-2) 割込みサービスルーチンに関する定義
     961
     962(6-2-1) 割込みハンドラの生成
     963
     964システムコンフィギュレーションファイル中に含まれる割込みサービスルーチ
     965ンを追加する静的API「ATT_ISR」に基づき,同一の割込み番号に対して追加さ
     966れた割込みサービスルーチンを順に呼び出す関数を生成する.
     967
     968具体的には,同一の割込み番号に対して割込みサービスルーチンを追加する
    1052969
    1053970ATT_ISR({ isratr_1, exinf_1, intno, isr_1, isrpri_1 });
    1054971ATT_ISR({ isratr_2, exinf_2, intno, isr_2, isrpri_2 });
    1055         cc
     972        ……
    1056973ATT_ISR({ isratr_n, exinf_n, intno, isr_n, isrpri_n });
    1057974
    1058 ‚Æ‚¢‚¤Ã“IAPI‚ɑ΂µ‚āCŽŸ‚̂悤‚Ȋ֐”‚𐶐¬‚·‚éD‚±‚±‚ŁCisrpri_1C
    1059 isrpri_2CccCisrpri_n‚́C’l‚̏¬‚³‚¢‡‚É•À‚בւ¦‚ç‚ê‚Ä‚¢‚é‚à‚Ì‚Æ‚·‚éD
    1060 ’l‚ª“¯‚¶‚à‚̂̊Ԃł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1061 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ł̐ÓI
    1062 API‚̏‡˜‚Ì’Ê‚è‚É•À‚ñ‚Å‚¢‚é‚à‚Ì‚Æ‚·‚éD
     975という静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
     976isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
     977値が同じものの間では,システムコンフィギュレーションファイル中での静的
     978APIの順序の通りに並んでいるものとする.
    1063979
    1064980static void
     
    1070986        saved_ipm = i_get_ipm();
    1071987
    1072         LOG_ISR_ENTER(<intno>);         /* ISR1‚̌ďo‚µ */
     988        LOG_ISR_ENTER(<intno>);         /* ISR1の呼出し */
    1073989        isr_1((intptr_t)(exinf_1));
    1074990        LOG_ISR_LEAVE(intno);
    1075991
    1076         if (i_sense_lock()) {           /* ISR‚̌ďo‚µ‘O‚̏ó‘Ô‚É–ß‚· */
     992        if (i_sense_lock()) {           /* ISRの呼出し前の状態に戻す */
    1077993                i_unlock_cpu();
    1078994        }
    1079995        i_set_ipm(saved_ipm);
    1080996
    1081         LOG_ISR_ENTER(<intno>);         /* ISR2‚̌ďo‚µ */
     997        LOG_ISR_ENTER(<intno>);         /* ISR2の呼出し */
    1082998        isr_2((intptr_t)(exinf_2));
    1083999        LOG_ISR_LEAVE(intno);
    10841000
    1085         if (i_sense_lock()) {           /* ISR‚̌ďo‚µ‘O‚̏ó‘Ô‚É–ß‚· */
     1001        if (i_sense_lock()) {           /* ISRの呼出し前の状態に戻す */
    10861002                i_unlock_cpu();
    10871003        }
    10881004        i_set_ipm(saved_ipm);
    10891005
    1090         cc
    1091 
    1092         LOG_ISR_ENTER(<intno>);         /* ISRn‚̌ďo‚µ */
     1006        ……
     1007
     1008        LOG_ISR_ENTER(<intno>);         /* ISRnの呼出し */
    10931009        isr_n((intptr_t)(exinf_n));
    10941010        LOG_ISR_LEAVE(intno);
     
    10971013}
    10981014
    1099 ‚±‚±‚ŁCISRn‚̌ďo‚µ‚ÌŒã‚Ɍďo‚µ‘O‚̏ó‘Ô‚É–ß‚³‚È‚¢‚̂́CŠ„ž‚݃nƒ“ƒhƒ‰
    1100 ‚©‚ç‚̃Šƒ^[ƒ“‚É‚æ‚èCƒJ[ƒlƒ‹‚ªŒ³‚̏ó‘Ô‚É–ß‚·‚½‚ß‚Å‚ ‚éD
    1101 
    1102 “¯ˆê‚ÌŠ„ž‚ݔԍ†‚ɑ΂µ‚ĒljÁ‚³‚ꂽŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ª1‚‚݂̂̏ꍇ
    1103 ‚ɂ́CŽŸ‚̂悤‚Ȋ֐”‚𐶐¬‚·‚éD
     1015ここで,ISRnの呼出しの後に呼出し前の状態に戻さないのは,割込みハンドラ
     1016からのリターンにより,カーネルが元の状態に戻すためである.
     1017
     1018同一の割込み番号に対して追加された割込みサービスルーチンが1つのみの場合
     1019には,次のような関数を生成する.
    11041020
    11051021static void
     
    11131029}
    11141030
    1115 y‰Û‘èz‚±‚±‚ŁCLOG_ISR_ENTERCLOG_ISR_LEAVE‚̈ø”‚ð‚Ç‚¤‚·‚é‚©‚ª‰Û‘è‚Æ
    1116 ‚µ‚ÄŽc‚Á‚Ä‚¢‚éDATT_ISR‚Å“o˜^‚³‚ꂽISR‚ɑ΂µ‚Ä‚ÍISR ID‚ª•t—^‚³‚ê‚È‚¢‚½
    1117 ‚߁CID‚ÅISR‚ð‹æ•Ê‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢D‚â‚Þ‚È‚­Š„ž‚ݔԍ†‚ð“n‚µ‚Ä‚¢‚邪C
    1118 Šg’£î•ñiexinfj‚à“n‚·‚ׂ«‚©‚à‚µ‚ê‚È‚¢D
    1119 
    1120 (6-2-2) Š„ž‚݃nƒ“ƒhƒ‰‚Ì’è‹`‚É‘Š“–‚·‚鏈—
    1121 
    1122 ã‚̂悤‚ÉŠ„ž‚݃nƒ“ƒhƒ‰‚𐶐¬‚µ‚½ê‡‚ɂ́CŽŸ‚Éà–¾‚·‚銄ž‚݃nƒ“ƒhƒ‰
    1123 ‚ÉŠÖ‚·‚é’è‹`‚É‚¨‚¢‚āCƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1124 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ÉŽŸ‚̐Ã
    1125 “IAPI‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é‚Ì‚Æ“¯—l‚ɏˆ—‚·‚éD
     1031【課題】ここで,LOG_ISR_ENTER,LOG_ISR_LEAVEの引数をどうするかが課題と
     1032して残っている.ATT_ISRで登録されたISRに対してはISR IDが付与されないた
     1033め,IDでISRを区別することができない.やむなく割込み番号を渡しているが,
     1034拡張情報(exinf)も渡すべきかもしれない.
     1035
     1036(6-2-2) 割込みハンドラの定義に相当する処理
     1037
     1038上のように割込みハンドラを生成した場合には,次に説明する割込みハンドラ
     1039に関する定義において,システムコンフィギュレーションファイル中に次の静
     1040的APIが含まれているのと同様に処理する.
    11261041
    11271042DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> });
    11281043
    1129 ‚±‚±‚Åinhno‚́Cintno‚ɑΉž‚·‚銄ž‚݃nƒ“ƒhƒ‰”ԍ†‚Å‚ ‚éD
    1130 
    1131 (6-2-3) ƒGƒ‰[ðŒ
    1132 
    1133 Š„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1134 
    1135 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1136 Eisratr ‚ªiTA_NULLj‚Å‚È‚¢ê‡iE_RSATRj
    1137         ¦ ƒ^[ƒQƒbƒgˆË‘¶•”‚ÅŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‘®«‚ð’ljÁ‰ÂiTARGET_ISRATRj
    1138 Eintno ‚ª ATT_ISR ‚ɑ΂·‚銄ž‚ݔԍ†‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1139         ¦ intno ‚ɑΉž‚·‚é inhno ‚ª‚È‚¢ê‡‚ðŠÜ‚Þ
    1140 E(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)‚Å‚È‚¢ê‡iE_PARj
    1141 Eintno ‚ɑΉž‚·‚é inhno ‚ɑ΂µ‚Ä DEF_INH ‚ª‚ ‚éê‡iE_OBJj
    1142 Eintno ‚ɑ΂·‚é CFG_INT ‚ª‚È‚¢ê‡iE_OBJj
    1143 Eintno ‚ɑ΂µ‚Ä CFG_INT ‚ª‘¶Ý‚µC‚©‚CCFG_INT ‚Őݒ肳‚ꂽŠ„ž‚Ý—Dæ“x‚ª
    1144 @TMIN_INTPRI ‚æ‚è‚à¬‚³‚¢i‚‚܂èC—Dæ“x‚Æ‚µ‚Ă͍‚‚¢jê‡iE_OBJj
    1145         ¦ ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌISR‚̓Tƒ|[ƒg‚µ‚È‚¢‚½‚ß
    1146 
    1147 –•K—v‚ɉž‚¶‚ă^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚·‚é‚à‚Ì
    1148 Eisr‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1149 
    1150 (6-3) Š„ž‚݃nƒ“ƒhƒ‰‚ÉŠÖ‚·‚é’è‹`
    1151 
    1152 Š„ž‚݃nƒ“ƒhƒ‰‚ð’è‹`‚·‚éÃ“IAPIuDEF_INHv‚Å’è‹`‚µ‚½Š„ž‚݃nƒ“ƒhƒ‰
    1153 iãq‚ÌŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚̒ljÁ‚É‚æ‚èƒRƒ“ƒtƒBƒMƒ
    1154 ƒŒ[ƒ^‚ª¶¬‚µ‚½
    1155 Š„ž‚݃nƒ“ƒhƒ‰‚ðŠÜ‚ށj‚ÉŠÖ‚·‚é’è‹`‚𐶐¬‚·‚éD‹ï‘Ì“I‚É‚ÍŽŸ‚Ì’Ê‚èD
    1156 
    1157 ˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1158 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê
    1159 ‚Ä‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚ɂ‚¢‚ďq‚ׂéD
     1044ここでinhnoは,intnoに対応する割込みハンドラ番号である.
     1045
     1046(6-2-3) エラー条件
     1047
     1048割込みサービスルーチンに関するエラー条件は次の通りである.
     1049
     1050*パス2で検出するもの
     1051・isratr が(TA_NULL)でない場合(E_RSATR)
     1052        ※ ターゲット依存部で割込みサービスルーチン属性を追加可(TARGET_ISRATR)
     1053・intno が ATT_ISR に対する割込み番号として正しくない場合(E_PAR)
     1054        ※ intno に対応する inhno がない場合を含む
     1055・(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
     1056・intno に対応する inhno に対して DEF_INH がある場合(E_OBJ)
     1057・intno に対する CFG_INT がない場合(E_OBJ)
     1058・intno に対して CFG_INT が存在し,かつ,CFG_INT で設定された割込み優先度が
     1059 TMIN_INTPRI よりも小さい(つまり,優先度としては高い)場合(E_OBJ)
     1060        ※ カーネル管理外のISRはサポートしないため
     1061
     1062*必要に応じてターゲット依存部で検出するもの
     1063・isrがプログラムの開始番地として正しくない場合(E_PAR)
     1064
     1065(6-3) 割込みハンドラに関する定義
     1066
     1067割込みハンドラを定義する静的API「DEF_INH」で定義した割込みハンドラ
     1068(上述の割込みサービスルーチンの追加によりコンフィギュレータが生成した
     1069割込みハンドラを含む)に関する定義を生成する.具体的には次の通り.
     1070
     1071以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
     1072ている時に生成すべき情報について述べる.
    11601073
    11611074DEF_INH(inhno, { inhatr, inthdr });
    11621075
    1163 (6-3-1) ’è‹`‚·‚銄ž‚݃nƒ“ƒhƒ‰‚̐”
    1164 
    1165 ’è‹`‚·‚銄ž‚݃nƒ“ƒhƒ‰‚̐”‚ðƒ}ƒNƒ’è‹`‚·‚éƒvƒŠƒvƒƒZƒbƒTƒfƒBƒŒƒNƒeƒBƒu
    1166 i#definej‚𐶐¬‚·‚éD‚Ü‚½C‚»‚Ì’l‚ðŽ‚Â•Ï”‚Ì’è‹`‚𐶐¬‚·‚éD‹ï‘Ì“I
    1167 ‚ɂ́CŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
    1168 
    1169 #define TNUM_INHNO <’è‹`‚·‚銄ž‚݃nƒ“ƒhƒ‰‚̐”>
     1076(6-3-1) 定義する割込みハンドラの数
     1077
     1078定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
     1079(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
     1080には,次のような行を生成する.
     1081
     1082#define TNUM_INHNO <定義する割込みハンドラの数>
    11701083const uint_t    _kernel_tnum_inhno = TNUM_INHNO;
    11711084
    1172 (6-3-2) Š„ž‚݃nƒ“ƒhƒ‰‚̏o“üŒûˆ—
    1173 
    1174 ’è‹`‚·‚銄ž‚݃nƒ“ƒhƒ‰–ˆ‚ɁCŠ„ž‚݃nƒ“ƒhƒ‰‚̏o“üŒûˆ—ƒ‹[ƒ`ƒ“‚𐶐¬‚·
    1175 ‚éD‹ï‘Ì“I‚ɂ́CŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
     1085(6-3-2) 割込みハンドラの出入口処理
     1086
     1087定義する割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成す
     1088る.具体的には,次のような行を生成する.
    11761089
    11771090INTHDR_ENTRY(inhno, inhno_num, inthdr)
    11781091
    1179 ‚±‚±‚Åinhno_num‚́CinhnoiŠ„ž‚݃nƒ“ƒhƒ‰”ԍ†j‚𐔒l‚Å•\Œ»‚µ‚½‚à‚̂ŁC
    1180 ƒAƒZƒ“ƒuƒŠŒ¾Œê‹Lq‚ÉŽg—p‚·‚邽‚ß‚Ì‚à‚Ì‚Å‚ ‚éD
    1181 
    1182 (6-3-3) Š„ž‚݃nƒ“ƒhƒ‰‚̏‰Šú‰»î•ñiŠ„ž‚݃nƒ“ƒhƒ‰”ԍ†j
    1183 
    1184 Š„ž‚݃nƒ“ƒhƒ‰”ԍ†‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1092ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
     1093アセンブリ言語記述に使用するためのものである.
     1094
     1095(6-3-3) 割込みハンドラの初期化情報(割込みハンドラ番号)
     1096
     1097割込みハンドラ番号の初期化情報は,次の形式とする.
    11851098
    11861099const INHNO _kernel_inhinib_inhno[TNUM_INHNO] = {(inhno)};
    11871100
    1188 (6-3-4) Š„ž‚݃nƒ“ƒhƒ‰‚̏‰Šú‰»î•ñiŠ„ž‚݃nƒ“ƒhƒ‰‘®«j
    1189 
    1190 Š„ž‚݃nƒ“ƒhƒ‰‘®«‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1101(6-3-4) 割込みハンドラの初期化情報(割込みハンドラ属性)
     1102
     1103割込みハンドラ属性の初期化情報は,次の形式とする.
    11911104
    11921105const ATR _kernel_inhinib_inhatr[TNUM_INHNO] = {(inhatr)};
    11931106
    1194 (6-3-5) Š„ž‚݃nƒ“ƒhƒ‰‚̏‰Šú‰»î•ñiŠ„ž‚݃nƒ“ƒhƒ‰ƒAƒhƒŒƒXj
    1195 
    1196 Š„ž‚݃nƒ“ƒhƒ‰‚̃AƒhƒŒƒX‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1107(6-3-5) 割込みハンドラの初期化情報(割込みハンドラアドレス)
     1108
     1109割込みハンドラのアドレスの初期化情報は,次の形式とする.
    11971110
    11981111const FP _kernel_inhinib_entry[TNUM_INHNO] = {(inthdr)};
    11991112
    1200 (6-3-6) ƒGƒ‰[ðŒ
    1201 
    1202 Š„ž‚݃nƒ“ƒhƒ‰‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1203 
    1204 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1205 Einhno ‚ª DEF_INH ‚ɑ΂·‚銄ž‚݃nƒ“ƒhƒ‰”ԍ†‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1206 Einhno ‚ª DEF_INH ‚É‚æ‚Á‚ĐݒèÏ‚݂̏ꍇiE_OBJj
    1207 #Einhno ‚ɑΉž‚·‚é intno ‚ɑ΂µ‚Ä ATT_ISR ‚ª‚ ‚éê‡iE_OBJj
    1208 #       ¦ inhno ‚ɑΉž‚·‚é intno ‚ª‚È‚¢ê‡‚ɂ́C‚±‚̃`ƒFƒbƒN‚ðs‚í‚È‚¢
    1209 #       ¨ ‚±‚̃`ƒFƒbƒN‚́CŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‘¤‚ōs‚¤
    1210 Einhatr ‚ªiTA_NULLj‚Å‚È‚¢ê‡iE_RSATRj
    1211         ¦ ƒ^[ƒQƒbƒgˆË‘¶•”‚ÅŠ„ž‚݃nƒ“ƒhƒ‰‘®«‚ð’ljÁ‰ÂiTARGET_INHATRj
    1212         ¦ TA_NONKERNEL ‚ðŽg‚¤ê‡‚ɂ́CTARGET_INHATR ‚ɐݒ肷‚é
    1213 EƒJ[ƒlƒ‹ŠÇ—‚ɌŒ肳‚ê‚Ä‚¢‚é inhno ‚ɑ΂µ‚āCinhatr ‚É TA_NONKERNEL ‚ª
    1214 @Žw’肳‚ê‚Ä‚¢‚éê‡iE_RSATRj
    1215 EƒJ[ƒlƒ‹ŠÇ—ŠO‚ɌŒ肳‚ê‚Ä‚¢‚é inhno ‚ɑ΂µ‚āCinhatr ‚É TA_NONKERNEL ‚ª
    1216 @Žw’肳‚ê‚Ä‚¢‚È‚¢ê‡iE_RSATRj
    1217 Einhno ‚ɑΉž‚·‚é intno ‚ɑ΂·‚é CFG_INT ‚ª‚È‚¢ê‡iE_OBJj
    1218         ¦ inhno ‚ɑΉž‚·‚é intno ‚ª‚È‚¢ê‡‚ɂ́C‚±‚̃`ƒFƒbƒN‚ðs‚í‚È‚¢
    1219 Einhatr ‚É TA_NONKERNEL ‚ªŽw’肳‚ê‚Ä‚¨‚炸Cinhno ‚ɑΉž‚·‚é intno ‚ɑ΂µ‚Ä
    1220 @CFG_INT ‚Őݒ肳‚ꂽŠ„ž‚Ý—Dæ“x‚ª TMIN_INTPRI ‚æ‚è‚à¬‚³‚¢ê‡iE_OBJj
    1221         ¦ inhno ‚ɑΉž‚·‚é intno ‚ª‚È‚¢ê‡‚ɂ́C‚±‚̃`ƒFƒbƒN‚ðs‚í‚È‚¢
    1222 Einhatr ‚É TA_NONKERNEL ‚ªŽw’肳‚ê‚Ä‚¨‚èCinhno ‚ɑΉž‚·‚é intno ‚ɑ΂µ‚Ä
    1223 @CFG_INT ‚Őݒ肳‚ꂽŠ„ž‚Ý—Dæ“x‚ª TMIN_INTPRI ˆÈã‚Å‚ ‚éê‡iE_OBJj
    1224         ¦ inhno ‚ɑΉž‚·‚é intno ‚ª‚È‚¢ê‡‚ɂ́C‚±‚̃`ƒFƒbƒN‚ðs‚í‚È‚¢
    1225 
    1226 –•K—v‚ɉž‚¶‚ă^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚·‚é‚à‚Ì
    1227 Einthdr‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1228 
    1229 (7) CPU—áŠO‚ÉŠÖ‚·‚é’è‹`
    1230 
    1231 CPU—áŠO‚ÉŠÖ‚µ‚ж¬‚·‚éî•ñ‚́Cƒ^[ƒQƒbƒg–ˆ‚É’è‚߂邱‚Æ‚ª‚Å‚«‚éD
    1232 ƒ^[ƒQƒbƒg–ˆ‚É’è‚ß‚È‚¢ê‡‚ɂ́CˆÈ‰º‚ŏq‚ׂéƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚È‚¢•W€“I‚È
    1233 î•ñ‚𐶐¬‚·‚éDƒ^[ƒQƒbƒg–ˆ‚É’è‚ß‚éê‡‚ɂ́C‚±‚ê‚ç‚̏î•ñ‚͐¶¬‚³‚ê‚È‚¢D
    1234 
    1235 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1236 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ɁCCPU—áŠOƒnƒ“ƒhƒ‰‚ð’è‹`‚·‚é
    1237 Ã“IAPIuDEF_EXCv‚ªŠÜ‚Ü‚ê‚Ä‚¢‚éê‡‚ɁCCPU—áŠOƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚é’è‹`‚ð
    1238 ¶¬‚·‚éD
    1239 
    1240 ˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1241 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê
    1242 ‚Ä‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚ɂ‚¢‚ďq‚ׂéD
     1113(6-3-6) エラー条件
     1114
     1115割込みハンドラに関するエラー条件は次の通りである.
     1116
     1117*パス2で検出するもの
     1118・inhno が DEF_INH に対する割込みハンドラ番号として正しくない場合(E_PAR)
     1119・inhno が DEF_INH によって設定済みの場合(E_OBJ)
     1120#・inhno に対応する intno に対して ATT_ISR がある場合(E_OBJ)
     1121#       ※ inhno に対応する intno がない場合には,このチェックを行わない
     1122#       → このチェックは,割込みサービスルーチン側で行う
     1123・inhatr が(TA_NULL)でない場合(E_RSATR)
     1124        ※ ターゲット依存部で割込みハンドラ属性を追加可(TARGET_INHATR)
     1125        ※ TA_NONKERNEL を使う場合には,TARGET_INHATR に設定する
     1126・カーネル管理に固定されている inhno に対して,inhatr に TA_NONKERNEL が
     1127 指定されている場合(E_RSATR)
     1128・カーネル管理外に固定されている inhno に対して,inhatr に TA_NONKERNEL が
     1129 指定されていない場合(E_RSATR)
     1130・inhno に対応する intno に対する CFG_INT がない場合(E_OBJ)
     1131        ※ inhno に対応する intno がない場合には,このチェックを行わない
     1132・inhatr に TA_NONKERNEL が指定されておらず,inhno に対応する intno に対して
     1133 CFG_INT で設定された割込み優先度が TMIN_INTPRI よりも小さい場合(E_OBJ)
     1134        ※ inhno に対応する intno がない場合には,このチェックを行わない
     1135・inhatr に TA_NONKERNEL が指定されており,inhno に対応する intno に対して
     1136 CFG_INT で設定された割込み優先度が TMIN_INTPRI 以上である場合(E_OBJ)
     1137        ※ inhno に対応する intno がない場合には,このチェックを行わない
     1138
     1139*必要に応じてターゲット依存部で検出するもの
     1140・inthdrがプログラムの開始番地として正しくない場合(E_PAR)
     1141
     1142(7) CPU例外に関する定義
     1143
     1144CPU例外に関して生成する情報は,ターゲット毎に定めることができる.
     1145ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない標準的な
     1146情報を生成する.ターゲット毎に定める場合には,これらの情報は生成されない.
     1147
     1148システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
     1149静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
     1150生成する.
     1151
     1152以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
     1153ている時に生成すべき情報について述べる.
    12431154
    12441155DEF_EXC(excno, { excatr, exchdr });
    12451156
    1246 (7-1) ’è‹`‚·‚éCPU—áŠOƒnƒ“ƒhƒ‰‚̐”
    1247 
    1248 ’è‹`‚·‚éCPU—áŠOƒnƒ“ƒhƒ‰‚̐”‚ðƒ}ƒNƒ’è‹`‚·‚éƒvƒŠƒvƒƒZƒbƒTƒfƒBƒŒƒNƒeƒB
    1249 ƒui#definej‚𐶐¬‚·‚éD‚Ü‚½C‚»‚Ì’l‚ðŽ‚Â•Ï”‚Ì’è‹`‚𐶐¬‚·‚éD‹ï‘Ì
    1250 “I‚ɂ́CŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
    1251 
    1252 #define TNUM_EXCNO <’è‹`‚·‚éCPU—áŠOƒnƒ“ƒhƒ‰‚̐”>
     1157(7-1) 定義するCPU例外ハンドラの数
     1158
     1159定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
     1160ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
     1161的には,次のような行を生成する.
     1162
     1163#define TNUM_EXCNO <定義するCPU例外ハンドラの数>
    12531164const uint_t    _kernel_tnum_excno = TNUM_EXCNO;
    12541165
    1255 (7-2) CPU—áŠOƒnƒ“ƒhƒ‰‚̏o“üŒûˆ—
    1256 
    1257 ’è‹`‚·‚éCPU—áŠOƒnƒ“ƒhƒ‰–ˆ‚ɁCCPU—áŠOƒnƒ“ƒhƒ‰‚̏o“üŒûˆ—ƒ‹[ƒ`ƒ“‚𐶐¬
    1258 ‚·‚éD‹ï‘Ì“I‚ɂ́CŽŸ‚̂悤‚ȍs‚𐶐¬‚·‚éD
     1166(7-2) CPU例外ハンドラの出入口処理
     1167
     1168定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生成
     1169する.具体的には,次のような行を生成する.
    12591170
    12601171EXCHDR_ENTRY(excno, excno_num, exchdr)
    12611172
    1262 ‚±‚±‚Åexcno_num‚́CexcnoiCPU—áŠOƒnƒ“ƒhƒ‰”ԍ†j‚𐔒l‚Å•\Œ»‚µ‚½‚à‚̂ŁC
    1263 ƒAƒZƒ“ƒuƒŠŒ¾Œê‹Lq‚ÉŽg—p‚·‚邽‚ß‚Ì‚à‚Ì‚Å‚ ‚éD
    1264 
    1265 (7-3) CPU—áŠOƒnƒ“ƒhƒ‰”ԍ†‚̏‰Šú‰»î•ñiCPU—áŠO”ԍ†j
    1266 
    1267 CPU—áŠOƒnƒ“ƒhƒ‰”ԍ†‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1173ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
     1174アセンブリ言語記述に使用するためのものである.
     1175
     1176(7-3) CPU例外ハンドラ番号の初期化情報(CPU例外番号)
     1177
     1178CPU例外ハンドラ番号の初期化情報は,次の形式とする.
    12681179
    12691180const EXCNO _kernel_excinib_excno[TNUM_EXCNO] = {(excno)};
    12701181
    1271 (7-4) CPU—áŠOƒnƒ“ƒhƒ‰”ԍ†‚̏‰Šú‰»î•ñiCPU—áŠOƒnƒ“ƒhƒ‰‘®«j
    1272 
    1273 CPU—áŠOƒnƒ“ƒhƒ‰‘®«‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1182(7-4) CPU例外ハンドラ番号の初期化情報(CPU例外ハンドラ属性)
     1183
     1184CPU例外ハンドラ属性の初期化情報は,次の形式とする.
    12741185
    12751186const ATR _kernel_excinib_excatr[TNUM_EXCNO] = {(excatr)};
    12761187
    1277 (7-5) CPU—áŠOƒnƒ“ƒhƒ‰”ԍ†‚̏‰Šú‰»î•ñiCPU—áŠOƒnƒ“ƒhƒ‰‚̐擪”Ô’nj
    1278 
    1279 CPU—áŠOƒnƒ“ƒhƒ‰‚̐擪”Ô’n‚̏‰Šú‰»î•ñ‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1188(7-5) CPU例外ハンドラ番号の初期化情報(CPU例外ハンドラの先頭番地)
     1189
     1190CPU例外ハンドラの先頭番地の初期化情報は,次の形式とする.
    12801191
    12811192const FP _kernel_excinib_entry[TNUM_EXCNO] = {(FP)(EXC_ENTRY(excno, exchdr))};
    12821193
    1283 ‚±‚±‚Å EXC_ENTRY ‚ÍCPU—áŠOƒnƒ“ƒhƒ‰”ԍ†‚ÆCPU—áŠOƒnƒ“ƒhƒ‰‚̐擪”Ô’n‚ðŒ³‚É
    1284 CPU—áŠOƒnƒ“ƒhƒ‰‚Ì“ü‚èŒûˆ—‚Ì–¼Ì‚𐶐¬‚·‚éƒ}ƒNƒ‚ŁCƒ^[ƒQƒbƒgˆË‘¶•”‚Å
    1285 ’è‹`‚³‚ê‚Ä‚¢‚éD
    1286 
    1287 (7-6) ƒGƒ‰[ðŒ
    1288 
    1289 CPU—áŠOƒnƒ“ƒhƒ‰‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1290 
    1291 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1292 Eexcno ‚ª DEF_EXC ‚ɑ΂·‚é CPU —áŠOƒnƒ“ƒhƒ‰”ԍ†‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1293 Eexcno ‚ª DEF_EXC ‚É‚æ‚Á‚ĐݒèÏ‚݂̏ꍇiE_OBJj
    1294 Eexcatr ‚ªiTA_NULLj‚Å‚È‚¢ê‡iE_RSATRj
    1295         ¦ ƒ^[ƒQƒbƒgˆË‘¶•”‚ÅCPU—áŠOƒnƒ“ƒhƒ‰‘®«‚ð’ljÁ‰ÂiTARGET_EXCATRj
    1296 
    1297 –•K—v‚ɉž‚¶‚ă^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚·‚é‚à‚Ì
    1298 Eexchdr‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1299 
    1300 (8) ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒbƒN—̈æ‚ÉŠÖ‚·‚é’è‹`
    1301 
    1302 æ‚Ì (5-1-7) ‚Å‚àà–¾‚µ‚½‚悤‚ɁCSSPƒJ[ƒlƒ‹‚ł́CƒRƒ“ƒtƒBƒMƒ
    1303 ƒŒ[ƒ^‚Í
    1304 ‹¤—LƒXƒ^ƒbƒN—̈æ‚Ì‚ÝŠm•Û‚·‚éD‚µ‚½‚ª‚Á‚āC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgê—p‚̃Xƒ^ƒbƒN—̈æ‚Í
    1305 Šm•Û‚µ‚È‚¢D‚±‚Ì‚½‚߁CDEF_ICS ‚Ì–ðŠ„‚ÍC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ª—p‚¢‚éƒXƒ^ƒbƒN—̈æ‚Ì
    1306 ƒTƒCƒY‚ðŽw’è‚·‚邱‚Æ‚Ì‚Ý‚Æ‚È‚éD‚Ü‚½CDEF_ICS ‚ł͐擪”Ô’n istk ‚Æ‚µ‚Ä NULL ‚Ì‚Ý
    1307 Žó‚¯•t‚¯‚éDNULL ˆÈŠO‚Ì’l‚ðŽw’肵‚½ê‡‚̓Gƒ‰[‚Æ‚È‚éD
    1308 
    1309 ¦ ‹¤—LƒXƒ^ƒbƒN—̈æ‚ÉŠÖ‚·‚é’è‹`‚Í (9) ‚ðŽQÆ‚·‚邱‚ƁD
    1310 
    1311 ‚È‚¨C”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒbƒNƒTƒCƒY‚ÉŠÖ‚·‚é’è‹`‚́CˆÈ‰º‚̂悤‚É
    1312 DEF_ICS ‚Ì—L–³‚É‚©‚©‚í‚炸í‚ɐ¶¬‚³‚ê‚éD
    1313 
    1314 (8-1) DEF_ICS ‚ª‚È‚¢ê‡
    1315 
    1316 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1317 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ɁCÃ“IAPIuDEF_ICSv‚ªŠÜ‚Ü‚ê‚Ä
    1318 ‚¢‚È‚¢ê‡‚ɂ́CŽŸ‚̍s‚𐶐¬‚·‚éD
     1194ここで EXC_ENTRY はCPU例外ハンドラ番号とCPU例外ハンドラの先頭番地を元に
     1195CPU例外ハンドラの入り口処理の名称を生成するマクロで,ターゲット依存部で
     1196定義されている.
     1197
     1198(7-6) エラー条件
     1199
     1200CPU例外ハンドラに関するエラー条件は次の通りである.
     1201
     1202*パス2で検出するもの
     1203・excno が DEF_EXC に対する CPU 例外ハンドラ番号として正しくない場合(E_PAR)
     1204・excno が DEF_EXC によって設定済みの場合(E_OBJ)
     1205・excatr が(TA_NULL)でない場合(E_RSATR)
     1206        ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR)
     1207
     1208*必要に応じてターゲット依存部で検出するもの
     1209・exchdrがプログラムの開始番地として正しくない場合(E_PAR)
     1210
     1211(8) 非タスクコンテキスト用のスタック領域に関する定義
     1212
     1213先の (5-1-7) でも説明したように,SSPカーネルでは,コンフィギュレータは
     1214共有スタック領域のみ確保する.したがって,非タスクコンテキスト専用のスタック領域は
     1215確保しない.このため,DEF_ICS の役割は,非タスクコンテキストが用いるスタック領域の
     1216サイズを指定することのみとなる.また,DEF_ICS では先頭番地 istk として NULL のみ
     1217受け付ける.NULL 以外の値を指定した場合はエラーとなる.
     1218
     1219※ 共有スタック領域に関する定義は (9) を参照すること.
     1220
     1221なお,非タスクコンテキスト用のスタックサイズに関する定義は,以下のように
     1222DEF_ICS の有無にかかわらず常に生成される.
     1223
     1224(8-1) DEF_ICS がない場合
     1225
     1226システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
     1227いない場合には,次の行を生成する.
    13191228
    13201229#define TOPPERS_ISTKSZ          DEFAULT_ISTKSZ
    13211230
    1322 (8-2) DEF_ICS ‚ª‚ ‚éê‡
    1323 
    1324 ˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1325 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê‚Ä
    1326 ‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚ɂ‚¢‚ďq‚ׂéD
     1231(8-2) DEF_ICS がある場合
     1232
     1233以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
     1234いる時に生成すべき情報について述べる.
    13271235
    13281236DEF_ICS({ istksz, istk });
    13291237
    1330 DEF_ICS ‚Å‚Í istk ‚Æ‚µ‚ÄNULL‚Ì‚ÝŽw’è‰Â”\‚Å‚ ‚èCo—͂ɂ͉e‹¿‚µ‚È‚¢D
    1331 ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pƒXƒ^ƒbƒN—̈æ‚̃TƒCƒY istksz ‚É‚æ‚莟‚̍s‚𐶐¬‚·‚éD
     1238DEF_ICS では istk としてNULLのみ指定可能であり,出力には影響しない.
     1239非タスクコンテキスト用スタック領域のサイズ istksz により次の行を生成する.
    13321240
    13331241#define TOPPERS_ISTKSZ          (istksz)
    13341242
    1335 ¦‹¤—LƒXƒ^ƒbƒN—̈æ‚Ì’è‹`‚ɂ‚¢‚Ä‚Í (9) ‚ðŽQÆ‚Ì‚±‚ƁD
    1336 
    1337 (8-3) ƒGƒ‰[ðŒ
    1338 
    1339 ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒbƒN—̈æ‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1340 
    1341 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1342 EÃ“IAPIuDEF_ICSv‚ª•¡”‚ ‚éiE_OBJj
    1343 Eistksz‚ªƒXƒ^ƒbƒN—̈æ‚̃TƒCƒY‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1344         - istksz ‚ª 0 ‚̏ꍇ
    1345 Eistk‚ªƒXƒ^ƒbƒN—̈æ‚̐擪”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1346         - NULLˆÈŠO‚Ì’l‚̏ꍇ
    1347 
    1348 –•K—v‚ɉž‚¶‚ă^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚·‚é‚à‚Ì
    1349 Eistksz‚ª¬‚³‚·‚¬‚éê‡iE_PARj
    1350 
    1351 
    1352 (9) ‹¤—LƒXƒ^ƒbƒN—̈æ‚ÉŠÖ‚·‚é’è‹`
    1353 
    1354 æ‚Ì (5-1-7) ‚É‚Äà–¾‚µ‚½‚悤‚ɁCSSPƒJ[ƒlƒ‹‚ł̓^ƒXƒN‚ðŠÜ‚Þ‘S‚Ă̏ˆ—’PˆÊ‚ª
    1355 “¯‚¶ƒXƒ^ƒbƒN—̈æ‚ð‹¤—p‚·‚é‚悤‚ɐ݌v‚³‚ê‚Ä‚¢‚éD‚»‚µ‚Ä‹¤—p‚³‚ê‚éƒXƒ^ƒbƒN—̈æ‚Ì
    1356 ‚±‚Æ‚ðu‹¤—LƒXƒ^ƒbƒN—̈æv‚ƌĂԁD
    1357 
    1358 ‹¤—LƒXƒ^ƒbƒN—̈æ‚Ì’è‹`‚Í DEF_STK ‚ð—p‚¢‚čs‚¤D‚»‚µ‚āCƒRƒ“ƒtƒBƒMƒ
    1359 ƒŒ[ƒVƒ‡ƒ“‚Å‚Í
    1360 ‹¤—LƒXƒ^ƒbƒN—̈æ‚ÉŠÖ‚·‚é’è‹`‚́CDEF_STK ‚Ì—L–³‚ÉŠÖ‚í‚炸í‚ɐ¶¬‚³‚ê‚éD
    1361 
    1362 ˆÈ‰º‚ł́CDEF_STK ‚Ì—L–³‚¨‚æ‚Ñ—^‚¦‚ç‚ê‚éˆø”‚Ì“à—e‚É‚æ‚èC
    1363 ‚ǂ̂悤‚É‹¤—LƒXƒ^ƒbƒN—̈æ‚Ì’è‹`‚ª¶¬‚³‚ê‚é‚©‚ɂ‚¢‚Äà–¾‚·‚éD
    1364 
    1365 (9-1) DEF_STK ‚ª‚È‚¢ê‡‚ɐ¶¬‚³‚ê‚é’è‹`
    1366 
    1367 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1368 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ɁCÃ“IAPIuDEF_STKv‚ªŠÜ‚Ü‚ê‚Ä
    1369 ‚¢‚È‚¢ê‡‚ɂ́CŽŸ‚̍s‚𐶐¬‚·‚éD
     1243※共有スタック領域の定義については (9) を参照のこと.
     1244
     1245(8-3) エラー条件
     1246
     1247非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
     1248
     1249*パス2で検出するもの
     1250・静的API「DEF_ICS」が複数ある(E_OBJ)
     1251・istkszがスタック領域のサイズとして正しくない場合(E_PAR)
     1252        - istksz が 0 の場合
     1253・istkがスタック領域の先頭番地として正しくない場合(E_PAR)
     1254        - NULL以外の値の場合
     1255
     1256*必要に応じてターゲット依存部で検出するもの
     1257・istkszが小さすぎる場合(E_PAR)
     1258
     1259
     1260(9) 共有スタック領域に関する定義
     1261
     1262先の (5-1-7) にて説明したように,SSPカーネルではタスクを含む全ての処理単位が
     1263同じスタック領域を共用するように設計されている.そして共用されるスタック領域の
     1264ことを「共有スタック領域」と呼ぶ.
     1265
     1266共有スタック領域の定義は DEF_STK を用いて行う.そして,コンフィギュレーションでは
     1267共有スタック領域に関する定義は,DEF_STK の有無に関わらず常に生成される.
     1268
     1269以下では,DEF_STK の有無および与えられる引数の内容により,
     1270どのように共有スタック領域の定義が生成されるかについて説明する.
     1271
     1272(9-1) DEF_STK がない場合に生成される定義
     1273
     1274システムコンフィギュレーションファイルに,静的API「DEF_STK」が含まれて
     1275いない場合には,次の行を生成する.
    13701276
    13711277static STK_T                    _kernel_stack[COUNT_STK_T(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ)];
     
    13731279#define TOPPERS_STKSZ           ROUND_STK_T(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ)
    13741280
    1375 (9-2) DEF_STK‚ª‚ ‚éê‡‚ɂ̂ݐ¶¬‚³‚ê‚é’è‹`
    1376 
    1377 ˆÈ‰º‚ł́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1378 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ÉŽŸ‚̐ÓIAPI‚ªŠÜ‚Ü‚ê‚Ä
    1379 ‚¢‚鎞‚ɐ¶¬‚·‚ׂ«î•ñ‚ɂ‚¢‚ďq‚ׂéD
     1281(9-2) DEF_STKがある場合にのみ生成される定義
     1282
     1283以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
     1284いる時に生成すべき情報について述べる.
    13801285
    13811286DEF_STK({ stksz, stk });
    13821287
    1383 (9-2-1) stk ‚ª NULL ‚̏ꍇ
    1384 
    1385 stk ‚ª NULL ‚̏ꍇ‚ɂ́CŽw’肳‚ꂽƒTƒCƒY‚Ì‹¤—LƒXƒ^ƒbƒN—̈æ‚ðŠm•Û‚µC
    1386 ‹¤—LƒXƒ^ƒbƒN—̈æ‚̏‰Šú‰»î•ñ‚𐶐¬‚·‚éD
    1387 ‹ï‘Ì“I‚ɂ́Cã‹L‚̐ÓIAPI‚ɑ΂µ‚āCŽŸ‚̍s‚𐶐¬‚·‚éD
     1288(9-2-1) stk が NULL の場合
     1289
     1290stk が NULL の場合には,指定されたサイズの共有スタック領域を確保し,
     1291共有スタック領域の初期化情報を生成する.
     1292具体的には,上記の静的APIに対して,次の行を生成する.
    13881293
    13891294static STK_T                    _kernel_stack[COUNT_STK_T(stksz)];
     
    13911296#define TOPPERS_STKSZ           ROUND_STK_T(stksz)
    13921297
    1393 (9-2-2) stk ‚ª NULL ˆÈŠO‚̏ꍇ
    1394 
    1395 stk ‚ª NULL ‚Å‚È‚¢ê‡‚ɂ́C‹¤—LƒXƒ^ƒbƒN—̈æ‚̏‰Šú‰»î•ñ‚ðCŽŸ‚ÌŒ`Ž®‚Ő¶¬‚·‚éD
     1298(9-2-2) stk が NULL 以外の場合
     1299
     1300stk が NULL でない場合には,共有スタック領域の初期化情報を,次の形式で生成する.
    13961301
    13971302#define TOPPERS_STK             (stk)
    13981303#define TOPPERS_STKSZ           (stksz)
    13991304
    1400 (9-3) DEF_STK ‚Ì—L–³‚ÉŠÖŒW‚È‚­Cí‚ɐ¶¬‚³‚ê‚é’è‹`
    1401 
    1402 DEF_STK‚Ì—L–³‚É‚æ‚炸CŽŸ‚Ì’è‹`‚𐶐¬‚·‚éD
     1305(9-3) DEF_STK の有無に関係なく,常に生成される定義
     1306
     1307DEF_STKの有無によらず,次の定義を生成する.
    14031308
    14041309const SIZE      _kernel_stksz = TOPPERS_STKSZ;
     
    14091314#endif /* TOPPERS_ISTKPT */
    14101315
    1411 (9-4) ƒGƒ‰[ðŒ
    1412 
    1413 ‹¤—LƒXƒ^ƒbƒN—̈æ‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1414 
    1415 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1416 EÃ“IAPIuDEF_STKv‚ª•¡”‚ ‚éiE_OBJj
    1417 Estksz‚ªƒXƒ^ƒbƒN—̈æ‚̃TƒCƒY‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1418         - stksz ‚Æ‚µ‚Ä 0 ‚ðŽw’肵‚½ê‡
    1419         - ƒ^[ƒQƒbƒgˆË‘¶‚Ì’liCHECK_STKSZ_ALIGNj‚Ì”{”‚Å‚È‚¢ê‡
    1420         ¦ ‚±‚̃Gƒ‰[ƒ`ƒFƒbƒN‚́Cstk ‚ª NULL ‚Å‚È‚¢ê‡‚ɂ̂ݍs‚¤
    1421 EŒxFstksz ‚ªC(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ) ‚æ‚è‚à¬‚³‚¢ê‡
    1422         ¦ DEF_STK ‚ª‘¶Ý‚µCstk ‚ª”ñNULL‚̏ꍇD
    1423         ¦ ƒ}ƒNƒ‚Ì’l‚ɂ‚¢‚Ä‚Í (5-1-9), (8-1), (8-2) ‚ðŽQÆ‚Ì‚±‚Æ
    1424 
    1425 –ƒpƒX3‚ÅŒŸo‚·‚é‚à‚Ì
    1426 Estk‚ªƒXƒ^ƒbƒN—̈æ‚̐擪”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1427         - ƒ^[ƒQƒbƒgˆË‘¶‚Ì’liCHECK_STACK_ALIGNj‚Ì”{”‚Å‚È‚¢ê‡
    1428         - NULL‚̏ꍇiƒ^[ƒQƒbƒgˆË‘¶CCHECK_STACK_NONNULLj
    1429 
    1430 (10) ƒ^ƒCƒ€ƒCƒxƒ“ƒgŠÇ—‚ÉŠÖ‚·‚é’è‹`
    1431 
    1432 ƒ^ƒCƒ€ƒCƒxƒ“ƒgŠÇ—‚ÉŠÖ˜A‚µ‚āCŽŸ‚Ì’è‹`‚𐶐¬‚·‚éD
    1433 
    1434 (10-1) ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̐”
    1435 
    1436 ¶¬‚³‚ꂽƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̐”‚ðƒ}ƒNƒ’è‹`‚·‚éƒvƒŠƒvƒƒZƒbƒT
    1437 ƒfƒBƒŒƒNƒeƒCƒu(#define) ‚𐶐¬‚·‚éD
    1438 
    1439 SSPƒJ[ƒlƒ‹‚ł̓^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚Æ‚µ‚ÄŽüŠúƒnƒ“ƒhƒ‰‚¨‚æ‚уAƒ‰[ƒ€
    1440 ƒnƒ“ƒhƒ‰‚Ì‚Ý‚ðƒTƒ|[ƒg‚·‚éD‚»‚Ì‚½‚߁CCRE_CYC ‚¨‚æ‚Ñ CRE_ALM ‚̍‡Œv‚ª
    1441 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰”‚Æ‚È‚éD
    1442 
    1443 ‹ï‘Ì“I‚ɂ́CŽŸ‚̂悤‚È‹Lq‚𐶐¬‚·‚éD
    1444 
    1445 #define TNUM_TMEVT      <ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̌”>
    1446 
    1447 (10-2) ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒuƒƒbƒN‚̃TƒCƒY‚Ì’è‹`
    1448 
    1449 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒuƒƒbƒN‚Ì—v‘f”‚ð’è‹`‚·‚é•Ï”‚𐶐¬‚·‚éD
    1450 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒuƒƒbƒN‚Ì—v‘f”‚̓^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̐”‚É“™‚µ‚¢D
    1451 
    1452 ‹ï‘Ì“I‚ɂ́CŽŸ‚̂悤‚È‹Lq‚𐶐¬‚·‚éD
    1453 
    1454 const uint_t _kernel_tmevt_queue = <ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̌”>;
    1455 
    1456 (10-3) ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ
    1457 [‚Ì’è‹`
    1458 
    1459 ƒ^ƒCƒ€ƒCƒxƒ“ƒgŠÇ—‚Ì‚½‚߂̃Lƒ
    1460 [‚𐶐¬‚·‚éDƒLƒ
    1461 [‚Í”z—ñ‚Æ‚µ‚ÄŽÀ‘•‚³‚ê‚Ä
    1462 ‚¢‚éDƒLƒ
    1463 [‚̐擪‚ð•\Œ»‚·‚邽‚ß‚Ì”z—ñ—v‘f‚ðŠm•Û‚·‚邽‚߁C”z—ñ‚Ì—v‘f”‚Í
    1464 uƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̌”{1v‚Æ‚È‚éD
    1465 
    1466 ‹ï‘Ì“I‚ɂ́CŽŸ‚̂悤‚È‹Lq‚𐶐¬‚·‚éD
     1316(9-4) エラー条件
     1317
     1318共有スタック領域に関するエラー条件は次の通りである.
     1319
     1320*パス2で検出するもの
     1321・静的API「DEF_STK」が複数ある(E_OBJ)
     1322・stkszがスタック領域のサイズとして正しくない場合(E_PAR)
     1323        - stksz として 0 を指定した場合
     1324        - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
     1325        ※ このエラーチェックは,stk が NULL でない場合にのみ行う
     1326・警告:stksz が,(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ) よりも小さい場合
     1327        ※ DEF_STK が存在し,stk が非NULLの場合.
     1328        ※ マクロの値については (5-1-9), (8-1), (8-2) を参照のこと
     1329
     1330*パス3で検出するもの
     1331・stkがスタック領域の先頭番地として正しくない場合(E_PAR)
     1332        - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
     1333        - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
     1334
     1335(10) タイムイベント管理に関する定義
     1336
     1337タイムイベント管理に関連して,次の定義を生成する.
     1338
     1339(10-1) タイムイベントハンドラの数
     1340
     1341生成されたタイムイベントハンドラの数をマクロ定義するプリプロセッサ
     1342ディレクテイブ(#define) を生成する.
     1343
     1344SSPカーネルではタイムイベントハンドラとして周期ハンドラおよびアラーム
     1345ハンドラのみをサポートする.そのため,CRE_CYC および CRE_ALM の合計が
     1346タイムイベントハンドラ数となる.
     1347
     1348具体的には,次のような記述を生成する.
     1349
     1350#define TNUM_TMEVT      <タイムイベントハンドラの個数>
     1351
     1352(10-2) タイムイベントブロックのサイズの定義
     1353
     1354タイムイベントブロックの要素数を定義する変数を生成する.
     1355タイムイベントブロックの要素数はタイムイベントハンドラの数に等しい.
     1356
     1357具体的には,次のような記述を生成する.
     1358
     1359const uint_t _kernel_tmevt_queue = <タイムイベントハンドラの個数>;
     1360
     1361(10-3) タイムイベントキューの定義
     1362
     1363タイムイベント管理のためのキューを生成する.キューは配列として実装されて
     1364いる.キューの先頭を表現するための配列要素を確保するため,配列の要素数は
     1365「タイムイベントハンドラの個数+1」となる.
     1366
     1367具体的には,次のような記述を生成する.
    14671368
    14681369extern QUEUE tmevt_queue[TNUM_TMEVT+1];
    14691370
    1470 (10-4) ƒ^ƒCƒ€ƒCƒxƒ“ƒgŽžŠÔ‚Ì’è‹`
    1471 
    1472 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚Ì‹N“®Žž‚ðŠi”[‚·‚é•Ï”‚́CŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1371(10-4) タイムイベント時間の定義
     1372
     1373タイムイベントハンドラの起動時刻を格納する変数は,次の形式とする.
    14731374
    14741375extern EVTTIM tmevt_time[TNUM_TMEVT];
    14751376
    1476 (10-5) ƒ^ƒCƒ€ƒCƒxƒ“ƒg‚̃R[ƒ‹ƒoƒbƒN‚Ì’è‹`
    1477 
    1478 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̃R[ƒ‹ƒoƒbƒNŠÖ”‚ðŠi”[‚·‚é•Ï”‚́C
    1479 ŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1377(10-5) タイムイベントのコールバックの定義
     1378
     1379タイムイベントハンドラのコールバック関数を格納する変数は,
     1380次の形式とする.
    14801381
    14811382extern CBACK tmevt_callback[TNUM_TMEVT];
    14821383
    1483 (10-6) ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒR[ƒ‹ƒoƒbƒN‚̈ø”‚Ì’è‹`
    1484 
    1485 ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒnƒ“ƒhƒ‰‚̃R[ƒ‹ƒoƒbƒNŠÖ”‚̈ø”‚ðŠi”[‚·‚é•Ï”‚́C
    1486 ŽŸ‚ÌŒ`Ž®‚Æ‚·‚éD
     1384(10-6) タイムイベントコールバックの引数の定義
     1385
     1386タイムイベントハンドラのコールバック関数の引数を格納する変数は,
     1387次の形式とする.
    14871388
    14881389extern uintptr_t tmevt_arg[TNUM_TMEVT];
    14891390
    1490 (11) Šeƒ‚ƒWƒ
    1491 [ƒ‹‚̏‰Šú‰»ŠÖ”‚Ì’è‹`
    1492 
    1493 ŠeƒJ[ƒlƒ‹ƒIƒuƒWƒFƒNƒg‚ÌŠÇ—CŠ„ž‚ÝŠÇ—CCPU—áŠOƒnƒ“ƒhƒ‰ŠÇ—‚ÌŠe‹@”\‚ð
    1494 ‰Šú‰»ŠÖ”‚ð‡‚ÉŒÄ‚Ño‚·ŠÖ”i_kernel_initialize_objectj‚𐶐¬‚·‚éDŽŸ
    1495 ‚Ì3‚‚̏‰Šú‰»ŠÖ”‚ðœ‚¢‚ẮCŽg—p‚µ‚È‚¢‹@”\‚̏‰Šú‰»ŠÖ”‚͌Ăяo‚³‚È‚¢D
     1391(11) 各モジュールの初期化関数の定義
     1392
     1393各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
     1394初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
     1395の3つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
    14961396
    14971397_kernel_initialize_task();
     
    14991399_kernel_initialize_exception
    15001400
    1501 ‚Ü‚½ŽŸ‚̏‰Šú‰»ŠÖ”‚ɂ‚¢‚ẮCŽüŠúƒnƒ“ƒhƒ‰‚Ü‚½‚̓Aƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ðŽg—p‚·‚é
    1502 ê‡‚ɂ̂݌Ăяo‚³‚ê‚éD
     1401また次の初期化関数については,周期ハンドラまたはアラームハンドラを使用する
     1402場合にのみ呼び出される.
    15031403_kernel_initialize_time_event();
    15041404
    1505 ‚·‚ׂĂ̋@”\‚ðŽg‚Á‚½ê‡‚ɐ¶¬‚³‚ê‚éŠÖ”‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
     1405すべての機能を使った場合に生成される関数は次の通りである.
    15061406
    15071407void
     
    15181418
    15191419
    1520 (12) ‰Šú‰»ƒ‹[ƒ`ƒ“‚ÌŽÀsŠÖ”‚Ì’è‹`
    1521 
    1522 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1523 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ÉŠÜ‚Ü‚ê‚鏉Šú‰»ƒ‹[ƒ`ƒ“‚ð’ljÁ
    1524 ‚·‚éÃ“IAPIuATT_INIv‚ɑ΂µ‚āC’ljÁ‚µ‚½‰Šú‰»ƒ‹[ƒ`ƒ“‚ð‡‚ÉŒÄ‚Ño‚·ŠÖ
    1525 ”‚𐶐¬‚·‚éD‹ï‘Ì“I‚ɂ́C
     1420(12) 初期化ルーチンの実行関数の定義
     1421
     1422システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
     1423する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
     1424数を生成する.具体的には,
    15261425
    15271426ATT_INI({ iniatr, exinf, inirtn });
    15281427
    1529 ‚Æ‚¢‚¤Ã“IAPI‚ɑ΂µ‚āC
     1428という静的APIに対して,
    15301429
    15311430(inirtn)((intptr_t)(exinf));
    15321431
    1533 ‚ðŒÄ‚яo‚·ŠÖ”‚ðC_kernel_call_inirtn‚Æ‚¢‚¤–¼‘O‚Ő¶¬‚·‚éD‰Šú‰»ƒ‹[ƒ`
    1534 ƒ“‚ðŒÄ‚яo‚·‡˜‚́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1535 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ł̐ÓI
    1536 API‚̏‡˜‚Ɉê’v‚³‚¹‚éD
    1537 
    1538 —Ⴆ‚΁C
     1432を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
     1433ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
     1434APIの順序に一致させる.
     1435
     1436例えば,
    15391437
    15401438ATT_INI({ TA_NULL, 0, timer_initialize });
    15411439ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
    15421440
    1543 ‚Æ‚¢‚¤2‚‚̐ÓIAPI‚ª‚±‚̏‡˜‚Å‹Lq‚³‚ꂽŽž‚ɐ¶¬‚·‚éŠÖ”‚ÍŽŸ‚Ì’Ê‚è‚Å‚ 
    1544 ‚éD
     1441という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
     1442る.
    15451443
    15461444void
     
    15511449}
    15521450
    1553 (12-1) ƒGƒ‰[ðŒ
    1554 
    1555 ‰Šú‰»ƒ‹[ƒ`ƒ“‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1556 
    1557 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1558 Einiatr‚ªiTA_NULLj‚Å‚È‚¢ê‡iE_RSATRj
    1559 
    1560 –•K—v‚ɉž‚¶‚ă^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚·‚é‚à‚Ì
    1561 Einirtn‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1562 
    1563 (13) I—¹ˆ—ƒ‹[ƒ`ƒ“‚ÌŽÀsŠÖ”‚Ì’è‹`
    1564 
    1565 ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1566 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ÉŠÜ‚Ü‚ê‚éI—¹ˆ—ƒ‹[ƒ`ƒ“‚ð’Ç
    1567 ‰Á‚·‚éÃ“IAPIuATT_TERv‚ɑ΂µ‚āC’ljÁ‚µ‚½I—¹ˆ—ƒ‹[ƒ`ƒ“‚ð‡‚ÉŒÄ‚Ño
    1568 ‚·ŠÖ”‚𐶐¬‚·‚éD‹ï‘Ì“I‚ɂ́C
     1451(12-1) エラー条件
     1452
     1453初期化ルーチンに関するエラー条件は次の通りである.
     1454
     1455*パス2で検出するもの
     1456・iniatrが(TA_NULL)でない場合(E_RSATR)
     1457
     1458*必要に応じてターゲット依存部で検出するもの
     1459・inirtnがプログラムの開始番地として正しくない場合(E_PAR)
     1460
     1461(13) 終了処理ルーチンの実行関数の定義
     1462
     1463システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
     1464加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
     1465す関数を生成する.具体的には,
    15691466
    15701467ATT_TER({ teratr, exinf, terrtn });
    15711468
    1572 ‚Æ‚¢‚¤Ã“IAPI‚ɑ΂µ‚āC
     1469という静的APIに対して,
    15731470
    15741471(terrtn)((intptr_t)(exinf));
    15751472
    1576 ‚ðŒÄ‚яo‚·ŠÖ”‚ðC_kernel_call_terrtn‚Æ‚¢‚¤–¼‘O‚Ő¶¬‚·‚éDI—¹ˆ—ƒ‹[
    1577 ƒ`ƒ“‚ðŒÄ‚яo‚·‡˜‚́CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1578 ƒŒ[ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹’†‚ł̐ÓI
    1579 API‚Ì‹t‡‚Ɉê’v‚³‚¹‚éD
    1580 
    1581 —Ⴆ‚΁C
     1473を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
     1474チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
     1475APIの逆順に一致させる.
     1476
     1477例えば,
    15821478
    15831479ATT_TER({ TA_NULL, 0, timer_terminate });
    15841480ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
    15851481
    1586 ‚Æ‚¢‚¤2‚‚̐ÓIAPI‚ª‚±‚̏‡˜‚Å‹Lq‚³‚ꂽŽž‚ɐ¶¬‚·‚éŠÖ”‚ÍŽŸ‚Ì’Ê‚è‚Å‚ 
    1587 ‚éD
     1482という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
     1483る.
    15881484
    15891485void
     
    15941490}
    15951491
    1596 (13-1) ƒGƒ‰[ðŒ
    1597 
    1598 I—¹ˆ—ƒ‹[ƒ`ƒ“‚ÉŠÖ‚·‚éƒGƒ‰[ðŒ‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éD
    1599 
    1600 –ƒpƒX2‚ÅŒŸo‚·‚é‚à‚Ì
    1601 Eteratr‚ªiTA_NULLj‚Å‚È‚¢ê‡iE_RSATRj
    1602 
    1603 –•K—v‚ɉž‚¶‚ă^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚·‚é‚à‚Ì
    1604 Eterrtn‚ªƒvƒƒOƒ‰ƒ€‚ÌŠJŽn”Ô’n‚Æ‚µ‚Đ³‚µ‚­‚È‚¢ê‡iE_PARj
    1605 
    1606 ˆÈã
     1492(13-1) エラー条件
     1493
     1494終了処理ルーチンに関するエラー条件は次の通りである.
     1495
     1496*パス2で検出するもの
     1497・teratrが(TA_NULL)でない場合(E_RSATR)
     1498
     1499*必要に応じてターゲット依存部で検出するもの
     1500・terrtnがプログラムの開始番地として正しくない場合(E_PAR)
     1501
     1502以上
Note: See TracChangeset for help on using the changeset viewer.