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

ファイルの mime-type 変更

Location:
ssp_qb_r5f100le_cs/trunk/doc
Files:
6 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以上
  • ssp_qb_r5f100le_cs/trunk/doc/extension.txt

    • Property svn:mime-type set to text/plain; charset=shift_jis
    r93 r95  
    11
    2                 TOPPERS/SSPƒJ[ƒlƒ‹
    3                 Šg’£ƒpƒbƒP[ƒWŽd—l
     2                TOPPERS/SSPカーネル
     3                拡張パッケージ仕様
    44
    5                 ‘Ήžƒo[ƒWƒ‡ƒ“: Release 1.3.0
    6                 ÅIXV: 2015”N 5ŒŽ12“ú
     5                対応バージョン: Release 1.3.0
     6                最終更新: 2015年 5月12日
    77
    8 ‚±‚̃hƒLƒ
    9 ƒƒ“ƒg‚́CTOPPERS/SSPƒJ[ƒlƒ‹‚Ì‹@”\‚ðŠg’£‚·‚邽‚ß‚ÌŠg’£
    10 ƒpƒbƒP[ƒW‚É•t‚¢‚Ä‹Lq‚µ‚½‚à‚Ì‚Å‚ ‚éD
     8このドキュメントは,TOPPERS/SSPカーネルの機能を拡張するための拡張
     9パッケージに付いて記述したものである.
    1110
    1211----------------------------------------------------------------------
     
    1817                Nagoya Municipal Industrial Research Institute, JAPAN
    1918 
    20  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    21  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    22  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    23  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    24      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    25      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    26  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    27      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    28 ƒƒ“ƒgi—˜—p
    29      ŽÒƒ}ƒjƒ
    30 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    31      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    32  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    33      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    34      ‚ƁD
    35    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    36 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    37 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    38        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    39    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    40        •ñ‚·‚邱‚ƁD
    41  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    42      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    43      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    44      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    45      –Ɛӂ·‚邱‚ƁD
     19 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     20 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     21 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     22 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     23     権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     24     スコード中に含まれていること.
     25 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     26     用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     27     者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     28     の無保証規定を掲載すること.
     29 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     30     用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     31     と.
     32   (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     33       作権表示,この利用条件および下記の無保証規定を掲載すること.
     34   (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     35       報告すること.
     36 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     37     害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     38     また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     39     由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     40     免責すること.
    4641 
    47  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    48  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    49  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    50  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    51  ‚̐ӔC‚𕉂í‚È‚¢D
     42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     46 の責任を負わない.
    5247 
    5348----------------------------------------------------------------------
    5449
    55 ›Šg’£ƒpƒbƒP[ƒW‚ÌŠT—v
     50○拡張パッケージの概要
    5651
    57 EŽüŠúƒnƒ“ƒhƒ‰‹@”\
    58 EƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹@”\
    59 EƒVƒXƒeƒ€ŽžŠÇ—‹@”\
    60 EƒCƒxƒ“ƒgƒtƒ‰ƒO‹@”\
    61 Eƒf[ƒ^ƒLƒ
    62 [‹@”\
     52・周期ハンドラ機能
     53・アラームハンドラ機能
     54・システム時刻管理機能
     55・イベントフラグ機能
     56・データキュー機能
    6357
    64 ŽžŠÔŠÇ—‹@”\‚ðŽÀŒ»‚·‚邽‚߂̃^ƒCƒ€ƒCƒxƒ“ƒgŠÇ—‹@”\‚àŠg’£ƒpƒbƒP[ƒW’†‚É
    65 ŠÜ‚ñ‚Å‚¢‚éD
     58時間管理機能を実現するためのタイムイベント管理機能も拡張パッケージ中に
     59含んでいる.
    6660
    67 ›ŽüŠúƒnƒ“ƒhƒ‰‹@”\
     61○周期ハンドラ機能
    6862
    69 ŽüŠúƒnƒ“ƒhƒ‰‹@”\‚́CˆÈ‰º‚̃T[ƒrƒXƒR[ƒ‹‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚éD
     63周期ハンドラ機能は,以下のサービスコールをサポートしている.
    7064
    71 ECRE_CYC
    72 Esta_cyc
    73 Estp_cyc
     65CRE_CYC
     66sta_cyc
     67stp_cyc
    7468
    75 ‚½‚¾‚µCSSPƒJ[ƒlƒ‹‚Å‚Í16ŒÂ‚Ü‚Å‚µ‚©ŽüŠúƒnƒ“ƒhƒ‰‚𐶐¬‚Å‚«‚È‚¢‚Æ‚¢‚¤
    76 §ŒÀ‚ª‚ ‚éD
     69ただし,SSPカーネルでは16個までしか周期ハンドラを生成できないという
     70制限がある.
    7771
    78 ›ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹@”\
     72○アラームハンドラ機能
    7973
    80 ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹@”\‚́CˆÈ‰º‚̃T[ƒrƒXƒR[ƒ‹‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚éD
     74アラームハンドラ機能は,以下のサービスコールをサポートしている.
    8175
    82 ECRE_ALM
    83 Esta_alm
    84 Eista_alm
    85 Estp_alm
    86 Eistp_alm
     76CRE_ALM
     77sta_alm
     78ista_alm
     79stp_alm
     80istp_alm
    8781
    88 ‚½‚¾‚µCSSPƒJ[ƒlƒ‹‚Å‚Í16ŒÂ‚Ü‚Å‚µ‚©ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚𐶐¬‚Å‚«‚È‚¢‚Æ‚¢‚¤
    89 §ŒÀ‚ª‚ ‚éD
     82ただし,SSPカーネルでは16個までしかアラームハンドラを生成できないという
     83制限がある.
    9084
    91 ›ƒVƒXƒeƒ€ŽžŠÇ—‹@”\
     85○システム時刻管理機能
    9286
    93 ƒVƒXƒeƒ€ŽžŠÇ—‹@”\‚́CˆÈ‰º‚̃T[ƒrƒXƒR[ƒ‹‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚éD
     87システム時刻管理機能は,以下のサービスコールをサポートしている.
    9488
    95 Eget_tim
     89get_tim
    9690
    97 ›ƒCƒxƒ“ƒgƒtƒ‰ƒO‹@”\
     91○イベントフラグ機能
    9892
    99 ƒCƒxƒ“ƒgƒtƒ‰ƒO‹@”\‚́CˆÈ‰º‚̃T[ƒrƒXƒR[ƒ‹‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚éD
     93イベントフラグ機能は,以下のサービスコールをサポートしている.
    10094
    101 ECRE_FLG
    102 Eset_flg
    103 Eiset_flg
    104 Eclr_flg
    105 Epol_flg
     95CRE_FLG
     96set_flg
     97iset_flg
     98clr_flg
     99pol_flg
    106100
    107 ›ƒf[ƒ^ƒLƒ
    108 [‹@”\
     101○データキュー機能
    109102
    110 ƒf[ƒ^ƒLƒ
    111 [‹@”\‚́CˆÈ‰º‚̃T[ƒrƒXƒR[ƒ‹‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚éD
     103データキュー機能は,以下のサービスコールをサポートしている.
    112104
    113 ECRE_DTQ
    114 Epsnd_dtq
    115 Eipsnd_dtq
    116 Eprcv_dtq
     105CRE_DTQ
     106psnd_dtq
     107ipsnd_dtq
     108prcv_dtq
    117109
    118 ›ƒŠƒtƒ@ƒŒƒ“ƒX
     110○リファレンス
    119111
    120 (1) ŽüŠúƒnƒ“ƒhƒ‰‹@”\
     112(1) 周期ハンドラ機能
    121113
    122114        ER ercd = sta_cyc(ID cycid)
    123115        ER ercd = stp_cyc(ID cycid)
    124116
    125 (2) ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹@”\
     117(2) アラームハンドラ機能
    126118
    127119        ER ercd = sta_alm(ID almid, RELTIM almtim)
     
    130122        ER ercd = istp_alm(ID almid)
    131123
    132 (3) ŽžŠÔŠÇ—‹@”\
     124(3) 時間管理機能
    133125
    134126        ER ercd = get_tim(SYSTIM *p_systim)
    135127
    136 (4) ƒCƒxƒ“ƒgƒtƒ‰ƒO‹@”\
     128(4) イベントフラグ機能
    137129
    138130    ER set_flg(ID flgid, FLGPTN setptn);
     
    141133    ER pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn);
    142134
    143 (5) ƒf[ƒ^ƒLƒ
    144 [‹@”\
     135(5) データキュー機能
    145136
    146137    ER psnd_dtq(ID dtqid, intptr_t data);
     
    149140
    150141
    151 › Ã“IAPIˆê——
     142○ 静的API一覧
    152143
    153 (1) ŽüŠúƒnƒ“ƒhƒ‰‹@”\
     144(1) 周期ハンドラ機能
    154145
    155146CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf,
    156147                        CYCHDR cychdr, RELTIM cyctim, RELTIM cycphs })
    157148
    158 (2) ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹@”\
     149(2) アラームハンドラ機能
    159150
    160151CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })
    161152
    162 (3) ƒCƒxƒ“ƒgƒtƒ‰ƒO‹@”\
     153(3) イベントフラグ機能
    163154
    164155CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
    165156
    166 (4) ƒf[ƒ^ƒLƒ
    167 [‹@”\
     157(4) データキュー機能
    168158
    169159CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
    170160
    171 ˆÈãD
     161以上.
  • ssp_qb_r5f100le_cs/trunk/doc/porting.txt

    • Property svn:mime-type set to text/plain; charset=shift_jis
    r93 r95  
    11
    2                 TOPPERS/SSPƒJ[ƒlƒ‹
    3                 ƒ^[ƒQƒbƒgˆË‘¶•” ƒ|[ƒeƒBƒ“ƒOƒKƒCƒh
    4 
    5                 ‘Ήžƒo[ƒWƒ‡ƒ“: Release 1.3.0
    6                 ÅIXV: 2015”N5ŒŽ11“ú
    7 
    8 ‚±‚̃hƒLƒ
    9 ƒƒ“ƒg‚́CTOPPERS/SSPƒJ[ƒlƒ‹‚ðC–¢ƒTƒ|[ƒg‚̃^[ƒQƒbƒgƒVƒXƒe
    10 ƒ€‚Ƀ|[ƒeƒBƒ“ƒO‚·‚邽‚ß‚É•K—v‚Æ‚È‚éƒ^[ƒQƒbƒgˆË‘¶•”‚ÌŽÀ‘••û–@‚ðà–¾‚·
    11 ‚é‚à‚Ì‚Å‚ ‚éD
     2                TOPPERS/SSPカーネル
     3                ターゲット依存部 ポーティングガイド
     4
     5                対応バージョン: Release 1.3.0
     6                最終更新: 2015年5月11日
     7
     8このドキュメントは,TOPPERS/SSPカーネルを,未サポートのターゲットシステ
     9ムにポーティングするために必要となるターゲット依存部の実装方法を説明す
     10るものである.
    1211
    1312----------------------------------------------------------------------
     
    1918                Nagoya Municipal Industrial Research Institute, JAPAN
    2019
    21  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    22  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    23  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    24  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    25      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    26      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    27  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    28      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    29 ƒƒ“ƒgi—˜—p
    30      ŽÒƒ}ƒjƒ
    31 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    32      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    33  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    34      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    35      ‚ƁD
    36    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    37 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    38 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    39        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    40    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    41        •ñ‚·‚邱‚ƁD
    42  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    43      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    44      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    45      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    46      –Ɛӂ·‚邱‚ƁD
     20 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     21 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     22 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     23 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     24     権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     25     スコード中に含まれていること.
     26 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     27     用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     28     者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     29     の無保証規定を掲載すること.
     30 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     31     用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     32     と.
     33   (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     34       作権表示,この利用条件および下記の無保証規定を掲載すること.
     35   (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     36       報告すること.
     37 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     38     害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     39     また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     40     由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     41     免責すること.
    4742 
    48  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    49  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    50  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    51  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    52  ‚̐ӔC‚𕉂í‚È‚¢D
     43 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     44 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     45 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     46 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     47 の責任を負わない.
    5348 
    5449----------------------------------------------------------------------
    5550
    56 ›–ÚŽŸ
    57 
    58 1. ‹¤’ÊŽ–€
    59         1.1 ƒ^[ƒQƒbƒgˆË‘¶•”‚̍\¬
    60         1.2 –¼‘O‚̏Փ˂̖hŽ~
    61         1.3 ‘½dƒCƒ“ƒNƒ‹[ƒh‚Ì–hŽ~
    62         1.4 ƒAƒZƒ“ƒuƒŠŒ¾Œê‚Ƃ̃wƒbƒ_ƒtƒ@ƒCƒ‹‚Ì‹¤—p
    63         1.5 ƒCƒ“ƒNƒ‹[ƒh‹Lq‚Ì•û–@
    64         1.6 ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚ÌŽÀŒ»‚ÉŠÖ‚·‚鐧–ñ
    65 2. ƒVƒXƒeƒ€\’zŠÂ‹«‚̃^[ƒQƒbƒgˆË‘¶•”
    66         2.1 ƒ^[ƒQƒbƒg—ªÌ‚ƃ^[ƒQƒbƒgˆË‘¶•”‚̃fƒBƒŒƒNƒgƒŠ
    67         2.2 Makefile‚̃^[ƒQƒbƒgˆË‘¶•”
    68         2.3 ŠJ”­ŠÂ‹«–¼‚ƃRƒ}ƒ“ƒh–¼‚̐ݒè
    69         2.4 ƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚ƃIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚̐ݒè
    70         2.5 ƒŠƒ“ƒN•û–@‚̐ݒè
    71         2.6 ˆË‘¶ŠÖŒW‚Ì’è‹`
    72         2.7 ‚»‚Ì‘¼‚̐ݒè
    73 3. TOPPERS‹¤’Ê’è‹`‚̃^[ƒQƒbƒgˆË‘¶•”
    74         3.1 ƒ^[ƒQƒbƒgŽ¯•Êƒ}ƒNƒ
    75         3.2 ®”Œ^‚̍őå’lEÅ¬’lEƒrƒbƒg”
    76         3.3 ƒTƒCƒY‚ÌŽw’肳‚ꂽ®”Œ^C‚»‚̍őå’lEÅ¬’lC®”’萔‚ðì‚éƒ}ƒNƒ
    77         3.4 ƒTƒCƒY‚ÌŽw’肳‚ꂽ•‚“®¬”“_Œ^C‚»‚̍őå’lEÅ¬’l‚̃}ƒNƒ
    78         3.5 ƒRƒ“ƒpƒCƒ‰‚ÌŠg’£‹@”\‚Ì‚½‚߂̃}ƒNƒ’è‹`
    79         3.6 •W€“I‚È’è‹`‚̏㏑‚«
    80         3.7 ƒAƒT[ƒVƒ‡ƒ“‚Ì‚½‚ß‚Ì’è‹`
    81 4. ƒVƒXƒeƒ€ƒCƒ“ƒ^ƒtƒF[ƒXƒŒƒCƒ„iSILj‚̃^[ƒQƒbƒgˆË‘¶•”
    82         4.1 ‘SŠ„ž‚݃ƒbƒNó‘Ô‚ÌŠÇ—
    83         4.2 ”÷­ŽžŠÔ‘Ò‚¿
    84         4.3 ƒvƒƒZƒbƒT‚̃Gƒ“ƒfƒBƒAƒ“
    85         4.4 ƒƒ‚ƒŠ‹óŠÔƒAƒNƒZƒXŠÖ”
    86         4.5 I/O‹óŠÔƒAƒNƒZƒXŠÖ”
    87 5. ƒJ[ƒlƒ‹API‚̃^[ƒQƒbƒgˆË‘¶•”
    88         5.1 ƒ^[ƒQƒbƒg’è‹`‚ŃTƒ|[ƒg‚·‚é‹@”\
    89         5.2 Š„ž‚Ý—Dæ“x‚͈̔Í
    90         5.3 ƒ^ƒCƒ€ƒeƒBƒbƒN‚Ì’è‹`
    91         5.4 ƒƒ‚ƒŠ—̈æŠm•Û‚Ì‚½‚ß‚ÌŒ^’è‹`
    92         5.5 ƒƒ‚ƒŠ—̈æŠm•Û‚Ì‚½‚߂̃}ƒNƒ
    93         5.6 ƒI[ƒoƒ‰ƒ“ƒnƒ“ƒhƒ‰‹@”\Šg’£‚Ì‚½‚ß‚Ì’è‹`iƒIƒvƒVƒ‡ƒ“j
    94 6. ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”
    95         6.1 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚Ì‹¤’ÊŽ–€
    96                 6.1.1  ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚̍\¬—v‘f
    97                 6.1.2  ƒ^[ƒQƒbƒgˆË‘¶•”‚̊֐”‚Ì–½–¼‹K‘¥
    98         6.2 ƒgƒŒ[ƒXƒƒO‹@”\‚ւ̑Ήž
    99         6.3 ƒVƒXƒeƒ€ó‘Ô‚ÌŠÇ—
    100                 6.3.1  ‘SŠ„ž‚݃ƒbƒNó‘Ô‚ÌŠÇ—
    101                 6.3.2  ƒRƒ“ƒeƒLƒXƒg‚ÌŠÇ—
    102                 6.3.3  CPUƒƒbƒNó‘Ô‚ÌŠÇ—
    103         6.4 Š„ž‚Ý‚ÉŠÖ˜A‚·‚éƒVƒXƒeƒ€ó‘Ô‚ÌŠÇ—
    104                 6.4.1  Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÌŠÇ—
    105                 6.4.2  Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚ÌŠÇ—
    106                 6.4.3  Š„ž‚Ý—v‹‚̃NƒŠƒA
    107                 6.4.4  Š„ž‚Ý—v‹‚̃vƒ[ƒu
    108                 6.4.5  Š„ž‚݃nƒ“ƒhƒ‰‚̐擪ˆ—‚Æ––”öˆ—
    109         6.5 ƒ^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ
    110                 6.5.1 ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgƒuƒƒbƒN‚ƃ^ƒXƒN‰Šú‰»ƒRƒ“ƒeƒLƒXƒgƒuƒƒbƒN
    111                 6.5.2 ƒfƒBƒXƒpƒbƒ`ƒƒ–{‘Ì
    112                 6.5.3 ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚©‚ç‚̃fƒBƒXƒpƒbƒ`
    113                 6.5.4 ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“®ìŠJŽn
    114                 6.5.5 Œ»Ý‚̃Rƒ“ƒeƒLƒXƒg‚ðŽÌ‚ĂăfƒBƒXƒpƒbƒ`
    115                 6.5.6 ƒ^ƒXƒN‚Ì‹N“®ˆ—
    116         6.6 Š„ž‚݃nƒ“ƒhƒ‰
    117                 6.6.1 Š„ž‚݃nƒ“ƒhƒ‰‚̏o“üŒûˆ—
    118                 6.6.2 Š„ž‚݃nƒ“ƒhƒ‰–ˆ‚̏o“üŒûˆ—‚̐¶¬
    119                 6.6.3 Š„ž‚݃nƒ“ƒhƒ‰‚̐ݒè
    120                 6.6.4 Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚̐ݒè
    121                 6.6.5 Š„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚̕ύX
    122                 6.6.6 ƒfƒtƒHƒ‹ƒg‚ÌŠ„ž‚݃nƒ“ƒhƒ‰
    123                 6.6.7 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý
    124         6.7 CPU—áŠOƒnƒ“ƒhƒ‰‚ÆCPU—áŠO”­¶Žž‚̃VƒXƒeƒ€ó‘Ô‚ÌŽQÆ
    125                 6.7.1 CPU—áŠOƒnƒ“ƒhƒ‰‚̏o“üŒûˆ—
    126                 6.7.2 CPU—áŠOƒnƒ“ƒhƒ‰‚̏o“üŒûˆ—‚̐¶¬
    127                 6.7.3 CPU—áŠOƒnƒ“ƒhƒ‰‚̐ݒè
    128                 6.7.4 CPU—áŠOŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚̕ύX
    129                 6.7.5 ƒfƒtƒHƒ‹ƒg‚ÌCPU—áŠOƒnƒ“ƒhƒ‰
    130                 6.7.6 CPU—áŠO”­¶Žž‚̃VƒXƒeƒ€ó‘Ô‚ÌŽQÆ
    131         6.8 ƒJ[ƒlƒ‹‚Ì‹N“®EI—¹‚ƃXƒ^ƒbƒN—̈æ‚È‚Ç
    132         6.9 ƒJ[ƒlƒ‹“à•”‚̃`ƒ
    133 [ƒjƒ“ƒO
    134                 6.9.1 ƒrƒbƒgƒ}ƒbƒvƒT[ƒ`
    135                 6.9.2 ƒrƒbƒgƒtƒB[ƒ‹ƒh
    136         6.10 ƒJ[ƒlƒ‹ŽÀ‘•‚ÉŠÖ‚·‚é‚»‚Ì‘¼‚Ì’è‹`
    137                 6.10.1 ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒbƒN—̈æ
    138                 6.10.2 ‹óƒ‰ƒxƒ‹‚Ì’è‹`
    139         6.11  ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚Ì‚½‚߂̃Šƒl[ƒ€‹Lq
    140         6.12 ƒ^ƒCƒ}ƒhƒ‰ƒCƒo
    141                 6.12.1 ƒ^ƒCƒ}ƒhƒ‰ƒCƒo‚̃tƒ@ƒCƒ‹\¬
    142                 6.12.2 ƒ^ƒCƒ}‚̏‰Šú‰»EI—¹ˆ—EŠ„ž‚ݏˆ—
    143                 6.12.3 «”\•]‰¿—pƒVƒXƒeƒ€Žž‚ÌŽQÆ‚Ì‚½‚ß‚Ì‹@”\
    144 7. ƒRƒ“ƒtƒBƒMƒ
    145 ƒŒ[ƒ^Ý’èƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”
    146         7.1 Ý’èƒtƒ@ƒCƒ‹‚ƃ^[ƒQƒbƒgˆË‘¶•”‚̈ʒu•t‚¯
    147         7.2 ƒpƒX2‚̃eƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”
    148                 7.2.1 ƒ^[ƒQƒbƒg”ñˆË‘¶•”‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚é‘O‚É’è‹`‚·‚ׂ«•Ï”
    149                 7.2.2 ƒ^[ƒQƒbƒg”ñˆË‘¶•”‚Å’è‹`‚³‚ê‚é•Ï”
    150         7.3 ƒpƒX3‚̃eƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”
    151         7.4 cfg1_out.c‚̃Šƒ“ƒN‚É•K—v‚ȃXƒ^ƒu‚Ì’è‹`ƒtƒ@ƒCƒ‹
    152 8. ƒVƒXƒeƒ€ƒT[ƒrƒX“™‚̃^[ƒQƒbƒgˆË‘¶•”
    153         8.1 ƒVƒXƒeƒ€ƒT[ƒrƒX‚̃^[ƒQƒbƒgˆË‘¶•”
    154         8.2 ƒVƒŠƒAƒ‹ƒCƒ“ƒ^ƒtƒF[ƒXƒhƒ‰ƒCƒo‚̃^[ƒQƒbƒgˆË‘¶•”
    155                 8.2.1 •Ï”Cƒf[ƒ^Œ^CŠÇ—ŠÖ”
    156                 8.2.2 ƒfƒoƒCƒXƒT[ƒrƒXƒ‹[ƒ`ƒ“
    157                 8.2.3 ƒR[ƒ‹ƒoƒbƒNƒ‹[ƒ`ƒ“
    158         8.3 ƒJ[ƒlƒ‹‹N“®ƒƒbƒZ[ƒW‚̏o—͂̃^[ƒQƒbƒgˆË‘¶’è‹`
    159         8.4 ƒTƒ“ƒvƒ‹ƒvƒƒOƒ‰ƒ€‚ƃeƒXƒgƒvƒƒOƒ‰ƒ€‚̃^[ƒQƒbƒgˆË‘¶’è‹`
    160 9. ‚»‚Ì‘¼
    161         9.1 ƒhƒLƒ
    162 ƒƒ“ƒg
    163         9.2 ƒpƒbƒP[ƒW‹Lqƒtƒ@ƒCƒ‹
    164 10. ƒŠƒtƒ@ƒŒƒ“ƒX
    165         10.1 ƒ^[ƒQƒbƒgˆË‘¶•”‚̃tƒ@ƒCƒ‹ˆê——
    166 
    167 
    168 1. ‹¤’ÊŽ–€
    169 
    170 1.1 ƒ^[ƒQƒbƒgˆË‘¶•”‚̍\¬
    171 
    172 ƒ^[ƒQƒbƒgˆË‘¶•”‚́CtargetƒfƒBƒŒƒNƒgƒŠ‚̉º‚ɁCƒ^[ƒQƒbƒgƒn[ƒhƒEƒFƒA‚Æ
    173 ŠJ”­ŠÂ‹«‚Ì‘g‚ݍ‡‚킹–ˆ‚É—pˆÓ‚·‚éD‚½‚¾‚µCƒ^[ƒQƒbƒgˆË‘¶•”‚̍ė˜—p«‚ð
    174 l—¶‚µCƒvƒƒZƒbƒTCƒ`ƒbƒvCŠJ”­ŠÂ‹«‚݂̂Ɉˑ¶‚·‚é•”•ª‚ðCƒvƒƒZƒbƒTˆË
    175 ‘¶•”Cƒ`ƒbƒvˆË‘¶•”CŠJ”­ŠÂ‹«ˆË‘¶•”‚Æ‚¢‚¤Œ`‚Ő؂蕪‚¯‚Ä‚à‚æ‚¢DØ‚蕪‚¯
    176 •û‚́Cƒ^[ƒQƒbƒgˆË‘¶•”‚ÌŽÀ‘•‚É”C‚³‚ê‚Ä‚¢‚éDƒvƒƒZƒbƒTˆË‘¶•”Cƒ`ƒbƒvˆË
    177 ‘¶•”CŠJ”­ŠÂ‹«ˆË‘¶•”‚́CarchƒfƒBƒŒƒNƒgƒŠ‚̉º‚É’u‚­D
    178 
    179 SSPƒJ[ƒlƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”‚́CƒVƒXƒeƒ€\’zŠÂ‹«iMakefile“™j‚̃^[ƒQƒb
    180 ƒgˆË‘¶•”CTOPPERS‹¤’Ê’è‹`it_stddef.hj‚̃^[ƒQƒbƒgˆË‘¶•”CƒVƒXƒeƒ€ƒCƒ“
    181 ƒ^ƒtƒF[ƒXƒŒƒCƒ„iSILCsil.hj‚̃^[ƒQƒbƒgˆË‘¶•”CƒJ[ƒlƒ‹APIikernel.hj
    182 ‚̃^[ƒQƒbƒgˆË‘¶•”CƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”iƒRƒ“ƒtƒBƒMƒ
    183 ƒŒ[ƒ^
    184 Ý’èƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”‚ðŠÜ‚ށjCƒVƒXƒeƒ€ƒT[ƒrƒX‚̃^[ƒQƒbƒgˆË
    185 ‘¶•”Cƒ^[ƒQƒbƒgˆË‘¶•”‚ÉŠÖ‚·‚éƒhƒLƒ
    186 ƒƒ“ƒg“™‚ō\¬‚³‚ê‚éD
    187 
    188 1.2 –¼‘O‚̏Փ˂̖hŽ~
    189 
    190 TOPPERSƒvƒƒWƒFƒNƒg‚ª’ñ‹Ÿ‚·‚éƒ\ƒtƒgƒEƒFƒA‚Ì‚½‚߂ɁCTOPPERS_‚ÅŽn‚Ü‚éƒVƒ“
    191 ƒ{ƒ‹‚ð—\–ñ‚µ‚Ä‚¢‚éDƒwƒbƒ_ƒtƒ@ƒCƒ‹’†‚É‹Lq‚³‚êCƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚©‚çŽQ
    192 Æ‚Å‚«‚é“à•”ƒVƒ“ƒ{ƒ‹‚́CTOPPERS_‚ÅŽn‚Ü‚é–¼‘O‚Æ‚·‚éD
    193 
    194 ‚Ü‚½C_kernel_‚ÅŽn‚Ü‚éƒVƒ“ƒ{ƒ‹‚́CƒJ[ƒlƒ‹“à•”‚̕ϐ”‚âŠÖ”‚Ì‚½‚ß‚É—\–ñ
    195 ‚µ‚Ä‚¢‚éDƒJ[ƒlƒ‹“à•”‚̕ϐ”‚âŠÖ”‚Ì–¼‘O‚ŁCƒŠƒ“ƒNŽž‚ɃAƒvƒŠƒP[ƒVƒ‡ƒ“
    196 ‚Ì–¼‘O‚ƏՓ˂·‚é‰Â”\«‚ª‚ ‚é‚à‚̂́CƒŠƒl[ƒ€‹Lq‚ɃŠƒXƒgƒAƒbƒv‚·‚邱‚Æ
    197 ‚ŁCƒRƒ“ƒpƒCƒ‹Žž‚É_kernel_‚ÅŽn‚Ü‚é–¼‘O‚É’u‚«Š·‚¦‚邱‚Æ‚Æ‚µ‚Ä‚¢‚éD
    198 
    199 1.3 ‘½dƒCƒ“ƒNƒ‹[ƒh‚Ì–hŽ~
    200 
    201 ‚·‚ׂẴwƒbƒ_ƒtƒ@ƒCƒ‹‚́C‘½d‚ɃCƒ“ƒNƒ‹[ƒh‚³‚ê‚é‚Ì‚ð–hŽ~‚·‚邽‚߂̏ð
    202 ŒƒRƒ“ƒpƒCƒ‹‹Lq‚ð“ü‚ê‚邱‚Æ‚Æ‚·‚éD—Ⴆ‚΁Ctarget_config.h‚Å‚ ‚ê‚΁Cƒtƒ@
    203 ƒCƒ‹‚̐擪‚É
     51○目次
     52
     531. 共通事項
     54        1.1 ターゲット依存部の構成
     55        1.2 名前の衝突の防止
     56        1.3 多重インクルードの防止
     57        1.4 アセンブリ言語とのヘッダファイルの共用
     58        1.5 インクルード記述の方法
     59        1.6 クリティカルセクションの出入処理の実現に関する制約
     602. システム構築環境のターゲット依存部
     61        2.1 ターゲット略称とターゲット依存部のディレクトリ
     62        2.2 Makefileのターゲット依存部
     63        2.3 開発環境名とコマンド名の設定
     64        2.4 コンパイルオプションとオブジェクトファイルの設定
     65        2.5 リンク方法の設定
     66        2.6 依存関係の定義
     67        2.7 その他の設定
     683. TOPPERS共通定義のターゲット依存部
     69        3.1 ターゲット識別マクロ
     70        3.2 整数型の最大値・最小値・ビット数
     71        3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
     72        3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
     73        3.5 コンパイラの拡張機能のためのマクロ定義
     74        3.6 標準的な定義の上書き
     75        3.7 アサーションのための定義
     764. システムインタフェースレイヤ(SIL)のターゲット依存部
     77        4.1 全割込みロック状態の管理
     78        4.2 微少時間待ち
     79        4.3 プロセッサのエンディアン
     80        4.4 メモリ空間アクセス関数
     81        4.5 I/O空間アクセス関数
     825. カーネルAPIのターゲット依存部
     83        5.1 ターゲット定義でサポートする機能
     84        5.2 割込み優先度の範囲
     85        5.3 タイムティックの定義
     86        5.4 メモリ領域確保のための型定義
     87        5.5 メモリ領域確保のためのマクロ
     88        5.6 オーバランハンドラ機能拡張のための定義(オプション)
     896. カーネル実装のターゲット依存部
     90        6.1 カーネル実装のターゲット依存部の共通事項
     91                6.1.1  カーネル実装のターゲット依存部の構成要素
     92                6.1.2  ターゲット依存部の関数の命名規則
     93        6.2 トレースログ機能への対応
     94        6.3 システム状態の管理
     95                6.3.1  全割込みロック状態の管理
     96                6.3.2  コンテキストの管理
     97                6.3.3  CPUロック状態の管理
     98        6.4 割込みに関連するシステム状態の管理
     99                6.4.1  割込み優先度マスクの管理
     100                6.4.2  割込み要求禁止フラグの管理
     101                6.4.3  割込み要求のクリア
     102                6.4.4  割込み要求のプローブ
     103                6.4.5  割込みハンドラの先頭処理と末尾処理
     104        6.5 タスクディスパッチャ
     105                6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
     106                6.5.2 ディスパッチャ本体
     107                6.5.3 タスクコンテキストからのディスパッチ
     108                6.5.4 ディスパッチャの動作開始
     109                6.5.5 現在のコンテキストを捨ててディスパッチ
     110                6.5.6 タスクの起動処理
     111        6.6 割込みハンドラ
     112                6.6.1 割込みハンドラの出入口処理
     113                6.6.2 割込みハンドラ毎の出入口処理の生成
     114                6.6.3 割込みハンドラの設定
     115                6.6.4 割込み要求ラインの属性の設定
     116                6.6.5 割込み管理機能の初期化処理の変更
     117                6.6.6 デフォルトの割込みハンドラ
     118                6.6.7 カーネル管理外の割込み
     119        6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
     120                6.7.1 CPU例外ハンドラの出入口処理
     121                6.7.2 CPU例外ハンドラの出入口処理の生成
     122                6.7.3 CPU例外ハンドラの設定
     123                6.7.4 CPU例外管理機能の初期化処理の変更
     124                6.7.5 デフォルトのCPU例外ハンドラ
     125                6.7.6 CPU例外発生時のシステム状態の参照
     126        6.8 カーネルの起動・終了とスタック領域など
     127        6.9 カーネル内部のチューニング
     128                6.9.1 ビットマップサーチ
     129                6.9.2 ビットフィールド
     130        6.10 カーネル実装に関するその他の定義
     131                6.10.1 非タスクコンテキスト用のスタック領域
     132                6.10.2 空ラベルの定義
     133        6.11  カーネル実装のターゲット依存部のためのリネーム記述
     134        6.12 タイマドライバ
     135                6.12.1 タイマドライバのファイル構成
     136                6.12.2 タイマの初期化・終了処理・割込み処理
     137                6.12.3 性能評価用システム時刻の参照のための機能
     1387. コンフィギュレータ設定ファイルのターゲット依存部
     139        7.1 設定ファイルとターゲット依存部の位置付け
     140        7.2 パス2のテンプレートファイルのターゲット依存部
     141                7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
     142                7.2.2 ターゲット非依存部で定義される変数
     143        7.3 パス3のテンプレートファイルのターゲット依存部
     144        7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
     1458. システムサービス等のターゲット依存部
     146        8.1 システムサービスのターゲット依存部
     147        8.2 シリアルインタフェースドライバのターゲット依存部
     148                8.2.1 変数,データ型,管理関数
     149                8.2.2 デバイスサービスルーチン
     150                8.2.3 コールバックルーチン
     151        8.3 カーネル起動メッセージの出力のターゲット依存定義
     152        8.4 サンプルプログラムとテストプログラムのターゲット依存定義
     1539. その他
     154        9.1 ドキュメント
     155        9.2 パッケージ記述ファイル
     15610. リファレンス
     157        10.1 ターゲット依存部のファイル一覧
     158
     159
     1601. 共通事項
     161
     1621.1 ターゲット依存部の構成
     163
     164ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと
     165開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を
     166考慮し,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依
     167存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け
     168方は,ターゲット依存部の実装に任されている.プロセッサ依存部,チップ依
     169存部,開発環境依存部は,archディレクトリの下に置く.
     170
     171SSPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ
     172ト依存部,TOPPERS共通定義(t_stddef.h)のターゲット依存部,システムイン
     173タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h)
     174のターゲット依存部,カーネル実装のターゲット依存部(コンフィギュレータ
     175設定ファイルのターゲット依存部を含む),システムサービスのターゲット依
     176存部,ターゲット依存部に関するドキュメント等で構成される.
     177
     1781.2 名前の衝突の防止
     179
     180TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン
     181ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参
     182照できる内部シンボルは,TOPPERS_で始まる名前とする.
     183
     184また,_kernel_で始まるシンボルは,カーネル内部の変数や関数のために予約
     185している.カーネル内部の変数や関数の名前で,リンク時にアプリケーション
     186の名前と衝突する可能性があるものは,リネーム記述にリストアップすること
     187で,コンパイル時に_kernel_で始まる名前に置き換えることとしている.
     188
     1891.3 多重インクルードの防止
     190
     191すべてのヘッダファイルは,多重にインクルードされるのを防止するための条
     192件コンパイル記述を入れることとする.例えば,target_config.hであれば,ファ
     193イルの先頭に
    204194
    205195#ifndef TOPPERS_TARGET_CONFIG_H
    206196#define TOPPERS_TARGET_CONFIG_H
    207197
    208 ‚ðCƒtƒ@ƒCƒ‹‚Ì––”ö‚É
     198を,ファイルの末尾に
    209199
    210200#endif /* TOPPERS_TARGET_CONFIG_H */
    211201
    212 ‚ð‹Lq‚·‚éD
    213 
    214 1.4 ƒAƒZƒ“ƒuƒŠŒ¾Œê‚Ƃ̃wƒbƒ_ƒtƒ@ƒCƒ‹‚Ì‹¤—p
    215 
    216 SSPƒJ[ƒlƒ‹‚̃wƒbƒ_ƒtƒ@ƒCƒ‹‚Ì‘½‚­‚́CƒAƒZƒ“ƒuƒŠŒ¾Œê‚̃\[ƒXƒtƒ@ƒCƒ‹‚©‚ç
    217 ‚àƒCƒ“ƒNƒ‹[ƒh‚Å‚«‚é‚悤‚É‚·‚邽‚߂ɁCŽŸ‚̃‹[ƒ‹‚ɏ]‚Á‚Ä‹Lq‚·‚é‚à‚Ì‚Æ
    218 ‚·‚éD
    219 
    220 ETOPPERS_MACRO_ONLY‚ªƒ}ƒNƒ’è‹`‚³‚ê‚Ä‚¢‚éê‡‚ɂ́CƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‚Í
    221 @‰ðŽß‚Å‚«‚È‚¢‹Lqiƒ}ƒNƒ’è‹`ˆÈŠO‚Ì‹Lqj‚ðœ‚­‚悤‚É‹Lq‚·‚éD
    222 
    223 E•„†–³‚µ®”Œ^‚̒萔’l‚́CUINT_C‚âULONG_C‚Ȃǂ̐®”’萔‚ðì‚邽‚߂̃}
    224 @ƒNƒ‚ð—p‚¢‚Ä‹Lq‚·‚éD‚½‚¾‚µCƒAƒZƒ“ƒuƒŠŒ¾Œê‚̃\[ƒXƒtƒ@ƒCƒ‹‚©‚ç‚àƒC
    225 @ƒ“ƒNƒ‹[ƒh‚Å‚«‚éƒtƒ@ƒCƒ‹’†‚Å‚ ‚Á‚Ä‚àCCŒ¾Œê‚Ì‚Ý‚Å—p‚¢‚é’萔‚ð‚±‚ê‚ç‚Ì
    226 @ƒ}ƒNƒ‚ðŽg‚Á‚Ä‹Lq‚·‚é•K—v‚Í‚È‚¢D
    227 
    228 ‚Ü‚½CƒJ[ƒlƒ‹ŽÀ‘•‚É‚¨‚¢‚ẮCŽŸ‚̃‹[ƒ‹‚ɏ]‚¤‚à‚Ì‚Æ‚·‚éD
    229 
    230 EƒAƒZƒ“ƒuƒŠŒ¾Œê‚©‚ç‚à—p‚¢‚é’萔‚Ì’è‹`’†‚ÉŒ^ƒLƒƒƒXƒg‚ð—p‚¢‚éê‡‚ɂ́C
    231 @CASTƒ}ƒNƒ‚ð—p‚¢‚Ä‹Lq‚·‚éD
    232 
    233 ƒAƒZƒ“ƒuƒŠŒ¾Œê‚©‚çƒwƒbƒ_ƒtƒ@ƒCƒ‹‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚éÛ‚ɂ́C•K—v‚ɉž‚¶‚āC
    234 TOPPERS_MACRO_ONLYCUINC_CCULONG_CCCAST‚ðƒ}ƒNƒ’è‹`‚µ‚Ä‚©‚çCƒCƒ“ƒNƒ‹[
    235 ƒh‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    236 
    237 1.5 ƒCƒ“ƒNƒ‹[ƒh‹Lq‚Ì•û–@
    238 
    239 ŠJ”­ŠÂ‹«‚Å—pˆÓ‚³‚ê‚Ä‚¢‚é•W€ƒwƒbƒ_ƒtƒ@ƒCƒ‹‚¨‚æ‚ÑincludeƒfƒBƒŒƒNƒgƒŠ‰º‚Ì
    240 •W€ƒwƒbƒ_ƒtƒ@ƒCƒ‹‚́Cu#include <...>v‚É‚æ‚èƒCƒ“ƒNƒ‹[ƒh‚·‚éD
    241 
    242 ‚»‚Ì‘¼‚̃wƒbƒ_ƒtƒ@ƒCƒ‹‚́Cu#include "..."v‚É‚æ‚èƒCƒ“ƒNƒ‹[ƒh‚·‚éDƒwƒb
    243 ƒ_ƒtƒ@ƒCƒ‹‚ªCƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚âƒCƒ“ƒNƒ‹[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Æ“¯‚¶ƒfƒB
    244 ƒŒƒNƒgƒŠˆÈŠO‚̃fƒBƒŒƒNƒgƒŠ‚É’u‚©‚ê‚Ä‚¢‚éê‡‚ɂ́CŽŸ‚̂悤‚ɃpƒXŽw’è‚ð
    245 s‚¤D
    246 
    247 Eƒ^[ƒQƒbƒgˆË‘¶•”itarget/<ƒ^[ƒQƒbƒg–¼>j‚̃fƒBƒŒƒNƒgƒŠ‚É’u‚©‚ê‚Ä‚¢‚é
    248 @ê‡‚́CƒpƒXŽw’è‚ðs‚킸Cƒtƒ@ƒCƒ‹–¼‚Ì‚Ý‚ð‹Lq‚·‚éD
    249                 —áj#include "target_config.h"
    250 
    251 EarchƒfƒBƒŒƒNƒgƒŠ‰º‚̃fƒBƒŒƒNƒgƒŠ‚É’u‚©‚ê‚Ä‚¢‚éê‡‚ɂ́CarchƒfƒBƒŒƒN
    252 @ƒgƒŠ‚©‚ç‚Ì‘Š‘΃pƒX‚Å‹Lq‚·‚éD
    253                 —áj#include "m68k_gcc/prc_config.h"
    254 
    255 E‚»‚Ì‘¼‚̏ꍇ‚ɂ́Cƒ\[ƒXƒvƒƒOƒ‰ƒ€‚̃‹[ƒgƒfƒBƒŒƒNƒgƒŠiconfigure‚ª’u
    256 @‚©‚ê‚Ä‚¢‚éƒfƒBƒŒƒNƒgƒŠj‚©‚ç‚Ì‘Š‘΃pƒX‚Å‹Lq‚·‚éD
    257                 —áj#include "pdic/upd72001/upd72001.h"
    258 
    259 EƒJ[ƒlƒ‹‚ð\¬‚·‚éƒtƒ@ƒCƒ‹‚©‚çCkernelƒfƒBƒŒƒNƒgƒŠ‰º‚̃wƒbƒ_ƒtƒ@ƒCƒ‹
    260 @‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚éê‡‚́CƒpƒXŽw’è‚ðs‚킸Cƒtƒ@ƒCƒ‹–¼‚Ì‚Ý‚ð‹Lq‚·‚éD
    261                 —áj#include "kernel_impl.h"
    262 
    263 1.6 ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚ÌŽÀŒ»‚ÉŠÖ‚·‚鐧–ñ
    264 
    265 ƒJ[ƒlƒ‹“à‚Å—p‚¢‚éƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚ðŽÀŒ»‚·‚éê‡‚ɂ́C
    266 ŽŸ‚Ì2‚Â‚ÌðŒ‚ð–ž‚½‚·‚悤‚ÉŽÀ‘•‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    267 
    268 (1-6-1) o“üˆ—‚©‚甲‚¯‚½Žž“_‚ł́CŠ„ž‚Ý‚Ì‹ÖŽ~^‹–‰Â‚ªŠ®—¹‚µ‚Ä‚¢‚È‚¯
    269 ‚ê‚΂Ȃç‚È‚¢D—Ⴆ‚΁CŠ„ž‚Ý‹ÖŽ~^‹–‰Â–½—ß‚ðŽÀs‚µ‚Ä‚©‚çŽÀÛ‚ÉŠ„ž‚Ý‚ª
    270 ‹ÖŽ~^‹–‰Â‚³‚ê‚é‚܂ʼn½–½—ß‚©’x‰„‚·‚éƒvƒƒZƒbƒT‚̏ꍇ‚ɂ́Co“üˆ—‚Ì’†
    271 ‚ÉNOP–½—ß‚ð“ü‚ê‚é‚È‚Ç‚Ì•û–@‚ŁCo“üˆ—‚𔲂¯‚½Žž“_‚ł́CŠ„ž‚Ý‚ª‹ÖŽ~^
    272 ‹–‰Â‚³‚ꂽó‘Ô‚É‚È‚Á‚Ä‚¢‚邱‚Æ‚ð•ÛØ‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    273 
    274 (1-6-2) ƒƒ‚ƒŠã‚̃f[ƒ^\‘¢‚ª‘‚«•Ï‚í‚é‰Â”\«‚ª‚ ‚邱‚Æ‚ðC‰½‚ç‚©‚Ì•û
    275 –@‚ŃRƒ“ƒpƒCƒ‰‚É’m‚点‚È‚¯‚ê‚΂Ȃç‚È‚¢DGNUŠJ”­ŠÂ‹«‚ł́CŽŸ‚Ì‚¢‚¸‚ê‚©‚Ì
    276 •û–@‚Å‚±‚̐§–ñ‚ð–ž‚½‚·‚±‚Æ‚ª‚Å‚«‚éD
    277 
    278 (a) ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚Ì‘S‘Ì‚Ü‚½‚͏o“üˆ—‚Ì–{Ž¿“I‚È•”•ª
    279         i‹ï‘Ì“I‚ɂ́CŠ„ž‚Ý‹ÖŽ~^‹–‰Â‚·‚鏈—j‚ðiƒCƒ“ƒ‰ƒCƒ“‚Å‚È‚¢j’ʏí
    280         ‚̊֐”‚É‚æ‚èŽÀŒ»‚·‚éD
    281 
    282 (b) ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚Ì–{Ž¿“I‚È•”•ª‚ðƒCƒ“ƒ‰ƒCƒ“ƒAƒZƒ“ƒu
    283         ƒ‰‚É‚æ‚Á‚ÄŽÀŒ»‚µ‚Ä‚¢‚éê‡‚ɂ́C‚»‚̃Cƒ“ƒ‰ƒCƒ“ƒAƒZƒ“ƒuƒ‰‚Ìclobber•Ï
    284         ”ƒŠƒXƒg‚É"memory"‚ð’ljÁ‚·‚éD
    285 
    286 (c) ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚Ì–{Ž¿“I‚È•”•ª‚ªCƒ}ƒNƒ‚âƒCƒ“ƒ‰ƒC
    287         ƒ“ŠÖ”ŒÄo‚µ‚ÅŽÀŒ»‚µ‚Ä‚¢‚éê‡‚ɂ́CƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚É“ü‚鏈
    288         —‚̍Ōã‚Əo‚鏈—‚̐擪‚ɁCAsm("":::"memory")‚Æ‚¢‚¤‹Lq‚ð“ü‚ê‚éD
    289 
    290 ‚±‚̂悤‚Ȑ§–ñ‚ðÝ‚¯‚闝—R‚ɂ‚¢‚ẮCuTOPPERS/ASPƒJ[ƒlƒ‹ ÝŒvƒƒ‚v
    291 ‚́uƒJ[ƒlƒ‹‚̃f[ƒ^\‘¢‚ɑ΂·‚évolatileéŒ¾‚ɂ‚¢‚āv‚̐߂ðŽQÆ‚·‚邱
    292 ‚ƁD
    293 
    294 2. ƒVƒXƒeƒ€\’zŠÂ‹«‚̃^[ƒQƒbƒgˆË‘¶•”
    295 
    296 ‚±‚ÌÍ‚Ìà–¾‚́CGNUŠJ”­ŠÂ‹«iGCCCGASCBINUTILSCGNU Makej‚ð—p‚¢‚邱‚Æ
    297 ‚ð‘z’肵‚Ä‹Lq‚µ‚Ä‚ ‚éD‚»‚êˆÈŠO‚ÌŠJ”­ŠÂ‹«‚ð—p‚¢‚éê‡‚ɂ́CŠJ”­ŠÂ‹«‚É
    298 ‚ ‚킹‚ďC³‚·‚é•K—v‚ª‚ ‚éD
    299 
    300 2.1 ƒ^[ƒQƒbƒg—ªÌ‚ƃ^[ƒQƒbƒgˆË‘¶•”‚̃fƒBƒŒƒNƒgƒŠ
    301 
    302 V‚µ‚¢ƒ^[ƒQƒbƒgˆË‘¶•”‚ðì¬‚·‚鎞‚́C‚Ü‚¸Cƒ^[ƒQƒbƒg—ªÌ‚ð’è‚ß‚éDƒ^[
    303 ƒQƒbƒg—ªÌ‚́CƒVƒXƒeƒ€—ªÌ‚ÆŠJ”­ŠÂ‹«—ªÌ‚ð"_"‚ŘAŒ‹‚µ‚½‚à‚Ì‚Æ‚·‚éDƒVƒX
    304 ƒeƒ€—ªÌ‚É—p‚¢‚镶Žš‚͉p¬•¶Žš‚Ɛ”Žš‚Æ"_"‚ɁCŠJ”­ŠÂ‹«—ªÌ‚É—p‚¢‚镶Žš‚Í
    305 ‰p¬•¶Žš‚Ɛ”Žš‚ÉŒÀ’è‚·‚éDGNUŠJ”­ŠÂ‹«‚ÌŠJ”­ŠÂ‹«—ªÌ‚́C"gcc"‚Æ‚·‚éD—á
    306 ‚¦‚΁CƒVƒXƒeƒ€—ªÌ‚ª"dve68k"‚ŁCGNUŠJ”­ŠÂ‹«‚ð—p‚¢‚éê‡‚ɂ́Cƒ^[ƒQƒbƒg
    307 —ªÌ‚Í"dve68k_gcc"‚Æ‚È‚éD
    308 
    309 ƒ^[ƒQƒbƒgˆË‘¶•”‚̃tƒ@ƒCƒ‹‚ð’u‚­‚½‚߂ɁCtargetƒfƒBƒŒƒNƒgƒŠ‚̉º‚ɁCƒ^[
    310 ƒQƒbƒg—ªÌ‚𖼏̂Ƃ·‚éƒfƒBƒŒƒNƒgƒŠ‚ðì¬‚·‚éD‚±‚ê‚ðƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒB
    311 ƒŒƒNƒgƒŠ‚ƌĂԁD
    312 
    313 ƒ^[ƒQƒbƒgˆË‘¶•”‚©‚çƒvƒƒZƒbƒTˆË‘¶•”‚âƒ`ƒbƒvˆË‘¶•”‚ðØ‚蕪‚¯‚éê‡‚ɂ́C
    314 ˆË‘¶•”—ªÌ‚ð’è‚ß‚éDˆË‘¶•”—ªÌ‚́CƒvƒƒZƒbƒT‚âƒ`ƒbƒv‚Ì—ªÌ‚ÆŠJ”­ŠÂ‹«—ª
    315 Ì‚ð"_"‚ŘAŒ‹‚µ‚½‚à‚Ì‚Æ‚·‚éDƒvƒƒZƒbƒT‚âƒ`ƒbƒv‚Ì—ªÌ‚É—p‚¢‚镶Žš‚́C‰p
    316 ¬•¶Žš‚Ɛ”Žš‚Æ"_"‚ÉŒÀ’è‚·‚éD—Ⴆ‚΁CƒvƒƒZƒbƒT—ªÌ‚ª"m68k"‚ŁCGNUŠJ”­
    317 ŠÂ‹«‚ð—p‚¢‚éê‡‚ɂ́CˆË‘¶•”—ªÌ‚Í"m68k_gcc"‚Æ‚È‚éD
    318 
    319 ‚Ü‚½Cƒ^[ƒQƒbƒgˆË‘¶•”‚©‚çŠJ”­ŠÂ‹«ˆË‘¶•”‚ðØ‚蕪‚¯‚éê‡‚ɂ́CŠJ”­ŠÂ‹«
    320 —ªÌ‚ðˆË‘¶•”—ªÌ‚Æ‚·‚éD—Ⴆ‚΁CGNUŠJ”­ŠÂ‹«ˆË‘¶•”‚̈ˑ¶•”—ªÌ‚́C"gcc"
    321 ‚Æ‚È‚éD
    322 
    323 ‚±‚ê‚ç‚̈ˑ¶•”‚̃tƒ@ƒCƒ‹‚ð’u‚­‚½‚߂ɁCarchƒfƒBƒŒƒNƒgƒŠ‚̉º‚ɁCˆË‘¶•”—ª
    324 Ì‚𖼏̂Ƃ·‚éƒfƒBƒŒƒNƒgƒŠ‚ðì¬‚·‚éD
    325 
    326 ‚È‚¨CGNUŠJ”­ŠÂ‹«ˆÈŠO‚ÌŠJ”­ŠÂ‹«‚ð—p‚¢‚éê‡‚ɂ́CƒRƒ“ƒtƒBƒMƒ
    327 ƒŒ[ƒVƒ‡ƒ“
    328 ƒXƒNƒŠƒvƒgiconfigurejCƒTƒ“ƒvƒ‹‚ÌMakefileisample/MakefilejCˆê•”‚Ì
    329 ƒ†[ƒeƒBƒŠƒeƒBƒvƒƒOƒ‰ƒ€iutils/genoffsetCutils/makedepj‚ðC‚»‚ÌŠJ”­
    330 ŠÂ‹«—p‚É—pˆÓ‚·‚é•K—v‚ª‚ ‚éê‡‚ª‚ ‚éD‚»‚̏ꍇ‚ɂ́C‚±‚ê‚ç‚̃tƒ@ƒCƒ‹‚ðC
    331 ƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚©ŠJ”­ŠÂ‹«ˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚É’u‚­‚à‚Ì‚Æ‚·
    332 ‚éD‚Ü‚½CŠJ”­ŠÂ‹«—p‚̃vƒƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚ª•K—v‚ȏꍇ‚ɂ́Cƒ^[ƒQƒbƒg
    333 ˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚É’u‚­‚à‚Ì‚Æ‚·‚éD
    334 
    335 2.2 Makefile‚̃^[ƒQƒbƒgˆË‘¶•”
    336 
    337 Makefile‚̃^[ƒQƒbƒgˆË‘¶•”‚́Cƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚É’u‚¢‚½
    338 Makefile.target‚Ü‚½‚Í‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹iƒvƒƒZƒbƒTEƒ`ƒb
    339 ƒvEŠJ”­ŠÂ‹«ˆË‘¶•”‚Å—pˆÓ‚³‚ê‚éƒtƒ@ƒCƒ‹‚Ȃǁj‚ÉŠÜ‚ß‚éD
    340 
    341 2.3 ŠJ”­ŠÂ‹«–¼‚ƃRƒ}ƒ“ƒh–¼‚̐ݒè
    342 
    343 ŠJ”­ŠÂ‹«–¼‚ƃRƒ}ƒ“ƒh–¼‚ðÝ’è‚·‚邽‚߂ɁCMakefile‚̃^[ƒQƒbƒgˆË‘¶•”‚ÅŽŸ
    344 ‚̕ϐ”‚ð’è‹`‚·‚éD
    345 
    346 (2-3-1) TOOL                                    ŠJ”­ŠÂ‹«–¼
    347 
    348 ŠJ”­ŠÂ‹«–¼‚É’è‹`‚·‚éDGNUŠJ”­ŠÂ‹«‚ð—p‚¢‚éê‡‚ɂ́Cgcc‚É’è‹`‚·‚éD
    349 
    350 (2-3-2) GCC_TARGET                              GNUŠJ”­ŠÂ‹«‚̃^[ƒQƒbƒg–¼
    351 
    352 GNUŠJ”­ŠÂ‹«‚ð—p‚¢‚éê‡‚ɁCGNUŠJ”­ŠÂ‹«‚ðconfigure‚·‚éê‡‚ÉŽw’è‚·‚éƒ^[
    353 ƒQƒbƒg–¼‚É’è‹`‚·‚éD‚±‚±‚ÅŽw’肵‚½ƒ^[ƒQƒbƒg–¼‚́CŠJ”­ŠÂ‹«‚̃Rƒ}ƒ“ƒh–¼
    354 ‚̐擪‚É•t—^‚³‚ê‚镶Žš—ñ‚Æ‚È‚éD—Ⴆ‚΁CGCC_TARGET‚ðm68k-unknown-elf‚É
    355 ’è‹`‚µ‚½ê‡‚ɂ́CƒRƒ“ƒpƒCƒ‰‚Æ‚µ‚Äm68k-unknown-elf-gcc‚ªŽg‚í‚ê‚éD‚±‚Ì
    356 •Ï”‚ª’è‹`‚³‚ê‚È‚¢ê‡‚ɂ́C’P‚È‚égcc‚ªŽg‚í‚ê‚éD
    357 
    358 (2-3-3) CC                                              CƒRƒ“ƒpƒCƒ‰ƒhƒ‰ƒCƒo‚Ì–¼Ì
    359 (2-3-4) CXX                                             C++ƒRƒ“ƒpƒCƒ‰ƒhƒ‰ƒCƒo‚Ì–¼Ì
    360 (2-3-5) AS                                              ƒAƒZƒ“ƒuƒ‰‚Ì–¼Ì
    361 (2-3-6) LD                                              ƒŠƒ“ƒJ‚Ì–¼Ì
    362 (2-3-7) AR                                              ƒA[ƒJƒCƒo‚Ì–¼Ì
    363 (2-3-8) NM                                              nmƒvƒƒOƒ‰ƒ€‚Ì–¼Ì
    364 (2-3-9) RANLIB                                  ranlibƒvƒƒOƒ‰ƒ€‚Ì–¼Ì
    365 (2-3-10) OBJCOPY                                objcopyƒvƒƒOƒ‰ƒ€‚Ì–¼Ì
    366 (2-3-11) OBJDUMP                                objdumpƒvƒƒOƒ‰ƒ€‚Ì–¼Ì
    367 
    368 GNUŠJ”­ŠÂ‹«ˆÈŠO‚ÌŠJ”­ŠÂ‹«‚ð—p‚¢‚éê‡‚ɁC‚»‚ꂼ‚ê‚̃Rƒ}ƒ“ƒh‚Ì–¼Ì‚É’è‹`
    369 ‚·‚éD‘Ήž‚·‚éƒRƒ}ƒ“ƒh‚ª‚È‚¢ê‡‚âCƒRƒ}ƒ“ƒhƒpƒ‰ƒ[ƒ^‚ªˆÙ‚È‚éê‡‚ɂ́C
    370 Makefile’†‚Å‚»‚̃Rƒ}ƒ“ƒh‚ðŒÄ‚яo‚µ‚Ä‚¢‚é•”•ª‚ð•ÏX‚·‚é•K—v‚ª‚ ‚éD
    371 
    372 GNUŠJ”­ŠÂ‹«‚ł́C‚±‚ê‚ç‚ÍGCC_TARGET‚ð—p‚¢‚Ä’è‹`‚³‚ê‚é‚̂ŁC’è‹`‚·‚é•K—v
    373 ‚Í‚È‚¢D
    374 
    375 2.4 ƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚ƃIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚̐ݒè
    376 
    377 Makefile‚̃^[ƒQƒbƒgˆË‘¶•”‚ňȉº‚Åà–¾‚·‚é•Ï”‚ð’è‹`‚·‚鎞‚ɂ́C":="‚ð
    378 —p‚¢‚āC‚»‚ê‚Ü‚Å‚Ì’è‹`‚ɒljÁ‚·‚éŒ`‚ōs‚¤D—Ⴆ‚΁CƒRƒ“ƒpƒCƒ‰‚ɑ΂·‚é‚»
    379 ‚Ì‘¼‚̃IƒvƒVƒ‡ƒ“‚Æ‚µ‚āu-Wall -g -O2v‚ð’ljÁ‚µ‚½‚¢ê‡‚ɂ́CuCOPTS :=
    380 $(COPTS) -Wall -g -O2v‚Æ‚¢‚¤‹Lq‚ðMakefile‚̃^[ƒQƒbƒgˆË‘¶•”‚ÉŠÜ‚ß‚éD
    381 
    382 (2-4-1) COPTS                           ƒRƒ“ƒpƒCƒ‰‚ɑ΂·‚é‚»‚Ì‘¼‚̃IƒvƒVƒ‡ƒ“
    383 (2-4-2) CDEFS                           ƒ}ƒNƒ’è‹`ƒIƒvƒVƒ‡ƒ“i-DƒIƒvƒVƒ‡ƒ“j
    384 (2-4-3) INCLUDES                        ƒwƒbƒ_ƒtƒ@ƒCƒ‹‚Ì’u‚©‚ꂽƒfƒBƒŒƒNƒgƒŠŽw’èƒI
    385                                                         ƒvƒVƒ‡ƒ“i-IƒIƒvƒVƒ‡ƒ“j
    386 (2-4-4) LDFLAGS                         ƒŠƒ“ƒJ‚ɑ΂·‚é‚»‚Ì‘¼‚̃IƒvƒVƒ‡ƒ“
    387 (2-4-5) LIBS                            ƒ‰ƒCƒuƒ‰ƒŠƒŠƒ“ƒNŽw’è‚Ì‚½‚߂̃IƒvƒVƒ‡ƒ“
    388 
    389 ƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚āC‚·‚ׂẴ\[ƒXƒtƒ@ƒCƒ‹‚É‹¤’Ê‚·‚éƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡
    390 ƒ“‚̒ljÁ‚ª•K—v‚ȏꍇ‚ɂ́CƒIƒvƒVƒ‡ƒ“‚ÌŽí—Þ–ˆ‚ɏã‚ÉŽ¦‚µ‚½•Ï”‚É’è‹`‚·‚éD
    391 
    392 ‚Ù‚Æ‚ñ‚ǂ̏ꍇ‚ɁCƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚ÌMakefile.target‚ɂ́CˆÈ
    393 ‰º‚Ì‹Lq‚ðŠÜ‚ß‚é•K—v‚ª‚ ‚éD
     202を記述する.
     203
     2041.4 アセンブリ言語とのヘッダファイルの共用
     205
     206SSPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから
     207もインクルードできるようにするために,次のルールに従って記述するものと
     208する.
     209
     210・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では
     211 解釈できない記述(マクロ定義以外の記述)を除くように記述する.
     212
     213・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ
     214 クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ
     215 ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの
     216 マクロを使って記述する必要はない.
     217
     218また,カーネル実装においては,次のルールに従うものとする.
     219
     220・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には,
     221 CASTマクロを用いて記述する.
     222
     223アセンブリ言語からヘッダファイルをインクルードする際には,必要に応じて,
     224TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー
     225ドしなければならない.
     226
     2271.5 インクルード記述の方法
     228
     229開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の
     230標準ヘッダファイルは,「#include <...>」によりインクルードする.
     231
     232その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
     233ダファイルが,カレントディレクトリやインクルードするファイルと同じディ
     234レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を
     235行う.
     236
     237・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている
     238 場合は,パス指定を行わず,ファイル名のみを記述する.
     239                例)#include "target_config.h"
     240
     241・archディレクトリ下のディレクトリに置かれている場合には,archディレク
     242 トリからの相対パスで記述する.
     243                例)#include "m68k_gcc/prc_config.h"
     244
     245・その他の場合には,ソースプログラムのルートディレクトリ(configureが置
     246 かれているディレクトリ)からの相対パスで記述する.
     247                例)#include "pdic/upd72001/upd72001.h"
     248
     249・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル
     250 をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する.
     251                例)#include "kernel_impl.h"
     252
     2531.6 クリティカルセクションの出入処理の実現に関する制約
     254
     255カーネル内で用いるクリティカルセクションの出入処理を実現する場合には,
     256次の2つの条件を満たすように実装しなければならない.
     257
     258(1-6-1) 出入処理から抜けた時点では,割込みの禁止/許可が完了していなけ
     259ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが
     260禁止/許可されるまで何命令か遅延するプロセッサの場合には,出入処理の中
     261にNOP命令を入れるなどの方法で,出入処理を抜けた時点では,割込みが禁止/
     262許可された状態になっていることを保証しなければならない.
     263
     264(1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方
     265法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの
     266方法でこの制約を満たすことができる.
     267
     268(a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分
     269        (具体的には,割込み禁止/許可する処理)を(インラインでない)通常
     270        の関数により実現する.
     271
     272(b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ
     273        ラによって実現している場合には,そのインラインアセンブラのclobber変
     274        数リストに"memory"を追加する.
     275
     276(c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ
     277        ン関数呼出しで実現している場合には,クリティカルセクションに入る処
     278        理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる.
     279
     280このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」
     281の「カーネルのデータ構造に対するvolatile宣言について」の節を参照するこ
     282と.
     283
     2842. システム構築環境のターゲット依存部
     285
     286この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること
     287を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に
     288あわせて修正する必要がある.
     289
     2902.1 ターゲット略称とターゲット依存部のディレクトリ
     291
     292新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター
     293ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス
     294テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は
     295英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例
     296えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット
     297略称は"dve68k_gcc"となる.
     298
     299ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター
     300ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ
     301レクトリと呼ぶ.
     302
     303ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には,
     304依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略
     305称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英
     306小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発
     307環境を用いる場合には,依存部略称は"m68k_gcc"となる.
     308
     309また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境
     310略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc"
     311となる.
     312
     313これらの依存部のファイルを置くために,archディレクトリの下に,依存部略
     314称を名称とするディレクトリを作成する.
     315
     316なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション
     317スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の
     318ユーティリティプログラム(utils/genoffset,utils/makedep)を,その開発
     319環境用に用意する必要がある場合がある.その場合には,これらのファイルを,
     320ターゲット依存部ディレクトリか開発環境依存部ディレクトリに置くものとす
     321る.また,開発環境用のプロジェクトファイルが必要な場合には,ターゲット
     322依存部ディレクトリに置くものとする.
     323
     3242.2 Makefileのターゲット依存部
     325
     326Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた
     327Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ
     328プ・開発環境依存部で用意されるファイルなど)に含める.
     329
     3302.3 開発環境名とコマンド名の設定
     331
     332開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次
     333の変数を定義する.
     334
     335(2-3-1) TOOL                                    開発環境名
     336
     337開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する.
     338
     339(2-3-2) GCC_TARGET                              GNU開発環境のターゲット名
     340
     341GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター
     342ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名
     343の先頭に付与される文字列となる.例えば,GCC_TARGETをm68k-unknown-elfに
     344定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この
     345変数が定義されない場合には,単なるgccが使われる.
     346
     347(2-3-3) CC                                              Cコンパイラドライバの名称
     348(2-3-4) CXX                                             C++コンパイラドライバの名称
     349(2-3-5) AS                                              アセンブラの名称
     350(2-3-6) LD                                              リンカの名称
     351(2-3-7) AR                                              アーカイバの名称
     352(2-3-8) NM                                              nmプログラムの名称
     353(2-3-9) RANLIB                                  ranlibプログラムの名称
     354(2-3-10) OBJCOPY                                objcopyプログラムの名称
     355(2-3-11) OBJDUMP                                objdumpプログラムの名称
     356
     357GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義
     358する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には,
     359Makefile中でそのコマンドを呼び出している部分を変更する必要がある.
     360
     361GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必要
     362はない.
     363
     3642.4 コンパイルオプションとオブジェクトファイルの設定
     365
     366Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を
     367用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ
     368の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS :=
     369$(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める.
     370
     371(2-4-1) COPTS                           コンパイラに対するその他のオプション
     372(2-4-2) CDEFS                           マクロ定義オプション(-Dオプション)
     373(2-4-3) INCLUDES                        ヘッダファイルの置かれたディレクトリ指定オ
     374                                                        プション(-Iオプション)
     375(2-4-4) LDFLAGS                         リンカに対するその他のオプション
     376(2-4-5) LIBS                            ライブラリリンク指定のためのオプション
     377
     378ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ
     379ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する.
     380
     381ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     382下の記述を含める必要がある.
    394383
    395384----------------------------------------
     
    397386----------------------------------------
    398387
    399 ‚±‚±‚ÅTARGETDIR‚́Cƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚É’è‹`‚³‚ê‚Ä‚¢‚éD‚Ü‚½
    400 SRCDIR‚́CMakefile‚É‚¨‚¢‚āCƒ\[ƒXƒvƒƒOƒ‰ƒ€‚̃‹[ƒgƒfƒBƒŒƒNƒgƒŠ
    401 iconfigure‚ª’u‚©‚ê‚Ä‚¢‚éƒfƒBƒŒƒNƒgƒŠj‚É’è‹`‚³‚ê‚Ä‚¢‚éD
    402 
    403 ƒRƒ“ƒpƒCƒ‰‚Ì–â‘è“™‚ŁCŒxƒƒbƒZ[ƒW‚ªo‚邱‚Æ‚ð–h‚°‚È‚¢ó‹µˆÈŠO‚ł́C
    404 COPTS‚É-Werror‚ð’ljÁ‚·‚邱‚Ƃ𐄏§‚·‚éD
     388ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また
     389SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ
     390(configureが置かれているディレクトリ)に定義されている.
     391
     392コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では,
     393COPTSに-Werrorを追加することを推奨する.
    405394
    406395----------------------------------------
     
    408397----------------------------------------
    409398
    410 ƒJ[ƒlƒ‹‚̃Rƒ“ƒpƒCƒ‹Žž‚ɁCdereferencing type-punned pointer will break
    411 strict-aliasing rules‚Æ‚¢‚¤Œx‚ªo‚éê‡‚ɂ́CˆÈ‰º‚ð’ljÁ‚·‚é‚Æ‚æ‚¢D‚±
    412 ‚ÌŒxƒƒbƒZ[ƒW‚ÉŠÖ‚·‚éÚ×‚́CuTOPPERS/ASPƒJ[ƒlƒ‹ ÝŒvƒƒ‚v‚́uŒ^
    413 ƒLƒƒƒXƒg‚É”º‚¤ŒxƒƒbƒZ[ƒWv‚̐߂ðŽQÆ‚·‚邱‚ƁD
     399カーネルのコンパイル時に,dereferencing type-punned pointer will break
     400strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ
     401の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型
     402キャストに伴う警告メッセージ」の節を参照すること.
    414403
    415404----------------------------------------
     
    417406----------------------------------------
    418407
    419 ‚Ü‚½CƒAƒZƒ“ƒuƒŠŒ¾ŒêƒŒƒxƒ‹‚ÌŽ¯•Ê–¼‚ªCCŒ¾ŒêƒŒƒxƒ‹‚ÌŽ¯•Ê–¼‚̐擪‚É"_"‚ª
    420 •t‚¢‚½‚à‚Ì‚É‚È‚éê‡‚ɂ́CCDEFS‚É-DTOPPERS_LABEL_ASM‚ð’ljÁ‚·‚éD
    421 
    422 (2-4-6) SYSSVC_DIR                      ƒVƒXƒeƒ€ƒT[ƒrƒX‚̃\[ƒX‚ª’u‚©‚ꂽƒfƒBƒŒƒNƒgƒŠ
    423 (2-4-7) SYSSVC_ASMOBJS          ƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚³‚ꂽƒVƒXƒeƒ€ƒT[ƒrƒX‚Ì
    424                                                         ƒIƒuƒWƒFƒNƒg
    425 (2-4-8) SYSSVC_COBJS            CŒ¾Œê‚Å‹Lq‚³‚ꂽƒVƒXƒeƒ€ƒT[ƒrƒX‚̃IƒuƒWƒFƒNƒg
    426 (2-4-9) SYSSVC_CFLAGS           ƒVƒXƒeƒ€ƒT[ƒrƒX‚ɑ΂·‚éƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“
    427 (2-4-10) SYSSVC_LIBS            ƒVƒXƒeƒ€ƒT[ƒrƒX‚ɑ΂·‚郉ƒCƒuƒ‰ƒŠƒŠƒ“ƒNŽw’è
    428 
    429 ƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚āCƒVƒXƒeƒ€ƒT[ƒrƒXiƒVƒXƒeƒ€ƒƒOƒ^ƒXƒN‚âƒfƒoƒCƒXƒh
    430 ƒ‰ƒCƒo‚Ȃǁj‚̃\[ƒX‚ª’u‚©‚ꂽƒfƒBƒŒƒNƒgƒŠCƒVƒXƒeƒ€ƒT[ƒrƒX‚ð\¬‚·‚é
    431 ƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚̃ŠƒXƒgC‚»‚ê‚ç‚ðƒRƒ“ƒpƒCƒ‹‚·‚éÛ‚É“K—p‚·‚éƒRƒ“ƒp
    432 ƒCƒ‹ƒIƒvƒVƒ‡ƒ“C‚»‚̍\¬‚É•K—v‚ȃ‰ƒCƒuƒ‰ƒŠƒŠƒ“ƒNŽw’è‚ð’ljÁ‚·‚éê‡‚ɂ́C
    433 ã‚ÉŽ¦‚µ‚½•Ï”‚É’è‹`‚·‚éD
    434 
    435 (2-4-11) KERNEL_DIR                     ƒJ[ƒlƒ‹‚̃\[ƒX‚ª’u‚©‚ꂽƒfƒBƒŒƒNƒgƒŠ
    436 (2-4-12) KERNEL_ASMOBJS         ƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚³‚ꂽƒJ[ƒlƒ‹‚̃IƒuƒWƒFƒNƒg
    437 (2-4-13) KERNEL_COBJS           CŒ¾Œê‚Å‹Lq‚³‚ꂽƒJ[ƒlƒ‹‚̃IƒuƒWƒFƒNƒg
    438 (2-4-14) KERNEL_CFLAGS          ƒJ[ƒlƒ‹‚ɑ΂·‚éƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“
    439 
    440 ƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚āCƒJ[ƒlƒ‹‚̃\[ƒX‚ª’u‚©‚ꂽƒfƒBƒŒƒNƒgƒŠCƒJ[ƒlƒ‹
    441 ‚ð\¬‚·‚éƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚̃ŠƒXƒgC‚»‚ê‚ç‚ðƒRƒ“ƒpƒCƒ‹‚·‚éÛ‚É“K—p
    442 ‚·‚éƒRƒ“ƒpƒCƒ‹ƒIƒvƒVƒ‡ƒ“‚ð’ljÁ‚·‚éê‡‚ɂ́Cã‚ÉŽ¦‚µ‚½•Ï”‚É’è‹`‚·‚éD
    443 
    444 ‚Ù‚Æ‚ñ‚ǂ̏ꍇ‚ɁCƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚ÌMakefile.target‚ɂ́CˆÈ
    445 ‰º‚Ì‹Lq‚ðŠÜ‚ß‚é•K—v‚ª‚ ‚éD
     408また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に"_"が
     409付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する.
     410
     411(2-4-6) SYSSVC_DIR                      システムサービスのソースが置かれたディレクトリ
     412(2-4-7) SYSSVC_ASMOBJS          アセンブリ言語で記述されたシステムサービスの
     413                                                        オブジェクト
     414(2-4-8) SYSSVC_COBJS            C言語で記述されたシステムサービスのオブジェクト
     415(2-4-9) SYSSVC_CFLAGS           システムサービスに対するコンパイルオプション
     416(2-4-10) SYSSVC_LIBS            システムサービスに対するライブラリリンク指定
     417
     418ターゲットに依存して,システムサービス(システムログタスクやデバイスド
     419ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する
     420オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ
     421イルオプション,その構成に必要なライブラリリンク指定を追加する場合には,
     422上に示した変数に定義する.
     423
     424(2-4-11) KERNEL_DIR                     カーネルのソースが置かれたディレクトリ
     425(2-4-12) KERNEL_ASMOBJS         アセンブリ言語で記述されたカーネルのオブジェクト
     426(2-4-13) KERNEL_COBJS           C言語で記述されたカーネルのオブジェクト
     427(2-4-14) KERNEL_CFLAGS          カーネルに対するコンパイルオプション
     428
     429ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル
     430を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用
     431するコンパイルオプションを追加する場合には,上に示した変数に定義する.
     432
     433ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     434下の記述を含める必要がある.
    446435
    447436----------------------------------------
     
    451440----------------------------------------
    452441
    453 (2-4-15) CFG_TABS                       ƒRƒ“ƒtƒBƒMƒ
    454 ƒŒ[ƒ^‚ɑ΂·‚éƒIƒvƒVƒ‡ƒ“
    455 
    456 ƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚āCƒRƒ“ƒtƒBƒMƒ
    457 ƒŒ[ƒ^‚ɑ΂·‚éƒIƒvƒVƒ‡ƒ“‚ð’ljÁ‚·‚éê
    458 ‡‚ɂ́Cã‚ÉŽ¦‚µ‚½•Ï”‚É’è‹`‚·‚éD‹ï‘Ì“I‚ɂ́CƒRƒ“ƒtƒBƒMƒ
    459 ƒŒ[ƒ^‚Ì’lŽæ
    460 “¾ƒVƒ“ƒ{ƒ‹ƒe[ƒuƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”itarget_def.csvj‚ª‚ ‚éê‡‚ɂ́C
    461 ‚»‚ê‚ðŽw’è‚·‚éƒIƒvƒVƒ‡ƒ“‚ð’ljÁ‚·‚é•K—v‚ª‚ ‚éD
    462 
    463 ‚Ù‚Æ‚ñ‚ǂ̏ꍇ‚ɁCƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚ÌMakefile.target‚ɂ́CˆÈ
    464 ‰º‚Ì‹Lq‚ðŠÜ‚ß‚é•K—v‚ª‚ ‚éD
     442(2-4-15) CFG_TABS                       コンフィギュレータに対するオプション
     443
     444ターゲットに依存して,コンフィギュレータに対するオプションを追加する場
     445合には,上に示した変数に定義する.具体的には,コンフィギュレータの値取
     446得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には,
     447それを指定するオプションを追加する必要がある.
     448
     449ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     450下の記述を含める必要がある.
    465451
    466452----------------------------------------
     
    468454----------------------------------------
    469455
    470 (2-4-16) CFG1_OUT_LDFLAGS       cfg1_out.c‚ɑ΂·‚郊ƒ“ƒNƒIƒvƒVƒ‡ƒ“
    471 
    472 ƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚āCcfg1_out.c‚ðƒŠƒ“ƒN‚·‚éÛ‚É“K—p‚·‚éƒIƒvƒVƒ‡ƒ“‚ð’Ç
    473 ‰Á‚·‚éê‡‚ɂ́Cã‚ÉŽ¦‚µ‚½•Ï”‚É’è‹`‚·‚éD
    474 
    475 (2-4-17) CFG_OBJS                       ƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    476 ƒŒ[ƒVƒ‡ƒ“‚Ì‚½‚߂̃Iƒu
    477                                                         ƒWƒFƒNƒg
    478 
    479 ƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚āCƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    480 ƒŒ[ƒVƒ‡ƒ“‚Ì‚½‚߂̃IƒuƒWƒFƒN
    481 ƒgƒtƒ@ƒCƒ‹‚ðikernel_cfg.oˆÈŠO‚Ɂj’ljÁ‚·‚éê‡‚ɂ́Cã‚ÉŽ¦‚µ‚½•Ï”‚É’è
    482 ‹`‚·‚éD‚±‚̏ꍇC’ljÁ‚µ‚½ƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚̍쐬ƒ‹[ƒ‹iƒRƒ“ƒpƒCƒ‹^
    483 ƒAƒZƒ“ƒuƒ‹ƒ‹[ƒ‹‚ƈˑ¶ŠÖŒWì¬ƒ‹[ƒ‹j‚ðCMakefile‚̃^[ƒQƒbƒgˆË‘¶•”‚É
    484 ‹Lq‚·‚é•K—v‚ª‚ ‚éD
     456(2-4-16) CFG1_OUT_LDFLAGS       cfg1_out.cに対するリンクオプション
     457
     458ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追
     459加する場合には,上に示した変数に定義する.
     460
     461(2-4-17) CFG_OBJS                       システムコンフィギュレーションのためのオブ
     462                                                        ジェクト
     463
     464ターゲットに依存して,システムコンフィギュレーションのためのオブジェク
     465トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定
     466義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/
     467アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に
     468記述する必要がある.
    485469
    486470(2-4-18) CFG2_OUT
    487471
    488 ƒ^[ƒQƒbƒg‚Ɉˑ¶‚µ‚āCƒRƒ“ƒtƒBƒMƒ
    489 ƒŒ[ƒ^‚̃pƒX2‚Åkernel_cfg.c‚Æ
    490 kernel_cfg.hˆÈŠO‚̃tƒ@ƒCƒ‹‚𐶐¬‚·‚éê‡‚ɂ́Cã‚ÉŽ¦‚µ‚½•Ï”‚É’è‹`‚·‚éD
     472ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと
     473kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する.
    491474
    492475(2-4-19) OMIT_WARINIG_ALL
    493476(2-4-20) OMIT_OPTIMIZATION
    494477
    495 ƒTƒ“ƒvƒ‹‚ÌMakefile‚ł́CƒRƒ“ƒpƒCƒ‰‚ɑ΂·‚éƒIƒvƒVƒ‡ƒ“‚Ɂu-Wall -g -O2v
    496 ‚ð’ljÁ‚·‚éD-Wall‚ð’ljÁ‚µ‚½‚­‚È‚¢ê‡‚ɂ́CMakefile‚̃^[ƒQƒbƒgˆË‘¶•”‚Å
    497 OMIT_WARNING_ALL‚ð"true"‚É’è‹`‚·‚éD-O2‚ð’ljÁ‚µ‚½‚­‚È‚¢ê‡‚ɂ́C
    498 Makefile‚̃^[ƒQƒbƒgˆË‘¶•”‚ÅOMIT_OPTIMIZATION‚ð"true"‚É’è‹`‚·‚éD
    499 
    500 2.5 ƒŠƒ“ƒN•û–@‚̐ݒè
    501 
    502 (2-5-1) LDSCRIPT                                ƒŠƒ“ƒJƒXƒNƒŠƒvƒg‚̃tƒ@ƒCƒ‹–¼
    503 
    504 ŠJ”­ŠÂ‹«‚É•W€‚̃Šƒ“ƒJƒXƒNƒŠƒvƒg‚ªŽg—p‚Å‚«‚È‚¢ê‡‚ɂ́Cƒ^[ƒQƒbƒgˆË‘¶
    505 •”‚ŃŠƒ“ƒJƒXƒNƒŠƒvƒg‚ð—pˆÓ‚µC‚»‚̃tƒ@ƒCƒ‹–¼‚ð‚±‚Ì•Ï”‚É’è‹`‚·‚éD
    506 
    507 (2-5-2) TEXT_START_ADDRESS              ƒeƒLƒXƒgƒZƒNƒVƒ‡ƒ“‚̐擪”Ô’n
    508 (2-5-3) DATA_START_ADDRESS              ƒf[ƒ^ƒZƒNƒVƒ‡ƒ“‚̐擪”Ô’n
    509 
    510 ŠeƒZƒNƒVƒ‡ƒ“‚̐擪”Ô’n‚ÌŽw’肪•K—v‚ȏꍇ‚ɂ́C‚±‚ê‚ç‚̕ϐ”‚ɐ擪”Ô’n‚ð
    511 ’è‹`‚·‚éD
    512 
    513 (2-5-4) START_OBJS                              æ“ª‚ɃŠƒ“ƒN‚·‚ׂ«ƒ‚ƒWƒ
    514 [ƒ‹–¼
    515 (2-5-5) END_OBJS                                ÅŒã‚ɃŠƒ“ƒN‚·‚ׂ«ƒ‚ƒWƒ
    516 [ƒ‹–¼
    517 
    518 ƒ^[ƒQƒbƒg‚É‚æ‚Á‚ẮCƒ[ƒhƒ‚ƒWƒ
    519 [ƒ‹‚̐擪‚ƍŌã‚ɃŠƒ“ƒN‚·‚ׂ«ƒ‚ƒWƒ
    520 [
    521 ƒ‹‚ðCƒ^[ƒQƒbƒgˆË‘¶•”‚Å—pˆÓ‚·‚é•K—v‚ª‚ ‚éD‘½‚­‚̏ꍇCƒXƒ^[ƒgƒAƒbƒv
    522 ƒ‚ƒWƒ
    523 [ƒ‹‚ðƒ[ƒhƒ‚ƒWƒ
    524 [ƒ‹‚̐擪‚ɃŠƒ“ƒN‚·‚é•K—v‚ª‚ ‚éD
    525 
    526 ƒ[ƒhƒ‚ƒWƒ
    527 [ƒ‹‚̐擪‚ɃŠƒ“ƒN‚·‚ׂ«ƒvƒƒOƒ‰ƒ€‚ª‚ ‚éê‡‚ɂ́CMakefile
    528 ‚̃^[ƒQƒbƒgˆË‘¶•”‚É‚¨‚¢‚āC‚»‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹–¼‚ðSTART_OBJS‚É’è
    529 ‹`‚µC‚»‚ê‚ɑ΂·‚éƒRƒ“ƒpƒCƒ‹ƒ‹[ƒ‹‚ƈˑ¶ŠÖŒWì¬ƒ‹[ƒ‹‚ð’è‹`‚·‚éDƒ[
    530 ƒhƒ‚ƒWƒ
    531 [ƒ‹‚̍Ōã‚ɃŠƒ“ƒN‚·‚ׂ«ƒ‚ƒWƒ
    532 [ƒ‹‚ª‚ ‚éê‡‚ɂ́C‚»‚̃IƒuƒWƒF
    533 ƒNƒgƒtƒ@ƒCƒ‹–¼‚ðEND_OBJS‚É’è‹`‚µC‚»‚ê‚ɑ΂·‚éƒRƒ“ƒpƒCƒ‹ƒ‹[ƒ‹‚ƈˑ¶ŠÖ
    534 ŒWì¬ƒ‹[ƒ‹‚ð’è‹`‚·‚éD‚Ü‚½C•W€‚̃Xƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    535 [ƒ‹icrt0.oj
    536 ‚ðƒŠƒ“ƒN‚µ‚È‚¢‚悤‚ɁCLDFLAGS‚É-nostdlib‚ð’ljÁ‚·‚é•K—v‚ª‚ ‚éD‚³‚ç
    537 ‚ɁC-nostdlib‚ð‚‚¯‚邱‚Æ‚Å•W€ƒ‰ƒCƒuƒ‰ƒŠ‚ªƒŠƒ“ƒN‚³‚ê‚È‚­‚Ȃ邽‚߁C
    538 LIBS‚É-lgcc‚ð’ljÁ‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    539 
    540 —Ⴆ‚΁CƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    541 [ƒ‹‚̃\[ƒXƒtƒ@ƒCƒ‹‚ªstart.S‚̏ꍇ‚ɂ́C
    542 Makefile‚̃^[ƒQƒbƒgˆË‘¶•”‚ÉŽŸ‚̂悤‚È‹Lq‚ð“ü‚ê‚é‚Æ‚æ‚¢D
     478サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」
     479を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で
     480OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には,
     481Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する.
     482
     4832.5 リンク方法の設定
     484
     485(2-5-1) LDSCRIPT                                リンカスクリプトのファイル名
     486
     487開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存
     488部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する.
     489
     490(2-5-2) TEXT_START_ADDRESS              テキストセクションの先頭番地
     491(2-5-3) DATA_START_ADDRESS              データセクションの先頭番地
     492
     493各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を
     494定義する.
     495
     496(2-5-4) START_OBJS                              先頭にリンクすべきモジュール名
     497(2-5-5) END_OBJS                                最後にリンクすべきモジュール名
     498
     499ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきモジュー
     500ルを,ターゲット依存部で用意する必要がある.多くの場合,スタートアップ
     501モジュールをロードモジュールの先頭にリンクする必要がある.
     502
     503ロードモジュールの先頭にリンクすべきプログラムがある場合には,Makefile
     504のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定
     505義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー
     506ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ
     507クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関
     508係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o)
     509をリンクしないように,LDFLAGSに-nostdlibを追加する必要がある.さら
     510に,-nostdlibをつけることで標準ライブラリがリンクされなくなるため,
     511LIBSに-lgccを追加しなければならない.
     512
     513例えば,スタートアップモジュールのソースファイルがstart.Sの場合には,
     514Makefileのターゲット依存部に次のような記述を入れるとよい.
    543515
    544516----------------------------------------
    545 # ƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    546 [ƒ‹‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹–¼
     517# スタートアップモジュールのオブジェクトファイル名
    547518START_OBJS = start.o
    548519
    549 # ƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    550 [ƒ‹‚̃Rƒ“ƒpƒCƒ‹ƒ‹[ƒ‹
     520# スタートアップモジュールのコンパイルルール
    551521$(START_OBJS): %.o: %.S
    552522        $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
    553523
    554 # ƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    555 [ƒ‹‚̈ˑ¶ŠÖŒWì¬ƒ‹[ƒ‹
     524# スタートアップモジュールの依存関係作成ルール
    556525$(START_OBJS:.o=.d): %.d: %.S
    557526        @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
    558527                -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
    559528
    560 # ƒŠƒ“ƒJ‚ɑ΂·‚éƒIƒvƒVƒ‡ƒ“
     529# リンカに対するオプション
    561530LDFLAGS := -nostdlib $(LDFLAGS)
    562531LIBS := $(LIBS) -lgcc
    563532----------------------------------------
    564533
    565 ‚Ü‚½CGNUŠJ”­ŠÂ‹«‚ŁCƒRƒ“ƒpƒCƒ‰‚É•W€‚Ìcrtbegin.o‚Æcrtend.o‚ð—p‚¢‚éê‡
    566 ‚ɂ́CMakefile ‚̃^[ƒQƒbƒgˆË‘¶•”‚ÉŽŸ‚̂悤‚È‹Lq‚ð“ü‚ê‚é‚Æ‚æ‚¢D
     534また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合
     535には,Makefile のターゲット依存部に次のような記述を入れるとよい.
    567536
    568537----------------------------------------
    569 # ƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹–¼
     538# オブジェクトファイル名
    570539START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
    571540END_OBJS = $(shell $(CC) -print-file-name=crtend.o)
    572541
    573 # ˆË‘¶ŠÖŒWì¬ƒ‹[ƒ‹
     542# 依存関係作成ルール
    574543$(START_OBJS:.o=.d): %.d:
    575544$(END_OBJS:.o=.d): %.d:
    576545
    577 # ƒŠƒ“ƒJ‚ɑ΂·‚éƒIƒvƒVƒ‡ƒ“
     546# リンカに対するオプション
    578547LDFLAGS := -nostdlib $(LDFLAGS)
    579548LIBS := $(LIBS) -lgcc
    580549----------------------------------------
    581550
    582 ‚±‚̏ꍇC‚±‚ê‚ç‚̃tƒ@ƒCƒ‹‚ðƒRƒ“ƒpƒCƒ‹‚·‚邱‚Æ‚Í‚È‚¢‚½‚߁CƒRƒ“ƒpƒCƒ‹ƒ‹[
    583 ƒ‹‚Í•s—v‚Å‚ ‚éD‚Ü‚½CˆË‘¶ŠÖŒWì¬ƒ‹[ƒ‹‚̓_ƒ~[‚Å‚æ‚¢iˆË‘¶ŠÖŒWì¬ƒ‹[
    584 ƒ‹‚ª‚È‚¢‚ƃGƒ‰[‚É‚È‚éjD
    585 
    586 (2-5-6) HIDDEN_OBJS                             Žw’肵‚È‚­‚Ä‚àƒŠƒ“ƒN‚³‚ê‚郂ƒWƒ
    587 [ƒ‹–¼
    588 
    589 ƒ[ƒhƒ‚ƒWƒ
    590 [ƒ‹‚ɃŠƒ“ƒN‚·‚ׂ«ƒ‚ƒWƒ
    591 [ƒ‹‚ðCƒŠƒ“ƒJ‚ɑ΂·‚éƒpƒ‰ƒ[ƒ^‚Å
    592 ‚Í‚È‚­CƒŠƒ“ƒJƒXƒNƒŠƒvƒg’†‚Ɂi—Ⴆ‚΁CGNUŠJ”­ŠÂ‹«‚̃Šƒ“ƒJƒXƒNƒŠƒvƒg‚Ì
    593 STARTUP‚ðŽg‚Á‚āj‹Lq‚·‚éê‡‚ɂ́C‚»‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹–¼‚ðC
    594 iSTART_OBJS‚Ü‚½‚ÍEND_OBJS‚Å‚Í‚È‚­jHIDDEN_OBJS‚É’è‹`‚µC‚»‚ê‚ɑ΂·‚éƒR
    595 ƒ“ƒpƒCƒ‹ƒ‹[ƒ‹‚ƈˑ¶ŠÖŒWì¬ƒ‹[ƒ‹‚ð’è‹`‚·‚éDHIDDEN_OBJS‚É’è‹`‚µ‚½ƒ‚
    596 ƒWƒ
    597 [ƒ‹‚́CƒŠƒ“ƒJ‚ɑ΂·‚éƒpƒ‰ƒ[ƒ^‚©‚ç‚͏œŠO‚³‚ê‚éDLIBS‚ÆLDFLAGS‚É‚Â
    598 ‚¢‚ẮCSTART_OBJS‚Ü‚½‚ÍEND_OBJS‚ð—p‚¢‚éê‡‚Æ“¯—l‚Å‚ ‚éD
    599 
    600 —Ⴆ‚΁CƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    601 [ƒ‹‚̃\[ƒXƒtƒ@ƒCƒ‹‚ªstart.S‚ŁCstart.o‚ð
    602 ƒŠƒ“ƒN‚·‚邱‚Æ‚ðƒŠƒ“ƒJƒXƒNƒŠƒvƒg’†‚É‹Lq‚·‚éê‡‚ɂ́CMakefile‚̃^[ƒQƒb
    603 ƒgˆË‘¶•”‚ÉŽŸ‚̂悤‚È‹Lq‚ð“ü‚ê‚é‚Æ‚æ‚¢D
     551この場合,これらのファイルをコンパイルすることはないため,コンパイルルー
     552ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
     553ルがないとエラーになる).
     554
     555(2-5-6) HIDDEN_OBJS                             指定しなくてもリンクされるモジュール名
     556
     557ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで
     558はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの
     559STARTUPを使って)記述する場合には,そのオブジェクトファイル名を,
     560(START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ
     561ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ
     562ジュールは,リンカに対するパラメータからは除外される.LIBSとLDFLAGSにつ
     563いては,START_OBJSまたはEND_OBJSを用いる場合と同様である.
     564
     565例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを
     566リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ
     567ト依存部に次のような記述を入れるとよい.
    604568
    605569----------------------------------------
    606 # ƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    607 [ƒ‹‚̃IƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹–¼
     570# スタートアップモジュールのオブジェクトファイル名
    608571HIDDEN_OBJS = start.o
    609572
    610 # ƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    611 [ƒ‹‚̃Rƒ“ƒpƒCƒ‹ƒ‹[ƒ‹
     573# スタートアップモジュールのコンパイルルール
    612574$(HIDDEN_OBJS): %.o: %.S
    613575        $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
    614576
    615 # ƒXƒ^[ƒgƒAƒbƒvƒ‚ƒWƒ
    616 [ƒ‹‚̈ˑ¶ŠÖŒWì¬ƒ‹[ƒ‹
     577# スタートアップモジュールの依存関係作成ルール
    617578$(HIDDEN_OBJS:.o=.d): %.d: %.S
    618579        @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
    619580                -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
    620581
    621 # ƒŠƒ“ƒJ‚ɑ΂·‚éƒIƒvƒVƒ‡ƒ“
     582# リンカに対するオプション
    622583LDFLAGS := -nostdlib $(LDFLAGS)
    623584LIBS := $(LIBS) -lgcc
    624585----------------------------------------
    625586
    626 2.6 ˆË‘¶ŠÖŒW‚Ì’è‹`
    627 
    628 ƒRƒ“ƒtƒBƒMƒ
    629 ƒŒ[ƒ^‚ÌŠeƒpƒX‚ɑ΂µ‚āCƒ^[ƒQƒbƒgˆË‘¶‚̃tƒ@ƒCƒ‹‚ւ̈ˑ¶ŠÖ
    630 ŒW‚ð’è‹`‚·‚éD‹ï‘Ì“I‚ɂ́CƒpƒX1CƒpƒX2CƒpƒX3‚ªˆË‘¶‚·‚éƒtƒ@ƒCƒ‹‚ðC‚»‚ê
    631 ‚¼‚êcfg1_out.cCkernel_cfg.timestampC$(OBJFILE)‚ɑ΂·‚éˆË‘¶ŠÖŒW‚ÌŒ`‚Å
    632 ‹Lq‚·‚éD
    633 
    634 ‚Ù‚Æ‚ñ‚ǂ̏ꍇ‚ɁCƒ^[ƒQƒbƒgˆË‘¶•”ƒfƒBƒŒƒNƒgƒŠ‚ÌMakefile.target‚ɂ́CˆÈ
    635 ‰º‚Ì‹Lq‚ðŠÜ‚ß‚é•K—v‚ª‚ ‚éD
     5872.6 依存関係の定義
     588
     589コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関
     590係を定義する.具体的には,パス1,パス2,パス3が依存するファイルを,それ
     591ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で
     592記述する.
     593
     594ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     595下の記述を含める必要がある.
    636596
    637597----------------------------------------
     
    641601----------------------------------------
    642602
    643 2.7 ‚»‚Ì‘¼‚̐ݒè
    644 
    645 (2-7-1) CLEAN_FILES                             clean‚É‚æ‚èíœ‚·‚éƒtƒ@ƒCƒ‹–¼
    646 
    647 clean‚É‚æ‚èíœ‚·‚éƒtƒ@ƒCƒ‹‚ðƒ^[ƒQƒbƒgˆË‘¶•”‚ŒljÁ‚µ‚½‚¢ê‡‚ɂ́Cƒtƒ@
    648 ƒCƒ‹–¼‚ð‚±‚Ì•Ï”‚ɒljÁ’è‹`‚·‚éD
    649 
    650 (2-7-2) REALCLEAN_FILES                 realclean‚É‚æ‚èíœ‚·‚éƒtƒ@ƒCƒ‹–¼
    651 
    652 realclean‚É‚æ‚èíœ‚·‚éƒtƒ@ƒCƒ‹‚ðƒ^[ƒQƒbƒgˆË‘¶•”‚ŒljÁ‚µ‚½‚¢ê‡‚ɂ́C
    653 ƒtƒ@ƒCƒ‹–¼‚ð‚±‚Ì•Ï”‚ɒljÁ’è‹`‚·‚éD
    654 
    655 
    656 3. TOPPERS‹¤’Ê’è‹`‚̃^[ƒQƒbƒgˆË‘¶•”
    657 
    658 TOPPERS‹¤’Ê’è‹`it_stddef.hj‚̃^[ƒQƒbƒgˆË‘¶•”‚́Ctarget_stddef.h‚Ü‚½
    659 ‚Í‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹iƒvƒƒZƒbƒTEƒ`ƒbƒvEŠJ”­ŠÂ‹«ˆË‘¶
    660 •”‚Å—pˆÓ‚³‚ê‚éƒwƒbƒ_ƒtƒ@ƒCƒ‹‚Ȃǁj‚ÉŠÜ‚ß‚éD
    661 
    662 3.1 ƒ^[ƒQƒbƒgŽ¯•Êƒ}ƒNƒ
    663 
    664 ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚âƒVƒXƒeƒ€ƒT[ƒrƒX‚Ń^[ƒQƒbƒg‚ðŽ¯•Ê‚·‚邽‚߂ɁC
    665 "TOPPERS_"‚ɃVƒXƒeƒ€—ªÌ‚ð‘啶Žš‚É‚µ‚½•¶Žš—ñ‚ð˜AŒ‹‚µ‚½‚à‚́i—Ⴆ‚΁C
    666 "TOPPERS_DVE68K"j‚ðƒ}ƒNƒ’è‹`‚·‚éD
    667 
    668 ‚Ü‚½Cƒ^[ƒQƒbƒgˆË‘¶•”‚©‚çƒvƒƒZƒbƒTˆË‘¶•”‚âƒ`ƒbƒvˆË‘¶•”‚ðØ‚蕪‚¯‚½ê
    669 ‡‚ɂ́C"TOPPERS_"‚Ɉˑ¶•”—ªÌ‚ð‘啶Žš‚É‚µ‚½•¶Žš—ñ‚ð˜AŒ‹‚µ‚½‚à‚́i—Ⴆ
    670 ‚΁C"TOPPERS_M68K"j‚ðƒ}ƒNƒ’è‹`‚·‚éD
    671 
    672 3.2 ®”Œ^‚̍őå’lEÅ¬’lEƒrƒbƒg”
    673 
    674 (3-2-1) INT_MAX                         int‚ÉŠi”[‚Å‚«‚éÅ‘å’liC90€‹’j
    675 (3-2-2) INT_MIN                         int‚ÉŠi”[‚Å‚«‚éÅ¬’liC90€‹’j
    676 (3-2-3) UINT_MAX                        unsigned int‚ÉŠi”[‚Å‚«‚éÅ‘å’liC90€‹’j
    677 (3-2-4) LONG_MAX                        long‚ÉŠi”[‚Å‚«‚éÅ‘å’liC90€‹’j
    678 (3-2-5) LONG_MIN                        long‚ÉŠi”[‚Å‚«‚éÅ¬’liC90€‹’j
    679 (3-2-6) ULONG_MAX                       unsigned long‚ÉŠi”[‚Å‚«‚éÅ‘å’liC90€‹’j
    680 (3-2-7) CHAR_BIT                        charŒ^‚̃rƒbƒg”iC90€‹’j
    681 
    682 ®”Œ^‚̍őå’lEÅ¬’lEƒrƒbƒg”‚ðC‚±‚ê‚ç‚̃Vƒ“ƒ{ƒ‹‚Ƀ}ƒNƒ‚É’è‹`‚·‚éD
    683 
    684 ‚±‚ê‚ç‚̃}ƒNƒ‚́CC90‚ɏ€‹’‚µ‚½‚à‚Ì‚Å‚ ‚éDŠJ”­ŠÂ‹«‚ÉC90‚ɏ€‹’‚µ‚½
    685 limits.h‚ª—pˆÓ‚³‚ê‚Ä‚¢‚éê‡‚ɂ́C‚±‚ê‚ç‚̃}ƒNƒ‚ð’è‹`‚·‚邱‚Ƃɑウ‚āC
    686 limits.h‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚ê‚΂悢D
    687 
    688 3.3 ƒTƒCƒY‚ÌŽw’肳‚ꂽ®”Œ^C‚»‚̍őå’lEÅ¬’lC®”’萔‚ðì‚éƒ}ƒNƒ
    689 
    690 (3-3-1) int8_t                          •„†•t‚«8ƒrƒbƒg®”iƒIƒvƒVƒ‡ƒ“CC99€‹’j
    691 (3-3-2) uint8_t                         •„†–³‚µ8ƒrƒbƒg®”iƒIƒvƒVƒ‡ƒ“CC99€‹’j
    692 (3-3-3) int16_t                         •„†•t‚«16ƒrƒbƒg®”iC99€‹’j
    693 (3-3-4) uint16_t                        •„†–³‚µ16ƒrƒbƒg®”iC99€‹’j
    694 (3-3-5) int32_t                         •„†•t‚«32ƒrƒbƒg®”iC99€‹’j
    695 (3-3-6) uint32_t                        •„†–³‚µ32ƒrƒbƒg®”iC99€‹’j
    696 (3-3-7) int64_t                         •„†•t‚«64ƒrƒbƒg®”iƒIƒvƒVƒ‡ƒ“CC99€‹’j
    697 (3-3-8) uint64_t                        •„†–³‚µ64ƒrƒbƒg®”iƒIƒvƒVƒ‡ƒ“CC99€‹’j
    698 (3-3-9) int128_t                        •„†•t‚«128ƒrƒbƒg®”iƒIƒvƒVƒ‡ƒ“CC99€‹’j
    699 (3-3-10) uint128_t                      •„†–³‚µ128ƒrƒbƒg®”iƒIƒvƒVƒ‡ƒ“CC99€‹’j
    700 (3-3-11) int_least8_t           8ƒrƒbƒgˆÈã‚Ì•„†•t‚«®”iC99€‹’j
    701 (3-3-12) uint_least8_t          8ƒrƒbƒgˆÈã‚Ì•„†–³‚µ®”iC99€‹’j
    702 (3-3-13) intptr_t                       ƒ|ƒCƒ“ƒ^‚ðŠi”[‚Å‚«‚éƒTƒCƒY‚Ì•„†•t‚«®”iC99€‹’j
    703 (3-3-14) uintptr_t                      ƒ|ƒCƒ“ƒ^‚ðŠi”[‚Å‚«‚éƒTƒCƒY‚Ì•„†–³‚µ®”iC99€‹’j
    704 (3-3-15) INT8_MAX                       int8_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    705 (3-3-16) INT8_MIN                       int8_t‚ÉŠi”[‚Å‚«‚éÅ¬’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    706 (3-3-17) UINT8_MAX                      uint8_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    707 (3-3-18) INT16_MAX                      int16_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liC99€‹’j
    708 (3-3-19) INT16_MIN                      int16_t‚ÉŠi”[‚Å‚«‚éÅ¬’liC99€‹’j
    709 (3-3-20) UINT16_MAX                     uint16_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liC99€‹’j
    710 (3-3-21) INT32_MAX                      int32_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liC99€‹’j
    711 (3-3-22) INT32_MIN                      int32_t‚ÉŠi”[‚Å‚«‚éÅ¬’liC99€‹’j
    712 (3-3-23) UINT32_MAX                     uint32_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liC99€‹’j
    713 (3-3-24) INT64_MAX                      int64_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    714 (3-3-25) INT64_MIN                      int64_t‚ÉŠi”[‚Å‚«‚éÅ¬’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    715 (3-3-26) UINT64_MAX                     uint64_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    716 (3-3-27) INT128_MAX                     int128_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    717 (3-3-28) INT128_MIN                     int128_t‚ÉŠi”[‚Å‚«‚éÅ¬’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    718 (3-3-29) UINT128_MAX            uint128_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liƒIƒvƒVƒ‡ƒ“CC99€‹’j
    719 (3-3-30) INT_LEAST8_MAX         int_least8_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liC99€‹’j
    720 (3-3-31) INT_LEAST8_MIN         int_least8_t‚ÉŠi”[‚Å‚«‚éÅ¬’liC99€‹’j
    721 (3-3-32) UINT_LEAST8_MAX        uint_least8_t‚ÉŠi”[‚Å‚«‚éÅ‘å’liC99€‹’j
    722 (3-3-33) INT8_C(val)            int_least8_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiC99€‹’j
    723 (3-3-34) UINT8_C(val)           uint_least8_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiC99€‹’j
    724 (3-3-35) INT16_C(val)           int16_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiC99€‹’j
    725 (3-3-36) UINT16_C(val)          uint16_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiC99€‹’j
    726 (3-3-37) INT32_C(val)           int32_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiC99€‹’j
    727 (3-3-38) UINT32_C(val)          uint32_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiC99€‹’j
    728 (3-3-39) INT64_C(val)           int64_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiƒIƒvƒVƒ‡ƒ“CC99€‹’j
    729 (3-3-40) UINT64_C(val)          uint64_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiƒIƒvƒVƒ‡ƒ“CC99€‹’j
    730 (3-3-41) INT128_C(val)          int128_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiƒIƒvƒVƒ‡ƒ“CC99€‹’j
    731 (3-3-42) UINT128_C(val)         uint128_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒiƒIƒvƒVƒ‡ƒ“CC99€‹’j
    732 
    733 Žw’肳‚ꂽƒTƒCƒY‚̐®”Œ^‚ðC‚±‚ê‚ç‚̃Vƒ“ƒ{ƒ‹‚ÉŒ^’è‹`‚·‚éD‚Ü‚½Cƒf[ƒ^
    734 Œ^‚ÉŠi”[‚Å‚«‚éÅ‘å’lEÅ¬’l‚ƁC®”’萔‚ðì‚éƒ}ƒNƒ‚ðC‚±‚ê‚ç‚̃Vƒ“ƒ{
    735 ƒ‹‚Ƀ}ƒNƒ’è‹`‚·‚éD
    736 
    737 ‚±‚ê‚ç‚̃f[ƒ^Œ^‚¨‚æ‚у}ƒNƒ‚́CC99‚ɏ€‹’‚µ‚½‚à‚Ì‚Å‚ ‚éDŠJ”­ŠÂ‹«‚ÉC99
    738 ‚ɏ€‹’‚µ‚½stdint.h‚ª—pˆÓ‚³‚ê‚Ä‚¢‚éê‡‚ɂ́C‚±‚ê‚ç‚̃f[ƒ^Œ^‚¨‚æ‚у}ƒN
    739 ƒ‚ð’è‹`‚·‚邱‚Ƃɑウ‚āCstdint.h‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚ê‚΂悢D
    740 
    741 ã‚ŃIƒvƒVƒ‡ƒ“‚Æ‹Lq‚µ‚½‚à‚̂́CŠY“–‚·‚éƒf[ƒ^Œ^‚ªƒRƒ“ƒpƒCƒ‰‚ŃTƒ|[ƒg
    742 ‚³‚ê‚Ä‚¢‚éê‡‚É‚Ì‚Ý’è‹`‚·‚邱‚Æ‚ðŽ¦‚·D
    743 
    744 3.4 ƒTƒCƒY‚ÌŽw’肳‚ꂽ•‚“®¬”“_Œ^C‚»‚̍őå’lEÅ¬’l‚̃}ƒNƒ
    745 
    746 (3-4-1) float32_t                       IEEE754€‹’‚Ì32ƒrƒbƒg’P¸“x•‚“®¬”“_”iƒIƒv
    747                                                         ƒVƒ‡ƒ“j
    748 (3-4-2) double64_t                      IEEE754€‹’‚Ì64ƒrƒbƒg”{¸“x•‚“®¬”“_”iƒIƒv
    749                                                         ƒVƒ‡ƒ“j
    750 (3-4-3) FLOAT32_MIN                     float32_t‚ÉŠi”[‚Å‚«‚éÅ¬‚̐³‹K‰»‚³‚ꂽ³‚Ì•‚
    751                                                         “®¬”“_”iƒIƒvƒVƒ‡ƒ“j
    752 (3-4-4) FLOAT32_MAX                     float32_t‚ÉŠi”[‚Å‚«‚é•\Œ»‰Â”\‚ȍőå‚Ì—LŒÀ•‚“®
    753                                                         ¬”“_”iƒIƒvƒVƒ‡ƒ“j
    754 (3-4-5) DOUBLE64_MIN            double64_t‚ÉŠi”[‚Å‚«‚éÅ¬‚̐³‹K‰»‚³‚ꂽ³‚Ì•‚
    755                                                         “®¬”“_”iƒIƒvƒVƒ‡ƒ“j
    756 (3-4-6) DOUBLE64_MAX            double64_t‚ÉŠi”[‚Å‚«‚é•\Œ»‰Â”\‚ȍőå‚Ì—LŒÀ•‚“®
    757                                                         ¬”“_”iƒIƒvƒVƒ‡ƒ“j
    758 
    759 Žw’肳‚ꂽƒTƒCƒYE•\Œ»Œ`Ž®‚Ì•‚“®¬”“_Œ^‚ðC‚±‚ê‚ç‚̃Vƒ“ƒ{ƒ‹‚ÉŒ^’è‹`‚·
    760 ‚éD‚Ü‚½Cƒf[ƒ^Œ^‚ÉŠi”[‚Å‚«‚éÅ‘å’lEÅ¬’l‚ðC‚±‚ê‚ç‚̃Vƒ“ƒ{ƒ‹‚Ƀ}ƒN
    761 ƒ’è‹`‚·‚éD
    762 
    763 ‚¢‚¸‚ê‚àCŠY“–‚·‚éƒf[ƒ^Œ^‚ªƒRƒ“ƒpƒCƒ‰‚ŃTƒ|[ƒg‚³‚ê‚Ä‚¢‚éê‡‚É‚Ì‚Ý’è
    764 ‹`‚·‚éD
    765 
    766 3.5 ƒRƒ“ƒpƒCƒ‰‚ÌŠg’£‹@”\‚Ì‚½‚߂̃}ƒNƒ’è‹`
    767 
    768 ƒRƒ“ƒpƒCƒ‰‚ÌŠg’£‹@”\‚ð—p‚¢‚邽‚߂̃}ƒNƒ‚Æ‚µ‚āC•K—v‚ɉž‚¶‚āCˆÈ‰º‚̃}
    769 ƒNƒ‚Ì’è‹`‚ðŠÜ‚ß‚éD
    770 
    771 (3-5-1) inlineiƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Í–¢’è‹`j
    772 (3-5-2) InlineiƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Ístatic inlinej
    773 
    774 ƒCƒ“ƒ‰ƒCƒ“ŠÖ”‚Å‚ ‚邱‚Æ‚ðŽ¦‚·Žw’èDInline‚́CƒRƒ“ƒpƒCƒ‹’PˆÊ‚Ƀ[ƒJƒ‹
    775 ‚ȃCƒ“ƒ‰ƒCƒ“ŠÖ”‚Å‚ ‚邱‚Æ‚ðŽ¦‚·D
    776 
    777 (3-5-3) asmiƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Í–¢’è‹`j
    778 (3-5-4) AsmiƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Í–¢’è‹`j
    779 
    780 ƒCƒ“ƒ‰ƒCƒ“ƒAƒZƒ“ƒuƒ‰‚ð‹Lq‚·‚邽‚ß‚ÌŽw’èDAsm‚́CÅ“K‰»‚É‚æ‚èíœ‚µ‚Ä‚Í
    781 ‚È‚ç‚È‚¢‚±‚Æ‚ðŽ¦‚·D‚±‚ê‚ç‚́Cƒ^[ƒQƒbƒgˆË‘¶•”‚Å‚Ì‚ÝŽg‚¤ƒ}ƒNƒ‚Å‚ ‚邽
    782 ‚߁Cƒ^[ƒQƒbƒgˆË‘¶•”‚ÅŽg‚í‚È‚¢‚È‚ç’è‹`‚·‚é•K—v‚Í‚È‚¢D
    783 
    784 (3-5-5) offsetof(structure, field)iƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Ì’è‹`‚ ‚èj
    785 
    786 \‘¢‘Ìstructure‚Ì’†‚ł́CƒtƒB[ƒ‹ƒhfield‚̃IƒtƒZƒbƒg‚ð‹‚ß‚éƒ}ƒNƒD
    787 
    788 (3-5-6) alignof(type)iƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Ì’è‹`‚ ‚èj
    789 
    790 ƒf[ƒ^Œ^type‚̃Aƒ‰ƒCƒ“ƒƒ“ƒg’PˆÊ‚ð‹‚ß‚éƒ}ƒNƒD
    791 
    792 (3-5-7) NoReturniƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Í–¢’è‹`j
    793 
    794 ƒŠƒ^[ƒ“‚·‚邱‚Æ‚Ì‚È‚¢ŠÖ”‚Å‚ ‚邱‚Æ‚ðŽ¦‚·Žw’èD‚±‚ê‚́Cƒ^[ƒQƒbƒgˆË‘¶
    795 •”‚Ì‚ÝŽg‚¤ƒ}ƒNƒ‚Å‚ ‚邽‚߁Cƒ^[ƒQƒbƒgˆË‘¶•”‚ÅŽg‚í‚È‚¢‚È‚ç’è‹`‚·‚é•K—v
    796 ‚Í‚È‚¢D
    797 
    798 3.6 •W€“I‚È’è‹`‚̏㏑‚«
    799 
    800 t_stddef.h‚ÉŠÜ‚Ü‚ê‚éTOPPERS‹¤’Ê’è‹`‚Ì•W€“I‚È’è‹`‚ðã‘‚«‚·‚éê‡‚ɂ́C
    801 ˆÈ‰º‚̃}ƒNƒ‚ð’è‹`‚·‚éD
    802 
    803 (3-6-1) TOPPERS_booliƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Íintj
    804 (3-6-2) TOPPERS_sizeiƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Íuintptr_tj
    805 (3-6-3) TOPPERS_fpiƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Í‘¼‚ƌ݊·«‚Ì‚È‚¢ŠÖ”ƒ|ƒCƒ“ƒ^j
    806 
    807 ‚»‚ꂼ‚êCbool_tCSIZECFP‚ÉŒ^’è‹`‚·‚ׂ«ƒf[ƒ^Œ^D
    808 
    809 (3-6-4) UINT_C(val)iƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚ÍU‚ð•t‰Áj
    810 (3-6-5) ULONG_C(val)iƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚ÍUL‚ð•t‰Áj
    811 
    812 ‚»‚ꂼ‚êCunsigned uintŒ^Cunsigned longŒ^‚̒萔‚ðì‚邽‚߂̃}ƒNƒD
    813 
    814 (3-6-6) NULLiƒIƒvƒVƒ‡ƒ“CƒfƒtƒHƒ‹ƒg‚Í0j
    815 
    816 C90€‹’‚ÌCŒ¾ŒêŠÂ‹«‚ł́CNULL‚Ì’è‹`‚Ístddef.h‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邽‚߁C‚±‚ê‚ð
    817 ƒCƒ“ƒNƒ‹[ƒh‚µ‚Ä‚à‚æ‚¢D
    818 
    819 (3-6-7) ERCD(mercd, sercd)iƒIƒvƒVƒ‡ƒ“j
    820 (3-6-8) MERCD(ercd)iƒIƒvƒVƒ‡ƒ“j
    821 (3-6-9) SERCD(ercd)iƒIƒvƒVƒ‡ƒ“j
    822 
    823 ERCDCMERCDCSERCD‚Ì•W€‚Ì’è‹`‚́C•„†•t‚«®”‚ª2‚̕␔‚Å•\Œ»‚³‚ê‚Ä‚¨‚èC
    824 ‰EƒVƒtƒg‰‰ŽZŽqi>>j‚ªŽZpƒVƒtƒg‚³‚ê‚邱‚Æ‚ð‰¼’è‚µ‚Ä‚¢‚éD‘½‚­‚̃Rƒ“ƒp
    825 ƒCƒ‰‚Å‚±‚̉¼’肪¬‚è—§‚‚ªC‚»‚¤‚Å‚È‚¢ê‡‚ɂ́Cƒ^[ƒQƒbƒgˆË‘¶•”‚Å‚±‚ê
    826 ‚ç‚Ì’è‹`‚ðã‘‚«‚·‚é•K—v‚ª‚ ‚éD
    827 
    828 (3-6-10) ALIGN_TYPE(addr, type)iƒIƒvƒVƒ‡ƒ“j
    829 
    830 ƒAƒhƒŒƒXaddr‚ªCƒf[ƒ^Œ^type‚̃Aƒ‰ƒCƒ“ƒƒ“ƒg’PˆÊ‚ɃAƒ‰ƒCƒ“‚µ‚Ä‚¢‚é‚©
    831 ƒ`ƒFƒbƒN‚·‚éƒ}ƒNƒD
    832 
    833 3.7 ƒAƒT[ƒVƒ‡ƒ“‚Ì‚½‚ß‚Ì’è‹`
    834 
    835 t_stddef.h‚ɂ́Cassert‚Ì’è‹`‚ªŠÜ‚Ü‚ê‚éDassert‚ªŽ¸”s‚µ‚½ê‡iassert‚Ì
    836 ƒpƒ‰ƒ[ƒ^‚ªfalse‚É‚È‚Á‚½ê‡j‚̏ˆ—‚ðCƒ^[ƒQƒbƒgˆË‘¶‚É—pˆÓ‚·‚é•K—v‚ª
    837 ‚ ‚éD‚±‚ê‚ç‚Ì’è‹`‚́Cassertƒ}ƒNƒ‚ðŽg—p‚·‚é‘O‚Å‚ ‚ê‚΁Ct_stddef.hˆÈ~
    838 ‚ɃCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚Ä‚à‚æ‚¢D‚È‚¨Cassert‚𖳌ø‚É
    839 ‚·‚éiNDEBUG‚ðƒ}ƒNƒ’è‹`‚µ‚ăRƒ“ƒpƒCƒ‹‚·‚éjê‡‚ɂ́C‚±‚ê‚ç‚ð—pˆÓ‚·‚é
    840 •K—v‚Í‚È‚¢D
     6032.7 その他の設定
     604
     605(2-7-1) CLEAN_FILES                             cleanにより削除するファイル名
     606
     607cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ
     608イル名をこの変数に追加定義する.
     609
     610(2-7-2) REALCLEAN_FILES                 realcleanにより削除するファイル名
     611
     612realcleanにより削除するファイルをターゲット依存部で追加したい場合には,
     613ファイル名をこの変数に追加定義する.
     614
     615
     6163. TOPPERS共通定義のターゲット依存部
     617
     618TOPPERS共通定義(t_stddef.h)のターゲット依存部は,target_stddef.hまた
     619はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
     620部で用意されるヘッダファイルなど)に含める.
     621
     6223.1 ターゲット識別マクロ
     623
     624アプリケーションやシステムサービスでターゲットを識別するために,
     625"TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば,
     626"TOPPERS_DVE68K")をマクロ定義する.
     627
     628また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場
     629合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え
     630ば,"TOPPERS_M68K")をマクロ定義する.
     631
     6323.2 整数型の最大値・最小値・ビット数
     633
     634(3-2-1) INT_MAX                         intに格納できる最大値(C90準拠)
     635(3-2-2) INT_MIN                         intに格納できる最小値(C90準拠)
     636(3-2-3) UINT_MAX                        unsigned intに格納できる最大値(C90準拠)
     637(3-2-4) LONG_MAX                        longに格納できる最大値(C90準拠)
     638(3-2-5) LONG_MIN                        longに格納できる最小値(C90準拠)
     639(3-2-6) ULONG_MAX                       unsigned longに格納できる最大値(C90準拠)
     640(3-2-7) CHAR_BIT                        char型のビット数(C90準拠)
     641
     642整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する.
     643
     644これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した
     645limits.hが用意されている場合には,これらのマクロを定義することに代えて,
     646limits.hをインクルードすればよい.
     647
     6483.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
     649
     650(3-3-1) int8_t                          符号付き8ビット整数(オプション,C99準拠)
     651(3-3-2) uint8_t                         符号無し8ビット整数(オプション,C99準拠)
     652(3-3-3) int16_t                         符号付き16ビット整数(C99準拠)
     653(3-3-4) uint16_t                        符号無し16ビット整数(C99準拠)
     654(3-3-5) int32_t                         符号付き32ビット整数(C99準拠)
     655(3-3-6) uint32_t                        符号無し32ビット整数(C99準拠)
     656(3-3-7) int64_t                         符号付き64ビット整数(オプション,C99準拠)
     657(3-3-8) uint64_t                        符号無し64ビット整数(オプション,C99準拠)
     658(3-3-9) int128_t                        符号付き128ビット整数(オプション,C99準拠)
     659(3-3-10) uint128_t                      符号無し128ビット整数(オプション,C99準拠)
     660(3-3-11) int_least8_t           8ビット以上の符号付き整数(C99準拠)
     661(3-3-12) uint_least8_t          8ビット以上の符号無し整数(C99準拠)
     662(3-3-13) intptr_t                       ポインタを格納できるサイズの符号付き整数(C99準拠)
     663(3-3-14) uintptr_t                      ポインタを格納できるサイズの符号無し整数(C99準拠)
     664(3-3-15) INT8_MAX                       int8_tに格納できる最大値(オプション,C99準拠)
     665(3-3-16) INT8_MIN                       int8_tに格納できる最小値(オプション,C99準拠)
     666(3-3-17) UINT8_MAX                      uint8_tに格納できる最大値(オプション,C99準拠)
     667(3-3-18) INT16_MAX                      int16_tに格納できる最大値(C99準拠)
     668(3-3-19) INT16_MIN                      int16_tに格納できる最小値(C99準拠)
     669(3-3-20) UINT16_MAX                     uint16_tに格納できる最大値(C99準拠)
     670(3-3-21) INT32_MAX                      int32_tに格納できる最大値(C99準拠)
     671(3-3-22) INT32_MIN                      int32_tに格納できる最小値(C99準拠)
     672(3-3-23) UINT32_MAX                     uint32_tに格納できる最大値(C99準拠)
     673(3-3-24) INT64_MAX                      int64_tに格納できる最大値(オプション,C99準拠)
     674(3-3-25) INT64_MIN                      int64_tに格納できる最小値(オプション,C99準拠)
     675(3-3-26) UINT64_MAX                     uint64_tに格納できる最大値(オプション,C99準拠)
     676(3-3-27) INT128_MAX                     int128_tに格納できる最大値(オプション,C99準拠)
     677(3-3-28) INT128_MIN                     int128_tに格納できる最小値(オプション,C99準拠)
     678(3-3-29) UINT128_MAX            uint128_tに格納できる最大値(オプション,C99準拠)
     679(3-3-30) INT_LEAST8_MAX         int_least8_tに格納できる最大値(C99準拠)
     680(3-3-31) INT_LEAST8_MIN         int_least8_tに格納できる最小値(C99準拠)
     681(3-3-32) UINT_LEAST8_MAX        uint_least8_tに格納できる最大値(C99準拠)
     682(3-3-33) INT8_C(val)            int_least8_t型の定数を作るマクロ(C99準拠)
     683(3-3-34) UINT8_C(val)           uint_least8_t型の定数を作るマクロ(C99準拠)
     684(3-3-35) INT16_C(val)           int16_t型の定数を作るマクロ(C99準拠)
     685(3-3-36) UINT16_C(val)          uint16_t型の定数を作るマクロ(C99準拠)
     686(3-3-37) INT32_C(val)           int32_t型の定数を作るマクロ(C99準拠)
     687(3-3-38) UINT32_C(val)          uint32_t型の定数を作るマクロ(C99準拠)
     688(3-3-39) INT64_C(val)           int64_t型の定数を作るマクロ(オプション,C99準拠)
     689(3-3-40) UINT64_C(val)          uint64_t型の定数を作るマクロ(オプション,C99準拠)
     690(3-3-41) INT128_C(val)          int128_t型の定数を作るマクロ(オプション,C99準拠)
     691(3-3-42) UINT128_C(val)         uint128_t型の定数を作るマクロ(オプション,C99準拠)
     692
     693指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ
     694型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ
     695ルにマクロ定義する.
     696
     697これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99
     698に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク
     699ロを定義することに代えて,stdint.hをインクルードすればよい.
     700
     701上でオプションと記述したものは,該当するデータ型がコンパイラでサポート
     702されている場合にのみ定義することを示す.
     703
     7043.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
     705
     706(3-4-1) float32_t                       IEEE754準拠の32ビット単精度浮動小数点数(オプ
     707                                                        ション)
     708(3-4-2) double64_t                      IEEE754準拠の64ビット倍精度浮動小数点数(オプ
     709                                                        ション)
     710(3-4-3) FLOAT32_MIN                     float32_tに格納できる最小の正規化された正の浮
     711                                                        動小数点数(オプション)
     712(3-4-4) FLOAT32_MAX                     float32_tに格納できる表現可能な最大の有限浮動
     713                                                        小数点数(オプション)
     714(3-4-5) DOUBLE64_MIN            double64_tに格納できる最小の正規化された正の浮
     715                                                        動小数点数(オプション)
     716(3-4-6) DOUBLE64_MAX            double64_tに格納できる表現可能な最大の有限浮動
     717                                                        小数点数(オプション)
     718
     719指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す
     720る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク
     721ロ定義する.
     722
     723いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定
     724義する.
     725
     7263.5 コンパイラの拡張機能のためのマクロ定義
     727
     728コンパイラの拡張機能を用いるためのマクロとして,必要に応じて,以下のマ
     729クロの定義を含める.
     730
     731(3-5-1) inline(オプション,デフォルトは未定義)
     732(3-5-2) Inline(オプション,デフォルトはstatic inline)
     733
     734インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル
     735なインライン関数であることを示す.
     736
     737(3-5-3) asm(オプション,デフォルトは未定義)
     738(3-5-4) Asm(オプション,デフォルトは未定義)
     739
     740インラインアセンブラを記述するための指定.Asmは,最適化により削除しては
     741ならないことを示す.これらは,ターゲット依存部でのみ使うマクロであるた
     742め,ターゲット依存部で使わないなら定義する必要はない.
     743
     744(3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり)
     745
     746構造体structureの中での,フィールドfieldのオフセットを求めるマクロ.
     747
     748(3-5-6) alignof(type)(オプション,デフォルトの定義あり)
     749
     750データ型typeのアラインメント単位を求めるマクロ.
     751
     752(3-5-7) NoReturn(オプション,デフォルトは未定義)
     753
     754リターンすることのない関数であることを示す指定.これは,ターゲット依存
     755部のみ使うマクロであるため,ターゲット依存部で使わないなら定義する必要
     756はない.
     757
     7583.6 標準的な定義の上書き
     759
     760t_stddef.hに含まれるTOPPERS共通定義の標準的な定義を上書きする場合には,
     761以下のマクロを定義する.
     762
     763(3-6-1) TOPPERS_bool(オプション,デフォルトはint)
     764(3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t)
     765(3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ)
     766
     767それぞれ,bool_t,SIZE,FPに型定義すべきデータ型.
     768
     769(3-6-4) UINT_C(val)(オプション,デフォルトはUを付加)
     770(3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加)
     771
     772それぞれ,unsigned uint型,unsigned long型の定数を作るためのマクロ.
     773
     774(3-6-6) NULL(オプション,デフォルトは0)
     775
     776C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを
     777インクルードしてもよい.
     778
     779(3-6-7) ERCD(mercd, sercd)(オプション)
     780(3-6-8) MERCD(ercd)(オプション)
     781(3-6-9) SERCD(ercd)(オプション)
     782
     783ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており,
     784右シフト演算子(>>)が算術シフトされることを仮定している.多くのコンパ
     785イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ
     786らの定義を上書きする必要がある.
     787
     788(3-6-10) ALIGN_TYPE(addr, type)(オプション)
     789
     790アドレスaddrが,データ型typeのアラインメント単位にアラインしているか
     791チェックするマクロ.
     792
     7933.7 アサーションのための定義
     794
     795t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの
     796パラメータがfalseになった場合)の処理を,ターゲット依存に用意する必要が
     797ある.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降
     798にインクルードされるファイルに含まれていてもよい.なお,assertを無効に
     799する(NDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する
     800必要はない.
    841801
    842802(3-7-1) TOPPERS_assert_abort(void)
    843803
    844 assert‚ªŽ¸”s‚µ‚½ê‡‚ɁCƒvƒƒOƒ‰ƒ€‚ð’âŽ~‚³‚¹‚éŠÖ”DƒVƒXƒeƒ€ŠJ”­’†‚̓f
    845 ƒoƒbƒK‚É—Ž‚Æ‚·‚Ì‚ª—‘z“I‚Å‚ ‚éDƒVƒXƒeƒ€‰Ò“­Žž‚É‚Í—áŠOˆ—‚ðs‚킹‚邱
    846 ‚Æ‚É‚È‚éD
    847 
    848 –{ŠÖ”‚𖳌Àƒ‹[ƒv‚ÅŽÀ‘•‚·‚éÛ‚́CˆÈ‰º‚ÌŒ`Ž®‚Æ‚·‚邱‚Æ(TECS‚̃p[ƒT‚Ì
    849 §ŒÀ‚ɍ‡‚킹‚邽‚߁jD
     804assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ
     805バッガに落とすのが理想的である.システム稼働時には例外処理を行わせるこ
     806とになる.
     807
     808本関数を無限ループで実装する際は,以下の形式とすること(TECSのパーサの
     809制限に合わせるため).
    850810
    851811Inline void
     
    859819(3-7-2) TOPPERS_assert_fail(exp, file, line)
    860820
    861 assert‚ªŽ¸”s‚µ‚½Žž‚̏î•ñ‚ð•\Ž¦/‹L˜^‚·‚邽‚߂̃}ƒNƒDƒVƒXƒeƒ€ƒƒO‹@”\‚ð
    862 —p‚¢‚éê‡‚ɂ́Ct_syslog.h‚ɃVƒXƒeƒ€ƒƒO‹@”\‚É‹L˜^‚·‚邽‚ß‚Ì’è‹`‚ªŠÜ‚Ü
    863 ‚ê‚Ä‚¢‚é‚̂ŁCƒ^[ƒQƒbƒgˆË‘¶•”‚Å—pˆÓ‚·‚é•K—v‚Í‚È‚¢D
    864 
    865 
    866 4. ƒVƒXƒeƒ€ƒCƒ“ƒ^ƒtƒF[ƒXƒŒƒCƒ„iSILj‚̃^[ƒQƒbƒgˆË‘¶•”
    867 
    868 ƒVƒXƒeƒ€ƒCƒ“ƒ^ƒtƒF[ƒXƒŒƒCƒ„iSILCsil.hj‚̃^[ƒQƒbƒgˆË‘¶•”‚Ì’è‹`‚́C
    869 target_sil.h‚Ü‚½‚Í‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹iƒvƒƒZƒbƒTEƒ`ƒb
    870 ƒvEŠJ”­ŠÂ‹«ˆË‘¶•”‚Å—pˆÓ‚³‚ê‚éƒwƒbƒ_ƒtƒ@ƒCƒ‹‚Ȃǁj‚ÉŠÜ‚ß‚éD
    871 
    872 SIL‚̃T[ƒrƒXƒR[ƒ‹‚́C”CˆÓ‚̃VƒXƒeƒ€ó‘ԂŌĂяo‚·‚±‚Æ‚ª‚Å‚«‚éD‚»‚Ì‚½
    873 ‚߁CSIL‚̃^[ƒQƒbƒgˆË‘¶•”‚̊֐”‚́C”CˆÓ‚̃VƒXƒeƒ€ó‘ԂŌĂяo‚¹‚é‚悤‚É
    874 ŽÀ‘•‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    875 
    876 4.1 ‘SŠ„ž‚݃ƒbƒNó‘Ô‚ÌŠÇ—
    877 
    878 SIL‚̃^[ƒQƒbƒgˆË‘¶•”‚ł́C‘SŠ„ž‚݃ƒbƒNó‘Ô‚Ö‘JˆÚ‚·‚é‹@”\‚ƁCŒ³‚̏ó‘Ô
    879 ‚Ö–ß‚·‹@”\iŒ³‚̏ó‘Ô‚ð‹L‰¯‚·‚邽‚߂ɕϐ”‚ðŽg‚¤j‚ð’ñ‹Ÿ‚·‚éD‘SŠ„ž‚݃ƒb
    880 ƒNó‘Ô‚Å‚ ‚é‚©‚ð”»•Ê‚·‚é‹@”\‚Í’ñ‹Ÿ‚·‚é•K—v‚ª‚È‚¢D
    881 
    882 SIL‚Ì‹@”\‚́CƒJ[ƒlƒ‹‚ðŽg—p‚µ‚È‚¢ê‡‚É‚àŽg—p‚Å‚«‚é•K—v‚ª‚ ‚éD‚»‚Ì‚½‚߁C
    883 ‘SŠ„ž‚݃ƒbƒNó‘Ô‚Ö‚Ì‘JˆÚ‚ÆŒ³‚̏ó‘Ô‚Ö‚Ì•œ‹A‚́CƒJ[ƒlƒ‹‚ð—p‚¢‚¸Cƒvƒ
    884 ƒZƒbƒT‚̃Šƒ\[ƒX‚𒼐ڑ€ì‚·‚邱‚Æ‚É‚æ‚Á‚ÄŽÀŒ»‚·‚éD‚Ü‚½C‘SŠ„ž‚݃ƒb
    885 ƒNó‘Ô‚Ö‚Ì‘JˆÚ‚ÆŒ³‚̏ó‘Ô‚Ö‚Ì•œ‹A‚́C‘SŠ„ž‚݃ƒbƒNó‘Ô‚âCPUƒƒbƒNó‘Ô‚Å
    886 ‚às‚¦‚é•K—v‚ª‚ ‚éD
    887 
    888 •ÛŒì‹@”\‚ðŽ‚Á‚½ƒJ[ƒlƒ‹‚ł́Cƒ†[ƒUƒ^ƒXƒN‚©‚çƒvƒƒZƒbƒT‚̃Šƒ\[ƒX‚ð’¼
    889 Ú‘€ì‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢‚½‚߁Cƒ†[ƒUƒ^ƒXƒN‚©‚ç‚Í‚±‚ê‚ç‚Ì‹@”\‚ð—p‚¢‚邱
    890 ‚Æ‚ª‚Å‚«‚È‚¢D—p‚¢‚½ê‡‚̐U•‘‚¢‚̓^[ƒQƒbƒgƒvƒƒZƒbƒT‚Ɉˑ¶‚·‚邪C“T
    891 Œ^“I‚ɂ́C“ÁŒ –½—߈ᔽ‚È‚Ç‚ÌCPU—áŠO‚ª”­¶‚·‚邱‚Æ‚É‚È‚éD
     821assertが失敗した時の情報を表示/記録するためのマクロ.システムログ機能を
     822用いる場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま
     823れているので,ターゲット依存部で用意する必要はない.
     824
     825
     8264. システムインタフェースレイヤ(SIL)のターゲット依存部
     827
     828システムインタフェースレイヤ(SIL,sil.h)のターゲット依存部の定義は,
     829target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ
     830プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
     831
     832SILのサービスコールは,任意のシステム状態で呼び出すことができる.そのた
     833め,SILのターゲット依存部の関数は,任意のシステム状態で呼び出せるように
     834実装しなければならない.
     835
     8364.1 全割込みロック状態の管理
     837
     838SILのターゲット依存部では,全割込みロック状態へ遷移する機能と,元の状態
     839へ戻す機能(元の状態を記憶するために変数を使う)を提供する.全割込みロッ
     840ク状態であるかを判別する機能は提供する必要がない.
     841
     842SILの機能は,カーネルを使用しない場合にも使用できる必要がある.そのため,
     843全割込みロック状態への遷移と元の状態への復帰は,カーネルを用いず,プロ
     844セッサのリソースを直接操作することによって実現する.また,全割込みロッ
     845ク状態への遷移と元の状態への復帰は,全割込みロック状態やCPUロック状態で
     846も行える必要がある.
     847
     848保護機能を持ったカーネルでは,ユーザタスクからプロセッサのリソースを直
     849接操作することができないため,ユーザタスクからはこれらの機能を用いるこ
     850とができない.用いた場合の振舞いはターゲットプロセッサに依存するが,典
     851型的には,特権命令違反などのCPU例外が発生することになる.
    892852
    893853(4-1-1) SIL_PRE_LOC
    894854
    895 ‘SŠ„ž‚݃ƒbƒNƒtƒ‰ƒO‚̏ó‘Ô‚ð•Û‘¶‚·‚邽‚߂̕ϐ”‚ð’è‹`‚·‚éƒ}ƒNƒDŒ^–¼‚Ì
    896 Œã‚ɁC•Ï”–¼‚𑱂¯‚½‚à‚Ì‚É’è‹`‚·‚éD•Ï”–¼‚́C‘¼‚Ì–¼‘O‚ƏՓ˂µ‚È‚¢‚悤
    897 ‚ɁC"TOPPERS_"‚ÅŽn‚Ü‚é–¼‘O‚É‚·‚éD
     855全割込みロックフラグの状態を保存するための変数を定義するマクロ.型名の
     856後に,変数名を続けたものに定義する.変数名は,他の名前と衝突しないよう
     857に,"TOPPERS_"で始まる名前にする.
    898858
    899859(4-1-2) SIL_LOC_INT()
    900860
    901 Œ»Ý‚Ì‘SŠ„ž‚݃ƒbƒNƒtƒ‰ƒO‚̏ó‘Ô‚ðSIL_PRE_LOC‚Å’è‹`‚µ‚½•Ï”‚É•Û‘¶‚µC‘S
    902 Š„ž‚݃ƒbƒNó‘Ô‚É‘JˆÚ‚³‚¹‚éƒ}ƒNƒD‚±‚̃}ƒNƒ‚ðŽÀŒ»‚·‚éÛ‚ɂ́Cu1.6
    903 ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚ÌŽÀŒ»‚ÉŠÖ‚·‚鐧–ñv‚̐߂ɋLq‚³‚ê‚Ä‚¢
    904 ‚鐧–ñ‚ɏ]‚í‚È‚¯‚ê‚΂Ȃç‚È‚¢D
     861現在の全割込みロックフラグの状態をSIL_PRE_LOCで定義した変数に保存し,全
     862割込みロック状態に遷移させるマクロ.このマクロを実現する際には,「1.6
     863クリティカルセクションの出入処理の実現に関する制約」の節に記述されてい
     864る制約に従わなければならない.
    905865
    906866(4-1-3) SIL_UNL_INT()
    907867
    908 SIL_LOC_INT()‚É‚æ‚Á‚ĕϐ”‚É•Û‘¶‚µ‚½ó‘Ô‚É–ß‚·ƒ}ƒNƒD‚±‚̃}ƒNƒ‚ðŽÀŒ»‚·
    909 ‚éÛ‚ɂ́Cu1.6 ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚ÌŽÀŒ»‚ÉŠÖ‚·‚鐧–ñv‚Ì
    910 ß‚É‹Lq‚³‚ê‚Ä‚¢‚鐧–ñ‚ɏ]‚í‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    911 
    912 4.2 ”÷­ŽžŠÔ‘Ò‚¿
     868SIL_LOC_INT()によって変数に保存した状態に戻すマクロ.このマクロを実現す
     869る際には,「1.6 クリティカルセクションの出入処理の実現に関する制約」の
     870節に記述されている制約に従わなければならない.
     871
     8724.2 微少時間待ち
    913873
    914874(4-2-1) void sil_dly_nse(ulong_t dlytim)
    915875
    916 dlytim‚ÅŽw’肳‚ꂽˆÈã‚ÌŽžŠÔi’PˆÊ‚̓iƒm•bjCƒ‹[ƒv‚È‚Ç‚É‚æ‚Á‚đ҂ŠÖ
    917 ”D
    918 
    919 ˆÈ‰º‚̊֐”‚Æ“™‰¿‚ȏˆ—‚ðCƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚·‚é•û–@‚ðC•W€“I‚ÈŽÀ‘•
    920 •û–@‚Æ‚·‚éDƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚·‚é‚̂́CƒRƒ“ƒpƒCƒ‰‚̍œK‰»‚Ɉˑ¶‚µ‚È
    921 ‚¢‚悤‚É‚·‚邽‚ß‚Å‚ ‚éD‚Ü‚½‚±‚̊֐”‚́CƒLƒƒƒbƒVƒ
    922 “™‚̉e‹¿‚ðŽó‚¯‚È‚¢‚æ
    923 ‚¤‚ɁC‚Å‚«‚éŒÀ‚胁ƒ‚ƒŠƒAƒNƒZƒX‚ðs‚í‚È‚¢‚悤‚ÉŽÀ‘•‚·‚ׂ«‚Å‚ ‚éD
     876dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ関
     877数.
     878
     879以下の関数と等価な処理を,アセンブリ言語で記述する方法を,標準的な実装
     880方法とする.アセンブリ言語で記述するのは,コンパイラの最適化に依存しな
     881いようにするためである.またこの関数は,キャッシュ等の影響を受けないよ
     882うに,できる限りメモリアクセスを行わないように実装すべきである.
    924883
    925884        void sil_dly_nse(ulong_t dlytim)
    926885        {
    927886                dlytim -= SIL_DLY_TIM1;
    928                 if (Œ‹‰Ê‚ª0‚æ‚è‘å‚«‚¢) {
     887                if (結果が0より大きい) {
    929888                        do {
    930889                                dlytim -= SIL_DLY_TIM2;
    931                         } while (Œ‹‰Ê‚ª0‚æ‚è‘å‚«‚¢);
     890                        } while (結果が0より大きい);
    932891                }
    933892        }
    934893
    935 ‚±‚̊֐”‚Ì“®ì‚ÍŽŸ‚Ì’Ê‚è‚Å‚ ‚éDdlytim‚ªSIL_DLY_TIM1ˆÈ‰º‚̏ꍇ‚ɂ́CÅ
    936 ‰‚Ìif•¶‚ÌðŒ‚ª¬—§‚¹‚¸C‚·‚®‚Ɋ֐”‚©‚甲‚¯‚éDdlytim‚ªSIL_DLY_TIM1‚æ
    937 ‚è‘å‚«‚­C(SIL_DLY_TIM1+SIL_DLY_TIM2)ˆÈ‰º‚̏ꍇ‚ɂ́CÅ‰‚Ìif•¶‚ÌðŒ‚Í
    938 ¬—§‚·‚邪Cdoƒ‹[ƒv‚Í1‰ñ‚à‰ñ‚炸‚Ɋ֐”‚©‚甲‚¯‚éDdlytim‚ª
    939 (SIL_DLY_TIM1+SIL_DLY_TIM2)‚æ‚è‘å‚«‚­C(SIL_DLY_TIM1+SIL_DLY_TIM2*2)ˆÈ
    940 ‰º‚̏ꍇ‚ɂ́Cdoƒ‹[ƒv‚ð1‰ñ‚¾‚¯‰ñ‚Á‚Ċ֐”‚©‚甲‚¯‚éD‚»‚ÌŒãCdlytim‚ª
    941 SIL_DLY_TIM2‘å‚«‚­‚È‚é“x‚ɁCwhileƒ‹[ƒv‚ð‰ñ‚é‰ñ”‚ª1‰ñ‚¸‚‘‚¦‚éD
    942 
    943 ‚È‚¨C‚±‚̊֐”‚ðƒAƒZƒ“ƒuƒŠŒ¾Œêi‚Ü‚½‚́CCŒ¾Œêj‚Å‹Lq‚·‚éê‡C‚ǂ̃tƒ@
    944 ƒCƒ‹‚É‹Lq‚·‚é‚©‚ª–â‘è‚É‚È‚éDSIL‚̃^[ƒQƒbƒgˆË‘¶•”‚ɂ́C•W€‚ł́CƒAƒZ
    945 ƒ“ƒuƒŠŒ¾Œêi‚Ü‚½‚́CCŒ¾Œêj‚̊֐”’è‹`‚ð‹Lq‚·‚邽‚߂̃tƒ@ƒCƒ‹‚ð—pˆÓ‚µ‚Ä
    946 ‚¢‚È‚¢Dƒ^[ƒQƒbƒgˆË‘¶‚Å—pˆÓ‚µ‚Ä‚à‚æ‚¢‚ªC—áŠO“I‚ɁCƒJ[ƒlƒ‹ŽÀ‘•‚̃^[
    947 ƒQƒbƒgˆË‘¶ƒ‚ƒWƒ
    948 [ƒ‹itarget_support.S‚Ü‚½‚Ítarget_config.cj‚É‹Lq‚µ‚Ä
    949 ‚à‚æ‚¢‚±‚Æ‚É‚·‚éD
    950 
    951 (4-2-2) SIL_DLY_TIM1iƒIƒvƒVƒ‡ƒ“j
    952 (4-2-3) SIL_DLY_TIM2iƒIƒvƒVƒ‡ƒ“j
    953 
    954 sil_dly_nse‚ðã‹L‚Ì•W€“I‚È•û–@‚ÅŽÀŒ»‚µ‚½ê‡C‚±‚Ì2‚‚̒萔‚ðƒ^[ƒQƒb
    955 ƒgˆË‘¶•”‚Ń}ƒNƒ’è‹`‚·‚éD
    956 
    957 SIL_DLY_TIM2‚́Cã‹L‚̊֐”‚É‚¨‚¢‚āCdoƒ‹[ƒv1‰ñ‚ÌŽÀsŽžŠÔi’PˆÊ‚̓iƒm•bj
    958 ‚ɐݒ肷‚éDƒ^[ƒQƒbƒgƒvƒƒZƒbƒT‚Ì–½—߃Zƒbƒg‚É‚à‚æ‚邪C‚¨‚¨‚æ‚»CŒ¸ŽZ
    959 –½—ß‚ÆðŒ•ªŠò–½—ߊe1‰ñ‚ÌŽÀsŽžŠÔ‚É‚È‚éDSIL_DLY_TIM2‚ªŒˆ‚Ü‚ê‚΁CŠÖ”ŒÄ
    960 o‚µ‚àŠÜ‚ß‚½‘S‘Ì‚ÌŽžŠÔ‚ªdlytim‚ÅŽw’肳‚ꂽˆÈã‚ÌŽžŠÔ‚É‚È‚é‚悤‚ɁC
    961 SIL_DLY_TIM1‚ðŒˆ‚ß‚éD
    962 
    963 ¦‰º‹L‚Ì“à—e‚́CŒ»Žž“_‚ÅSSPƒJ[ƒlƒ‹‚Å‚Í–¢ƒTƒ|[ƒg‚Å‚ ‚éD
    964 
    965 ‚±‚Ì2‚‚̒萔’l‚ÌŒˆ’è‚ðŽx‰‡‚·‚éƒvƒƒOƒ‰ƒ€‚Æ‚µ‚āCtestƒfƒBƒŒƒNƒgƒŠ‚ɁC
    966 test_dlynse‚ð—pˆÓ‚µ‚Ä‚¢‚éDtest_dlynse‚ðŽÀs‚·‚é‚ƁCŽŸ‚̂悤‚ȏo—Í‚ª“¾
    967 ‚ç‚ê‚éD
     894この関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最
     895初のif文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ
     896り大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は
     897成立するが,doループは1回も回らずに関数から抜ける.dlytimが
     898(SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以
     899下の場合には,doループを1回だけ回って関数から抜ける.その後,dlytimが
     900SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える.
     901
     902なお,この関数をアセンブリ言語(または,C言語)で記述する場合,どのファ
     903イルに記述するかが問題になる.SILのターゲット依存部には,標準では,アセ
     904ンブリ言語(または,C言語)の関数定義を記述するためのファイルを用意して
     905いない.ターゲット依存で用意してもよいが,例外的に,カーネル実装のター
     906ゲット依存モジュール(target_support.Sまたはtarget_config.c)に記述して
     907もよいことにする.
     908
     909(4-2-2) SIL_DLY_TIM1(オプション)
     910(4-2-3) SIL_DLY_TIM2(オプション)
     911
     912sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ
     913ト依存部でマクロ定義する.
     914
     915SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒)
     916に設定する.ターゲットプロセッサの命令セットにもよるが,おおよそ,減算
     917命令と条件分岐命令各1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼
     918出しも含めた全体の時間がdlytimで指定された以上の時間になるように,
     919SIL_DLY_TIM1を決める.
     920
     921※下記の内容は,現時点でSSPカーネルでは未サポートである.
     922
     923この2つの定数値の決定を支援するプログラムとして,testディレクトリに,
     924test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得
     925られる.
    968926
    969927-- for fitting parameters --
     
    972930sil_dly_nse(510): 520 OK
    973931sil_dly_nse(600): 610 OK
    974 <’†—ª>
     932<中略>
    975933-- for checking boundary conditions --
    976934sil_dly_nse(421): 520 OK
     
    978936sil_dly_nse(601): 700 OK
    979937
    980 "for fitting parameters"‚É‘±‚­o—͂́Csil_dly_nse(dlytim)‚ðŒÄ‚яo‚µ‚½ê
    981 ‡‚Ì‘Ò‚¿ŽžŠÔ‚𑪒肵‚½Œ‹‰Ê‚Å‚ ‚éD‚±‚̃vƒƒOƒ‰ƒ€‚ð—p‚¢‚āC":"‚̉E‘¤‚̐”
    982 ’l‚ªCdlytim‚æ‚è‚à‘å‚«‚¢”͈͂łȂé‚ׂ­‹ß‚¢’l‚É‚È‚é‚悤‚ɁC2‚‚̒萔’l‚ð
    983 ’²®‚·‚éD"for checking boundary conditions"‚É‘±‚­o—͂́CƒvƒƒOƒ‰ƒ€‚Ì
    984 ‘Ó–«‚ðƒ`ƒFƒbƒN‚·‚邽‚ß‚Ì‚à‚̂ŁC":"‚̉E‘¤‚̐”’l‚ªCdlytim‚æ‚è‚à‘å‚«‚¢
    985 ‚±‚Æ‚ðŠm”F‚·‚éi‹ß‚¢’l‚É‚È‚é•K—v‚Í‚È‚¢jD
    986 
    987 4.3 ƒvƒƒZƒbƒT‚̃Gƒ“ƒfƒBƒAƒ“
     938"for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場
     939合の待ち時間を測定した結果である.このプログラムを用いて,":"の右側の数
     940値が,dlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を
     941調整する."for checking boundary conditions"に続く出力は,プログラムの
     942妥当性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい
     943ことを確認する(近い値になる必要はない).
     944
     9454.3 プロセッサのエンディアン
    988946
    989947(4-3-1) SIL_ENDIAN_BIG
    990948(4-3-2) SIL_ENDIAN_LITTLE
    991949
    992 ƒvƒƒZƒbƒT‚̃Gƒ“ƒfƒBƒAƒ“‚É‚æ‚èC‚¢‚¸‚ê‚©•Ð•û‚̃Vƒ“ƒ{ƒ‹‚ðƒ}ƒNƒ’è‹`‚·‚éD
    993 
    994 (4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16iƒIƒvƒVƒ‡ƒ“j
    995 (4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32iƒIƒvƒVƒ‡ƒ“j
    996 
    997 ‚»‚ꂼ‚êC16ƒrƒbƒgC32ƒrƒbƒg‚Ì•„†–³‚µ®”‚̃Gƒ“ƒfƒBƒAƒ“‚𔽓]‚³‚¹‚éƒ}
    998 ƒNƒDƒvƒƒZƒbƒT‚ªƒGƒ“ƒfƒBƒAƒ“”½“]‚Ì‚½‚ß‚Ì–½—ß‚ðŽ‚Âê‡‚ɂ́C‚»‚Ì–½—ß
    999 ‚ð—p‚¢‚ÄŽÀŒ»‚·‚éD‚±‚ê‚ç‚̃Vƒ“ƒ{ƒ‹‚ðƒ}ƒNƒ’è‹`‚µ‚È‚¢ê‡‚ɂ́CƒfƒtƒHƒ‹
    1000 ƒg‚Ì’è‹`‚ªŽg‚í‚ê‚éD
    1001 
    1002 4.4 ƒƒ‚ƒŠ‹óŠÔƒAƒNƒZƒXŠÖ”
     950プロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する.
     951
     952(4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション)
     953(4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション)
     954
     955それぞれ,16ビット,32ビットの符号無し整数のエンディアンを反転させるマ
     956クロ.プロセッサがエンディアン反転のための命令を持つ場合には,その命令
     957を用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル
     958トの定義が使われる.
     959
     9604.4 メモリ空間アクセス関数
    1003961
    1004962(4-4-1) TOPPERS_OMIT_SIL_ACCESS
    1005963
    1006 •W€‚̃ƒ‚ƒŠ‹óŠÔƒAƒNƒZƒXŠÖ”‚ðŽg—p‚¹‚¸Cƒ^[ƒQƒbƒgˆË‘¶•”‚Å—pˆÓ‚·‚éê‡
    1007 ‚ɂ́C‚±‚̃Vƒ“ƒ{ƒ‹‚ðƒ}ƒNƒ’è‹`‚·‚éD
     964標準のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合
     965には,このシンボルをマクロ定義する.
    1008966
    1009967(4-4-2) TOPPERS_OMIT_SIL_REH_LEM
     
    1016974(4-4-9) TOPPERS_OMIT_SIL_WRW_BEM
    1017975
    1018 ‚»‚ꂼ‚êC•W€‚Ìsil_reh_lemCsil_wrh_lemCsil_reh_bemCsil_wrh_bemC
    1019 sil_rew_lemCsil_wrw_lemCsil_rew_bemCsil_wrw_bem‚ðŽg—p‚¹‚¸Cƒ^[ƒQƒb
    1020 ƒgˆË‘¶•”‚Å—pˆÓ‚·‚éê‡‚ɂ́C‚±‚ê‚ç‚̃Vƒ“ƒ{ƒ‹‚ðƒ}ƒNƒ’è‹`‚·‚éD
    1021 
    1022 4.5 I/O‹óŠÔƒAƒNƒZƒXŠÖ”
    1023 
    1024 ƒƒ‚ƒŠ‹óŠÔ‚Æ‚Í•Ê‚ÉI/O‹óŠÔ‚ðŽ‚ÂƒvƒƒZƒbƒT‚ł́CI/O‹óŠÔ‚É‚ ‚éƒfƒoƒCƒXƒŒ
    1025 ƒWƒXƒ^‚ðƒAƒNƒZƒX‚·‚邽‚߂̊֐”‚Æ‚µ‚āCsil_reb_iopCsil_wrb_iopC
    1026 sil_reh_iopCsil_wrh_iopCsil_reh_lepCsil_wrh_lepCsil_reh_bepC
    1027 sil_wrh_bepCsil_rew_iopCsil_wrw_iopCsil_rew_lepCsil_wrw_lepC
    1028 sil_rew_bepCsil_wrw_bep‚Ì’†‚Å•K—v‚È‚à‚Ì‚ðCƒ^[ƒQƒbƒgˆË‘¶•”‚Å—pˆÓ‚·‚éD
    1029 
    1030 
    1031 5. ƒJ[ƒlƒ‹API‚̃^[ƒQƒbƒgˆË‘¶•”
    1032 
    1033 ƒJ[ƒlƒ‹APIikernel.hj‚̃^[ƒQƒbƒgˆË‘¶•”‚Ì’è‹`‚́Ctarget_kernel.h‚Ü‚½
    1034 ‚Í‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹iƒvƒƒZƒbƒTEƒ`ƒbƒvEŠJ”­ŠÂ‹«ˆË‘¶
    1035 •”‚Å—pˆÓ‚³‚ê‚éƒwƒbƒ_ƒtƒ@ƒCƒ‹‚Ȃǁj‚ÉŠÜ‚ß‚éD
    1036 
    1037 5.1 ƒ^[ƒQƒbƒg’è‹`‚ŃTƒ|[ƒg‚·‚é‹@”\
    1038 
    1039 (5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT          dis_int‚ðƒTƒ|[ƒg‚·‚é
    1040 (5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT          ena_int‚ðƒTƒ|[ƒg‚·‚é
    1041 
    1042 dis_intCena_intCƒTƒ|[ƒg‚·‚éê‡‚ɁC‚»‚ꂼ‚ê‚̃Vƒ“ƒ{ƒ‹‚ðƒ}ƒN
    1043 ƒ’è‹`‚·‚éD
    1044 
    1045 5.2 Š„ž‚Ý—Dæ“x‚͈̔Í
    1046 
    1047 (5-2-1) TMIN_INTPRI                             Š„ž‚Ý—Dæ“x‚̍ŏ¬’liÅ‚’lj
    1048 (5-2-2) TMAX_INTPRI                             Š„ž‚Ý—Dæ“x‚̍őå’liÅ’á’lj
    1049 
    1050 ‚»‚ꂼ‚êCƒJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý—Dæ“x‚̍ŏ¬’li—Dæ“x‚ªÅ‚jCƒJ[ƒl
    1051 ƒ‹ŠÇ—‚ÌŠ„ž‚Ý—Dæ“x‚̍őå’li—Dæ“x‚ªÅ’áj‚É’è‹`‚·‚éDTMAX_INTPRI‚Í-1
    1052 ‚ɌŒ肳‚ê‚Ä‚¢‚邪C‘Ώ̐«‚Ì‚½‚߂ɁCƒ^[ƒQƒbƒgˆË‘¶•”‚Å’è‹`‚·‚邱‚Æ‚É‚µ
    1053 ‚Ä‚¢‚éD
    1054 
    1055 5.3 ƒ^ƒCƒ€ƒeƒBƒbƒN‚Ì’è‹`
    1056 
    1057 (5-3-1) TIC_NUME                                ƒ^ƒCƒ€ƒeƒBƒbƒN‚ÌŽüŠú‚Ì•ªŽq
    1058 (5-3-2) TIC_DENO                                ƒ^ƒCƒ€ƒeƒBƒbƒN‚ÌŽüŠú‚Ì•ª•ê
    1059 
    1060 ƒ^ƒCƒ€ƒeƒBƒbƒN‚ÌŽüŠúisignal_time‚ðŒÄ‚яo‚·ŽüŠúj‚ðCƒ~ƒŠ•b’PˆÊ‚ŁC
    1061 TIC_NUME/TIC_DENO‚É’è‹`‚·‚éD—Ⴆ‚΁Cƒ^ƒCƒ€ƒeƒBƒbƒN‚ÌŽüŠú‚ª1/30•b‚̏ꍇ
    1062 ‚ɂ́CTIC_NUME‚ð100‚ɁCTIC_DENO‚ð3‚É’è‹`‚·‚ê‚΂悢D
    1063 
    1064 ƒ^ƒCƒ€ƒeƒBƒbƒN‚ÌŽüŠú‚́C1ƒ~ƒŠ•b‚Æ‚·‚éi‚‚܂èCTIC_NUMECTIC_DENO‚Æ‚à1
    1065 ‚É’è‹`‚·‚éj‚±‚Ƃ𐄏§‚·‚邪CƒVƒ~ƒ
    1066 ƒŒ[ƒVƒ‡ƒ“ŠÂ‹«‚␫”\‚Ì’á‚¢ƒvƒƒZƒb
    1067 ƒT‚Å‚»‚ꂪ“KØ‚Å‚È‚¢ê‡‚ɂ́C‚»‚êˆÈŠO‚Ì’l‚Æ‚µ‚Ä‚à‚æ‚¢D‚»‚̏ꍇ‚Å‚àC
    1068 ‰Â”\‚ÈŒÀ‚èC1ƒ~ƒŠ•b‚Ì”{”‚Å‚ ‚éi‚‚܂èCTIC_DENO‚ð1‚É’è‹`‚·‚éj‚±‚Æ‚ª
    1069 –]‚Ü‚µ‚¢D
    1070 
    1071 TIC_NUME‚ÆTIC_DENO‚Ì’è‹`‚ð•ÏX‚·‚邱‚ƂŁCƒ^ƒCƒ€ƒeƒBƒbƒN‚ÌŽüŠú‚ð•ÏX‚Å
    1072 ‚«‚é‚悤‚Ƀ^ƒCƒ}ƒhƒ‰ƒCƒo‚ðŽÀ‘•‚·‚éê‡‚ɂ́C‚±‚Ì2‚‚̒萔‚Ì’è‹`‚̓fƒtƒH
    1073 ƒ‹ƒg’l‚ð—^‚¦‚Ä‚¢‚邱‚Æ‚É‚È‚éD‚»‚±‚ŁC‚±‚ê‚ç‚Ì’è‹`‚ðu#ifndef TIC_NUMEv
    1074 u#endifv‚ň͂ñ‚Å‹Lq‚·‚éD
    1075 
    1076 5.4 ƒƒ‚ƒŠ—̈æŠm•Û‚Ì‚½‚ß‚ÌŒ^’è‹`
    1077 
    1078 (5-4-1) TOPPERS_STK_T   ƒXƒ^ƒbƒN—̈æ‚ðŠm•Û‚·‚邽‚ß‚ÌŒ^iƒIƒvƒVƒ‡ƒ“j
    1079 
    1080 ƒXƒ^ƒbƒN—̈æ‚́C•W€‚ł́Cintptr_tŒ^‚Ì”z—ñ‚Æ‚µ‚ÄŠm•Û‚·‚邪C‚æ‚è‘å‚«‚¢’PˆÊ‚Å
    1081 ƒAƒ‰ƒCƒ“‚³‚¹‚½‚¢‚È‚Ç‚Ì——R‚ŁC‚»‚êˆÈŠO‚ÌŒ^‚Ì”z—ñ‚Æ‚µ‚ÄŠm•Û‚·‚éê‡‚ɂ́C
    1082 ‚»‚ꂼ‚êTOPPERS_STK_T‚Æ‚ðC”z—ñ‚̃x[ƒX‚Æ‚È‚éƒf[ƒ^Œ^‚Ƀ}ƒNƒ’è‹`‚·‚éD
    1083 
    1084 5.5 ƒƒ‚ƒŠ—̈æŠm•Û‚Ì‚½‚߂̃}ƒNƒ
    1085 
    1086 (5-5-1) TOPPERS_ROUND_SZiƒIƒvƒVƒ‡ƒ“j
    1087 (5-5-2) TOPPERS_COUNT_SZiƒIƒvƒVƒ‡ƒ“j
    1088 
    1089 TOPPERS_COUNT_SZ(sz, unit)‚́Csz/unit‚ðØ‚èã‚°‚½’l‚ð‹‚ß‚éƒ}ƒNƒ‚ŁCƒT
    1090 ƒCƒY‚ªsz‚̃ƒ‚ƒŠ—̈æ‚ðƒTƒCƒY‚ªunit‚̃f[ƒ^Œ^‚Ì”z—ñ‚ÅŠm•Û‚·‚éê‡‚Ì—v‘f
    1091 ”‚ð‹‚ß‚é‚½‚ß‚É—p‚¢‚éDTOPPERS_ROUND_SZ(sz, unit)‚́Csz/unit‚ðØ‚èã‚°
    1092 ‚½‚à‚Ì‚Éunit‚ð‚©‚¯‚½’l‚ð‹‚ß‚éƒ}ƒNƒ‚ŁCƒTƒCƒY‚ªsz‚̃ƒ‚ƒŠ—̈æ‚ðƒTƒCƒY
    1093 ‚ªunit‚̃f[ƒ^Œ^‚Ì”z—ñ‚ÅŠm•Û‚·‚éê‡‚̃g[ƒ^ƒ‹ƒTƒCƒY‚ð‹‚ß‚é‚½‚ß‚É—p‚¢
    1094 ‚éD
    1095 
    1096 ‚»‚ꂼ‚êC•W€‚ÌTOPPERS_ROUND_SZCTOPPERS_COUNT_SZ‚ª“KØ‚Å‚È‚­Cƒ^[ƒQƒb
    1097 ƒgˆË‘¶•”‚Å—pˆÓ‚·‚éê‡‚ɂ́C‚±‚ê‚ç‚̃Vƒ“ƒ{ƒ‹‚ð“KØ‚È’l‚Ƀ}ƒNƒ’è‹`‚·‚éD
    1098 
    1099 6. ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”
    1100 
    1101 6.1 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚Ì‹¤’ÊŽ–€
    1102 
    1103 6.1.1 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚̍\¬—v‘f
    1104 
    1105 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚́CˆÈ‰º‚Ì—v‘f‚ō\¬‚³‚ê‚éD
    1106 
    1107 (a) ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶‚Ì’è‹`
    1108 
    1109 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚©‚çŽQÆ‚³‚ê‚éƒ^[ƒQƒbƒgˆË‘¶‚Ì’è‹`‚́C
    1110 target_config.h‚Ü‚½‚Í‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹iƒvƒƒZƒbƒTEƒ`ƒb
    1111 ƒvEŠJ”­ŠÂ‹«ˆË‘¶•”‚Å—pˆÓ‚³‚ê‚éƒwƒbƒ_ƒtƒ@ƒCƒ‹‚Ȃǁj‚ÉŠÜ‚ß‚éD
    1112 
    1113 ƒ^[ƒQƒbƒg‚̃n[ƒhƒEƒFƒAŽ‘Œ¹iŠ„ž‚݃nƒ“ƒhƒ‰”ԍ†‚âCPU—áŠOƒnƒ“ƒhƒ‰”ԍ†C
    1114 ƒfƒoƒCƒXƒŒƒWƒXƒ^‚̔Ԓn‚Ȃǁj‚Ì’è‹`‚́CƒVƒXƒeƒ€ƒT[ƒrƒX‚âƒAƒvƒŠƒP[ƒVƒ‡
    1115 ƒ“‚É‚à—L—p‚Å‚ ‚邽‚߁CƒJ[ƒlƒ‹ŽÀ‘•‚Ì‚Ý‚É—L—p‚È’è‹`‚ðŠÜ‚Þƒtƒ@ƒCƒ‹‚Ƃ͐Ø
    1116 ‚蕪‚¯‚āC“Æ—§‚µ‚½ƒwƒbƒ_ƒtƒ@ƒCƒ‹‚ÉŠÜ‚ß‚éD‚±‚̃wƒbƒ_ƒtƒ@ƒCƒ‹‚Ì•W€“I‚È
    1117 –¼Ì‚ðCƒVƒXƒeƒ€—ªÌ.hi‚Ü‚½‚́Cƒ`ƒbƒv—ªÌ.hCƒvƒƒZƒbƒT—ªÌ.hj‚Æ‚·‚éD
    1118 
    1119 (b) ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶ƒ‚ƒWƒ
    1120 [ƒ‹
    1121 
    1122 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶‚̕ϐ”’è‹`‚âŠÖ”‚ðŠÜ‚Þƒ‚ƒWƒ
    1123 [ƒ‹DCŒ¾Œê‚Å‹L
    1124 q‚³‚ê‚é•”•ª‚ðtarget_config.cCƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚³‚ê‚é•”•ª‚ð
    1125 target_support.S‚ÉŠÜ‚ß‚éDƒvƒƒZƒbƒTEƒ`ƒbƒvEŠJ”­ŠÂ‹«ˆË‘¶•”‚ðØ‚蕪‚¯
    1126 ‚邱‚Æ‚âCƒtƒ@ƒCƒ‹‚ª‘å‚«‚­‚È‚éê‡‚É•¡”‚̃tƒ@ƒCƒ‹‚É•ªŠ„‚·‚邱‚Æ‚à‰Â”\
    1127 ‚Å‚ ‚éD
    1128 
    1129 (c) ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚Ì‚½‚߂̃Šƒl[ƒ€‹Lq
    1130 
    1131 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚̕ϐ”–¼‚âŠÖ”–¼‚ðCæ“ª‚É_kernel_‚ð•t—^
    1132 ‚µ‚½–¼‘O‚ɃŠƒl[ƒ€‚·‚邽‚߂̃‚ƒWƒ
    1133 [ƒ‹Dtarget_rename.def‚ð—pˆÓ‚µCƒc[
    1134 ƒ‹iutils/genrenamej‚É‚æ‚èCtarget_rename.h‚Ætarget_unrename.h‚𐶐¬‚·
    1135 ‚éDƒvƒƒZƒbƒTEƒ`ƒbƒvEŠJ”­ŠÂ‹«ˆË‘¶•”‚ðØ‚蕪‚¯‚éê‡‚ɂ́CƒŠƒl[ƒ€‹L
    1136 q‚àØ‚蕪‚¯‚éD
    1137 
    1138 ¦
    1139 (d) ƒ^ƒCƒ}ƒhƒ‰ƒCƒo
    1140 
    1141 ƒJ[ƒlƒ‹‚Ƀ^ƒCƒ€ƒeƒBƒbƒN‚ð’Ê’m‚·‚éisignal_time‚ðŽüŠú“I‚ɌĂяo‚·j‚½‚ß
    1142 ‚̃^ƒCƒ}ƒhƒ‰ƒCƒo‚̃wƒbƒ_ƒtƒ@ƒCƒ‹CŽÀ‘•ƒtƒ@ƒCƒ‹CƒVƒXƒeƒ€ƒRƒ“ƒtƒBƒMƒ
    1143 ƒŒ[
    1144 ƒVƒ‡ƒ“ƒtƒ@ƒCƒ‹‚ðC‚»‚ꂼ‚êCtarget_timer.hCtarget_timer.cC
    1145 target_timer.cfg‚ÉŠÜ‚ß‚éDƒvƒƒZƒbƒTEƒ`ƒbƒvEŠJ”­ŠÂ‹«ˆË‘¶•”‚ðØ‚蕪‚¯
    1146 ‚邱‚Æ‚à‰Â”\‚Å‚ ‚éD
    1147 
    1148 (e) ƒRƒ“ƒtƒBƒMƒ
    1149 ƒŒ[ƒ^Ý’èƒtƒ@ƒCƒ‹
    1150 
    1151 ƒRƒ“ƒtƒBƒMƒ
    1152 ƒŒ[ƒ^‚̐ݒèƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”‚ðCtarget_def.csvC
    1153 target.tfCtarget_check.tf‚É—pˆÓ‚·‚éDƒRƒ“ƒtƒBƒMƒ
    1154 ƒŒ[ƒ^Ý’èƒtƒ@ƒCƒ‹‚Ì
    1155 ‹Lq•û–@‚ɂ‚¢‚ẮC‚VÍ‚Åà–¾‚·‚éD
    1156 
    1157 6.1.2 ƒ^[ƒQƒbƒgˆË‘¶•”‚̊֐”‚Ì–½–¼‹K‘¥
    1158 
    1159 ƒJ[ƒlƒ‹ŽÀ‘•‚̃^[ƒQƒbƒgˆË‘¶•”‚ð\¬‚·‚éŠÖ”‚Ì’†‚ŁCt_‚ÅŽn‚Ü‚é‚à‚̂̓^
    1160 ƒXƒNƒRƒ“ƒeƒLƒXƒgê—pCi_‚ÅŽn‚Ü‚é‚à‚Ì‚Í”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgê—pCx_‚ÅŽn
    1161 ‚Ü‚é‚à‚Ì‚Í‚¢‚¸‚ê‚̃Rƒ“ƒeƒLƒXƒg‚©‚ç‚Å‚àŒÄ‚яo‚·‚±‚Æ‚ª‚Å‚«‚éŠÖ”‚Å‚ ‚éD
    1162 
    1163 6.2 ƒgƒŒ[ƒXƒƒO‹@”\‚ւ̑Ήž
    1164 
    1165 ƒJ[ƒlƒ‹‚̃gƒŒ[ƒXƒƒO‹@”\‚Ì’†‚ŁCŠ„ž‚݃nƒ“ƒhƒ‰CCPU—áŠOƒnƒ“ƒhƒ‰‚ÌŠJŽn
    1166 EI—¹‚̃gƒŒ[ƒXƒƒOŽæ“¾‚́Cƒ^[ƒQƒbƒgˆË‘¶•”‚ÅŽÀ‘•‚·‚é•K—v‚ª‚ ‚éD‚Ù‚Æ‚ñ
    1167 ‚ǂ̃^[ƒQƒbƒgƒVƒXƒeƒ€‚É‚¨‚¢‚āC‚»‚ê‚ç‚̏ˆ—‚̓AƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚³‚ê‚Ä
    1168 ‚¨‚èCƒ^[ƒQƒbƒg”ñˆË‘¶•”Œü‚¯‚̃gƒŒ[ƒXƒƒOƒ}ƒNƒ‚Æ“¯‚¶•û–@iƒgƒŒ[ƒXƒƒO
    1169 ƒ}ƒNƒ‚ðCƒgƒŒ[ƒXƒƒOŽæ“¾ˆ—‚ÌCŒ¾Œê‹Lq‚Ƀ}ƒNƒ’è‹`‚·‚é•û–@j‚́C—p‚¢
    1170 ‚邱‚Æ‚ª‚Å‚«‚È‚¢D
    1171 
    1172 ‚»‚±‚ŁCƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚³‚ê‚Ä‚¢‚鏈—’†‚ɃgƒŒ[ƒXƒƒOŽæ“¾‚𖄂ߍž
    1173 ‚ޏꍇ‚ɂ́CƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚ª’è‹`‚³‚ê‚Ä‚¢‚ê‚΁C‚»‚ꂪ‰½‚É’è‹`‚³‚ê‚Ä
    1174 ‚¢‚é‚©‚Í–³Ž‹‚µ‚āC•W€“I‚ȃgƒŒ[ƒXƒƒOŠÖ”‚ªCŒ¾Œê‚Å‹Lq‚³‚ê‚Ä‚¢‚é‚Æ‘z’è
    1175 ‚µ‚āC‚»‚ê‚ðŒÄ‚яo‚·‚悤‚ɃR[ƒfƒBƒ“ƒO‚·‚éD
    1176 
    1177 ‹ï‘Ì“I‚ɂ́C‰º‚Ì•\‚̍¶‘¤‚ÉŽ¦‚µ‚½ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚ª’è‹`‚³‚ê‚Ä‚¢‚ê‚΁C
    1178 •\‚̉E‘¤‚ÉŽ¦‚µ‚½CŒ¾Œê‹Lq‚Æ“¯“™‚̏ˆ—‚ðs‚¤‚悤‚ɃR[ƒfƒBƒ“ƒO‚·‚éD
    1179 
    1180         ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ              ƒgƒŒ[ƒXƒƒOŽæ“¾ˆ—
     976それぞれ,標準のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem,
     977sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ
     978ト依存部で用意する場合には,これらのシンボルをマクロ定義する.
     979
     9804.5 I/O空間アクセス関数
     981
     982メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ
     983ジスタをアクセスするための関数として,sil_reb_iop,sil_wrb_iop,
     984sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep,
     985sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep,
     986sil_rew_bep,sil_wrw_bepの中で必要なものを,ターゲット依存部で用意する.
     987
     988
     9895. カーネルAPIのターゲット依存部
     990
     991カーネルAPI(kernel.h)のターゲット依存部の定義は,target_kernel.hまた
     992はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
     993部で用意されるヘッダファイルなど)に含める.
     994
     9955.1 ターゲット定義でサポートする機能
     996
     997(5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT          dis_intをサポートする
     998(5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT          ena_intをサポートする
     999
     1000dis_int,ena_int,サポートする場合に,それぞれのシンボルをマク
     1001ロ定義する.
     1002
     10035.2 割込み優先度の範囲
     1004
     1005(5-2-1) TMIN_INTPRI                             割込み優先度の最小値(最高値)
     1006(5-2-2) TMAX_INTPRI                             割込み優先度の最大値(最低値)
     1007
     1008それぞれ,カーネル管理の割込み優先度の最小値(=優先度が最高),カーネ
     1009ル管理の割込み優先度の最大値(優先度が最低)に定義する.TMAX_INTPRIは-1
     1010に固定されているが,対称性のために,ターゲット依存部で定義することにし
     1011ている.
     1012
     10135.3 タイムティックの定義
     1014
     1015(5-3-1) TIC_NUME                                タイムティックの周期の分子
     1016(5-3-2) TIC_DENO                                タイムティックの周期の分母
     1017
     1018タイムティックの周期(signal_timeを呼び出す周期)を,ミリ秒単位で,
     1019TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合
     1020には,TIC_NUMEを100に,TIC_DENOを3に定義すればよい.
     1021
     1022タイムティックの周期は,1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1
     1023に定義する)ことを推奨するが,シミュレーション環境や性能の低いプロセッ
     1024サでそれが適切でない場合には,それ以外の値としてもよい.その場合でも,
     1025可能な限り,1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが
     1026望ましい.
     1027
     1028TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で
     1029きるようにタイマドライバを実装する場合には,この2つの定数の定義はデフォ
     1030ルト値を与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」
     1031「#endif」で囲んで記述する.
     1032
     10335.4 メモリ領域確保のための型定義
     1034
     1035(5-4-1) TOPPERS_STK_T   スタック領域を確保するための型(オプション)
     1036
     1037スタック領域は,標準では,intptr_t型の配列として確保するが,より大きい単位で
     1038アラインさせたいなどの理由で,それ以外の型の配列として確保する場合には,
     1039それぞれTOPPERS_STK_Tとを,配列のベースとなるデータ型にマクロ定義する.
     1040
     10415.5 メモリ領域確保のためのマクロ
     1042
     1043(5-5-1) TOPPERS_ROUND_SZ(オプション)
     1044(5-5-2) TOPPERS_COUNT_SZ(オプション)
     1045
     1046TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ
     1047イズがszのメモリ領域をサイズがunitのデータ型の配列で確保する場合の要素
     1048数を求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ
     1049たものにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ
     1050がunitのデータ型の配列で確保する場合のトータルサイズを求めるために用い
     1051る.
     1052
     1053それぞれ,標準のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ
     1054ト依存部で用意する場合には,これらのシンボルを適切な値にマクロ定義する.
     1055
     10566. カーネル実装のターゲット依存部
     1057
     10586.1 カーネル実装のターゲット依存部の共通事項
     1059
     10606.1.1 カーネル実装のターゲット依存部の構成要素
     1061
     1062カーネル実装のターゲット依存部は,以下の要素で構成される.
     1063
     1064(a) カーネル実装のターゲット依存の定義
     1065
     1066カーネル実装のターゲット非依存部から参照されるターゲット依存の定義は,
     1067target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ
     1068プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
     1069
     1070ターゲットのハードウェア資源(割込みハンドラ番号やCPU例外ハンドラ番号,
     1071デバイスレジスタの番地など)の定義は,システムサービスやアプリケーショ
     1072ンにも有用であるため,カーネル実装のみに有用な定義を含むファイルとは切
     1073り分けて,独立したヘッダファイルに含める.このヘッダファイルの標準的な
     1074名称を,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする.
     1075
     1076(b) カーネル実装のターゲット依存モジュール
     1077
     1078カーネル実装のターゲット依存の変数定義や関数を含むモジュール.C言語で記
     1079述される部分をtarget_config.c,アセンブリ言語で記述される部分を
     1080target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け
     1081ることや,ファイルが大きくなる場合に複数のファイルに分割することも可能
     1082である.
     1083
     1084(c) カーネル実装のターゲット依存部のためのリネーム記述
     1085
     1086カーネル実装のターゲット依存部の変数名や関数名を,先頭に_kernel_を付与
     1087した名前にリネームするためのモジュール.target_rename.defを用意し,ツー
     1088ル(utils/genrename)により,target_rename.hとtarget_unrename.hを生成す
     1089る.プロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記
     1090述も切り分ける.
     1091
     1092
     1093(d) タイマドライバ
     1094
     1095カーネルにタイムティックを通知する(signal_timeを周期的に呼び出す)ため
     1096のタイマドライバのヘッダファイル,実装ファイル,システムコンフィギュレー
     1097ションファイルを,それぞれ,target_timer.h,target_timer.c,
     1098target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け
     1099ることも可能である.
     1100
     1101(e) コンフィギュレータ設定ファイル
     1102
     1103コンフィギュレータの設定ファイルのターゲット依存部を,target_def.csv,
     1104target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの
     1105記述方法については,7章で説明する.
     1106
     11076.1.2 ターゲット依存部の関数の命名規則
     1108
     1109カーネル実装のターゲット依存部を構成する関数の中で,t_で始まるものはタ
     1110スクコンテキスト専用,i_で始まるものは非タスクコンテキスト専用,x_で始
     1111まるものはいずれのコンテキストからでも呼び出すことができる関数である.
     1112
     11136.2 トレースログ機能への対応
     1114
     1115カーネルのトレースログ機能の中で,割込みハンドラ,CPU例外ハンドラの開始
     1116・終了のトレースログ取得は,ターゲット依存部で実装する必要がある.ほとん
     1117どのターゲットシステムにおいて,それらの処理はアセンブリ言語で記述されて
     1118おり,ターゲット非依存部向けのトレースログマクロと同じ方法(トレースログ
     1119マクロを,トレースログ取得処理のC言語記述にマクロ定義する方法)は,用い
     1120ることができない.
     1121
     1122そこで,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込
     1123む場合には,トレースログマクロが定義されていれば,それが何に定義されて
     1124いるかは無視して,標準的なトレースログ関数がC言語で記述されていると想定
     1125して,それを呼び出すようにコーディングする.
     1126
     1127具体的には,下の表の左側に示したトレースログマクロが定義されていれば,
     1128表の右側に示したC言語記述と同等の処理を行うようにコーディングする.
     1129
     1130        トレースログマクロ               トレースログ取得処理
    11811131        -----------------------------------------------
    11821132        LOG_INH_ENTER                   log_inh_enter(inhno)
     
    11851135        LOG_EXC_LEAVE                   log_exc_leave(excno)
    11861136
    1187 6.3 ƒVƒXƒeƒ€ó‘Ô‚ÌŠÇ—
    1188 
    1189 SSPƒJ[ƒlƒ‹‚ðV‚½‚ȃ^[ƒQƒbƒgƒVƒXƒeƒ€‚Ƀ|[ƒeƒBƒ“ƒO‚·‚éÛ‚ɁCÅ‚àd—v‚È
    1190 ì‹Æ‚́CƒJ[ƒlƒ‹‚ª’è‹`‚·‚éƒVƒXƒeƒ€ó‘Ô‚ðCƒn[ƒhƒEƒFƒAiƒvƒƒZƒbƒTjã
    1191 ‚łǂ̂悤‚ÉŽÀŒ»‚·‚é‚©‚Å‚ ‚éDˆÈ‰º‚Ìà–¾‚́CTOPPERSV¢‘ãƒJ[ƒlƒ‹‚É‚¨‚¯
    1192 ‚éƒVƒXƒeƒ€ó‘Ô‚Ì’è‹`EˆÓ–¡‚ð’m‚Á‚Ä‚¢‚邱‚Æ‚ð‘O’ñ‚É‹Lq‚µ‚Ä‚¢‚éD
    1193 
    1194 6.3.1 ‘SŠ„ž‚݃ƒbƒNó‘Ô‚ÌŠÇ—
    1195 
    1196 ‘SŠ„ž‚݃ƒbƒNó‘Ԃ́CNMI‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý‚ðƒ}ƒXƒN‚µ‚½ó‘Ô‚Å‚ ‚éD‘S
    1197 Š„ž‚݃ƒbƒNó‘Ô‚ðŠÇ—‚·‚é‹@”\‚́CƒVƒXƒeƒ€ƒCƒ“ƒ^ƒtƒF[ƒXƒŒƒCƒ„iSILj‚É
    1198 ‚æ‚Á‚Ä’ñ‹Ÿ‚³‚êCƒJ[ƒlƒ‹‚Í‘SŠ„ž‚݃ƒbƒNó‘Ô‚ðŠÇ—‚µ‚È‚¢D
    1199 
    1200 ‘SŠ„ž‚݃ƒbƒNó‘Ԃł́Csns_ker‚Æext_kerˆÈŠO‚̃J[ƒlƒ‹‚̃T[ƒrƒXƒR[ƒ‹
    1201 ‚ðŒÄ‚Ô‚±‚Æ‚Í‚Å‚«‚È‚¢‚à‚Ì‚Æ‚µ‚Ä‚¨‚èCŒÄ‚ñ‚¾ê‡‚ɂ͉½‚ª‹N‚±‚é‚©•ÛØ‚µ‚Ä
    1202 ‚¢‚È‚¢Dsns_ker‚Æext_ker‚©‚çŒÄ‚яo‚·ˆ—‚́CƒgƒŒ[ƒXƒƒOŽæ“¾ˆ—‚ÆSIL‚Ì
    1203 ƒT[ƒrƒXƒR[ƒ‹‚ðœ‚­‚ƁCcall_exit_kernel‚Ì‚Ý‚Å‚ ‚éD‚»‚Ì‚½‚߁C
    1204 call_exit_kernel‚©‚çŒÄ‚яo‚·‚à‚Ì‚ðœ‚¢‚āCƒJ[ƒlƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”‚Ì
    1205 ŠÖ”‚ªC‘SŠ„ž‚݃ƒbƒNó‘ԂŌĂяo‚³‚ê‚éó‹µ‚͍l‚¦‚é•K—v‚ª‚È‚¢D
    1206 
    1207 6.3.2 ƒRƒ“ƒeƒLƒXƒg‚ÌŠÇ—
    1208 
    1209 ˆ—’PˆÊ‚ªŽÀs‚³‚ê‚éƒRƒ“ƒeƒLƒXƒg‚́Cƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ”ñƒ^ƒXƒNƒRƒ“ƒe
    1210 ƒLƒXƒg‚É•ª—Þ‚³‚ê‚éD
    1211 
    1212 ƒ^[ƒQƒbƒgˆË‘¶•”‚́CŽÀs’†‚̏ˆ—’PˆÊ‚ªCƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅŽÀs‚³‚ê‚Ä
    1213 ‚¢‚é‚©”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅŽÀs‚³‚ê‚Ä‚¢‚é‚©‚ð”»•Ê‚·‚é‹@”\‚ð’ñ‹Ÿ‚·‚éD
    1214 ‚Ü‚½CCPU—áŠO‚ª”­¶‚µ‚½ƒRƒ“ƒeƒLƒXƒg‚ɂ‚¢‚Ä”»•Ê‚·‚é‹@”\‚ð’ñ‹Ÿ‚·‚éD
    1215 
    1216 ƒ^[ƒQƒbƒgˆË‘¶•”‚ł́CŠ„ž‚݃nƒ“ƒhƒ‰‚ÆCPU—áŠOƒnƒ“ƒhƒ‰‚Ì“üŒûˆ—‚Å”ñƒ^ƒX
    1217 ƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؂芷‚¦C‚»‚ê‚ç‚̏oŒûˆ—‚ÅŒ³‚̃Rƒ“ƒeƒLƒXƒg‚É–ß‚·D‚Ü
    1218 ‚½CƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“à•”‚ňꎞ“I‚É”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؂芷‚¦‚éD
     11376.3 システム状態の管理
     1138
     1139SSPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な
     1140作業は,カーネルが定義するシステム状態を,ハードウェア(プロセッサ)上
     1141でどのように実現するかである.以下の説明は,TOPPERS新世代カーネルにおけ
     1142るシステム状態の定義・意味を知っていることを前提に記述している.
     1143
     11446.3.1 全割込みロック状態の管理
     1145
     1146全割込みロック状態は,NMIを除くすべての割込みをマスクした状態である.全
     1147割込みロック状態を管理する機能は,システムインタフェースレイヤ(SIL)に
     1148よって提供され,カーネルは全割込みロック状態を管理しない.
     1149
     1150全割込みロック状態では,sns_kerとext_ker以外のカーネルのサービスコール
     1151を呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して
     1152いない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの
     1153サービスコールを除くと,call_exit_kernelのみである.そのため,
     1154call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の
     1155関数が,全割込みロック状態で呼び出される状況は考える必要がない.
     1156
     11576.3.2 コンテキストの管理
     1158
     1159処理単位が実行されるコンテキストは,タスクコンテキストと非タスクコンテ
     1160キストに分類される.
     1161
     1162ターゲット依存部は,実行中の処理単位が,タスクコンテキストで実行されて
     1163いるか非タスクコンテキストで実行されているかを判別する機能を提供する.
     1164また,CPU例外が発生したコンテキストについて判別する機能を提供する.
     1165
     1166ターゲット依存部では,割込みハンドラとCPU例外ハンドラの入口処理で非タス
     1167クコンテキストに切り換え,それらの出口処理で元のコンテキストに戻す.ま
     1168た,ディスパッチャの内部で一時的に非タスクコンテキストに切り換える.
    12191169
    12201170(6-3-2-1) bool_t sense_context(void)
    12211171
    1222 ŽÀs’†‚̏ˆ—’PˆÊ‚ªCƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅŽÀs‚³‚ê‚Ä‚¢‚éê‡‚É‚ÍfalseC”ñ
    1223 ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅŽÀs‚³‚ê‚Ä‚¢‚éê‡‚É‚Ítrue‚ð•Ô‚·ŠÖ”D‚±‚̊֐”‚́C
    1224 CPUƒƒbƒNó‘Ô‚Å‚àCPUƒƒbƒN‰ðœó‘Ô‚Å‚àŒÄ‚яo‚¹‚é‚悤‚ÉŽÀ‘•‚µ‚È‚¯‚ê‚΂È
    1225 ‚ç‚È‚¢D
    1226 
    1227 6.3.3 CPUƒƒbƒNó‘Ô‚ÌŠÇ—
    1228 
    1229 ƒ^[ƒQƒbƒgˆË‘¶•”‚́CCPUƒƒbƒNó‘Ô‚Ö‘JˆÚ‚·‚é‹@”\CCPUƒƒbƒN‰ðœó‘Ô‚Ö‘J
    1230 ˆÚ‚·‚é‹@”\CCPUƒƒbƒNó‘Ô‚Å‚ ‚é‚©‚ð”»•Ê‚·‚é‹@”\‚ð’ñ‹Ÿ‚·‚éD
     1172実行中の処理単位が,タスクコンテキストで実行されている場合にはfalse,非
     1173タスクコンテキストで実行されている場合にはtrueを返す関数.この関数は,
     1174CPUロック状態でもCPUロック解除状態でも呼び出せるように実装しなければな
     1175らない.
     1176
     11776.3.3 CPUロック状態の管理
     1178
     1179ターゲット依存部は,CPUロック状態へ遷移する機能,CPUロック解除状態へ遷
     1180移する機能,CPUロック状態であるかを判別する機能を提供する.
    12311181
    12321182(6-3-3-1) void t_lock_cpu(void)
     
    12341184(6-3-3-3) void x_lock_cpu(void)
    12351185
    1236 CPUƒƒbƒN‰ðœó‘Ô‚©‚çCCPUƒƒbƒNó‘Ô‚Ö‘JˆÚ‚³‚¹‚éŠÖ”D‚±‚ê‚ç‚̊֐”‚́C
    1237 CPUƒƒbƒNó‘ԂŌĂяo‚³‚ê‚邱‚Æ‚Í‚È‚­CŒÄ‚яo‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é
    1238 •K—v‚ª‚È‚¢D
    1239 
    1240 ‚±‚ê‚ç‚̊֐”‚ðŽÀŒ»‚·‚éÛ‚ɂ́Cu1.6 ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚Ì
    1241 ŽÀŒ»‚ÉŠÖ‚·‚鐧–ñv‚̐߂ɋLq‚³‚ê‚Ä‚¢‚鐧–ñ‚ɏ]‚í‚È‚¯‚ê‚΂Ȃç‚È‚¢D
     1186CPUロック解除状態から,CPUロック状態へ遷移させる関数.これらの関数は,
     1187CPUロック状態で呼び出されることはなく,呼び出された場合の動作は保証する
     1188必要がない.
     1189
     1190これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
     1191実現に関する制約」の節に記述されている制約に従わなければならない.
    12421192
    12431193(6-3-3-4) void t_unlock_cpu(void)
     
    12451195(6-3-3-6) void x_unlock_cpu(void)
    12461196
    1247 CPUƒƒbƒNó‘Ô‚©‚çCCPUƒƒbƒN‰ðœó‘Ô‚Ö‘JˆÚ‚³‚¹‚éŠÖ”D‚±‚ê‚ç‚̊֐”‚́C
    1248 CPUƒƒbƒN‰ðœó‘ԂŌĂяo‚³‚ê‚邱‚Æ‚Í‚È‚­CŒÄ‚яo‚³‚ꂽê‡‚Ì“®ì‚͕ۏØ
    1249 ‚·‚é•K—v‚ª‚È‚¢D
    1250 
    1251 ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅCPUƒƒbƒNó‘Ô‚É‘JˆÚ‚µ‚½ê‡‚ɂ́CCPUƒƒbƒN‰ðœó‘Ô
    1252 ‚É–ß‚é‚̂̓^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÉŒÀ‚ç‚êC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅCPUƒƒbƒN‰ð
    1253 œó‘Ԃɖ߂邱‚Æ‚Í‚È‚¢DŒ¾‚¢Š·‚¦‚é‚ƁCt_unlock_cpu‚ªŒÄ‚яo‚³‚ê‚é‚̂́C
    1254 t_lock_cpu‚É‚æ‚Á‚ÄCPUƒƒbƒNó‘Ô‚É‚È‚Á‚Ä‚¢‚鎞‚Å‚ ‚éDi_lock_cpu‚É‚æ‚Á‚Ä
    1255 CPUƒƒbƒNó‘Ô‚É‚È‚Á‚Ä‚¢‚鎞‚ɂ́Ct_unlock_cpu‚ªŒÄ‚яo‚³‚ê‚邱‚Æ‚Í‚È‚¢D
    1256 
    1257 “¯—l‚ɁC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅCPUƒƒbƒNó‘Ô‚É‘JˆÚ‚µ‚½ê‡‚ɂ́CCPUƒƒb
    1258 ƒN‰ðœó‘Ô‚É–ß‚é‚Ì‚Í”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÉŒÀ‚ç‚êCƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Å
    1259 CPUƒƒbƒN‰ðœó‘Ԃɖ߂邱‚Æ‚Í‚È‚¢DŒ¾‚¢Š·‚¦‚é‚ƁCi_unlock_cpu‚ªŒÄ‚яo‚³
    1260 ‚ê‚é‚̂́Ci_lock_cpu‚É‚æ‚Á‚ÄCPUƒƒbƒNó‘Ô‚É‚È‚Á‚Ä‚¢‚鎞‚Å‚ ‚éD
    1261 t_lock_cpu‚É‚æ‚Á‚ÄCPUƒƒbƒNó‘Ô‚É‚È‚Á‚Ä‚¢‚鎞‚ɂ́Ci_unlock_cpu‚ªŒÄ‚яo
    1262 ‚³‚ê‚邱‚Æ‚Í‚È‚¢D
    1263 
    1264 ‚±‚ê‚ç‚̊֐”‚ðŽÀŒ»‚·‚éÛ‚ɂ́Cu1.6 ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚̏o“üˆ—‚Ì
    1265 ŽÀŒ»‚ÉŠÖ‚·‚鐧–ñv‚̐߂ɋLq‚³‚ê‚Ä‚¢‚鐧–ñ‚ɏ]‚í‚È‚¯‚ê‚΂Ȃç‚È‚¢D
     1197CPUロック状態から,CPUロック解除状態へ遷移させる関数.これらの関数は,
     1198CPUロック解除状態で呼び出されることはなく,呼び出された場合の動作は保証
     1199する必要がない.
     1200
     1201タスクコンテキストでCPUロック状態に遷移した場合には,CPUロック解除状態
     1202に戻るのはタスクコンテキストに限られ,非タスクコンテキストでCPUロック解
     1203除状態に戻ることはない.言い換えると,t_unlock_cpuが呼び出されるのは,
     1204t_lock_cpuによってCPUロック状態になっている時である.i_lock_cpuによって
     1205CPUロック状態になっている時には,t_unlock_cpuが呼び出されることはない.
     1206
     1207同様に,非タスクコンテキストでCPUロック状態に遷移した場合には,CPUロッ
     1208ク解除状態に戻るのは非タスクコンテキストに限られ,タスクコンテキストで
     1209CPUロック解除状態に戻ることはない.言い換えると,i_unlock_cpuが呼び出さ
     1210れるのは,i_lock_cpuによってCPUロック状態になっている時である.
     1211t_lock_cpuによってCPUロック状態になっている時には,i_unlock_cpuが呼び出
     1212されることはない.
     1213
     1214これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
     1215実現に関する制約」の節に記述されている制約に従わなければならない.
    12661216
    12671217(6-3-3-7) bool_t t_sense_lock(void)
     
    12691219(6-3-3-9) bool_t x_sense_lock(void)
    12701220
    1271 Œ»Ý‚̃VƒXƒeƒ€ó‘Ô‚ªCCPUƒƒbƒNó‘Ԃ̏ꍇ‚ÍtrueCCPUƒƒbƒN‰ðœó‘Ԃ̏ê
    1272 ‡‚É‚Ífalse‚ð•Ô‚·ŠÖ”D
    1273 
    1274 ‚±‚ê‚ç‚̊֐”‚ª‘SŠ„ž‚݃ƒbƒNó‘ԂŌĂяo‚³‚ê‚éó‹µ‚͍l‚¦‚é•K—v‚ª‚È‚¢‚±
    1275 ‚Æ‚©‚çC‘SŠ„ž‚݃ƒbƒNó‘Ô‚ÆCPUƒƒbƒNó‘Ô‚ð‹æ•Ê‚Å‚«‚é•K—v‚Í‚È‚¢DNMIˆÈ
    1276 ŠO‚ɃJ[ƒlƒ‹‚ÌŠÇ—ŠO‚ÌŠ„ž‚Ý‚ðÝ‚¯‚È‚¢ê‡‚ɂ́C‘SŠ„ž‚݃ƒbƒNó‘Ô‚Æ
    1277 CPUƒƒbƒNó‘Ô‚ª‘S‚­“¯ˆê‚̏ó‘Ô‚Å‚à‚©‚Ü‚í‚È‚¢D
    1278 
    1279 6.4 Š„ž‚Ý‚ÉŠÖ˜A‚·‚éƒVƒXƒeƒ€ó‘Ô‚ÌŠÇ—
    1280 
    1281 6.4.1 Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÌŠÇ—
    1282 
    1283 ƒ^[ƒQƒbƒgˆË‘¶•”‚́CŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÝ’è‚·‚é‹@”\‚ƁCŠ„ž‚Ý—Dæ“xƒ}
    1284 ƒXƒN‚ðŽQÆ‚·‚é‹@”\‚ð’ñ‹Ÿ‚·‚éD
     1221現在のシステム状態が,CPUロック状態の場合はtrue,CPUロック解除状態の場
     1222合にはfalseを返す関数.
     1223
     1224これらの関数が全割込みロック状態で呼び出される状況は考える必要がないこ
     1225とから,全割込みロック状態とCPUロック状態を区別できる必要はない.NMI以
     1226外にカーネルの管理外の割込みを設けない場合には,全割込みロック状態と
     1227CPUロック状態が全く同一の状態でもかまわない.
     1228
     12296.4 割込みに関連するシステム状態の管理
     1230
     12316.4.1 割込み優先度マスクの管理
     1232
     1233ターゲット依存部は,割込み優先度マスクを設定する機能と,割込み優先度マ
     1234スクを参照する機能を提供する.
    12851235
    12861236(6-4-1-1) void x_set_ipm(PRI intpri)
     
    12881238(6-4-1-3) void i_set_ipm(PRI intpri)
    12891239
    1290 Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì’l‚ðintpri‚ɐݒ肷‚éŠÖ”D
    1291 
    1292 ‚±‚ê‚ç‚̊֐”‚́CCPUƒƒbƒNó‘Ô‚Å‚àCPUƒƒbƒN‰ðœó‘Ô‚Å‚àŒÄ‚яo‚¹‚é‚悤‚É
    1293 ŽÀ‘•‚·‚é‚Ì‚ª–]‚Ü‚µ‚¢D‚½‚¾‚µCx_set_ipm‚Æt_set_ipm‚́Cƒ^[ƒQƒbƒg”ñˆË‘¶
    1294 •”‚ªCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚·‚±‚Æ‚Í‚È‚¢‚½‚߁CCPUƒƒbƒN‰ðœó‘ԂŌĂÑ
    1295 o‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª‚È‚¢Di_set_ipm‚́CCPUƒƒbƒNó‘Ô‚Å‚à
    1296 CPUƒƒbƒN‰ðœó‘Ô‚Å‚àŒÄ‚яo‚¹‚é‚悤‚ÉŽÀ‘•‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    1297 
    1298 ‚Ü‚½C‚±‚ê‚ç‚̊֐”‚́CVALID_INTPRI_CHGIPM(intpri)‚ªtrue‚ð•Ô‚·intpri‚É‘Î
    1299 ‚µ‚Ă̂݌Ă΂ê‚éDintpri‚É‚»‚¤‚Å‚È‚¢’l‚ª“n‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é•K
    1300 —v‚ª‚È‚¢D
     1240割込み優先度マスクの値をintpriに設定する関数.
     1241
     1242これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
     1243実装するのが望ましい.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存
     1244部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
     1245出された場合の動作は保証する必要がない.i_set_ipmは,CPUロック状態でも
     1246CPUロック解除状態でも呼び出せるように実装しなければならない.
     1247
     1248また,これらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対
     1249してのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証する必
     1250要がない.
    13011251
    13021252(6-4-1-4) PRI x_get_ipm(void)
     
    13041254(6-4-1-6) PRI i_get_ipm(void)
    13051255
    1306 Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì’l‚ðŽQÆ‚µ‚Ä•Ô‚·ŠÖ”D
    1307 
    1308 ‚±‚ê‚ç‚̊֐”‚́CCPUƒƒbƒNó‘Ô‚Å‚àCPUƒƒbƒN‰ðœó‘Ô‚Å‚àŒÄ‚яo‚¹‚é‚悤‚É
    1309 ŽÀ‘•‚·‚é‚Ì‚ª–]‚Ü‚µ‚¢D‚½‚¾‚µCx_get_ipm‚Æt_get_ipm‚́Cƒ^[ƒQƒbƒg”ñˆË‘¶
    1310 •”‚ªCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚·‚±‚Æ‚Í‚È‚¢‚½‚߁CCPUƒƒbƒN‰ðœó‘ԂŌĂÑ
    1311 o‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª‚È‚¢Di_get_ipm‚́CCPUƒƒbƒNó‘Ô‚Å‚à
    1312 CPUƒƒbƒN‰ðœó‘Ô‚Å‚àŒÄ‚яo‚¹‚é‚悤‚ÉŽÀ‘•‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    1313 
    1314 Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ð—p‚¢‚ăJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý‚ð‚·‚×‚Äƒ}ƒXƒN‚µ‚½ó‘Ԃ́C
    1315 CPUƒƒbƒNó‘Ô‚Æ‹æ•Ê‚Å‚«‚邱‚Æ‚ª•K—v‚Å‚ ‚éD‹ï‘Ì“I‚ɂ́CCPUƒƒbƒN‰ðœó
    1316 ‘Ô‚É‚¨‚¢‚āCx_set_ipm‚ð—p‚¢‚ăJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý‚ð‚·‚×‚Äƒ}ƒXƒN‚µ‚½ê‡
    1317 ‚Å‚àCx_sense_lock‚Ífalse‚ð•Ô‚·D
    1318 
    1319 ‚»‚ê‚ɑ΂µ‚āCŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ð—p‚¢‚ÄNMI‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý‚ðƒ}ƒXƒN
    1320 ‚Å‚«‚éê‡C‚»‚̏ó‘Ô‚Æ‘SŠ„ž‚݃ƒbƒNó‘Ô‚ð‹æ•Ê‚Å‚«‚é•K—v‚Í‚È‚­C‘S‚­“¯
    1321 ˆê‚̏ó‘Ô‚Å‚à‚©‚Ü‚í‚È‚¢D
    1322 
    1323 6.4.2 Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚ÌŠÇ—
    1324 
    1325 ƒ^[ƒQƒbƒgˆË‘¶•”‚́CŠ„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚ðƒZƒbƒg‚·‚é‹@”\‚ƃNƒŠƒA‚·‚é‹@
    1326 ”\‚ð’ñ‹Ÿ‚·‚éD
     1256割込み優先度マスクの値を参照して返す関数.
     1257
     1258これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
     1259実装するのが望ましい.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存
     1260部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
     1261出された場合の動作は保証する必要がない.i_get_ipmは,CPUロック状態でも
     1262CPUロック解除状態でも呼び出せるように実装しなければならない.
     1263
     1264割込み優先度マスクを用いてカーネル管理の割込みをすべてマスクした状態は,
     1265CPUロック状態と区別できることが必要である.具体的には,CPUロック解除状
     1266態において,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合
     1267でも,x_sense_lockはfalseを返す.
     1268
     1269それに対して,割込み優先度マスクを用いてNMIを除くすべての割込みをマスク
     1270できる場合,その状態と全割込みロック状態を区別できる必要はなく,全く同
     1271一の状態でもかまわない.
     1272
     12736.4.2 割込み要求禁止フラグの管理
     1274
     1275ターゲット依存部は,割込み要求禁止フラグをセットする機能とクリアする機
     1276能を提供する.
    13271277
    13281278(6-4-2-1) bool_t VALID_INTNO_DISINT(INTNO intno)
    13291279
    1330 intno‚ªCdis_int^ena_int‚ɑ΂·‚銄ž‚ݔԍ†‚Æ‚µ‚Ä—LŒø‚È’l‚Å‚ ‚éê‡‚É
    1331 trueC‚»‚¤‚Å‚È‚¢ê‡‚Éfalse‚ð•Ô‚·ƒ}ƒNƒDŠ„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚ªƒZƒbƒg^
    1332 ƒNƒŠƒA‚Å‚«‚È‚¢intno‚ɑ΂µ‚ẮC‚±‚̃}ƒNƒ‚ªfalse‚ð•Ô‚·‚悤‚É‚·‚éD
     1280intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に
     1281true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/
     1282クリアできないintnoに対しては,このマクロがfalseを返すようにする.
    13331283
    13341284(6-4-2-2) bool_t x_disable_int(INTNO intno)
     
    13361286(6-4-2-4) bool_t i_disable_int(INTNO intno)
    13371287
    1338 intno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂·‚銄ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚ðƒZƒbƒg‚µC
    1339 true‚ð•Ô‚·ŠÖ”DŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚āCŠ„ž‚Ý‘®«‚ªÝ’肳
    1340 ‚ê‚Ä‚¢‚È‚¢ê‡‚ɂ́Cfalse‚ð•Ô‚·D
    1341 
    1342 ‚±‚ê‚ç‚̊֐”‚́Cƒ^[ƒQƒbƒg”ñˆË‘¶•”‚ªCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚·‚±‚Æ‚Í‚È
    1343 ‚¢‚½‚߁CCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª‚È‚¢D
    1344 ‚½‚¾‚µCƒ^[ƒQƒbƒgˆË‘¶•”‚©‚çCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚·ê‡‚ɂ́C•ÛØ‚·
    1345 ‚é•K—v‚ª‚ ‚éD
    1346 
    1347 ‚Ü‚½C‚±‚ê‚ç‚̊֐”‚́CVALID_INTNO_DISINT(intno)‚ªtrue‚Æ‚È‚éintno‚ɑ΂µ
    1348 ‚Ă̂݌Ă΂ê‚éDintno‚É‚»‚¤‚Å‚È‚¢’l‚ª“n‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª
    1349 ‚È‚¢D
    1350 
    1351 dis_intƒT[ƒrƒXƒR[ƒ‹‚ðƒTƒ|[ƒg‚·‚éê‡iTOPPERS_SUPPORT_DIS_INT‚ðƒ}ƒN
    1352 ƒ’è‹`‚·‚éê‡j‚ɂ́Ct_disable_int‚ª—pˆÓ‚³‚ê‚Ä‚¢‚È‚¯‚ê‚΂Ȃç‚È‚¢D
     1288intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし,
     1289trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
     1290れていない場合には,falseを返す.
     1291
     1292これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
     1293いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
     1294ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
     1295る必要がある.
     1296
     1297また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
     1298てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
     1299ない.
     1300
     1301dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク
     1302ロ定義する場合)には,t_disable_intが用意されていなければならない.
    13531303
    13541304(6-4-2-5) bool_t x_enable_int(INTNO intno)
     
    13561306(6-4-2-7) bool_t i_enable_int(INTNO intno)
    13571307
    1358 intno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂·‚銄ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚ðƒNƒŠƒA‚µC
    1359 true‚ð•Ô‚·ŠÖ”DŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚āCŠ„ž‚Ý‘®«‚ªÝ’肳
    1360 ‚ê‚Ä‚¢‚È‚¢ê‡‚ɂ́Cfalse‚ð•Ô‚·D
    1361 
    1362 ‚±‚ê‚ç‚̊֐”‚́Cƒ^[ƒQƒbƒg”ñˆË‘¶•”‚ªCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚·‚±‚Æ‚Í‚È
    1363 ‚¢‚½‚߁CCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª‚È‚¢D
    1364 ‚½‚¾‚µCƒ^[ƒQƒbƒgˆË‘¶•”‚©‚çCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚·ê‡‚ɂ́C•ÛØ‚·
    1365 ‚é•K—v‚ª‚ ‚éD
    1366 
    1367 ‚Ü‚½C‚±‚ê‚ç‚̊֐”‚́CVALID_INTNO_DISINT(intno)‚ªtrue‚Æ‚È‚éintno‚ɑ΂µ
    1368 ‚Ă̂݌Ă΂ê‚éDintno‚É‚»‚¤‚Å‚È‚¢’l‚ª“n‚³‚ꂽê‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª
    1369 ‚È‚¢D
    1370 
    1371 ena_intƒT[ƒrƒXƒR[ƒ‹‚ðƒTƒ|[ƒg‚·‚éê‡iTOPPERS_SUPPORT_ENA_INT‚ðƒ}ƒN
    1372 ƒ’è‹`‚·‚éê‡j‚ɂ́Ct_enable_int‚ª—pˆÓ‚³‚ê‚Ä‚¢‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    1373 
    1374 6.4.3 Š„ž‚Ý—v‹‚̃NƒŠƒA
     1308intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし,
     1309trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
     1310れていない場合には,falseを返す.
     1311
     1312これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
     1313いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
     1314ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
     1315る必要がある.
     1316
     1317また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
     1318てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
     1319ない.
     1320
     1321ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク
     1322ロ定義する場合)には,t_enable_intが用意されていなければならない.
     1323
     13246.4.3 割込み要求のクリア
    13751325
    13761326(6-4-3-1) void x_clear_int(INTNO intno)
     
    13781328(6-4-3-3) void i_clear_int(INTNO intno)
    13791329
    1380 intno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ªƒGƒbƒWƒgƒŠƒK‚Å‚ ‚éê‡‚ɁCƒgƒŠƒK‚³‚ê
    1381 ‚½Š„ž‚Ý—v‹‚ðƒNƒŠƒA‚·‚éŠÖ”Dintno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ªƒŒƒxƒ‹
    1382 ƒgƒŠƒK‚Å‚ ‚éê‡‚ɂ͉½‚à‚µ‚È‚¢D
    1383 
    1384 SSPƒJ[ƒlƒ‹‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚ł́C‚±‚ê‚ç‚̊֐”‚ðŒÄ‚яo‚µ‚Ä‚¢‚È‚¢‚ªC
    1385 ƒ^[ƒQƒbƒgˆË‘¶•”‚âƒVƒXƒeƒ€ƒT[ƒrƒX‚ŌĂяo‚·‰Â”\«‚ª‚‚¢‚½‚߁C—pˆÓ‚·‚é
    1386 ‚±‚Æ‚Æ‚µ‚Ä‚¢‚éD‚»‚Ì‚½‚߁C‚±‚ê‚ç‚̊֐”‚ª‚ǂ̂悤‚ȃVƒXƒeƒ€ó‘ԂŌĂяo
    1387 ‚¹‚é‚©‚́Cƒ^[ƒQƒbƒgˆË‘¶•”“à‚ňêŠÑ‚µ‚Ä‚¢‚ê‚΂悢D
    1388 
    1389 6.4.4 Š„ž‚Ý—v‹‚̃vƒ[ƒu
     1330intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ
     1331た割込み要求をクリアする関数.intnoで指定された割込み要求ラインがレベル
     1332トリガである場合には何もしない.
     1333
     1334SSPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
     1335ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
     1336こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
     1337せるかは,ターゲット依存部内で一貫していればよい.
     1338
     13396.4.4 割込み要求のプローブ
    13901340
    13911341(6-4-4-1) bool_t x_probe_int(INTNO intno)
     
    13931343(6-4-4-3) bool_t i_probe_int(INTNO intno)
    13941344
    1395 intno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚āCŠ„ž‚Ý‚ª—v‹‚³‚ê‚Ä‚¢‚éê‡‚É
    1396 trueC‚»‚¤‚Å‚È‚¢ê‡‚Éfalse‚ð•Ô‚·ŠÖ”D
    1397 
    1398 SSPƒJ[ƒlƒ‹‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚ł́C‚±‚ê‚ç‚̊֐”‚ðŒÄ‚яo‚µ‚Ä‚¢‚È‚¢‚ªC
    1399 ƒ^[ƒQƒbƒgˆË‘¶•”‚âƒVƒXƒeƒ€ƒT[ƒrƒX‚ŌĂяo‚·‰Â”\«‚ª‚‚¢‚½‚߁C—pˆÓ‚·‚é
    1400 ‚±‚Æ‚Æ‚µ‚Ä‚¢‚éD‚»‚Ì‚½‚߁C‚±‚ê‚ç‚̊֐”‚ª‚ǂ̂悤‚ȃVƒXƒeƒ€ó‘ԂŌĂяo
    1401 ‚¹‚é‚©‚́Cƒ^[ƒQƒbƒgˆË‘¶•”“à‚ňêŠÑ‚µ‚Ä‚¢‚ê‚΂悢D
    1402 
    1403 6.4.5 Š„ž‚݃nƒ“ƒhƒ‰‚̐擪ˆ—‚Æ––”öˆ—
     1345intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に
     1346true,そうでない場合にfalseを返す関数.
     1347
     1348SSPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
     1349ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
     1350こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
     1351せるかは,ターゲット依存部内で一貫していればよい.
     1352
     13536.4.5 割込みハンドラの先頭処理と末尾処理
    14041354
    14051355(6-4-5-1) void i_begin_int(INTNO intno)
    14061356
    1407 intno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂·‚銄ž‚݃nƒ“ƒhƒ‰‚̐擪‚ōs‚¤‚ׂ«
    1408 ˆ—‚ðs‚¤ŠÖ”D‚±‚±‚ōs‚¤‚ׂ«ˆ—‚Æ‚µ‚ẮCŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ªƒGƒbƒWƒg
    1409 ƒŠƒK‚Å‚ ‚éê‡‚̃gƒŠƒK‚³‚ꂽŠ„ž‚Ý—v‹‚̃NƒŠƒA‚ª‹“‚°‚ç‚ê‚éD
    1410 
    1411 intno‚ɑ΂µ‚Ä“o˜^‚³‚ꂽŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ðŒÄ‚яo‚·Š„ž‚݃nƒ“ƒhƒ‰‚Ì
    1412 æ“ª‚ŌĂяo‚³‚ê‚éD‚»‚Ì‚½‚ß‚±‚̊֐”‚́CŠ„ž‚݃nƒ“ƒhƒ‰‚̐擪i’ʏí‚Í
    1413 CPUƒƒbƒN‰ðœó‘ԁj‚ŌĂяo‚¹‚é‚悤‚ÉŽÀ‘•‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
     1357intnoで指定された割込み要求ラインに対する割込みハンドラの先頭で行うべき
     1358処理を行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト
     1359リガである場合のトリガされた割込み要求のクリアが挙げられる.
     1360
     1361intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
     1362先頭で呼び出される.そのためこの関数は,割込みハンドラの先頭(通常は
     1363CPUロック解除状態)で呼び出せるように実装しなければならない.
    14141364
    14151365(6-4-5-2) void i_end_int(INTNO intno)
    14161366
    1417 intno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂·‚銄ž‚݃nƒ“ƒhƒ‰‚Ì––”ö‚ōs‚¤‚ׂ«
    1418 ˆ—‚ðs‚¤ŠÖ”D‚±‚±‚ōs‚¤‚ׂ«ˆ—‚Æ‚µ‚ẮCŠ„ž‚݃Rƒ“ƒgƒ[ƒ‰iIRCj‚É
    1419 ‘΂·‚銄ž‚ݏˆ—‚̏I—¹‚ð’Ê’m‚ª‹“‚°‚ç‚ê‚éD
    1420 
    1421 intno‚ɑ΂µ‚Ä“o˜^‚³‚ꂽŠ„ž‚݃T[ƒrƒXƒ‹[ƒ`ƒ“‚ðŒÄ‚яo‚·Š„ž‚݃nƒ“ƒhƒ‰‚Ì
    1422 ––”ö‚ŌĂяo‚³‚ê‚éD‚»‚Ì‚½‚ß‚±‚̊֐”‚́CŠ„ž‚݃nƒ“ƒhƒ‰‚Ì––”öi’ʏí‚Í
    1423 CPUƒƒbƒN‰ðœó‘ԁj‚ŌĂяo‚¹‚é‚悤‚ÉŽÀ‘•‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    1424 
    1425 6.5 ƒ^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ
    1426 
    1427 
    1428 6.5.1 ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“®ìŠJŽn
     1367intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき
     1368処理を行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に
     1369対する割込み処理の終了を通知が挙げられる.
     1370
     1371intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
     1372末尾で呼び出される.そのためこの関数は,割込みハンドラの末尾(通常は
     1373CPUロック解除状態)で呼び出せるように実装しなければならない.
     1374
     13756.5 タスクディスパッチャ
     1376
     1377
     13786.5.1 ディスパッチャの動作開始
    14291379
    14301380(6-5-1-1) void start_dispatch(void)
    14311381
    1432 ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“®ìŠJŽnistart_dispatchj‚́CƒJ[ƒlƒ‹‹N“®Žž‚ɁCƒJ[ƒl
    1433 ƒ‹‚̏‰Šú‰»ˆ—‚©‚çŒÄ‚яo‚³‚ê‚éDstart_dispatch‚́CƒŠƒ^[ƒ“‚·‚邱‚Æ‚Ì‚È
    1434 ‚¢ŠÖ”‚Å‚ ‚éD
    1435 
    1436 start_dispatch‚́C”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ŁCNMI‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý‚ðƒ}ƒX
    1437 ƒN‚µ‚½ó‘ԁi‘SŠ„ž‚݃ƒbƒNó‘Ô‚Æ“¯“™‚̏ó‘ԁj‚ŌĂяo‚³‚ê‚éDstart_dispatch
    1438 “à‚ŁCƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؂芷‚¦CCPUƒƒbƒNó‘ԁEŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S
    1439 ‰ðœó‘Ô‚É‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    1440 
    1441 ƒRƒ“ƒeƒLƒXƒg‚ðØ‚è‘Ö‚¦‚½Œã‚̓^[ƒQƒbƒg”ñˆË‘¶•”ŠÖ”dispatcher‚ðŒÄ‚яo‚·D
    1442 
    1443 start_dispatch‚̏ˆ—“à—e‚ÍŽŸ‚Ì’Ê‚èDdispatcher‚©‚珈—‚ª•Ô‚邱‚Ƃ͍l—Ê‚·‚é•K—v‚Í
    1444 ‚È‚¢D
     1382ディスパッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ
     1383ルの初期化処理から呼び出される.start_dispatchは,リターンすることのな
     1384い関数である.
     1385
     1386start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス
     1387クした状態(全割込みロック状態と同等の状態)で呼び出される.start_dispatch
     1388内で,タスクコンテキストに切り換え,CPUロック状態・割込み優先度マスク全
     1389解除状態にしなければならない.
     1390
     1391コンテキストを切り替えた後はターゲット非依存部関数dispatcherを呼び出す.
     1392
     1393start_dispatchの処理内容は次の通り.dispatcherから処理が返ることは考量する必要は
     1394ない.
    14451395
    14461396----------------------------------------
     
    14481398start_dispatch(void)
    14491399{
    1450         ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؂芷‚¦‚é
    1451         CPUƒƒbƒNó‘ԁEŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô‚É‚·‚é
    1452         dispatcher‚É•ªŠò‚·‚é
     1400        タスクコンテキストに切り換える
     1401        CPUロック状態・割込み優先度マスク全解除状態にする
     1402        dispatcherに分岐する
    14531403}
    14541404----------------------------------------
    14551405
    1456 6.6 Š„ž‚݃nƒ“ƒhƒ‰
    1457 
    1458 6.6.1 Š„ž‚݃nƒ“ƒhƒ‰‚̏o“üŒûˆ—
    1459 
    1460 ƒJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚݂̏o“üŒûˆ—‚Ì•û–@‚́CƒvƒƒZƒbƒT‚É‚æ‚Á‚Ä‘å‚«‚­ˆÙ‚È
    1461 ‚邪C‚¨‚¨‚æ‚»‚̏ˆ—“à—e‚ÍŽŸ‚Ì’Ê‚èD
     14066.6 割込みハンドラ
     1407
     14086.6.1 割込みハンドラの出入口処理
     1409
     1410カーネル管理の割込みの出入口処理の方法は,プロセッサによって大きく異な
     1411るが,おおよその処理内容は次の通り.
    14621412
    14631413----------------------------------------
    14641414void
    1465 <Š„ž‚݂̏o“üŒûˆ—>(void)
     1415<割込みの出入口処理>(void)
    14661416{
    1467         ­‚È‚­‚Æ‚àƒJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý‚ð‹ÖŽ~‚µ‚½ó‘Ô‚É‚·‚é c (*f)
    1468         ƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚ðƒXƒ^ƒbƒN‚É•Û‘¶‚·‚é
    1469         if (ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅŠ„ž‚Ý”­¶) {
    1470                 ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ɐ؂芷‚¦‚é
     1417        少なくともカーネル管理の割込みを禁止した状態にする … (*f)
     1418        スクラッチレジスタをスタックに保存する
     1419        if (タスクコンテキストで割込み発生) {
     1420                非タスクコンテキストに切り換える
    14711421        }
    14721422
    1473         ‚±‚ÌŠ„ž‚Ý‚æ‚è‚à—Dæ“x‚̍‚‚¢Š„ž‚Ý‚Ì‚Ý‚ðŽó‚¯•t‚¯‚ç‚ê‚é‚悤‚É‚µ‚āC
    1474                                                                                                 CPUƒƒbƒN‰ðœó‘Ô‚É‚·‚é
     1423        この割込みよりも優先度の高い割込みのみを受け付けられるようにして,
     1424                                                                                                CPUロック解除状態にする
    14751425#ifdef LOG_INH_ENTER
    1476         log_inh_enter(Š„ž‚݃nƒ“ƒhƒ‰”ԍ†);
     1426        log_inh_enter(割込みハンドラ番号);
    14771427#endif /* LOG_INH_ENTER */
    1478         Š„ž‚݃nƒ“ƒhƒ‰‚ðŒÄ‚яo‚·
     1428        割込みハンドラを呼び出す
    14791429#ifdef LOG_INH_LEAVE
    1480         log_inh_leave(Š„ž‚݃nƒ“ƒhƒ‰”ԍ†);
     1430        log_inh_leave(割込みハンドラ番号);
    14811431#endif /* LOG_INH_LEAVE */
    14821432
    14831433  ret_int:
    1484         if (ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÅŠ„ž‚Ý”­¶) {
    1485                 i­‚È‚­‚Æ‚àjƒJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý‚ð‹ÖŽ~‚µ‚½ó‘Ô‚É‚·‚é c (*d)
     1434        if (タスクコンテキストで割込み発生) {
     1435                (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d)
    14861436                if (reqflg) {
    14871437                        reqflg = false;
    1488                         CPUƒƒbƒNó‘Ô‚É‚·‚é c (*e)
    1489                         search_schedtsk‚ðŒÄ‚яo‚µCÅ‚—Dæ‡ˆÊƒ^ƒXƒN‚ð‹‚ß‚é
    1490                         Å‚—Dæ‡ˆÊ‚̃^ƒXƒNID‚ðˆø”‚É‚µ‚Ärun_task‚É•ªŠò‚·‚é
     1438                        CPUロック状態にする … (*e)
     1439                        search_schedtskを呼び出し,最高優先順位タスクを求める
     1440                        最高優先順位のタスクIDを引数にしてrun_taskに分岐する
    14911441                }
    14921442        }
    1493         Š„ž‚ݏˆ—‚©‚ç‚̃Šƒ^[ƒ“Œã‚ɁCCPUƒƒbƒN‰ðœó‘Ô‚É–ß‚é‚悤‚ɏ€”õ‚·‚é
    1494         ƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚ðƒXƒ^ƒbƒN‚©‚ç•œ‹A‚·‚é
    1495         Š„ž‚ݏˆ—‚©‚ç‚̃Šƒ^[ƒ“
     1443        割込み処理からのリターン後に,CPUロック解除状態に戻るように準備する
     1444        スクラッチレジスタをスタックから復帰する
     1445        割込み処理からのリターン
    14961446}
    14971447----------------------------------------
    14981448
    1499 Š„ž‚Ý‚ÌŽó•t‚¯‚É‚æ‚è‚·‚ׂĂ̊„ž‚Ý‚ª‹ÖŽ~‚³‚ê‚È‚¢ƒvƒƒZƒbƒT‚ł́C(*f)‚É
    1500 ‚¨‚¢‚āC­‚È‚­‚Æ‚àƒJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý‚ð‹ÖŽ~‚·‚éD‚±‚Ì——R‚ÍŽŸ‚Ì’Ê‚è‚Å
    1501 ‚ ‚éD
    1502 
    1503 Š„ž‚Ý‚Ì“üŒûˆ—‚É‚¨‚¢‚āCƒXƒ^ƒbƒN‚ð”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒbƒN‚É
    1504 Ø‚芷‚¦‚é‘O‚É‘½dŠ„ž‚Ý‚ª”­¶‚·‚é‚ƁCƒ^ƒXƒN‚̃Xƒ^ƒbƒN—̈悪Žg—p‚³‚ê‚éD
    1505 ã‹L‚̂悤‚ȃvƒƒZƒbƒT‚ł́CƒXƒ^ƒbƒN‚̐؊·‚¦‘O‚ɁCÅ‘å‚ÅŠ„ž‚Ý—Dæ“x‚Ì
    1506 ’i”•ª‚Ì‘½dŠ„ž‚Ý‚ª”­¶‚·‚邱‚Æ‚ð–h‚®‚±‚Æ‚Í‚Å‚«‚¸CŠeƒ^ƒXƒN‚̃Xƒ^ƒbƒN
    1507 —̈æ‚ðŠm•Û‚·‚éÛ‚ɁC‚»‚Ì•ª‚ðŒ©ž‚ñ‚ÅŠm•Û‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢DŠeƒ^ƒXƒN‚Ì
    1508 ƒXƒ^ƒbƒN—̈æ‚ð‚È‚é‚ׂ­¬‚³‚­‚·‚邽‚߂ɂ́CƒXƒ^ƒbƒN‚ð‚È‚é‚ׂ­Žg—p‚µ‚È‚¢
    1509 “à‚ɁC‘½dŠ„ž‚Ý‚ð‹ÖŽ~‚·‚é‚Ì‚ª–]‚Ü‚µ‚¢D‚»‚Ì‚½‚߁CƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚ð
    1510 ƒXƒ^ƒbƒN‚É•Û‘¶‚·‚é‘O‚ɁCŠ„ž‚Ý‚ð‹ÖŽ~‚·‚éD‚½‚¾‚µCŠ„ž‚Ý‚Ì‹ÖŽ~ˆ—‚É•K
    1511 —v‚ȍŒáŒÀ‚̃ŒƒWƒXƒ^‚ɂ‚¢‚ẮCŠ„ž‚Ý‚Ì‹ÖŽ~‚ɐ旧‚Á‚ăXƒ^ƒbƒN‚É•Û‘¶‚·
    1512 ‚é•K—v‚ª‚ ‚éD
    1513 
    1514 “¯—l‚Ì‚±‚Ƃ́CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚É‚à“–‚Ä‚Í‚Ü‚éD‚·‚È‚í‚¿CƒJ[ƒlƒ‹
    1515 ŠÇ—ŠO‚ÌŠ„ž‚݂ɂ‚¢‚Ä‚àCƒXƒ^ƒbƒN‚ð‚È‚é‚ׂ­Žg—p‚µ‚È‚¢“à‚É‹ÖŽ~‚·‚é‚Ì‚ª
    1516 –]‚Ü‚µ‚¢D‚±‚Ì‚±‚Æ‚©‚çCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ðŽg—p‚·‚éê‡‚ɂ́C(*f)
    1517 ‚É‚¨‚¢‚āC‚·‚ׂĂ̊„ž‚Ý‚ð‹ÖŽ~‚µ‚½ó‘Ô‚É‚·‚é‚Ì‚ª–]‚Ü‚µ‚¢‚±‚Æ‚É‚È‚éD‚Ü
    1518 ‚½CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚ݏˆ—‚É‚¨‚¢‚Ä‚àC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒb
    1519 ƒN‚ɐ؂芷‚¦‚邱‚Æ‚ª–]‚Ü‚µ‚¢‚ªC‚±‚ê‚̓J[ƒlƒ‹‚ÌŠÇŠŠO‚Å‚ ‚éD
    1520 
    1521 (*d)‚É‚¨‚¢‚ẮCƒJ[ƒlƒ‹ŠÇ—‚ÌŠ„ž‚Ý‚ð‹ÖŽ~‚·‚邾‚¯‚ŁCCPUƒƒbƒNó‘Ô‚É‚·
    1522 ‚é•K—v‚Í‚È‚¢D—Ⴆ‚΁CCPUƒƒbƒNó‘Ô‚Å‚ ‚邱‚Æ‚ðŽ¦‚·•Ï”‚ð—pˆÓ‚µ‚Ä‚¢‚éê
    1523 ‡‚ɂ́C(*d)‚ÌŽž“_‚Å‚Í‚»‚̕ϐ”‚ðCPUƒƒbƒNó‘Ô‚ðŽ¦‚·’l‚ɕύX‚·‚é•K—v‚Í‚È
    1524 ‚­C(*e)‚É‚¨‚¢‚ĕύX‚·‚ê‚΂悢D
    1525 
    1526 Š„ž‚݂̏o“üŒûˆ—‚ðƒAƒZƒ“ƒuƒŠŒ¾Œê‚Å‹Lq‚·‚éê‡‚ɂ́CƒgƒŒ[ƒXƒƒOŽæ“¾
    1527 ˆ—‚́Cu6.2 ƒgƒŒ[ƒXƒƒO‹@”\‚ւ̑Ήžv‚̐߂ŋLq‚µ‚½•û–@‚ŃR[ƒfƒBƒ“
    1528 ƒO‚·‚邱‚ƁD
    1529 
    1530 6.6.2 Š„ž‚݃nƒ“ƒhƒ‰–ˆ‚̏o“üŒûˆ—‚̐¶¬
    1531 
    1532 Š„ž‚݃xƒNƒgƒ‹‚ðƒn[ƒhƒEƒFƒA‚ÅŽÀŒ»‚µ‚Ä‚¢‚éê‡‚ȂǁCŠ„ž‚݃nƒ“ƒhƒ‰–ˆ‚É
    1533 o“üŒûˆ—‚ð—pˆÓ‚µ‚½•û‚ªŒø—¦‚ª—Ç‚¢ƒ^[ƒQƒbƒg‚Ì‚½‚߂ɁCŠ„ž‚݃nƒ“ƒhƒ‰–ˆ
    1534 ‚ɏo“üŒûˆ—‚𐶐¬‚·‚é‹@\‚ð—pˆÓ‚µ‚Ä‚¢‚éD
    1535 
    1536 ˆÈ‰º‚̃}ƒNƒ‚́C•W€‚ÌŠ„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ð—p‚¢‚½ê‡‚̂݁Cƒ^[
    1537 ƒQƒbƒg”ñˆË‘¶•”‚ÅŽg‚í‚ê‚éDŠ„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ðƒ^[ƒQƒbƒgˆË‘¶•”
    1538 ‚Å—pˆÓ‚µC‚»‚Ì’†‚Å‚±‚ê‚ç‚̃}ƒNƒ‚ðŽg‚í‚È‚¢ê‡‚ɂ́C‚±‚ê‚ç‚̃}ƒNƒ‚ð—p
    1539 ˆÓ‚·‚é•K—v‚Í‚È‚¢D
     1449割込みの受付けによりすべての割込みが禁止されないプロセッサでは,(*f)に
     1450おいて,少なくともカーネル管理の割込みを禁止する.この理由は次の通りで
     1451ある.
     1452
     1453割込みの入口処理において,スタックを非タスクコンテキスト用のスタックに
     1454切り換える前に多重割込みが発生すると,タスクのスタック領域が使用される.
     1455上記のようなプロセッサでは,スタックの切換え前に,最大で割込み優先度の
     1456段数分の多重割込みが発生することを防ぐことはできず,各タスクのスタック
     1457領域を確保する際に,その分を見込んで確保しなければならない.各タスクの
     1458スタック領域をなるべく小さくするためには,スタックをなるべく使用しない
     1459内に,多重割込みを禁止するのが望ましい.そのため,スクラッチレジスタを
     1460スタックに保存する前に,割込みを禁止する.ただし,割込みの禁止処理に必
     1461要な最低限のレジスタについては,割込みの禁止に先立ってスタックに保存す
     1462る必要がある.
     1463
     1464同様のことは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル
     1465管理外の割込みについても,スタックをなるべく使用しない内に禁止するのが
     1466望ましい.このことから,カーネル管理外の割込みを使用する場合には,(*f)
     1467において,すべての割込みを禁止した状態にするのが望ましいことになる.ま
     1468た,カーネル管理外の割込み処理においても,非タスクコンテキスト用のスタッ
     1469クに切り換えることが望ましいが,これはカーネルの管轄外である.
     1470
     1471(*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状態にす
     1472る必要はない.例えば,CPUロック状態であることを示す変数を用意している場
     1473合には,(*d)の時点ではその変数をCPUロック状態を示す値に変更する必要はな
     1474く,(*e)において変更すればよい.
     1475
     1476割込みの出入口処理をアセンブリ言語で記述する場合には,トレースログ取得
     1477処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
     1478グすること.
     1479
     14806.6.2 割込みハンドラ毎の出入口処理の生成
     1481
     1482割込みベクトルをハードウェアで実現している場合など,割込みハンドラ毎に
     1483出入口処理を用意した方が効率が良いターゲットのために,割込みハンドラ毎
     1484に出入口処理を生成する機構を用意している.
     1485
     1486以下のマクロは,標準の割込み管理機能の初期化処理を用いた場合のみ,ター
     1487ゲット非依存部で使われる.割込み管理機能の初期化処理をターゲット依存部
     1488で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
     1489意する必要はない.
    15401490
    15411491(6-6-2-1) INT_ENTRY(inhno, inthdr)
    15421492
    1543 Š„ž‚݃nƒ“ƒhƒ‰”ԍ†‚ªinhnoCŠ„ž‚݃nƒ“ƒhƒ‰‚̊֐”–¼‚ªinthdr‚Å‚ ‚銄ž‚݃n
    1544 ƒ“ƒhƒ‰‚̏o“üŒûˆ—‚̃‰ƒxƒ‹‚ðì‚éƒ}ƒNƒDINTHDR_ENTRY‚ð—p‚¢‚ÄŠ„ž‚݃nƒ“
    1545 ƒhƒ‰–ˆ‚ɏo“üŒûˆ—‚𐶐¬‚·‚éê‡‚ɂ́CŽŸ‚̂悤‚É’è‹`‚·‚éD
     1493割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
     1494ンドラの出入口処理のラベルを作るマクロ.INTHDR_ENTRYを用いて割込みハン
     1495ドラ毎に出入口処理を生成する場合には,次のように定義する.
    15461496
    15471497#define INT_ENTRY(inhno, inthdr)        _kernel_##inthdr##_##inhno
    15481498
    1549 Š„ž‚݃nƒ“ƒhƒ‰–ˆ‚ɏo“üŒûˆ—‚ðì‚é•K—v‚ª‚È‚¢ê‡‚ɂ́CŽŸ‚̂悤‚É’è‹`‚µ
    1550 ‚āCŠ„ž‚݃nƒ“ƒhƒ‰‚̊֐”–¼‚ð‚»‚Ì‚Ü‚Ü•Ô‚·D
     1499割込みハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し
     1500て,割込みハンドラの関数名をそのまま返す.
    15511501
    15521502#define INT_ENTRY(inhno, inthdr)        inthdr
     
    15541504(6-6-2-2) INTHDR_ENTRY(inhno, inhno_num, inthdr)
    15551505
    1556 Š„ž‚݃nƒ“ƒhƒ‰”ԍ†‚ªinhnoCŠ„ž‚݃nƒ“ƒhƒ‰‚̊֐”–¼‚ªinthdr‚Å‚ ‚銄ž‚݃n
    1557 ƒ“ƒhƒ‰‚̏o“üŒûˆ—‚𐶐¬‚·‚éƒ}ƒNƒDinhno_num‚ɂ́CƒAƒZƒ“ƒuƒŠŒ¾Œê‹Lq—p
    1558 ‚ɁCŠ„ž‚݃nƒ“ƒhƒ‰”ԍ†‚ª”’l‚Å“n‚³‚ê‚éDŠ„ž‚݃nƒ“ƒhƒ‰–ˆ‚ɏo“üŒûˆ—‚ð
    1559 ì‚é•K—v‚ª‚È‚¢ê‡‚ɂ́C‹ó‚É’è‹`‚·‚éD
    1560 
    1561 6.6.3 Š„ž‚݃nƒ“ƒhƒ‰‚̐ݒè
    1562 
    1563 (6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)iƒIƒvƒVƒ‡ƒ“j
    1564 
    1565 inhno‚ªCDEF_INH‚ɑ΂·‚銄ž‚݃nƒ“ƒhƒ‰”ԍ†‚Æ‚µ‚Ä—LŒø‚È’l‚Å‚ ‚éê‡‚É
    1566 trueC‚»‚¤‚Å‚È‚¢ê‡‚Éfalse‚ð•Ô‚·ƒ}ƒNƒD
    1567 
    1568 SSPƒJ[ƒlƒ‹‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚ł́C‚±‚̃}ƒNƒ‚ÍŽg‚í‚ê‚Ä‚¢‚È‚¢‚½‚߁Cƒ^[
    1569 ƒQƒbƒgˆË‘¶•”‚ÅŽg‚í‚È‚¢‚È‚çC—pˆÓ‚·‚é•K—v‚ª‚È‚¢D
     1506割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
     1507ンドラの出入口処理を生成するマクロ.inhno_numには,アセンブリ言語記述用
     1508に,割込みハンドラ番号が数値で渡される.割込みハンドラ毎に出入口処理を
     1509作る必要がない場合には,空に定義する.
     1510
     15116.6.3 割込みハンドラの設定
     1512
     1513(6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション)
     1514
     1515inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に
     1516true,そうでない場合にfalseを返すマクロ.
     1517
     1518SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
     1519ゲット依存部で使わないなら,用意する必要がない.
    15701520
    15711521(6-6-3-2) void x_define_inh(INHNO inhno, FP int_entry)
    15721522
    1573 inhno‚ÅŽw’肳‚ꂽŠ„ž‚݃nƒ“ƒhƒ‰‚̏o“üŒûˆ—‚̔Ԓn‚ðint_entry‚ɐݒ肷‚éD
    1574 
    1575 ‚±‚̊֐”‚́C•W€‚ÌŠ„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ð—p‚¢‚½ê‡‚̂݁Cƒ^[ƒQƒb
    1576 ƒg”ñˆË‘¶•”‚©‚çŒÄ‚яo‚³‚ê‚éDŠ„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ðƒ^[ƒQƒbƒgˆË‘¶
    1577 •”‚Å—pˆÓ‚µC‚»‚Ì’†‚Å‚±‚̊֐”‚ðŒÄ‚яo‚³‚È‚¢ê‡‚ɂ́C‚±‚̊֐”‚ð—pˆÓ‚·‚é
    1578 •K—v‚Í‚È‚¢D
    1579 
    1580 ‚±‚̊֐”‚́Cƒ^[ƒQƒbƒg”ñˆË‘¶•”‚̃J[ƒlƒ‹‰Šú‰»ˆ—‚©‚çŒÄ‚яo‚³‚ê‚邽‚߁C
    1581 ƒJ[ƒlƒ‹‚̏‰Šú‰»ˆ—iNMI‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý‚ªƒ}ƒXƒN‚³‚ê‚Ä‚¢‚éj‚©‚çŒÄ
    1582 ‚яo‚¹‚é‚悤‚ÉŽÀ‘•‚·‚ê‚΂悢D
    1583 
    1584 Žw’肳‚ꂽŠ„ž‚݃nƒ“ƒhƒ‰”ԍ†‚ªDEF_INH‚ɑ΂·‚é‚à‚Ì‚Æ‚µ‚Ä—LŒø‚È’l‚Å‚È‚¢ê
    1585 ‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª‚È‚¢iassert‚ŃGƒ‰[‚Æ‚·‚é‚Ì‚ª–]‚Ü‚µ‚¢jD‚±‚ê
    1586 ‚́CƒRƒ“ƒtƒBƒMƒ
    1587 ƒŒ[ƒ^‚ªCƒpƒX2‚̃eƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”
    1588 ‚Å’è‹`‚·‚éINHNO_DEFINH_VALID‚ð—p‚¢‚ăGƒ‰[‚ðŒŸo‚·‚邽‚ß‚Å‚ ‚éD
    1589 
    1590 6.6.4 Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚̐ݒè
    1591 
    1592 (6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)iƒIƒvƒVƒ‡ƒ“j
    1593 
    1594 intno‚ªCCFG_INT‚ɑ΂·‚銄ž‚ݔԍ†‚Æ‚µ‚Ä—LŒø‚È’l‚Å‚ ‚éê‡‚ÉtrueC‚»‚¤
    1595 ‚Å‚È‚¢ê‡‚Éfalse‚ð•Ô‚·ƒ}ƒNƒDŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚ðÝ’è‚Å‚«‚È‚¢
    1596 intno‚ɑ΂µ‚ẮC‚±‚̃}ƒNƒ‚ªfalse‚ð•Ô‚·‚悤‚É‚·‚éD
    1597 
    1598 SSPƒJ[ƒlƒ‹‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚ł́C‚±‚̃}ƒNƒ‚ÍŽg‚í‚ê‚Ä‚¢‚È‚¢‚½‚߁Cƒ^[
    1599 ƒQƒbƒgˆË‘¶•”‚ÅŽg‚í‚È‚¢‚È‚çC—pˆÓ‚·‚é•K—v‚ª‚È‚¢D
     1523inhnoで指定された割込みハンドラの出入口処理の番地をint_entryに設定する.
     1524
     1525この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
     1526ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
     1527部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
     1528必要はない.
     1529
     1530この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
     1531カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
     1532び出せるように実装すればよい.
     1533
     1534指定された割込みハンドラ番号がDEF_INHに対するものとして有効な値でない場
     1535合の動作は保証する必要がない(assertでエラーとするのが望ましい).これ
     1536は,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存部
     1537で定義するINHNO_DEFINH_VALIDを用いてエラーを検出するためである.
     1538
     15396.6.4 割込み要求ラインの属性の設定
     1540
     1541(6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション)
     1542
     1543intnoが,CFG_INTに対する割込み番号として有効な値である場合にtrue,そう
     1544でない場合にfalseを返すマクロ.割込み要求ラインの属性を設定できない
     1545intnoに対しては,このマクロがfalseを返すようにする.
     1546
     1547SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
     1548ゲット依存部で使わないなら,用意する必要がない.
    16001549
    16011550(6-6-4-2) void x_config_int(INTNO intno, ATR intatr, PRI intpri)
    16021551
    1603 intno‚ÅŽw’肳‚ꂽŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ÌŠ„ž‚Ý‘®«‚ðCintatr‚ÅŽw’肳‚ꂽ’Ê‚è
    1604 ‚ɐݒ肷‚éD‚Ü‚½CŠ„ž‚Ý—Dæ“x‚ðCintpri‚ÅŽw’肳‚ꂽ’l‚ɐݒ肷‚éD
    1605 
    1606 ‚±‚̊֐”‚́C•W€‚ÌŠ„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ð—p‚¢‚½ê‡‚̂݁Cƒ^[ƒQƒb
    1607 ƒg”ñˆË‘¶•”‚©‚çŒÄ‚яo‚³‚ê‚éDŠ„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ðƒ^[ƒQƒbƒgˆË‘¶
    1608 •”‚Å—pˆÓ‚µC‚»‚Ì’†‚Å‚±‚̊֐”‚ðŒÄ‚яo‚³‚È‚¢ê‡‚ɂ́C‚±‚̊֐”‚ð—pˆÓ‚·‚é
    1609 •K—v‚Í‚È‚¢D
    1610 
    1611 ‚±‚̊֐”‚́Cƒ^[ƒQƒbƒg”ñˆË‘¶•”‚̃J[ƒlƒ‹‰Šú‰»ˆ—‚©‚çŒÄ‚яo‚³‚ê‚邽‚߁C
    1612 ƒJ[ƒlƒ‹‚̏‰Šú‰»ˆ—iNMI‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý‚ªƒ}ƒXƒN‚³‚ê‚Ä‚¢‚éj‚©‚çŒÄ
    1613 ‚яo‚¹‚é‚悤‚ÉŽÀ‘•‚·‚ê‚΂悢D
    1614 
    1615 intatr‚Æ‚µ‚Đݒè‚Å‚«‚銄ž‚Ý‘®«‚ÍŽŸ‚Ì’Ê‚èD
    1616 
    1617         TA_ENAINT               0x01    Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚ðƒNƒŠƒA
    1618         TA_EDGE                 0x02    ƒGƒbƒWƒgƒŠƒK
    1619 
    1620 ‚±‚Ì‘¼‚ɁCƒ^[ƒQƒbƒg’è‹`‚ÅŠ„ž‚Ý‘®«‚ð’ljÁ‚µ‚Ä‚à‚æ‚¢Dƒ^[ƒQƒbƒg’è‹`‚Å
    1621 ’ljÁ‚·‚邽‚߂ɁCˆÈ‰º‚Ì‘®«–¼‚ª—\–ñ‚³‚ê‚Ä‚¢‚éD
    1622 
    1623         TA_POSEDGE                              ƒ|ƒWƒeƒBƒuƒGƒbƒWƒgƒŠƒK
    1624         TA_NEGEDGE                              ƒlƒKƒeƒBƒuƒGƒbƒWƒgƒŠƒK
    1625         TA_BOTHEDGE                             —¼ƒGƒbƒWƒgƒŠƒK
    1626         TA_LOWLEVEL                             ƒ[ƒŒƒxƒ‹ƒgƒŠƒK
    1627         TA_HIGHLEVEL                    ƒnƒCƒŒƒxƒ‹ƒgƒŠƒK
    1628 
    1629 ‚±‚ê‚ç‚Ì‘®«–¼‚ðƒ^[ƒQƒbƒg’è‹`‚ŒljÁ‚·‚éê‡‚ɂ́C‚»‚Ì‘®«’l‚ðŒˆ’è‚µC
    1630 ’è‹`‚ðtarget_kernel.hi‚Ü‚½‚́C‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹j‚ÉŠÜ
    1631 ‚ß‚éD‚Ü‚½CƒRƒ“ƒtƒBƒMƒ
    1632 ƒŒ[ƒ^ƒeƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚©‚çŽQÆ‚Å‚«‚é‚悤‚ɁC
    1633 target_def.csvi‚Ü‚½‚́C‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹j‚Ɋ܂߁CƒR
    1634 ƒ“ƒtƒBƒMƒ
    1635 ƒŒ[ƒ^ƒeƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚ŃGƒ‰[‚Æ‚È‚ç
    1636 ‚È‚¢‚悤‚ɁCtarget.tfi‚Ü‚½‚́C‚»‚±‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹j‚Å
    1637 TARGET_INTATR‚ɐݒ肷‚éD
    1638 
    1639 Žw’肳‚ꂽŠ„ž‚ݔԍ†‚ªCFG_INT‚ɑ΂·‚é‚à‚Ì‚Æ‚µ‚Ä—LŒø‚È’l‚Å‚È‚¢ê‡‚âC‚»
    1640 ‚ÌŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚Đݒè‚Å‚«‚È‚¢‘®«‚ðŽw’肵‚½ê‡CÝ’è‚Å‚«‚È‚¢
    1641 Š„ž‚Ý—Dæ“x‚ðŽw’肵‚½ê‡‚Ì“®ì‚͕ۏ؂·‚é•K—v‚ª‚È‚¢iassert‚ŃGƒ‰[‚Æ
    1642 ‚·‚é‚Ì‚ª–]‚Ü‚µ‚¢jD‚±‚̂悤‚ȃP[ƒX‚́CƒRƒ“ƒtƒBƒMƒ
    1643 ƒŒ[ƒ^‚ŃGƒ‰[‚ðŒŸ
    1644 o‚·‚ׂ«‚Å‚ ‚éDƒRƒ“ƒtƒBƒMƒ
    1645 ƒŒ[ƒ^ƒeƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒg”ñˆË
    1646 ‘¶•”‚́CƒpƒX2‚̃eƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”‚Å’è‹`‚·‚é
    1647 INTNO_CFGINT_VALIDCTARGET_INTATRCINTPRI_CFGINT_VALID‚ð—p‚¢‚ăGƒ‰[‚ð
    1648 ŒŸo‚·‚邪C•W€‚ÌŠ„ž‚Ý‘®«iTA_ENAINTCTA_EDGEj‚ªÝ’è‚Å‚«‚È‚¢ê‡‚âC
    1649 Ý’è‚Å‚«‚È‚¢‘®«‚⊄ž‚Ý—Dæ“x‚ªŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚É‚æ‚Á‚ĈقȂéê‡‚ɂ́C
    1650 ƒRƒ“ƒtƒBƒMƒ
    1651 ƒŒ[ƒ^ƒeƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶•”‚ÅŒŸo‚µ‚È‚¯‚ê
    1652 ‚΂Ȃç‚È‚¢D
    1653 
    1654 6.6.5 Š„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚̕ύX
    1655 
    1656 (6-6-5-1) OMIT_INITIALIZE_INTERRUPTiƒIƒvƒVƒ‡ƒ“j
    1657 
    1658 Š„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ðƒ^[ƒQƒbƒgˆË‘¶•”‚Å—pˆÓ‚µCƒ^[ƒQƒbƒg”ñˆË‘¶
    1659 •”‚ÉŠÜ‚Ü‚ê‚é•W€‚ÌŠ„ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ð—p‚¢‚È‚¢ê‡‚ɂ́C‚±‚̃V
    1660 ƒ“ƒ{ƒ‹‚ðƒ}ƒNƒ’è‹`‚·‚éD
    1661 
    1662 ‚±‚̃Vƒ“ƒ{ƒ‹‚ðƒ}ƒNƒ’è‹`‚·‚é‚ƁCINHINIBCINTINIBCinitialize_interrupt
    1663 ‚Ì’è‹`‚ªCƒJ[ƒlƒ‹‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚©‚çŽæ‚菜‚©‚ê‚éD‚Ü‚½C
    1664 TNUM_INHNOCtnum_inhnoCinhinib_tableCTNUM_INTNOCtnum_intnoC
    1665 intinib_table‚Ì’è‹`‚ƁCŠ„ž‚݃nƒ“ƒhƒ‰–ˆ‚̏o“üŒûˆ—‚𐶐¬‚·‚邽‚ß‚Ì‹Lq
    1666 iINTHDR_ENTRYƒ}ƒNƒ‚̃ŠƒXƒgj‚ªCƒRƒ“ƒtƒBƒMƒ
    1667 ƒŒ[ƒ^‚̃pƒX2‚̃eƒ“ƒvƒŒ[
    1668 ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒg”ñˆË‘¶•”‚É‚æ‚Á‚Äkernel_cfg.c‚ɐ¶¬‚³‚ê‚È‚­‚È‚éD
    1669 ‚½‚¾‚µCƒRƒ“ƒtƒBƒMƒ
    1670 ƒŒ[ƒ^‚̃pƒX2‚̃eƒ“ƒvƒŒ[ƒgƒtƒ@ƒCƒ‹‚̃^[ƒQƒbƒgˆË‘¶
    1671 •”‚ŁCUSE_INHINIB_TABLE‚ÆUSE_INTINIB_TABLE‚ðÝ’è‚·‚邱‚ƂŁC‚»‚̈ꕔ
    1672 •ª‚ðkernel_cfg.c‚ɐ¶¬‚·‚邱‚Æ‚ª‰Â”\‚Å‚ ‚éD
    1673 
    1674 (6-6-5-2) void initialize_interrupt(void)iƒIƒvƒVƒ‡ƒ“j
    1675 
    1676 OMIT_INITIALIZE_INTERRUPT‚ðƒ}ƒNƒ’è‹`‚µ‚½ê‡‚ɂ́C‚±‚̊֐”‚ðƒ^[ƒQƒbƒg
    1677 ˆË‘¶•”‚Å—pˆÓ‚·‚éDOMIT_INITIALIZE_INTERRUPT‚ðƒ}ƒNƒ’è‹`‚·‚邱‚Æ‚É‚æ‚èŽæ
    1678 ‚菜‚©‚ê‚é‚»‚Ì‘¼‚̃f[ƒ^Œ^C•Ï”Cƒ}ƒNƒ‚́C‚±‚̊֐”‚ÅŽg—p‚·‚éê‡‚É‚Ì
    1679 ‚Ý—pˆÓ‚·‚ê‚΂悢D
    1680 
    1681 6.6.6 ƒfƒtƒHƒ‹ƒg‚ÌŠ„ž‚݃nƒ“ƒhƒ‰
    1682 
    1683 (6-6-6-1) default_int_handler(void)iƒIƒvƒVƒ‡ƒ“j
    1684 
    1685 ƒRƒ“ƒtƒBƒMƒ
    1686 ƒŒ[ƒ^‚É‚æ‚芄ž‚݃nƒ“ƒhƒ‰‚̃e[ƒuƒ‹‚𐶐¬‚·‚éê‡‚Ȃǂɂ́C
    1687 Š„ž‚݃nƒ“ƒhƒ‰‚ð“o˜^‚µ‚È‚©‚Á‚½Š„ž‚݃nƒ“ƒhƒ‰”ԍ†‚ɑ΂µ‚āCƒfƒtƒHƒ‹ƒg‚Ì
    1688 Š„ž‚݃nƒ“ƒhƒ‰‚Æ‚µ‚āCdefault_int_handler‚ð“o˜^‚·‚éD
    1689 
    1690 default_int_handler‚́C•W€‚Ì‚à‚Ì‚ðƒ^[ƒQƒbƒgˆË‘¶•”‚Å—pˆÓ‚·‚邪Cƒ†[ƒU
    1691 ‚ª—pˆÓ‚µ‚½‚à‚Ì‚Å’u‚«Š·‚¦‚ç‚ê‚é‚悤‚ɁCOMIT_DEFAULT_INT_HANDLER‚ðƒ}ƒNƒ
    1692 ’è‹`‚µ‚½ê‡‚ɂ́Cƒ^[ƒQƒbƒgˆË‘¶•”‚Å’è‹`‚µ‚È‚¢‚悤‚É‚·‚éD‚È‚¨Cƒ†[ƒU
    1693 ‚ª—pˆÓ‚·‚éê‡‚Ì–¼Ì‚́C_kernel_default_int_handler‚Æ‚È‚éD
    1694 
    1695 6.6.7 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý
    1696 
    1697 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݃nƒ“ƒhƒ‰‚́CƒJ[ƒlƒ‹“à‚ÌŠ„ž‚ݏo“üŒûˆ—‚ðŒo—R‚¹
    1698 ‚¸‚ÉŽÀs‚·‚é‚Ì‚ªŠî–{‚Å‚ ‚éD
    1699 
    1700 ‚½‚¾‚µC‚·‚ׂĂ̊„ž‚Ý‚Å“¯‚¶ƒAƒhƒŒƒX‚É•ªŠò‚·‚éƒvƒƒZƒbƒT‚ł́CƒJ[ƒlƒ‹
    1701 “à‚ÌŠ„ž‚ݏo“üŒûˆ—‚ð‘S‚­Œo—R‚¹‚¸‚ɃJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݃nƒ“ƒhƒ‰‚ðŽÀ
    1702 s‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢‚½‚߁CŠ„ž‚ݏo“üŒûˆ—‚Ì‚È‚é‚ׂ­‘‚¢ƒ^ƒCƒ~ƒ“ƒO‚ŁC
    1703 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚Å‚ ‚é‚©‚ð”»•Ê‚µCˆ—“à—e‚𕪂¯‚é•K—v‚ª‚ ‚éD‹ï
    1704 ‘Ì“I‚ɂ́CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂̏o“üŒûˆ—‚ł́CƒI[ƒoƒ‰ƒ“ƒnƒ“ƒhƒ‰‚Ì
    1705 ’âŽ~‚Æ“®ìŠJŽn‚ðs‚Á‚Ä‚Í‚È‚ç‚È‚¢D‚Ü‚½Creqflg‚ðƒ`ƒFƒbƒN‚µCƒ^ƒXƒNØŠ·
    1706 ‚¦‚âƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚̌ďo‚µ‚ðs‚¤•K—v‚ª‚È‚¢D‚³‚ç‚ɁCNMI‚̏o“üŒû
    1707 ˆ—‚ł́CƒgƒŒ[ƒXƒƒOŽæ“¾ˆ—ilog_inh_enter‚¨‚æ‚Ñlog_inh_leavej‚ðŒÄ
    1708 ‚яo‚µ‚Ä‚Í‚È‚ç‚È‚¢D
    1709 
    1710 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݃nƒ“ƒhƒ‰‚ðŽÀs‚·‚éÛ‚ɁCƒJ[ƒlƒ‹“à‚ÌŠ„ž‚ݏo“üŒû
    1711 ˆ—‚̈ꕔ•ª‚ðŒo—R‚·‚éê‡‚ɂ́CCPU—áŠO‚ª‹N‚±‚é‰Â”\«‚ð‹É—ÍŒ¸‚ç‚·‚Æ‚Æ‚à
    1712 ‚ɁCCPU—áŠO‚ð‹N‚±‚·‰Â”\«‚ª‚ ‚éê‡‚ɂ́C‚»‚̉”\«‚ðƒ^[ƒQƒbƒgˆË‘¶•”‚Ì
    1713 ƒ†[ƒU[ƒYƒ}ƒjƒ
    1714 ƒAƒ‹‚É‹LÚ‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢D
    1715 
    1716 ŽŸ‚ɁCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂̐ݒè•û–@‚ÉŠÖ‚µ‚āCuTOPPERSV¢‘ãƒJ[ƒlƒ‹
    1717 “‡Žd—l‘v‚́u6.6.8 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂̐ݒè•û–@v‚̐߂Ì3‚‚̕û–@
    1718 ‚Ì‚¢‚¸‚ê‚ðÌ—p‚·‚é‚©‚ðŒˆ’è‚·‚éD
    1719 
    1720 (a-1)‚Ü‚½‚Í(a-2)‚ðÌ—p‚µCƒJ[ƒlƒ‹ŠÇ—ŠO‚Æ‚µ‚½Š„ž‚݂ɑ΂µ‚āCƒJ[ƒlƒ‹
    1721 ‚ÌAPI‚É‚æ‚銄ž‚݃nƒ“ƒhƒ‰‚Ì“o˜^‚ÆŠ„ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚̐ݒè‚ðƒTƒ|[ƒg
    1722 ‚µ‚È‚¢ê‡‚ɂ́C‚»‚ê‚É‘ã‚í‚é•û–@‚ðƒ^[ƒQƒbƒgˆË‘¶•”‚̃†[ƒU[ƒYƒ}ƒjƒ
    1723 ƒA
    1724 ƒ‹‚É‹Lq‚·‚éD
    1725 
    1726 (a-1)‚Ü‚½‚Í(a-2)‚ðÌ—p‚µ‚ăJ[ƒlƒ‹‚ÌAPI‚É‚æ‚銄ž‚݃nƒ“ƒhƒ‰‚Ì“o˜^‚⊄ž
    1727 ‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚̐ݒè‚ðƒTƒ|[ƒg‚·‚éê‡‚âC(b)‚ðÌ—p‚µ‚½ê‡‚ɂ́Cƒ^[
    1728 ƒQƒbƒgˆË‘¶•”‚É‚¨‚¢‚Ä‚»‚ê‚ðŽÀŒ»‚·‚é•K—v‚ª‚ ‚éD
    1729 
    1730 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂ɑ΂µ‚āCDEF_INH‚É‚æ‚銄ž‚݃nƒ“ƒhƒ‰‚Ì“o˜^‚ðƒTƒ|[
    1731 ƒg‚·‚é‚ɂ́CŽŸ‚̐ݒ肪•K—v‚É‚È‚éD
    1732 
    1733 ETARGET_INHATR‚ɁCTA_NONKERNEL‚ðÝ’è‚·‚éD
    1734 
    1735 E(a-1)‚Ü‚½‚Í(a-2)‚ðÌ—p‚µ‚½ê‡‚ɂ́CINHNO_DEFINH_VALID‚ɁCƒJ[ƒlƒ‹ŠÇ
    1736 @—ŠO‚Æ‚µ‚½Š„ž‚݂ɑΉž‚·‚銄ž‚݃nƒ“ƒhƒ‰”ԍ†‚ðŠÜ‚ß‚éD‚Ü‚½C
    1737 @VALID_INHNO_DEFINH‚ðCƒJ[ƒlƒ‹ŠÇ—ŠO‚Æ‚µ‚½Š„ž‚݃nƒ“ƒhƒ‰”ԍ†‚ð—LŒø‚È
    1738 @’l‚Æ”»’è‚·‚é‚悤‚É‚·‚éD
    1739 
    1740 E(a-1)‚Ü‚½‚Í(a-2)‚ðÌ—p‚µ‚½ê‡‚ɂ́CINHNO_FIX_KERNEL‚ɃJ[ƒlƒ‹ŠÇ—‚Æ
    1741 @‚µ‚½Š„ž‚݃nƒ“ƒhƒ‰”ԍ†‚̃ŠƒXƒg‚ðCINHNO_FIX_NONKERNEL‚ɃJ[ƒlƒ‹ŠÇ—ŠO
    1742 @‚Æ‚µ‚½Š„ž‚݃nƒ“ƒhƒ‰”ԍ†‚̃ŠƒXƒgÝ’è‚·‚éD
    1743 
    1744 EDEF_INH‚ªƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂ɑΉž‚Å‚«‚é‚悤‚É‚·‚éD•W€‚ÌŠ„ž‚ÝŠÇ
    1745 @—‹@”\‚̏‰Šú‰»ˆ—‚ð—p‚¢‚éê‡‚ɂ́Cx_define_inh‚ðƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„
    1746 @ž‚݂ɑΉž‚³‚¹‚éD
    1747 
    1748 E•K—v‚ȏꍇ‚ɂ́CTA_NONKERNEL‘®«‚ªÝ’肳‚ꂽŠ„ž‚݃nƒ“ƒhƒ‰‚ðƒJ[ƒlƒ‹
    1749 @ŠÇ—ŠO‚ƈµ‚¤‚悤‚ɁCƒJ[ƒlƒ‹“à‚ÌŠ„ž‚ݏo“üŒûˆ—‚ðC³‚·‚éD•W€‚ÌŠ„
    1750 @ž‚ÝŠÇ—‹@”\‚̏‰Šú‰»ˆ—‚ð—p‚¢‚éê‡CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂ɑ΂µ‚Ä
    1751 @‚́CƒJ[ƒlƒ‹“à‚ÌŠ„ž‚ݏo“üŒûˆ—‚𐶐¬‚¹‚¸CƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ª“o˜^‚µ
    1752 @‚½Š„ž‚݃nƒ“ƒhƒ‰‚𒼐ڌĂяo‚·‚悤‚ɁCƒ^[ƒQƒbƒg”ñˆË‘¶•”‚É‚æ‚èÝ’肳
    1753 @‚ê‚邽‚߁Cƒ^[ƒQƒbƒgˆË‘¶•”‚ł͑Ήž‚·‚é•K—v‚ª‚È‚¢D
    1754 
    1755 ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂ɑ΂µ‚āCCFG_INT‚É‚æ‚銄ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚̐Ý
    1756 ’è‚ðƒTƒ|[ƒg‚·‚é‚ɂ́CŽŸ‚̐ݒ肪•K—v‚É‚È‚éD
    1757 
    1758 E(a-1)‚Ü‚½‚Í(a-2)‚ðÌ—p‚µ‚½ê‡‚ɂ́CINTNO_CFGINT_VALID‚ɁCƒJ[ƒlƒ‹ŠÇ
    1759 @—ŠO‚Æ‚µ‚½Š„ž‚݂ɑΉž‚·‚銄ž‚ݔԍ†‚ðŠÜ‚ß‚éD‚Ü‚½CVALID_INTNO_CFGINT
    1760 @‚ðCƒJ[ƒlƒ‹ŠÇ—ŠO‚Æ‚µ‚½Š„ž‚ݔԍ†‚ð—LŒø‚È’l‚Æ”»’è‚·‚é‚悤‚É‚·‚éD
    1761 
    1762 E(a-1)‚Ü‚½‚Í(a-2)‚ðÌ—p‚µ‚½ê‡‚ɂ́CINTNO_FIX_KERNEL‚ɃJ[ƒlƒ‹ŠÇ—‚Æ
    1763 @‚µ‚½Š„ž‚ݔԍ†‚̃ŠƒXƒg‚ðCINTNO_FIX_NONKERNEL‚ɃJ[ƒlƒ‹ŠÇ—ŠO‚Æ‚µ‚½Š„
    1764 @ž‚ݔԍ†‚̃ŠƒXƒgÝ’è‚·‚éD
    1765 
    1766 EINTPRI_CFGINT_VALID‚ɁCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚Æ‚È‚é—Dæ“x‚ðŠÜ‚ß‚éD
    1767 
    1768 ECFG_INT‚ªƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂ɑΉž‚Å‚«‚é‚悤‚É‚·‚éD•W€‚ÌŠ„ž‚ÝŠÇ
    1769 @—‹@”\‚̏‰Šú‰»ˆ—‚ð—p‚¢‚éê‡‚ɂ́Cx_config_int‚ðƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„
    1770 @ž‚݂ɑΉž‚³‚¹‚éD
    1771 
    1772 chg_ipm‚É‚æ‚èCiNMIˆÈŠO‚́jƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ðƒ}ƒXƒN‚Å‚«‚é‚悤‚É
    1773 ‚·‚éê‡‚ɂ́CŽŸ‚̐ݒ肪•K—v‚É‚È‚éD
    1774 
    1775 EVALID_INTPRI_CHGIPM‚ðCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚Æ‚È‚é—Dæ“x‚ð—LŒø‚È’l‚Æ
    1776 @”»’è‚·‚é‚悤‚É‚·‚éD
    1777 
    1778 Et_set_ipm‚ðCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚Æ‚È‚é—Dæ“x‚ðˆµ‚¦‚é‚悤‚É‚·‚éD
    1779 
    1780 6.7 CPU—áŠOƒnƒ“ƒhƒ‰‚ÆCPU—áŠO”­¶Žž‚̃VƒXƒeƒ€ó‘Ô‚ÌŽQÆ
    1781 
    1782 6.7.1 CPU—áŠOƒnƒ“ƒhƒ‰‚̏o“üŒûˆ—
    1783 <