Ignore:
Timestamp:
Jul 23, 2017, 2:29:40 PM (7 years ago)
Author:
coas-nagasima
Message:

SVNプロパティを設定

Location:
rubycfg_asp/trunk/asp_dcre/doc
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • rubycfg_asp/trunk/asp_dcre/doc/asp_spec.txt

    • Property svn:mime-type changed from text/plain to text/plane; charset=UTF-8
    r313 r315  
    11
    2                 TOPPERS/ASPカーネルの仕様概要
    3 
    4                 対応バージョン: Release 1.9
    5                 最終更新: 2017å¹´1月29日
    6 
    7 ã“のドキュメントは,TOPPERS/ASPカーネルの仕様概要について説明したもので
    8 ã‚る.μITRON4.0仕様のスタンダードプロファイルに対する拡張および変更箇
    9 æ‰€ã‚’中心に説明する.
     2                TOPPERS/ASPカーネルの仕様概要
     3
     4                対応バージョン: Release 1.9
     5                最終更新: 2017年1月29日
     6
     7このドキュメントは,TOPPERS/ASPカーネルの仕様概要について説明したもので
     8ある.μITRON4.0仕様のスタンダードプロファイルに対する拡張および変更箇
     9所を中心に説明する.
    1010
    1111----------------------------------------------------------------------
     
    1717             Graduate School of Information Science, Nagoya Univ., JAPAN
    1818 
    19  ä¸Šè¨˜è‘—作権è€
    20 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    21  ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    22  å¤‰ãƒ»å†é
    23 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    24  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    25      æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    26      ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    27  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    28      ç”¨ã§ãã‚‹å½¢ã§å†é
    29 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    30 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    31      è€
    32 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    33      ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    34  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    35      ç”¨ã§ããªã„形で再é
    36 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    37      ã¨ï¼Ž
    38    (a) 再é
    39 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    40 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    41        ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    42    (b) 再é
    43 å¸ƒã®å½¢æ
    44 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    45        å ±å‘Šã™ã‚‹ã“と.
    46  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    47      å®³ã‹ã‚‰ã‚‚,上記著作権è€
    48 ãŠã‚ˆã³TOPPERSプロジェクトをå
    49 è²¬ã™ã‚‹ã“と.
    50      ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    51      ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    52 ãŠã‚ˆã³TOPPERSプロジェクトを
    53      å
    54 è²¬ã™ã‚‹ã“と.
     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     免責すること.
    5541 
    56  æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    57 ãŠ
    58  ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    59  ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    60  ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    61  ã®è²¬ä»»ã‚’負わない.
     42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     46 の責任を負わない.
    6247 
    6348 $Id$
    6449----------------------------------------------------------------------
    6550
    66 â—‹å‰æã¨ãªã‚‹æ–‡æ›¸
    67 
    68 [1] トロン協会: μITRON4.0仕様, Ver.4.02.00, 2004å¹´.
    69 
    70 [2] トロン協会: μITRON4.0仕様 保護機能拡張(μITRON4.0/PX仕様),
    71         Ver.1.00.00, 2002å¹´.
    72 
    73 [3] TOPPERSプロジェクト: TOPPERS/JSPカーネル ユーザズマニュアル
    74         Release 1.4.3対応, 最終更新: 2007å¹´4月23日.
    75 
    76 â—‹ä»•æ§˜ã®æ¦‚ç•¥
    77 
    78 TOPPERS/ASPカーネルの仕様は,μITRON4.0仕様のスタンダードプロファイルを
    79 ãƒ™ãƒ¼ã‚¹ã«ï¼Œæ¬¡ã®ã‚ˆã†ãªæ‹¡å¼µãƒ»æ”¹è‰¯ã‚’加えたものである.
    80 
    81 ãƒ»å‰²è¾¼ã¿å‡¦ç†æ©Ÿèƒ½ã«ã¤ã„ては,TOPPERS標準割込み処理モデルに準拠させる.
    82 ãƒ»Î¼ITRON4.0仕様のスタンダードプロファイル外の機能の一部を導å
    83 ¥ã™ã‚‹ï¼Ž
    84 ãƒ»ä¸€éƒ¨ã®ä»•æ§˜ã«ã¤ã„て,μITRON4.0仕様に対して変更を加える.
    85 ãƒ»JSPカーネルにおける独自の拡張機能を一部変更して実è£
    86 ã™ã‚‹ï¼Ž
    87 ãƒ»ASPカーネルにおける独自の拡張機能を新たに実è£
    88 ã™ã‚‹ï¼Ž
    89 ãƒ»ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³å‡¦ç†ã‚’å
    90 ¨é¢çš„に見直す.
    91 ãƒ»æ‹¡å¼µæ©Ÿèƒ½ã‚’実è£
    92 ã™ã‚‹ãŸã‚ã®æ‹¡å¼µãƒ‘ッケージをサポートする.
    93 ãƒ»TOPPERS組込みコンポーネントシステム(TECS)を導å
    94 ¥ã™ã‚‹ï¼Ž
    95 
    96 ãã®ãŸã‚ASPカーネルは,μITRON4.0仕様に完å
    97 ¨ã«æº–拠しているわけではなく,
    98 JSPカーネルの上位互換にもなっていない.
    99 
    100 Î¼ITRON4.0仕様では,実è£
    101 ç‹¬è‡ªã«ç”¨æ„ã™ã‚‹é™çš„APIおよびサービスコールの名称
    102 ã«ã¯ï¼Œå
    103 ˆé ­ã«ãã‚Œãžã‚Œ"V"および"v"の文字を付加するものとしているが,ASPカー
    104 ãƒãƒ«ã§ã¯ã“の規定は採用しない.
    105 
    106 ä»¥ä¸‹ã§ã¯ï¼ŒÎ¼ITRON4.0仕様のスタンダードプロファイルに対する拡張および変
    107 æ›´ç®‡æ‰€ã«ã¤ã„て説明する.
    108 
    109 â—‹ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ãƒ—ロファイル外の機能の一部導å
    110 ¥
    111 
    112 Î¼ITRON4.0仕様には規定されているが,スタンダードプロファイルに含まれな
    113 ã„(または,含まれるとは限らない)機能として,次の機能を実è£
    114 ã™ã‚‹ï¼Ž
    115 
    116 (1) イベントフラグの複数タスクå¾
    117 ã¡
    118 
    119 ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°ã«å¯¾ã™ã‚‹è¤‡æ•°ã‚¿ã‚¹ã‚¯å¾
    120 ã¡ã®æ©Ÿèƒ½ï¼ˆTA_WMUL属性のイベントフラグ)
    121 ã‚’実è£
    122 ã™ã‚‹ï¼Ž
    123 
    124 ã“れにより,イベントフラグのセット(set_flg,iset_flg)で複数のタスクが
    125 èµ·åºŠã•ã‚Œã‚‹å¯èƒ½æ€§ãŒç”Ÿã˜ã‚‹ï¼Žå¤šãã®ã‚¿ã‚¹ã‚¯ã‚’同時にå¾
    126 ã¡è§£é™¤ã—た場合,カーネ
    127 ãƒ«å†
    128 ã§ã®å‰²è¾¼ã¿ç¦æ­¢æ™‚間が長くなるため,使用にあたっては注意がå¿
    129 è¦ã§ã‚る.
    130 
    131 (2) アラームハンドラ
    132 
    133 ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©ã®æ©Ÿèƒ½ã‚’実è£
    134 ã™ã‚‹ï¼Žã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½ã®ãŸã‚ã«å®Ÿè£
    135 ã™ã‚‹
    136 é™çš„APIおよびサービスコールは次の通りである.
    137 
    138         CRE_ALM         ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©ã®ç”Ÿæˆï¼ˆé™çš„API)
    139         sta_alm         ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©ã®å‹•ä½œé–‹å§‹
    140         ista_alm        アラームハンドラの動作開始(非タスクコンテキスト用)
    141         stp_alm         ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©ã®å‹•ä½œåœæ­¢
    142         istp_alm        アラームハンドラの動作停止(非タスクコンテキスト用)
    143 
    144 (3) 割込みサービスルーチン
    145 
    146 ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ãƒ—ロファイルでは,割込みハンドラと割込みサービスルーチンの
    147 ã„ずれかをサポートすればよいことになっている.JSPカーネルでは割込みハン
    148 ãƒ‰ãƒ©ã®ã¿ã‚’実è£
    149 ã—ているが,ASPカーネルではその両è€
    150 ã‚’実è£
    151 ã™ã‚‹ï¼Ž
    152 
    153 å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンの仕様については,TOPPERS標準割込み処理モデルの規
    154 å®šã«æº–拠する.割込みサービスルーチンを追加するサービスコールとして,次
    155 ã®é™çš„APIを実è£
    156 ã™ã‚‹ï¼Žã“の静的APIの仕様については,TOPPERS標準割込み処理
    157 ãƒ¢ãƒ‡ãƒ«ã«ãŠã„て,μITRON4.0仕様に対して拡張を加えている.
    158 
    159         ATT_ISR         å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンの追加(静的API)
    160 
    161 (4) 割込み管理機能
    162 
    163 ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ãƒ—ロファイルに含まれない割込み管理機能として,次のサービス
    164 ã‚³ãƒ¼ãƒ«ã‚’実è£
    165 ã™ã‚‹ï¼ŽJSPカーネルでは,これらのサービスコールを実è£
    166 ã™ã‚‹ã‹ã©
    167 ã†ã‹ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã¨ãªã£ã¦ã„るが,ASPカーネルでは,TOPPERS標準割込み
    168 å‡¦ç†ãƒ¢ãƒ‡ãƒ«ã®è¦å®šã«æº–拠して,ターゲット非依存に実è£
    169 ã™ã‚‹ï¼Ž
    170 
    171         dis_int         å‰²è¾¼ã¿ã®ç¦æ­¢
    172         ena_int         å‰²è¾¼ã¿ã®è¨±å¯
    173         chg_ipm         å‰²è¾¼ã¿å„ªå
    174 ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´
    175         get_ipm         å‰²è¾¼ã¿å„ªå
    176 ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç
    177 §
    178 
    179 (5) オブジェクトの状æ
    180 ‹å‚ç
    181 §æ©Ÿèƒ½
    182 
    183 ä¸»ã«ãƒ‡ãƒãƒƒã‚°æ™‚向けの機能として,オブジェクトの状æ
    184 ‹å‚ç
    185 §æ©Ÿèƒ½ã‚’実è£
    186 ã™ã‚‹ï¼Ž
    187 å
    188 ·ä½“的には,次のサービスコールを実è£
    189 ã™ã‚‹ï¼Ž
    190 
    191         ref_tsk         ã‚¿ã‚¹ã‚¯ã®çŠ¶æ
    192 ‹å‚ç
    193 §
    194         ref_tex         ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理の状æ
    195 ‹å‚ç
    196 §
    197         ref_sem         ã‚»ãƒžãƒ•ã‚©ã®çŠ¶æ
    198 ‹å‚ç
    199 §
    200         ref_flg         ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°ã®çŠ¶æ
    201 ‹å‚ç
    202 §
    203         ref_dtq         ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ
    204 ‹å‚ç
    205 §
    206         ref_mbx         ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã®çŠ¶æ
    207 ‹å‚ç
    208 §
    209         ref_mpf         å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ールの状æ
    210 ‹å‚ç
    211 §
    212         ref_cyc         å‘¨æœŸãƒãƒ³ãƒ‰ãƒ©ã®çŠ¶æ
    213 ‹å‚ç
    214 §
    215         ref_alm         ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©ã®çŠ¶æ
    216 ‹å‚ç
    217 §
    218 
    219 â—‹Î¼ITRON4.0仕様に対する変更
    220 
    221 (1) ITRON標準データ型の見直し
    222 
    223 ã‚µã‚¤ã‚ºã®æ±ºã¾ã£ãŸæ•´æ•°åž‹ï¼ˆB,H, Wなど)などについて,C99に準拠した型の名
    224 ç§°ï¼ˆint8_t,int16_t,int32_tなど)やそれと相性が良い名称に変更する.
    225 ITRON標準データ型(B,H, Wなど)をå¿
    226 è¦ã¨ã™ã‚‹ã‚¢ãƒ—リケーションのために,
    227 itron.hを用意する.
    228 
    229 (2) 非タスクコンテキストからのext_tsk
    230 
    231 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‹ã‚‰ext_tskが呼ばれた場合,E_CTXエラーを返すものと
    232 ã™ã‚‹ï¼Žã“れにともなって,ext_tskをリターンする可能性があるものとし,返り
    233 å€¤ã®åž‹ã‚’ERとする.
    234 
    235 (3) CPU例外ハンドラで行える操作
    236 
    237 CPU例外ハンドラで行える操作については,TOPPERS標準割込み処理モデルに準
    238 æ‹ ã™ã‚‹ã“ととし,JSPカーネルの仕様を踏襲せず,μITRON4.0仕様にも従わない.
    239 ãã®ãŸã‚ã®ã‚µãƒ¼ãƒ“スコールとして,次のサービスコールを実è£
    240 ã™ã‚‹ï¼Ž
    241 
    242         xsns_dpn        CPU例外発生時のディスパッチ保留状æ
    243 ‹ã®å‚ç
    244 §
    245         xsns_xpn        CPU例外発生時のタスク例外処理保留状æ
    246 ‹ã®å‚ç
    247 §
    248 
    249 (4) カーネルの用いる管理領域の分離
    250 
    251 Î¼ITRON4.0/PX仕様において導å
    252 ¥ã•ã‚ŒãŸÎ¼ITRON4.0仕様に対する変更として,カー
    253 ãƒãƒ«ã®ç”¨ã„る管理領域の分離に関する仕様を一部採用する.
    254 
    255 ã¾ãšï¼Œå›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ールの実è£
    256 ã«ãŠã„て,カーネルの用いる管理領域を分離
    257 ã™ã‚‹ã“とに伴い,固定長メモリプールを生成する静的API(CRE_MPF)のパラメー
    258 ã‚¿ã«ï¼Œå›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール管理領域のå
    259 ˆé ­ç•ªåœ°ï¼ˆmpfmb)を追加する.
    260 
    261 ã¾ãŸï¼Œã“れにあわせて,データキューを生成する静的API(CRE_DTQ)の最後の
    262 ãƒ‘ラメータの名称を,データキュー管理領域のå
    263 ˆé ­ç•ªåœ°ï¼ˆdtqmb)に変更する.
    264 
    265 ãªãŠï¼Œãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã¯ï¼ŒÎ¼ITRON4.0仕様との互換性のために残している機能
    266 ã¨ä½ç½®ä»˜ã‘,カーネルの用いる管理領域の分離は行わない.そのため,メール
    267 ãƒœãƒƒã‚¯ã‚¹ã‚’生成する静的API(CRE_MBX)に対する変更はない.
    268 
    269 (5) 処理単位とメモリ領域のデータ型の見直し
    270 
    271 å‡¦ç†å˜ä½ã®ã‚¨ãƒ³ãƒˆãƒªç•ªåœ°ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’,パラメータが反映されないFP型ではな
    272 ãï¼Œå‡¦ç†å˜ä½æ¯Žã®å°‚用のデータ型とする.例えば,タスクのエントリ番地のデー
    273 ã‚¿åž‹ã‚’TASK型,タスク例外処理ルーチンのデータ型をTEXRTN型とする.
    274 
    275 ã¾ãŸï¼Œã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã¨å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール領域のデータ型を,それぞれSTK_T型
    276 ã¨MPF_T型とする.
    277 
    278 (6) 値が0の定数(オブジェクト属性等)の見直し
    279 
    280 ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ãƒŸã‚¹ã‚’防ぐために,値が0の定数の扱いを見直す.オブジェクト属
    281 æ€§ï¼ˆTA_TFIFO等)については,値が0のものはデフォルト扱いして廃止し,定義
    282 ã‚’itron.hに移す.値が0のサービスコールの動作モード(TWF_ANDW)やオブジェ
    283 ã‚¯ãƒˆã®çŠ¶æ
    284 ‹ï¼ˆTTEX_ENA等)については,値を変更する.
    285 
    286 (7) 強制å¾
    287 ã¡è¦æ±‚ネストの廃止
    288 
    289 å¼·åˆ¶å¾
    290 ã¡è¦æ±‚をネストする機能を廃止する.言い換えると,強制å¾
    291 ã¡è¦æ±‚ネス
    292 ãƒˆæ•°ã®æœ€å¤§å€¤ã‚’1に固定する.これに伴い,frsm_tskは廃止し,itron.hにおい
    293 ã¦frsm_tskをrsm_tskにマクロ定義する.また,TMAX_SUSCNTの定義をitron.hに
    294 ç§»ã™ï¼Ž
    295 
    296 (8) システム時刻の設定機能の廃止
    297 
    298 set_tim(システム時刻の設定)を廃止する.
    299 
    300 (9) 周期ハンドラの仕様変更
    301 
    302 sta_cycを呼び出した後,最初に周期ハンドラが起動される時刻を変更する.
    303 Î¼ITRON4.0仕様では,sta_cycを呼び出してから周期ハンドラの起動周期で指定
    304 ã—た相対時間後としているが,ASPカーネルでは,起動位相で指定した相対時間
    305 å¾Œã¨ã™ã‚‹ï¼Ž
    306 
    307 (10) タスク例外処理ルーチンの実行開始条件の変更
    308 
    309 å‰²è¾¼ã¿å„ªå
    310 ˆåº¦ãƒžã‚¹ã‚¯å
    311 ¨è§£é™¤çŠ¶æ
    312 ‹ã§ãªã„場合には,タスク例外処理ルーチンの実
    313 è¡ŒãŒé–‹å§‹ã•ã‚Œãªã„という仕様に変更した.
    314 
    315 â—‹JSPカーネルにおける独自の拡張機能
    316 
    317 JSPカーネルにおける独自の拡張機能の中で,以下の機能を実è£
    318 ã™ã‚‹ï¼Ž
    319 
    320 (1) 性能評価用システム時刻参ç
    321 §æ©Ÿèƒ½
    322 
    323 æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻参ç
    324 §æ©Ÿèƒ½ã¨ã¯ï¼ŒASPカーネル上で動作するタスクやASP
    325 ã‚«ãƒ¼ãƒãƒ«è‡ªèº«ã®æ€§èƒ½ã‚’計測するための,システム時刻をμ秒単位で読み出す機
    326 èƒ½ã§ã‚る.この機能のためのサービスコールは次の通りである(JSPカーネルと
    327 ã¯åç§°ã‚’変更した).
    328 
    329         get_utm         æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻の参ç
    330 §
    331 
    332 JSPカーネルからの仕様変更として,get_utmは任意のコンテキストから呼び出
    333 ã™ã“とができるものする.また,性能評価用システム時刻の型(SYSUTM)を,
    334 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§ulong_tに定義する.
    335 
    336 (2) 終了処理ルーチン機能
    337 
    338 ASPカーネルでは,システムの終了時に呼び出される終了処理ルーチンを登録す
    339 ã‚‹ãŸã‚ã®æ©Ÿèƒ½ã‚’サポートする.この機能のための静的APIは次の通りである.
    340 
    341         ATT_TER         çµ‚了処理ルーチンの追加(静的API)
    342 
    343 (3) カーネル動作状æ
    344 ‹ã®å‚ç
    345 §
    346 
    347 ã‚«ãƒ¼ãƒãƒ«ä¸Šã§å‹•ä½œã™ã‚‹ã‚¿ã‚¹ã‚¯ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã‚‹é–¢æ•°ãŒï¼Œã‚«ãƒ¼ãƒãƒ«ã®åˆæœŸåŒ–完了
    348 å‰ã‚„終了処理開始後にも呼び出される可能性がある場合には,その中でカーネ
    349 ãƒ«ã®ã‚µãƒ¼ãƒ“スコールを呼び出せるかを判別することがå¿
    350 è¦ã¨ãªã‚‹ï¼Žã“の機能の
    351 ãŸã‚ã®ã‚µãƒ¼ãƒ“スコールは次の通りである(JSPカーネルとは名称を変更した).
    352 
    353         sns_ker         ã‚«ãƒ¼ãƒãƒ«éžå‹•ä½œçŠ¶æ
    354 ‹ã®å‚ç
    355 §
    356 
    357 â—‹ASPカーネルにおける独自の拡張機能
    358 
    359 (1) 割込み要求ラインの属性の設定
    360 
    361 å‰²è¾¼ã¿è¦æ±‚ラインの属性を設定する機能として,TOPPERS標準割込み処理モデル
    362 ã§è¦å®šã•ã‚ŒãŸæ¬¡ã®é™çš„APIを実è£
    363 ã™ã‚‹ï¼Ž
    364 
    365         CFG_INT         å‰²è¾¼ã¿è¦æ±‚ラインの属性の設定(静的API)
    366 
    367 (2) 同期・通信オブジェクトの再初期化機能
    368 
    369 åŒæœŸãƒ»é€šä¿¡ã‚ªãƒ–ジェクトを初期状æ
    370 ‹ã«æˆ»ã™ãŸã‚ã®æ©Ÿèƒ½ã¨ã—て,次のサービスコー
    371 ãƒ«ã‚’実è£
    372 ã™ã‚‹ï¼Ž
    373 
    374         ini_sem         ã‚»ãƒžãƒ•ã‚©ã®å†åˆæœŸåŒ–
    375         ini_flg         ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°ã®å†åˆæœŸåŒ–
    376         ini_dtq         ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å†åˆæœŸåŒ–
    377         ini_mbx         ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã®å†åˆæœŸåŒ–
    378         ini_mpf         å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ールの再初期化
    379 
    380 åŒæœŸãƒ»é€šä¿¡ã‚ªãƒ–ジェクトの再初期化の際に,その同期・通信オブジェクトに対
    381 ã—てå¾
    382 ã¡çŠ¶æ
    383 ‹ã¨ãªã£ã¦ã„たタスクはすべてå¾
    384 ã¡è§£é™¤ã•ã‚Œã‚‹ï¼Žå¾
    385 ã¡è§£é™¤ã•ã‚ŒãŸã‚¿
    386 ã‚¹ã‚¯ã«å¯¾ã—ては,E_DLTを返す.E_DLTは,スタンダードプロファイルでは使用
    387 ã—ていないエラーコードである.
    388 
    389 ãã®ãŸã‚ï¼Œã“れらのサービスコールにより,複数のタスクが起床される可能性
    390 ãŒç”Ÿã˜ã‚‹ï¼Žå¤šãã®ã‚¿ã‚¹ã‚¯ã‚’同時にå¾
    391 ã¡è§£é™¤ã—た場合,カーネルå†
    392 ã§ã®å‰²è¾¼ã¿ç¦
    393 æ­¢æ™‚間が長くなるため,使用にあたっては注意がå¿
    394 è¦ã§ã‚る.
    395 
    396 åŒæœŸãƒ»é€šä¿¡ã‚ªãƒ–ジェクトを再初期化する際に,アプリケーション側との整合性
    397 ã‚’保つのはアプリケーションの責任である.å
    398 ·ä½“的には,固定長メモリプール
    399 ã‚’再初期化する際には,そこから獲得済みのメモリブロックをそれ以降使わな
    400 ã„ようにしなければならない.また,メールボックスを再初期化する際には,
    401 ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã«é€ä¿¡ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸é ˜åŸŸã‚’回収しなければならない.
    402 
    403 (3) 優å
    404 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ–°è¨­
    405 
    406ʌ㻌
    407 ˆåº¦ä»˜ãã®ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ©Ÿèƒ½ã‚’新設する.優å
    408 ˆåº¦ä»˜ããƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½ã®
    409 ãŸã‚ã«å®Ÿè£
    410 ã™ã‚‹é™çš„APIおよびサービスコールは次の通りである.
    411 
    412         CRE_PDQ         å„ªå
    413 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®ç”Ÿæˆ
    414         snd_pdq         å„ªå
    415 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡
    416         psnd_pdq        優å
    417 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼‰
    418         ipsnd_pdq       å„ªå
    419 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆï¼‰
    420         tsnd_pdq        優å
    421 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚り)
    422         rcv_pdq         å„ªå
    423 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—ä¿¡
    424         prcv_pdq        優å
    425 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(ポーリング)
    426         trcv_pdq        優å
    427 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(タイムアウトあり)
    428         ini_pdq         å„ªå
    429 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å†åˆæœŸåŒ–
    430         ref_pdq         å„ªå
    431 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ
    432 ‹å‚ç
    433 §
    434 
    435 ã“こで,優å
    436 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«è“„積されたデータの数が多い場合,優å
    437 ˆåº¦ãƒ‡ãƒ¼
    438 ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®ãƒ‡ãƒ¼ã‚¿ã®é€ä¿¡ã‚’行うサービスコール(snd_pdq,psnd_pdq,
    439 ipsnd_pdq,tsnd_pdq)の処理時間が長くなり,カーネルå†
    440 ã§ã®å‰²è¾¼ã¿ç¦æ­¢æ™‚é–“
    441 ãŒé•·ããªã‚‹ãŸã‚ï¼Œä½¿ç”¨ã«ã‚たっては注意がå¿
    442 è¦ã§ã‚る.
    443 
    444 (4) 自タスクの拡張æƒ
    445 å ±ã®å‚ç
    446 §
    447 
    448 è‡ªã‚¿ã‚¹ã‚¯ã®æ‹¡å¼µæƒ
    449 å ±ã‚’参ç
    450 §ã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒ“スコールを新設する.ライブラリ
    451 ç­‰ã®ä¸­ã§ç”¨ã„ることを想定している.
    452 
    453         get_inf         è‡ªã‚¿ã‚¹ã‚¯ã®æ‹¡å¼µæƒ
    454 å ±ã®å‚ç
    455 §
    456 
    457 (5) カーネルの終了
    458 
    459 è‡´å‘½çš„なエラーが起こった場合などにカーネルを終了させるためのサービスコー
    460 ãƒ«ã‚’新設する.この機能は,μITRON4.0仕様の機能分類では,システム構成管
    461 ç†æ©Ÿèƒ½ã«åˆ†é¡žã™ã‚‹ï¼ˆJSPカーネルでは,kernel_exitという名称で,実質的にこ
    462 ã®æ©Ÿèƒ½ã‚’用意していた).
    463 
    464         ext_ker         ã‚«ãƒ¼ãƒãƒ«ã®çµ‚了
    465 
    466 ASPカーネルでは,このサービスコールからリターンすることはないが,保護機
    467 èƒ½ã‚’持ったカーネルではエラーリターンする可能性があるため,返り値の型を
    468 ERとする.
    469 
    470 ã“れに伴って,JSPカーネルのkernel_startを,sta_kerに名称変更する.ただ
    471 ã—,sta_kerはサービスコールとは見なさないことにする.
    472 
    473 (6) 非タスクコンテキスト用のスタック領域の設定
    474 
    475 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®å
    476 ˆé ­ç•ªåœ°ã¨ã‚µã‚¤ã‚ºã‚’指定するための
    477 é™çš„APIを新設する.また,この静的APIにより,非タスクコンテキスト用のス
    478 ã‚¿ãƒƒã‚¯é ˜åŸŸã®ã‚µã‚¤ã‚ºã®ã¿ã‚’指定することもできる.
    479 
    480         DEF_ICS         éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®å®šç¾©
    481 
    482 â—‹JSPカーネルにおける実è£
    483 å®šç¾©ï¼å®Ÿè£
    484 ä¾å­˜è¦å®šã‹ã‚‰ã®å¤‰æ›´
    485 
    486 Î¼ITRON4.0仕様で実è£
    487 å®šç¾©ã¾ãŸã¯å®Ÿè£
    488 ä¾å­˜ã¨ã•ã‚Œã¦ã„る仕様の中で,以下のも
    489 ã®ã«ã¤ã„てJSPカーネルから変更する.
    490 
    491 (1) アプリケーション向けのインクルードファイルの構成の整理
    492 
    493 ã‚«ãƒ¼ãƒãƒ«ã‚’呼び出すアプリケーションからはkernel.hを,SILを呼び出すアプリ
    494 ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‹ã‚‰ã¯sil.hをインクルードすればよいものとし,t_services.hと
    495 s_services.hは廃止する.
    496 
    497 ã¾ãŸï¼Œkernel.hとsil.hのå
    498 ±é€šéƒ¨åˆ†ã¨ã—てt_stddef.hを用意し,カーネルとSIL
    499 ã®ã„ずれも呼び出さないアプリケーションからは,t_stddef.hをインクルード
    500 ã™ã‚Œã°ã‚ˆã„ものとする.itron.hは,μITRON4.0仕様との互換性がå¿
    501 è¦ãªå ´åˆã«
    502 ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã‚‹ã‚‚のとする.
    503 
    504 (2) 割込み処理/例外処理関連の型の定義の変更
    505 
    506 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ã®åž‹ï¼ˆINHNO),割込み番号の型(INTNO),CPU例外ハンド
    507 ãƒ©ç•ªå·ã®åž‹ï¼ˆEXCNO)を,ターゲット非依存部で,いずれもuint_t型に定義する.
    508 
    509 (3) 処理単位の実行開始/リターン時のシステム状æ
    510 ‹ã®è¦å®š
    511 
    512 å‡¦ç†å˜ä½ã®å®Ÿè¡Œé–‹å§‹ï¼ãƒªã‚¿ãƒ¼ãƒ³æ™‚のシステム状æ
    513 ‹ã«ã¤ã„て,μITRON4.0仕様に
    514 ãŠã„て実è£
    515 ä¾å­˜ã§ã‚った点を厳密に規定し,ターゲットによる違いが生じない
    516 ã‚ˆã†ã«ã™ã‚‹ï¼Ž
    517 
    518 (4) isig_timの扱いの変更
    519 
    520 ã‚·ã‚¹ãƒ†ãƒ æ™‚刻を更新する機構をカーネルå†
    521 éƒ¨ã«æŒã¤æ‰±ã„とし,サービスコール
    522 ã¨ã—てのisig_timは廃止する.
    523 
    524 (5) カーネルの用いる領域の指定方法
    525 
    526 JSPカーネルでは,カーネルの用いる領域はすべて自動割付けであったが,ASP
    527 ã‚«ãƒ¼ãƒãƒ«ã§ã¯ï¼Œã‚¿ã‚¹ã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã¨å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ールの固定長メモリプー
    528 ãƒ«é ˜åŸŸã«ã¤ã„ては,静的APIでå
    529 ˆé ­ç•ªåœ°ã‚’指定することもできるものとする(自
    530 å‹•å‰²ä»˜ã‘もサポートする).
    531 
    532 (6) カーネル管理外の割込みの扱いの規定
    533 
    534 JSPカーネルではターゲット毎に定めていたカーネル管理外の割込みの扱いを,
    535 ASPカーネルでは,TOPPERS標準割込み処理モデルの規定に準拠して,可能な範
    536 å›²ã§æ¨™æº–化する.ただし,NMI以外にカーネル管理外の割込みを設けるかや,ど
    537 ã®å‰²è¾¼ã¿å„ªå
    538 ˆåº¦ã‚ˆã‚Šé«˜ã„ものをカーネル管理外とするかは,ターゲット毎に定
    539 ã‚ã‚‹ï¼Ž
    540 
    541 â—‹ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³å‡¦ç†ã®è¦‹ç›´ã—
    542 
    543 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³å‡¦ç†ã‚’å
    544 ¨é¢çš„に見直し,システムコンフィギュ
    545 ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«ãŠã‘ã‚‹C言語のプリプロセッサディレクティブの扱いと
    546 é™çš„APIのパラメータの分類を変更した.
    547 
    548 â—‹æ‹¡å¼µãƒ‘ッケージのサポート
    549 
    550 ASPカーネルでは,いくつかの拡張機能を実è£
    551 ã™ã‚‹ãŸã‚ã«ï¼Œæ¬¡ã®æ‹¡å¼µãƒ‘ッケージ
    552 ã‚’サポートしている.
    553 
    554 ãƒ»ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージ(優å
    555 ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚’除く)
    556 ãƒ»ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージ
    557 ãƒ»ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージ
    558 ãƒ»ã‚¿ã‚¹ã‚¯å„ªå
    559 ˆåº¦æ‹¡å¼µãƒ‘ッケージ
    560 ãƒ»åˆ¶ç´„タスク拡張パッケージ
    561 ãƒ»å‹•çš„生成機能拡張パッケージ
    562 
    563 â—‹TOPPERS組込みコンポーネントシステム(TECS)の導å
    564 ¥
    565 
    566 ãƒ‡ãƒã‚¤ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã‚„システムログ機能との接続にTOPPERS組込みコンポーネント
    567 ã‚·ã‚¹ãƒ†ãƒ ï¼ˆTECS)を導å
    568 ¥ã™ã‚‹ï¼Žã¾ãŸï¼Œã‚«ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトをTECSのコンポー
    569 ãƒãƒ³ãƒˆã¨ã—て扱えるようにする.
    570 
    571 ãªãŠï¼ŒTECSに対応するための修正は,TECSのé
    572 å¸ƒãƒ‘ッケージに含まれており,
    573 ASPカーネルのé
    574 å¸ƒãƒ‘ッケージには含まれていない.
    575 
    576 ä»¥ä¸Š
     51○前提となる文書
     52
     53[1] トロン協会: μITRON4.0仕様, Ver.4.02.00, 2004年.
     54
     55[2] トロン協会: μITRON4.0仕様 保護機能拡張(μITRON4.0/PX仕様),
     56        Ver.1.00.00, 2002年.
     57
     58[3] TOPPERSプロジェクト: TOPPERS/JSPカーネル ユーザズマニュアル
     59        Release 1.4.3対応, 最終更新: 2007年4月23日.
     60
     61○仕様の概略
     62
     63TOPPERS/ASPカーネルの仕様は,μITRON4.0仕様のスタンダードプロファイルを
     64ベースに,次のような拡張・改良を加えたものである.
     65
     66・割込み処理機能については,TOPPERS標準割込み処理モデルに準拠させる.
     67・μITRON4.0仕様のスタンダードプロファイル外の機能の一部を導入する.
     68・一部の仕様について,μITRON4.0仕様に対して変更を加える.
     69・JSPカーネルにおける独自の拡張機能を一部変更して実装する.
     70・ASPカーネルにおける独自の拡張機能を新たに実装する.
     71・システムコンフィギュレーション処理を全面的に見直す.
     72・拡張機能を実装するための拡張パッケージをサポートする.
     73・TOPPERS組込みコンポーネントシステム(TECS)を導入する.
     74
     75そのためASPカーネルは,μITRON4.0仕様に完全に準拠しているわけではなく,
     76JSPカーネルの上位互換にもなっていない.
     77
     78μITRON4.0仕様では,実装独自に用意する静的APIおよびサービスコールの名称
     79には,先頭にそれぞれ"V"および"v"の文字を付加するものとしているが,ASPカー
     80ネルではこの規定は採用しない.
     81
     82以下では,μITRON4.0仕様のスタンダードプロファイルに対する拡張および変
     83更箇所について説明する.
     84
     85○スタンダードプロファイル外の機能の一部導入
     86
     87μITRON4.0仕様には規定されているが,スタンダードプロファイルに含まれな
     88い(または,含まれるとは限らない)機能として,次の機能を実装する.
     89
     90(1) イベントフラグの複数タスク待ち
     91
     92イベントフラグに対する複数タスク待ちの機能(TA_WMUL属性のイベントフラグ)
     93を実装する.
     94
     95これにより,イベントフラグのセット(set_flg,iset_flg)で複数のタスクが
     96起床される可能性が生じる.多くのタスクを同時に待ち解除した場合,カーネ
     97ル内での割込み禁止時間が長くなるため,使用にあたっては注意が必要である.
     98
     99(2) アラームハンドラ
     100
     101アラームハンドラの機能を実装する.アラームハンドラ機能のために実装する
     102静的APIおよびサービスコールは次の通りである.
     103
     104        CRE_ALM         アラームハンドラの生成(静的API)
     105        sta_alm         アラームハンドラの動作開始
     106        ista_alm        アラームハンドラの動作開始(非タスクコンテキスト用)
     107        stp_alm         アラームハンドラの動作停止
     108        istp_alm        アラームハンドラの動作停止(非タスクコンテキスト用)
     109
     110(3) 割込みサービスルーチン
     111
     112スタンダードプロファイルでは,割込みハンドラと割込みサービスルーチンの
     113いずれかをサポートすればよいことになっている.JSPカーネルでは割込みハン
     114ドラのみを実装しているが,ASPカーネルではその両者を実装する.
     115
     116割込みサービスルーチンの仕様については,TOPPERS標準割込み処理モデルの規
     117定に準拠する.割込みサービスルーチンを追加するサービスコールとして,次
     118の静的APIを実装する.この静的APIの仕様については,TOPPERS標準割込み処理
     119モデルにおいて,μITRON4.0仕様に対して拡張を加えている.
     120
     121        ATT_ISR         割込みサービスルーチンの追加(静的API)
     122
     123(4) 割込み管理機能
     124
     125スタンダードプロファイルに含まれない割込み管理機能として,次のサービス
     126コールを実装する.JSPカーネルでは,これらのサービスコールを実装するかど
     127うかはターゲット依存となっているが,ASPカーネルでは,TOPPERS標準割込み
     128処理モデルの規定に準拠して,ターゲット非依存に実装する.
     129
     130        dis_int         割込みの禁止
     131        ena_int         割込みの許可
     132        chg_ipm         割込み優先度マスクの変更
     133        get_ipm         割込み優先度マスクの参照
     134
     135(5) オブジェクトの状態参照機能
     136
     137主にデバッグ時向けの機能として,オブジェクトの状態参照機能を実装する.
     138具体的には,次のサービスコールを実装する.
     139
     140        ref_tsk         タスクの状態参照
     141        ref_tex         タスク例外処理の状態参照
     142        ref_sem         セマフォの状態参照
     143        ref_flg         イベントフラグの状態参照
     144        ref_dtq         データキューの状態参照
     145        ref_mbx         メールボックスの状態参照
     146        ref_mpf         固定長メモリプールの状態参照
     147        ref_cyc         周期ハンドラの状態参照
     148        ref_alm         アラームハンドラの状態参照
     149
     150○μITRON4.0仕様に対する変更
     151
     152(1) ITRON標準データ型の見直し
     153
     154サイズの決まった整数型(B,H, Wなど)などについて,C99に準拠した型の名
     155称(int8_t,int16_t,int32_tなど)やそれと相性が良い名称に変更する.
     156ITRON標準データ型(B,H, Wなど)を必要とするアプリケーションのために,
     157itron.hを用意する.
     158
     159(2) 非タスクコンテキストからのext_tsk
     160
     161非タスクコンテキストからext_tskが呼ばれた場合,E_CTXエラーを返すものと
     162する.これにともなって,ext_tskをリターンする可能性があるものとし,返り
     163値の型をERとする.
     164
     165(3) CPU例外ハンドラで行える操作
     166
     167CPU例外ハンドラで行える操作については,TOPPERS標準割込み処理モデルに準
     168拠することとし,JSPカーネルの仕様を踏襲せず,μITRON4.0仕様にも従わない.
     169そのためのサービスコールとして,次のサービスコールを実装する.
     170
     171        xsns_dpn        CPU例外発生時のディスパッチ保留状態の参照
     172        xsns_xpn        CPU例外発生時のタスク例外処理保留状態の参照
     173
     174(4) カーネルの用いる管理領域の分離
     175
     176μITRON4.0/PX仕様において導入されたμITRON4.0仕様に対する変更として,カー
     177ネルの用いる管理領域の分離に関する仕様を一部採用する.
     178
     179まず,固定長メモリプールの実装において,カーネルの用いる管理領域を分離
     180することに伴い,固定長メモリプールを生成する静的API(CRE_MPF)のパラメー
     181タに,固定長メモリプール管理領域の先頭番地(mpfmb)を追加する.
     182
     183また,これにあわせて,データキューを生成する静的API(CRE_DTQ)の最後の
     184パラメータの名称を,データキュー管理領域の先頭番地(dtqmb)に変更する.
     185
     186なお,メールボックスは,μITRON4.0仕様との互換性のために残している機能
     187と位置付け,カーネルの用いる管理領域の分離は行わない.そのため,メール
     188ボックスを生成する静的API(CRE_MBX)に対する変更はない.
     189
     190(5) 処理単位とメモリ領域のデータ型の見直し
     191
     192処理単位のエントリ番地のデータ型を,パラメータが反映されないFP型ではな
     193く,処理単位毎の専用のデータ型とする.例えば,タスクのエントリ番地のデー
     194タ型をTASK型,タスク例外処理ルーチンのデータ型をTEXRTN型とする.
     195
     196また,スタック領域と固定長メモリプール領域のデータ型を,それぞれSTK_T型
     197とMPF_T型とする.
     198
     199(6) 値が0の定数(オブジェクト属性等)の見直し
     200
     201コーディングミスを防ぐために,値が0の定数の扱いを見直す.オブジェクト属
     202性(TA_TFIFO等)については,値が0のものはデフォルト扱いして廃止し,定義
     203をitron.hに移す.値が0のサービスコールの動作モード(TWF_ANDW)やオブジェ
     204クトの状態(TTEX_ENA等)については,値を変更する.
     205
     206(7) 強制待ち要求ネストの廃止
     207
     208強制待ち要求をネストする機能を廃止する.言い換えると,強制待ち要求ネス
     209ト数の最大値を1に固定する.これに伴い,frsm_tskは廃止し,itron.hにおい
     210てfrsm_tskをrsm_tskにマクロ定義する.また,TMAX_SUSCNTの定義をitron.hに
     211移す.
     212
     213(8) システム時刻の設定機能の廃止
     214
     215set_tim(システム時刻の設定)を廃止する.
     216
     217(9) 周期ハンドラの仕様変更
     218
     219sta_cycを呼び出した後,最初に周期ハンドラが起動される時刻を変更する.
     220μITRON4.0仕様では,sta_cycを呼び出してから周期ハンドラの起動周期で指定
     221した相対時間後としているが,ASPカーネルでは,起動位相で指定した相対時間
     222後とする.
     223
     224(10) タスク例外処理ルーチンの実行開始条件の変更
     225
     226割込み優先度マスク全解除状態でない場合には,タスク例外処理ルーチンの実
     227行が開始されないという仕様に変更した.
     228
     229○JSPカーネルにおける独自の拡張機能
     230
     231JSPカーネルにおける独自の拡張機能の中で,以下の機能を実装する.
     232
     233(1) 性能評価用システム時刻参照機能
     234
     235性能評価用システム時刻参照機能とは,ASPカーネル上で動作するタスクやASP
     236カーネル自身の性能を計測するための,システム時刻をμ秒単位で読み出す機
     237能である.この機能のためのサービスコールは次の通りである(JSPカーネルと
     238は名称を変更した).
     239
     240        get_utm         性能評価用システム時刻の参照
     241
     242JSPカーネルからの仕様変更として,get_utmは任意のコンテキストから呼び出
     243すことができるものする.また,性能評価用システム時刻の型(SYSUTM)を,
     244ターゲット非依存部でulong_tに定義する.
     245
     246(2) 終了処理ルーチン機能
     247
     248ASPカーネルでは,システムの終了時に呼び出される終了処理ルーチンを登録す
     249るための機能をサポートする.この機能のための静的APIは次の通りである.
     250
     251        ATT_TER         終了処理ルーチンの追加(静的API)
     252
     253(3) カーネル動作状態の参照
     254
     255カーネル上で動作するタスクから呼び出される関数が,カーネルの初期化完了
     256前や終了処理開始後にも呼び出される可能性がある場合には,その中でカーネ
     257ルのサービスコールを呼び出せるかを判別することが必要となる.この機能の
     258ためのサービスコールは次の通りである(JSPカーネルとは名称を変更した).
     259
     260        sns_ker         カーネル非動作状態の参照
     261
     262○ASPカーネルにおける独自の拡張機能
     263
     264(1) 割込み要求ラインの属性の設定
     265
     266割込み要求ラインの属性を設定する機能として,TOPPERS標準割込み処理モデル
     267で規定された次の静的APIを実装する.
     268
     269        CFG_INT         割込み要求ラインの属性の設定(静的API)
     270
     271(2) 同期・通信オブジェクトの再初期化機能
     272
     273同期・通信オブジェクトを初期状態に戻すための機能として,次のサービスコー
     274ルを実装する.
     275
     276        ini_sem         セマフォの再初期化
     277        ini_flg         イベントフラグの再初期化
     278        ini_dtq         データキューの再初期化
     279        ini_mbx         メールボックスの再初期化
     280        ini_mpf         固定長メモリプールの再初期化
     281
     282同期・通信オブジェクトの再初期化の際に,その同期・通信オブジェクトに対
     283して待ち状態となっていたタスクはすべて待ち解除される.待ち解除されたタ
     284スクに対しては,E_DLTを返す.E_DLTは,スタンダードプロファイルでは使用
     285していないエラーコードである.
     286
     287そのため,これらのサービスコールにより,複数のタスクが起床される可能性
     288が生じる.多くのタスクを同時に待ち解除した場合,カーネル内での割込み禁
     289止時間が長くなるため,使用にあたっては注意が必要である.
     290
     291同期・通信オブジェクトを再初期化する際に,アプリケーション側との整合性
     292を保つのはアプリケーションの責任である.具体的には,固定長メモリプール
     293を再初期化する際には,そこから獲得済みのメモリブロックをそれ以降使わな
     294いようにしなければならない.また,メールボックスを再初期化する際には,
     295メールボックスに送信されたメッセージ領域を回収しなければならない.
     296
     297(3) 優先度データキューの新設
     298
     299優先度付きのデータキューの機能を新設する.優先度付きデータキュー機能の
     300ために実装する静的APIおよびサービスコールは次の通りである.
     301
     302        CRE_PDQ         優先度データキューの生成
     303        snd_pdq         優先度データキューへの送信
     304        psnd_pdq        優先度データキューへの送信(ポーリング)
     305        ipsnd_pdq       優先度データキューへの送信(ポーリング,非タスクコンテキスト)
     306        tsnd_pdq        優先度データキューへの送信(タイムアウトあり)
     307        rcv_pdq         優先度データキューからの受信
     308        prcv_pdq        優先度データキューからの受信(ポーリング)
     309        trcv_pdq        優先度データキューからの受信(タイムアウトあり)
     310        ini_pdq         優先度データキューの再初期化
     311        ref_pdq         優先度データキューの状態参照
     312
     313ここで,優先度データキューに蓄積されたデータの数が多い場合,優先度デー
     314タキューへのデータの送信を行うサービスコール(snd_pdq,psnd_pdq,
     315ipsnd_pdq,tsnd_pdq)の処理時間が長くなり,カーネル内での割込み禁止時間
     316が長くなるため,使用にあたっては注意が必要である.
     317
     318(4) 自タスクの拡張情報の参照
     319
     320自タスクの拡張情報を参照するためのサービスコールを新設する.ライブラリ
     321等の中で用いることを想定している.
     322
     323        get_inf         自タスクの拡張情報の参照
     324
     325(5) カーネルの終了
     326
     327致命的なエラーが起こった場合などにカーネルを終了させるためのサービスコー
     328ルを新設する.この機能は,μITRON4.0仕様の機能分類では,システム構成管
     329理機能に分類する(JSPカーネルでは,kernel_exitという名称で,実質的にこ
     330の機能を用意していた).
     331
     332        ext_ker         カーネルの終了
     333
     334ASPカーネルでは,このサービスコールからリターンすることはないが,保護機
     335能を持ったカーネルではエラーリターンする可能性があるため,返り値の型を
     336ERとする.
     337
     338これに伴って,JSPカーネルのkernel_startを,sta_kerに名称変更する.ただ
     339し,sta_kerはサービスコールとは見なさないことにする.
     340
     341(6) 非タスクコンテキスト用のスタック領域の設定
     342
     343非タスクコンテキスト用のスタック領域の先頭番地とサイズを指定するための
     344静的APIを新設する.また,この静的APIにより,非タスクコンテキスト用のス
     345タック領域のサイズのみを指定することもできる.
     346
     347        DEF_ICS         非タスクコンテキスト用のスタック領域の定義
     348
     349○JSPカーネルにおける実装定義/実装依存規定からの変更
     350
     351μITRON4.0仕様で実装定義または実装依存とされている仕様の中で,以下のも
     352のについてJSPカーネルから変更する.
     353
     354(1) アプリケーション向けのインクルードファイルの構成の整理
     355
     356カーネルを呼び出すアプリケーションからはkernel.hを,SILを呼び出すアプリ
     357ケーションからはsil.hをインクルードすればよいものとし,t_services.hと
     358s_services.hは廃止する.
     359
     360また,kernel.hとsil.hの共通部分としてt_stddef.hを用意し,カーネルとSIL
     361のいずれも呼び出さないアプリケーションからは,t_stddef.hをインクルード
     362すればよいものとする.itron.hは,μITRON4.0仕様との互換性が必要な場合に
     363インクルードするものとする.
     364
     365(2) 割込み処理/例外処理関連の型の定義の変更
     366
     367割込みハンドラ番号の型(INHNO),割込み番号の型(INTNO),CPU例外ハンド
     368ラ番号の型(EXCNO)を,ターゲット非依存部で,いずれもuint_t型に定義する.
     369
     370(3) 処理単位の実行開始/リターン時のシステム状態の規定
     371
     372処理単位の実行開始/リターン時のシステム状態について,μITRON4.0仕様に
     373おいて実装依存であった点を厳密に規定し,ターゲットによる違いが生じない
     374ようにする.
     375
     376(4) isig_timの扱いの変更
     377
     378システム時刻を更新する機構をカーネル内部に持つ扱いとし,サービスコール
     379としてのisig_timは廃止する.
     380
     381(5) カーネルの用いる領域の指定方法
     382
     383JSPカーネルでは,カーネルの用いる領域はすべて自動割付けであったが,ASP
     384カーネルでは,タスクのスタック領域と固定長メモリプールの固定長メモリプー
     385ル領域については,静的APIで先頭番地を指定することもできるものとする(自
     386動割付けもサポートする).
     387
     388(6) カーネル管理外の割込みの扱いの規定
     389
     390JSPカーネルではターゲット毎に定めていたカーネル管理外の割込みの扱いを,
     391ASPカーネルでは,TOPPERS標準割込み処理モデルの規定に準拠して,可能な範
     392囲で標準化する.ただし,NMI以外にカーネル管理外の割込みを設けるかや,ど
     393の割込み優先度より高いものをカーネル管理外とするかは,ターゲット毎に定
     394める.
     395
     396○システムコンフィギュレーション処理の見直し
     397
     398システムコンフィギュレーション処理を全面的に見直し,システムコンフィギュ
     399レーションファイル中におけるC言語のプリプロセッサディレクティブの扱いと
     400静的APIのパラメータの分類を変更した.
     401
     402○拡張パッケージのサポート
     403
     404ASPカーネルでは,いくつかの拡張機能を実装するために,次の拡張パッケージ
     405をサポートしている.
     406
     407・ミューテックス機能拡張パッケージ(優先度継承ミューテックスを除く)
     408・メッセージバッファ機能拡張パッケージ
     409・オーバランハンドラ機能拡張パッケージ
     410・タスク優先度拡張パッケージ
     411・制約タスク拡張パッケージ
     412・動的生成機能拡張パッケージ
     413
     414○TOPPERS組込みコンポーネントシステム(TECS)の導入
     415
     416デバイスドライバやシステムログ機能との接続にTOPPERS組込みコンポーネント
     417システム(TECS)を導入する.また,カーネルオブジェクトをTECSのコンポー
     418ネントとして扱えるようにする.
     419
     420なお,TECSに対応するための修正は,TECSの配布パッケージに含まれており,
     421ASPカーネルの配布パッケージには含まれていない.
     422
     423以上
  • rubycfg_asp/trunk/asp_dcre/doc/configurator.txt

    • Property svn:mime-type changed from text/plain to text/plane; charset=UTF-8
    r313 r315  
    11
    2                 TOPPERS/ASPカーネル
    3                 コンフィギュレータ仕様
    4 
    5                 対応バージョン: Release 1.9.3
    6                 最終更新: 2013å¹´12月31日
    7 
    8 ã“のドキュメントは,TOPPERS/ASPカーネルのコンフィギュレータが標準的に生
    9 æˆã™ã¹ããƒ•ã‚¡ã‚¤ãƒ«ã®å†
    10 å®¹ã«ã¤ã„て解説したものである.ターゲット依存に生成
    11 ã™ã‚‹å†
    12 å®¹ã«ã¤ã„ては,このドキュメントの範囲外である.
     2                TOPPERS/ASPカーネル
     3                コンフィギュレータ仕様
     4
     5                対応バージョン: Release 1.9.3
     6                最終更新: 2013年12月31日
     7
     8このドキュメントは,TOPPERS/ASPカーネルのコンフィギュレータが標準的に生
     9成すべきファイルの内容について解説したものである.ターゲット依存に生成
     10する内容については,このドキュメントの範囲外である.
    1311
    1412----------------------------------------------------------------------
     
    2018             Graduate School of Information Science, Nagoya Univ., JAPAN
    2119 
    22  ä¸Šè¨˜è‘—作権è€
    23 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    24  ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    25  å¤‰ãƒ»å†é
    26 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    27  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    28      æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    29      ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    30  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    31      ç”¨ã§ãã‚‹å½¢ã§å†é
    32 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    33 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    34      è€
    35 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    36      ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    37  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    38      ç”¨ã§ããªã„形で再é
    39 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    40      ã¨ï¼Ž
    41    (a) 再é
    42 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    43 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    44        ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    45    (b) 再é
    46 å¸ƒã®å½¢æ
    47 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    48        å ±å‘Šã™ã‚‹ã“と.
    49  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    50      å®³ã‹ã‚‰ã‚‚,上記著作権è€
    51 ãŠã‚ˆã³TOPPERSプロジェクトをå
    52 è²¬ã™ã‚‹ã“と.
    53      ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    54      ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    55 ãŠã‚ˆã³TOPPERSプロジェクトを
    56      å
    57 è²¬ã™ã‚‹ã“と.
     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     免責すること.
    5842 
    59  æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    60 ãŠ
    61  ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    62  ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    63  ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    64  ã®è²¬ä»»ã‚’負わない.
     43 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     44 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     45 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     46 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     47 の責任を負わない.
    6548 
    6649 $Id$
    6750----------------------------------------------------------------------
    6851
    69 â—‹ç›®æ¬¡
    70 
    71 ãƒ»ç”Ÿæˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ç¨®é¡ž
    72 ãƒ»é™çš„API一覧
    73 ãƒ»ã‚«ãƒ¼ãƒãƒ«æ§‹æˆãƒ»åˆæœŸåŒ–ヘッダファイル(kernel_cfg.h)
    74         (1) 固定生成部分
    75         (2) オブジェクト数の定義
    76         (3) オブジェクトのID番号の定義
    77 ãƒ»ã‚«ãƒ¼ãƒãƒ«æ§‹æˆãƒ»åˆæœŸåŒ–ファイル(kernel_cfg.c)
    78         (1) 固定生成部分
    79         (2) カーネルの種類のチェック
    80         (3) インクルードディレクティブ(#include)の処理
    81         (4) トレースログマクロのデフォルト定義
    82         (5) オブジェクトのID番号を保持する変数の定義
    83         (6) 各カーネルオブジェクトに関する定義
    84         (7) 割込みに関する定義
    85         (8) CPU例外に関する定義
    86         (9) 非タスクコンテキスト用のスタック領域に関する定義
    87         (10) タイムイベント管理に関する定義
    88         (11) 各モジュールの初期化関数の定義
    89         (12) 初期化ルーチンの実行関数の定義
    90         (13) 終了処理ルーチンの実行関数の定義
    91 
    92 
    93 â—‹ç”Ÿæˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ç¨®é¡ž
    94 
    95 ASPカーネルのコンフィギュレータは,システムコンフィギュレーションファイ
    96 ãƒ«ã‚’処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初期
    97 åŒ–ヘッダファイル(kernel_cfg.h)を生成する.また,コンフィギュレータの
    98 å‡¦ç†ã®é€”中に,å¿
    99 è¦ãªä¸­é–“ファイルを生成する.
    100 
    101 
    102 â—‹é™çš„API一覧
    103 
    104 ASPカーネルのコンフィギュレータが処理する静的APIは次の通り.
    105 
    106 (1) タスク管理機能
     52○目次
     53
     54・生成するファイルの種類
     55・静的API一覧
     56・カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
     57        (1) 固定生成部分
     58        (2) オブジェクト数の定義
     59        (3) オブジェクトのID番号の定義
     60・カーネル構成・初期化ファイル(kernel_cfg.c)
     61        (1) 固定生成部分
     62        (2) カーネルの種類のチェック
     63        (3) インクルードディレクティブ(#include)の処理
     64        (4) トレースログマクロのデフォルト定義
     65        (5) オブジェクトのID番号を保持する変数の定義
     66        (6) 各カーネルオブジェクトに関する定義
     67        (7) 割込みに関する定義
     68        (8) CPU例外に関する定義
     69        (9) 非タスクコンテキスト用のスタック領域に関する定義
     70        (10) タイムイベント管理に関する定義
     71        (11) 各モジュールの初期化関数の定義
     72        (12) 初期化ルーチンの実行関数の定義
     73        (13) 終了処理ルーチンの実行関数の定義
     74
     75
     76○生成するファイルの種類
     77
     78ASPカーネルのコンフィギュレータは,システムコンフィギュレーションファイ
     79ルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初期
     80化ヘッダファイル(kernel_cfg.h)を生成する.また,コンフィギュレータの
     81処理の途中に,必要な中間ファイルを生成する.
     82
     83
     84○静的API一覧
     85
     86ASPカーネルのコンフィギュレータが処理する静的APIは次の通り.
     87
     88(1) タスク管理機能
    10789        CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
    10890                                                                PRI itskpri, SIZE stksz, STK_T *stk })
    10991
    110 (2) タスク例外処理機能
     92(2) タスク例外処理機能
    11193        DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })
    11294
    113 (3) 同期・通信機能
     95(3) 同期・通信機能
    11496        CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
    11597        CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
     
    118100        CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })
    119101
    120 â€» dtqmb,pdqmb,mprihdがNULLでない場合はサポートしない.
    121 
    122 (4) メモリプール管理機能
     102※ dtqmb,pdqmb,mprihdがNULLでない場合はサポートしない.
     103
     104(4) メモリプール管理機能
    123105        CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
    124106                                                                                MPF_T *mpf, void *mpfmb })
    125107
    126 â€» mpfmbがNULLでない場合はサポートしない.
    127 
    128 (5) 時間管理機能
     108※ mpfmbがNULLでない場合はサポートしない.
     109
     110(5) 時間管理機能
    129111        CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,
    130112                                                                RELTIM cyctim, RELTIM cycphs })
    131113        CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })
    132114
    133 (6) 割込み管理機能
     115(6) 割込み管理機能
    134116        CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
    135117        ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri })
    136118        DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
    137119
    138 (7) CPU例外管理機能
     120(7) CPU例外管理機能
    139121        DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
    140122
    141 (8) システム構成管理機能
     123(8) システム構成管理機能
    142124        DEF_ICS({ SIZE istksz, STK_T *istk })
    143125        ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
    144126        ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
    145127
    146 ã“れらの静的APIのパラメータのå†
    147 ï¼ŒID型のパラメータはオブジェクト識別名,
    148 ãƒã‚¤ãƒ³ã‚¿åž‹ï¼ˆvoid *,TASK,TEXRTN,CYCHDR,ALMHDR,ISR,INTHDR,EXCHDR,
    149 INIRTN,TERRTN,STK_T *,MPF_T *)およびintptr_t型のパラメータは一般定
    150 æ•°å¼ãƒ‘ラメータとする.その他のパラメータは,整数定数式パラメータとする.
    151 
    152 
    153 â—‹ã‚«ãƒ¼ãƒãƒ«æ§‹æˆãƒ»åˆæœŸåŒ–ヘッダファイル(kernel_cfg.h)
    154 
    155 ã‚«ãƒ¼ãƒãƒ«æ§‹æˆãƒ»åˆæœŸåŒ–ヘッダファイル(kernel_cfg.h)には,次の定義を生成
    156 ã™ã‚‹ï¼Ž
    157 
    158 (1) 固定生成部分
    159 
    160 kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.å
    161 ·
    162 ä½“的には,ファイルのå
    163 ˆé ­ã«æ¬¡ã®è¡Œã‚’生成する.
     128これらの静的APIのパラメータの内,ID型のパラメータはオブジェクト識別名,
     129ポインタ型(void *,TASK,TEXRTN,CYCHDR,ALMHDR,ISR,INTHDR,EXCHDR,
     130INIRTN,TERRTN,STK_T *,MPF_T *)およびintptr_t型のパラメータは一般定
     131数式パラメータとする.その他のパラメータは,整数定数式パラメータとする.
     132
     133
     134○カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
     135
     136カーネル構成・初期化ヘッダファイル(kernel_cfg.h)には,次の定義を生成
     137する.
     138
     139(1) 固定生成部分
     140
     141kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.具
     142体的には,ファイルの先頭に次の行を生成する.
    164143
    165144#ifndef TOPPERS_KERNEL_CFG_H
    166145#define TOPPERS_KERNEL_CFG_H
    167146
    168 ã¾ãŸï¼Œãƒ•ã‚¡ã‚¤ãƒ«ã®æœ«å°¾ã«æ¬¡ã®è¡Œã‚’生成する.
     147また,ファイルの末尾に次の行を生成する.
    169148
    170149#endif  /* TOPPERS_KERNEL_CFG_H */
    171150
    172 (2) オブジェクト数の定義
    173 
    174 ã‚«ãƒ¼ãƒãƒ«ãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹ã‚ªãƒ–ジェクトの数をマクロ定義するプリプロセッサディ
    175 ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–(#define)を生成する.å
    176 ·ä½“的には,次のような記述を生成する.
    177 
    178 #define TNUM_TSKID      <タスクの数>
    179 #define TNUM_SEMID      <セマフォの数>
    180 #define TNUM_FLGID      <イベントフラグの数>
    181 #define TNUM_DTQID      <データキューの数>
    182 #define TNUM_PDQID      <優å
    183 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ•°>
    184 #define TNUM_MBXID      <メールボックスの数>
    185 #define TNUM_MPFID      <固定長メモリプールの数>
    186 #define TNUM_CYCID      <周期ハンドラの数>
    187 #define TNUM_ALMID      <アラームハンドラの数>
    188 
    189 (3) オブジェクトのID番号の定義
    190 
    191 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒID番号を割り付けたオブジェクトの名前を,割り付けた
    192 ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
    193 ä¾‹ãˆã°ï¼Œæ¬¡ã®ã‚ˆã†ãªè¨˜è¿°ã‚’生成する.
     151(2) オブジェクト数の定義
     152
     153カーネルがサポートするオブジェクトの数をマクロ定義するプリプロセッサディ
     154レクティブ(#define)を生成する.具体的には,次のような記述を生成する.
     155
     156#define TNUM_TSKID      <タスクの数>
     157#define TNUM_SEMID      <セマフォの数>
     158#define TNUM_FLGID      <イベントフラグの数>
     159#define TNUM_DTQID      <データキューの数>
     160#define TNUM_PDQID      <優先度データキューの数>
     161#define TNUM_MBXID      <メールボックスの数>
     162#define TNUM_MPFID      <固定長メモリプールの数>
     163#define TNUM_CYCID      <周期ハンドラの数>
     164#define TNUM_ALMID      <アラームハンドラの数>
     165
     166(3) オブジェクトのID番号の定義
     167
     168コンフィギュレータがID番号を割り付けたオブジェクトの名前を,割り付けた
     169ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
     170例えば,次のような記述を生成する.
    194171
    195172#define TASK1   1
     
    198175
    199176
    200 â—‹ã‚«ãƒ¼ãƒãƒ«æ§‹æˆãƒ»åˆæœŸåŒ–ファイル(kernel_cfg.c)
    201 
    202 (1) 固定生成部分
    203 
    204 kernel_cfg.c用のヘッダファイルとID自動割付け結果ファイルをインクルード
    205 ã™ã‚‹ãƒ—リプロセッサディレクティブ(#include)を生成する.å
    206 ·ä½“的には,次
    207 ã®è¡Œã‚’生成する.
     177○カーネル構成・初期化ファイル(kernel_cfg.c)
     178
     179(1) 固定生成部分
     180
     181kernel_cfg.c用のヘッダファイルとID自動割付け結果ファイルをインクルード
     182するプリプロセッサディレクティブ(#include)を生成する.具体的には,次
     183の行を生成する.
    208184
    209185#include "kernel/kernel_int.h"
    210186#include "kernel_cfg.h"
    211187
    212 (2) カーネルの種類のチェック
    213 
    214 kernel_cfg.cとカーネルの種類が一致しているかをチェックするために,次の
    215 è¡Œã‚’生成する.
     188(2) カーネルの種類のチェック
     189
     190kernel_cfg.cとカーネルの種類が一致しているかをチェックするために,次の
     191行を生成する.
    216192
    217193#if TKERNEL_PRID != 0x07u
     
    219195#endif
    220196
    221 (3) インクルードディレクティブ(#include)の処理
    222 
    223 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã‚‹C言語プリプロセッサのイ
    224 ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–(#include)と同一のディレクティブ(#include)
    225 ã‚’生成する.例えば,
     197(3) インクルードディレクティブ(#include)の処理
     198
     199システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイ
     200ンクルードディレクティブ(#include)と同一のディレクティブ(#include)
     201を生成する.例えば,
    226202
    227203#include "sample1.h"
    228204
    229 ã¨ã„うインクルードディレクティブに対して,
     205というインクルードディレクティブに対して,
    230206
    231207#include "sample1.h"
    232208
    233 ã¨ã„うディレクティブを生成する.生成するディレクティブの順序は,システ
    234 ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã§ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–の順序
    235 ã«ä¸€è‡´ã•ã›ã‚‹ï¼Ž
    236 
    237 (4) トレースログマクロのデフォルト定義
    238 
    239 kernel_cfg.cの中で使用するトレースログマクロのデフォルト定義を生成する.
    240 å
    241 ·ä½“的には,次の行を生成する.
     209というディレクティブを生成する.生成するディレクティブの順序は,システ
     210ムコンフィギュレーションファイル中でのインクルードディレクティブの順序
     211に一致させる.
     212
     213(4) トレースログマクロのデフォルト定義
     214
     215kernel_cfg.cの中で使用するトレースログマクロのデフォルト定義を生成する.
     216具体的には,次の行を生成する.
    242217
    243218#ifndef LOG_ISR_ENTER
     
    249224#endif /* LOG_ISR_LEAVE */
    250225
    251 (5) オブジェクトのID番号を保持する変数の定義
    252 
    253 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹ã‚ªãƒ—ション指定(--external-id)により,コンフィ
    254 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒID 番号を割り付けたオブジェクトの名前の末尾に"_id"を付加し
    255 ãŸåå‰ã®å¤‰æ•°ã‚’生成する.変数は,const属性を付加したID型の変数とし,割り
    256 ä»˜ã‘たID番号を値とする.例えば,次のような記述を生成する.
     226(5) オブジェクトのID番号を保持する変数の定義
     227
     228コンフィギュレータに対するオプション指定(--external-id)により,コンフィ
     229ギュレータがID 番号を割り付けたオブジェクトの名前の末尾に"_id"を付加し
     230た名前の変数を生成する.変数は,const属性を付加したID型の変数とし,割り
     231付けたID番号を値とする.例えば,次のような記述を生成する.
    257232
    258233const ID TASK1_id = 1;
     
    260235const ID SEM1_id = 1;
    261236
    262 (6) 各カーネルオブジェクトに関する定義
    263 
    264 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«ï¼Œã‚ªãƒ–ジェクトを生成する静的
    265 API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
    266 æˆã®ãŸã‚ã®å®šç¾©ã‚’生成する.
    267 
    268 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã¯ï¼ŒåŒã˜ç¨®é¡žã®ã‚ªãƒ–ジェクトを生成する静的APIを集め,各
    269 ã‚ªãƒ–ジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と
    270 é‡è¤‡ãŒãªãï¼ŒID番号が連続するように割り付ける.
    271 
    272 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹ã‚ªãƒ—ション指定(--id-input-file)により,コン
    273 ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒã‚ªãƒ–ジェクトに割り付けるID番号を指定することができる.
    274 åŒã˜ç¨®é¡žã®ç•°ãªã‚‹ã‚ªãƒ–ジェクトに対して同じID番号を指定したり,コンフィギュ
    275 ãƒ¬ãƒ¼ã‚¿ãŒID番号をできる限り連続するように割り付けたとしてもID番号が連続
    276 ã—ない場合には(ASPカーネルは,オブジェクトのID番号が連続していることを
    277 ä»®å®šã—て実è£
    278 ã—てある),コンフィギュレータはエラーを報告する.
    279 
    280 ã¾ãŸï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹ã‚ªãƒ—ション指定(--id-output-file)によ
    281 ã‚Šï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒID番号を割り付けたオブジェクトの名前と割り付け
    282 ãŸID番号の組を,オプションで指定したファイルに出力する.
    283 
    284 å„カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
    285 ãƒ–ジェクトによって例外がある場合には,オブジェクト毎のé 
    286 ã§èª¬æ˜Žã™ã‚‹ï¼Ž
    287 
    288 (a) 最大のオブジェクトIDの変数の定義
    289 
    290 æœ€å¤§ã®ã‚ªãƒ–ジェクトIDを持つ変数の定義を生成する.å
    291 ·ä½“的には,オブジェク
    292 ãƒˆã®çœç•¥è¨˜å·ã‚’「XXX/xxx」とすると,次のような行を生成する.
     237(6) 各カーネルオブジェクトに関する定義
     238
     239システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
     240API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
     241成のための定義を生成する.
     242
     243コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,各
     244オブジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と
     245重複がなく,ID番号が連続するように割り付ける.
     246
     247コンフィギュレータに対するオプション指定(--id-input-file)により,コン
     248フィギュレータがオブジェクトに割り付けるID番号を指定することができる.
     249同じ種類の異なるオブジェクトに対して同じID番号を指定したり,コンフィギュ
     250レータがID番号をできる限り連続するように割り付けたとしてもID番号が連続
     251しない場合には(ASPカーネルは,オブジェクトのID番号が連続していることを
     252仮定して実装してある),コンフィギュレータはエラーを報告する.
     253
     254また,コンフィギュレータに対するオプション指定(--id-output-file)によ
     255り,コンフィギュレータがID番号を割り付けたオブジェクトの名前と割り付け
     256たID番号の組を,オプションで指定したファイルに出力する.
     257
     258各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
     259ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する.
     260
     261(a) 最大のオブジェクトIDの変数の定義
     262
     263最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク
     264トの省略記号を「XXX/xxx」とすると,次のような行を生成する.
    293265
    294266const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
    295267
    296 (b) オブジェクトにå¿
    297 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã®å®šç¾©
    298 
    299 ã‚ªãƒ–ジェクトによっては,オブジェクトにå¿
    300 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã®å®šç¾©ã‚’生成する.
    301 å
    302 ·ä½“的には,オブジェクト毎のé 
    303 ã§èª¬æ˜Žã™ã‚‹ï¼Ž
    304 
    305 (c) オブジェクトの初期化ブロックの定義
    306 
    307 ã‚ªãƒ–ジェクトの初期化ブロックの定義を生成する.å
    308 ·ä½“的には,オブジェクト
    309 ã®çœç•¥è¨˜å·ã‚’「XXX/xxx」とすると,次のような行を生成する.
     268(b) オブジェクトに必要なメモリ領域の定義
     269
     270オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する.
     271具体的には,オブジェクト毎の項で説明する.
     272
     273(c) オブジェクトの初期化ブロックの定義
     274
     275オブジェクトの初期化ブロックの定義を生成する.具体的には,オブジェクト
     276の省略記号を「XXX/xxx」とすると,次のような行を生成する.
    310277
    311278const XXXINIB _kernel_xxxinib_table[TNUM_XXXID] = {
    312         <オブジェクトIDが1のオブジェクトの初期化æƒ
    313 å ±>,
    314         <オブジェクトIDが2のオブジェクトの初期化æƒ
    315 å ±>,
    316                                 ……
    317         <オブジェクトIDがTNUM_XXXIDのオブジェクトの初期化æƒ
    318 å ±>
     279        <オブジェクトIDが1のオブジェクトの初期化情報>,
     280        <オブジェクトIDが2のオブジェクトの初期化情報>,
     281                                ……
     282        <オブジェクトIDがTNUM_XXXIDのオブジェクトの初期化情報>
    319283};
    320284
    321 ã‚ªãƒ–ジェクトの初期化æƒ
    322 å ±ã®å½¢å¼ã¯ï¼Œã‚ªãƒ–ジェクト毎に異なる.å
    323 ·ä½“的には,
    324 ã‚ªãƒ–ジェクト毎のé 
    325 ã§èª¬æ˜Žã™ã‚‹ï¼Ž
    326 
    327 (d) オブジェクトのコントロールブロックの定義
    328 
    329 ã‚ªãƒ–ジェクトのコントロールブロックの定義を生成する.å
    330 ·ä½“的には,オブジェ
    331 ã‚¯ãƒˆã®çœç•¥è¨˜å·ã‚’「XXX/xxx」とすると,次のような行を生成する.
     285オブジェクトの初期化情報の形式は,オブジェクト毎に異なる.具体的には,
     286オブジェクト毎の項で説明する.
     287
     288(d) オブジェクトのコントロールブロックの定義
     289
     290オブジェクトのコントロールブロックの定義を生成する.具体的には,オブジェ
     291クトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
    332292
    333293XXXCB _kernel_xxxcb_table[TNUM_XXXID];
    334294
    335 (6-1) タスクに関する定義
    336 
    337 ASPカーネルは,タスクが一つもないケースに対応していないため,タスクに関
    338 ã™ã‚‹å®šç¾©ã¯å¿
    339 ãšç”Ÿæˆã—なければならない.
    340 
    341 ã‚¿ã‚¹ã‚¯ã®çœç•¥è¨˜å·ã¯ã€ŒTSK」「tsk」である.ただし,タスク初期化ブロックの
    342 ãƒ‡ãƒ¼ã‚¿åž‹ã¯TINIB,その変数名は_kernel_tinib_table,タスクコントロールブ
    343 ãƒ­ãƒƒã‚¯ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯TCB,その変数名は_kernel_tcb_table である(いずれも
    344 ã€ŒTSK/tsk」に代えて「T/t」を用いている).
    345 
    346 ã‚¿ã‚¹ã‚¯åˆæœŸåŒ–ブロックには,「CRE_TSK」静的APIで指定されるæƒ
    347 å ±ã«åŠ ãˆã¦ï¼Œ
    348 ã€ŒDEF_TEX」静的APIで指定されるæƒ
    349 å ±ã‚’含める.
    350 
    351 ä»¥ä¸‹ã§ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれ
    352 ã¦ã„る時に生成すべきæƒ
    353 å ±ã«ã¤ã„て述べる.
     295(6-1) タスクに関する定義
     296
     297ASPカーネルは,タスクが一つもないケースに対応していないため,タスクに関
     298する定義は必ず生成しなければならない.
     299
     300タスクの省略記号は「TSK」「tsk」である.ただし,タスク初期化ブロックの
     301データ型はTINIB,その変数名は_kernel_tinib_table,タスクコントロールブ
     302ロックのデータ型はTCB,その変数名は_kernel_tcb_table である(いずれも
     303「TSK/tsk」に代えて「T/t」を用いている).
     304
     305タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて,
     306「DEF_TEX」静的APIで指定される情報を含める.
     307
     308以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
     309ている時に生成すべき情報について述べる.
    354310
    355311CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
    356312DEF_TEX(tskid, { texatr, texrtn });
    357313
    358 (6-1-1) タスクにå¿
    359 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã®å®šç¾©
    360 
    361 ã‚¿ã‚¹ã‚¯ã«å¿
    362 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¨ã—て,タスクのスタック領域がある.stkがNULLの
    363 å ´åˆã«ã¯ï¼Œç”Ÿæˆã™ã‚‹ã‚¿ã‚¹ã‚¯æ¯Žã«ï¼ŒæŒ‡å®šã•ã‚ŒãŸã‚µã‚¤ã‚ºã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã‚’確保する.
    364 å
    365 ·ä½“的には,上記の静的APIに対して,次の定義を生成する.
    366 
    367 ï¼ŠstkがNULLの場合のみ生成
    368 static STK_T _kernel_stack_<タスク名>[COUNT_STK_T(stksz)];
    369 
    370 (6-1-2) タスクの初期化æƒ
    371 å ±
    372 
    373 ã‚¿ã‚¹ã‚¯åˆæœŸåŒ–ブロック中に生成するタスクの初期化æƒ
    374 å ±ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     314(6-1-1) タスクに必要なメモリ領域の定義
     315
     316タスクに必要なメモリ領域として,タスクのスタック領域がある.stkがNULLの
     317場合には,生成するタスク毎に,指定されたサイズのスタック領域を確保する.
     318具体的には,上記の静的APIに対して,次の定義を生成する.
     319
     320*stkがNULLの場合のみ生成
     321static STK_T _kernel_stack_<タスク名>[COUNT_STK_T(stksz)];
     322
     323(6-1-2) タスクの初期化情報
     324
     325タスク初期化ブロック中に生成するタスクの初期化情報は,次の形式とする.
    375326
    376327        { (tskatr), (intptr_t)(exinf), (task), INT_PRIORITY(itskpri),
    377328                                                                (stksz), (stk), (texatr), (texrtn) }
    378329
    379 ã“こで,stkがNULLの場合には,(stksz)に代えてROUND_STK_T(stksz)を,
    380 (stk)に代えて(_kernel_stack_<タスク名>)を生成する.CRE_TSKに対応する
    381 DEF_TEXがない場合には,texatrをTA_NULL,texrtnをNULLとする.
    382 
    383 (6-1-3) タスク生成順序テーブルの定義
    384 
    385 ã‚¿ã‚¹ã‚¯ã«å¯¾ã—ては,生成された順序(タスクを生成する静的APIが記述された
    386 é †åºï¼‰ã‚’テーブルに出力するå¿
    387 è¦ãŒã‚る.これは,タスクの生成された順序で,
    388 ã‚¿ã‚¹ã‚¯ã®åˆæœŸåŒ–(よりå
    389 ·ä½“的には,タスクの起動)を行うå¿
    390 è¦ãŒã‚るためであ
    391 ã‚‹ï¼Ž
    392 
    393 å
    394 ·ä½“的には,次のような行を生成する.
     330ここで,stkがNULLの場合には,(stksz)に代えてROUND_STK_T(stksz)を,
     331(stk)に代えて(_kernel_stack_<タスク名>)を生成する.CRE_TSKに対応する
     332DEF_TEXがない場合には,texatrをTA_NULL,texrtnをNULLとする.
     333
     334(6-1-3) タスク生成順序テーブルの定義
     335
     336タスクに対しては,生成された順序(タスクを生成する静的APIが記述された
     337順序)をテーブルに出力する必要がある.これは,タスクの生成された順序で,
     338タスクの初期化(より具体的には,タスクの起動)を行う必要があるためであ
     339る.
     340
     341具体的には,次のような行を生成する.
    395342
    396343const ID _kernel_torder_table[TNUM_TSKID] = {
    397         <最初に生成されたタスクのタスクID>,
    398         <2番目に生成されたタスクのタスクID>,
    399                                 ……
    400         <最後に生成されたタスクのタスクID>
     344        <最初に生成されたタスクのタスクID>,
     345        <2番目に生成されたタスクのタスクID>,
     346                                ……
     347        <最後に生成されたタスクのタスクID>
    401348};
    402349
    403 (6-1-4) エラー条件
    404 
    405 ã‚¿ã‚¹ã‚¯ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    406 
    407 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    408 ãƒ»åŒã˜tskidに対するCRE_TSKが複数ある場合(E_OBJ)
    409 ãƒ»DEF_TEXに対応するCRE_TSKがない場合(E_NOEXS)
    410 ãƒ»åŒã˜tskidに対するDEF_TEXが複数ある場合(E_OBJ)
    411 
    412 ï¼Šãƒ‘ス2で検出するもの
    413 ãƒ»tskatrが([TA_ACT])でない場合(E_RSATR)
    414         ※ ターゲット依存部でタスク属性を追加可(TARGET_TSKATR)
    415 ãƒ»(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
    416 ãƒ»stkszが0以下か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さ
    417 ã€€ã„場合(E_PAR)
    418 ãƒ»stkszがスタック領域のサイズとして正しくない場合(E_PAR)
    419         - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
    420         ※ このエラーチェックは,stkがNULLでない場合にのみ行う
    421 ãƒ»texatrが(TA_NULL)でない場合(E_RSATR)
    422 
    423 ï¼Šãƒ‘ス3で検出するもの
    424 ãƒ»taskとtexrtnがプログラムの開始番地として正しくない場合(E_PAR)
    425         - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
    426         - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
    427 ãƒ»stkがスタック領域のå
    428 ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)
    429         - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
    430         - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
    431 
    432 (6-2) セマフォに関する定義
    433 
    434 ã‚»ãƒžãƒ•ã‚©ã®çœç•¥è¨˜å·ã¯ã€ŒSEM/sem」である.以下では,システムコンフィギュレー
    435 ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    436 å ±ã«ã¤ã„て述べ
    437 ã‚‹ï¼ŽãªãŠï¼Œã‚»ãƒžãƒ•ã‚©ã«å¿
    438 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¯ãªã„.
     350(6-1-4) エラー条件
     351
     352タスクに関するエラー条件は次の通りである.
     353
     354*コンフィギュレータ本体が検出するもの
     355・同じtskidに対するCRE_TSKが複数ある場合(E_OBJ)
     356・DEF_TEXに対応するCRE_TSKがない場合(E_NOEXS)
     357・同じtskidに対するDEF_TEXが複数ある場合(E_OBJ)
     358
     359*パス2で検出するもの
     360・tskatrが([TA_ACT])でない場合(E_RSATR)
     361        ※ ターゲット依存部でタスク属性を追加可(TARGET_TSKATR)
     362・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
     363・stkszが0以下か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さ
     364 い場合(E_PAR)
     365・stkszがスタック領域のサイズとして正しくない場合(E_PAR)
     366        - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
     367        ※ このエラーチェックは,stkがNULLでない場合にのみ行う
     368・texatrが(TA_NULL)でない場合(E_RSATR)
     369
     370*パス3で検出するもの
     371・taskとtexrtnがプログラムの開始番地として正しくない場合(E_PAR)
     372        - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
     373        - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
     374・stkがスタック領域の先頭番地として正しくない場合(E_PAR)
     375        - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
     376        - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
     377
     378(6-2) セマフォに関する定義
     379
     380セマフォの省略記号は「SEM/sem」である.以下では,システムコンフィギュレー
     381ションファイルに次の静的APIが含まれている時に生成すべき情報について述べ
     382る.なお,セマフォに必要なメモリ領域はない.
    439383
    440384CRE_SEM(semid, { sematr, isemcnt, maxsem });
    441385
    442 (6-2-1) セマフォの初期化æƒ
    443 å ±
    444 
    445 ã‚»ãƒžãƒ•ã‚©åˆæœŸåŒ–ブロック中に生成するセマフォの初期化æƒ
    446 å ±ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™
    447 ã‚‹ï¼Ž
     386(6-2-1) セマフォの初期化情報
     387
     388セマフォ初期化ブロック中に生成するセマフォの初期化情報は,次の形式とす
     389る.
    448390
    449391        { (sematr), (isemcnt), (maxsem) }
    450392
    451 (6-2-2) エラー条件
    452 
    453 ã‚»ãƒžãƒ•ã‚©ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    454 
    455 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    456 ãƒ»åŒã˜semidに対するCRE_SEMが複数ある場合(E_OBJ)
    457 
    458 ï¼Šãƒ‘ス2で検出するもの
    459 ãƒ»sematrが([TA_TPRI])でない場合(E_RSATR)
    460 ãƒ»(0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
    461 ãƒ»(1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
    462 
    463 (6-3) イベントフラグに関する定義
    464 
    465 ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°ã®çœç•¥è¨˜å·ã¯ã€ŒFLG/flg」である.以下では,システムコンフィ
    466 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    467 å ±ã«ã¤
    468 ã„て述べる.なお,イベントフラグにå¿
    469 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¯ãªã„.
     393(6-2-2) エラー条件
     394
     395セマフォに関するエラー条件は次の通りである.
     396
     397*コンフィギュレータ本体が検出するもの
     398・同じsemidに対するCRE_SEMが複数ある場合(E_OBJ)
     399
     400*パス2で検出するもの
     401・sematrが([TA_TPRI])でない場合(E_RSATR)
     402・(0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
     403・(1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
     404
     405(6-3) イベントフラグに関する定義
     406
     407イベントフラグの省略記号は「FLG/flg」である.以下では,システムコンフィ
     408ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
     409いて述べる.なお,イベントフラグに必要なメモリ領域はない.
    470410
    471411CRE_FLG(flgid, { flgatr, iflgptn });
    472412
    473 (6-3-1) イベントフラグの初期化æƒ
    474 å ±
    475 
    476 ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°åˆæœŸåŒ–ブロック中に生成するイベントフラグの初期化æƒ
    477 å ±ã¯ï¼Œ
    478 æ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     413(6-3-1) イベントフラグの初期化情報
     414
     415イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情報は,
     416次の形式とする.
    479417
    480418        { (flgatr), (iflgptn) }
    481419
    482 (6-3-2) エラー条件
    483 
    484 ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    485 
    486 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    487 ãƒ»åŒã˜flgidに対するCRE_FLGが複数ある場合(E_OBJ)
    488 
    489 ï¼Šãƒ‘ス1で検出するもの
    490 ãƒ»iflgptnがFLGPTNに格納できない場合(E_PAR)
    491         → iflgptnがuint32_tに格納できない場合は,cfg1_out.cのコンパイル時
    492            ã«ã‚¨ãƒ©ãƒ¼ã¨ãªã‚‹ï¼Ž
    493 
    494 ï¼Šãƒ‘ス2で検出するもの
    495 ãƒ»flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
    496 ãƒ»iflgptnがFLGPTNに格納できない場合(E_PAR)
    497         → iflgptnがuint32_tには格納できるが,FLGPTNに格納できない場合は,
    498            ãƒ‘ス2でエラーを検出する.
    499 
    500 (6-4) データキューに関する定義
    501 
    502 ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çœç•¥è¨˜å·ã¯ã€ŒDTQ/dtq」である.以下では,システムコンフィギュ
    503 ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    504 å ±ã«ã¤ã„て
    505 è¿°ã¹ã‚‹ï¼Ž
     420(6-3-2) エラー条件
     421
     422イベントフラグに関するエラー条件は次の通りである.
     423
     424*コンフィギュレータ本体が検出するもの
     425・同じflgidに対するCRE_FLGが複数ある場合(E_OBJ)
     426
     427*パス1で検出するもの
     428・iflgptnがFLGPTNに格納できない場合(E_PAR)
     429        → iflgptnがuint32_tに格納できない場合は,cfg1_out.cのコンパイル時
     430           にエラーとなる.
     431
     432*パス2で検出するもの
     433・flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
     434・iflgptnがFLGPTNに格納できない場合(E_PAR)
     435        → iflgptnがuint32_tには格納できるが,FLGPTNに格納できない場合は,
     436           パス2でエラーを検出する.
     437
     438(6-4) データキューに関する定義
     439
     440データキューの省略記号は「DTQ/dtq」である.以下では,システムコンフィギュ
     441レーションファイルに次の静的APIが含まれている時に生成すべき情報について
     442述べる.
    506443
    507444CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb });
    508445
    509 (6-4-1) データキューにå¿
    510 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã®å®šç¾©
    511 
    512 ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¿
    513 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¨ã—て,データキュー管理領域がある.生成
    514 ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ¯Žã«ï¼Œå¿
    515 è¦ãªã‚µã‚¤ã‚ºã®ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã‚’定義する.å
    516 ·
    517 ä½“的には,上記の静的APIに対して,次の定義を生成する.
    518 
    519 ï¼Šdtqcntが0でない場合のみ生成
    520 static DTQMB _kernel_dtqmb_<データキュー名>[dtqcnt];
    521 
    522 (6-4-2) データキューの初期化æƒ
    523 å ±
    524 
    525 ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼åˆæœŸåŒ–ブロック中に生成するデータキューの初期化æƒ
    526 å ±ã¯ï¼Œæ¬¡ã®
    527 å½¢å¼ã¨ã™ã‚‹ï¼Ž
    528 
    529         { (dtqatr), (dtqcnt), (_kernel_dtqmb_<データキュー名>) }
    530 
    531 ã“こで,dtqcntが0の場合には,_kernel_dtqmb_<データキュー名>に代えて,
    532 NULLを用いる.
    533 
    534 (6-4-3) エラー条件
    535 
    536 ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    537 
    538 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    539 ãƒ»åŒã˜dtqidに対するCRE_DTQが複数ある場合(E_OBJ)
    540 
    541 ï¼Šãƒ‘ス2で検出するもの
    542 ãƒ»dtqatrが([TA_TPRI])でない場合(E_RSATR)
    543 ãƒ»dtqcntが負の値の場合(E_PAR)
    544 ãƒ»dtqmbがNULLでない場合(E_NOSPT)
    545 
    546 (6-5) 優å
    547 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹å®šç¾©
    548 
    549ʌ㻌
    550 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çœç•¥è¨˜å·ã¯ã€ŒPDQ/pdq」である.以下では,システムコ
    551 ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    552 
    553 å ±ã«ã¤ã„て述べる.
     446(6-4-1) データキューに必要なメモリ領域の定義
     447
     448データキューに必要なメモリ領域として,データキュー管理領域がある.生成
     449するデータキュー毎に,必要なサイズのデータキュー管理領域を定義する.具
     450体的には,上記の静的APIに対して,次の定義を生成する.
     451
     452*dtqcntが0でない場合のみ生成
     453static DTQMB _kernel_dtqmb_<データキュー名>[dtqcnt];
     454
     455(6-4-2) データキューの初期化情報
     456
     457データキュー初期化ブロック中に生成するデータキューの初期化情報は,次の
     458形式とする.
     459
     460        { (dtqatr), (dtqcnt), (_kernel_dtqmb_<データキュー名>) }
     461
     462ここで,dtqcntが0の場合には,_kernel_dtqmb_<データキュー名>に代えて,
     463NULLを用いる.
     464
     465(6-4-3) エラー条件
     466
     467データキューに関するエラー条件は次の通りである.
     468
     469*コンフィギュレータ本体が検出するもの
     470・同じdtqidに対するCRE_DTQが複数ある場合(E_OBJ)
     471
     472*パス2で検出するもの
     473・dtqatrが([TA_TPRI])でない場合(E_RSATR)
     474・dtqcntが負の値の場合(E_PAR)
     475・dtqmbがNULLでない場合(E_NOSPT)
     476
     477(6-5) 優先度データキューに関する定義
     478
     479優先度データキューの省略記号は「PDQ/pdq」である.以下では,システムコ
     480ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
     481報について述べる.
    554482
    555483CRE_PDQ(ID pdqid, { pdqatr, pdqcnt, maxdpri, pdqmb });
    556484
    557 (6-5-1) 優å
    558 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¿
    559 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã®å®šç¾©
    560 
    561ʌ㻌
    562 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¿
    563 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¨ã—て,優å
    564 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸ
    565 ãŒã‚る.生成する優å
    566 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ¯Žã«ï¼Œå¿
    567 è¦ãªã‚µã‚¤ã‚ºã®å„ªå
    568 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼
    569 ç®¡ç†é ˜åŸŸã‚’定義する.å
    570 ·ä½“的には,上記の静的APIに対して,次の定義を生成す
    571 ã‚‹ï¼Ž
    572 
    573 ï¼Špdqcntが0でない場合のみ生成
    574 static PDQMB _kernel_pdqmb_<優å
    575 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å>[pdqcnt];
    576 
    577 (6-5-2) 優å
    578 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®åˆæœŸåŒ–æƒ
    579 å ±
    580 
    581ʌ㻌
    582 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼åˆæœŸåŒ–ブロック中に生成する優å
    583 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®åˆæœŸåŒ–
    584 æƒ
    585 å ±ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
    586 
    587         { (pdqatr), (pdqcnt), (maxdpri), (_kernel_pdqmb_<優å
    588 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å>) }
    589 
    590 ã“こで,pdqcntが0の場合には,_kernel_pdqmb_<優å
    591 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å>に代え
    592 ã¦ï¼ŒNULLを用いる.
    593 
    594 (6-5-3) エラー条件
    595 
    596ʌ㻌
    597 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    598 
    599 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    600 ãƒ»åŒã˜pdqidに対するCRE_PDQが複数ある場合(E_OBJ)
    601 
    602 ï¼Šãƒ‘ス2で検出するもの
    603 ãƒ»pdqatrが([TA_TPRI])でない場合(E_RSATR)
    604 ãƒ»pdqcntが負の値の場合(E_PAR)
    605 ãƒ»(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
    606 ãƒ»pdqmbがNULLでない場合(E_NOSPT)
    607 
    608 (6-6) メールボックスに関する定義
    609 
    610 ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã®çœç•¥è¨˜å·ã¯ã€ŒMBX/mbx」である.以下では,システムコンフィ
    611 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    612 å ±ã«ã¤
    613 ã„て述べる.なお,メールボックスにå¿
    614 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¯ãªã„.
     485(6-5-1) 優先度データキューに必要なメモリ領域の定義
     486
     487優先度データキューに必要なメモリ領域として,優先度データキュー管理領域
     488がある.生成する優先度データキュー毎に,必要なサイズの優先度データキュー
     489管理領域を定義する.具体的には,上記の静的APIに対して,次の定義を生成す
     490る.
     491
     492*pdqcntが0でない場合のみ生成
     493static PDQMB _kernel_pdqmb_<優先度データキュー名>[pdqcnt];
     494
     495(6-5-2) 優先度データキューの初期化情報
     496
     497優先度データキュー初期化ブロック中に生成する優先度データキューの初期化
     498情報は,次の形式とする.
     499
     500        { (pdqatr), (pdqcnt), (maxdpri), (_kernel_pdqmb_<優先度データキュー名>) }
     501
     502ここで,pdqcntが0の場合には,_kernel_pdqmb_<優先度データキュー名>に代え
     503て,NULLを用いる.
     504
     505(6-5-3) エラー条件
     506
     507優先度データキューに関するエラー条件は次の通りである.
     508
     509*コンフィギュレータ本体が検出するもの
     510・同じpdqidに対するCRE_PDQが複数ある場合(E_OBJ)
     511
     512*パス2で検出するもの
     513・pdqatrが([TA_TPRI])でない場合(E_RSATR)
     514・pdqcntが負の値の場合(E_PAR)
     515・(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
     516・pdqmbがNULLでない場合(E_NOSPT)
     517
     518(6-6) メールボックスに関する定義
     519
     520メールボックスの省略記号は「MBX/mbx」である.以下では,システムコンフィ
     521ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
     522いて述べる.なお,メールボックスに必要なメモリ領域はない.
    615523
    616524CRE_MBX(mbxid, { mbxatr, maxmpri, mprihd });
    617525
    618 (6-6-1) メールボックスの初期化æƒ
    619 å ±
    620 
    621 ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹åˆæœŸåŒ–ブロック中に生成するメールボックスの初期化æƒ
    622 å ±ã¯ï¼Œ
    623 æ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     526(6-6-1) メールボックスの初期化情報
     527
     528メールボックス初期化ブロック中に生成するメールボックスの初期化情報は,
     529次の形式とする.
    624530
    625531        { (mbxatr), (maxmpri) }
    626532
    627 (6-6-2) エラー条件
    628 
    629 ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    630 
    631 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    632 ãƒ»åŒã˜mbxidに対するCRE_MBXが複数ある場合(E_OBJ)
    633 
    634 ï¼Šãƒ‘ス2で検出するもの
    635 ãƒ»mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
    636 ãƒ»(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
    637 ãƒ»mprihdがNULLでない場合(E_NOSPT)
    638 
    639 (6-7) 固定長メモリプールに関する定義
    640 
    641 å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ールの省略記号は「MPF/mpf」である.以下では,システムコ
    642 ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    643 
    644 å ±ã«ã¤ã„て述べる.
     533(6-6-2) エラー条件
     534
     535メールボックスに関するエラー条件は次の通りである.
     536
     537*コンフィギュレータ本体が検出するもの
     538・同じmbxidに対するCRE_MBXが複数ある場合(E_OBJ)
     539
     540*パス2で検出するもの
     541・mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
     542・(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
     543・mprihdがNULLでない場合(E_NOSPT)
     544
     545(6-7) 固定長メモリプールに関する定義
     546
     547固定長メモリプールの省略記号は「MPF/mpf」である.以下では,システムコ
     548ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
     549報について述べる.
    645550
    646551CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf, mpfmb });
    647552
    648 (6-7-1) 固定長メモリプールにå¿
    649 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã®å®šç¾©
    650 
    651 å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ールにå¿
    652 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¨ã—て,固定長メモリプール領域と固
    653 å®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール管理領域がある.生成する固定長メモリプール毎に,å¿
    654 è¦ãª
    655 ã‚µã‚¤ã‚ºã®å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール領域(mpfがNULLの場合のみ)と固定長メモリプー
    656 ãƒ«ç®¡ç†é ˜åŸŸã‚’確保する.å
    657 ·ä½“的には,上記の静的APIに対して,次の定義を生成
    658 ã™ã‚‹ï¼Ž
    659 
    660 ï¼ŠmpfがNULLの場合のみ生成
    661 static MPF_T _kernel_mpf_<固定長メモリプール名>[(blkcnt) * COUNT_MPF_T(blksz)];
     553(6-7-1) 固定長メモリプールに必要なメモリ領域の定義
     554
     555固定長メモリプールに必要なメモリ領域として,固定長メモリプール領域と固
     556定長メモリプール管理領域がある.生成する固定長メモリプール毎に,必要な
     557サイズの固定長メモリプール領域(mpfがNULLの場合のみ)と固定長メモリプー
     558ル管理領域を確保する.具体的には,上記の静的APIに対して,次の定義を生成
     559する.
     560
     561*mpfがNULLの場合のみ生成
     562static MPF_T _kernel_mpf_<固定長メモリプール名>[(blkcnt) * COUNT_MPF_T(blksz)];
    662563                                                               
    663 ï¼Šå¿
    664 ãšç”Ÿæˆ
    665 static MPFMB _kernel_mpfmb_<固定長メモリプール名>[blkcnt];
    666 
    667 (6-7-2) 固定長メモリプールの初期化æƒ
    668 å ±
    669 
    670 å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール初期化ブロック中に生成する固定長メモリプールの初期化
    671 æƒ
    672 å ±ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     564*必ず生成
     565static MPFMB _kernel_mpfmb_<固定長メモリプール名>[blkcnt];
     566
     567(6-7-2) 固定長メモリプールの初期化情報
     568
     569固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化
     570情報は,次の形式とする.
    673571
    674572        { (mpfatr), (blkcnt), ROUND_MPF_T(blksz), mpf,
    675                                                 (_kernel_mpfmb_<固定長メモリプール名>) }
    676 
    677 ã“こで,mpfがNULLの場合には,mpfに代えて,_kernel_mpf_<固定長メモリプー
    678 ãƒ«å>を用いる.
    679 
    680 (6-7-3) エラー条件
    681 
    682 å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ールに関するエラー条件は次の通りである.
    683 
    684 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    685 ãƒ»åŒã˜mpfidに対するCRE_MPFが複数ある場合(E_OBJ)
    686 
    687 ï¼Šãƒ‘ス2で検出するもの
    688 ãƒ»mpfatrが([TA_TPRI])でない場合(E_RSATR)
    689 ãƒ»blkcntが0以下の場合(E_PAR)
    690 ãƒ»blkszが0以下の場合(E_PAR)
    691 ãƒ»mpfmbがNULLでない場合(E_NOSPT)
    692 
    693 ï¼Šãƒ‘ス3で検出するもの
    694 ãƒ»mpfが固定長メモリプール領域のå
    695 ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)
    696         - ターゲット依存の値(CHECK_MPF_ALIGN)の倍数でない場合
    697         - NULLの場合(ターゲット依存,CHECK_MPF_NONNULL)
    698 
    699 (6-8) 周期ハンドラに関する定義
    700 
    701 å‘¨æœŸãƒãƒ³ãƒ‰ãƒ©ã®çœç•¥è¨˜å·ã¯ã€ŒCYC/cyc」である.以下では,システムコンフィ
    702 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    703 å ±ã«ã¤
    704 ã„て述べる.なお,周期ハンドラにå¿
    705 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¯ãªã„.
     573                                                (_kernel_mpfmb_<固定長メモリプール名>) }
     574
     575ここで,mpfがNULLの場合には,mpfに代えて,_kernel_mpf_<固定長メモリプー
     576ル名>を用いる.
     577
     578(6-7-3) エラー条件
     579
     580固定長メモリプールに関するエラー条件は次の通りである.
     581
     582*コンフィギュレータ本体が検出するもの
     583・同じmpfidに対するCRE_MPFが複数ある場合(E_OBJ)
     584
     585*パス2で検出するもの
     586・mpfatrが([TA_TPRI])でない場合(E_RSATR)
     587・blkcntが0以下の場合(E_PAR)
     588・blkszが0以下の場合(E_PAR)
     589・mpfmbがNULLでない場合(E_NOSPT)
     590
     591*パス3で検出するもの
     592・mpfが固定長メモリプール領域の先頭番地として正しくない場合(E_PAR)
     593        - ターゲット依存の値(CHECK_MPF_ALIGN)の倍数でない場合
     594        - NULLの場合(ターゲット依存,CHECK_MPF_NONNULL)
     595
     596(6-8) 周期ハンドラに関する定義
     597
     598周期ハンドラの省略記号は「CYC/cyc」である.以下では,システムコンフィ
     599ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
     600いて述べる.なお,周期ハンドラに必要なメモリ領域はない.
    706601
    707602CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs });
    708603
    709 (6-8-1) 周期ハンドラの初期化æƒ
    710 å ±
    711 
    712 å‘¨æœŸãƒãƒ³ãƒ‰ãƒ©åˆæœŸåŒ–ブロック中に生成する周期ハンドラの初期化æƒ
    713 å ±ã¯ï¼Œæ¬¡ã®
    714 å½¢å¼ã¨ã™ã‚‹ï¼Ž
     604(6-8-1) 周期ハンドラの初期化情報
     605
     606周期ハンドラ初期化ブロック中に生成する周期ハンドラの初期化情報は,次の
     607形式とする.
    715608
    716609        { (cycatr), (intptr_t)(exinf), (cychdr), (cyctim), (cycphs) }
    717610
    718 (6-8-2) エラー条件
    719 
    720 å‘¨æœŸãƒãƒ³ãƒ‰ãƒ©ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    721 
    722 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    723 ãƒ»åŒã˜cycidに対するCRE_CYCが複数ある場合(E_OBJ)
    724 
    725 ï¼Šãƒ‘ス2で検出するもの
    726 ãƒ»cycatrが([TA_STA])でない場合(E_RSATR)
    727 ãƒ»(0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
    728 ãƒ»(0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
    729 ãƒ»è­¦å‘Šï¼šcycatrにTA_STAが設定されていて,(cycphs == 0)の場合
    730 
    731 ï¼Šãƒ‘ス3で検出するもの
    732 ãƒ»cychdrがプログラムの開始番地として正しくない場合(E_PAR)
    733         - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
    734         - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
    735 
    736 (6-9) アラームハンドラに関する定義
    737 
    738 ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©ã®çœç•¥è¨˜å·ã¯ã€ŒALM/alm」である.以下では,システムコン
    739 ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれている時に生成すべきæƒ
    740 å ±
    741 ã«ã¤ã„て述べる.なお,アラームハンドラにå¿
    742 è¦ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã¯ãªã„.
     611(6-8-2) エラー条件
     612
     613周期ハンドラに関するエラー条件は次の通りである.
     614
     615*コンフィギュレータ本体が検出するもの
     616・同じcycidに対するCRE_CYCが複数ある場合(E_OBJ)
     617
     618*パス2で検出するもの
     619・cycatrが([TA_STA])でない場合(E_RSATR)
     620・(0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
     621・(0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
     622・警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
     623
     624*パス3で検出するもの
     625・cychdrがプログラムの開始番地として正しくない場合(E_PAR)
     626        - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
     627        - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
     628
     629(6-9) アラームハンドラに関する定義
     630
     631アラームハンドラの省略記号は「ALM/alm」である.以下では,システムコン
     632フィギュレーションファイルに次の静的APIが含まれている時に生成すべき情報
     633について述べる.なお,アラームハンドラに必要なメモリ領域はない.
    743634
    744635CRE_ALM(ID almid, { almatr, (intptr_t)(exinf), almhdr });
    745636
    746 (6-9-1) アラームハンドラの初期化æƒ
    747 å ±
    748 
    749 ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©åˆæœŸåŒ–ブロック中に生成するアラームハンドラの初期化æƒ
    750 å ±
    751 ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     637(6-9-1) アラームハンドラの初期化情報
     638
     639アラームハンドラ初期化ブロック中に生成するアラームハンドラの初期化情報
     640は,次の形式とする.
    752641
    753642        { (almatr), (exinf), (almhdr) }
    754643
    755 (6-9-2) エラー条件
    756 
    757 ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    758 
    759 ï¼Šã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿æœ¬ä½“が検出するもの
    760 ãƒ»åŒã˜almidに対するCRE_ALMが複数ある場合(E_OBJ)
    761 
    762 ï¼Šãƒ‘ス2で検出するもの
    763 ãƒ»almatrが(TA_NULL)でない場合(E_RSATR)
    764 
    765 ï¼Šãƒ‘ス3で検出するもの
    766 ãƒ»almhdrがプログラムの開始番地として正しくない場合(E_PAR)
    767         - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
    768         - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
    769 
    770 (7) 割込みに関する定義
    771 
    772 å‰²è¾¼ã¿ã«é–¢ã—て生成するæƒ
    773 å ±ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆæ¯Žã«å®šã‚ã‚‹ã“とができる.ターゲッ
    774 ãƒˆæ¯Žã«å®šã‚ãªã„場合には,以下で述べるターゲットに依存しない標準的なæƒ
    775 å ±
    776 ã‚’生成する.ターゲット毎に定める場合には,(7-1)と(7-3)に述べるæƒ
    777 å ±ã¯ç”Ÿ
    778 æˆã—ない((7-2)に述べるæƒ
    779 å ±ã¯ç”Ÿæˆã™ã‚‹ï¼‰ï¼Ž
    780 
    781 (7-1) 割込み要求ラインに関する定義
    782 
    783 å‰²è¾¼ã¿è¦æ±‚ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求
    784 ãƒ©ã‚¤ãƒ³ã«é–¢ã™ã‚‹å®šç¾©ã‚’生成する.å
    785 ·ä½“的には次の通り.
    786 
    787 ä»¥ä¸‹ã§ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれ
    788 ã¦ã„る時に生成すべきæƒ
    789 å ±ã«ã¤ã„て述べる.
     644(6-9-2) エラー条件
     645
     646アラームハンドラに関するエラー条件は次の通りである.
     647
     648*コンフィギュレータ本体が検出するもの
     649・同じalmidに対するCRE_ALMが複数ある場合(E_OBJ)
     650
     651*パス2で検出するもの
     652・almatrが(TA_NULL)でない場合(E_RSATR)
     653
     654*パス3で検出するもの
     655・almhdrがプログラムの開始番地として正しくない場合(E_PAR)
     656        - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
     657        - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
     658
     659(7) 割込みに関する定義
     660
     661割込みに関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
     662ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
     663を生成する.ターゲット毎に定める場合には,(7-1)と(7-3)に述べる情報は生
     664成しない((7-2)に述べる情報は生成する).
     665
     666(7-1) 割込み要求ラインに関する定義
     667
     668割込み要求ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求
     669ラインに関する定義を生成する.具体的には次の通り.
     670
     671以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
     672ている時に生成すべき情報について述べる.
    790673
    791674CFG_INT(INTNO intno, { intatr, intpri });
    792675
    793 (7-1-1) 設定する割込み要求ラインの数
    794 
    795 è¨­å®šã™ã‚‹å‰²è¾¼ã¿è¦æ±‚ラインの数をマクロ定義するプリプロセッサディレクティ
    796 ãƒ–(#define)を生成する.また,その値を持つ変数の定義を生成する.å
    797 ·ä½“çš„
    798 ã«ã¯ï¼Œæ¬¡ã®ã‚ˆã†ãªè¡Œã‚’生成する.
    799 
    800 #define TNUM_INTNO <設定する割込み要求ラインの数>
     676(7-1-1) 設定する割込み要求ラインの数
     677
     678設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ
     679ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
     680には,次のような行を生成する.
     681
     682#define TNUM_INTNO <設定する割込み要求ラインの数>
    801683const uint_t    _kernel_tnum_intno = TNUM_INTNO;
    802684
    803 (7-1-2) 割込み要求ライン初期化ブロックの定義
    804 
    805 å‰²è¾¼ã¿è¦æ±‚ライン初期化ブロックを生成する.å
    806 ·ä½“的には,次のような行を生
    807 æˆã™ã‚‹ï¼Ž
     685(7-1-2) 割込み要求ライン初期化ブロックの定義
     686
     687割込み要求ライン初期化ブロックを生成する.具体的には,次のような行を生
     688成する.
    808689
    809690const INTINIB _kernel_intinib_table[TNUM_INTNO] = {
    810         <割込み要求ライン1の初期化æƒ
    811 å ±>,
    812         <割込み要求ライン2の初期化æƒ
    813 å ±>,
    814                                 ……
    815         <割込み要求ラインTNUM_INTNOの初期化æƒ
    816 å ±>
     691        <割込み要求ライン1の初期化情報>,
     692        <割込み要求ライン2の初期化情報>,
     693                                ……
     694        <割込み要求ラインTNUM_INTNOの初期化情報>
    817695};
    818696
    819 ã“の中の割込み要求ラインの初期化æƒ
    820 å ±ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     697この中の割込み要求ラインの初期化情報は,次の形式とする.
    821698
    822699        { (intno), (intatr), (intpri) }
    823700
    824 (7-1-3) エラー条件
    825 
    826 å‰²è¾¼ã¿è¦æ±‚ラインに関するエラー条件は次の通りである.
    827 
    828 ï¼Šãƒ‘ス2で検出するもの
    829 ãƒ»intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
    830 ãƒ»intnoがCFG_INTによって設定済みの場合(E_OBJ)
    831 ãƒ»intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
    832         ※ ターゲット依存部で割込み属性を追加可(TARGET_INTATR)
    833 ãƒ»ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã«å›ºå®šã•ã‚Œã¦ã„ã‚‹intnoに対して,intpriにTMIN_INTPRIよりも
    834 ã€€å°ã•ã„値が指定された場合(E_OBJ)
    835 ãƒ»ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–に固定されているintnoに対して,intpriにTMIN_INTPRIより
    836 ã€€ã‚‚小さい値が指定されなかった場合(E_OBJ)
    837 ãƒ»intpriがCFG_INTに対する割込み優å
    838 ˆåº¦ã¨ã—て正しくない場合(E_PAR)
    839 
    840 ï¼Šå¿
    841 è¦ã«å¿œã˜ã¦ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§æ¤œå‡ºã™ã‚‹ã‚‚の
    842 ãƒ»intatrが割込み属性として設定できない値の場合(E_RSATR)
    843 ãƒ»intpriが割込み優å
    844 ˆåº¦ã¨ã—て設定できない値の場合(E_PAR)
    845 ãƒ»åŒä¸€ã®å‰²è¾¼ã¿å„ªå
    846 ˆåº¦ã—か設定できない割込み要求ラインに対して,異なる割
    847 ã€€è¾¼ã¿å„ªå
    848 ˆåº¦ã‚’設定した場合(E_PAR)
    849 
    850 (7-2) 割込みサービスルーチンに関する定義
    851 
    852 (7-2-1) 割込みハンドラの生成
    853 
    854 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«å«ã¾ã‚Œã‚‹å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチ
    855 ãƒ³ã‚’追加する静的API「ATT_ISR」に対して,同一の割込み番号に対して追加さ
    856 ã‚ŒãŸå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンを順に呼び出す関数を生成する.
    857 
    858 å
    859 ·ä½“的には,同一の割込み番号に対して割込みサービスルーチンを追加する
     701(7-1-3) エラー条件
     702
     703割込み要求ラインに関するエラー条件は次の通りである.
     704
     705*パス2で検出するもの
     706・intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
     707・intnoがCFG_INTによって設定済みの場合(E_OBJ)
     708・intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
     709        ※ ターゲット依存部で割込み属性を追加可(TARGET_INTATR)
     710・カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIよりも
     711 小さい値が指定された場合(E_OBJ)
     712・カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRIより
     713 も小さい値が指定されなかった場合(E_OBJ)
     714・intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
     715
     716*必要に応じてターゲット依存部で検出するもの
     717・intatrが割込み属性として設定できない値の場合(E_RSATR)
     718・intpriが割込み優先度として設定できない値の場合(E_PAR)
     719・同一の割込み優先度しか設定できない割込み要求ラインに対して,異なる割
     720 込み優先度を設定した場合(E_PAR)
     721
     722(7-2) 割込みサービスルーチンに関する定義
     723
     724(7-2-1) 割込みハンドラの生成
     725
     726システムコンフィギュレーションファイル中に含まれる割込みサービスルーチ
     727ンを追加する静的API「ATT_ISR」に対して,同一の割込み番号に対して追加さ
     728れた割込みサービスルーチンを順に呼び出す関数を生成する.
     729
     730具体的には,同一の割込み番号に対して割込みサービスルーチンを追加する
    860731
    861732ATT_ISR({ isratr_1, exinf_1, intno, isr_1, isrpri_1 });
    862733ATT_ISR({ isratr_2, exinf_2, intno, isr_2, isrpri_2 });
    863         ……
     734        ……
    864735ATT_ISR({ isratr_n, exinf_n, intno, isr_n, isrpri_n });
    865736
    866 ã¨ã„う静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
    867 isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
    868 å€¤ãŒåŒã˜ã‚‚のの間では,システムコンフィギュレーションファイル中での静的
    869 APIの順序の通りに並んでいるものとする.
     737という静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
     738isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
     739値が同じものの間では,システムコンフィギュレーションファイル中での静的
     740APIの順序の通りに並んでいるものとする.
    870741
    871742static void
     
    877748        saved_ipm = i_get_ipm();
    878749
    879         LOG_ISR_ENTER(<intno>);         /* ISR1の呼出し */
     750        LOG_ISR_ENTER(<intno>);         /* ISR1の呼出し */
    880751        isr_1((intptr_t)(exinf_1));
    881752        LOG_ISR_LEAVE(intno);
    882753
    883         if (i_sense_lock()) {           /* ISRの呼出し前の状æ
    884 ‹ã«æˆ»ã™ */
     754        if (i_sense_lock()) {           /* ISRの呼出し前の状態に戻す */
    885755                i_unlock_cpu();
    886756        }
    887757        i_set_ipm(saved_ipm);
    888758
    889         LOG_ISR_ENTER(<intno>);         /* ISR2の呼出し */
     759        LOG_ISR_ENTER(<intno>);         /* ISR2の呼出し */
    890760        isr_2((intptr_t)(exinf_2));
    891761        LOG_ISR_LEAVE(intno);
    892762
    893         if (i_sense_lock()) {           /* ISRの呼出し前の状æ
    894 ‹ã«æˆ»ã™ */
     763        if (i_sense_lock()) {           /* ISRの呼出し前の状態に戻す */
    895764                i_unlock_cpu();
    896765        }
    897766        i_set_ipm(saved_ipm);
    898767
    899         ……
    900 
    901         LOG_ISR_ENTER(<intno>);         /* ISRnの呼出し */
     768        ……
     769
     770        LOG_ISR_ENTER(<intno>);         /* ISRnの呼出し */
    902771        isr_n((intptr_t)(exinf_n));
    903772        LOG_ISR_LEAVE(intno);
     
    906775}
    907776
    908 ã“こで,ISRnの呼出しの後に呼出し前の状æ
    909 ‹ã«æˆ»ã•ãªã„のは,割込みハンドラ
    910 ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ã«ã‚ˆã‚Šï¼Œã‚«ãƒ¼ãƒãƒ«ãŒå
    911 ƒã®çŠ¶æ
    912 ‹ã«æˆ»ã™ãŸã‚ã§ã‚る.
    913 
    914 åŒä¸€ã®å‰²è¾¼ã¿ç•ªå·ã«å¯¾ã—て追加された割込みサービスルーチンが1つのみの場合
    915 ã«ã¯ï¼Œæ¬¡ã®ã‚ˆã†ãªé–¢æ•°ã‚’生成する.
     777ここで,ISRnの呼出しの後に呼出し前の状態に戻さないのは,割込みハンドラ
     778からのリターンにより,カーネルが元の状態に戻すためである.
     779
     780同一の割込み番号に対して追加された割込みサービスルーチンが1つのみの場合
     781には,次のような関数を生成する.
    916782
    917783static void
     
    925791}
    926792
    927 ã€èª²é¡Œã€‘ここで,LOG_ISR_ENTER,LOG_ISR_LEAVEの引数をどうするかが課題と
    928 ã—て残っている.ATT_ISRで登録されたISRに対してはISR IDが付与されないた
    929 ã‚ï¼ŒIDでISRを区別することができない.やむなく割込み番号を渡しているが,
    930 æ‹¡å¼µæƒ
    931 å ±ï¼ˆexinf)も渡すべきかもしれない.
    932 
    933 (7-2-2) 割込みハンドラの定義に相当する処理
    934 
    935 ä¸Šã®ã‚ˆã†ã«å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‚’生成した場合には,次に説明する割込みハンドラ
    936 ã«é–¢ã™ã‚‹å®šç¾©ã«ãŠã„て,システムコンフィギュレーションファイル中に次の静
    937 çš„APIが含まれているのと同様に処理する.
     793【課題】ここで,LOG_ISR_ENTER,LOG_ISR_LEAVEの引数をどうするかが課題と
     794して残っている.ATT_ISRで登録されたISRに対してはISR IDが付与されないた
     795め,IDでISRを区別することができない.やむなく割込み番号を渡しているが,
     796拡張情報(exinf)も渡すべきかもしれない.
     797
     798(7-2-2) 割込みハンドラの定義に相当する処理
     799
     800上のように割込みハンドラを生成した場合には,次に説明する割込みハンドラ
     801に関する定義において,システムコンフィギュレーションファイル中に次の静
     802的APIが含まれているのと同様に処理する.
    938803
    939804DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> });
    940805
    941 ã“こでinhnoは,intnoに対応する割込みハンドラ番号である.
    942 
    943 (7-2-3) エラー条件
    944 
    945 å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンに関するエラー条件は次の通りである.
    946 
    947 ï¼Šãƒ‘ス2で検出するもの
    948 ãƒ»isratrが(TA_NULL)でない場合(E_RSATR)
    949         ※ ターゲット依存部で割込みサービスルーチン属性を追加可(TARGET_ISRATR)
    950 ãƒ»intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
    951         ※ intnoに対応するinhnoがない場合を含む
    952 ãƒ»(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
    953 ãƒ»intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
    954 ãƒ»intnoに対するCFG_INTがない場合(E_OBJ)
    955 ãƒ»intnoに対してCFG_INTで設定された割込み優å
    956 ˆåº¦ãŒTMIN_INTPRIよりも小さい
    957 ã€€å ´åˆï¼ˆE_OBJ)
    958         ※ カーネル管理外のISRはサポートしないため
    959 
    960 ï¼Šå¯èƒ½ã§ã‚ればターゲット依存部で検出するもの
    961 ãƒ»isrがプログラムの開始番地として正しくない場合(E_PAR)
    962 
    963 (7-3) 割込みハンドラに関する定義
    964 
    965 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‚’定義する静的API「DEF_INH」で定義した割込みハンドラ(上
    966 è¿°ã®å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンの追加によりコンフィギュレータが生成した割込
    967 ã¿ãƒãƒ³ãƒ‰ãƒ©ã‚’含む)に関する定義を生成する.å
    968 ·ä½“的には次の通り.
    969 
    970 ä»¥ä¸‹ã§ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれ
    971 ã¦ã„る時に生成すべきæƒ
    972 å ±ã«ã¤ã„て述べる.
     806ここでinhnoは,intnoに対応する割込みハンドラ番号である.
     807
     808(7-2-3) エラー条件
     809
     810割込みサービスルーチンに関するエラー条件は次の通りである.
     811
     812*パス2で検出するもの
     813・isratrが(TA_NULL)でない場合(E_RSATR)
     814        ※ ターゲット依存部で割込みサービスルーチン属性を追加可(TARGET_ISRATR)
     815・intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
     816        ※ intnoに対応するinhnoがない場合を含む
     817・(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
     818・intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
     819・intnoに対するCFG_INTがない場合(E_OBJ)
     820・intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRIよりも小さい
     821 場合(E_OBJ)
     822        ※ カーネル管理外のISRはサポートしないため
     823
     824*可能であればターゲット依存部で検出するもの
     825・isrがプログラムの開始番地として正しくない場合(E_PAR)
     826
     827(7-3) 割込みハンドラに関する定義
     828
     829割込みハンドラを定義する静的API「DEF_INH」で定義した割込みハンドラ(上
     830述の割込みサービスルーチンの追加によりコンフィギュレータが生成した割込
     831みハンドラを含む)に関する定義を生成する.具体的には次の通り.
     832
     833以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
     834ている時に生成すべき情報について述べる.
    973835
    974836DEF_INH(inhno, { inhatr, inthdr });
    975837
    976 (7-3-1) 定義する割込みハンドラの数
    977 
    978 å®šç¾©ã™ã‚‹å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®æ•°ã‚’マクロ定義するプリプロセッサディレクティブ
    979 ï¼ˆ#define)を生成する.また,その値を持つ変数の定義を生成する.å
    980 ·ä½“çš„
    981 ã«ã¯ï¼Œæ¬¡ã®ã‚ˆã†ãªè¡Œã‚’生成する.
    982 
    983 #define TNUM_INHNO <定義する割込みハンドラの数>
     838(7-3-1) 定義する割込みハンドラの数
     839
     840定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
     841(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
     842には,次のような行を生成する.
     843
     844#define TNUM_INHNO <定義する割込みハンドラの数>
    984845const uint_t    _kernel_tnum_inhno = TNUM_INHNO;
    985846
    986 (7-3-2) 割込みハンドラの出å
    987 ¥å£å‡¦ç†
    988 
    989 å®šç¾©ã™ã‚‹å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©æ¯Žã«ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®å‡ºå
    990 ¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成す
    991 ã‚‹ï¼Žå
    992 ·ä½“的には,次のような行を生成する.
     847(7-3-2) 割込みハンドラの出入口処理
     848
     849定義する割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成す
     850る.具体的には,次のような行を生成する.
    993851
    994852INTHDR_ENTRY(inhno, inhno_num, inthdr)
    995853
    996 ã“こでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
    997 ã‚¢ã‚»ãƒ³ãƒ–リ言語記述に使用するためのものである.
    998 
    999 (7-3-3) 割込みハンドラ初期化ブロックの定義
    1000 
    1001 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©åˆæœŸåŒ–ブロックを生成する.å
    1002 ·ä½“的には,次のような行を生成
    1003 ã™ã‚‹ï¼Ž
     854ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
     855アセンブリ言語記述に使用するためのものである.
     856
     857(7-3-3) 割込みハンドラ初期化ブロックの定義
     858
     859割込みハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
     860する.
    1004861
    1005862const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {
    1006         <割込みハンドラ1の初期化æƒ
    1007 å ±>,
    1008         <割込みハンドラ2の初期化æƒ
    1009 å ±>,
    1010                                 ……
    1011         <割込みハンドラTNUM_INHNOの初期化æƒ
    1012 å ±>
     863        <割込みハンドラ1の初期化情報>,
     864        <割込みハンドラ2の初期化情報>,
     865                                ……
     866        <割込みハンドラTNUM_INHNOの初期化情報>
    1013867};
    1014868
    1015 ã“の中の割込みハンドラの初期化æƒ
    1016 å ±ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     869この中の割込みハンドラの初期化情報は,次の形式とする.
    1017870
    1018871        { (inhno), (inhatr), (FP)(INT_ENTRY(inhno, inthdr)) }
    1019872
    1020 (7-3-4) エラー条件
    1021 
    1022 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    1023 
    1024 ï¼Šãƒ‘ス2で検出するもの
    1025 ãƒ»inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
    1026 ãƒ»inhnoがDEF_INHによって設定済みの場合(E_OBJ)
    1027 #・inhnoに対応するintnoに対してATT_ISRがある場合(E_OBJ)
    1028 #       â€» inhnoに対応するintnoがない場合には,このチェックを行わない
    1029 #       â†’ このチェックは,割込みサービスルーチン側で行う
    1030 ãƒ»inhatrが(TA_NULL)でない場合(E_RSATR)
    1031         ※ ターゲット依存部で割込みハンドラ属性を追加可(TARGET_INHATR)
    1032         ※ TA_NONKERNELを使う場合には,TARGET_INHATRに設定する
    1033 ãƒ»ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã«å›ºå®šã•ã‚Œã¦ã„ã‚‹inhnoに対して,inhatrにTA_NONKERNELが指定
    1034 ã€€ã•ã‚Œã¦ã„る場合(E_RSATR)
    1035 ãƒ»ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
    1036 ã€€å®šã•ã‚Œã¦ã„ない場合(E_RSATR)
    1037 ãƒ»inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
    1038         ※ inhnoに対応するintnoがない場合には,このチェックを行わない
    1039 ãƒ»inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintnoに対して
    1040 ã€€CFG_INTで設定された割込み優å
    1041 ˆåº¦ãŒTMIN_INTPRIよりも小さい場合(E_OBJ)
    1042         ※ inhnoに対応するintnoがない場合には,このチェックを行わない
    1043 ãƒ»inhatrにTA_NONKERNELが指定されており,inhnoに対応するintnoに対して
    1044 ã€€CFG_INTで設定された割込み優å
    1045 ˆåº¦ãŒTMIN_INTPRI以上である場合(E_OBJ)
    1046         ※ inhnoに対応するintnoがない場合には,このチェックを行わない
    1047 
    1048 ï¼Šå¯èƒ½ã§ã‚ればターゲット依存部で検出するもの
    1049 ãƒ»inthdrがプログラムの開始番地として正しくない場合(E_PAR)
    1050 
    1051 (8) CPU例外に関する定義
    1052 
    1053 CPU例外に関して生成するæƒ
    1054 å ±ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆæ¯Žã«å®šã‚ã‚‹ã“とができる.ターゲッ
    1055 ãƒˆæ¯Žã«å®šã‚ãªã„場合には,以下で述べるターゲットに依存しない標準的なæƒ
    1056 å ±
    1057 ã‚’生成する.ターゲット毎に定める場合には,これらのæƒ
    1058 å ±ã¯ç”Ÿæˆã•ã‚Œãªã„.
    1059 
    1060 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«ï¼ŒCPU例外ハンドラを定義する
    1061 é™çš„API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
    1062 ç”Ÿæˆã™ã‚‹ï¼Ž
    1063 
    1064 ä»¥ä¸‹ã§ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれ
    1065 ã¦ã„る時に生成すべきæƒ
    1066 å ±ã«ã¤ã„て述べる.
     873(7-3-4) エラー条件
     874
     875割込みハンドラに関するエラー条件は次の通りである.
     876
     877*パス2で検出するもの
     878・inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
     879・inhnoがDEF_INHによって設定済みの場合(E_OBJ)
     880#・inhnoに対応するintnoに対してATT_ISRがある場合(E_OBJ)
     881#       ※ inhnoに対応するintnoがない場合には,このチェックを行わない
     882#       → このチェックは,割込みサービスルーチン側で行う
     883・inhatrが(TA_NULL)でない場合(E_RSATR)
     884        ※ ターゲット依存部で割込みハンドラ属性を追加可(TARGET_INHATR)
     885        ※ TA_NONKERNELを使う場合には,TARGET_INHATRに設定する
     886・カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指定
     887 されている場合(E_RSATR)
     888・カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
     889 定されていない場合(E_RSATR)
     890・inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
     891        ※ inhnoに対応するintnoがない場合には,このチェックを行わない
     892・inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintnoに対して
     893 CFG_INTで設定された割込み優先度がTMIN_INTPRIよりも小さい場合(E_OBJ)
     894        ※ inhnoに対応するintnoがない場合には,このチェックを行わない
     895・inhatrにTA_NONKERNELが指定されており,inhnoに対応するintnoに対して
     896 CFG_INTで設定された割込み優先度がTMIN_INTPRI以上である場合(E_OBJ)
     897        ※ inhnoに対応するintnoがない場合には,このチェックを行わない
     898
     899*可能であればターゲット依存部で検出するもの
     900・inthdrがプログラムの開始番地として正しくない場合(E_PAR)
     901
     902(8) CPU例外に関する定義
     903
     904CPU例外に関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
     905ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
     906を生成する.ターゲット毎に定める場合には,これらの情報は生成されない.
     907
     908システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
     909静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
     910生成する.
     911
     912以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
     913ている時に生成すべき情報について述べる.
    1067914
    1068915DEF_EXC(excno, { excatr, exchdr });
    1069916
    1070 (8-1) 定義するCPU例外ハンドラの数
    1071 
    1072 å®šç¾©ã™ã‚‹CPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
    1073 ãƒ–(#define)を生成する.また,その値を持つ変数の定義を生成する.å
    1074 ·ä½“
    1075 çš„には,次のような行を生成する.
    1076 
    1077 #define TNUM_EXCNO <定義するCPU例外ハンドラの数>
     917(8-1) 定義するCPU例外ハンドラの数
     918
     919定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
     920ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
     921的には,次のような行を生成する.
     922
     923#define TNUM_EXCNO <定義するCPU例外ハンドラの数>
    1078924const uint_t    _kernel_tnum_excno = TNUM_EXCNO;
    1079925
    1080 (8-2) CPU例外ハンドラの出å
    1081 ¥å£å‡¦ç†
    1082 
    1083 å®šç¾©ã™ã‚‹CPU例外ハンドラ毎に,CPU例外ハンドラの出å
    1084 ¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成
    1085 ã™ã‚‹ï¼Žå
    1086 ·ä½“的には,次のような行を生成する.
     926(8-2) CPU例外ハンドラの出入口処理
     927
     928定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生成
     929する.具体的には,次のような行を生成する.
    1087930
    1088931EXCHDR_ENTRY(excno, excno_num, exchdr)
    1089932
    1090 ã“こでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
    1091 ã‚¢ã‚»ãƒ³ãƒ–リ言語記述に使用するためのものである.
    1092 
    1093 (8-3) CPU例外ハンドラ初期化ブロックの定義
    1094 
    1095 CPU例外ハンドラ初期化ブロックを生成する.å
    1096 ·ä½“的には,次のような行を生成
    1097 ã™ã‚‹ï¼Ž
     933ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
     934アセンブリ言語記述に使用するためのものである.
     935
     936(8-3) CPU例外ハンドラ初期化ブロックの定義
     937
     938CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
     939する.
    1098940
    1099941const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {
    1100         <CPU例外ハンドラ1の初期化æƒ
    1101 å ±>,
    1102         <CPU例外ハンドラ2の初期化æƒ
    1103 å ±>,
    1104                                 ……
    1105         <CPU例外ハンドラTNUM_EXCNOの初期化æƒ
    1106 å ±>
     942        <CPU例外ハンドラ1の初期化情報>,
     943        <CPU例外ハンドラ2の初期化情報>,
     944                                ……
     945        <CPU例外ハンドラTNUM_EXCNOの初期化情報>
    1107946};
    1108947
    1109 ã“の中のCPU例外ハンドラの初期化æƒ
    1110 å ±ã¯ï¼Œæ¬¡ã®å½¢å¼ã¨ã™ã‚‹ï¼Ž
     948この中のCPU例外ハンドラの初期化情報は,次の形式とする.
    1111949
    1112950        { (excno), (excatr), (FP)(EXC_ENTRY(excno, exchdr)) }
    1113951
    1114 (8-4) エラー条件
    1115 
    1116 CPU例外ハンドラに関するエラー条件は次の通りである.
    1117 
    1118 ï¼Šãƒ‘ス2で検出するもの
    1119 ãƒ»excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
    1120 ãƒ»excnoがDEF_EXCによって設定済みの場合(E_OBJ)
    1121 ãƒ»excatrが(TA_NULL)でない場合(E_RSATR)
    1122         ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR)
    1123 
    1124 ï¼Šå¯èƒ½ã§ã‚ればターゲット依存部で検出するもの
    1125 ãƒ»exchdrがプログラムの開始番地として正しくない場合(E_PAR)
    1126 
    1127 (9) 非タスクコンテキスト用のスタック領域に関する定義
    1128 
    1129 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«é–¢ã™ã‚‹å®šç¾©ã¯ï¼Œå¿
    1130 ãšç”Ÿæˆã—なければ
    1131 ãªã‚‰ãªã„.
    1132 
    1133 (9-1) DEF_ICSがない場合
    1134 
    1135 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«ï¼Œé™çš„API「DEF_ICS」が含まれて
    1136 ã„ない場合には,次の行を生成する.
     952(8-4) エラー条件
     953
     954CPU例外ハンドラに関するエラー条件は次の通りである.
     955
     956*パス2で検出するもの
     957・excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
     958・excnoがDEF_EXCによって設定済みの場合(E_OBJ)
     959・excatrが(TA_NULL)でない場合(E_RSATR)
     960        ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR)
     961
     962*可能であればターゲット依存部で検出するもの
     963・exchdrがプログラムの開始番地として正しくない場合(E_PAR)
     964
     965(9) 非タスクコンテキスト用のスタック領域に関する定義
     966
     967非タスクコンテキスト用のスタック領域に関する定義は,必ず生成しなければ
     968ならない.
     969
     970(9-1) DEF_ICSがない場合
     971
     972システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
     973いない場合には,次の行を生成する.
    1137974
    1138975#ifdef DEFAULT_ISTK
     
    1149986#endif /* DEFAULT_ISTK */
    1150987
    1151 (9-2) DEF_ICSがある場合
    1152 
    1153 ä»¥ä¸‹ã§ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®é™çš„APIが含まれて
    1154 ã„る時に生成すべきæƒ
    1155 å ±ã«ã¤ã„て述べる.
     988(9-2) DEF_ICSがある場合
     989
     990以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
     991いる時に生成すべき情報について述べる.
    1156992
    1157993DEF_ICS({ istksz, istk });
    1158994
    1159 istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
    1160 ã‚¯é ˜åŸŸã‚’確保し,非タスクコンテキスト用のスタック領域の初期化æƒ
    1161 å ±ã‚’生成
    1162 ã™ã‚‹ï¼Žå
    1163 ·ä½“的には,上記の静的APIに対して,次の行を生成する.
     995istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
     996ク領域を確保し,非タスクコンテキスト用のスタック領域の初期化情報を生成
     997する.具体的には,上記の静的APIに対して,次の行を生成する.
    1164998
    1165999static STK_T                            _kernel_istack[COUNT_STK_T(istksz)];
     
    11671001#define TOPPERS_ISTK            _kernel_istack
    11681002
    1169 istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
    1170 æƒ
    1171 å ±ã‚’,次の形式で生成する.
     1003istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
     1004情報を,次の形式で生成する.
    11721005
    11731006#define TOPPERS_ISTKSZ          (istksz)
    11741007#define TOPPERS_ISTK            (istk)
    11751008
    1176 (9-3) 変数の生成
    1177 
    1178 DEF_ICSの有無によらず,次の定義を生成する.
     1009(9-3) 変数の生成
     1010
     1011DEF_ICSの有無によらず,次の定義を生成する.
    11791012
    11801013const SIZE              _kernel_istksz = TOPPERS_ISTKSZ;
     
    11851018#endif /* TOPPERS_ISTKPT */
    11861019
    1187 (9-4) エラー条件
    1188 
    1189 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    1190 
    1191 ï¼Šãƒ‘ス2で検出するもの
    1192 ãƒ»é™çš„API「DEF_ICS」が複数ある(E_OBJ)
    1193 ãƒ»istkszが0以下か,ターゲット定義の最小値(TARGET_MIN_ISTKSZ)よりも小
    1194 ã€€ã•ã„場合(E_PAR)
    1195 ãƒ»istkszがスタック領域のサイズとして正しくない場合(E_PAR)
    1196         - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
    1197         ※ このエラーチェックは,istkがNULLでない場合にのみ行う
    1198 
    1199 ï¼Šãƒ‘ス3で検出するもの
    1200 ãƒ»istkがスタック領域のå
    1201 ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)
    1202         - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
    1203         - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
    1204 
    1205 (10) タイムイベント管理に関する定義
    1206 
    1207 ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆç®¡ç†ã«é–¢é€£ã—て,次の定義を生成する.
     1020(9-4) エラー条件
     1021
     1022非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
     1023
     1024*パス2で検出するもの
     1025・静的API「DEF_ICS」が複数ある(E_OBJ)
     1026・istkszが0以下か,ターゲット定義の最小値(TARGET_MIN_ISTKSZ)よりも小
     1027 さい場合(E_PAR)
     1028・istkszがスタック領域のサイズとして正しくない場合(E_PAR)
     1029        - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
     1030        ※ このエラーチェックは,istkがNULLでない場合にのみ行う
     1031
     1032*パス3で検出するもの
     1033・istkがスタック領域の先頭番地として正しくない場合(E_PAR)
     1034        - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
     1035        - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
     1036
     1037(10) タイムイベント管理に関する定義
     1038
     1039タイムイベント管理に関連して,次の定義を生成する.
    12081040
    12091041TMEVTN  _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
    12101042
    1211 (11) 各モジュールの初期化関数の定義
    1212 
    1213 å„カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
    1214 åˆæœŸåŒ–関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
    1215 ã®3つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
     1043(11) 各モジュールの初期化関数の定義
     1044
     1045各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
     1046初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
     1047の3つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
    12161048
    12171049        _kernel_initialize_task
     
    12191051        _kernel_initialize_exception
    12201052
    1221 ã™ã¹ã¦ã®æ©Ÿèƒ½ã‚’使った場合に生成される関数は次の通りである.
     1053すべての機能を使った場合に生成される関数は次の通りである.
    12221054
    12231055void
     
    12371069}
    12381070
    1239 (12) 初期化ルーチンの実行関数の定義
    1240 
    1241 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«å«ã¾ã‚Œã‚‹åˆæœŸåŒ–ルーチンを追加
    1242 ã™ã‚‹é™çš„API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
    1243 æ•°ã‚’生成する.å
    1244 ·ä½“的には,
     1071(12) 初期化ルーチンの実行関数の定義
     1072
     1073システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
     1074する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
     1075数を生成する.具体的には,
    12451076
    12461077ATT_INI({ iniatr, exinf, inirtn });
    12471078
    1248 ã¨ã„う静的APIに対して,
     1079という静的APIに対して,
    12491080
    12501081        (inirtn)((intptr_t)(exinf));
    12511082
    1252 ã‚’呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
    1253 ãƒ³ã‚’呼び出す順序は,システムコンフィギュレーションファイル中での静的
    1254 APIの順序に一致させる.
    1255 
    1256 ä¾‹ãˆã°ï¼Œ
     1083を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
     1084ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
     1085APIの順序に一致させる.
     1086
     1087例えば,
    12571088
    12581089ATT_INI({ TA_NULL, 0, timer_initialize });
    12591090ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
    12601091
    1261 ã¨ã„う2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
    1262 ã‚‹ï¼Ž
     1092という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
     1093る.
    12631094
    12641095void
     
    12691100}
    12701101
    1271 (12-1) エラー条件
    1272 
    1273 åˆæœŸåŒ–ルーチンに関するエラー条件は次の通りである.
    1274 
    1275 ï¼Šãƒ‘ス2で検出するもの
    1276 ãƒ»iniatrが(TA_NULL)でない場合(E_RSATR)
    1277 
    1278 ï¼Šå¯èƒ½ã§ã‚ればターゲット依存部で検出するもの
    1279 ãƒ»inirtnがプログラムの開始番地として正しくない場合(E_PAR)
    1280 
    1281 (13) 終了処理ルーチンの実行関数の定義
    1282 
    1283 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«å«ã¾ã‚Œã‚‹çµ‚了処理ルーチンを追
    1284 åŠ ã™ã‚‹é™çš„API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
    1285 ã™é–¢æ•°ã‚’生成する.å
    1286 ·ä½“的には,
     1102(12-1) エラー条件
     1103
     1104初期化ルーチンに関するエラー条件は次の通りである.
     1105
     1106*パス2で検出するもの
     1107・iniatrが(TA_NULL)でない場合(E_RSATR)
     1108
     1109*可能であればターゲット依存部で検出するもの
     1110・inirtnがプログラムの開始番地として正しくない場合(E_PAR)
     1111
     1112(13) 終了処理ルーチンの実行関数の定義
     1113
     1114システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
     1115加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
     1116す関数を生成する.具体的には,
    12871117
    12881118ATT_TER({ teratr, exinf, terrtn });
    12891119
    1290 ã¨ã„う静的APIに対して,
     1120という静的APIに対して,
    12911121
    12921122        (terrtn)((intptr_t)(exinf));
    12931123
    1294 ã‚’呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
    1295 ãƒãƒ³ã‚’呼び出す順序は,システムコンフィギュレーションファイル中での静的
    1296 APIの逆順に一致させる.
    1297 
    1298 ä¾‹ãˆã°ï¼Œ
     1124を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
     1125チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
     1126APIの逆順に一致させる.
     1127
     1128例えば,
    12991129
    13001130ATT_TER({ TA_NULL, 0, timer_terminate });
    13011131ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
    13021132
    1303 ã¨ã„う2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
    1304 ã‚‹ï¼Ž
     1133という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
     1134る.
    13051135
    13061136void
     
    13111141}
    13121142
    1313 (13-1) エラー条件
    1314 
    1315 çµ‚了処理ルーチンに関するエラー条件は次の通りである.
    1316 
    1317 ï¼Šãƒ‘ス2で検出するもの
    1318 ãƒ»teratrが(TA_NULL)でない場合(E_RSATR)
    1319 
    1320 ï¼Šå¯èƒ½ã§ã‚ればターゲット依存部で検出するもの
    1321 ãƒ»terrtnがプログラムの開始番地として正しくない場合(E_PAR)
    1322 
    1323 ä»¥ä¸Š
     1143(13-1) エラー条件
     1144
     1145終了処理ルーチンに関するエラー条件は次の通りである.
     1146
     1147*パス2で検出するもの
     1148・teratrが(TA_NULL)でない場合(E_RSATR)
     1149
     1150*可能であればターゲット依存部で検出するもの
     1151・terrtnがプログラムの開始番地として正しくない場合(E_PAR)
     1152
     1153以上
  • rubycfg_asp/trunk/asp_dcre/doc/design.txt

    • Property svn:mime-type changed from text/plain to text/plane; charset=UTF-8
    r313 r315  
    11
    2                 TOPPERS/ASPカーネル
    3                 設計メモ
    4 
    5                 対応バージョン: Release 1.9.3
    6                 最終更新: 2014å¹´4月15日(作成中)
    7 
    8 ã“のドキュメントは,TOPPERS/ASPカーネルの設計メモである.作成途中のもの
    9 ã§ã‚り,網ç¾
    10 çš„ではない.
     2                TOPPERS/ASPカーネル
     3                設計メモ
     4
     5                対応バージョン: Release 1.9.3
     6                最終更新: 2014年4月15日(作成中)
     7
     8このドキュメントは,TOPPERS/ASPカーネルの設計メモである.作成途中のもの
     9であり,網羅的ではない.
    1110
    1211----------------------------------------------------------------------
     
    1817             Graduate School of Information Science, Nagoya Univ., JAPAN
    1918 
    20  ä¸Šè¨˜è‘—作権è€
    21 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    22  ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    23  å¤‰ãƒ»å†é
    24 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    25  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    26      æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    27      ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    28  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    29      ç”¨ã§ãã‚‹å½¢ã§å†é
    30 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    31 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    32      è€
    33 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    34      ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    35  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    36      ç”¨ã§ããªã„形で再é
    37 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    38      ã¨ï¼Ž
    39    (a) 再é
    40 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    41 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    42        ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    43    (b) 再é
    44 å¸ƒã®å½¢æ
    45 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    46        å ±å‘Šã™ã‚‹ã“と.
    47  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    48      å®³ã‹ã‚‰ã‚‚,上記著作権è€
    49 ãŠã‚ˆã³TOPPERSプロジェクトをå
    50 è²¬ã™ã‚‹ã“と.
    51      ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    52      ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    53 ãŠã‚ˆã³TOPPERSプロジェクトを
    54      å
    55 è²¬ã™ã‚‹ã“と.
     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     免責すること.
    5641 
    57  æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    58 ãŠ
    59  ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    60  ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    61  ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    62  ã®è²¬ä»»ã‚’負わない.
     42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     46 の責任を負わない.
    6347 
    6448 $Id$
    6549----------------------------------------------------------------------
    6650
    67 â—‹ç›®æ¬¡
    68 
    69 ãƒ»TOPPERS/ASPカーネルの実è£
    70 è¨­è¨ˆæ–¹é‡
    71 ãƒ»ã‚·ã‚¹ãƒ†ãƒ çŠ¶æ
    72 ‹ã¨ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®å®Ÿè£
    73 
    74         - カーネル動作状æ
    75 ‹ã¨éžå‹•ä½œçŠ¶æ
    76 ‹
    77         - タスクコンテキストと非タスクコンテキスト
    78         - å
    79 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    80 ‹ã¨å
    81 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    82 ‹
    83         - CPUロック状æ
    84 ‹ã¨CPUロック解除状æ
    85 ‹
    86         - 割込み優å
    87 ˆåº¦ãƒžã‚¹ã‚¯
    88         - ディスパッチ禁止状æ
    89 ‹ã¨ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    90 ‹
    91         - ディスパッチ保留状æ
    92 ‹
    93 ãƒ»ã‚¿ã‚¹ã‚¯çŠ¶æ
    94 ‹ã®ç®¡ç†ã¨ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°
    95         - タスク状æ
    96 ‹ã®ç®¡ç†
    97         - タスクスケジューラ
    98 ãƒ»ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理の実è£
    99 
    100         - タスクディスパッチ処理のå¿
    101 è¦ãªã‚¿ã‚¤ãƒŸãƒ³ã‚°
    102         - タスクディスパッチャの構造
    103         - タスクの終了時のタスクディスパッチ
    104         - reqflgの導å
    105 ¥ç†ç”±
    106 ãƒ»ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理機能の実è£
    107 
    108         - タスク例外処理ルーチンの実行開始条件とシステム状æ
    109 ‹ï¼ˆä»•æ§˜ã®ç¢ºèªï¼‰
    110         - タスク例外処理ルーチンの呼出し処理
    111         - タスク例外処理ルーチンの実行開始がå¿
    112 è¦ãªã‚¿ã‚¤ãƒŸãƒ³ã‚°
    113         - タスク例外処理ルーチンの実行開始処理
    114         - call_texrtnからdispatchを呼び出す処理について
    115 ãƒ»ã‚¨ãƒ©ãƒ¼ã®ãƒã‚§ãƒƒã‚¯é †åº
    116         - エラーの3分類
    117         - 静的エラーのチェック順序
    118         - 準静的エラーのチェック順序
    119 ãƒ»CHECKマクロとgoto文の使用
    120         - CHECKマクロの定義とその使用法
    121         - 設計意図
    122         - CHECKマクロを使用してよい条件
    123         - 問題を生じることがない根拠
    124 ãƒ»ext_tsk,ext_kerの返り値
    125 ãƒ»ã‚«ãƒ¼ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«å¯¾ã™ã‚‹volatile宣言について
    126 ãƒ»åž‹ã‚­ãƒ£ã‚¹ãƒˆã«ä¼´ã†è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
    127 ãƒ»æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻参ç
    128 §æ©Ÿèƒ½
    129         - å¿
    130 è¦æ€§ã¨ä½¿é€”
    131         - API仕様
    132         - 実è£
    133 
    134 ãƒ»ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理禁止フラグをenatexで実è£
    135 ã—ている理由
    136 
    137 
    138 â—‹TOPPERS/ASPカーネルの実è£
    139 è¨­è¨ˆæ–¹é‡
    140 
    141 TOPPERS/ASPカーネル(以下,ASPカーネル)は,TOPPERS新世代カーネルの出発
    142 ç‚¹ã¨ãªã‚‹ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ã‚«ãƒ¼ãƒãƒ«ã§ã‚る.TOPPERS新世代カーネル仕様の設計方針
    143 ã¨ï¼ŒASPカーネルの適用対象領域と設計方針については,TOPPERS新世代カーネ
    144 ãƒ«çµ±åˆä»•æ§˜æ›¸ã«è¿°ã¹ã‚‰ã‚Œã¦ã„る.
    145 
    146 ä»¥ä¸‹ã§ã¯ï¼ŒASPカーネルの実è£
    147 è¨­è¨ˆæ–¹é‡ã«ã¤ã„て述べるが,仕様設計方針とも関
    148 é€£ã—ており,明確に分離できない部分もある.
    149 
    150 TOPPERS/ASPカーネルの実è£
    151 è¨­è¨ˆã‚’行うにあたり,次の方針を設定する.
    152 
    153 (1) ソースコードの読みやすさ・改造しやすさを重視する
    154 
    155 ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãŒèª­ã¿ã‚„すいことは,オープンソースソフトウェアの品質を向上
    156 ã•ã›ã‚‹ä¸Šã§æœ€ã‚‚重要な特性である.ソースコードを理解している技術è€
    157 ãŒå¢—え
    158 ã‚‹ã“とで,問題を早期に発見することができ,サポート体制もå
    159 
    160 å®Ÿã•ã›ã‚‹ã“と
    161 ãŒã§ãã‚‹ï¼Žã¾ãŸï¼Œã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãŒèª­ã¿ã‚„すいことは,シンプルな設計がされて
    162 ã„ることも意味しており,信頼性向上にもつながる.さらに,技術è€
    163 æ•™è‚²ã®ãŸ
    164 ã‚ã®æ•™æã¨ã™ã‚‹è¦³ç‚¹ã‹ã‚‰ã‚‚,ソースコードが読みやすいことは重要となる.
    165 
    166 æ”¹é€ ã—やすいことは,システム毎の要求にあわせたチューニングが行いやすい
    167 ã“とを意味しており,擦り合わせ型の開発を支援する性質である.また,ASPカー
    168 ãƒãƒ«ã‚’基盤としてTOPPERS新世代カーネルシリーズを開発していく上でも,改造
    169 ã—やすいことはå¿
    170 é ˆã®æ¡ä»¶ã§ã‚る.
    171 
    172 (2) 新しいターゲットシステムへのポーティングが容易な構造とする
    173 
    174 çµ„込みシステムには多様なハードウェアが用いられるため,それらに容易にポー
    175 ãƒ†ã‚£ãƒ³ã‚°ã§ãã‚‹ã“とは重要な性質である.そのために,実行性能にé
    176 æ
    177 ®ã—つつ
    178 ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’抽象化し,ターゲットシステムに依存する部分(ターゲット依
    179 å­˜éƒ¨ï¼‰ã¨ä¾å­˜ã—ない部分(ターゲット非依存部)を明確に分離する.また,開
    180 ç™ºç’°å¢ƒï¼ˆã‚³ãƒ³ãƒ‘イラなど)に依存する部分も明確に分離する.
    181 
    182 (3) 検証が容易な構造とする
    183 
    184 ä¿¡é ¼æ€§ã‚’確保するために,検証が容易な構造とする.
    185 
    186 å
    187 ·ä½“的には,サービスコールのほとんどå
    188 ¨ä½“を割込み禁止で実行することとし,
    189 ã‚µãƒ¼ãƒ“スコールの処理途中で割込みを許可しない.この構造は,読みやすく改
    190 é€ ã—やすいソースコードにするためにも有効である.これにより割込み応答性
    191 ãŒçŠ ç‰²ã«ãªã‚‹ãŒï¼Œãã‚Œã«ã‚ˆã£ã¦å•é¡Œã‚’生じるアプリケーションは少数であり,
    192 ã‚„むをえないものと考える.
    193 
    194 ã¾ãŸï¼Œæ¡ä»¶ã‚³ãƒ³ãƒ‘イル等によりコンフィギュレーションできる箇所を増やすと,
    195 ç´°ã‹ãªæœ€é©åŒ–ができる一方で,検証すべき組合せが増えることから,コンフィ
    196 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§ãã‚‹ç®‡æ‰€ã¯å¿
    197 è¦æœ€ä½Žé™ã¨ã™ã‚‹ï¼Ž
    198 
    199 (4) 実行性能とメモリ使用量にé
    200 æ
    201 ®ã™ã‚‹
    202 
    203 ä¸Šè¨˜ã®æ–¹é‡ã‚’満たした上で,高い実行性能と小さいメモリ使用量を達成できる
    204 ã‚ˆã†ãªå®Ÿè£
    205 ã‚’行う.実行性能を向上させる際には,平均性能の向上よりも,最
    206 æ‚ªæ™‚性能の向上を重視する.
    207 
    208 ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®èª­ã¿ã‚„すさを重視すると言っても,実行性能の悪いアルゴリズ
    209 ãƒ ã‚’安易に採用することはせず,高い実行性能を達成できるアルゴリズムを用
    210 ã„る.ただし,新しいターゲットシステムへのポーティングを容易にするため
    211 ã«å¤§éƒ¨åˆ†ã‚’C言語で実è£
    212 ã—ており,すべてをアセンブリ言語で記述した場合に比
    213 ã¹ã¦å®Ÿè¡Œæ€§èƒ½ãŒè½ã¡ã‚‹ã®ã¯ã‚„むをえない.
    214 
    215 ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ã«ã¤ã„ては,RAMの使用量を削減することに重点を置いた設計を行
    216 ã†ãŒï¼Œä¸Šè¨˜ã®æ–¹é‡ãŠã‚ˆã³å®Ÿè¡Œæ€§èƒ½ã¨ã®ãƒˆãƒ¬ãƒ¼ãƒ‰ã‚ªãƒ•ã‚’考æ
    217 ®ã—,ぎりぎりまでの
    218 å‰Šæ¸›ã¯è¡Œã‚ãªã„.
    219 
    220 (5) スケーラビリティにé
    221 æ
    222 ®ã™ã‚‹
    223 
    224 æ§˜ã€
    225 ãªè¦æ¨¡ã®ã‚·ã‚¹ãƒ†ãƒ ã«é©ç”¨ã§ãã‚‹ã‚¹ã‚±ãƒ¼ãƒ©ãƒ“リティをもった構造とする.特
    226 ã«ï¼Œå°è¦æ¨¡ãªã‚·ã‚¹ãƒ†ãƒ ã«é©ç”¨ã™ã‚‹éš›ã«ï¼Œä½¿ç”¨ã—ない機能をカーネルが持ってい
    227 ã‚‹ã“とによるメモリ使用量の増加が最小限になるようにé
    228 æ
    229 ®ã™ã‚‹ï¼Ž
    230 
    231 å
    232 ·ä½“的には,アプリケーションとカーネルを1つのロードモジュールにリンクす
    233 ã‚‹æ–¹æ³•ï¼ˆ1リンクモデル)を想定し,カーネルを関数単位でライブラリ化して,
    234 ä½¿ç”¨ã™ã‚‹é–¢æ•°ã®ã¿ã‚’リンクできる構造とする.これは一種のコンフィギュレー
    235 ã‚·ãƒ§ãƒ³ã§ã‚るが,この方法は,条件コンパイルによるコンフィギュレーション
    236 ã¨ã¯é•ã„,検証工数に与える影響が小さい.
    237 
    238 ã¾ãŸï¼Œå›ºå®šçš„に使用するRAM領域を減らし,スタックに置けるæƒ
    239 å ±ã¯ã§ãã‚‹é™ã‚Š
    240 ã‚¹ã‚¿ãƒƒã‚¯ä¸Šã«ç½®ãï¼Ž
    241 
    242 
    243 â—‹ã‚·ã‚¹ãƒ†ãƒ çŠ¶æ
    244 ‹ã¨ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®å®Ÿè£
    245 
    246 
    247 ã“の章では,「TOPPERS新世代カーネル統合仕様書」の「2.5 システム状æ
    248 ‹ã¨ã‚³
    249 ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€ã®ç¯€ã«è¦å®šã•ã‚Œã¦ã„るシステム状æ
    250 ‹ã¨ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®å®Ÿè£
    251 æ–¹æ³•ã«
    252 ã¤ã„て記述する.
    253 
    254 â—ã‚«ãƒ¼ãƒãƒ«å‹•ä½œçŠ¶æ
    255 ‹ã¨éžå‹•ä½œçŠ¶æ
    256 ‹
    257 
    258 ã‚«ãƒ¼ãƒãƒ«ã®å‹•ä½œçŠ¶æ
    259 ‹ã‚’管理するために,カーネル動作状æ
    260 ‹ãƒ•ãƒ©ã‚°ï¼ˆkerflg)を
    261 ç”¨æ„ã™ã‚‹ï¼Žkerflgは,スタートアップモジュールでfalse(=0)に初期化する.
    262 ã¾ãŸï¼Œã‚«ãƒ¼ãƒãƒ«å‹•ä½œã®é–‹å§‹æ™‚にtrueにし,カーネル動作の終了時にfalseにする.
     51○目次
     52
     53・TOPPERS/ASPカーネルの実装設計方針
     54・システム状態とコンテキストの実装
     55        - カーネル動作状態と非動作状態
     56        - タスクコンテキストと非タスクコンテキスト
     57        - 全割込みロック状態と全割込みロック解除状態
     58        - CPUロック状態とCPUロック解除状態
     59        - 割込み優先度マスク
     60        - ディスパッチ禁止状態とディスパッチ許可状態
     61        - ディスパッチ保留状態
     62・タスク状態の管理とスケジューリング
     63        - タスク状態の管理
     64        - タスクスケジューラ
     65・タスクディスパッチ処理の実装
     66        - タスクディスパッチ処理の必要なタイミング
     67        - タスクディスパッチャの構造
     68        - タスクの終了時のタスクディスパッチ
     69        - reqflgの導入理由
     70・タスク例外処理機能の実装
     71        - タスク例外処理ルーチンの実行開始条件とシステム状態(仕様の確認)
     72        - タスク例外処理ルーチンの呼出し処理
     73        - タスク例外処理ルーチンの実行開始が必要なタイミング
     74        - タスク例外処理ルーチンの実行開始処理
     75        - call_texrtnからdispatchを呼び出す処理について
     76・エラーのチェック順序
     77        - エラーの3分類
     78        - 静的エラーのチェック順序
     79        - 準静的エラーのチェック順序
     80・CHECKマクロとgoto文の使用
     81        - CHECKマクロの定義とその使用法
     82        - 設計意図
     83        - CHECKマクロを使用してよい条件
     84        - 問題を生じることがない根拠
     85・ext_tsk,ext_kerの返り値
     86・カーネルのデータ構造に対するvolatile宣言について
     87・型キャストに伴う警告メッセージ
     88・性能評価用システム時刻参照機能
     89        - 必要性と使途
     90        - API仕様
     91        - 実装
     92・タスク例外処理禁止フラグをenatexで実装している理由
     93
     94
     95○TOPPERS/ASPカーネルの実装設計方針
     96
     97TOPPERS/ASPカーネル(以下,ASPカーネル)は,TOPPERS新世代カーネルの出発
     98点となるリアルタイムカーネルである.TOPPERS新世代カーネル仕様の設計方針
     99と,ASPカーネルの適用対象領域と設計方針については,TOPPERS新世代カーネ
     100ル統合仕様書に述べられている.
     101
     102以下では,ASPカーネルの実装設計方針について述べるが,仕様設計方針とも関
     103連しており,明確に分離できない部分もある.
     104
     105TOPPERS/ASPカーネルの実装設計を行うにあたり,次の方針を設定する.
     106
     107(1) ソースコードの読みやすさ・改造しやすさを重視する
     108
     109ソースコードが読みやすいことは,オープンソースソフトウェアの品質を向上
     110させる上で最も重要な特性である.ソースコードを理解している技術者が増え
     111ることで,問題を早期に発見することができ,サポート体制も充実させること
     112ができる.また,ソースコードが読みやすいことは,シンプルな設計がされて
     113いることも意味しており,信頼性向上にもつながる.さらに,技術者教育のた
     114めの教材とする観点からも,ソースコードが読みやすいことは重要となる.
     115
     116改造しやすいことは,システム毎の要求にあわせたチューニングが行いやすい
     117ことを意味しており,擦り合わせ型の開発を支援する性質である.また,ASPカー
     118ネルを基盤としてTOPPERS新世代カーネルシリーズを開発していく上でも,改造
     119しやすいことは必須の条件である.
     120
     121(2) 新しいターゲットシステムへのポーティングが容易な構造とする
     122
     123組込みシステムには多様なハードウェアが用いられるため,それらに容易にポー
     124ティングできることは重要な性質である.そのために,実行性能に配慮しつつ
     125ハードウェアを抽象化し,ターゲットシステムに依存する部分(ターゲット依
     126存部)と依存しない部分(ターゲット非依存部)を明確に分離する.また,開
     127発環境(コンパイラなど)に依存する部分も明確に分離する.
     128
     129(3) 検証が容易な構造とする
     130
     131信頼性を確保するために,検証が容易な構造とする.
     132
     133具体的には,サービスコールのほとんど全体を割込み禁止で実行することとし,
     134サービスコールの処理途中で割込みを許可しない.この構造は,読みやすく改
     135造しやすいソースコードにするためにも有効である.これにより割込み応答性
     136が犠牲になるが,それによって問題を生じるアプリケーションは少数であり,
     137やむをえないものと考える.
     138
     139また,条件コンパイル等によりコンフィギュレーションできる箇所を増やすと,
     140細かな最適化ができる一方で,検証すべき組合せが増えることから,コンフィ
     141ギュレーションできる箇所は必要最低限とする.
     142
     143(4) 実行性能とメモリ使用量に配慮する
     144
     145上記の方針を満たした上で,高い実行性能と小さいメモリ使用量を達成できる
     146ような実装を行う.実行性能を向上させる際には,平均性能の向上よりも,最
     147悪時性能の向上を重視する.
     148
     149ソースコードの読みやすさを重視すると言っても,実行性能の悪いアルゴリズ
     150ムを安易に採用することはせず,高い実行性能を達成できるアルゴリズムを用
     151いる.ただし,新しいターゲットシステムへのポーティングを容易にするため
     152に大部分をC言語で実装しており,すべてをアセンブリ言語で記述した場合に比
     153べて実行性能が落ちるのはやむをえない.
     154
     155メモリ使用量については,RAMの使用量を削減することに重点を置いた設計を行
     156うが,上記の方針および実行性能とのトレードオフを考慮し,ぎりぎりまでの
     157削減は行わない.
     158
     159(5) スケーラビリティに配慮する
     160
     161様々な規模のシステムに適用できるスケーラビリティをもった構造とする.特
     162に,小規模なシステムに適用する際に,使用しない機能をカーネルが持ってい
     163ることによるメモリ使用量の増加が最小限になるように配慮する.
     164
     165具体的には,アプリケーションとカーネルを1つのロードモジュールにリンクす
     166る方法(1リンクモデル)を想定し,カーネルを関数単位でライブラリ化して,
     167使用する関数のみをリンクできる構造とする.これは一種のコンフィギュレー
     168ションであるが,この方法は,条件コンパイルによるコンフィギュレーション
     169とは違い,検証工数に与える影響が小さい.
     170
     171また,固定的に使用するRAM領域を減らし,スタックに置ける情報はできる限り
     172スタック上に置く.
     173
     174
     175○システム状態とコンテキストの実装
     176
     177この章では,「TOPPERS新世代カーネル統合仕様書」の「2.5 システム状態とコ
     178ンテキスト」の節に規定されているシステム状態とコンテキストの実装方法に
     179ついて記述する.
     180
     181●カーネル動作状態と非動作状態
     182
     183カーネルの動作状態を管理するために,カーネル動作状態フラグ(kerflg)を
     184用意する.kerflgは,スタートアップモジュールでfalse(=0)に初期化する.
     185また,カーネル動作の開始時にtrueにし,カーネル動作の終了時にfalseにする.
    263186
    264187----------------------------------------
     
    266189----------------------------------------
    267190
    268 kerflgは,sns_kerで参ç
    269 §ã™ã‚‹ï¼Žã‚«ãƒ¼ãƒãƒ«éžå‹•ä½œçŠ¶æ
    270 ‹ã§sns_ker以外のサービス
    271 ã‚³ãƒ¼ãƒ«ã‚’呼び出した場合の動作は保証するå¿
    272 è¦ãŒãªã„ため,他のサービスコー
    273 ãƒ«ã§ã¯kerflgを参ç
    274 §ã—ない.
    275 
    276 â—ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¨éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ
    277 
    278 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¨éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®åˆ‡æ›ãˆã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒãƒ¼ãƒ‰ã‚¦ã‚§
    279 ã‚¢ãŠã‚ˆã³ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«å§”ねる.また,どちらのコンテキストで実行中で
    280 ã‚るかを判別する関数(sense_context)も,ターゲット依存部で用意すること
    281 ã¨ã™ã‚‹ï¼Ž
    282 
    283 â—å
    284 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    285 ‹ã¨å
    286 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    287 ‹
    288 
    289 å
    290 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ãƒ•ãƒ©ã‚°ã®ç®¡ç†ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«å§”ね,å
    291 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    292 ‹
    293 ã«é·ç§»ã•ã›ã‚‹ãƒžã‚¯ãƒ­ï¼ˆSIL_LOC_INT)と,å
    294 ƒã®çŠ¶æ
    295 ‹ã«æˆ»ã™ãƒžã‚¯ãƒ­ï¼ˆSIL_UNL_INT)
    296 ã¯ï¼ŒSILのターゲット依存部で用意することとする.å
    297 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    298 ‹ã§ã‚ã‚‹
    299 ã‹å¦ã‹ã‚’判別する機能は,å¿
    300 è¦ãŒãªã„ために用意していない.
    301 
    302 å
    303 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    304 ‹ã§sns_kerとext_ker以外のサービスコールを呼び出した場
    305 åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    306 è¦ãŒãªã„ため,サービスコール中でå
    307 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    308 ‹
    309 ã§ã‚ることを判別するå¿
    310 è¦ã¯ãªã„.
    311 
    312 â—CPUロック状æ
    313 ‹ã¨CPUロック解除状æ
    314 ‹
    315 
    316 CPUロックフラグの管理はターゲット依存部に委ね,CPUロック状æ
    317 ‹ã«é·ç§»ã•ã›
    318 ã‚‹é–¢æ•°ï¼ˆt_lock_cpu/i_lock_cpu/x_lock_cpu)と,CPUロック解除状æ
    319 ‹ã«é·ç§»
    320 ã•ã›ã‚‹é–¢æ•°ï¼ˆt_unlock_cpu/i_unlock_cpu/x_unlock_cpu)は,ターゲット依
    321 å­˜éƒ¨ã§ç”¨æ„ã™ã‚‹ã“ととする.また,CPUロック状æ
    322 ‹ã§ã‚るか否かを判別する関数
    323 ï¼ˆt_sense_lock/i_sense_lock/x_sense_lock)も,ターゲット依存部で用意
    324 ã™ã‚‹ã“ととする.
    325 
    326 â—å‰²è¾¼ã¿å„ªå
    327 ˆåº¦ãƒžã‚¹ã‚¯
    328 
    329 å‰²è¾¼ã¿å„ªå
    330 ˆåº¦ãƒžã‚¹ã‚¯ã®ç®¡ç†ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«å§”ね,割込み優å
    331 ˆåº¦ãƒžã‚¹ã‚¯ã‚’
    332 è¨­å®šã™ã‚‹é–¢æ•°ï¼ˆt_set_ipm/i_set_ipm/x_set_ipm)と,それを参ç
    333 §ã™ã‚‹é–¢æ•°
    334 ï¼ˆt_get_ipm/i_get_ipm/x_get_ipm)は,ターゲット依存部で用意することと
    335 ã™ã‚‹ï¼Ž
    336 
    337 ãŸã ã—,タスクコンテキストの実行中に,割込み優å
    338 ˆåº¦ãƒžã‚¹ã‚¯å
    339 ¨è§£é™¤çŠ¶æ
    340 ‹ã§ã‚
    341 ã‚‹ã“とを効率的に判断するために,割込み優å
    342 ˆåº¦ãƒžã‚¹ã‚¯å
    343 ¨è§£é™¤çŠ¶æ
    344 ‹ã§ã‚ること
    345 ã‚’示すフラグ(ipmflg)を用意する.
    346 
    347 ipmflgは,カーネルの初期化時にfalseに初期化する.非タスクコンテキストで
    348 ã¯ï¼Œå‰²è¾¼ã¿å„ªå
    349 ˆåº¦ãƒžã‚¹ã‚¯å
    350 ¨è§£é™¤çŠ¶æ
    351 ‹ã«ãªã‚‹ã“とはないため,このフラグを用い
    352 ã‚‹å¿
    353 è¦ã¯ãªãï¼Œãƒ•ãƒ©ã‚°ã®æ›´æ–°ã‚‚行わない.
     191kerflgは,sns_kerで参照する.カーネル非動作状態でsns_ker以外のサービス
     192コールを呼び出した場合の動作は保証する必要がないため,他のサービスコー
     193ルではkerflgを参照しない.
     194
     195●タスクコンテキストと非タスクコンテキスト
     196
     197タスクコンテキストと非タスクコンテキストの切換えは,ターゲットハードウェ
     198アおよびターゲット依存部に委ねる.また,どちらのコンテキストで実行中で
     199あるかを判別する関数(sense_context)も,ターゲット依存部で用意すること
     200とする.
     201
     202●全割込みロック状態と全割込みロック解除状態
     203
     204全割込みロックフラグの管理はターゲット依存部に委ね,全割込みロック状態
     205に遷移させるマクロ(SIL_LOC_INT)と,元の状態に戻すマクロ(SIL_UNL_INT)
     206は,SILのターゲット依存部で用意することとする.全割込みロック状態である
     207か否かを判別する機能は,必要がないために用意していない.
     208
     209全割込みロック状態でsns_kerとext_ker以外のサービスコールを呼び出した場
     210合の動作は保証する必要がないため,サービスコール中で全割込みロック状態
     211であることを判別する必要はない.
     212
     213●CPUロック状態とCPUロック解除状態
     214
     215CPUロックフラグの管理はターゲット依存部に委ね,CPUロック状態に遷移させ
     216る関数(t_lock_cpu/i_lock_cpu/x_lock_cpu)と,CPUロック解除状態に遷移
     217させる関数(t_unlock_cpu/i_unlock_cpu/x_unlock_cpu)は,ターゲット依
     218存部で用意することとする.また,CPUロック状態であるか否かを判別する関数
     219(t_sense_lock/i_sense_lock/x_sense_lock)も,ターゲット依存部で用意
     220することとする.
     221
     222●割込み優先度マスク
     223
     224割込み優先度マスクの管理はターゲット依存部に委ね,割込み優先度マスクを
     225設定する関数(t_set_ipm/i_set_ipm/x_set_ipm)と,それを参照する関数
     226(t_get_ipm/i_get_ipm/x_get_ipm)は,ターゲット依存部で用意することと
     227する.
     228
     229ただし,タスクコンテキストの実行中に,割込み優先度マスク全解除状態であ
     230ることを効率的に判断するために,割込み優先度マスク全解除状態であること
     231を示すフラグ(ipmflg)を用意する.
     232
     233ipmflgは,カーネルの初期化時にfalseに初期化する.非タスクコンテキストで
     234は,割込み優先度マスク全解除状態になることはないため,このフラグを用い
     235る必要はなく,フラグの更新も行わない.
    354236
    355237----------------------------------------
     
    357239----------------------------------------
    358240
    359 â—ãƒ‡ã‚£ã‚¹ãƒ‘ッチ禁止状æ
    360 ‹ã¨ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    361 ‹
    362 
    363 ãƒ‡ã‚£ã‚¹ãƒ‘ッチ禁止フラグを管理するために,フラグ(disdsp)を用意する.
    364 disdspは,カーネルの初期化時にfalseに初期化する.
     241●ディスパッチ禁止状態とディスパッチ許可状態
     242
     243ディスパッチ禁止フラグを管理するために,フラグ(disdsp)を用意する.
     244disdspは,カーネルの初期化時にfalseに初期化する.
    365245
    366246----------------------------------------
     
    368248----------------------------------------
    369249
    370 â€» disdspではなく,それを論理反転したenadspを用意した方が,ipmflgや
    371 dspflgとの整合性の観点からは良かった.
    372 
    373 â—ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    374 ‹
    375 
    376 ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    377 ‹ã¯ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®å®Ÿè¡Œä¸­ï¼ŒCPUロック状æ
    378 ‹ï¼Œå‰²
    379 è¾¼ã¿å„ªå
    380 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    381 ¨è§£é™¤ã§ãªã„状æ
    382 ‹ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチ禁止状æ
    383 ‹ã®ã„ずれか(ま
    384 ãŸã¯ï¼Œãã‚Œã‚‰ãŒé‡ãªã£ãŸçŠ¶æ
    385 ‹ï¼‰ã§ã‚る.
    386 
    387 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®å®Ÿè¡Œä¸­ã«ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    388 ‹ã§ãªã„こと(つまり,
    389 ãƒ‡ã‚£ã‚¹ãƒ‘ッチできる状æ
    390 ‹ã§ã‚ること)を効率的に判別するために,割込み優å
    391 ˆ
    392 åº¦ãƒžã‚¹ã‚¯å
    393 ¨è§£é™¤çŠ¶æ
    394 ‹ã§ã‚り,ディスパッチ許可状æ
    395 ‹ã§ã‚る(ディスパッチ禁止
    396 çŠ¶æ
    397 ‹ã§ãªã„)ことを示すフラグ(dspflg)を用意する.すなわち,常に
    398 ã€Œdspflg == (ipmflg && !disdsp)」に設定する.
    399 
    400 dspflgは,カーネルの初期化時にtrueに初期化する.また,タスクコンテキス
    401 ãƒˆã«ãŠã„て割込み優å
    402 ˆåº¦ãƒžã‚¹ã‚¯ã®å€¤ãŒå¤‰æ›´ã•ã‚Œã‚‹ã‹ï¼Œå‰²è¾¼ã¿ç¦æ­¢ãƒ•ãƒ©ã‚°ãŒå¤‰æ›´
    403 ã•ã‚Œã‚‹åº¦ã«æ›´æ–°ã™ã‚‹ï¼Žéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯ï¼Œå¸¸ã«ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    404 ‹
    405 ã§ã‚るため,このフラグを用いるå¿
    406 è¦ã¯ãªãï¼Œãƒ•ãƒ©ã‚°ã®æ›´æ–°ã‚‚行わない.
     250※ disdspではなく,それを論理反転したenadspを用意した方が,ipmflgや
     251dspflgとの整合性の観点からは良かった.
     252
     253●ディスパッチ保留状態
     254
     255ディスパッチ保留状態は,非タスクコンテキストの実行中,CPUロック状態,割
     256込み優先度マスクが全解除でない状態,ディスパッチ禁止状態のいずれか(ま
     257たは,それらが重なった状態)である.
     258
     259タスクコンテキストの実行中に,ディスパッチ保留状態でないこと(つまり,
     260ディスパッチできる状態であること)を効率的に判別するために,割込み優先
     261度マスク全解除状態であり,ディスパッチ許可状態である(ディスパッチ禁止
     262状態でない)ことを示すフラグ(dspflg)を用意する.すなわち,常に
     263「dspflg == (ipmflg && !disdsp)」に設定する.
     264
     265dspflgは,カーネルの初期化時にtrueに初期化する.また,タスクコンテキス
     266トにおいて割込み優先度マスクの値が変更されるか,割込み禁止フラグが変更
     267される度に更新する.非タスクコンテキストでは,常にディスパッチ保留状態
     268であるため,このフラグを用いる必要はなく,フラグの更新も行わない.
    407269
    408270----------------------------------------
     
    411273
    412274
    413 â—‹ã‚¿ã‚¹ã‚¯çŠ¶æ
    414 ‹ã®ç®¡ç†ã¨ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°
     275○タスク状態の管理とスケジューリング
    415276       
    416 â—ã‚¿ã‚¹ã‚¯çŠ¶æ
    417 ‹ã®ç®¡ç†
    418 
    419 ã‚¿ã‚¹ã‚¯ç®¡ç†ãƒ–ロック(TCB)中のタスク状æ
    420 ‹ã‚’管理するフィールド(tstat)で
    421 ã¯ï¼Œã‚¿ã‚¹ã‚¯çŠ¶æ
    422 ‹ãŒæ¬¡ã®ã„ずれであるかを管理する.
    423 
    424 ã€€ãƒ»å®Ÿè¡Œã§ãã‚‹çŠ¶æ
    425 ‹
    426 ã€€ãƒ»ä¼‘止状æ
    427 ‹
    428 ã€€ãƒ»ï¼ˆç‹­ç¾©ã®ï¼‰å¾
    429 ã¡çŠ¶æ
    430 ‹
    431 ã€€ãƒ»å¼·åˆ¶å¾
    432 ã¡çŠ¶æ
    433 ‹
    434 ã€€ãƒ»äºŒé‡å¾
    435 ã¡çŠ¶æ
    436 ‹
    437 
    438 ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œã§ãã‚‹çŠ¶æ
    439 ‹ã®æ™‚に,実行状æ
    440 ‹ã§ã‚るか実行可能状æ
    441 ‹ã§ã‚るかは,
    442 ã“のフィールドでは管理せず,実行状æ
    443 ‹ã®ã‚¿ã‚¹ã‚¯ã®TCBを指すポインタ変数
    444 ï¼ˆp_runtsk)によって判別する.実行状æ
    445 ‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„場合は,p_runtskは
    446 NULLにする.
     277●タスク状態の管理
     278
     279タスク管理ブロック(TCB)中のタスク状態を管理するフィールド(tstat)で
     280は,タスク状態が次のいずれであるかを管理する.
     281
     282 ・実行できる状態
     283 ・休止状態
     284 ・(狭義の)待ち状態
     285 ・強制待ち状態
     286 ・二重待ち状態
     287
     288タスクが実行できる状態の時に,実行状態であるか実行可能状態であるかは,
     289このフィールドでは管理せず,実行状態のタスクのTCBを指すポインタ変数
     290(p_runtsk)によって判別する.実行状態のタスクがない場合は,p_runtskは
     291NULLにする.
    447292
    448293----------------------------------------
     
    450295----------------------------------------
    451296
    452 p_runtskは,カーネルの初期化時にNULLに初期化し,ディスパッチャにおいて
    453 æ›´æ–°ã™ã‚‹ï¼Žã‚µãƒ¼ãƒ“スコールの処理の中で自タスクに関するæƒ
    454 å ±ã‚’参ç
    455 §ã™ã‚‹å ´åˆ
    456 ã¯ï¼Œp_runtskを用いる.
    457 
    458 â—ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©
    459 
    460 ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã¯ï¼Œå®Ÿè¡Œã§ãã‚‹çŠ¶æ
    461 ‹ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã‹ã‚‰ï¼Œæœ€ã‚‚優å
    462 ˆé †ä½ãŒé«˜
    463 ã„タスク(これを,最高優å
    464 ˆé †ä½ã®ã‚¿ã‚¹ã‚¯ã¨å‘¼ã¶ï¼‰ã‚’決定し,そのタスクの
    465 TCBを指すポインタ変数(p_schedtsk)を設定する.
     297p_runtskは,カーネルの初期化時にNULLに初期化し,ディスパッチャにおいて
     298更新する.サービスコールの処理の中で自タスクに関する情報を参照する場合
     299は,p_runtskを用いる.
     300
     301●タスクスケジューラ
     302
     303タスクスケジューラは,実行できる状態のタスクの中から,最も優先順位が高
     304いタスク(これを,最高優先順位のタスクと呼ぶ)を決定し,そのタスクの
     305TCBを指すポインタ変数(p_schedtsk)を設定する.
    466306
    467307----------------------------------------
     
    469309----------------------------------------
    470310
    471 ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã«å¯¾ã—ては,どのタスクが実行できる状æ
    472 ‹ã§ã‚るかを知ら
    473 ã›ã‚‹å¿
    474 è¦ãŒã‚る.そのため,タスクスケジューラは,次の2つの関数を用意する.
    475 
    476 ã€€ãƒ»ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œã§ãã‚‹çŠ¶æ
    477 ‹ã«é·ç§»ã—たことを知らせる関数(make_runnable)
    478 ã€€ãƒ»ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œã§ãã‚‹çŠ¶æ
    479 ‹ã‹ã‚‰ä»–の状æ
    480 ‹ã¸é·ç§»ã—たことを知らせる関数
    481         (make_non_runnable)
    482 
    483 ã¾ãŸï¼Œå‡¦ç†ã®åŠ¹çŽ‡åŒ–のために,上の2つの関数を用いずにレディキューを直接操
    484 ä½œã—てタスクスケジュールを行う関数として,次の2つの関数を用意する.
    485 
    486 ã€€ãƒ»ã‚¿ã‚¹ã‚¯ã®å„ªå
    487 ˆåº¦ã®å¤‰æ›´ï¼ˆchange_priority)
    488 ã€€ãƒ»ãƒ¬ãƒ‡ã‚£ã‚­ãƒ¥ãƒ¼ã®å›žè»¢ï¼ˆrotate_ready_queue)
    489 
    490 
    491 â—‹ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理の実è£
    492 
    493 
    494 â—ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理のå¿
    495 è¦ãªã‚¿ã‚¤ãƒŸãƒ³ã‚°
    496 
    497 ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチは,実行状æ
    498 ‹ã®ã‚¿ã‚¹ã‚¯ï¼ˆp_runtsk)と最高優å
    499 ˆé †ä½ã®ã‚¿ã‚¹
    500 ã‚¯ï¼ˆp_schedtsk)が一致しておらず,ディスパッチ保留状æ
    501 ‹ã§ãªã„場合に行う.
    502 ã“のことから,タスクディスパッチ処理を行うå¿
    503 è¦ãŒã‚るのは,次の3つの場合
    504 ã§ã‚る.
    505 
    506 (1) 実行状æ
    507 ‹ã®ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œã§ãã‚‹çŠ¶æ
    508 ‹ã§ãªããªã‚‹
    509 
    510 è‡ªã‚¿ã‚¹ã‚¯ã‚’広義のå¾
    511 ã¡çŠ¶æ
    512 ‹ã«é·ç§»ã•ã›ã‚‹ã‚µãƒ¼ãƒ“スコールや,自タスクを終了さ
    513 ã›ã‚‹ã‚µãƒ¼ãƒ“スコールにおいて,タスクディスパッチ処理を行うå¿
    514 è¦ãŒã‚る.
    515 
    516 (2) 最高優å
    517 ˆé †ä½ã®ã‚¿ã‚¹ã‚¯ãŒå¤‰åŒ–する
    518 
    519 ã‚¿ã‚¹ã‚¯ã®èµ·å‹•ï¼Œã‚¿ã‚¹ã‚¯ã®å¾
    520 ã¡è§£é™¤ï¼Œã‚¿ã‚¹ã‚¯ã®å¼·åˆ¶å¾
    521 ã¡ã‹ã‚‰ã®å†é–‹ï¼Œã‚¿ã‚¹ã‚¯ã®å„ª
    522 å
    523 ˆåº¦ã®å¤‰æ›´ï¼Œã‚¿ã‚¹ã‚¯ã®å„ªå
    524 ˆé †ä½ã®å›žè»¢ã‚’行うサービスコールにおいて,最高優
    525 å
    526 ˆé †ä½ã®ã‚¿ã‚¹ã‚¯ãŒå¤‰åŒ–し,ディスパッチ保留状æ
    527 ‹ã§ãªã„場合には,タスクディ
    528 ã‚¹ãƒ‘ッチ処理を行うå¿
    529 è¦ãŒã‚る.
    530 
    531 (3) ディスパッチ保留状æ
    532 ‹ãŒè§£é™¤ã•ã‚Œã‚‹
    533 
    534 ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    535 ‹ã¨ã¯ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®å®Ÿè¡Œä¸­ï¼ŒCPUロック状æ
    536 ‹ï¼Œ
    537 å‰²è¾¼ã¿å„ªå
    538 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    539 ¨è§£é™¤ã§ãªã„状æ
    540 ‹ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチ禁止状æ
    541 ‹ã®ç·ç§°ã§ã‚ã‚‹
    542 ãŸã‚ï¼Œã“れらの状æ
    543 ‹ã®ã„ずれかが遷移するタイミングで,タスクディスパッチ
    544 å‡¦ç†ã‚’行うå¿
    545 è¦ãŒã‚る.å
    546 ·ä½“的には,次のタイミングが該当する.
    547 
    548 (3-1) 非タスクコンテキストからタスクコンテキストに遷移する
    549 
    550 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¾ãŸã¯CPU例外ハンドラからタスクにリターンする際に,タスク
    551 ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理を行うå¿
    552 è¦ãŒã‚る.
    553 
    554 (3-2) CPUロック状æ
    555 ‹ãŒè§£é™¤ã•ã‚Œã‚‹
    556 
    557 CPUロック状æ
    558 ‹ã«ãŠã„ては,上記の(1)や(2)の状況を作り出すサービスコールを
    559 å‘¼ã³å‡ºã™ã“とができない.そのため,CPUロック状æ
    560 ‹ã®è§£é™¤æ™‚には,タスクディ
    561 ã‚¹ãƒ‘ッチ処理を行うå¿
    562 è¦ãŒãªã„.
    563 
    564 (3-3) 割込み優å
    565 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    566 ¨è§£é™¤ã•ã‚Œã‚‹
    567 
    568 å‰²è¾¼ã¿å„ªå
    569 ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´ï¼ˆchg_ipm)により割込み優å
    570 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    571 ¨è§£é™¤ã•ã‚Œ
    572 ã‚‹å ´åˆã«ï¼Œã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理を行うå¿
    573 è¦ãŒã‚る.
    574 
    575 ã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ã®çµ‚了,タスク例外処理ルーチンからのリターン,割込みハンド
    576 ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ï¼Œå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンからのリターン,タイムイベント
    577 ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ï¼ŒCPU例外ハンドラからのリターンによって,割込み優
    578 å
    579 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    580 ¨è§£é™¤ã•ã‚Œã‚‹å ´åˆãŒã‚り,その場合には,タスクディスパッチ処
    581 ç†ã‚’行うå¿
    582 è¦ãŒã‚る.ただし,割込みサービスルーチンおよびタイムイベント
    583 ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ã«ã¤ã„ては,リターン後も非タスクコンテキストであ
    584 ã‚Šï¼Œã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    585 ‹ãŒç¶™ç¶šã™ã‚‹ã“とから,タスクディスパッチ処
    586 ç†ã‚’行うå¿
    587 è¦ãŒãªã„.
    588 
    589 (3-4) ディスパッチ許可状æ
    590 ‹ã«ãªã‚‹
    591 
    592 ãƒ‡ã‚£ã‚¹ãƒ‘ッチの許可(ena_dsp)において,タスクディスパッチ処理を行うå¿
    593 è¦
    594 ãŒã‚る.
    595 
    596 ã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ã®çµ‚了とタスク例外処理ルーチンからのリターンによって,ディ
    597 ã‚¹ãƒ‘ッチ許可状æ
    598 ‹ã«ãªã‚‹å ´åˆãŒã‚り,その場合には,タスクディスパッチ処理
    599 ã‚’行うå¿
    600 è¦ãŒã‚る.
    601 
    602 ä»¥ä¸Šã«åŠ ãˆã¦ï¼Œã‚«ãƒ¼ãƒãƒ«ã®å‹•ä½œé–‹å§‹æ™‚にも,タスクディスパッチ処理を呼び出
    603 ã™ï¼Ž
    604 
    605 â—ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチャの構造
    606 
    607 ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチャの主な機能は,切換え前のタスクのコンテキスト(プロ
    608 ã‚»ãƒƒã‚µã®æ±Žç”¨ãƒ¬ã‚¸ã‚¹ã‚¿ç­‰ï¼‰ã‚’メモリ上に保存し,切換え後のタスクのコンテキ
    609 ã‚¹ãƒˆã‚’メモリ上から復帰することである.ここで,保存/復帰しなければなら
    610 ãªã„レジスタは,タスクディスパッチャが実行される状況によって,次のよう
    611 ãªé•ã„がある.
    612 
    613 ãƒ»ã‚¿ã‚¹ã‚¯ãŒå‰²è¾¼ã¿ï¼ˆã¾ãŸã¯ï¼ŒCPU例外)によりプリエンプトされる場合には,す
    614 ã€€ã¹ã¦ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’保存しなければならない.また,その状æ
    615 ‹ã‹ã‚‰å®Ÿè¡Œå†é–‹ã™
    616 ã€€ã‚‹å ´åˆã«ã¯ï¼Œã™ã¹ã¦ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’復帰しなければならない.
    617 
    618 ãƒ»ã‚¿ã‚¹ã‚¯ãŒè‡ªç™ºçš„にタスクディスパッチャを呼び出す場合には,スクラッチレ
    619 ã€€ã‚¸ã‚¹ã‚¿ï¼ˆcaller saved register)以外のレジスタを保存すればよい.また,
    620 ã€€ãã®çŠ¶æ
    621 ‹ã‹ã‚‰å®Ÿè¡Œå†é–‹ã™ã‚‹å ´åˆã«ã¯ï¼Œã‚¹ã‚¯ãƒ©ãƒƒãƒãƒ¬ã‚¸ã‚¹ã‚¿ä»¥å¤–のレジスタを
    622 ã€€å¾©å¸°ã™ã‚Œã°ã‚ˆã„.
    623 
    624 ãƒ»ã‚¿ã‚¹ã‚¯ãŒçµ‚了する場合には,どのレジスタも保存するå¿
    625 è¦ãŒãªã„.
    626 
    627 ãƒ»ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œé–‹å§‹ã™ã‚‹å ´åˆã«ã¯ï¼Œã©ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã‚‚復帰するå¿
    628 è¦ãŒãªã„.
    629 
    630 ãã“で,それぞれの状況でå¿
    631 è¦æœ€ä½Žé™ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã®ã¿ã‚’保存/復帰するために,
    632 ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理を,(a) コンテキストの保存処理,(b) 実行するタス
    633 ã‚¯ã®é¸æŠžå‡¦ç†ï¼Œ(c) コンテキストの復帰処理の3つのステップで構成し,(a)と
    634 (c)のステップについては,タスクディスパッチャが実行される状況毎に用意す
    635 ã‚‹ï¼Žå
    636 ·ä½“的には,次の各処理を行うルーチンを用意する.
    637 
    638 (a) コンテキストの保存処理
    639         (a-1) タスクが自発的に呼び出した場合の保存処理(dispatch)
    640         (a-2) 割込みハンドラの出口で呼び出された場合の保存処理(ret_int)
    641         (a-3) CPU例外ハンドラの出口で呼び出された場合の保存処理(ret_exc)
    642         (a-4) タスクの終了時の処理(exit_and_dispatch)
    643         (a-5) カーネルの動作開始時の処理(start_dispatch)
    644 (b) 実行するタスクの選択(ディスパッチャ本体,dispatcher)
    645 (c) コンテキストの復帰処理
    646         (c-1) タスクが自発的に呼び出した場合の復帰処理(dispatch_r)
    647         (c-2) 割込みハンドラの出口で呼び出された場合の復帰処理(ret_int_r)
    648         (c-3) CPU例外ハンドラの出口で呼び出された場合の復帰処理(ret_exc_r)
    649         (c-4) タスクの実行開始時の処理(start_r)
    650 
    651 â—ã‚¿ã‚¹ã‚¯ã®çµ‚了時のタスクディスパッチ
    652 
    653 ext_tskによるタスクの終了時に,起動要求がキューイングされていると,同じ
    654 ã‚¿ã‚¹ã‚¯ãŒã™ãã«èµ·å‹•ã•ã‚Œã‚‹ï¼Žã“の場合,タスクディスパッチャにとっては,同
    655 ã˜ã‚¿ã‚¹ã‚¯ã¸ã®åˆ‡æ›ãˆã«è¦‹ãˆï¼Œã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理をスキップ可能に思える
    656 ãŒï¼Œå®Ÿéš›ã«ã¯ï¼ŒåŒã˜ã‚¿ã‚¹ã‚¯ã®ç•°ãªã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¸ã®åˆ‡æ›ãˆã§ã‚るため,タス
    657 ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理をスキップしてはならない.
    658 
    659 ä¸Šè¿°ã®ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチャの構造により,タスクの終了時には,それ専用の
    660 å‡¦ç†ï¼ˆexit_and_dispatch)を呼び出す.この処理では,実行状æ
    661 ‹ã®ã‚¿ã‚¹ã‚¯ã‚’参
    662 ç
    663 §ã›ãšï¼Œã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ä¿å­˜ã‚‚行わずに,次に事é 
    664 ã™ã‚‹ã‚¿ã‚¹ã‚¯ã®é¸æŠžå‡¦ç†ã‚’è¡Œ
    665 ã†ãŸã‚ï¼Œã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ処理がスキップされることはない.
    666 
    667 ãªãŠï¼Œter_tskによって実行状æ
    668 ‹ã®ã‚¿ã‚¹ã‚¯ã‚’終了させることはできないため,
    669 ter_tskではこのような状況は起こらない.
    670 
    671 â—reqflgの導å
    672 ¥ç†ç”±
    673 
    674 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ï¼CPU例外ハンドラの出口処理に,タスクディスパッチまたはタ
    675 ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始を要求することを示すフラグとして,reqflg
    676 ã‚’用意している.非タスクコンテキストにおいて,タスクディスパッチがå¿
    677 è¦
    678 ã«ãªã£ãŸå ´åˆã‚„,タスク例外処理ルーチンの実行開始がå¿
    679 è¦ã«ãªã£ãŸå ´åˆã«ã¯ï¼Œ
    680 ã“のフラグをセットする.
    681 
    682 reqflgを導å
    683 ¥ã—た理由は,割込みハンドラ/CPU例外ハンドラの出口処理のå
    684 ¸åž‹
    685 çš„なケース(タスクディスパッチもタスク例外処理ルーチンの実行開始もå¿
    686 è¦
    687 ãªã„場合)を高速化するためである.また,ディスパッチャ本体(dispatcher)
    688 ã®ã‚¢ã‚¤ãƒ‰ãƒ«å‡¦ç†ã‚‚高速化できる.
    689 
    690 ã—かし,割込みハンドラ/CPU例外ハンドラの出口処理å
    691 ¨ä½“のオーバヘッドを考
    692 ãˆã‚‹ã¨ï¼Œreqflgによる高速化の効果はそれほど大きくないものと思われる.
    693 
    694 
    695 â—‹ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理機能の実è£
    696 
    697 
    698 â—ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始条件とシステム状æ
    699 ‹ï¼ˆä»•æ§˜ã®ç¢ºèªï¼‰
    700 
    701 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンは,次の6つの条件が揃った場合に実行が開始される.
    702 
    703 ã€€ãƒ»ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理許可状æ
    704 ‹ã§ã‚ã‚‹
    705 ã€€ãƒ»ä¿ç•™ä¾‹å¤–要因が0でない
    706 ã€€ãƒ»ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡ŒçŠ¶æ
    707 ‹ã§ã‚ã‚‹
    708 ã€€ãƒ»ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒå®Ÿè¡Œã•ã‚Œã¦ã„ã‚‹
    709 ã€€ãƒ»å‰²è¾¼ã¿å„ªå
    710 ˆåº¦ãƒžã‚¹ã‚¯å
    711 ¨è§£é™¤çŠ¶æ
    712 ‹ã§ã‚ã‚‹
    713 ã€€ãƒ»CPUロック状æ
    714 ‹ã§ãªã„
    715 
    716 ã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始/リターン時のシステム状æ
    717 ‹ã«é–¢ã™
    718 ã‚‹ä»•æ§˜ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
    719 
    720                                 CPUロック            割込み優å
    721 ˆåº¦    ディスパッチ
    722                                 フラグ                       ãƒžã‚¹ã‚¯                       ç¦æ­¢ãƒ•ãƒ©ã‚°
     311タスクスケジューラに対しては,どのタスクが実行できる状態であるかを知ら
     312せる必要がある.そのため,タスクスケジューラは,次の2つの関数を用意する.
     313
     314 ・タスクが実行できる状態に遷移したことを知らせる関数(make_runnable)
     315 ・タスクが実行できる状態から他の状態へ遷移したことを知らせる関数
     316        (make_non_runnable)
     317
     318また,処理の効率化のために,上の2つの関数を用いずにレディキューを直接操
     319作してタスクスケジュールを行う関数として,次の2つの関数を用意する.
     320
     321 ・タスクの優先度の変更(change_priority)
     322 ・レディキューの回転(rotate_ready_queue)
     323
     324
     325○タスクディスパッチ処理の実装
     326
     327●タスクディスパッチ処理の必要なタイミング
     328
     329タスクディスパッチは,実行状態のタスク(p_runtsk)と最高優先順位のタス
     330ク(p_schedtsk)が一致しておらず,ディスパッチ保留状態でない場合に行う.
     331このことから,タスクディスパッチ処理を行う必要があるのは,次の3つの場合
     332である.
     333
     334(1) 実行状態のタスクが実行できる状態でなくなる
     335
     336自タスクを広義の待ち状態に遷移させるサービスコールや,自タスクを終了さ
     337せるサービスコールにおいて,タスクディスパッチ処理を行う必要がある.
     338
     339(2) 最高優先順位のタスクが変化する
     340
     341タスクの起動,タスクの待ち解除,タスクの強制待ちからの再開,タスクの優
     342先度の変更,タスクの優先順位の回転を行うサービスコールにおいて,最高優
     343先順位のタスクが変化し,ディスパッチ保留状態でない場合には,タスクディ
     344スパッチ処理を行う必要がある.
     345
     346(3) ディスパッチ保留状態が解除される
     347
     348ディスパッチ保留状態とは,非タスクコンテキストの実行中,CPUロック状態,
     349割込み優先度マスクが全解除でない状態,ディスパッチ禁止状態の総称である
     350ため,これらの状態のいずれかが遷移するタイミングで,タスクディスパッチ
     351処理を行う必要がある.具体的には,次のタイミングが該当する.
     352
     353(3-1) 非タスクコンテキストからタスクコンテキストに遷移する
     354
     355割込みハンドラまたはCPU例外ハンドラからタスクにリターンする際に,タスク
     356ディスパッチ処理を行う必要がある.
     357
     358(3-2) CPUロック状態が解除される
     359
     360CPUロック状態においては,上記の(1)や(2)の状況を作り出すサービスコールを
     361呼び出すことができない.そのため,CPUロック状態の解除時には,タスクディ
     362スパッチ処理を行う必要がない.
     363
     364(3-3) 割込み優先度マスクが全解除される
     365
     366割込み優先度マスクの変更(chg_ipm)により割込み優先度マスクが全解除され
     367る場合に,タスクディスパッチ処理を行う必要がある.
     368
     369また,タスクの終了,タスク例外処理ルーチンからのリターン,割込みハンド
     370ラからのリターン,割込みサービスルーチンからのリターン,タイムイベント
     371ハンドラからのリターン,CPU例外ハンドラからのリターンによって,割込み優
     372先度マスクが全解除される場合があり,その場合には,タスクディスパッチ処
     373理を行う必要がある.ただし,割込みサービスルーチンおよびタイムイベント
     374ハンドラからのリターンについては,リターン後も非タスクコンテキストであ
     375り,タスクディスパッチ保留状態が継続することから,タスクディスパッチ処
     376理を行う必要がない.
     377
     378(3-4) ディスパッチ許可状態になる
     379
     380ディスパッチの許可(ena_dsp)において,タスクディスパッチ処理を行う必要
     381がある.
     382
     383また,タスクの終了とタスク例外処理ルーチンからのリターンによって,ディ
     384スパッチ許可状態になる場合があり,その場合には,タスクディスパッチ処理
     385を行う必要がある.
     386
     387以上に加えて,カーネルの動作開始時にも,タスクディスパッチ処理を呼び出
     388す.
     389
     390●タスクディスパッチャの構造
     391
     392タスクディスパッチャの主な機能は,切換え前のタスクのコンテキスト(プロ
     393セッサの汎用レジスタ等)をメモリ上に保存し,切換え後のタスクのコンテキ
     394ストをメモリ上から復帰することである.ここで,保存/復帰しなければなら
     395ないレジスタは,タスクディスパッチャが実行される状況によって,次のよう
     396な違いがある.
     397
     398・タスクが割込み(または,CPU例外)によりプリエンプトされる場合には,す
     399 べてのレジスタを保存しなければならない.また,その状態から実行再開す
     400 る場合には,すべてのレジスタを復帰しなければならない.
     401
     402・タスクが自発的にタスクディスパッチャを呼び出す場合には,スクラッチレ
     403 ジスタ(caller saved register)以外のレジスタを保存すればよい.また,
     404 その状態から実行再開する場合には,スクラッチレジスタ以外のレジスタを
     405 復帰すればよい.
     406
     407・タスクが終了する場合には,どのレジスタも保存する必要がない.
     408
     409・タスクが実行開始する場合には,どのレジスタも復帰する必要がない.
     410
     411そこで,それぞれの状況で必要最低限のレジスタのみを保存/復帰するために,
     412タスクディスパッチ処理を,(a) コンテキストの保存処理,(b) 実行するタス
     413クの選択処理,(c) コンテキストの復帰処理の3つのステップで構成し,(a)と
     414(c)のステップについては,タスクディスパッチャが実行される状況毎に用意す
     415る.具体的には,次の各処理を行うルーチンを用意する.
     416
     417(a) コンテキストの保存処理
     418        (a-1) タスクが自発的に呼び出した場合の保存処理(dispatch)
     419        (a-2) 割込みハンドラの出口で呼び出された場合の保存処理(ret_int)
     420        (a-3) CPU例外ハンドラの出口で呼び出された場合の保存処理(ret_exc)
     421        (a-4) タスクの終了時の処理(exit_and_dispatch)
     422        (a-5) カーネルの動作開始時の処理(start_dispatch)
     423(b) 実行するタスクの選択(ディスパッチャ本体,dispatcher)
     424(c) コンテキストの復帰処理
     425        (c-1) タスクが自発的に呼び出した場合の復帰処理(dispatch_r)
     426        (c-2) 割込みハンドラの出口で呼び出された場合の復帰処理(ret_int_r)
     427        (c-3) CPU例外ハンドラの出口で呼び出された場合の復帰処理(ret_exc_r)
     428        (c-4) タスクの実行開始時の処理(start_r)
     429
     430●タスクの終了時のタスクディスパッチ
     431
     432ext_tskによるタスクの終了時に,起動要求がキューイングされていると,同じ
     433タスクがすぐに起動される.この場合,タスクディスパッチャにとっては,同
     434じタスクへの切換えに見え,タスクディスパッチ処理をスキップ可能に思える
     435が,実際には,同じタスクの異なるインスタンスへの切換えであるため,タス
     436クディスパッチ処理をスキップしてはならない.
     437
     438上述のタスクディスパッチャの構造により,タスクの終了時には,それ専用の
     439処理(exit_and_dispatch)を呼び出す.この処理では,実行状態のタスクを参
     440照せず,コンテキストの保存も行わずに,次に事項するタスクの選択処理を行
     441うため,タスクディスパッチ処理がスキップされることはない.
     442
     443なお,ter_tskによって実行状態のタスクを終了させることはできないため,
     444ter_tskではこのような状況は起こらない.
     445
     446●reqflgの導入理由
     447
     448割込みハンドラ/CPU例外ハンドラの出口処理に,タスクディスパッチまたはタ
     449スク例外処理ルーチンの実行開始を要求することを示すフラグとして,reqflg
     450を用意している.非タスクコンテキストにおいて,タスクディスパッチが必要
     451になった場合や,タスク例外処理ルーチンの実行開始が必要になった場合には,
     452このフラグをセットする.
     453
     454reqflgを導入した理由は,割込みハンドラ/CPU例外ハンドラの出口処理の典型
     455的なケース(タスクディスパッチもタスク例外処理ルーチンの実行開始も必要
     456ない場合)を高速化するためである.また,ディスパッチャ本体(dispatcher)
     457のアイドル処理も高速化できる.
     458
     459しかし,割込みハンドラ/CPU例外ハンドラの出口処理全体のオーバヘッドを考
     460えると,reqflgによる高速化の効果はそれほど大きくないものと思われる.
     461
     462
     463○タスク例外処理機能の実装
     464
     465●タスク例外処理ルーチンの実行開始条件とシステム状態(仕様の確認)
     466
     467タスク例外処理ルーチンは,次の6つの条件が揃った場合に実行が開始される.
     468
     469 ・タスク例外処理許可状態である
     470 ・保留例外要因が0でない
     471 ・タスクが実行状態である
     472 ・タスクコンテキストが実行されている
     473 ・割込み優先度マスク全解除状態である
     474 ・CPUロック状態でない
     475
     476また,タスク例外処理ルーチンの実行開始/リターン時のシステム状態に関す
     477る仕様は次の通りである.
     478
     479                                CPUロック          割込み優先度  ディスパッチ
     480                                フラグ                     マスク                     禁止フラグ
    723481------------------------------------------------------------
    724 ã€ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチン】
    725 å®Ÿè¡Œé–‹å§‹æ¡ä»¶      解除                  å
    726 ¨è§£é™¤                 ä»»æ„
    727 å®Ÿè¡Œé–‹å§‹æ™‚処理   ãã®ã¾ã¾            そのまま            そのまま
    728 ãƒªã‚¿ãƒ¼ãƒ³å‰         åŽŸå‰‡è§£é™¤(*1)        原則å
    729 ¨è§£é™¤(*1)     å
    730 ƒã«æˆ»ã™
    731 ãƒªã‚¿ãƒ¼ãƒ³æ™‚処理   è§£é™¤ã™ã‚‹            å
    732 ¨è§£é™¤ã™ã‚‹           å
    733 ƒã«æˆ»ã™(*4)
     482【タスク例外処理ルーチン】
     483実行開始条件  解除                      全解除                     任意
     484実行開始時処理 そのまま            そのまま            そのまま
     485リターン前           原則解除(*1)        原則全解除(*1)       元に戻す
     486リターン時処理 解除する            全解除する           元に戻す(*4)
    734487------------------------------------------------------------
    735488
    736 â—ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの呼出し処理
    737 
    738 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンを呼び出す処理は,次の流れとなる.この関数は,
    739 CPUロック状æ
    740 ‹ã§å‘¼ã³å‡ºã™ã“とを想定している.
     489●タスク例外処理ルーチンの呼出し処理
     490
     491タスク例外処理ルーチンを呼び出す処理は,次の流れとなる.この関数は,
     492CPUロック状態で呼び出すことを想定している.
    741493
    742494----------------------------------------
     
    749501        p_runtsk->texptn = 0U;
    750502
    751         タスク例外処理禁止状æ
    752 ‹ã«ã™ã‚‹
    753         ディスパッチ禁止フラグを保存する
    754 
    755         CPUロック解除状æ
    756 ‹ã«ã™ã‚‹
    757         タスク例外処理ルーチンを呼び出す
    758         CPUロック状æ
    759 ‹ã«ã™ã‚‹
    760 
    761         割込み優å
    762 ˆåº¦ãƒžã‚¹ã‚¯å
    763 ¨è§£é™¤çŠ¶æ
    764 ‹ã«ã™ã‚‹
    765         ディスパッチ禁止フラグをå
    766 ƒã«æˆ»ã™
    767         タスク例外処理禁止状æ
    768 ‹ã«ã™ã‚‹ … (*2)
    769 
    770         å¿
    771 è¦ãªå ´åˆã«ã¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチを行う … (*1)
    772 
    773         タスク例外処理許可状æ
    774 ‹ã«ã™ã‚‹
     503        タスク例外処理禁止状態にする
     504        ディスパッチ禁止フラグを保存する
     505
     506        CPUロック解除状態にする
     507        タスク例外処理ルーチンを呼び出す
     508        CPUロック状態にする
     509
     510        割込み優先度マスク全解除状態にする
     511        ディスパッチ禁止フラグを元に戻す
     512        タスク例外処理禁止状態にする … (*2)
     513
     514        必要な場合にはディスパッチを行う … (*1)
     515
     516        タスク例外処理許可状態にする
    775517}
    776518----------------------------------------
    777519
    778 (*1)において,å¿
    779 è¦ãªå ´åˆã«ã‚¿ã‚¹ã‚¯åˆ‡æ›ãˆã‚’行うのは,割込み優å
    780 ˆåº¦ãƒžã‚¹ã‚¯ã‚’
    781 å
    782 ¨è§£é™¤ã«ã—,ディスパッチ禁止フラグをå
    783 ƒã«æˆ»ã—た結果,ディスパッチ保留状
    784 æ
    785 ‹ãŒè§£é™¤ã•ã‚Œï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチがå¿
    786 è¦ã«ãªã‚‹å ´åˆãŒã‚るためである.
    787 
    788 ã¾ãŸï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチを行う前にタスク例外処理禁止状æ
    789 ‹ã«ã™ã‚‹(*2)理由につい
    790 ã¦ã¯ï¼Œã€Œcall_texrtnからdispatchを呼び出す処理について」の節を参ç
    791 §ã™ã‚‹ã“
    792 ã¨ï¼Ž
    793 
    794 â—ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始がå¿
    795 è¦ãªã‚¿ã‚¤ãƒŸãƒ³ã‚°
    796 
    797 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンは,前述の6つの条件が揃った場合に実行開始すべきで
    798 ã‚るため,6つの条件のいずれかを新たに満たすようになる可能性のあるタイミ
    799 ãƒ³ã‚°ã§ï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始がå¿
    800 è¦ã«ãªã‚‹ï¼Ž
    801 
    802 ä»¥ä¸‹ã§ã¯ï¼Œ6つの条件のいずれかを新たに満たすようになるタイミングについて
    803 æ¤œè¨Žã™ã‚‹ï¼Ž
    804 
    805 (1) タスク例外処理許可状æ
    806 ‹ã§ã‚ã‚‹
    807 
    808 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理の許可(ena_tex)によって,タスク例外処理許可状æ
    809 ‹ã«ãªã‚‹ï¼Ž
    810 ã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンからのリターンによっても,タスク例外処理許
    811 å¯çŠ¶æ
    812 ‹ã«ãªã‚‹ï¼Ž
    813 
    814 (2) 保留例外要因が0でない
    815 
    816 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理の要求(ras_tex,iras_tex)によって,タスクの保留例外要因
    817 ãŒ0でなくなる.ただし,非タスクコンテキストからのタスク例外処理の要求
    818 ï¼ˆiras_tex)では,(4)の条件が満たされないため,タスク例外処理ルーチンの
    819 å®Ÿè¡Œé–‹å§‹ã¯å¿
    820 è¦ãªã„.
    821 
    822 (3) タスクが実行状æ
    823 ‹ã§ã‚ã‚‹
    824 
    825 ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチャにより,切換え後のタスクが実行状æ
    826 ‹ã«ãªã‚‹ï¼Ž
    827 
    828 (4) タスクコンテキストが実行されている
    829 
    830 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ãŠã‚ˆã³CPU例外ハンドラからのリターンによって,タスクコンテ
    831 ã‚­ã‚¹ãƒˆã«æˆ»ã‚‹å ´åˆãŒã‚る.
    832 
    833 (5) 割込み優å
    834 ˆåº¦ãƒžã‚¹ã‚¯å
    835 ¨è§£é™¤çŠ¶æ
    836 ‹ã§ã‚ã‚‹
    837 
    838 å‰²è¾¼ã¿å„ªå
    839 ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´ï¼ˆchg_ipm)によって,割込み優å
    840 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    841 ¨è§£é™¤
    842 ã«ãªã‚‹ï¼Ž
    843 
    844 ã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ã®çµ‚了,タスク例外処理ルーチンからのリターン,割込みハンド
    845 ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ï¼ŒCPU例外ハンドラからのリターンによっても,割込み優å
    846 ˆåº¦
    847 ãƒžã‚¹ã‚¯ãŒå
    848 ¨è§£é™¤ã•ã‚Œã‚‹å ´åˆã‚‚ある.
    849 
    850 ãŸã ã—,タスクの終了時については,タスクの終了後は別のタスクへ切り換わ
    851 ã‚‹ãŸã‚ï¼Œåˆ‡ã‚Šæ›ã‚ã£ãŸå¾Œã®ã‚¿ã‚¹ã‚¯ã«å¯¾ã™ã‚‹ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始
    852 ã‚’,タスクディスパッチ後の処理で行えばよい.
    853 
    854 (6) CPUロック状æ
    855 ‹ã§ãªã„
    856 
    857 CPUロック状æ
    858 ‹ã®è§£é™¤ï¼ˆunl_cpu,iunl_cpu)によって,CPUロック状æ
    859 ‹ã§ãªããª
    860 ã‚‹ï¼ŽãŸã ã—,非タスクコンテキストでのCPUロック状æ
    861 ‹ã®è§£é™¤ï¼ˆiunl_cpu)では,
    862 (4)の条件が満たされないため,タスク例外処理ルーチンの実行開始はå¿
    863 è¦ãªã„.
    864 
    865 ã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ã®çµ‚了,タスク例外処理ルーチンからのリターン,割込みハンド
    866 ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ï¼Œå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンからのリターン,タイムイベント
    867 ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ï¼ŒCPU例外ハンドラからのリターンによって,CPUロッ
    868 ã‚¯çŠ¶æ
    869 ‹ã§ãªããªã‚‹å ´åˆã‚‚ある.
    870 
    871 ãŸã ã—,割込みサービスルーチンおよびタイムイベントハンドラからのリター
    872 ãƒ³ã«ã¤ã„ては,リターン後も非タスクコンテキストの実行が続き,(4)の条件が
    873 æº€ãŸã•ã‚Œãªã„ため,タスク例外処理ルーチンの実行開始はå¿
    874 è¦ãªã„.
    875 
    876 ã‚¿ã‚¹ã‚¯ã®çµ‚了時については,タスクの終了後は別のタスクへ切り換わるため,
    877 åˆ‡ã‚Šæ›ã‚ã£ãŸå¾Œã®ã‚¿ã‚¹ã‚¯ã«å¯¾ã™ã‚‹ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始を,タス
    878 ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチ後の処理で行えばよい.
    879 
    880 ä»¥ä¸Šã‚ˆã‚Šï¼Œé‡è¤‡ã™ã‚‹ã‚±ãƒ¼ã‚¹ã‚’考æ
    881 ®ã™ã‚‹ã¨ï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始
    882 ãŒå¿
    883 è¦ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚るのは,以下の処理である.
    884 
    885 (a) タスク例外処理の許可(ena_tex)… (1)
    886 (b) タスク例外処理ルーチンの出口処理 … (1)(5)(6)
    887 (c) タスク例外処理の要求(ras_tex)… (2)
    888 (d) タスクディスパッチ後の処理 … (3)(5)(6)
     520(*1)において,必要な場合にタスク切換えを行うのは,割込み優先度マスクを
     521全解除にし,ディスパッチ禁止フラグを元に戻した結果,ディスパッチ保留状
     522態が解除され,ディスパッチが必要になる場合があるためである.
     523
     524また,ディスパッチを行う前にタスク例外処理禁止状態にする(*2)理由につい
     525ては,「call_texrtnからdispatchを呼び出す処理について」の節を参照するこ
     526と.
     527
     528●タスク例外処理ルーチンの実行開始が必要なタイミング
     529
     530タスク例外処理ルーチンは,前述の6つの条件が揃った場合に実行開始すべきで
     531あるため,6つの条件のいずれかを新たに満たすようになる可能性のあるタイミ
     532ングで,タスク例外処理ルーチンの実行開始が必要になる.
     533
     534以下では,6つの条件のいずれかを新たに満たすようになるタイミングについて
     535検討する.
     536
     537(1) タスク例外処理許可状態である
     538
     539タスク例外処理の許可(ena_tex)によって,タスク例外処理許可状態になる.
     540また,タスク例外処理ルーチンからのリターンによっても,タスク例外処理許
     541可状態になる.
     542
     543(2) 保留例外要因が0でない
     544
     545タスク例外処理の要求(ras_tex,iras_tex)によって,タスクの保留例外要因
     546が0でなくなる.ただし,非タスクコンテキストからのタスク例外処理の要求
     547(iras_tex)では,(4)の条件が満たされないため,タスク例外処理ルーチンの
     548実行開始は必要ない.
     549
     550(3) タスクが実行状態である
     551
     552タスクディスパッチャにより,切換え後のタスクが実行状態になる.
     553
     554(4) タスクコンテキストが実行されている
     555
     556割込みハンドラおよびCPU例外ハンドラからのリターンによって,タスクコンテ
     557キストに戻る場合がある.
     558
     559(5) 割込み優先度マスク全解除状態である
     560
     561割込み優先度マスクの変更(chg_ipm)によって,割込み優先度マスクが全解除
     562になる.
     563
     564また,タスクの終了,タスク例外処理ルーチンからのリターン,割込みハンド
     565ラからのリターン,CPU例外ハンドラからのリターンによっても,割込み優先度
     566マスクが全解除される場合もある.
     567
     568ただし,タスクの終了時については,タスクの終了後は別のタスクへ切り換わ
     569るため,切り換わった後のタスクに対するタスク例外処理ルーチンの実行開始
     570を,タスクディスパッチ後の処理で行えばよい.
     571
     572(6) CPUロック状態でない
     573
     574CPUロック状態の解除(unl_cpu,iunl_cpu)によって,CPUロック状態でなくな
     575る.ただし,非タスクコンテキストでのCPUロック状態の解除(iunl_cpu)では,
     576(4)の条件が満たされないため,タスク例外処理ルーチンの実行開始は必要ない.
     577
     578また,タスクの終了,タスク例外処理ルーチンからのリターン,割込みハンド
     579ラからのリターン,割込みサービスルーチンからのリターン,タイムイベント
     580ハンドラからのリターン,CPU例外ハンドラからのリターンによって,CPUロッ
     581ク状態でなくなる場合もある.
     582
     583ただし,割込みサービスルーチンおよびタイムイベントハンドラからのリター
     584ンについては,リターン後も非タスクコンテキストの実行が続き,(4)の条件が
     585満たされないため,タスク例外処理ルーチンの実行開始は必要ない.
     586
     587タスクの終了時については,タスクの終了後は別のタスクへ切り換わるため,
     588切り換わった後のタスクに対するタスク例外処理ルーチンの実行開始を,タス
     589クディスパッチ後の処理で行えばよい.
     590
     591以上より,重複するケースを考慮すると,タスク例外処理ルーチンの実行開始
     592が必要になる可能性があるのは,以下の処理である.
     593
     594(a) タスク例外処理の許可(ena_tex)… (1)
     595(b) タスク例外処理ルーチンの出口処理 … (1)(5)(6)
     596(c) タスク例外処理の要求(ras_tex)… (2)
     597(d) タスクディスパッチ後の処理 … (3)(5)(6)
    889598        (d-1) dispatch_r
    890599        (d-2) ret_int_r
    891600        (d-3) ret_exc_r
    892601        (d-4) start_r
    893 (e) 割込みハンドラの出口処理 … (4)(5)(6)
    894 (f) CPU例外ハンドラの出口処理 … (4)(5)(6)
    895 (g) 割込み優å
    896 ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´ï¼ˆchg_ipm)… (5)
    897 (h) CPUロック状æ
    898 ‹ã®è§£é™¤ï¼ˆunl_cpu)… (6)
    899 
    900 ã“の中で(d-4)に関しては,タスクの実行開始直後はタスク例外処理禁止状æ
    901 ‹ã§
    902 ã‚り(自タスクがena_texするまでは,タスク例外が許可されない),(1)の条
    903 ä»¶ãŒæº€ãŸã•ã‚Œãªã„ため,タスク例外処理ルーチンの実行開始はå¿
    904 è¦ãªã„.
    905 
    906 ã¾ãŸ(h)に関しては,次に述べる理由により,CPUロック状æ
    907 ‹ãŒç¶™ç¶šã—ている間
    908 ã«ä»–の5つの条件が新たに満たされることはないため,タスク例外処理ルーチン
    909 ã®å®Ÿè¡Œé–‹å§‹ã¯å¿
    910 è¦ãªã„.
    911 
    912 CPUロック状æ
    913 ‹ã§ã¯ï¼Œã¾ãšï¼Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理の許可(ena_tex),タスク例外処
    914 ç†ã®è¦æ±‚(ras_tex,iras_tex),割込み優å
    915 ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´ï¼ˆchg_ipm)を行
    916 ã†ã“とはできず,タスクディスパッチも起こらない.CPUロック状æ
    917 ‹ã§ã‚¿ã‚¹ã‚¯ä¾‹
    918 å¤–処理ルーチンからリターンすることはできるが,この場合はCPUロック状æ
    919 ‹ã‚‚
    920 è§£é™¤ã•ã‚Œï¼ŒCPUロック状æ
    921 ‹ãŒç¶™ç¶šã—ない.CPUロック状æ
    922 ‹ã§å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰
    923 ãƒªã‚¿ãƒ¼ãƒ³ã—た場合も,これと同様である.
    924 
    925 æœ€å¾Œã«ï¼ŒCPUロック状æ
    926 ‹ã§CPU例外ハンドラからリターンした場合が問題になる.
    927 ã“れについては,CPU例外が発生した時に,CPUロック状æ
    928 ‹ã§ã‚った場合と,
    929 CPUロック解除状æ
    930 ‹ã§ã‚った場合に分けて考える.CPUロック解除状æ
    931 ‹ã§ã‚った
    932 å ´åˆã«ã¯ï¼ŒCPU例外ハンドラからのリターンにより,CPUロック状æ
    933 ‹ãŒè§£é™¤ã•ã‚Œ
    934 ã‚‹ãŸã‚ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ãƒªã‚¿ãƒ¼ãƒ³ã—た場合と同様である.CPUロック状æ
    935 ‹ã§
    936 ã‚った場合には,起動されるCPU例外ハンドラはカーネル管理外のCPU例外ハン
    937 ãƒ‰ãƒ©ã§ã‚るため,その中で(1)~(3)と(5)の条件が新たに満たされることはない.
    938 CPU例外ハンドラの実行前後で(4)の条件は保存されることから,CPU例外ハンド
    939 ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ã«ã‚ˆã£ã¦ï¼Œ(1)~(5)の条件はCPU例外の発生前に戻り,新たに
    940 æº€ãŸã•ã‚Œã‚‹ã“とはない.
    941 
    942 â—ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始処理
    943 
    944 ã“こでは,前の節で検討したタスク例外処理ルーチンの実行開始がå¿
    945 è¦ãªã‚¿ã‚¤
    946 ãƒŸãƒ³ã‚°ã®ãã‚Œãžã‚Œã«ã¤ã„て,実行開始処理の実è£
    947 æ–¹æ³•ã«ã¤ã„て述べる.
    948 
    949 (a) タスク例外処理の許可(ena_tex)
    950 
    951 ena_texがタスクから呼び出された場合には,自タスクに対して「タスクが実行
    952 çŠ¶æ
    953 ‹ã§ã‚る」「タスクコンテキストが実行されている」の2条件は満たされてお
    954 ã‚Šï¼Œã€Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理許可状æ
    955 ‹ã§ã‚る」の条件はena_texの処理により満たされ
    956 ã‚‹ï¼Žã¾ãŸï¼Œã€ŒCPUロック状æ
    957 ‹ã§ãªã„」の条件はena_texのå
    958 ¥å£ã§ãƒã‚§ãƒƒã‚¯ã—てい
    959 ã‚‹ï¼Žãã®ãŸã‚ï¼Œã€Œä¿ç•™ä¾‹å¤–要因が0でない」と「割込み優å
    960 ˆåº¦ãƒžã‚¹ã‚¯å
    961 ¨è§£é™¤çŠ¶æ
    962 ‹
    963 ã§ã‚る」の2条件が満たされている場合には,タスク例外処理ルーチンを呼び出
    964 ã™ï¼Ž
    965 
    966 ena_texの本体の処理(エラー処理を除く)は次の通り.
     602(e) 割込みハンドラの出口処理 … (4)(5)(6)
     603(f) CPU例外ハンドラの出口処理 … (4)(5)(6)
     604(g) 割込み優先度マスクの変更(chg_ipm)… (5)
     605(h) CPUロック状態の解除(unl_cpu)… (6)
     606
     607この中で(d-4)に関しては,タスクの実行開始直後はタスク例外処理禁止状態で
     608あり(自タスクがena_texするまでは,タスク例外が許可されない),(1)の条
     609件が満たされないため,タスク例外処理ルーチンの実行開始は必要ない.
     610
     611また(h)に関しては,次に述べる理由により,CPUロック状態が継続している間
     612に他の5つの条件が新たに満たされることはないため,タスク例外処理ルーチン
     613の実行開始は必要ない.
     614
     615CPUロック状態では,まず,タスク例外処理の許可(ena_tex),タスク例外処
     616理の要求(ras_tex,iras_tex),割込み優先度マスクの変更(chg_ipm)を行
     617うことはできず,タスクディスパッチも起こらない.CPUロック状態でタスク例
     618外処理ルーチンからリターンすることはできるが,この場合はCPUロック状態も
     619解除され,CPUロック状態が継続しない.CPUロック状態で割込みハンドラから
     620リターンした場合も,これと同様である.
     621
     622最後に,CPUロック状態でCPU例外ハンドラからリターンした場合が問題になる.
     623これについては,CPU例外が発生した時に,CPUロック状態であった場合と,
     624CPUロック解除状態であった場合に分けて考える.CPUロック解除状態であった
     625場合には,CPU例外ハンドラからのリターンにより,CPUロック状態が解除され
     626るため,割込みハンドラからリターンした場合と同様である.CPUロック状態で
     627あった場合には,起動されるCPU例外ハンドラはカーネル管理外のCPU例外ハン
     628ドラであるため,その中で(1)~(3)と(5)の条件が新たに満たされることはない.
     629CPU例外ハンドラの実行前後で(4)の条件は保存されることから,CPU例外ハンド
     630ラからのリターンによって,(1)~(5)の条件はCPU例外の発生前に戻り,新たに
     631満たされることはない.
     632
     633●タスク例外処理ルーチンの実行開始処理
     634
     635ここでは,前の節で検討したタスク例外処理ルーチンの実行開始が必要なタイ
     636ミングのそれぞれについて,実行開始処理の実装方法について述べる.
     637
     638(a) タスク例外処理の許可(ena_tex)
     639
     640ena_texがタスクから呼び出された場合には,自タスクに対して「タスクが実行
     641状態である」「タスクコンテキストが実行されている」の2条件は満たされてお
     642り,「タスク例外処理許可状態である」の条件はena_texの処理により満たされ
     643る.また,「CPUロック状態でない」の条件はena_texの入口でチェックしてい
     644る.そのため,「保留例外要因が0でない」と「割込み優先度マスク全解除状態
     645である」の2条件が満たされている場合には,タスク例外処理ルーチンを呼び出
     646す.
     647
     648ena_texの本体の処理(エラー処理を除く)は次の通り.
    967649
    968650----------------------------------------
     
    973655----------------------------------------
    974656
    975 (b) タスク例外処理ルーチンの出口処理
    976 
    977 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの出口処理(call_texrtnの後半)では,自タスクに対
    978 ã—て「タスクが実行状æ
    979 ‹ã§ã‚る」「タスクコンテキストが実行されている」の
    980 2条件は満たされており,「タスク例外処理許可状æ
    981 ‹ã§ã‚る」「割込み優å
    982 ˆåº¦ãƒž
    983 ã‚¹ã‚¯å
    984 ¨è§£é™¤çŠ¶æ
    985 ‹ã§ã‚る」「CPUロック状æ
    986 ‹ã§ãªã„」の3条件が出口処理で満たさ
    987 ã‚Œã‚‹ï¼Žãã®ãŸã‚ï¼Œã€Œä¿ç•™ä¾‹å¤–要因が0でない」が満たされている場合には,タス
    988 ã‚¯ä¾‹å¤–処理ルーチンを呼び出すå¿
    989 è¦ãŒã‚る.
    990 
    991 ãŸã ã—,タスク例外処理ルーチンの出口処理で単純にcall_texrtnを呼び出すと,
    992 call_texrtnの中からcall_texrtnを呼び出すことになり,タスク例外処理が繰
    993 ã‚Šè¿”し要求された場合に,スタックの使用量に上限がなくなる.そこで,タス
    994 ã‚¯ä¾‹å¤–処理ルーチンの出口処理で「保留例外要因が0でない」場合には,
    995 call_texrtnの中でループさせる.
    996 
    997 ä¿®æ­£ã—たcall_texrtnの流れは次の通り.
     657(b) タスク例外処理ルーチンの出口処理
     658
     659タスク例外処理ルーチンの出口処理(call_texrtnの後半)では,自タスクに対
     660して「タスクが実行状態である」「タスクコンテキストが実行されている」の
     6612条件は満たされており,「タスク例外処理許可状態である」「割込み優先度マ
     662スク全解除状態である」「CPUロック状態でない」の3条件が出口処理で満たさ
     663れる.そのため,「保留例外要因が0でない」が満たされている場合には,タス
     664ク例外処理ルーチンを呼び出す必要がある.
     665
     666ただし,タスク例外処理ルーチンの出口処理で単純にcall_texrtnを呼び出すと,
     667call_texrtnの中からcall_texrtnを呼び出すことになり,タスク例外処理が繰
     668り返し要求された場合に,スタックの使用量に上限がなくなる.そこで,タス
     669ク例外処理ルーチンの出口処理で「保留例外要因が0でない」場合には,
     670call_texrtnの中でループさせる.
     671
     672修正したcall_texrtnの流れは次の通り.
    998673
    999674----------------------------------------
     
    1003678        TEXPTN  texptn;
    1004679
    1005         ディスパッチ禁止フラグを保存する … (*3)
    1006         タスク例外処理禁止状æ
    1007 ‹ã«ã™ã‚‹ … (*6)
     680        ディスパッチ禁止フラグを保存する … (*3)
     681        タスク例外処理禁止状態にする … (*6)
    1008682
    1009683        do {
     
    1011685                p_runtsk->texptn = 0U;
    1012686
    1013                 CPUロック解除状æ
    1014 ‹ã«ã™ã‚‹
    1015                 タスク例外処理ルーチンを呼び出す
    1016                 CPUロック状æ
    1017 ‹ã«ã™ã‚‹
    1018 
    1019                 割込み優å
    1020 ˆåº¦ãƒžã‚¹ã‚¯å
    1021 ¨è§£é™¤çŠ¶æ
    1022 ‹ã«ã™ã‚‹
    1023                 ディスパッチ禁止フラグをå
    1024 ƒã«æˆ»ã™ … (*4)
    1025                 タスク例外処理禁止状æ
    1026 ‹ã«ã™ã‚‹ … (*2)
    1027 
    1028                 å¿
    1029 è¦ãªå ´åˆã«ã¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチを行う … (*1)
     687                CPUロック解除状態にする
     688                タスク例外処理ルーチンを呼び出す
     689                CPUロック状態にする
     690
     691                割込み優先度マスク全解除状態にする
     692                ディスパッチ禁止フラグを元に戻す … (*4)
     693                タスク例外処理禁止状態にする … (*2)
     694
     695                必要な場合にはディスパッチを行う … (*1)
    1030696        }  while (p_runtsk->texptn != 0U);
    1031697
    1032         タスク例外処理許可状æ
    1033 ‹ã«ã™ã‚‹ … (*5)
     698        タスク例外処理許可状態にする … (*5)
    1034699}
    1035700----------------------------------------
    1036701
    1037 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの呼出し前にディスパッチ禁止フラグを保存する処理
    1038 ã¯ï¼Œ(*4)においてå
    1039 ƒã®çŠ¶æ
    1040 ‹ã«æˆ»ã™ã“とから,ループの外(*3)で行うのが効率が
    1041 ã‚ˆã„.
    1042 
    1043 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの呼出し前にタスク例外処理禁止状æ
    1044 ‹ã«ã™ã‚‹å‡¦ç†ã¯ï¼Œ
    1045 (*2)においてタスク例外処理禁止状æ
    1046 ‹ã«ã™ã‚‹ã“とから,ループ外(*6)で行うの
    1047 ãŒåŠ¹çŽ‡ãŒã‚ˆã„.また,タスク例外処理ルーチンの呼出し後にタスク例外処理許
    1048 å¯çŠ¶æ
    1049 ‹ã«ã™ã‚‹å‡¦ç†ã‚‚,ループの外(*5)で行う方が効率がよい.
    1050 
    1051 (c) タスク例外処理の要求(ras_tex)
    1052 
    1053 ras_texがタスクから呼び出された場合で,対象タスクが自タスクの場合には,
    1054 è‡ªã‚¿ã‚¹ã‚¯ã«å¯¾ã—て「タスクが実行状æ
    1055 ‹ã§ã‚る」「タスクコンテキストが実行さ
    1056 ã‚Œã¦ã„る」の2条件は満たされており,「保留例外要因が0でない」の条件は
    1057 ras_texの処理により満たされる(ras_texのパラメータrasptnが0の場合はエラー
    1058 ã¨ãªã‚‹ãŸã‚ï¼‰ï¼Žã¾ãŸï¼Œã€ŒCPUロック状æ
    1059 ‹ã§ãªã„」の条件はras_texのå
    1060 ¥å£ã§ãƒã‚§ãƒƒ
    1061 ã‚¯ã—ている.そのため,対象タスクが自タスクであり,「タスク例外処理許可
    1062 çŠ¶æ
    1063 ‹ã§ã‚る」と「割込み優å
    1064 ˆåº¦ãƒžã‚¹ã‚¯å
    1065 ¨è§£é™¤çŠ¶æ
    1066 ‹ã§ã‚る」の2条件が満たされて
    1067 ã„る場合には,タスク例外処理ルーチンを呼び出す.
    1068 
    1069 ras_texの本体の処理(エラー処理を除く)は次の通り.
     702タスク例外処理ルーチンの呼出し前にディスパッチ禁止フラグを保存する処理
     703は,(*4)において元の状態に戻すことから,ループの外(*3)で行うのが効率が
     704よい.
     705
     706タスク例外処理ルーチンの呼出し前にタスク例外処理禁止状態にする処理は,
     707(*2)においてタスク例外処理禁止状態にすることから,ループ外(*6)で行うの
     708が効率がよい.また,タスク例外処理ルーチンの呼出し後にタスク例外処理許
     709可状態にする処理も,ループの外(*5)で行う方が効率がよい.
     710
     711(c) タスク例外処理の要求(ras_tex)
     712
     713ras_texがタスクから呼び出された場合で,対象タスクが自タスクの場合には,
     714自タスクに対して「タスクが実行状態である」「タスクコンテキストが実行さ
     715れている」の2条件は満たされており,「保留例外要因が0でない」の条件は
     716ras_texの処理により満たされる(ras_texのパラメータrasptnが0の場合はエラー
     717となるため).また,「CPUロック状態でない」の条件はras_texの入口でチェッ
     718クしている.そのため,対象タスクが自タスクであり,「タスク例外処理許可
     719状態である」と「割込み優先度マスク全解除状態である」の2条件が満たされて
     720いる場合には,タスク例外処理ルーチンを呼び出す.
     721
     722ras_texの本体の処理(エラー処理を除く)は次の通り.
    1070723
    1071724----------------------------------------
     
    1078731(d-1) dispatch_r
    1079732
    1080 dispatch_rにおいては,dispatch_rからのリターンå
    1081 ˆã®ã‚¿ã‚¹ã‚¯ã«å¯¾ã—て,「タ
    1082 ã‚¹ã‚¯ãŒå®Ÿè¡ŒçŠ¶æ
    1083 ‹ã§ã‚る」「タスクコンテキストが実行されている」の2条件は満
    1084 ãŸã•ã‚Œã¦ã„る.また,CPUロック状æ
    1085 ‹ã§dispatch_rに来ることはないため,
    1086 ã€ŒCPUロック状æ
    1087 ‹ã§ãªã„」の条件も成立している.そのため,「タスク例外処理
    1088 è¨±å¯çŠ¶æ
    1089 ‹ã§ã‚る」「保留例外要因が0でない」「割込み優å
    1090 ˆåº¦ãƒžã‚¹ã‚¯å
    1091 ¨è§£é™¤çŠ¶æ
    1092 ‹
    1093 ã§ã‚る」の3条件が満たされている場合には,タスク例外処理ルーチンを呼び出
    1094 ã™å¿
    1095 è¦ãŒã‚る.
    1096 
    1097 ã“れを実現するために,タスクコンテキストからのディスパッチ処理を次のよ
    1098 ã†ã«ä¿®æ­£ã™ã‚‹ï¼Ž
     733dispatch_rにおいては,dispatch_rからのリターン先のタスクに対して,「タ
     734スクが実行状態である」「タスクコンテキストが実行されている」の2条件は満
     735たされている.また,CPUロック状態でdispatch_rに来ることはないため,
     736「CPUロック状態でない」の条件も成立している.そのため,「タスク例外処理
     737許可状態である」「保留例外要因が0でない」「割込み優先度マスク全解除状態
     738である」の3条件が満たされている場合には,タスク例外処理ルーチンを呼び出
     739す必要がある.
     740
     741これを実現するために,タスクコンテキストからのディスパッチ処理を次のよ
     742うに修正する.
    1099743
    1100744----------------------------------------
     
    1102746dispatch(void)
    1103747{
    1104         ………
     748        ………
    1105749
    1106750  dispatch_r:
    1107         スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
     751        スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
    1108752        calltex();
    1109753}
    1110754----------------------------------------
    1111755
    1112 ã“こでcalltexは,「タスク例外処理許可状æ
    1113 ‹ã§ã‚る」「保留例外要因が0でな
    1114 ã„」「割込み優å
    1115 ˆåº¦ãƒžã‚¹ã‚¯å
    1116 ¨è§£é™¤çŠ¶æ
    1117 ‹ã§ã‚る」の3条件が満たされている場合に
    1118 call_texrtnを呼び出す関数である.
     756ここでcalltexは,「タスク例外処理許可状態である」「保留例外要因が0でな
     757い」「割込み優先度マスク全解除状態である」の3条件が満たされている場合に
     758call_texrtnを呼び出す関数である.
    1119759
    1120760----------------------------------------
     
    1130770(d-2) ret_int_r
    1131771
    1132 ret_int_rは,割込みハンドラの出口処理でディスパッチを行ったタスクが,実
    1133 è¡Œã‚’再開する際の処理である.そのため,ret_int_rからのリターンå
    1134 ˆã®ã‚¿ã‚¹ã‚¯
    1135 ã«å¯¾ã—て,「タスクが実行状æ
    1136 ‹ã§ã‚る」「タスクコンテキストが実行されてい
    1137 ã‚‹ã€ã®2条件は満たされている.また,CPUロック状æ
    1138 ‹ã§ret_int_rに来ることは
    1139 ãªã„ため,「CPUロック状æ
    1140 ‹ã§ãªã„」の条件も成立している.そのため,「タス
    1141 ã‚¯ä¾‹å¤–処理許可状æ
    1142 ‹ã§ã‚る」「保留例外要因が0でない」「(割込みハンドラか
    1143 ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³å¾Œã«ï¼‰å‰²è¾¼ã¿å„ªå
    1144 ˆåº¦ãƒžã‚¹ã‚¯å
    1145 ¨è§£é™¤çŠ¶æ
    1146 ‹ã§ã‚る」の3条件が満たされ
    1147 ã¦ã„る場合には,タスク例外処理ルーチンを呼び出すå¿
    1148 è¦ãŒã‚る.
    1149 
    1150 ã“れを実現するために,割込みハンドラの出å
    1151 ¥å£å‡¦ç†ã‚’次のように修正する.
     772ret_int_rは,割込みハンドラの出口処理でディスパッチを行ったタスクが,実
     773行を再開する際の処理である.そのため,ret_int_rからのリターン先のタスク
     774に対して,「タスクが実行状態である」「タスクコンテキストが実行されてい
     775る」の2条件は満たされている.また,CPUロック状態でret_int_rに来ることは
     776ないため,「CPUロック状態でない」の条件も成立している.そのため,「タス
     777ク例外処理許可状態である」「保留例外要因が0でない」「(割込みハンドラか
     778らのリターン後に)割込み優先度マスク全解除状態である」の3条件が満たされ
     779ている場合には,タスク例外処理ルーチンを呼び出す必要がある.
     780
     781これを実現するために,割込みハンドラの出入口処理を次のように修正する.
    1152782
    1153783----------------------------------------
    1154784void
    1155 <割込みの出å
    1156 ¥å£å‡¦ç†>(void)
     785<割込みの出入口処理>(void)
    1157786{
    1158                 ………
     787                ………
    1159788
    1160789                          ret_int_r:
    1161                                 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
     790                                スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
    1162791                                calltex();
    1163792                        }
    1164                 ………
     793                ………
    1165794}
    1166795----------------------------------------
     
    1168797(d-3) ret_exc_r
    1169798
    1170 ret_exc_rは,CPU例外ハンドラの出口処理でディスパッチを行ったタスクが,
    1171 å®Ÿè¡Œã‚’再開する際の処理である.
    1172 
    1173 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã®CPU例外ハンドラの出口処理(ret_exc)は,割込みハンドラの
    1174 å‡ºå£å‡¦ç†ï¼ˆret_int)と同様である.これは,CPUロック状æ
    1175 ‹ã§CPU例外が発生し
    1176 ãŸå ´åˆã«ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–のCPU例外ハンドラとなり,CPU例外ハンドラの出
    1177 å£å‡¦ç†ã§ãƒ‡ã‚£ã‚¹ãƒ‘ッチを行うことはなく,ret_excにも来ないためである.その
    1178 ãŸã‚ï¼Œret_exc_rからのリターンå
    1179 ˆã®ã‚¿ã‚¹ã‚¯ã«å¯¾ã—て,「CPUロック状æ
    1180 ‹ã§ãªã„」
    1181 ã®æ¡ä»¶ãŒæˆç«‹ã—ている.
    1182 
    1183 ã“のことから,CPU例外ハンドラの出å
    1184 ¥å£å‡¦ç†ã«ã¤ã„ても,割込みハンドラの出
    1185 å
    1186 ¥å£å‡¦ç†ã¨åŒæ§˜ã«ï¼Œæ¬¡ã®ã‚ˆã†ã«ä¿®æ­£ã™ã‚Œã°ã‚ˆã„.
     799ret_exc_rは,CPU例外ハンドラの出口処理でディスパッチを行ったタスクが,
     800実行を再開する際の処理である.
     801
     802カーネル管理のCPU例外ハンドラの出口処理(ret_exc)は,割込みハンドラの
     803出口処理(ret_int)と同様である.これは,CPUロック状態でCPU例外が発生し
     804た場合には,カーネル管理外のCPU例外ハンドラとなり,CPU例外ハンドラの出
     805口処理でディスパッチを行うことはなく,ret_excにも来ないためである.その
     806ため,ret_exc_rからのリターン先のタスクに対して,「CPUロック状態でない」
     807の条件が成立している.
     808
     809このことから,CPU例外ハンドラの出入口処理についても,割込みハンドラの出
     810入口処理と同様に,次のように修正すればよい.
    1187811
    1188812----------------------------------------
    1189813void
    1190 <CPU例外の出å
    1191 ¥å£å‡¦ç†>(void)
     814<CPU例外の出入口処理>(void)
    1192815{
    1193                         ………
     816                        ………
    1194817
    1195818                                  ret_exc_r:
    1196                                         スクラッチレジスタを除くすべてのレジスタを
    1197                                                                                                 スタックから復帰する
     819                                        スクラッチレジスタを除くすべてのレジスタを
     820                                                                                                スタックから復帰する
    1198821                                        calltex();
    1199822                                }
    1200                         ………
     823                        ………
    1201824}
    1202825----------------------------------------
    1203826
    1204 (e) 割込みハンドラの出口処理
    1205 
    1206 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ã‚¿ã‚¹ã‚¯ã¸ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹å ´åˆã«ã¯ï¼Œãƒªã‚¿ãƒ¼ãƒ³å
    1207 ˆã®ã‚¿ã‚¹ã‚¯ã«å¯¾
    1208 ã—て,「タスクが実行状æ
    1209 ‹ã§ã‚る」「タスクコンテキストが実行されている」
    1210 ã®2条件は満たされている.また,CPUロック状æ
    1211 ‹ã§å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ãŒå®Ÿè¡Œã•ã‚Œ
    1212 ã‚‹ã“とはないため,「CPUロック状æ
    1213 ‹ã§ãªã„」の条件も成立している.そのため,
    1214 ã€Œã‚¿ã‚¹ã‚¯ä¾‹å¤–処理許可状æ
    1215 ‹ã§ã‚る」「保留例外要因が0でない」「(割込みハン
    1216 ãƒ‰ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³å¾Œã«ï¼‰å‰²è¾¼ã¿å„ªå
    1217 ˆåº¦ãƒžã‚¹ã‚¯å
    1218 ¨è§£é™¤çŠ¶æ
    1219 ‹ã§ã‚る」の3条件が満
    1220 ãŸã•ã‚Œã¦ã„る場合には,タスク例外処理ルーチンを呼び出すå¿
    1221 è¦ãŒã‚る.
    1222 
    1223 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®å‘¼å‡ºã—前と呼出し後でこれらの条件が変化するのは,実行状
    1224 æ
    1225 ‹ã®ã‚¿ã‚¹ã‚¯ãŒå¤‰åŒ–した時と,割込みハンドラ中でiras_texが呼び出された場合
    1226 ã§ã‚る.割込みハンドラからはena_texとchg_ipmは呼び出せないため,「タス
    1227 ã‚¯ä¾‹å¤–処理許可状æ
    1228 ‹ã§ã‚る」と「(割込みハンドラからのリターン後に)割込
    1229 ã¿å„ªå
    1230 ˆåº¦ãƒžã‚¹ã‚¯å
    1231 ¨è§£é™¤çŠ¶æ
    1232 ‹ã§ã‚る」の2条件が変化することはない.
    1233 
    1234 ã“の2つの状況のå†
    1235 ï¼Œå®Ÿè¡ŒçŠ¶æ
    1236 ‹ã®ã‚¿ã‚¹ã‚¯ãŒå¤‰åŒ–するケースは,ret_int_rで考æ
    1237 ®
    1238 æ¸ˆã¿ã§ã‚る.割込みハンドラ中でiras_texが呼び出された場合には,reqflgが
    1239 trueになるため,タスク例外処理ルーチンの実行開始処理は,reqflgがtrueの
    1240 æ™‚にのみ行えばよい.
    1241 
    1242 ã“れを実現するために,上で修正した割込みハンドラの出å
    1243 ¥å£å‡¦ç†ã‚’,さらに
    1244 æ¬¡ã®ã‚ˆã†ã«ä¿®æ­£ã™ã‚‹ï¼Ž
     827(e) 割込みハンドラの出口処理
     828
     829割込みハンドラからタスクへリターンする場合には,リターン先のタスクに対
     830して,「タスクが実行状態である」「タスクコンテキストが実行されている」
     831の2条件は満たされている.また,CPUロック状態で割込みハンドラが実行され
     832ることはないため,「CPUロック状態でない」の条件も成立している.そのため,
     833「タスク例外処理許可状態である」「保留例外要因が0でない」「(割込みハン
     834ドラからのリターン後に)割込み優先度マスク全解除状態である」の3条件が満
     835たされている場合には,タスク例外処理ルーチンを呼び出す必要がある.
     836
     837割込みハンドラの呼出し前と呼出し後でこれらの条件が変化するのは,実行状
     838態のタスクが変化した時と,割込みハンドラ中でiras_texが呼び出された場合
     839である.割込みハンドラからはena_texとchg_ipmは呼び出せないため,「タス
     840ク例外処理許可状態である」と「(割込みハンドラからのリターン後に)割込
     841み優先度マスク全解除状態である」の2条件が変化することはない.
     842
     843この2つの状況の内,実行状態のタスクが変化するケースは,ret_int_rで考慮
     844済みである.割込みハンドラ中でiras_texが呼び出された場合には,reqflgが
     845trueになるため,タスク例外処理ルーチンの実行開始処理は,reqflgがtrueの
     846時にのみ行えばよい.
     847
     848これを実現するために,上で修正した割込みハンドラの出入口処理を,さらに
     849次のように修正する.
    1245850
    1246851----------------------------------------
    1247852void
    1248 <割込みの出å
    1249 ¥å£å‡¦ç†>(void)
     853<割込みの出入口処理>(void)
    1250854{
    1251         ………
    1252 
    1253         if (タスクコンテキストで割込み発生) {
    1254                 ………
     855        ………
     856
     857        if (タスクコンテキストで割込み発生) {
     858                ………
    1255859                if (reqflg) {
    1256                         ………
     860                        ………
    1257861
    1258862                          ret_int_r:
    1259                                 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
     863                                スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
    1260864                        }
    1261865                        calltex();
    1262866                }
    1263867        }
    1264         ………
     868        ………
    1265869}
    1266870----------------------------------------
    1267871
    1268 (f) CPU例外ハンドラの出口処理
    1269 
    1270 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã®CPU例外ハンドラの出口処理は,割込みハンドラの出口処理と同
    1271 æ§˜ã§ã‚る.
    1272 
    1273 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–のCPU例外ハンドラの中では,実行状æ
    1274 ‹ã®ã‚¿ã‚¹ã‚¯ãŒå¤‰åŒ–すること
    1275 ã¯ãªãï¼Œiras_texやena_texを呼び出すこともできないため,タスク例外処理ルー
    1276 ãƒãƒ³ã®å®Ÿè¡Œé–‹å§‹æ¡ä»¶ãŒæ–°ãŸã«æº€ãŸã•ã‚Œã‚‹ã“とはなく,タスク例外処理ルーチン
    1277 ã®å®Ÿè¡Œé–‹å§‹ã¯å¿
    1278 è¦ãªã„.
    1279 
    1280 ã“のことから,CPU例外ハンドラの出å
    1281 ¥å£å‡¦ç†ã«ã¤ã„ても,割込みハンドラの出
    1282 å
    1283 ¥å£å‡¦ç†ã¨åŒæ§˜ã«ï¼Œæ¬¡ã®ã‚ˆã†ã«ä¿®æ­£ã™ã‚Œã°ã‚ˆã„.
     872(f) CPU例外ハンドラの出口処理
     873
     874カーネル管理のCPU例外ハンドラの出口処理は,割込みハンドラの出口処理と同
     875様である.
     876
     877カーネル管理外のCPU例外ハンドラの中では,実行状態のタスクが変化すること
     878はなく,iras_texやena_texを呼び出すこともできないため,タスク例外処理ルー
     879チンの実行開始条件が新たに満たされることはなく,タスク例外処理ルーチン
     880の実行開始は必要ない.
     881
     882このことから,CPU例外ハンドラの出入口処理についても,割込みハンドラの出
     883入口処理と同様に,次のように修正すればよい.
    1284884
    1285885----------------------------------------
    1286886void
    1287 <CPU例外の出å
    1288 ¥å£å‡¦ç†>(void)
     887<CPU例外の出入口処理>(void)
    1289888{
    1290                 ………
    1291                 if (タスクコンテキストでCPU例外発生) {
    1292                 ………
     889                ………
     890                if (タスクコンテキストでCPU例外発生) {
     891                ………
    1293892                        if (reqflg) {
    1294893
    1295894                                  ret_exc_r:
    1296                                         スクラッチレジスタを除くすべてのレジスタを
    1297                                                                                                 スタックから復帰する
     895                                        スクラッチレジスタを除くすべてのレジスタを
     896                                                                                                スタックから復帰する
    1298897                                }
    1299898                                calltex();
    1300899                        }
    1301900                }
    1302                 ………
     901                ………
    1303902}
    1304903----------------------------------------
    1305904
    1306 (g) 割込み優å
    1307 ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´
    1308 
    1309 chg_ipmがタスクから呼び出された場合には,自タスクに対して「タスクが実行
    1310 çŠ¶æ
    1311 ‹ã§ã‚る」「タスクコンテキストが実行されている」の2条件は満たされてい
    1312 ã‚‹ï¼Žã¾ãŸï¼Œã€ŒCPUロック状æ
    1313 ‹ã§ãªã„」の条件はchg_ipmのå
    1314 ¥å£ã§ãƒã‚§ãƒƒã‚¯ã—てい
    1315 ã‚‹ï¼Žãã®ãŸã‚ï¼Œãƒ‘ラメータintpriがTIPM_ENAALLであり,「タスク例外処理許可
    1316 çŠ¶æ
    1317 ‹ã§ã‚る」「保留例外要因が0でない」の2条件が満たされている場合には,
    1318 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンを呼び出す.
    1319 
    1320 chg_ipmの関連部分の処理は次の通り.
     905(g) 割込み優先度マスクの変更
     906
     907chg_ipmがタスクから呼び出された場合には,自タスクに対して「タスクが実行
     908状態である」「タスクコンテキストが実行されている」の2条件は満たされてい
     909る.また,「CPUロック状態でない」の条件はchg_ipmの入口でチェックしてい
     910る.そのため,パラメータintpriがTIPM_ENAALLであり,「タスク例外処理許可
     911状態である」「保留例外要因が0でない」の2条件が満たされている場合には,
     912タスク例外処理ルーチンを呼び出す.
     913
     914chg_ipmの関連部分の処理は次の通り.
    1321915
    1322916----------------------------------------
     
    1324918        if (intpri == TIPM_ENAALL) {
    1325919                ipmflg = true;
    1326                 ここにタスク切換え処理がå
    1327 ¥ã‚‹
     920                ここにタスク切換え処理が入る
    1328921                if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
    1329922                        call_texrtn();
     
    1332925----------------------------------------
    1333926
    1334 dispatchを呼び出してタスク切換えを行う場合には,dispatchの出口でタスク
    1335 ä¾‹å¤–処理ルーチンを呼び出すためここで呼出し処理を行うå¿
    1336 è¦ã¯ãªã„が,コー
    1337 ãƒ‰ãŒè¤‡é›‘になるため,dispatchを呼び出した場合もここでタスク例外処理ルー
    1338 ãƒãƒ³ã®å‘¼å‡ºã—処理を行っている.
    1339 
    1340 â—call_texrtnからdispatchを呼び出す処理について
    1341 
    1342 dispatch_rから(ターゲットによってはcalltexを経由して)call_texrtnを呼
    1343 ã³å‡ºã—,call_texrtnからdispatchを呼び出すため,この2つの関数は相互再帰
    1344 å‘¼å‡ºã—をしている.ここでは,この実è£
    1345 ã§æ”¯éšœã®ãªã„理由を説明する.
    1346 
    1347 call_texrtnからdispatchを呼び出すのは,ディスパッチが保留されていない状
    1348 æ
    1349 ‹ã§å‘¼ã³å‡ºã•ã‚ŒãŸã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンが,その実行中にディスパッチ保留
    1350 çŠ¶æ
    1351 ‹ã«é·ç§»ã—,さらにタスクディスパッチをå¿
    1352 è¦ã¨ã™ã‚‹å‡¦ç†ã‚’行い,ディスパッ
    1353 ãƒä¿ç•™çŠ¶æ
    1354 ‹ã‚’解除しないままリターンした場合である.この場合,call_texrtn
    1355 ã®ä¸­ã§ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    1356 ‹ã‚’解除した後に,dispatchを呼び出してタスクディ
    1357 ã‚¹ãƒ‘ッチを行う.つまり,call_texrtnからdispatchを呼び出す処理は,タスク
    1358 ä¾‹å¤–処理ルーチンの中でディスパッチ保留状æ
    1359 ‹ã‚’解除すべきであったのを,解
    1360 é™¤ã›ãšã«ãƒªã‚¿ãƒ¼ãƒ³ã—た場合を救済するためのものである.以下,この振舞いを
    1361 ã€Œæ•‘済ケース」と呼ぶ.
    1362 
    1363 ãã“で,比較のために,タスク例外処理ルーチンの最後で,正しくディスパッ
    1364 ãƒä¿ç•™çŠ¶æ
    1365 ‹ã‚’解除してからリターンした場合の振舞いを考える.この場合には,
    1366 ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    1367 ‹ã‚’解除するサービスコール(ena_dsp,chg_ipm)の中で,
    1368 dispatchが呼び出されてタスクディスパッチが起こる.以下,この振舞いを
    1369 ã€Œæ­£å¸¸ã‚±ãƒ¼ã‚¹ã€ã¨å‘¼ã¶ï¼Ž
    1370 
    1371 æ­£å¸¸ã‚±ãƒ¼ã‚¹ã¨æ•‘済ケースを比較すると,call_texrtn→タスク例外処理ルーチン
    1372 â†’サービスコール→dispatchの順でdispatchが呼び出されるか,call_texrtnか
    1373 ã‚‰ç›´æŽ¥dispatchが呼び出されるかの違いということになり,救済ケースの方が
    1374 ã‚¹ã‚¿ãƒƒã‚¯ã®ä½¿ç”¨é‡ã¯å°‘ない.つまり,正常ケースの動きを想定してスタック領
    1375 åŸŸãŒç”¨æ„ã—てあれば,救済ケースでも問題なく動作することになる.
    1376 
    1377 ã“こで,正常ケースと救済ケースで,上記以外に違いがないことが重要である.
    1378 å
    1379 ·ä½“的には,call_texrtnの中で,タスク例外処理許可状æ
    1380 ‹ã«ã™ã‚‹ï¼ˆp_runtsk
    1381 ->enatexをtrueにする)前に,dispatchを呼び出すことが重要である.タスク
    1382 ä¾‹å¤–処理許可状æ
    1383 ‹ã«ã—た後にdispatchを呼び出すと,出口のdispatch_rで,再
    1384 ã³ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンを実行してしまう可能性があり,救済ケースの方が
    1385 ã‚¹ã‚¿ãƒƒã‚¯ã®ä½¿ç”¨é‡ãŒå¢—えてしまう.
    1386 
    1387 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの中で,タスク例外処理許可状æ
    1388 ‹ã«ã—たままリターン
    1389 ã—た場合には,call_texrtnから呼び出したdispatchの出口のdispatch_rで再び
    1390 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンを実行してしまう可能性がある.この場合も,タスク
    1391 ä¾‹å¤–処理ルーチンの最後で,ディスパッチ保留状æ
    1392 ‹ã‚’解除してからリターンし
    1393 ãŸå ´åˆã‚ˆã‚Šã¯ã‚¹ã‚¿ãƒƒã‚¯ã®ä½¿ç”¨é‡ãŒå°‘ないが,タスク例外処理禁止状æ
    1394 ‹ã«ã—た後
    1395 ã«ãƒ‡ã‚£ã‚¹ãƒ‘ッチ保留状æ
    1396 ‹ã‚’解除してリターンした場合よりは,スタックの使用
    1397 é‡ãŒå¢—える場合がある.そこで,このような状況が起こらないように,
    1398 dispatchを呼ぶ前にp_runtsk->enatexをfalseにする.
    1399 
    1400 
    1401 â—‹ã‚¨ãƒ©ãƒ¼ã®ãƒã‚§ãƒƒã‚¯é †åº
    1402 
    1403 ã‚µãƒ¼ãƒ“スコールå†
    1404 ã«ãŠã‘るエラーチェックは,以下の順序で行うことを原則と
    1405 ã™ã‚‹ï¼ŽãªãŠï¼Œã“の節には,保護機能対応カーネルに関する記述が含まれている
    1406 ãŒï¼Œãã‚Œã‚‰ã®è¨˜è¿°ã¯å°†æ¥çš„にはより適切なドキュメントに移動する予定である.
    1407 
    1408 â—ã‚¨ãƒ©ãƒ¼ã®3分類
    1409 
    1410 ã‚µãƒ¼ãƒ“スコールのエラーは,大きく以下の3つに分類することができる.
    1411 
    1412 (a) 静的エラー
    1413 
    1414 å¯¾è±¡ã®ã‚«ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトが登録されているか否かや,その状æ
    1415 ‹ã«ä¾å­˜ã›ãš
    1416 ã«ï¼Œãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“とができるエラー.
    1417 
    1418 (b) 準静的エラー
    1419 
    1420 å¯¾è±¡ã®ã‚«ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトが登録されていれば,その状æ
    1421 ‹ã«ä¾å­˜ã›ãšã«ãƒã‚§ãƒƒ
    1422 ã‚¯ã™ã‚‹ã“とができるエラー.
    1423 
    1424 (c) 動的エラー
    1425 
    1426 å¯¾è±¡ã®ã‚«ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトの状æ
    1427 ‹ã«ä¾å­˜ã™ã‚‹ã‚¨ãƒ©ãƒ¼ï¼Ž
    1428 
    1429 ASPカーネルにおいては,(a)と(b)のエラーはクリティカルセクションの外側で,
    1430 ã“の順序でチェックし,(c)のエラーはクリティカルセクションのå†
    1431 å´ã§ãƒã‚§ãƒƒ
    1432 ã‚¯ã™ã‚‹ï¼ŽãŸã ã—,動的生成機能拡張パッケージでは,(b)のエラー(の一部)は
    1433 ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®å†
    1434 å´ã§å®Ÿæ–½ã™ã‚‹å¿
    1435 è¦ãŒã‚る.
    1436 
    1437 â—é™çš„エラーのチェック順序
    1438 
    1439 é™çš„エラーには,実行コンテキストのエラー(ディスパッチ保留状æ
    1440 ‹ã‹ã‚‰ã®å‘¼
    1441 å‡ºã—エラーも含む),パラメータの範囲等のエラー(対象のカーネルオブジェ
    1442 ã‚¯ãƒˆã«ä¾å­˜ã›ãšã«ãƒã‚§ãƒƒã‚¯ã§ãã‚‹ã‚‚の)が含まれる.
    1443 
    1444 ã‚µãƒ¼ãƒ“スコール中では,最初に実行コンテキストのエラーをチェックし,その
    1445 å¾Œï¼Œãƒ‘ラメータの並び順に,範囲等のエラーをチェックする.
    1446 
    1447 ä¿è­·æ©Ÿèƒ½å¯¾å¿œã‚«ãƒ¼ãƒãƒ«ã§ã¯ï¼Œãƒ‘ラメータがポインタである場合に,ポインタの
    1448 æŒ‡ã™ãƒ¡ãƒ¢ãƒªé ˜åŸŸãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§ã‚るかをチェックするå¿
    1449 è¦ãŒã‚るが,メモリ
    1450 é ˜åŸŸã®è¨­å®šãŒé™çš„である場合には,このエラーチェックもここで実施する.た
    1451 ã ã—,メモリ領域の設定が静的でない場合には,このエラーチェックはクリティ
    1452 ã‚«ãƒ«ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®å†
    1453 å´ã§è¡Œã†å¿
    1454 è¦ãŒã‚る.
    1455 
    1456 â—å‡†é™çš„エラーのチェック順序
    1457 
    1458 å‡†é™çš„エラーのチェックの前に,対象のカーネルオブジェクトの管理ブロック
    1459 ã®å
    1460 ˆé ­ç•ªåœ°ã‚’,ローカル変数に代å
    1461 ¥ã™ã‚‹ï¼Ž
    1462 
    1463 ä¿è­·æ©Ÿèƒ½å¯¾å¿œã‚«ãƒ¼ãƒãƒ«ã§ã¯ï¼Œã“の次に,対象のカーネルオブジェクトがアクセ
    1464 ã‚¹å¯èƒ½ã§ã‚るかをチェックする処理を行う.当該サービスコールの呼出しが,
    1465 ã‚·ã‚¹ãƒ†ãƒ çŠ¶æ
    1466 ‹ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹è¨±å¯ãƒ™ã‚¯ã‚¿ã§ä¿è­·ã•ã‚Œã¦ã„る場合にも,この段
    1467 éšŽã§ãƒã‚§ãƒƒã‚¯ã‚’実施する.
    1468 
    1469 ãã®å¾Œã§ï¼Œãƒ‘ラメータの範囲等のエラーの中で,対象のカーネルオブジェクト
    1470 ã®ç™»éŒ²æƒ
    1471 å ±ï¼ˆåˆæœŸåŒ–ブロックに含まれているæƒ
    1472 å ±ï¼‰ã«ä¾å­˜ã—てチェックすべき
    1473 ã‚‚ののチェックを,パラメータの並び順で実施する.
    1474 
    1475 
    1476 â—‹CHECKマクロとgoto文の使用
    1477 
    1478 ASPカーネルの実è£
    1479 ã«ãŠã„ては,サービスコールの静的なエラーをチェックする
    1480 ãŸã‚ã«ï¼Œåç§°ãŒ"CHECK_"で始まる一連のマクロ(これらを,CHECKマクロと総称
    1481 ã™ã‚‹ï¼‰ã‚’用いている.
    1482 
    1483 CHECKマクロの定義中にはgoto文を含んでいるが,MISRA-Cなどのコーディング
    1484 ãƒ«ãƒ¼ãƒ«ã§ã¯goto文の使用を禁止しており,goto文を使うべきではないという意
    1485 è¦‹ã‚‚多い.また,マクロの定義中にgoto文を使用することが問題であるという
    1486 æ„è¦‹ã‚‚ある.
    1487 
    1488 ã“こでは,定義中にgoto文を含むCHECKマクロを用いる設計意図とそれを使用し
    1489 ã¦ã‚ˆã„条件,CHECKマクロの使用によりソフトウェアの信頼性に問題が生じるこ
    1490 ã¨ãŒãªã„ことを論証する.
    1491 
    1492 ãªãŠï¼ŒASPカーネルのカーネル本体の実è£
    1493 ã§ã¯ï¼ŒCHECKマクロ以外にgoto文を用
    1494 ã„ている箇所はない(一部のシステムサービスでは,これ以外の方法でgoto文
    1495 ã‚’用いている).
    1496 
    1497 â—CHECKマクロの定義とその使用法
    1498 
    1499 kernel/check.hには,25個のCHECKマクロが定義されているが,いずれも次のパ
    1500 ã‚¿ãƒ¼ãƒ³ã§å®šç¾©ã•ã‚Œã¦ã„る.ここでXXXXXには,チェックしたいエラーの種類を表
    1501 ã™æ–‡å­—列がå
    1502 ¥ã‚‹ï¼Ž
    1503 
    1504 ----------------------------------------
    1505 #define CHECK_XXXXX(<……>) {                         \
    1506         if (<エラー条件>) {                                                \
    1507                 ercd = <エラーコード>;                            \
     927dispatchを呼び出してタスク切換えを行う場合には,dispatchの出口でタスク
     928例外処理ルーチンを呼び出すためここで呼出し処理を行う必要はないが,コー
     929ドが複雑になるため,dispatchを呼び出した場合もここでタスク例外処理ルー
     930チンの呼出し処理を行っている.
     931
     932●call_texrtnからdispatchを呼び出す処理について
     933
     934dispatch_rから(ターゲットによってはcalltexを経由して)call_texrtnを呼
     935び出し,call_texrtnからdispatchを呼び出すため,この2つの関数は相互再帰
     936呼出しをしている.ここでは,この実装で支障のない理由を説明する.
     937
     938call_texrtnからdispatchを呼び出すのは,ディスパッチが保留されていない状
     939態で呼び出されたタスク例外処理ルーチンが,その実行中にディスパッチ保留
     940状態に遷移し,さらにタスクディスパッチを必要とする処理を行い,ディスパッ
     941チ保留状態を解除しないままリターンした場合である.この場合,call_texrtn
     942の中でディスパッチ保留状態を解除した後に,dispatchを呼び出してタスクディ
     943スパッチを行う.つまり,call_texrtnからdispatchを呼び出す処理は,タスク
     944例外処理ルーチンの中でディスパッチ保留状態を解除すべきであったのを,解
     945除せずにリターンした場合を救済するためのものである.以下,この振舞いを
     946「救済ケース」と呼ぶ.
     947
     948そこで,比較のために,タスク例外処理ルーチンの最後で,正しくディスパッ
     949チ保留状態を解除してからリターンした場合の振舞いを考える.この場合には,
     950ディスパッチ保留状態を解除するサービスコール(ena_dsp,chg_ipm)の中で,
     951dispatchが呼び出されてタスクディスパッチが起こる.以下,この振舞いを
     952「正常ケース」と呼ぶ.
     953
     954正常ケースと救済ケースを比較すると,call_texrtn→タスク例外処理ルーチン
     955→サービスコール→dispatchの順でdispatchが呼び出されるか,call_texrtnか
     956ら直接dispatchが呼び出されるかの違いということになり,救済ケースの方が
     957スタックの使用量は少ない.つまり,正常ケースの動きを想定してスタック領
     958域が用意してあれば,救済ケースでも問題なく動作することになる.
     959
     960ここで,正常ケースと救済ケースで,上記以外に違いがないことが重要である.
     961具体的には,call_texrtnの中で,タスク例外処理許可状態にする(p_runtsk
     962->enatexをtrueにする)前に,dispatchを呼び出すことが重要である.タスク
     963例外処理許可状態にした後にdispatchを呼び出すと,出口のdispatch_rで,再
     964びタスク例外処理ルーチンを実行してしまう可能性があり,救済ケースの方が
     965スタックの使用量が増えてしまう.
     966
     967タスク例外処理ルーチンの中で,タスク例外処理許可状態にしたままリターン
     968した場合には,call_texrtnから呼び出したdispatchの出口のdispatch_rで再び
     969タスク例外処理ルーチンを実行してしまう可能性がある.この場合も,タスク
     970例外処理ルーチンの最後で,ディスパッチ保留状態を解除してからリターンし
     971た場合よりはスタックの使用量が少ないが,タスク例外処理禁止状態にした後
     972にディスパッチ保留状態を解除してリターンした場合よりは,スタックの使用
     973量が増える場合がある.そこで,このような状況が起こらないように,
     974dispatchを呼ぶ前にp_runtsk->enatexをfalseにする.
     975
     976
     977○エラーのチェック順序
     978
     979サービスコール内におけるエラーチェックは,以下の順序で行うことを原則と
     980する.なお,この節には,保護機能対応カーネルに関する記述が含まれている
     981が,それらの記述は将来的にはより適切なドキュメントに移動する予定である.
     982
     983●エラーの3分類
     984
     985サービスコールのエラーは,大きく以下の3つに分類することができる.
     986
     987(a) 静的エラー
     988
     989対象のカーネルオブジェクトが登録されているか否かや,その状態に依存せず
     990に,チェックすることができるエラー.
     991
     992(b) 準静的エラー
     993
     994対象のカーネルオブジェクトが登録されていれば,その状態に依存せずにチェッ
     995クすることができるエラー.
     996
     997(c) 動的エラー
     998
     999対象のカーネルオブジェクトの状態に依存するエラー.
     1000
     1001ASPカーネルにおいては,(a)と(b)のエラーはクリティカルセクションの外側で,
     1002この順序でチェックし,(c)のエラーはクリティカルセクションの内側でチェッ
     1003クする.ただし,動的生成機能拡張パッケージでは,(b)のエラー(の一部)は
     1004クリティカルセクションの内側で実施する必要がある.
     1005
     1006●静的エラーのチェック順序
     1007
     1008静的エラーには,実行コンテキストのエラー(ディスパッチ保留状態からの呼
     1009出しエラーも含む),パラメータの範囲等のエラー(対象のカーネルオブジェ
     1010クトに依存せずにチェックできるもの)が含まれる.
     1011
     1012サービスコール中では,最初に実行コンテキストのエラーをチェックし,その
     1013後,パラメータの並び順に,範囲等のエラーをチェックする.
     1014
     1015保護機能対応カーネルでは,パラメータがポインタである場合に,ポインタの
     1016指すメモリ領域がアクセス可能であるかをチェックする必要があるが,メモリ
     1017領域の設定が静的である場合には,このエラーチェックもここで実施する.た
     1018だし,メモリ領域の設定が静的でない場合には,このエラーチェックはクリティ
     1019カルセクションの内側で行う必要がある.
     1020
     1021●准静的エラーのチェック順序
     1022
     1023准静的エラーのチェックの前に,対象のカーネルオブジェクトの管理ブロック
     1024の先頭番地を,ローカル変数に代入する.
     1025
     1026保護機能対応カーネルでは,この次に,対象のカーネルオブジェクトがアクセ
     1027ス可能であるかをチェックする処理を行う.当該サービスコールの呼出しが,
     1028システム状態に対するアクセス許可ベクタで保護されている場合にも,この段
     1029階でチェックを実施する.
     1030
     1031その後で,パラメータの範囲等のエラーの中で,対象のカーネルオブジェクト
     1032の登録情報(初期化ブロックに含まれている情報)に依存してチェックすべき
     1033もののチェックを,パラメータの並び順で実施する.
     1034
     1035
     1036○CHECKマクロとgoto文の使用
     1037
     1038ASPカーネルの実装においては,サービスコールの静的なエラーをチェックする
     1039ために,名称が"CHECK_"で始まる一連のマクロ(これらを,CHECKマクロと総称
     1040する)を用いている.
     1041
     1042CHECKマクロの定義中にはgoto文を含んでいるが,MISRA-Cなどのコーディング
     1043ルールではgoto文の使用を禁止しており,goto文を使うべきではないという意
     1044見も多い.また,マクロの定義中にgoto文を使用することが問題であるという
     1045意見もある.
     1046
     1047ここでは,定義中にgoto文を含むCHECKマクロを用いる設計意図とそれを使用し
     1048てよい条件,CHECKマクロの使用によりソフトウェアの信頼性に問題が生じるこ
     1049とがないことを論証する.
     1050
     1051なお,ASPカーネルのカーネル本体の実装では,CHECKマクロ以外にgoto文を用
     1052いている箇所はない(一部のシステムサービスでは,これ以外の方法でgoto文
     1053を用いている).
     1054
     1055●CHECKマクロの定義とその使用法
     1056
     1057kernel/check.hには,25個のCHECKマクロが定義されているが,いずれも次のパ
     1058ターンで定義されている.ここでXXXXXには,チェックしたいエラーの種類を表
     1059す文字列が入る.
     1060
     1061----------------------------------------
     1062#define CHECK_XXXXX(<……>) {                             \
     1063        if (<エラー条件>) {                                          \
     1064                ercd = <エラーコード>;                                \
    15081065                goto error_exit;                                        \
    15091066        }                                                                               \
     
    15111068----------------------------------------
    15121069
    1513 ã“れらのCHECKマクロは,多くのサービスコールの処理関数中で,次のように使
    1514 ç”¨ã•ã‚Œã¦ã„る.
     1070これらのCHECKマクロは,多くのサービスコールの処理関数中で,次のように使
     1071用されている.
    15151072
    15161073----------------------------------------
    15171074ER
    1518 <サービスコール名>(……)
     1075<サービスコール名>(……)
    15191076{
    1520         <ローカル変数の宣言>
     1077        <ローカル変数の宣言>
    15211078        ER              ercd;
    15221079
    1523         LOG_XXX_YYY_ENTER(……);
    1524         CHECK_XXXXX(……);
    1525         CHECK_YYYYY(……);
    1526 
    1527         <サービスコール処理本体>
     1080        LOG_XXX_YYY_ENTER(……);
     1081        CHECK_XXXXX(……);
     1082        CHECK_YYYYY(……);
     1083
     1084        <サービスコール処理本体>
    15281085
    15291086  error_exit:
    1530         LOG_XXX_YYY_LEAVE(……);
     1087        LOG_XXX_YYY_LEAVE(……);
    15311088        return(ercd);
    15321089}
    15331090----------------------------------------
    15341091
    1535 ã“の例では,CHECKマクロを2つ使用しているが,1つのみ使用している場合もあ
    1536 ã‚Œã°ï¼Œ3つ以上使用している場合もある.また,複数のCHECKマクロの間に,ロー
    1537 ã‚«ãƒ«å¤‰æ•°ã¸ã®ä»£å
    1538 ¥æ–‡ãŒå
    1539 ¥ã‚‹å ´åˆã‚‚ある(例えば,ter_tskの処理関数).
    1540 
    1541 â—è¨­è¨ˆæ„å›³
    1542 
    1543 CHECKマクロを使用する意図は,ほとんどのサービスコールでå¿
    1544 è¦ãªé™çš„エラー
    1545 ã®ãƒã‚§ãƒƒã‚¯ã‚³ãƒ¼ãƒ‰ã‚’パターン化し,ソースコードの簡潔さを保つことで読みや
    1546 ã™ã•ã‚’向上させるとともに,記述ミスの可能性を減らすことである.
    1547 
    1548 ã¡ãªã¿ã«ï¼ŒCHECKマクロを使用しない場合,上に示したサービスコールの処理関
    1549 æ•°ã¯ï¼Œæ¬¡ã®ã‚ˆã†ã«è¨˜è¿°ã™ã‚‹ã“とになる.
     1092この例では,CHECKマクロを2つ使用しているが,1つのみ使用している場合もあ
     1093れば,3つ以上使用している場合もある.また,複数のCHECKマクロの間に,ロー
     1094カル変数への代入文が入る場合もある(例えば,ter_tskの処理関数).
     1095
     1096●設計意図
     1097
     1098CHECKマクロを使用する意図は,ほとんどのサービスコールで必要な静的エラー
     1099のチェックコードをパターン化し,ソースコードの簡潔さを保つことで読みや
     1100すさを向上させるとともに,記述ミスの可能性を減らすことである.
     1101
     1102ちなみに,CHECKマクロを使用しない場合,上に示したサービスコールの処理関
     1103数は,次のように記述することになる.
    15501104
    15511105----------------------------------------
    15521106ER
    1553 <サービスコール名>(……)
     1107<サービスコール名>(……)
    15541108{
    1555         <ローカル変数の宣言>
     1109        <ローカル変数の宣言>
    15561110        ER              ercd;
    15571111
    1558         LOG_XXX_YYY_ENTER(……);
    1559         if (<XXXXXのエラー条件>) {
    1560                 ercd = <XXXXXのエラーコード>;
     1112        LOG_XXX_YYY_ENTER(……);
     1113        if (<XXXXXのエラー条件>) {
     1114                ercd = <XXXXXのエラーコード>;
    15611115        }
    15621116        else {
    1563                 if (<YYYYYのエラー条件>) {
    1564                         ercd = <YYYYYのエラーコード>;
     1117                if (<YYYYYのエラー条件>) {
     1118                        ercd = <YYYYYのエラーコード>;
    15651119                }
    15661120                else {
    15671121
    1568                         <サービスコール処理本体>
     1122                        <サービスコール処理本体>
    15691123
    15701124                }
    15711125        }
    1572         LOG_XXX_YYY_LEAVE(……);
     1126        LOG_XXX_YYY_LEAVE(……);
    15731127        return(ercd);
    15741128}
    15751129----------------------------------------
    15761130
    1577 CHECKマクロのå†
    1578 å®¹ã‚’知っているという前提の下では,å
    1579 ƒã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®æ–¹ãŒ
    1580 èª­ã¿ã‚„すいのは明らかである.
    1581 
    1582 ãªãŠï¼Œã“のようなCHECKマクロの定義には,goto文の使用が不可避である.
    1583 
    1584 â—CHECKマクロを使用してよい条件
    1585 
    1586 CHECKマクロは,次の条件を満たすように使用しなければならない.
    1587 
    1588 (1) CHECKマクロは,サービスコール処理関数のå
    1589 ˆé ­éƒ¨åˆ†ã§ï¼Œã‚µãƒ¼ãƒ“スコールå
    1590 ¥
    1591 ã€€ã€€å£ã®ãƒ­ã‚°ã‚’出した後,クリティカルセクションにå
    1592 ¥ã‚‹å‰ã¾ã§ã«ï¼Œå‡¦ç†é–¢æ•°
    1593 ã€€ã€€ã®ãƒˆãƒƒãƒ—レベルで用いる.
    1594 
    1595 (2) サービスコール処理関数の末尾部分で,クリティカルセクションを抜けた
    1596 ã€€ã€€å¾Œï¼Œã‚µãƒ¼ãƒ“スコール出口のログを出す前に,処理関数のトップレベルに,
    1597 ã€€ã€€error_exitラベルを置く.
    1598 
    1599 â—å•é¡Œã‚’生じることがない根拠
    1600 
    1601 ã“のような方法でgoto文を使用しても,ソフトウェアの信頼性に問題が生じる
    1602 ã“とがないことを主張するには,そもそも,MISRA-Cなどのコーディングルール
    1603 ã§goto文の使用を禁止している根拠,言い換えると,goto文の使用によりソフ
    1604 ãƒˆã‚¦ã‚§ã‚¢ã®ä¿¡é ¼æ€§ã«å•é¡ŒãŒç”Ÿã˜ã‚‹å¯èƒ½æ€§ã®ã‚る理由を明らかにするå¿
    1605 è¦ãŒã‚る.
    1606 
    1607 MISRA-Cのドキュメントでは,goto文の使用を禁止する根拠についてあまり明確
    1608 ã«ãªã£ã¦ãŠã‚‰ãšï¼Œã“こではその根拠を次のように推測する.
    1609 
    1610 ãƒ»å‡¦ç†ã®æµã‚ŒãŒè¤‡é›‘になり,プログラムの意図が読みにくくなる(いわゆる,
    1611 ã€€ã‚¹ãƒ‘ゲッティプログラムになる).
    1612 
    1613 CHECKマクロの場合には,goto文をエラー発生時の強制脱出に用いており,ラベ
    1614 ãƒ«ã‚‚error_exitとするなど,プログラムの意図は明らかである.一方,このよ
    1615 ã†ã«goto文をエラー時の強制脱出に用いる場合には,次の点もgoto文の使用を
    1616 ç¦æ­¢ã™ã‚‹æ ¹æ‹ ã«ãªã‚Šã†ã‚‹ï¼Ž
    1617 
    1618 ãƒ»goto文で強制脱出することにより,脱出時に行わなければならない後処理が
    1619 ã€€é£›ã°ã•ã‚Œã‚‹ãŠãã‚ŒãŒã‚る.
    1620 
    1621 ãŸã ã—この点についても,CHECKマクロを上記の使用条件を満たして使う限りは,
    1622 è„±å‡ºæ™‚に行わなければならない後処理はなく,CHECKマクロの使用によりソフト
    1623 ã‚¦ã‚§ã‚¢ã®ä¿¡é ¼æ€§ã«å•é¡ŒãŒç”Ÿã˜ã‚‹ã“とはない.
    1624 
    1625 å•é¡Œã‚’生じることがないことを論証するもう1つ方法は,コーディングルールに
    1626 åˆè‡´ã—ないプログラムが,コーディングルールに合致したプログラムと等価で
    1627 ã‚ることを示す方法である.
    1628 
    1629 ã™ã§ã«ã€Œè¨­è¨ˆæ„å›³ã€ã®ç¯€ã§è¿°ã¹ãŸã‚ˆã†ã«ï¼ŒCHECKマクロを使用したプログラムは,
    1630 goto文を使用しない等価なプログラムに書き換えることができるが,より一般
    1631 çš„には,次のことが言える.
    1632 
    1633 else部を持たないif文のthen部の最後に,if文より下(前方)にあり,if文と
    1634 åŒã˜ãƒ–ロックå†
    1635 ã®åŒã˜éšŽå±¤ã®ãƒ©ãƒ™ãƒ«ã¸åˆ†å²ã™ã‚‹goto文がある場合には,if文と
    1636 ãƒ©ãƒ™ãƒ«ã®é–“の文をelse部にすることにより,goto文を使わない等価なプログラ
    1637 ãƒ ã«æ›¸ãæ›ãˆã‚‹ã“とができる.
    1638 
    1639 ä¾‹ã¨ã—て,goto文を使った次のプログラムを考える.
     1131CHECKマクロの内容を知っているという前提の下では,元のソースコードの方が
     1132読みやすいのは明らかである.
     1133
     1134なお,このようなCHECKマクロの定義には,goto文の使用が不可避である.
     1135
     1136●CHECKマクロを使用してよい条件
     1137
     1138CHECKマクロは,次の条件を満たすように使用しなければならない.
     1139
     1140(1) CHECKマクロは,サービスコール処理関数の先頭部分で,サービスコール入
     1141  口のログを出した後,クリティカルセクションに入る前までに,処理関数
     1142  のトップレベルで用いる.
     1143
     1144(2) サービスコール処理関数の末尾部分で,クリティカルセクションを抜けた
     1145  後,サービスコール出口のログを出す前に,処理関数のトップレベルに,
     1146  error_exitラベルを置く.
     1147
     1148●問題を生じることがない根拠
     1149
     1150このような方法でgoto文を使用しても,ソフトウェアの信頼性に問題が生じる
     1151ことがないことを主張するには,そもそも,MISRA-Cなどのコーディングルール
     1152でgoto文の使用を禁止している根拠,言い換えると,goto文の使用によりソフ
     1153トウェアの信頼性に問題が生じる可能性のある理由を明らかにする必要がある.
     1154
     1155MISRA-Cのドキュメントでは,goto文の使用を禁止する根拠についてあまり明確
     1156になっておらず,ここではその根拠を次のように推測する.
     1157
     1158・処理の流れが複雑になり,プログラムの意図が読みにくくなる(いわゆる,
     1159 スパゲッティプログラムになる).
     1160
     1161CHECKマクロの場合には,goto文をエラー発生時の強制脱出に用いており,ラベ
     1162ルもerror_exitとするなど,プログラムの意図は明らかである.一方,このよ
     1163うにgoto文をエラー時の強制脱出に用いる場合には,次の点もgoto文の使用を
     1164禁止する根拠になりうる.
     1165
     1166・goto文で強制脱出することにより,脱出時に行わなければならない後処理が
     1167 飛ばされるおそれがある.
     1168
     1169ただしこの点についても,CHECKマクロを上記の使用条件を満たして使う限りは,
     1170脱出時に行わなければならない後処理はなく,CHECKマクロの使用によりソフト
     1171ウェアの信頼性に問題が生じることはない.
     1172
     1173問題を生じることがないことを論証するもう1つ方法は,コーディングルールに
     1174合致しないプログラムが,コーディングルールに合致したプログラムと等価で
     1175あることを示す方法である.
     1176
     1177すでに「設計意図」の節で述べたように,CHECKマクロを使用したプログラムは,
     1178goto文を使用しない等価なプログラムに書き換えることができるが,より一般
     1179的には,次のことが言える.
     1180
     1181else部を持たないif文のthen部の最後に,if文より下(前方)にあり,if文と
     1182同じブロック内の同じ階層のラベルへ分岐するgoto文がある場合には,if文と
     1183ラベルの間の文をelse部にすることにより,goto文を使わない等価なプログラ
     1184ムに書き換えることができる.
     1185
     1186例として,goto文を使った次のプログラムを考える.
    16401187
    16411188----------------------------------------
    16421189        {
    1643                 /* if文の前の文 */
     1190                /* if文の前の文 */
    16441191                if (....) {
    1645                         /* then部の文 */
    1646                         goto <ラベル>;
     1192                        /* then部の文 */
     1193                        goto <ラベル>;
    16471194                }
    1648                 /* if文とラベルの間の文 */
    1649           <ラベル>:
    1650                 /* ラベルより後ろの文 */
     1195                /* if文とラベルの間の文 */
     1196          <ラベル>:
     1197                /* ラベルより後ろの文 */
    16511198        }
    16521199----------------------------------------
    16531200
    1654 ã“のプログラムは,goto文を使わない次のプログラムと等価である.
     1201このプログラムは,goto文を使わない次のプログラムと等価である.
    16551202
    16561203----------------------------------------
    16571204        {
    1658                 /* if文の前の文 */
     1205                /* if文の前の文 */
    16591206                if (....) {
    1660                         /* then部の文 */
     1207                        /* then部の文 */
    16611208                }
    16621209                else {
    1663                         /* if文とラベルの間の文 */
     1210                        /* if文とラベルの間の文 */
    16641211                }
    1665                 /* ラベルより後ろの文 */
     1212                /* ラベルより後ろの文 */
    16661213        }
    16671214----------------------------------------
    16681215
    1669 ã“の条件に合致するgoto文が複数ある場合には,下にあるgoto文から順に上記
    1670 ã®æ–¹æ³•ã«ã‚ˆã£ã¦æ›¸ãæ›ãˆã‚‹ã“とで,goto文を使わない等価なプログラムに書き
    1671 æ›ãˆã‚‹ã“とができる.
    1672 
    1673 CHECKマクロの使用方法は,上記のgoto文の使用方法に合致するため,goto文を
    1674 ä½¿ç”¨ã—ない等価なプログラムに書き換えることができる.よって,このCHECKマ
    1675 ã‚¯ãƒ­ã«ã‚ˆã‚Šå•é¡Œã‚’生じることはない.
    1676 
    1677 
    1678 â—‹ext_tsk,ext_kerの返り値
    1679 
    1680 Î¼ITRON4.0仕様では,ext_tskはリターンすることのないサービスコールとなっ
    1681 ã¦ã„るが,TOPPERS新世代カーネルにおいては,このサービスコールの返り値を
    1682 ER型に変更し,非タスクコンテキストから呼ばれた場合には,E_CTXエラーを返
    1683 ã‚Šå€¤ã¨ã—てリターンすることとする.
    1684 
    1685 ã“の仕様に対するいくつかの対案を検討したが,以下の理由で採用しない.
    1686 
    1687 ãƒ»JSPカーネルのように,危険の可能性を検出しながら実行を継続する方法は,
    1688 ã€€ä¿¡é ¼æ€§ãƒ»å®‰å
    1689 ¨æ€§ã‚’重視するシステムでは望ましくない.信頼性・安å
    1690 ¨æ€§ã‚’重
    1691 ã€€è¦–するシステムでは,危険の可能性を検出したら,早期にリカバリをすべき
    1692 ã€€ã§ã‚る.
    1693 
    1694 ãƒ»ASPカーネルの当初案のカーネルをダウンさせる方法は,アプリケーション側
    1695 ã€€ã§å›žå¾©ã™ã‚‹ä½™åœ°ã‚’なくすという意味で望ましくない.
    1696 
    1697 ãƒ»éŽåŽ»ã®äº’換性を保つために,型をvoidとしたまま,非タスクコンテキストか
    1698 ã€€ã‚‰å‘¼ã°ã‚ŒãŸå ´åˆã«ã¯ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹ã¨ã™ã‚‹æ–¹æ³•ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã®ä»•æ§˜å¤‰æ›´ã«æ°—づ
    1699 ã€€ãã«ãããªã‚‹ã¨ã„う意味で望ましくない.また,他のエラーコード(例えば
    1700 ã€€E_NOSPT)を返す余地をなくしている.
    1701 
    1702 ãƒ»ä¸€ç¨®ã®CPU例外を呼び出すことにする方法は,カーネル仕様å
    1703 ¨ä½“の整合性を考
    1704 ã€€ãˆã¦æŽ¡ç”¨ã—なかった.ここで一種のCPU例外を導å
    1705 ¥ã™ã‚‹ã‚ˆã‚Šã‚‚,サービスコー
    1706 ã€€ãƒ«ãŒã‚¨ãƒ©ãƒ¼ã‚’返した場合に呼ばれるOSEK/VDX OS仕様のエラーフックに相当す
    1707 ã€€ã‚‹æ©Ÿèƒ½ã‚’å°Žå
    1708 ¥ã—た方が有用性が高いと思われるためである.
    1709 
    1710 ã“の変更により,さらに,CPUロック状æ
    1711 ‹ã‚„ディスパッチ禁止状æ
    1712 ‹ã§ext_tskが
    1713 å‘¼ã°ã‚ŒãŸå ´åˆã«ã‚‚エラーリターンする方法が考えられるが,タスクのメインルー
    1714 ãƒãƒ³ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³ã¨ext_tskが等価にならないため,採用しない.また,他の
    1715 å‡¦ç†å˜ä½ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³æ–¹æ³•ã¨æ•´åˆã•ã›ã‚‹æ„å‘³ã‚‚ある(例えば,割込みハンド
    1716 ãƒ©ã‹ã‚‰CPUロック状æ
    1717 ‹ã®ã¾ã¾ãƒªã‚¿ãƒ¼ãƒ³ã—た場合の扱い).
    1718 
    1719 ã“れにあわせて,ext_kerについても,返り値をER型に変更する.ASPカーネル
    1720 ã§ã¯ï¼Œext_kerがエラーを返すことはないが,HRPカーネルでは,E_OACVエラー
    1721 ã‚’返す場合がある.
    1722 
    1723 ãªãŠï¼ŒÎ¼ITRON4.0仕様では,exd_tskもリターンすることのないサービスコール
    1724 ã¨ãªã£ã¦ã„るが,TOPPERS新世代カーネルでは,exd_tskはサポートしていない.
    1725 
    1726 
    1727 â—‹ã‚«ãƒ¼ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«å¯¾ã™ã‚‹volatile宣言について(クリティカルセクショ
    1728 ãƒ³ã®å‡ºå
    1729 ¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„)
    1730 
    1731 ã‚«ãƒ¼ãƒãƒ«å†
    1732 ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã¯ï¼Œä¸¦è¡Œå®Ÿè¡Œã•ã‚Œã‚‹ä»–の処理単位(割込みハンドラや
    1733 ã‚¿ã‚¹ã‚¯ï¼‰ã‹ã‚‰ã‚‚アクセスされる可能性があるため,volatile宣言がå¿
    1734 è¦ã§ã¯ãª
    1735 ã„かと考えられる.実際,クリティカルセクションå†
    1736 ã§ã‚«ãƒ¼ãƒãƒ«å¤‰æ•°ã‚’読むコー
    1737 ãƒ‰ãŒï¼Œã‚³ãƒ³ãƒ‘イラの最適化によりクリティカルセクション外に移動され,それ
    1738 ãŒåŽŸå› ã¨ãªã£ãŸå•é¡Œäº‹ä¾‹ã‚‚報告されている.
    1739 
    1740 ã‚«ãƒ¼ãƒãƒ«å†
    1741 ã®ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«volatile宣言をつける方法は,安å
    1742 ¨ã§ã¯ã‚
    1743 ã‚‹ãŒï¼Œæœ€é©åŒ–が抑止されるために,カーネルのサイズや性能には悪影響を与え
    1744 ã‚‹ï¼Žãã“でASPカーネルでは,次の方法でvolatile宣言のå¿
    1745 è¦æ€§ã‚’なくすことと
    1746 ã™ã‚‹ï¼Ž
    1747 
    1748 ASPカーネルにおいては,並行実行される他の処理単位から書き換えられる可能
    1749 æ€§ã®ã‚るデータ構造は,すべて,CPUロック状æ
    1750 ‹ã¾ãŸã¯å
    1751 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1752 ‹ã«ã‚ˆ
    1753 ã‚‹ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã‚»ã‚¯ã‚·ãƒ§ãƒ³å†
    1754 ã§ã‚¢ã‚¯ã‚»ã‚¹ã—ている.クリティカルセクションå†
    1755 
    1756 ã§ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒï¼Œã‚³ãƒ³ãƒ‘イラの最適化によりクリティカルセクショ
    1757 ãƒ³å¤–に移動されないようにするには,コンパイラに対して,クリティカルセク
    1758 ã‚·ãƒ§ãƒ³ã®å‡ºå
    1759 ¥å‡¦ç†ã«ã‚ˆã‚Šï¼Œãƒ¡ãƒ¢ãƒªä¸Šã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ãŒæ›¸ãå¤‰ã‚ã‚‹å¯èƒ½æ€§ãŒã‚るこ
    1760 ã¨ã‚’知らせればよい.
    1761 
    1762 å
    1763 ·ä½“的には,クリティカルセクションの出å
    1764 ¥å‡¦ç†ã‚’関数によって実現すれば,
    1765 ã“のような最適化を抑止することができる.しかし,ASPカーネルの多くのター
    1766 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«ãŠã„て,クリティカルセクションの出å
    1767 ¥å‡¦ç†ã¯ãƒžã‚¯ãƒ­ã‚„インラ
    1768 ã‚¤ãƒ³é–¢æ•°ã«ã‚ˆã‚Šå®Ÿè£
    1769 ã•ã‚Œã¦ãŠã‚Šï¼Œä¸Šã®ã‚ˆã†ãªæœ€é©åŒ–を抑止できない.
    1770 
    1771 ãã“で,クリティカルセクションの出å
    1772 ¥å‡¦ç†ã‚’実現する場合には,メモリ上の
    1773 ãƒ‡ãƒ¼ã‚¿æ§‹é€ ãŒæ›¸ãå¤‰ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ることを,何らかの方法でコンパイラに知
    1774 ã‚‰ã›ãªã‘ればならないという制約を設ける.GNU開発環境では,次のいずれかの
    1775 æ–¹æ³•ã§ã“の制約を満たすことができる.
    1776 
    1777 (a) クリティカルセクションの出å
    1778 ¥å‡¦ç†ã®å
    1779 ¨ä½“または出å
    1780 ¥å‡¦ç†ã®æœ¬è³ªçš„な部分
    1781         (å
    1782 ·ä½“的には,割込み禁止/許可する処理)を(インラインでない)通常
    1783         の関数により実現する.
    1784 
    1785 (b) クリティカルセクションの出å
    1786 ¥å‡¦ç†ã®æœ¬è³ªçš„な部分をインラインアセンブ
    1787         ラによって実現している場合には,そのインラインアセンブラのclobber変
    1788         数リストに"memory"を追加する.
    1789 
    1790 (c) クリティカルセクションの出å
    1791 ¥å‡¦ç†ã®æœ¬è³ªçš„な部分が,マクロやインライ
    1792         ン関数呼出しで実現している場合には,クリティカルセクションにå
    1793 ¥ã‚‹å‡¦
    1794         理の最後と出る処理のå
    1795 ˆé ­ã«ï¼ŒAsm("":::"memory")という記述をå
    1796 ¥ã‚Œã‚‹ï¼Ž
    1797 
    1798 ãªãŠï¼Œã“の制約が適用されるクリティカルセクションの出å
    1799 ¥å‡¦ç†ã¯ï¼Œä»¥ä¸‹ã®ã‚‚
    1800 ã®ã§ã‚る.
     1216この条件に合致するgoto文が複数ある場合には,下にあるgoto文から順に上記
     1217の方法によって書き換えることで,goto文を使わない等価なプログラムに書き
     1218換えることができる.
     1219
     1220CHECKマクロの使用方法は,上記のgoto文の使用方法に合致するため,goto文を
     1221使用しない等価なプログラムに書き換えることができる.よって,このCHECKマ
     1222クロにより問題を生じることはない.
     1223
     1224
     1225○ext_tsk,ext_kerの返り値
     1226
     1227μITRON4.0仕様では,ext_tskはリターンすることのないサービスコールとなっ
     1228ているが,TOPPERS新世代カーネルにおいては,このサービスコールの返り値を
     1229ER型に変更し,非タスクコンテキストから呼ばれた場合には,E_CTXエラーを返
     1230り値としてリターンすることとする.
     1231
     1232この仕様に対するいくつかの対案を検討したが,以下の理由で採用しない.
     1233
     1234・JSPカーネルのように,危険の可能性を検出しながら実行を継続する方法は,
     1235 信頼性・安全性を重視するシステムでは望ましくない.信頼性・安全性を重
     1236 視するシステムでは,危険の可能性を検出したら,早期にリカバリをすべき
     1237 である.
     1238
     1239・ASPカーネルの当初案のカーネルをダウンさせる方法は,アプリケーション側
     1240 で回復する余地をなくすという意味で望ましくない.
     1241
     1242・過去の互換性を保つために,型をvoidとしたまま,非タスクコンテキストか
     1243 ら呼ばれた場合にはリターンするとする方法は,カーネルの仕様変更に気づ
     1244 きにくくなるという意味で望ましくない.また,他のエラーコード(例えば
     1245 E_NOSPT)を返す余地をなくしている.
     1246
     1247・一種のCPU例外を呼び出すことにする方法は,カーネル仕様全体の整合性を考
     1248 えて採用しなかった.ここで一種のCPU例外を導入するよりも,サービスコー
     1249 ルがエラーを返した場合に呼ばれるOSEK/VDX OS仕様のエラーフックに相当す
     1250 る機能を導入した方が有用性が高いと思われるためである.
     1251
     1252この変更により,さらに,CPUロック状態やディスパッチ禁止状態でext_tskが
     1253呼ばれた場合にもエラーリターンする方法が考えられるが,タスクのメインルー
     1254チンからのリターンとext_tskが等価にならないため,採用しない.また,他の
     1255処理単位からのリターン方法と整合させる意味もある(例えば,割込みハンド
     1256ラからCPUロック状態のままリターンした場合の扱い).
     1257
     1258これにあわせて,ext_kerについても,返り値をER型に変更する.ASPカーネル
     1259では,ext_kerがエラーを返すことはないが,HRPカーネルでは,E_OACVエラー
     1260を返す場合がある.
     1261
     1262なお,μITRON4.0仕様では,exd_tskもリターンすることのないサービスコール
     1263となっているが,TOPPERS新世代カーネルでは,exd_tskはサポートしていない.
     1264
     1265
     1266○カーネルのデータ構造に対するvolatile宣言について(クリティカルセクショ
     1267ンの出入処理の実現に関する制約)
     1268
     1269カーネル内のデータ構造は,並行実行される他の処理単位(割込みハンドラや
     1270タスク)からもアクセスされる可能性があるため,volatile宣言が必要ではな
     1271いかと考えられる.実際,クリティカルセクション内でカーネル変数を読むコー
     1272ドが,コンパイラの最適化によりクリティカルセクション外に移動され,それ
     1273が原因となった問題事例も報告されている.
     1274
     1275カーネル内のすべてのデータ構造にvolatile宣言をつける方法は,安全ではあ
     1276るが,最適化が抑止されるために,カーネルのサイズや性能には悪影響を与え
     1277る.そこでASPカーネルでは,次の方法でvolatile宣言の必要性をなくすことと
     1278する.
     1279
     1280ASPカーネルにおいては,並行実行される他の処理単位から書き換えられる可能
     1281性のあるデータ構造は,すべて,CPUロック状態または全割込みロック状態によ
     1282るクリティカルセクション内でアクセスしている.クリティカルセクション内
     1283でのデータ構造のアクセスが,コンパイラの最適化によりクリティカルセクショ
     1284ン外に移動されないようにするには,コンパイラに対して,クリティカルセク
     1285ションの出入処理により,メモリ上のデータ構造が書き変わる可能性があるこ
     1286とを知らせればよい.
     1287
     1288具体的には,クリティカルセクションの出入処理を関数によって実現すれば,
     1289このような最適化を抑止することができる.しかし,ASPカーネルの多くのター
     1290ゲット依存部において,クリティカルセクションの出入処理はマクロやインラ
     1291イン関数により実装されており,上のような最適化を抑止できない.
     1292
     1293そこで,クリティカルセクションの出入処理を実現する場合には,メモリ上の
     1294データ構造が書き変わる可能性があることを,何らかの方法でコンパイラに知
     1295らせなければならないという制約を設ける.GNU開発環境では,次のいずれかの
     1296方法でこの制約を満たすことができる.
     1297
     1298(a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分
     1299        (具体的には,割込み禁止/許可する処理)を(インラインでない)通常
     1300        の関数により実現する.
     1301
     1302(b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ
     1303        ラによって実現している場合には,そのインラインアセンブラのclobber変
     1304        数リストに"memory"を追加する.
     1305
     1306(c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ
     1307        ン関数呼出しで実現している場合には,クリティカルセクションに入る処
     1308        理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる.
     1309
     1310なお,この制約が適用されるクリティカルセクションの出入処理は,以下のも
     1311のである.
    18011312
    18021313        SIL_LOC_INT
     
    18061317
    18071318
    1808 â—‹åž‹ã‚­ãƒ£ã‚¹ãƒˆã«ä¼´ã†è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
    1809 
    1810 GCCで-O2オプションをつけてコンパイルした場合に,カーネルのソースコード
    1811 ä¸­ã®æ•°ç®‡æ‰€ã§ï¼Œæ¬¡ã®è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå‡ºã‚‹ï¼ˆGCCのバージョンにもよる).
     1319○型キャストに伴う警告メッセージ
     1320
     1321GCCで-O2オプションをつけてコンパイルした場合に,カーネルのソースコード
     1322中の数箇所で,次の警告メッセージが出る(GCCのバージョンにもよる).
    18121323
    18131324warning: dereferencing type-punned pointer will break strict-aliasing rules
    18141325
    1815 ã“れは,GCCに-O2オプションをつけると,コンパイラがC言語のstrict
    1816 aliasing ruleを前提とするためである.コンパイラにstrict aliasing ruleを
    1817 é©ç”¨ã•ã›ãªã„ためには,GCCのオプションに-fno-strict-aliasingを指定すれば
    1818 ã‚ˆã„.これにより,警告メッセージは抑止されるが,strict aliasing ruleを
    1819 å‰æã¨ã—た最適化は行われなくなる.
    1820 
    1821 ASPカーネルに実è£
    1822 ã«ãŠã„ては,strict aliasing ruleを前提とした最適化を行っ
    1823 ã¦ã‚‚よく,この警告メッセージを無視しても差し支えない.以下では,この警
    1824 å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無視しても差し支えない理由を述べる.
    1825 
    1826 è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå‡ºã‚‹ä¾‹ã¨ã—て,semaphore.c中の次の行について検討する.
     1326これは,GCCに-O2オプションをつけると,コンパイラがC言語のstrict
     1327aliasing ruleを前提とするためである.コンパイラにstrict aliasing ruleを
     1328適用させないためには,GCCのオプションに-fno-strict-aliasingを指定すれば
     1329よい.これにより,警告メッセージは抑止されるが,strict aliasing ruleを
     1330前提とした最適化は行われなくなる.
     1331
     1332ASPカーネルに実装においては,strict aliasing ruleを前提とした最適化を行っ
     1333てもよく,この警告メッセージを無視しても差し支えない.以下では,この警
     1334告メッセージを無視しても差し支えない理由を述べる.
     1335
     1336警告メッセージが出る例として,semaphore.c中の次の行について検討する.
    18271337
    18281338        wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);
    18291339
    1830 ã“の警告メッセージの原因は,直接的には,&winfo_semを(WINFO_WOBJ *)にキャ
    1831 ã‚¹ãƒˆã—ていることであるが,本質的な原因は,このコードがC言語のstrict
    1832 aliasing ruleに従わない代å
    1833 ¥æ–‡ã®åŽŸå› ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚り,このルールに依存
    1834 ã—た最適化が誤った結果を引き起こす可能性があることである.
    1835 
    1836 C言語のstrict aliasing ruleは,互換性のない異なる型を通して,オーバラッ
    1837 ãƒ—するメモリ領域をアクセスする代å
    1838 ¥æ–‡ã‚’使用してはならないというものであ
    1839 ã‚‹ï¼ˆä½¿ç”¨ã—た場合の振舞いは未定義になる).このケースでは,(WINFO_SEM
    1840 *)型のポインタ経由と(WINFO_WOBJ *)型のポインタ経由で,オーバラップする
    1841 ãƒ¡ãƒ¢ãƒªé ˜åŸŸã‚’アクセスする代å
    1842 ¥æ–‡ã‚’使用してはならないことになる.また,警
    1843 å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®åŽŸå› ã«ãªã£ã¦ã¯ã„ないが,(SEMCB *)型のポインタ経由と
    1844 (WOBJCB *)型のポインタ経由で,オーバラップするメモリ領域をアクセスする
    1845 ä»£å
    1846 ¥æ–‡ã‚’使用してはならない.
    1847 
    1848 ASPカーネルの実è£
    1849 ã«ãŠã„ては,semaphore.c中の関数においては,(SEMCB *)型
    1850 ãŠã‚ˆã³(WINFO_SEM *)型のポインタを使用しており,(WOBJCB *)型および
    1851 (WINFO_WOBJ *)型のポインタ経由でメモリ領域をアクセスすることはない.一
    1852 æ–¹ï¼Œãã“から呼び出されるwait.c中の関数においては,(WOBJCB *)型および
    1853 (WINFO_WOBJ *)型のポインタを使用しており,(SEMCB *)型および(WINFO_SEM
    1854 *)型のポインタ経由でメモリ領域をアクセスすることはない.
    1855 
    1856 strict aliasing ruleに従わない代å
    1857 ¥æ–‡ã®å•é¡Œç‚¹ã¯ï¼Œã“のルールに依存した最
    1858 é©åŒ–が誤った結果を引き起こす可能性があることであるが,異なるコンパイル
    1859 å˜ä½ã‚’またいで最適化が行われることはないため,これにより問題が起こるこ
    1860 ã¨ã¯ãªã„と言うことができる.
    1861 
    1862 åŒã˜è­°è«–は,他のソースファイル(eventflag.c,dataqueue.c,pridataq.c,
    1863 mailbox.c,mempfix.c)中の警告メッセージについても,そのまま当てはまる.
    1864 
    1865 
    1866 â—‹æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻参ç
    1867 §æ©Ÿèƒ½
    1868 
    1869 â—å¿
    1870 è¦æ€§ã¨ä½¿é€”
    1871 
    1872 ASPカーネルには,ASPカーネル上で動作するタスクやASPカーネル自身の性能を
    1873 è¨ˆæ¸¬ã™ã‚‹ãŸã‚ã«ï¼Œã‚·ã‚¹ãƒ†ãƒ æ™‚刻より精度の高い性能評価用システム時刻を読み
    1874 å‡ºã™æ©Ÿèƒ½ã‚’サポートする.性能評価用システム時刻は,マイクロ秒単位で表現
    1875 ã•ã‚Œã‚‹ãŒï¼Œå®Ÿéš›ã®ç²¾åº¦ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã§ã‚る.
    1876 
    1877 ã“の機能を用いてあるプログラムの実行時間を計測するには,その実行直前と
    1878 å®Ÿè¡Œç›´å¾Œã«æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻を読み出し,その差を求める.そのため,
    1879 æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻は常に相対値を使用し,性能評価用システム時刻の絶
    1880 å¯¾å€¤ã‚’使用することは想定していない.
    1881 
    1882 â—API仕様
    1883 
    1884 æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻参ç
    1885 §æ©Ÿèƒ½ã§ã¯ï¼Œæ¬¡ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’用いる.
    1886 
    1887         SYSUTM          性能評価用システム時刻(符号無し整数,単位はマイクロ秒,
    1888                                 32ビット以上)
    1889 
    1890 SYSUTM型は,ターゲット非依存部においてulong_t型(すなわち,unsigned
    1891 long型)に定義されており,そのサイズは,32ビット以上で,ターゲット定義
    1892 ã§ã‚る.
    1893 
    1894 æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻がSYSUTM型で表現できる範囲をè¶
    1895 ãˆãŸï¼ˆã¤ã¾ã‚Šï¼Œã‚ªãƒ¼
    1896 ãƒãƒ•ãƒ­ãƒ¼ã—た)場合,性能評価用システム時刻は0に戻る.評価対象プログラム
    1897 ã®å®Ÿè¡Œå‰å¾Œã®æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻の差を求める場合には,計測する時間が
    1898 SYSUTM型で表現できる範囲である限り,0に戻ることを特別に考æ
    1899 ®ã™ã‚‹å¿
    1900 è¦ã¯ãª
    1901 ã„.
    1902 
    1903 SYSUTM型が32ビットの場合,性能評価用システム時刻は約71分でオーバフロー
    1904 ã™ã‚‹ï¼Žãã®ãŸã‚ï¼Œã“の機能を71分を越える時間の測定に使った場合の動作は保
    1905 è¨¼ã•ã‚Œãªã„.
    1906 
    1907 æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻参ç
    1908 §æ©Ÿèƒ½ã®ãŸã‚ã®ã‚µãƒ¼ãƒ“スコールの仕様については,
    1909 ã€ŒTOPPERS新世代カーネル統合仕様書」の「4.6.1 システム時刻管理」の節を参
    1910 ç
    1911 §ã™ã‚‹ã“と.
    1912 
    1913 â—å®Ÿè£
    1914 
    1915 
    1916 æ™‚刻をマイクロ秒単位で取得するために,周期的なタイムティックを供給する
    1917 ã‚¿ã‚¤ãƒžã®ç¾åœ¨å€¤ï¼ˆã‚¿ã‚¤ãƒžã¯ã‚«ã‚¦ãƒ³ãƒˆã‚¢ãƒƒãƒ—するものと仮定する)を読み出し,
    1918 ãã‚Œã‚’マイクロ秒単位に換算した値に,現在のシステム時刻(ミリ秒単位で表
    1919 ç¾ã•ã‚Œã‚‹ï¼‰ã‚’1000倍した値を加えたものを性能評価用システム時刻とする.現
    1920 åœ¨ã®ã‚·ã‚¹ãƒ†ãƒ æ™‚刻を1000倍する際に,オーバフローが発生する可能性があるが,
    1921 ç„¡è¦–してかまわない.
    1922 
    1923 ãŸã ã—,システム時刻の現在値とタイマの現在値を一貫した状æ
    1924 ‹ã§èª­ã¿å‡ºã™ã®
    1925 ã¯å®¹æ˜“ではない.両方の値を順に読み出すと,読出しの間にタイマがオーバフ
    1926 ãƒ­ãƒ¼ã—て割込み要求が発生した場合に,片方はオーバフロー前の値,もう片方
    1927 ã¯ã‚ªãƒ¼ãƒãƒ•ãƒ­ãƒ¼å¾Œã®å€¤ã‚’読んでしまい,誤った性能評価用システム時刻を取得
    1928 ã—てしまう.
    1929 
    1930 ã“の問題を解決する方法はいくつか考えられるが,どの方法を採用するの決定
    1931 ã«ã‚たり,次の要求事é 
    1932 ã‚’設定した.
    1933 
    1934 (1) 多くのターゲットシステムで実現できること.
    1935 
    1936 (2) サービスコールの実行時間が可能な限り一定となること.言い換えると,
    1937     条件によってサービスコールの実行時間が大きく変動しないこと.
    1938 
    1939 (3) サービスコール中の可能な限り同じタイミングの時刻を返すこと.言い換
    1940     えると,条件によって時刻を読み取るタイミングが変動しないこと.
    1941 
    1942 (4) 調整するå¿
    1943 è¦ã®ã‚るパラメータを最小限とすること.
    1944 
    1945 ã“れらの要求事é 
    1946 ã‚’満たす方法として,次の方法を用いることにした.
    1947 
    1948 ã¾ãšï¼ŒNMIを除くすべての割込みを禁止した状æ
    1949 ‹ã§ï¼Œã‚·ã‚¹ãƒ†ãƒ æ™‚刻の現在値,タ
    1950 ã‚¤ãƒžã®ç¾åœ¨å€¤ï¼ˆ1回目),タイマ割込み要求の有無,タイマの現在値(2回目)
    1951 ã‚’,この順で読み出す.割込みを禁止しているため,この間にシステム時刻の
    1952 ç¾åœ¨å€¤ãŒå¤‰åŒ–することはなく,システム時刻の現在値を読み出す順番はどこで
    1953 ã‚‚よい.また,タイマの現在値の2回目の読出しは,タイマ割込み要求があった
    1954 å ´åˆã«ã®ã¿å¿
    1955 è¦ã¨ãªã‚‹ãŒï¼Œ(2)の要求から,タイマ割込み要求の有無によらず読
    1956 ã¿å‡ºã™ã“ととする.
    1957 
    1958 ã“れらの値を読み出した後,割込み禁止を解除し,次の処理を行う.まず,タ
    1959 ã‚¤ãƒžå‰²è¾¼ã¿è¦æ±‚がなかった場合には,システム時刻の現在値と,1回目に読んだ
    1960 ã‚¿ã‚¤ãƒžã®ç¾åœ¨å€¤ã¯ä¸€è²«ã—た値であることが保証できるため,これらの値から性
    1961 èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻の現在値を求める.
    1962 
    1963 æ¬¡ã«ã‚¿ã‚¤ãƒžå‰²è¾¼ã¿è¦æ±‚があった場合には,1回目に読んだタイマの現在値が,タ
    1964 ã‚¤ãƒžå‰²è¾¼ã¿è¦æ±‚発生前の値(オーバフロー前の値)である場合と,発生後の値
    1965 ï¼ˆã‚ªãƒ¼ãƒãƒ•ãƒ­ãƒ¼å¾Œã®å€¤ï¼‰ã§ã‚る場合の両方の可能性が考えられる.このどちら
    1966 ã®å ´åˆã§ã‚ったかを,2回目に読んだタイマの現在値を使って,次のように決定
    1967 ã™ã‚‹ï¼Ž2回目の値は,タイマ割込み要求発生後の値(オーバフロー後の値)であ
    1968 ã‚‹ã“とが保証できるため,1回目の値が2回目の値よりも大きい場合には,その
    1969 é–“にオーバフローがあったものと推測できる.つまり,1回目の値はオーバフロー
    1970 å‰ã®å€¤ã¨ã„うことになり,システム時刻の現在値と一貫した値であるとして性
    1971 èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻の現在値を求める.逆に,1回目の値が2回目の値と同じ
    1972 ã‹ãã‚Œã‚ˆã‚Šå°ã•ã„場合には,1回目の値はオーバフロー後の値であると推測でき
    1973 ã‚‹ï¼Žã“の場合には,次のタイムティックのシステム時刻を求め,その値と1回目
    1974 ã®å€¤ãŒä¸€è²«ã—た値であるとして性能評価用システム時刻の現在値を求める.
    1975 
    1976 ã“こで,タイマ割込み要求があった場合には,2回目に読んだタイマの現在値を
    1977 ç”¨ã„る方法が考えられるが,(3)の要求を満たさなくなるために採用しなかった.
    1978 ã¾ãŸï¼ŒJSPカーネルと同様の方法は,(4)の要求を満たさないために採用しなかっ
    1979 ãŸï¼Ž
    1980 
    1981 ä¸Šã§ã€ŒæŽ¨æ¸¬ã§ãã‚‹ã€ã¨ã—たのは,この推測が成り立たなくなるケースがあるた
    1982 ã‚ã§ã‚る.この推測が成り立たなくなるケースは,次の2つの場合に分けて分析
    1983 ã™ã‚‹ã“とができる.
    1984 
    1985 (a) 1回目の値がオーバフロー後の値であるにもかかわらず,1回目の値が2回目
    1986     の値よりも大きくなる場合
    1987 
    1988 ã“のようなケースは,タイマ割込みが要求されているにもかかわらずサービス
    1989 ã•ã‚Œãªã„状æ
    1990 ‹ãŒé•·æ™‚間続くか,タイマの現在値を1回目に読んでから2回目に読
    1991 ã‚€ã¾ã§ã®é–“に長い時間がかかった結果,その間に(再度)オーバフローが発生
    1992 ã—た場合に起こる.つまり,タイマ割込みがサービスされない時間が,タイム
    1993 ãƒ†ã‚£ãƒƒã‚¯ã®å‘¨æœŸã‚ˆã‚Šã‚‚長くなった場合である.このような場合には,システム
    1994 æ™‚刻の更新も正しく行われなくなる.
    1995 
    1996 (b) 1回目の値がオーバフロー前の値であるにもかかわらず,1回目の値が2回目
    1997     の値と同じかそれよりも小さくなる場合
    1998 
    1999 ã“のようなケースは,タイマの現在値を1回目に読んでから2回目に読むまでの
    2000 é–“に,タイマがほぼ1周分カウントアップした場合に起こる.この場合も,タイ
    2001 ãƒžå‰²è¾¼ã¿ãŒç¦æ­¢ã•ã‚Œã¦ã„る時間が,タイムティックの周期よりも長かったこと
    2002 ã«ãªã‚Šï¼Œã‚·ã‚¹ãƒ†ãƒ æ™‚刻の更新が正しく行えなくなる.
    2003 
    2004 ã„ずれのケースも,タイマ割込みが長時間禁止されている,タイマ割込みより
    2005 ã‚‚優å
    2006 ˆåº¦ã®é«˜ã„割込み処理が長時間続けて実行された,シミュレーション環境
    2007 ã«ãŠã„てシミュレータのプロセスが長時間スケジュールされなかったなどの理
    2008 ç”±ã§ï¼Œã‚·ã‚¹ãƒ†ãƒ æ™‚刻の更新が正しく行えない状況に相当する.そこでこの状況
    2009 ã‚’,サービスコール使用上の注意事é 
    2010 ã«ç››ã‚Šè¾¼ã‚€ï¼Ž
    2011 
    2012 å®Ÿéš›ã®ã‚³ãƒ¼ãƒ‰ã«ãŠã„ては,システム時刻の現在値は変数に保持されていないた
    2013 ã‚ï¼ˆä¸Šä½æ¡ã¯current_timeに保持されているが,下位桁を保持する変数がな
    2014 ã„),次のタイムティックのシステム時刻を用いて計算している.そのため,
    2015 ã‚¿ã‚¤ãƒžã®ç¾åœ¨å€¤ãŒã‚ªãƒ¼ãƒãƒ•ãƒ­ãƒ¼å¾Œã®å€¤ã§ã‚ると判断した場合を除いては,タイ
    2016 ãƒ ãƒ†ã‚£ãƒƒã‚¯ã®å‘¨æœŸæ™‚間を,求めた性能評価用システム時刻から減算する.この
    2017 å‡¦ç†ã«ã‚ˆã‚Šï¼Œã‚µãƒ¼ãƒ“スコールの実行時間が変動することになるが,if文のå†
    2018 å®¹
    2019 ãŒï¼ˆã‚³ãƒ³ãƒ‘イラの最適化を仮定すると)定数値の減算1回なので,変動はわずか
    2020 ã§ã‚る.
    2021 
    2022 ã“のサービスコールは,任意の状æ
    2023 ‹ã‹ã‚‰å‘¼ã³å‡ºã™ã“とができるため,SILのå
    2024 ¨å‰²
    2025 è¾¼ã¿ãƒ­ãƒƒã‚¯æ©Ÿèƒ½ã‚’用いて,サービスコールå†
    2026 éƒ¨ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実
    2027 ç¾ã™ã‚‹ï¼Ž
    2028 
    2029 
    2030 â—‹ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理禁止フラグをenatexで実è£
    2031 ã—ている理由
    2032 
    2033 ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理禁止フラグは,TCB中のenatexフィールド(タスク例外処理許可
    2034 çŠ¶æ
    2035 ‹ã§ã‚ることを示す)の形で保持している.このフィールドをdistexとせず
    2036 enatexとしたのは,JSPカーネルにおいてタスクディスパッチ禁止フラグを
    2037 enadspの形で保持したのと整合させたためである.
    2038 
    2039 ASPカーネルでは,enadspはdisdspに変更になったことから,enatexもdistexに
    2040 å¤‰æ›´ã—た方が良かったと思われる.
    2041 
    2042 ä»¥ä¸Š
     1340この警告メッセージの原因は,直接的には,&winfo_semを(WINFO_WOBJ *)にキャ
     1341ストしていることであるが,本質的な原因は,このコードがC言語のstrict
     1342aliasing ruleに従わない代入文の原因になる可能性があり,このルールに依存
     1343した最適化が誤った結果を引き起こす可能性があることである.
     1344
     1345C言語のstrict aliasing ruleは,互換性のない異なる型を通して,オーバラッ
     1346プするメモリ領域をアクセスする代入文を使用してはならないというものであ
     1347る(使用した場合の振舞いは未定義になる).このケースでは,(WINFO_SEM
     1348*)型のポインタ経由と(WINFO_WOBJ *)型のポインタ経由で,オーバラップする
     1349メモリ領域をアクセスする代入文を使用してはならないことになる.また,警
     1350告メッセージの原因になってはいないが,(SEMCB *)型のポインタ経由と
     1351(WOBJCB *)型のポインタ経由で,オーバラップするメモリ領域をアクセスする
     1352代入文を使用してはならない.
     1353
     1354ASPカーネルの実装においては,semaphore.c中の関数においては,(SEMCB *)型
     1355および(WINFO_SEM *)型のポインタを使用しており,(WOBJCB *)型および
     1356(WINFO_WOBJ *)型のポインタ経由でメモリ領域をアクセスすることはない.一
     1357方,そこから呼び出されるwait.c中の関数においては,(WOBJCB *)型および
     1358(WINFO_WOBJ *)型のポインタを使用しており,(SEMCB *)型および(WINFO_SEM
     1359*)型のポインタ経由でメモリ領域をアクセスすることはない.
     1360
     1361strict aliasing ruleに従わない代入文の問題点は,このルールに依存した最
     1362適化が誤った結果を引き起こす可能性があることであるが,異なるコンパイル
     1363単位をまたいで最適化が行われることはないため,これにより問題が起こるこ
     1364とはないと言うことができる.
     1365
     1366同じ議論は,他のソースファイル(eventflag.c,dataqueue.c,pridataq.c,
     1367mailbox.c,mempfix.c)中の警告メッセージについても,そのまま当てはまる.
     1368
     1369
     1370○性能評価用システム時刻参照機能
     1371
     1372●必要性と使途
     1373
     1374ASPカーネルには,ASPカーネル上で動作するタスクやASPカーネル自身の性能を
     1375計測するために,システム時刻より精度の高い性能評価用システム時刻を読み
     1376出す機能をサポートする.性能評価用システム時刻は,マイクロ秒単位で表現
     1377されるが,実際の精度はターゲット依存である.
     1378
     1379この機能を用いてあるプログラムの実行時間を計測するには,その実行直前と
     1380実行直後に性能評価用システム時刻を読み出し,その差を求める.そのため,
     1381性能評価用システム時刻は常に相対値を使用し,性能評価用システム時刻の絶
     1382対値を使用することは想定していない.
     1383
     1384●API仕様
     1385
     1386性能評価用システム時刻参照機能では,次のデータ型を用いる.
     1387
     1388        SYSUTM          性能評価用システム時刻(符号無し整数,単位はマイクロ秒,
     1389                                32ビット以上)
     1390
     1391SYSUTM型は,ターゲット非依存部においてulong_t型(すなわち,unsigned
     1392long型)に定義されており,そのサイズは,32ビット以上で,ターゲット定義
     1393である.
     1394
     1395性能評価用システム時刻がSYSUTM型で表現できる範囲を超えた(つまり,オー
     1396バフローした)場合,性能評価用システム時刻は0に戻る.評価対象プログラム
     1397の実行前後の性能評価用システム時刻の差を求める場合には,計測する時間が
     1398SYSUTM型で表現できる範囲である限り,0に戻ることを特別に考慮する必要はな
     1399い.
     1400
     1401SYSUTM型が32ビットの場合,性能評価用システム時刻は約71分でオーバフロー
     1402する.そのため,この機能を71分を越える時間の測定に使った場合の動作は保
     1403証されない.
     1404
     1405性能評価用システム時刻参照機能のためのサービスコールの仕様については,
     1406「TOPPERS新世代カーネル統合仕様書」の「4.6.1 システム時刻管理」の節を参
     1407照すること.
     1408
     1409●実装
     1410
     1411時刻をマイクロ秒単位で取得するために,周期的なタイムティックを供給する
     1412タイマの現在値(タイマはカウントアップするものと仮定する)を読み出し,
     1413それをマイクロ秒単位に換算した値に,現在のシステム時刻(ミリ秒単位で表
     1414現される)を1000倍した値を加えたものを性能評価用システム時刻とする.現
     1415在のシステム時刻を1000倍する際に,オーバフローが発生する可能性があるが,
     1416無視してかまわない.
     1417
     1418ただし,システム時刻の現在値とタイマの現在値を一貫した状態で読み出すの
     1419は容易ではない.両方の値を順に読み出すと,読出しの間にタイマがオーバフ
     1420ローして割込み要求が発生した場合に,片方はオーバフロー前の値,もう片方
     1421はオーバフロー後の値を読んでしまい,誤った性能評価用システム時刻を取得
     1422してしまう.
     1423
     1424この問題を解決する方法はいくつか考えられるが,どの方法を採用するの決定
     1425にあたり,次の要求事項を設定した.
     1426
     1427(1) 多くのターゲットシステムで実現できること.
     1428
     1429(2) サービスコールの実行時間が可能な限り一定となること.言い換えると,
     1430    条件によってサービスコールの実行時間が大きく変動しないこと.
     1431
     1432(3) サービスコール中の可能な限り同じタイミングの時刻を返すこと.言い換
     1433    えると,条件によって時刻を読み取るタイミングが変動しないこと.
     1434
     1435(4) 調整する必要のあるパラメータを最小限とすること.
     1436
     1437これらの要求事項を満たす方法として,次の方法を用いることにした.
     1438
     1439まず,NMIを除くすべての割込みを禁止した状態で,システム時刻の現在値,タ
     1440イマの現在値(1回目),タイマ割込み要求の有無,タイマの現在値(2回目)
     1441を,この順で読み出す.割込みを禁止しているため,この間にシステム時刻の
     1442現在値が変化することはなく,システム時刻の現在値を読み出す順番はどこで
     1443もよい.また,タイマの現在値の2回目の読出しは,タイマ割込み要求があった
     1444場合にのみ必要となるが,(2)の要求から,タイマ割込み要求の有無によらず読
     1445み出すこととする.
     1446
     1447これらの値を読み出した後,割込み禁止を解除し,次の処理を行う.まず,タ
     1448イマ割込み要求がなかった場合には,システム時刻の現在値と,1回目に読んだ
     1449タイマの現在値は一貫した値であることが保証できるため,これらの値から性
     1450能評価用システム時刻の現在値を求める.
     1451
     1452次にタイマ割込み要求があった場合には,1回目に読んだタイマの現在値が,タ
     1453イマ割込み要求発生前の値(オーバフロー前の値)である場合と,発生後の値
     1454(オーバフロー後の値)である場合の両方の可能性が考えられる.このどちら
     1455の場合であったかを,2回目に読んだタイマの現在値を使って,次のように決定
     1456する.2回目の値は,タイマ割込み要求発生後の値(オーバフロー後の値)であ
     1457ることが保証できるため,1回目の値が2回目の値よりも大きい場合には,その
     1458間にオーバフローがあったものと推測できる.つまり,1回目の値はオーバフロー
     1459前の値ということになり,システム時刻の現在値と一貫した値であるとして性
     1460能評価用システム時刻の現在値を求める.逆に,1回目の値が2回目の値と同じ
     1461かそれより小さい場合には,1回目の値はオーバフロー後の値であると推測でき
     1462る.この場合には,次のタイムティックのシステム時刻を求め,その値と1回目
     1463の値が一貫した値であるとして性能評価用システム時刻の現在値を求める.
     1464
     1465ここで,タイマ割込み要求があった場合には,2回目に読んだタイマの現在値を
     1466用いる方法が考えられるが,(3)の要求を満たさなくなるために採用しなかった.
     1467また,JSPカーネルと同様の方法は,(4)の要求を満たさないために採用しなかっ
     1468た.
     1469
     1470上で「推測できる」としたのは,この推測が成り立たなくなるケースがあるた
     1471めである.この推測が成り立たなくなるケースは,次の2つの場合に分けて分析
     1472することができる.
     1473
     1474(a) 1回目の値がオーバフロー後の値であるにもかかわらず,1回目の値が2回目
     1475    の値よりも大きくなる場合
     1476
     1477このようなケースは,タイマ割込みが要求されているにもかかわらずサービス
     1478されない状態が長時間続くか,タイマの現在値を1回目に読んでから2回目に読
     1479むまでの間に長い時間がかかった結果,その間に(再度)オーバフローが発生
     1480した場合に起こる.つまり,タイマ割込みがサービスされない時間が,タイム
     1481ティックの周期よりも長くなった場合である.このような場合には,システム
     1482時刻の更新も正しく行われなくなる.
     1483
     1484(b) 1回目の値がオーバフロー前の値であるにもかかわらず,1回目の値が2回目
     1485    の値と同じかそれよりも小さくなる場合
     1486
     1487このようなケースは,タイマの現在値を1回目に読んでから2回目に読むまでの
     1488間に,タイマがほぼ1周分カウントアップした場合に起こる.この場合も,タイ
     1489マ割込みが禁止されている時間が,タイムティックの周期よりも長かったこと
     1490になり,システム時刻の更新が正しく行えなくなる.
     1491
     1492いずれのケースも,タイマ割込みが長時間禁止されている,タイマ割込みより
     1493も優先度の高い割込み処理が長時間続けて実行された,シミュレーション環境
     1494においてシミュレータのプロセスが長時間スケジュールされなかったなどの理
     1495由で,システム時刻の更新が正しく行えない状況に相当する.そこでこの状況
     1496を,サービスコール使用上の注意事項に盛り込む.
     1497
     1498実際のコードにおいては,システム時刻の現在値は変数に保持されていないた
     1499め(上位桁はcurrent_timeに保持されているが,下位桁を保持する変数がな
     1500い),次のタイムティックのシステム時刻を用いて計算している.そのため,
     1501タイマの現在値がオーバフロー後の値であると判断した場合を除いては,タイ
     1502ムティックの周期時間を,求めた性能評価用システム時刻から減算する.この
     1503処理により,サービスコールの実行時間が変動することになるが,if文の内容
     1504が(コンパイラの最適化を仮定すると)定数値の減算1回なので,変動はわずか
     1505である.
     1506
     1507このサービスコールは,任意の状態から呼び出すことができるため,SILの全割
     1508込みロック機能を用いて,サービスコール内部のクリティカルセクションを実
     1509現する.
     1510
     1511
     1512○タスク例外処理禁止フラグをenatexで実装している理由
     1513
     1514タスク例外処理禁止フラグは,TCB中のenatexフィールド(タスク例外処理許可
     1515状態であることを示す)の形で保持している.このフィールドをdistexとせず
     1516enatexとしたのは,JSPカーネルにおいてタスクディスパッチ禁止フラグを
     1517enadspの形で保持したのと整合させたためである.
     1518
     1519ASPカーネルでは,enadspはdisdspに変更になったことから,enatexもdistexに
     1520変更した方が良かったと思われる.
     1521
     1522以上
  • rubycfg_asp/trunk/asp_dcre/doc/extension.txt

    • Property svn:mime-type changed from text/plain to text/plane; charset=UTF-8
    r313 r315  
    11
    2                 TOPPERS/ASPカーネル
    3                 機能拡張・チューニングガイド
    4 
    5                 対応バージョン: Release 1.9.3
    6                 最終更新: 2014å¹´1月2日
    7 
    8 ã“のドキュメントは,TOPPERS/ASPカーネルを,機能拡張・チューニングするた
    9 ã‚ã®æ–¹æ³•ï¼ˆã¾ãŸã¯ãƒ’ント)を説明するものである.
     2                TOPPERS/ASPカーネル
     3                機能拡張・チューニングガイド
     4
     5                対応バージョン: Release 1.9.3
     6                最終更新: 2014年1月2日
     7
     8このドキュメントは,TOPPERS/ASPカーネルを,機能拡張・チューニングするた
     9めの方法(またはヒント)を説明するものである.
    1010
    1111----------------------------------------------------------------------
     
    1717             Graduate School of Information Science, Nagoya Univ., JAPAN
    1818 
    19  ä¸Šè¨˜è‘—作権è€
    20 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    21  ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    22  å¤‰ãƒ»å†é
    23 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    24  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    25      æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    26      ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    27  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    28      ç”¨ã§ãã‚‹å½¢ã§å†é
    29 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    30 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    31      è€
    32 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    33      ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    34  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    35      ç”¨ã§ããªã„形で再é
    36 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    37      ã¨ï¼Ž
    38    (a) 再é
    39 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    40 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    41        ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    42    (b) 再é
    43 å¸ƒã®å½¢æ
    44 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    45        å ±å‘Šã™ã‚‹ã“と.
    46  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    47      å®³ã‹ã‚‰ã‚‚,上記著作権è€
    48 ãŠã‚ˆã³TOPPERSプロジェクトをå
    49 è²¬ã™ã‚‹ã“と.
    50      ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    51      ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    52 ãŠã‚ˆã³TOPPERSプロジェクトを
    53      å
    54 è²¬ã™ã‚‹ã“と.
     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     免責すること.
    5541 
    56  æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    57 ãŠ
    58  ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    59  ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    60  ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    61  ã®è²¬ä»»ã‚’負わない.
     42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     46 の責任を負わない.
    6247 
    6348 $Id$
    6449----------------------------------------------------------------------
    6550
    66 â—‹ç›®æ¬¡
    67 
    68 ãƒ»ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯ã®çœç•¥
    69 ãƒ»ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã®å‘¨æœŸã®å¤‰æ›´
    70 ãƒ»ç‰¹æ®Šç›®çš„のレジスタの扱い
    71 ãƒ»æ‹¡å¼µãƒ‘ッケージの使い方
    72         - ミューテックス機能拡張パッケージ
    73         - メッセージバッファ機能拡張パッケージ
    74         - オーバランハンドラ機能拡張パッケージ
    75         - タスク優å
    76 ˆåº¦æ‹¡å¼µãƒ‘ッケージ
    77         - 制約タスク拡張パッケージ
    78         - 動的生成機能拡張パッケージ
    79 ãƒ»CPU例外ハンドラの直接呼出し
    80         - TA_DIRECT属性の導å
    81 ¥
    82         - ターゲット依存部の修正箇所
    83 
    84 
    85 â—‹ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯ã®çœç•¥
    86 
    87 ã‚µãƒ¼ãƒ“スコールのオーバヘッドを削減するために,静的なエラーのチェックを
    88 çœç•¥ã™ã‚‹å ´åˆãŒã‚る.ASPカーネルにおいては,静的なエラーのチェックはすべ
    89 ã¦CHECKマクロを用いて行っているため,kernel/check.h中のCHECKマクロを編
    90 é›†ã™ã‚‹ã“とで,静的なエラーのチェックを省略することができる.
    91 
    92 ä¾‹ãˆã°ï¼Œã‚¿ã‚¹ã‚¯IDのチェックを省略したい場合には,CHECK_TSKIDマクロと
    93 CHECK_TSKID_SELFマクロを,次のように修正すればよい.
     51○目次
     52
     53・エラーチェックの省略
     54・タイムティックの周期の変更
     55・特殊目的のレジスタの扱い
     56・拡張パッケージの使い方
     57        - ミューテックス機能拡張パッケージ
     58        - メッセージバッファ機能拡張パッケージ
     59        - オーバランハンドラ機能拡張パッケージ
     60        - タスク優先度拡張パッケージ
     61        - 制約タスク拡張パッケージ
     62        - 動的生成機能拡張パッケージ
     63・CPU例外ハンドラの直接呼出し
     64        - TA_DIRECT属性の導入
     65        - ターゲット依存部の修正箇所
     66
     67
     68○エラーチェックの省略
     69
     70サービスコールのオーバヘッドを削減するために,静的なエラーのチェックを
     71省略する場合がある.ASPカーネルにおいては,静的なエラーのチェックはすべ
     72てCHECKマクロを用いて行っているため,kernel/check.h中のCHECKマクロを編
     73集することで,静的なエラーのチェックを省略することができる.
     74
     75例えば,タスクIDのチェックを省略したい場合には,CHECK_TSKIDマクロと
     76CHECK_TSKID_SELFマクロを,次のように修正すればよい.
    9477
    9578#define CHECK_TSKID(tskid)                      ((void)(tskid))
    9679#define CHECK_TSKID_SELF(tskid)         ((void)(tskid))
    9780
    98 ã“れらのマクロの定義を空にする方法もあるが,パラメータに副作用のある式
    99 ãŒæ›¸ã‹ã‚Œã¦ã„る可能性を考えると(副作用のある式は書くべきではないが,書
    100 ã‹ã‚Œã¦ã„るコードがå
    101 ¥ã£ã¦ãã‚‹å¯èƒ½æ€§ãŒå
    102 ¨ããªã„とは言えない),上の定義の
    103 æ–¹ãŒå®‰å
    104 ¨ã§ã‚る.副作用のない式であれば,最適化によって削除することがで
    105 ãã‚‹ãŸã‚ï¼Œå®Ÿè¡Œæ™‚効率には影響がないと期å¾
    106 ã§ãã‚‹ï¼ŽãŸã ã—,最適化によって
    107 å‰Šé™¤ã•ã‚Œãªã„場合には,副作用のある式が書かれていないことを確認した上で,
    108 ãƒžã‚¯ãƒ­ã®å®šç¾©ã‚’空にしてもよい.
    109 
    110 
    111 â—‹ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã®å‘¨æœŸã®å¤‰æ›´
    112 
    113 ASPカーネルでは,カーネルへタイムティックを供給する周期は1ミリ秒が標準
    114 ã¨ãªã£ã¦ã„るが,低速なプロセッサでは1ミリ秒毎に割込みを処理するオーバヘッ
    115 ãƒ‰ãŒå•é¡Œã«ãªã‚‹å ´åˆãŒã‚る.そこで,アプリケーションがå¿
    116 è¦ã¨ã™ã‚‹æ™‚間精度
    117 ãŒç²—い場合には,タイムティックの周期を長くすることで,プロセッサの処理
    118 è² è·ã‚’低減する方法がある.
    119 
    120 ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã®å‘¨æœŸã®ä¸Žãˆæ–¹ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã§ã‚るため,これが変更でき
    121 ã‚‹ã‹ã©ã†ã‹ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã®å®Ÿè£
    122 ã‚’調べるå¿
    123 è¦ãŒã‚る.
    124 æ¨™æº–的には,target_kernel.h(またはそこからインクルードされるファイル)
    125 ä¸­ã«å®šç¾©ã•ã‚Œã¦ã„ã‚‹TIC_NUMEとTIC_DENOを書き換えることで,変更できるよう
    126 ã«å®Ÿè£
    127 ã•ã‚Œã¦ã„る.
    128 
    129 
    130 â—‹ç‰¹æ®Šç›®çš„のレジスタの扱い
    131 
    132 FPUレジスタやDSPレジスタなどの特殊目的のレジスタ(以下,特殊レジスタ)
    133 ã‚’持つプロセッサでは,レジスタの扱いについて大きく次の3つの方法が考えら
    134 ã‚Œã‚‹ï¼Ž
    135 
    136 (1) 特殊レジスタをタスクのコンテキストに含めない
    137 
    138 1つのタスクのみが特殊レジスタを使用する場合には,特殊レジスタをタスクの
    139 ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«å«ã‚ã‚‹å¿
    140 è¦ãŒãªãï¼Œã‚«ãƒ¼ãƒãƒ«ã§ç®¡ç†ã™ã‚‹å¿
    141 è¦ãŒãªã„.
    142 
    143 (2) 特殊レジスタをタスクのコンテキストに含める
    144 
    145 è¤‡æ•°ã®ã‚¿ã‚¹ã‚¯ãŒç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’使用する場合には,特殊レジスタをタスクのコ
    146 ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«å«ã‚ã‚‹æ–¹æ³•ãŒæœ€ã‚‚単純である.そのためには,タスクディスパッ
    147 ãƒãƒ£ã¨å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©/CPU例外ハンドラの出å
    148 ¥å£ã§ï¼Œç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’保存/復帰
    149 ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’追加するå¿
    150 è¦ãŒã‚る.実際の保存/復帰場所は,スクラッチレジス
    151 ã‚¿ã¨ãã‚Œä»¥å¤–のレジスタで異なるため,注意がå¿
    152 è¦ã§ã‚る.
    153 
    154 (3) 特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定する
    155 
    156 ç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’使用するタスクと使用しないタスクがある場合で,すべてのタ
    157 ã‚¹ã‚¯ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«ç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’含める方法ではオーバヘッドが問題にな
    158 ã‚‹å ´åˆã«ã¯ï¼Œç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’コンテキストに含めるかどうかをタスク毎に指定
    159 ã™ã‚‹æ–¹æ³•ãŒæœ‰åŠ›ã§ã‚る.これを実現する方法は次の通りである.
    160 
    161 ã¾ãšï¼Œç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’コンテキストに含めるかどうかを指定するタスク属性を
    162 è¨­ã‘る.例えば,FPUレジスタであれば,タスク属性にTA_FPUを設ける.タスク
    163 ãƒ‡ã‚£ã‚¹ãƒ‘ッチャでは,タスク属性を見て,その属性が設定されていれば特殊レ
    164 ã‚¸ã‚¹ã‚¿ã‚’保存/復帰する.
    165 
    166 ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢çš„に特殊レジスタがディスエーブルできる場合には,その属性が
    167 è¨­å®šã•ã‚Œã¦ã„ないタスクに切り換える時に特殊レジスタをディスエーブルする
    168 ã¨ï¼Œèª¤ã£ã¦ç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’使った場合を検出できる.
    169 
    170 ã•ã‚‰ã«ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ï¼ˆISR,周期ハンドラ,アラームハンドラを含む)や
    171 CPU例外ハンドラで特殊レジスタを使用する場合には,これらの処理単位にも
    172 ç‰¹æ®Šãƒ¬ã‚¸ã‚¹ã‚¿ã‚’使用するかどうかの属性を設ける方法が考えられる.
    173 
    174 ã“こで,タスク(または他の処理単位)が特殊レジスタを使用するかどうかは,
    175 ã‚³ãƒ³ãƒ‘イラやライブラリに依存する場合があるため,注意がå¿
    176 è¦ã§ã‚る.例え
    177 ã°ï¼Œæµ®å‹•å°æ•°ç‚¹æ¼”算を含まないプログラムであっても,コンパイラがその方が
    178 æ€§èƒ½ãŒé«˜ã„と判断すれば,浮動小数点命令を生成する場合がある.
    179 
    180 
    181 â—‹æ‹¡å¼µãƒ‘ッケージの使い方
    182 
    183 ASPカーネルでは,いくつかの拡張機能を実è£
    184 ã™ã‚‹ãŸã‚ã«ï¼Œæ‹¡å¼µãƒ‘ッケージをサ
    185 ãƒãƒ¼ãƒˆã—ている.拡張パッケージは,extensionディレクトリに置いてある.
    186 
    187 æ‹¡å¼µãƒ‘ッケージを使用する場合には,UNIXであれば,ASPカーネルのソースファ
    188 ã‚¤ãƒ«ã®ãƒˆãƒƒãƒ—ディレクトリで,
    189 
    190         % cp -r extension/<拡張パッケージのディレクトリ名>/* .
    191 
    192 ã‚’実行する.この時,å
    193 ƒã®ï¼ˆæ‹¡å¼µå‰ã®ï¼‰ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ä¸Šæ›¸ãã•ã‚Œã¦ã—まう
    194 ãŸã‚ï¼Œæ‹¡å¼µã—ないカーネルも使用したい場合には,別のディレクトリにソース
    195 ãƒ•ã‚¡ã‚¤ãƒ«ã‚’展開して,上のコマンドを実行すること.
    196 
    197 è¤‡æ•°ã®æ‹¡å¼µãƒ‘ッケージを使うことは考æ
    198 ®ã—ていないが,以下に述べるケースを
    199 é™¤ã„ては,手作業により複数の拡張パッケージをマージすることは可能である.
    200 ç¾æ™‚点では,ミューテックス機能拡張パッケージと制約タスク拡張パッケージ
    201 ã‚’マージすることはできない.また,動的生成機能拡張パッケージを他の拡張
    202 ãƒ‘ッケージとマージすることは考æ
    203 ®ã—ていない.
    204 
    205 â—ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージ
    206 
    207 ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージは,ミューテックス機能を追加するための
    208 æ‹¡å¼µãƒ‘ッケージである.ただし,優å
    209 ˆåº¦é€†è»¢ã‚’制御するための仕組みとして,
    210ʌ㻌
    211 ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ï¼ˆTA_CEILING属性のミューテックス)のみをサポー
    212 ãƒˆã—,優å
    213 ˆåº¦ç¶™æ‰¿ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ï¼ˆTA_INHERIT属性のミューテックス)はサポー
    214 ãƒˆã—ていない.ミューテックス機能拡張パッケージは,extension/mutexディレ
    215 ã‚¯ãƒˆãƒªã«ç½®ã„てある.
    216 
    217 ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージでは,TOPPERS_SUPPORT_MUTEXがkernel.h中
    218 ã§å®šç¾©ã•ã‚Œã¦ã„るので,これを用いてミューテックス機能を使用できるかどう
    219 ã‹ã‚’判別することができる.
    220 
    221 â—ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージ
    222 
    223 ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージは,メッセージバッファ機能を追加す
    224 ã‚‹ãŸã‚ã®æ‹¡å¼µãƒ‘ッケージである.メッセージバッファ機能拡張パッケージは,
    225 extension/messagebufディレクトリに置いてある.
    226 
    227 ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージでは,TOPPERS_SUPPORT_MESSAGEBUFが
    228 kernel.h中で定義されているので,これを用いてメッセージバッファ機能を使
    229 ç”¨ã§ãã‚‹ã‹ã©ã†ã‹ã‚’判別することができる.
    230 
    231 â—ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージ
    232 
    233 ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージは,オーバランハンドラ機能を追加す
    234 ã‚‹ãŸã‚ã®æ‹¡å¼µãƒ‘ッケージである.ただし,この拡張パッケージを使うためには,
    235 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ãŒå¯¾å¿œã—ているå¿
    236 è¦ãŒã‚る.オーバランハンドラ機能拡張パッ
    237 ã‚±ãƒ¼ã‚¸ã¯ï¼Œextension/ovrhdrディレクトリに置いてある.
    238 
    239 ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージで,ターゲット依存部が拡張パッケー
    240 ã‚¸ã«å¯¾å¿œã—ている場合には,TOPPERS_SUPPORT_OVRHDRがkernel.h中で定義され
    241 ã‚‹ã®ã§ï¼Œã“れを用いてオーバランタイマ機能が使用できるかどうかを判別する
    242 ã“とができる.
    243 
    244 â—ã‚¿ã‚¹ã‚¯å„ªå
    245 ˆåº¦æ‹¡å¼µãƒ‘ッケージ
    246 
    247 ã‚¿ã‚¹ã‚¯å„ªå
    248 ˆåº¦æ‹¡å¼µãƒ‘ッケージは,タスク優å
    249 ˆåº¦ã‚’最大256段階に拡張するための
    250 æ‹¡å¼µãƒ‘ッケージである.この拡張パッケージは,タスク優å
    251 ˆåº¦ã«åŠ ãˆã¦ï¼Œãƒ‡ãƒ¼
    252 ã‚¿å„ªå
    253 ˆåº¦ï¼Œãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å„ªå
    254 ˆåº¦ï¼Œå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチン優å
    255 ˆåº¦ã‚‚256段階に拡張
    256 ã™ã‚‹ï¼Žã‚¿ã‚¹ã‚¯å„ªå
    257 ˆåº¦æ‹¡å¼µãƒ‘ッケージは,extension/pri_levelディレクトリに置
    258 ã„てある.
    259 
    260 ã‚¿ã‚¹ã‚¯å„ªå
    261 ˆåº¦æ‹¡å¼µãƒ‘ッケージでは,TOPPERS_SUPPORT_PRI_LEVELがkernel.h中で
    262 å®šç¾©ã•ã‚Œã¦ã„るので,これを用いてタスク優å
    263 ˆåº¦ã®ç¯„囲が拡張されているかど
    264 ã†ã‹ã‚’判別することができる.
    265 
    266 â—åˆ¶ç´„タスク拡張パッケージ
    267 
    268 åˆ¶ç´„タスク拡張パッケージは,制約タスクの機能を追加するための拡張パッケー
    269 ã‚¸ã§ã‚る.TOPPERS新世代カーネル統合仕様書に規定された制約タスクの機能に
    270 åŠ ãˆã¦ï¼Œè‡ªã‚¿ã‚¹ã‚¯ã®ãƒ™ãƒ¼ã‚¹å„ªå
    271 ˆåº¦ã‚’変更するサービスコールras_priを実è£
    272 ã—て
    273 ã„る.制約タスク拡張パッケージは,extension/rstr_taskディレクトリに置い
    274 ã¦ã‚る.
    275 
    276 åˆ¶ç´„タスク拡張パッケージでは,TOPPERS_SUPPORT_RSTR_TASKがkernel.h中で定
    277 ç¾©ã•ã‚Œã¦ã„るので,これを用いて制約タスクの機能が使用できるかどうかを判
    278 åˆ¥ã™ã‚‹ã“とができる.
    279 
    280 ----------------------------------------------------------------------
    281 ras_pri         è‡ªã‚¿ã‚¹ã‚¯ã®ãƒ™ãƒ¼ã‚¹å„ªå
    282 ˆåº¦ã®å¼•ãä¸Šã’〔T〕
    283 
    284 ã€C言語API】
     81これらのマクロの定義を空にする方法もあるが,パラメータに副作用のある式
     82が書かれている可能性を考えると(副作用のある式は書くべきではないが,書
     83かれているコードが入ってくる可能性が全くないとは言えない),上の定義の
     84方が安全である.副作用のない式であれば,最適化によって削除することがで
     85きるため,実行時効率には影響がないと期待できる.ただし,最適化によって
     86削除されない場合には,副作用のある式が書かれていないことを確認した上で,
     87マクロの定義を空にしてもよい.
     88
     89
     90○タイムティックの周期の変更
     91
     92ASPカーネルでは,カーネルへタイムティックを供給する周期は1ミリ秒が標準
     93となっているが,低速なプロセッサでは1ミリ秒毎に割込みを処理するオーバヘッ
     94ドが問題になる場合がある.そこで,アプリケーションが必要とする時間精度
     95が粗い場合には,タイムティックの周期を長くすることで,プロセッサの処理
     96負荷を低減する方法がある.
     97
     98タイムティックの周期の与え方はターゲット依存であるため,これが変更でき
     99るかどうかは,ターゲット依存部のタイマドライバの実装を調べる必要がある.
     100標準的には,target_kernel.h(またはそこからインクルードされるファイル)
     101中に定義されているTIC_NUMEとTIC_DENOを書き換えることで,変更できるよう
     102に実装されている.
     103
     104
     105○特殊目的のレジスタの扱い
     106
     107FPUレジスタやDSPレジスタなどの特殊目的のレジスタ(以下,特殊レジスタ)
     108を持つプロセッサでは,レジスタの扱いについて大きく次の3つの方法が考えら
     109れる.
     110
     111(1) 特殊レジスタをタスクのコンテキストに含めない
     112
     1131つのタスクのみが特殊レジスタを使用する場合には,特殊レジスタをタスクの
     114コンテキストに含める必要がなく,カーネルで管理する必要がない.
     115
     116(2) 特殊レジスタをタスクのコンテキストに含める
     117
     118複数のタスクが特殊レジスタを使用する場合には,特殊レジスタをタスクのコ
     119ンテキストに含める方法が最も単純である.そのためには,タスクディスパッ
     120チャと割込みハンドラ/CPU例外ハンドラの出入口で,特殊レジスタを保存/復帰
     121するコードを追加する必要がある.実際の保存/復帰場所は,スクラッチレジス
     122タとそれ以外のレジスタで異なるため,注意が必要である.
     123
     124(3) 特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定する
     125
     126特殊レジスタを使用するタスクと使用しないタスクがある場合で,すべてのタ
     127スクのコンテキストに特殊レジスタを含める方法ではオーバヘッドが問題にな
     128る場合には,特殊レジスタをコンテキストに含めるかどうかをタスク毎に指定
     129する方法が有力である.これを実現する方法は次の通りである.
     130
     131まず,特殊レジスタをコンテキストに含めるかどうかを指定するタスク属性を
     132設ける.例えば,FPUレジスタであれば,タスク属性にTA_FPUを設ける.タスク
     133ディスパッチャでは,タスク属性を見て,その属性が設定されていれば特殊レ
     134ジスタを保存/復帰する.
     135
     136ハードウェア的に特殊レジスタがディスエーブルできる場合には,その属性が
     137設定されていないタスクに切り換える時に特殊レジスタをディスエーブルする
     138と,誤って特殊レジスタを使った場合を検出できる.
     139
     140さらに,割込みハンドラ(ISR,周期ハンドラ,アラームハンドラを含む)や
     141CPU例外ハンドラで特殊レジスタを使用する場合には,これらの処理単位にも
     142特殊レジスタを使用するかどうかの属性を設ける方法が考えられる.
     143
     144ここで,タスク(または他の処理単位)が特殊レジスタを使用するかどうかは,
     145コンパイラやライブラリに依存する場合があるため,注意が必要である.例え
     146ば,浮動小数点演算を含まないプログラムであっても,コンパイラがその方が
     147性能が高いと判断すれば,浮動小数点命令を生成する場合がある.
     148
     149
     150○拡張パッケージの使い方
     151
     152ASPカーネルでは,いくつかの拡張機能を実装するために,拡張パッケージをサ
     153ポートしている.拡張パッケージは,extensionディレクトリに置いてある.
     154
     155拡張パッケージを使用する場合には,UNIXであれば,ASPカーネルのソースファ
     156イルのトップディレクトリで,
     157
     158        % cp -r extension/<拡張パッケージのディレクトリ名>/* .
     159
     160を実行する.この時,元の(拡張前の)ソースファイルは上書きされてしまう
     161ため,拡張しないカーネルも使用したい場合には,別のディレクトリにソース
     162ファイルを展開して,上のコマンドを実行すること.
     163
     164複数の拡張パッケージを使うことは考慮していないが,以下に述べるケースを
     165除いては,手作業により複数の拡張パッケージをマージすることは可能である.
     166現時点では,ミューテックス機能拡張パッケージと制約タスク拡張パッケージ
     167をマージすることはできない.また,動的生成機能拡張パッケージを他の拡張
     168パッケージとマージすることは考慮していない.
     169
     170●ミューテックス機能拡張パッケージ
     171
     172ミューテックス機能拡張パッケージは,ミューテックス機能を追加するための
     173拡張パッケージである.ただし,優先度逆転を制御するための仕組みとして,
     174優先度上限ミューテックス(TA_CEILING属性のミューテックス)のみをサポー
     175トし,優先度継承ミューテックス(TA_INHERIT属性のミューテックス)はサポー
     176トしていない.ミューテックス機能拡張パッケージは,extension/mutexディレ
     177クトリに置いてある.
     178
     179ミューテックス機能拡張パッケージでは,TOPPERS_SUPPORT_MUTEXがkernel.h中
     180で定義されているので,これを用いてミューテックス機能を使用できるかどう
     181かを判別することができる.
     182
     183●メッセージバッファ機能拡張パッケージ
     184
     185メッセージバッファ機能拡張パッケージは,メッセージバッファ機能を追加す
     186るための拡張パッケージである.メッセージバッファ機能拡張パッケージは,
     187extension/messagebufディレクトリに置いてある.
     188
     189メッセージバッファ機能拡張パッケージでは,TOPPERS_SUPPORT_MESSAGEBUFが
     190kernel.h中で定義されているので,これを用いてメッセージバッファ機能を使
     191用できるかどうかを判別することができる.
     192
     193●オーバランハンドラ機能拡張パッケージ
     194
     195オーバランハンドラ機能拡張パッケージは,オーバランハンドラ機能を追加す
     196るための拡張パッケージである.ただし,この拡張パッケージを使うためには,
     197ターゲット依存部が対応している必要がある.オーバランハンドラ機能拡張パッ
     198ケージは,extension/ovrhdrディレクトリに置いてある.
     199
     200オーバランハンドラ機能拡張パッケージで,ターゲット依存部が拡張パッケー
     201ジに対応している場合には,TOPPERS_SUPPORT_OVRHDRがkernel.h中で定義され
     202るので,これを用いてオーバランタイマ機能が使用できるかどうかを判別する
     203ことができる.
     204
     205●タスク優先度拡張パッケージ
     206
     207タスク優先度拡張パッケージは,タスク優先度を最大256段階に拡張するための
     208拡張パッケージである.この拡張パッケージは,タスク優先度に加えて,デー
     209タ優先度,メッセージ優先度,割込みサービスルーチン優先度も256段階に拡張
     210する.タスク優先度拡張パッケージは,extension/pri_levelディレクトリに置
     211いてある.
     212
     213タスク優先度拡張パッケージでは,TOPPERS_SUPPORT_PRI_LEVELがkernel.h中で
     214定義されているので,これを用いてタスク優先度の範囲が拡張されているかど
     215うかを判別することができる.
     216
     217●制約タスク拡張パッケージ
     218
     219制約タスク拡張パッケージは,制約タスクの機能を追加するための拡張パッケー
     220ジである.TOPPERS新世代カーネル統合仕様書に規定された制約タスクの機能に
     221加えて,自タスクのベース優先度を変更するサービスコールras_priを実装して
     222いる.制約タスク拡張パッケージは,extension/rstr_taskディレクトリに置い
     223てある.
     224
     225制約タスク拡張パッケージでは,TOPPERS_SUPPORT_RSTR_TASKがkernel.h中で定
     226義されているので,これを用いて制約タスクの機能が使用できるかどうかを判
     227別することができる.
     228
     229----------------------------------------------------------------------
     230ras_pri         自タスクのベース優先度の引き上げ〔T〕
     231
     232【C言語API】
    285233        ER ercd = ras_pri(PRI tskpri)
    286234
    287 ã€ãƒ‘ラメータ】
    288         PRI                     tskpri          ベース優å
    289 ˆåº¦
    290 
    291 ã€ãƒªã‚¿ãƒ¼ãƒ³ãƒ‘ラメータ】
    292         ER                      ercd            正常終了(E_OK)またはエラーコード
    293 
    294 ã€ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã€‘
    295         E_CTX           ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚¨ãƒ©ãƒ¼
    296                                 ・非タスクコンテキストからの呼出し
    297                                 ・CPUロック状æ
    298 ‹ã‹ã‚‰ã®å‘¼å‡ºã—
    299         E_PAR           ãƒ‘ラメータエラー
    300                                 ・tskpriが有効範囲外
    301         E_ILUSE         ã‚µãƒ¼ãƒ“スコール不正使用
    302                                 ・条件については機能のé 
    303 ã‚’参ç
    304 §
    305 
    306 ã€æ©Ÿèƒ½ã€‘
    307 
    308 è‡ªã‚¿ã‚¹ã‚¯ã®ãƒ™ãƒ¼ã‚¹å„ªå
    309 ˆåº¦ã‚’,tskpriで指定した優å
    310 ˆåº¦ã«å¤‰æ›´ã™ã‚‹ï¼Žå
    311 ·ä½“的な振
    312 èˆžã„は以下の通り.
    313 
    314 è‡ªã‚¿ã‚¹ã‚¯ã®ãƒ™ãƒ¼ã‚¹å„ªå
    315 ˆåº¦ãŒï¼Œtskpriで指定した優å
    316 ˆåº¦ã«å¤‰æ›´ã•ã‚Œã‚‹ï¼Žãã‚Œã«ä¼´ã£
    317 ã¦ï¼Œè‡ªã‚¿ã‚¹ã‚¯ã®ç¾åœ¨å„ªå
    318 ˆåº¦ã‚‚変更される.同じ優å
    319 ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã®ä¸­ã§ã¯ï¼Œè‡ªã‚¿
    320 ã‚¹ã‚¯ãŒæœ€é«˜å„ªå
    321 ˆé †ä½ã¨ãªã‚‹ï¼Ž
    322 
    323 tskpriにTPRI_INI(=0)を指定すると,自タスクのベース優å
    324 ˆåº¦ãŒï¼Œèµ·å‹•æ™‚優
    325 å
    326 ˆåº¦ã«å¤‰æ›´ã•ã‚Œã‚‹ï¼Ž
    327 
    328 tskpriは,自タスクの起動時優å
    329 ˆåº¦ã¨åŒã˜ã‹ãã‚Œã‚ˆã‚Šã‚‚高くなければならない.
    330 ãã†ã§ãªã„場合には,E_ILUSEエラーとなる.
    331 ----------------------------------------------------------------------
    332 
    333 â—å‹•çš„生成機能拡張パッケージ
    334 
    335 å‹•çš„生成機能拡張パッケージは,オブジェクトの動的生成機能を追加するため
    336 ã®æ‹¡å¼µãƒ‘ッケージである.TOPPERS新世代カーネル統合仕様書に規定された以下
    337 ã®ã‚ªãƒ–ジェクト生成/削除のためのサービスコール,割付け可能なID番号の数
    338 ã‚’指定する静的APIに加えて,カーネルが割り付けるメモリ領域を設定する静的
    339 API DEF_KMMを実è£
    340 ã—ている.動的生成機能拡張パッケージは,extension/dcre
    341 ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç½®ã„てある.
    342 
    343 ãŸã ã—,カーネルå†
    344 ã§ã®å‹•çš„メモリ管理に関しては,ターゲット非依存部では,
    345 ãƒ¡ãƒ¢ãƒªé ˜åŸŸã‚’å
    346 ˆé ­ã‹ã‚‰é †ã«å‰²ã‚Šå½“て,解放されたメモリ領域を再利用しないメ
    347 ãƒ¢ãƒªç®¡ç†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ã¿ã‚’実è£
    348 ã—ている.本格的な動的メモリ管理を行いたい
    349 å ´åˆã«ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶å´ã§ï¼Œãã®ãŸã‚ã®é–¢æ•°ã‚’用意するå¿
    350 
    351 è¦ãŒã‚る.用意する関数等については,「TOPPERS/ASPカーネル ターゲット依
    352 å­˜éƒ¨ ポーティングガイド」の「6.15 動的メモリ管理」の節を参ç
    353 §ã™ã‚‹ã“と.
    354 
    355 å‹•çš„機能拡張拡張パッケージでは,TOPPERS_SUPPORT_DYNAMIC_CREがkernel.h中
    356 ã§å®šç¾©ã•ã‚Œã¦ã„るので,これを用いて動的生成機能が使用できるかどうかを判
    357 åˆ¥ã™ã‚‹ã“とができる.
    358 
    359 å‹•çš„生成機能拡張パッケージにより追加されるサービスコール
     235【パラメータ】
     236        PRI                     tskpri          ベース優先度
     237
     238【リターンパラメータ】
     239        ER                      ercd            正常終了(E_OK)またはエラーコード
     240
     241【エラーコード】
     242        E_CTX           コンテキストエラー
     243                                ・非タスクコンテキストからの呼出し
     244                                ・CPUロック状態からの呼出し
     245        E_PAR           パラメータエラー
     246                                ・tskpriが有効範囲外
     247        E_ILUSE         サービスコール不正使用
     248                                ・条件については機能の項を参照
     249
     250【機能】
     251
     252自タスクのベース優先度を,tskpriで指定した優先度に変更する.具体的な振
     253舞いは以下の通り.
     254
     255自タスクのベース優先度が,tskpriで指定した優先度に変更される.それに伴っ
     256て,自タスクの現在優先度も変更される.同じ優先度のタスクの中では,自タ
     257スクが最高優先順位となる.
     258
     259tskpriにTPRI_INI(=0)を指定すると,自タスクのベース優先度が,起動時優
     260先度に変更される.
     261
     262tskpriは,自タスクの起動時優先度と同じかそれよりも高くなければならない.
     263そうでない場合には,E_ILUSEエラーとなる.
     264----------------------------------------------------------------------
     265
     266●動的生成機能拡張パッケージ
     267
     268動的生成機能拡張パッケージは,オブジェクトの動的生成機能を追加するため
     269の拡張パッケージである.TOPPERS新世代カーネル統合仕様書に規定された以下
     270のオブジェクト生成/削除のためのサービスコール,割付け可能なID番号の数
     271を指定する静的APIに加えて,カーネルが割り付けるメモリ領域を設定する静的
     272API DEF_KMMを実装している.動的生成機能拡張パッケージは,extension/dcre
     273ディレクトリに置いてある.
     274
     275ただし,カーネル内での動的メモリ管理に関しては,ターゲット非依存部では,
     276メモリ領域を先頭から順に割り当て,解放されたメモリ領域を再利用しないメ
     277モリ管理モジュールのみを実装している.本格的な動的メモリ管理を行いたい
     278場合には,ターゲット依存部またはユーザ側で,そのための関数を用意する必
     279要がある.用意する関数等については,「TOPPERS/ASPカーネル ターゲット依
     280存部 ポーティングガイド」の「6.15 動的メモリ管理」の節を参照すること.
     281
     282動的機能拡張拡張パッケージでは,TOPPERS_SUPPORT_DYNAMIC_CREがkernel.h中
     283で定義されているので,これを用いて動的生成機能が使用できるかどうかを判
     284別することができる.
     285
     286動的生成機能拡張パッケージにより追加されるサービスコール
    360287
    361288        ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk)
     
    381308        ER ercd = del_isr(ID isrid)
    382309
    383 å‹•çš„生成機能拡張パッケージにより追加される静的API
     310動的生成機能拡張パッケージにより追加される静的API
    384311
    385312        AID_TSK(uint_t notsk)
     
    396323
    397324----------------------------------------------------------------------
    398 DEF_KMM         ã‚«ãƒ¼ãƒãƒ«ãŒå‰²ã‚Šä»˜ã‘るメモリ領域の設定〔SD〕
    399 
    400 ã€é™çš„API】
     325DEF_KMM         カーネルが割り付けるメモリ領域の設定〔SD〕
     326
     327【静的API】
    401328        DEF_KMM({ SIZE kmmsz, STK_T *kmm })
    402329
    403 ã€ãƒ‘ラメータ】
    404 ã€€ï¼Šã‚«ãƒ¼ãƒãƒ«ãŒå‰²ã‚Šä»˜ã‘るメモリ領域の設定æƒ
    405 å ±
    406         SIZE            kmmsz           ã‚«ãƒ¼ãƒãƒ«ãŒå‰²ã‚Šä»˜ã‘るメモリ領域のサイズ(バイト数)
    407         STK_T           kmm                     ã‚«ãƒ¼ãƒãƒ«ãŒå‰²ã‚Šä»˜ã‘るメモリ領域のå
    408 ˆé ­ç•ªåœ°
    409 
    410 ã€ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã€‘
    411         E_PAR           ãƒ‘ラメータエラー
    412                                 ・kmmszが0以下
    413                                 ・その他の条件については機能のé 
    414 ã‚’参ç
    415 §
    416         E_OBJ           ã‚ªãƒ–ジェクト状æ
    417 ‹ã‚¨ãƒ©ãƒ¼
    418                                 ・カーネルが割り付けるメモリ領域が設定済み
    419 
    420 ã€æ©Ÿèƒ½ã€‘
    421 
    422 å„パラメータで指定したカーネルが割り付けるメモリ領域の設定æƒ
    423 å ±ã«å¾“って,
    424 ã‚«ãƒ¼ãƒãƒ«ãŒå‰²ã‚Šä»˜ã‘るメモリ領域を設定する.
    425 
    426 kmmszは整数定数式パラメータ,kmmは一般定数式パラメータである.
    427 
    428 kmmをNULLとした場合,kmmszで指定したサイズのメモリ領域を,コンフィギュ
    429 ãƒ¬ãƒ¼ã‚¿ãŒç¢ºä¿ã™ã‚‹ï¼Žkmmszにターゲット定義の制約に合致しないサイズを指定し
    430 ãŸæ™‚には,ターゲット定義の制約に合致するようにサイズを大きい方に丸めて
    431 ç¢ºä¿ã™ã‚‹ï¼Ž
    432 
    433 ã‚«ãƒ¼ãƒãƒ«ãŒå‰²ã‚Šä»˜ã‘るメモリ領域をアプリケーションで確保する場合には,
    434 kmmszで指定したサイズのメモリ領域を確保し,kmmにそのå
    435 ˆé ­ç•ªåœ°ã‚’指定する.
    436 
    437 DEF_KMMによりカーネルが割り付けるメモリ領域を設定しない場合,カーネルが
    438 å‰²ã‚Šä»˜ã‘るメモリ領域は確保されない.
    439 
    440 kmmやkmmszにターゲット定義の制約に合致しないå
    441 ˆé ­ç•ªåœ°ã‚„サイズを指定した
    442 æ™‚には,E_PARエラーとなる.
    443 ----------------------------------------------------------------------
    444 
    445 
    446 â—‹CPU例外ハンドラの直接呼出し
    447 
    448 CPU例外ハンドラの出å
    449 ¥å£å‡¦ç†ã¯ï¼ŒCPU例外が発生しないように実è£
    450 ã—なければ
    451 ãªã‚‰ãªã„が,これが防げないターゲットにおいては,CPU例外ハンドラの出å
    452 ¥å£
    453 å‡¦ç†ã‚’経由せずに,アプリケーションが用意したCPU例外ハンドラを直接実行す
    454 ã‚‹æ–¹æ³•ã‚’用意するのが望ましい.これを,CPU例外ハンドラの直接呼出しと呼ぶ.
    455 
    456 ã“こでは,ハードウェアでベクタテーブルを持つプロセッサにおいて,ターゲッ
    457 ãƒˆä¾å­˜éƒ¨ã®ã¿ã®ä¿®æ­£ã«ã‚ˆã‚Šï¼ŒCPU例外ハンドラの直接呼出しの機能を追加する方
    458 æ³•ã«ã¤ã„て説明する.
    459 
    460 â—TA_DIRECT属性の導å
    461 ¥
    462 
    463 CPU例外ハンドラの直接呼出しを指定するために,CPU例外ハンドラ属性に,
    464 TA_DIRECT属性を導å
    465 ¥ã™ã‚‹ï¼Ž
    466 
    467 â—ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ä¿®æ­£ç®‡æ‰€
    468 
    469 TA_DIRECTの値を,target_kernel.h(または,そこからインクルードされるファ
    470 ã‚¤ãƒ«ï¼‰ã§å®šç¾©ã—,その値をコンフィギュレータが取り出せるように,
    471 target_def.csv(または,それに代わるファイル)に次の行を追加する.
     330【パラメータ】
     331 *カーネルが割り付けるメモリ領域の設定情報
     332        SIZE            kmmsz           カーネルが割り付けるメモリ領域のサイズ(バイト数)
     333        STK_T           kmm                     カーネルが割り付けるメモリ領域の先頭番地
     334
     335【エラーコード】
     336        E_PAR           パラメータエラー
     337                                ・kmmszが0以下
     338                                ・その他の条件については機能の項を参照
     339        E_OBJ           オブジェクト状態エラー
     340                                ・カーネルが割り付けるメモリ領域が設定済み
     341
     342【機能】
     343
     344各パラメータで指定したカーネルが割り付けるメモリ領域の設定情報に従って,
     345カーネルが割り付けるメモリ領域を設定する.
     346
     347kmmszは整数定数式パラメータ,kmmは一般定数式パラメータである.
     348
     349kmmをNULLとした場合,kmmszで指定したサイズのメモリ領域を,コンフィギュ
     350レータが確保する.kmmszにターゲット定義の制約に合致しないサイズを指定し
     351た時には,ターゲット定義の制約に合致するようにサイズを大きい方に丸めて
     352確保する.
     353
     354カーネルが割り付けるメモリ領域をアプリケーションで確保する場合には,
     355kmmszで指定したサイズのメモリ領域を確保し,kmmにその先頭番地を指定する.
     356
     357DEF_KMMによりカーネルが割り付けるメモリ領域を設定しない場合,カーネルが
     358割り付けるメモリ領域は確保されない.
     359
     360kmmやkmmszにターゲット定義の制約に合致しない先頭番地やサイズを指定した
     361時には,E_PARエラーとなる.
     362----------------------------------------------------------------------
     363
     364
     365○CPU例外ハンドラの直接呼出し
     366
     367CPU例外ハンドラの出入口処理は,CPU例外が発生しないように実装しなければ
     368ならないが,これが防げないターゲットにおいては,CPU例外ハンドラの出入口
     369処理を経由せずに,アプリケーションが用意したCPU例外ハンドラを直接実行す
     370る方法を用意するのが望ましい.これを,CPU例外ハンドラの直接呼出しと呼ぶ.
     371
     372ここでは,ハードウェアでベクタテーブルを持つプロセッサにおいて,ターゲッ
     373ト依存部のみの修正により,CPU例外ハンドラの直接呼出しの機能を追加する方
     374法について説明する.
     375
     376●TA_DIRECT属性の導入
     377
     378CPU例外ハンドラの直接呼出しを指定するために,CPU例外ハンドラ属性に,
     379TA_DIRECT属性を導入する.
     380
     381●ターゲット依存部の修正箇所
     382
     383TA_DIRECTの値を,target_kernel.h(または,そこからインクルードされるファ
     384イル)で定義し,その値をコンフィギュレータが取り出せるように,
     385target_def.csv(または,それに代わるファイル)に次の行を追加する.
    472386
    473387TA_DIRECT,TA_DIRECT
    474388
    475 æ¬¡ã«ï¼Œtarget.tf(または,そこからインクルードされるファイル)で,
    476 TARGET_EXCATRに設定される値に,TA_DIRECTを追加する.例えば,他のターゲッ
    477 ãƒˆä¾å­˜ã®CPU例外ハンドラ属性がない場合には,次のように設定する.
     389次に,target.tf(または,そこからインクルードされるファイル)で,
     390TARGET_EXCATRに設定される値に,TA_DIRECTを追加する.例えば,他のターゲッ
     391ト依存のCPU例外ハンドラ属性がない場合には,次のように設定する.
    478392
    479393$TARGET_EXCATR = TA_DIRECT$
    480394
    481 æ¬¡ã«ï¼ŒOMIT_INITILIZE_EXCEPTIONを用いて,CPU例外ハンドラの出å
    482 ¥å£å‡¦ç†ã‚’生
    483 æˆã™ã‚‹ãŸã‚ã®è¨˜è¿°ã¨CPU例外ハンドラ初期化ブロックの標準の定義が生成される
    484 ã®ã‚’抑止し,それによって抑止される部分をtarget.tfにコピーした上で,以下
    485 ã®ä¿®æ­£ã‚’加える.
    486 
    487 CPU例外ハンドラの出å
    488 ¥å£å‡¦ç†ã‚’生成するための記述(EXCHDR_ENTRYのリスト)
    489 ã‚’生成する部分は,次のように修正する.
     395次に,OMIT_INITILIZE_EXCEPTIONを用いて,CPU例外ハンドラの出入口処理を生
     396成するための記述とCPU例外ハンドラ初期化ブロックの標準の定義が生成される
     397のを抑止し,それによって抑止される部分をtarget.tfにコピーした上で,以下
     398の修正を加える.
     399
     400CPU例外ハンドラの出入口処理を生成するための記述(EXCHDR_ENTRYのリスト)
     401を生成する部分は,次のように修正する.
    490402
    491403$FOREACH excno EXC.ORDER_LIST$
     
    495407$END$
    496408
    497 ã¾ãŸï¼ŒCPU例外ハンドラ初期化ブロックの定義を生成する部分は,次のように修
    498 æ­£ã™ã‚‹ï¼Ž
     409また,CPU例外ハンドラ初期化ブロックの定義を生成する部分は,次のように修
     410正する.
    499411
    500412$IF LENGTH(EXC.ORDER_LIST)$
     
    512424$END$
    513425
    514 ä»¥ä¸Š
     426以上
  • rubycfg_asp/trunk/asp_dcre/doc/porting.txt

    • Property svn:mime-type changed from text/plain to text/plane; charset=UTF-8
    r313 r315  
    11
    2                 TOPPERS/ASPカーネル
    3                 ターゲット依存部 ポーティングガイド
    4 
    5                 対応バージョン: Release 1.9.3
    6                 最終更新: 2014å¹´11月17日
    7 
    8 ã“のドキュメントは,TOPPERS/ASPカーネルを,未サポートのターゲットシステ
    9 ãƒ ã«ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã™ã‚‹ãŸã‚ã«å¿
    10 è¦ã¨ãªã‚‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®å®Ÿè£
    11 æ–¹æ³•ã‚’説明す
    12 ã‚‹ã‚‚のである.
     2                TOPPERS/ASPカーネル
     3                ターゲット依存部 ポーティングガイド
     4
     5                対応バージョン: Release 1.9.3
     6                最終更新: 2014年11月17日
     7
     8このドキュメントは,TOPPERS/ASPカーネルを,未サポートのターゲットシステ
     9ムにポーティングするために必要となるターゲット依存部の実装方法を説明す
     10るものである.
    1311
    1412----------------------------------------------------------------------
     
    2018             Graduate School of Information Science, Nagoya Univ., JAPAN
    2119 
    22  ä¸Šè¨˜è‘—作権è€
    23 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    24  ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    25  å¤‰ãƒ»å†é
    26 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    27  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    28      æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    29      ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    30  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    31      ç”¨ã§ãã‚‹å½¢ã§å†é
    32 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    33 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    34      è€
    35 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    36      ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    37  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    38      ç”¨ã§ããªã„形で再é
    39 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    40      ã¨ï¼Ž
    41    (a) 再é
    42 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    43 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    44        ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    45    (b) 再é
    46 å¸ƒã®å½¢æ
    47 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    48        å ±å‘Šã™ã‚‹ã“と.
    49  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    50      å®³ã‹ã‚‰ã‚‚,上記著作権è€
    51 ãŠã‚ˆã³TOPPERSプロジェクトをå
    52 è²¬ã™ã‚‹ã“と.
    53      ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    54      ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    55 ãŠã‚ˆã³TOPPERSプロジェクトを
    56      å
    57 è²¬ã™ã‚‹ã“と.
     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     免責すること.
    5842 
    59  æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    60 ãŠ
    61  ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    62  ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    63  ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    64  ã®è²¬ä»»ã‚’負わない.
     43 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     44 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     45 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     46 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     47 の責任を負わない.
    6548 
    6649 $Id$
    6750----------------------------------------------------------------------
    6851
    69 â—‹ç›®æ¬¡
    70 
    71 ï¼‘.å
    72 ±é€šäº‹é 
    73 
    74         1.1 ターゲット依存部の構成
    75         1.2 名前の衝突の防止
    76         1.3 多重インクルードの防止
    77         1.4 アセンブリ言語とのヘッダファイルのå
    78 ±ç”¨
    79         1.5 インクルード記述の方法
    80         1.6 クリティカルセクションの出å
    81 ¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„
    82 ï¼’.システム構築環境のターゲット依存部
    83         2.1 ターゲット略称とターゲット依存部のディレクトリ
    84         2.2 Makefileのターゲット依存部
    85         2.3 開発環境名とコマンド名の設定
    86         2.4 コンパイルオプションとオブジェクトファイルの設定
    87         2.5 オフセットファイルの生成方法
    88                 2.5.1 コンフィギュレータを用いる方法
    89                 2.5.2 makeoffset.cとgenoffsetを用いる方法
    90         2.6 リンク方法の設定
    91         2.7 依存関係の定義
    92         2.8 その他の設定
    93 ï¼“.TOPPERSå
    94 ±é€šå®šç¾©ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
    95         3.1 ターゲット識別マクロ
    96         3.2 整数型の最大値・最小値・ビット数
    97         3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
    98         3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
    99         3.5 コンパイラの拡張機能のためのマクロ定義
    100         3.6 標準的な定義の上書き
    101         3.7 アサーションのための定義
    102 ï¼”.システムインタフェースレイヤ(SIL)のターゲット依存部
    103         4.1 å
    104 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    105 ‹ã®ç®¡ç†
    106         4.2 微少時間å¾
    107 ã¡
    108         4.3 プロセッサのエンディアン
    109         4.4 メモリ空間アクセス関数
    110         4.5 I/O空間アクセス関数
    111 ï¼•ï¼Žã‚«ãƒ¼ãƒãƒ«APIのターゲット依存部
    112         5.1 ターゲット定義でサポートする機能
    113         5.2 割込み優å
    114 ˆåº¦ã®ç¯„囲
    115         5.3 タイムティックの定義
    116         5.4 メモリ領域確保のための型定義
    117         5.5 ビットパターンのビット数
    118         5.6 メモリ領域確保のためのマクロ
    119         5.7 オーバランハンドラ機能拡張のための定義(オプション)
    120 ï¼–.カーネル実è£
    121 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
    122         6.1 カーネル実è£
    123 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®å
    124 ±é€šäº‹é 
    125 
    126                 6.1.1 カーネル実è£
    127 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®æ§‹æˆè¦ç´ 
    128                 6.1.2 ターゲット依存部の関数の命名規則
    129         6.2 トレースログ機能への対応
    130         6.3 システム状æ
    131 ‹ã®ç®¡ç†
    132                 6.3.1 å
    133 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    134 ‹ã®ç®¡ç†
    135                 6.3.2 コンテキストの管理
    136                 6.3.3 CPUロック状æ
    137 ‹ã®ç®¡ç†
    138         6.4 割込みに関連するシステム状æ
    139 ‹ã®ç®¡ç†
    140                 6.4.1 割込み優å
    141 ˆåº¦ãƒžã‚¹ã‚¯ã®ç®¡ç†
    142                 6.4.2 割込み要求禁止フラグの管理
    143                 6.4.3 割込み要求のクリア
    144                 6.4.4 割込み要求のプローブ
    145                 6.4.5 割込みハンドラのå
    146 ˆé ­å‡¦ç†ã¨æœ«å°¾å‡¦ç†
    147         6.5 タスクディスパッチャ
    148                 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
    149                 6.5.2 ディスパッチャ本体
    150                 6.5.3 タスクコンテキストからのディスパッチ
    151                 6.5.4 ディスパッチャの動作開始
    152                 6.5.5 現在のコンテキストを捨ててディスパッチ
    153                 6.5.6 タスクの起動処理
    154         6.6 割込みハンドラ
    155                 6.6.1 割込みハンドラの出å
    156 ¥å£å‡¦ç†
    157                 6.6.2 割込みハンドラ毎の出å
    158 ¥å£å‡¦ç†ã®ç”Ÿæˆ
    159                 6.6.3 割込みハンドラの設定
    160                 6.6.4 割込み要求ラインの属性の設定
    161                 6.6.5 割込み管理機能の初期化処理の変更
    162                 6.6.6 デフォルトの割込みハンドラ
    163                 6.6.7 カーネル管理外の割込み
    164                 6.6.8 割込みサービスルーチンの生成
    165         6.7 CPU例外ハンドラとCPU例外発生時のシステム状æ
    166 ‹ã®å‚ç
    167 §
    168                 6.7.1 CPU例外ハンドラの出å
    169 ¥å£å‡¦ç†
    170                 6.7.2 CPU例外ハンドラの出å
    171 ¥å£å‡¦ç†ã®ç”Ÿæˆ
    172                 6.7.3 CPU例外ハンドラの設定
    173                 6.7.4 CPU例外管理機能の初期化処理の変更
    174                 6.7.5 デフォルトのCPU例外ハンドラ
    175                 6.7.6 CPU例外発生時のシステム状æ
    176 ‹ã®å‚ç
    177 §
    178         6.8 カーネルの起動・終了とスタック領域など
    179         6.9 カーネルå†
    180 éƒ¨ã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°
    181                 6.9.1 ビットマップサーチ
    182                 6.9.2 ビットフィールド
    183         6.10 カーネル実è£
    184 ã«é–¢ã™ã‚‹ãã®ä»–の定義
    185                 6.10.1 オブジェクト属性の拡張
    186                 6.10.2 エラーチェック方法の指定
    187                 6.10.3 非タスクコンテキスト用のスタック領域
    188                 6.10.4 空ラベルの定義
    189         6.11 トレースログ機能に関する設定
    190                 6.11.1 取得できるトレースログの種類とマクロ
    191                 6.11.2 トレースログ記録のサンプルコード
    192         6.12 カーネル実è£
    193 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãŸã‚ã®ãƒªãƒãƒ¼ãƒ è¨˜è¿°
    194         6.13 タイマドライバ
    195                 6.13.1 タイマドライバのファイル構成
    196                 6.13.2 タイマの初期化・終了処理・割込み処理
    197                 6.13.3 性能評価用システム時刻の参ç
    198 §ã®ãŸã‚ã®æ©Ÿèƒ½
    199         6.14 オーバランタイマドライバ(オプション)
    200                 6.14.1 オーバランタイマドライバのファイル構成
    201                 6.14.2 オーバランタイマの操作と割込み処理
    202         6.15 動的メモリ管理(オプション)
    203                 6.15.1 TLSFを用いたメモリ管理モジュールの例
    204 ï¼—.コンフィギュレータ設定ファイルのターゲット依存部
    205         7.1 設定ファイルとターゲット依存部の位置付け
    206         7.2 パス2のテンプレートファイルのターゲット依存部
    207                 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
    208                 7.2.2 ターゲット非依存部で定義される変数
    209         7.3 パス3のテンプレートファイルのターゲット依存部
    210                 7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
    211                 7.3.2 ターゲット依存部で行うべきエラーチェック
    212         7.4 cfg1_out.cのリンクにå¿
    213 è¦ãªã‚¹ã‚¿ãƒ–の定義ファイル
    214 ï¼˜ï¼Žã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“ス等のターゲット依存部
    215         8.0 システムサービスのターゲット依存部
    216         8.1 システムログ機能のターゲット依存定義
    217         8.2 ログタスクのターゲット依存定義
    218         8.3 シリアルインタフェースドライバのターゲット依存部
    219                 8.3.1 変数,データ型,管理関数
    220                 8.3.2 デバイスサービスルーチン
    221                 8.3.3 コールバックルーチン
    222         8.4 カーネル起動メッセージの出力のターゲット依存定義
    223         8.5 サンプルプログラムとテストプログラムのターゲット依存定義
    224         8.6 実行時間分布集計モジュールのターゲット依存定義
    225 ï¼™ï¼Žãã®ä»–
    226         9.1 ドキュメント
    227         9.2 パッケージ記述ファイル
    228 ï¼‘0.リファレンス
    229         10.1 ターゲット依存部のファイル一覧
    230 
    231 
    232 ï¼‘.å
    233 ±é€šäº‹é 
    234 
    235 
    236 1.1 ターゲット依存部の構成
    237 
    238 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼Œtargetディレクトリの下に,ターゲットハードウェアと
    239 é–‹ç™ºç’°å¢ƒã®çµ„み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を
    240 è€ƒæ
    241 ®ã—,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依
    242 å­˜éƒ¨ï¼Œãƒãƒƒãƒ—依存部,開発環境依存部という形で切り分けてもよい.切り分け
    243 æ–¹ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®å®Ÿè£
    244 ã«ä»»ã•ã‚Œã¦ã„る.プロセッサ依存部,チップ依
    245 å­˜éƒ¨ï¼Œé–‹ç™ºç’°å¢ƒä¾å­˜éƒ¨ã¯ï¼Œarchディレクトリの下に置く.
    246 
    247 ASPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ
    248 ãƒˆä¾å­˜éƒ¨ï¼ŒTOPPERSå
    249 ±é€šå®šç¾©ï¼ˆt_stddef.h)のターゲット依存部,システムイン
    250 ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ¬ã‚¤ãƒ¤ï¼ˆSIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h)
    251 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    252 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ï¼ˆã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿
    253 è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‚’含む),システムサービスのターゲット依
    254 å­˜éƒ¨ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«é–¢ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆç­‰ã§æ§‹æˆã•ã‚Œã‚‹ï¼Ž
    255 
    256 1.2 名前の衝突の防止
    257 
    258 TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン
    259 ãƒœãƒ«ã‚’予約している.ヘッダファイル中に記述され,アプリケーションから参
    260 ç
    261 §ã§ãã‚‹å†
    262 éƒ¨ã‚·ãƒ³ãƒœãƒ«ã¯ï¼ŒTOPPERS_で始まる名前とする.
    263 
    264 ã¾ãŸï¼Œ_kernel_で始まるシンボルは,カーネルå†
    265 éƒ¨ã®å¤‰æ•°ã‚„関数のために予約
    266 ã—ている.カーネルå†
    267 éƒ¨ã®å¤‰æ•°ã‚„関数の名前で,リンク時にアプリケーション
    268 ã®åå‰ã¨è¡çªã™ã‚‹å¯èƒ½æ€§ãŒã‚るものは,リネーム記述にリストアップすること
    269 ã§ï¼Œã‚³ãƒ³ãƒ‘イル時に_kernel_で始まる名前に置き換えることとしている.
    270 
    271 1.3 多重インクルードの防止
    272 
    273 ã™ã¹ã¦ã®ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ã¯ï¼Œå¤šé‡ã«ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã•ã‚Œã‚‹ã®ã‚’防止するための条
    274 ä»¶ã‚³ãƒ³ãƒ‘イル記述をå
    275 ¥ã‚Œã‚‹ã“ととする.例えば,target_config.hであれば,ファ
    276 ã‚¤ãƒ«ã®å
    277 ˆé ­ã«
     52○目次
     53
     541.共通事項
     55        1.1 ターゲット依存部の構成
     56        1.2 名前の衝突の防止
     57        1.3 多重インクルードの防止
     58        1.4 アセンブリ言語とのヘッダファイルの共用
     59        1.5 インクルード記述の方法
     60        1.6 クリティカルセクションの出入処理の実現に関する制約
     612.システム構築環境のターゲット依存部
     62        2.1 ターゲット略称とターゲット依存部のディレクトリ
     63        2.2 Makefileのターゲット依存部
     64        2.3 開発環境名とコマンド名の設定
     65        2.4 コンパイルオプションとオブジェクトファイルの設定
     66        2.5 オフセットファイルの生成方法
     67                2.5.1 コンフィギュレータを用いる方法
     68                2.5.2 makeoffset.cとgenoffsetを用いる方法
     69        2.6 リンク方法の設定
     70        2.7 依存関係の定義
     71        2.8 その他の設定
     723.TOPPERS共通定義のターゲット依存部
     73        3.1 ターゲット識別マクロ
     74        3.2 整数型の最大値・最小値・ビット数
     75        3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
     76        3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
     77        3.5 コンパイラの拡張機能のためのマクロ定義
     78        3.6 標準的な定義の上書き
     79        3.7 アサーションのための定義
     804.システムインタフェースレイヤ(SIL)のターゲット依存部
     81        4.1 全割込みロック状態の管理
     82        4.2 微少時間待ち
     83        4.3 プロセッサのエンディアン
     84        4.4 メモリ空間アクセス関数
     85        4.5 I/O空間アクセス関数
     865.カーネルAPIのターゲット依存部
     87        5.1 ターゲット定義でサポートする機能
     88        5.2 割込み優先度の範囲
     89        5.3 タイムティックの定義
     90        5.4 メモリ領域確保のための型定義
     91        5.5 ビットパターンのビット数
     92        5.6 メモリ領域確保のためのマクロ
     93        5.7 オーバランハンドラ機能拡張のための定義(オプション)
     946.カーネル実装のターゲット依存部
     95        6.1 カーネル実装のターゲット依存部の共通事項
     96                6.1.1 カーネル実装のターゲット依存部の構成要素
     97                6.1.2 ターゲット依存部の関数の命名規則
     98        6.2 トレースログ機能への対応
     99        6.3 システム状態の管理
     100                6.3.1 全割込みロック状態の管理
     101                6.3.2 コンテキストの管理
     102                6.3.3 CPUロック状態の管理
     103        6.4 割込みに関連するシステム状態の管理
     104                6.4.1 割込み優先度マスクの管理
     105                6.4.2 割込み要求禁止フラグの管理
     106                6.4.3 割込み要求のクリア
     107                6.4.4 割込み要求のプローブ
     108                6.4.5 割込みハンドラの先頭処理と末尾処理
     109        6.5 タスクディスパッチャ
     110                6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
     111                6.5.2 ディスパッチャ本体
     112                6.5.3 タスクコンテキストからのディスパッチ
     113                6.5.4 ディスパッチャの動作開始
     114                6.5.5 現在のコンテキストを捨ててディスパッチ
     115                6.5.6 タスクの起動処理
     116        6.6 割込みハンドラ
     117                6.6.1 割込みハンドラの出入口処理
     118                6.6.2 割込みハンドラ毎の出入口処理の生成
     119                6.6.3 割込みハンドラの設定
     120                6.6.4 割込み要求ラインの属性の設定
     121                6.6.5 割込み管理機能の初期化処理の変更
     122                6.6.6 デフォルトの割込みハンドラ
     123                6.6.7 カーネル管理外の割込み
     124                6.6.8 割込みサービスルーチンの生成
     125        6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
     126                6.7.1 CPU例外ハンドラの出入口処理
     127                6.7.2 CPU例外ハンドラの出入口処理の生成
     128                6.7.3 CPU例外ハンドラの設定
     129                6.7.4 CPU例外管理機能の初期化処理の変更
     130                6.7.5 デフォルトのCPU例外ハンドラ
     131                6.7.6 CPU例外発生時のシステム状態の参照
     132        6.8 カーネルの起動・終了とスタック領域など
     133        6.9 カーネル内部のチューニング
     134                6.9.1 ビットマップサーチ
     135                6.9.2 ビットフィールド
     136        6.10 カーネル実装に関するその他の定義
     137                6.10.1 オブジェクト属性の拡張
     138                6.10.2 エラーチェック方法の指定
     139                6.10.3 非タスクコンテキスト用のスタック領域
     140                6.10.4 空ラベルの定義
     141        6.11 トレースログ機能に関する設定
     142                6.11.1 取得できるトレースログの種類とマクロ
     143                6.11.2 トレースログ記録のサンプルコード
     144        6.12 カーネル実装のターゲット依存部のためのリネーム記述
     145        6.13 タイマドライバ
     146                6.13.1 タイマドライバのファイル構成
     147                6.13.2 タイマの初期化・終了処理・割込み処理
     148                6.13.3 性能評価用システム時刻の参照のための機能
     149        6.14 オーバランタイマドライバ(オプション)
     150                6.14.1 オーバランタイマドライバのファイル構成
     151                6.14.2 オーバランタイマの操作と割込み処理
     152        6.15 動的メモリ管理(オプション)
     153                6.15.1 TLSFを用いたメモリ管理モジュールの例
     1547.コンフィギュレータ設定ファイルのターゲット依存部
     155        7.1 設定ファイルとターゲット依存部の位置付け
     156        7.2 パス2のテンプレートファイルのターゲット依存部
     157                7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
     158                7.2.2 ターゲット非依存部で定義される変数
     159        7.3 パス3のテンプレートファイルのターゲット依存部
     160                7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
     161                7.3.2 ターゲット依存部で行うべきエラーチェック
     162        7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
     1638.システムサービス等のターゲット依存部
     164        8.0 システムサービスのターゲット依存部
     165        8.1 システムログ機能のターゲット依存定義
     166        8.2 ログタスクのターゲット依存定義
     167        8.3 シリアルインタフェースドライバのターゲット依存部
     168                8.3.1 変数,データ型,管理関数
     169                8.3.2 デバイスサービスルーチン
     170                8.3.3 コールバックルーチン
     171        8.4 カーネル起動メッセージの出力のターゲット依存定義
     172        8.5 サンプルプログラムとテストプログラムのターゲット依存定義
     173        8.6 実行時間分布集計モジュールのターゲット依存定義
     1749.その他
     175        9.1 ドキュメント
     176        9.2 パッケージ記述ファイル
     17710.リファレンス
     178        10.1 ターゲット依存部のファイル一覧
     179
     180
     1811.共通事項
     182
     1831.1 ターゲット依存部の構成
     184
     185ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと
     186開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を
     187考慮し,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依
     188存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け
     189方は,ターゲット依存部の実装に任されている.プロセッサ依存部,チップ依
     190存部,開発環境依存部は,archディレクトリの下に置く.
     191
     192ASPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ
     193ト依存部,TOPPERS共通定義(t_stddef.h)のターゲット依存部,システムイン
     194タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h)
     195のターゲット依存部,カーネル実装のターゲット依存部(コンフィギュレータ
     196設定ファイルのターゲット依存部を含む),システムサービスのターゲット依
     197存部,ターゲット依存部に関するドキュメント等で構成される.
     198
     1991.2 名前の衝突の防止
     200
     201TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン
     202ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参
     203照できる内部シンボルは,TOPPERS_で始まる名前とする.
     204
     205また,_kernel_で始まるシンボルは,カーネル内部の変数や関数のために予約
     206している.カーネル内部の変数や関数の名前で,リンク時にアプリケーション
     207の名前と衝突する可能性があるものは,リネーム記述にリストアップすること
     208で,コンパイル時に_kernel_で始まる名前に置き換えることとしている.
     209
     2101.3 多重インクルードの防止
     211
     212すべてのヘッダファイルは,多重にインクルードされるのを防止するための条
     213件コンパイル記述を入れることとする.例えば,target_config.hであれば,ファ
     214イルの先頭に
    278215
    279216#ifndef TOPPERS_TARGET_CONFIG_H
    280217#define TOPPERS_TARGET_CONFIG_H
    281218
    282 ã‚’,ファイルの末尾に
     219を,ファイルの末尾に
    283220
    284221#endif /* TOPPERS_TARGET_CONFIG_H */
    285222
    286 ã‚’記述する.
    287 
    288 1.4 アセンブリ言語とのヘッダファイルのå
    289 ±ç”¨
    290 
    291 ASPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから
    292 ã‚‚インクルードできるようにするために,次のルールに従って記述するものと
    293 ã™ã‚‹ï¼Ž
    294 
    295 ãƒ»TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では
    296 ã€€è§£é‡ˆã§ããªã„記述(マクロ定義以外の記述)を除くように記述する.
    297 
    298 ãƒ»ç¬¦å·ç„¡ã—整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ
    299 ã€€ã‚¯ãƒ­ã‚’用いて記述する.ただし,アセンブリ言語のソースファイルからもイ
    300 ã€€ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã§ãã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã§ã‚っても,C言語のみで用いる定数をこれらの
    301 ã€€ãƒžã‚¯ãƒ­ã‚’使って記述するå¿
    302 è¦ã¯ãªã„.
    303 
    304 ã¾ãŸï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    305 ã«ãŠã„ては,次のルールに従うものとする.
    306 
    307 ãƒ»ã‚¢ã‚»ãƒ³ãƒ–リ言語からも用いる定数の定義中に型キャストを用いる場合には,
    308 ã€€CASTマクロを用いて記述する.
    309 
    310 ã‚¢ã‚»ãƒ³ãƒ–リ言語からヘッダファイルをインクルードする際には,å¿
    311 è¦ã«å¿œã˜ã¦ï¼Œ
    312 TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー
    313 ãƒ‰ã—なければならない.
    314 
    315 1.5 インクルード記述の方法
    316 
    317 é–‹ç™ºç’°å¢ƒã§ç”¨æ„ã•ã‚Œã¦ã„る標準ヘッダファイルおよびincludeディレクトリ下の
    318 æ¨™æº–ヘッダファイルは,「#include <...>」によりインクルードする.
    319 
    320 ãã®ä»–のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
    321 ãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ãŒï¼Œã‚«ãƒ¬ãƒ³ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚„インクルードするファイルと同じディ
    322 ãƒ¬ã‚¯ãƒˆãƒªä»¥å¤–のディレクトリに置かれている場合には,次のようにパス指定を
    323 è¡Œã†ï¼Ž
    324 
    325 ãƒ»ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ï¼ˆtarget/<ターゲット名>)のディレクトリに置かれている
    326 ã€€å ´åˆã¯ï¼Œãƒ‘ス指定を行わず,ファイル名のみを記述する.
    327                 例)#include "target_config.h"
    328 
    329 ãƒ»archディレクトリ下のディレクトリに置かれている場合には,archディレク
    330 ã€€ãƒˆãƒªã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スで記述する.
    331                 例)#include "m68k_gcc/prc_config.h"
    332 
    333 ãƒ»ãã®ä»–の場合には,ソースプログラムのルートディレクトリ(configureが置
    334 ã€€ã‹ã‚Œã¦ã„るディレクトリ)からの相対パスで記述する.
    335                 例)#include "pdic/upd72001/upd72001.h"
    336 
    337 ãƒ»ã‚«ãƒ¼ãƒãƒ«ã‚’構成するファイルから,kernelディレクトリ下のヘッダファイル
    338 ã€€ã‚’インクルードする場合は,パス指定を行わず,ファイル名のみを記述する.
    339                 例)#include "kernel_impl.h"
    340 
    341 1.6 クリティカルセクションの出å
    342 ¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„
    343 
    344 ã‚«ãƒ¼ãƒãƒ«å†
    345 ã§ç”¨ã„るクリティカルセクションの出å
    346 ¥å‡¦ç†ã‚’実現する場合には,
    347 æ¬¡ã®2つの条件を満たすように実è£
    348 ã—なければならない.
    349 
    350 (1-6-1) 出å
    351 ¥å‡¦ç†ã‹ã‚‰æŠœã‘た時点では,割込みの禁止/許可が完了していなけ
    352 ã‚Œã°ãªã‚‰ãªã„.例えば,割込み禁止/許可命令を実行してから実際に割込みが
    353 ç¦æ­¢ï¼è¨±å¯ã•ã‚Œã‚‹ã¾ã§ä½•å‘½ä»¤ã‹é
    354 å»¶ã™ã‚‹ãƒ—ロセッサの場合には,出å
    355 ¥å‡¦ç†ã®ä¸­
    356 ã«NOP命令をå
    357 ¥ã‚Œã‚‹ãªã©ã®æ–¹æ³•ã§ï¼Œå‡ºå
    358 ¥å‡¦ç†ã‚’抜けた時点では,割込みが禁止/
    359 è¨±å¯ã•ã‚ŒãŸçŠ¶æ
    360 ‹ã«ãªã£ã¦ã„ることを保証しなければならない.
    361 
    362 (1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方
    363 æ³•ã§ã‚³ãƒ³ãƒ‘イラに知らせなければならない.GNU開発環境では,次のいずれかの
    364 æ–¹æ³•ã§ã“の制約を満たすことができる.
    365 
    366 (a) クリティカルセクションの出å
    367 ¥å‡¦ç†ã®å
    368 ¨ä½“または出å
    369 ¥å‡¦ç†ã®æœ¬è³ªçš„な部分
    370         (å
    371 ·ä½“的には,割込み禁止/許可する処理)を(インラインでない)通常
    372         の関数により実現する.
    373 
    374 (b) クリティカルセクションの出å
    375 ¥å‡¦ç†ã®æœ¬è³ªçš„な部分をインラインアセンブ
    376         ラによって実現している場合には,そのインラインアセンブラのclobber変
    377         数リストに"memory"を追加する.
    378 
    379 (c) クリティカルセクションの出å
    380 ¥å‡¦ç†ã®æœ¬è³ªçš„な部分が,マクロやインライ
    381         ン関数呼出しで実現している場合には,クリティカルセクションにå
    382 ¥ã‚‹å‡¦
    383         理の最後と出る処理のå
    384 ˆé ­ã«ï¼ŒAsm("":::"memory")という記述をå
    385 ¥ã‚Œã‚‹ï¼Ž
    386 
    387 ã“のような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」
    388 ã®ã€Œã‚«ãƒ¼ãƒãƒ«ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«å¯¾ã™ã‚‹volatile宣言について」の節を参ç
    389 §ã™ã‚‹ã“
    390 ã¨ï¼Ž
    391 
    392 
    393 ï¼’.システム構築環境のターゲット依存部
    394 
    395 ã“の章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること
    396 ã‚’想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に
    397 ã‚わせて修正するå¿
    398 è¦ãŒã‚る.
    399 
    400 2.1 ターゲット略称とターゲット依存部のディレクトリ
    401 
    402 æ–°ã—いターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター
    403 ã‚²ãƒƒãƒˆç•¥ç§°ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ç•¥ç§°ã¨é–‹ç™ºç’°å¢ƒç•¥ç§°ã‚’"_"で連結したものとする.シス
    404 ãƒ†ãƒ ç•¥ç§°ã«ç”¨ã„る文字は英小文字と数字と"_"に,開発環境略称に用いる文字は
    405 è‹±å°æ–‡å­—と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例
    406 ãˆã°ï¼Œã‚·ã‚¹ãƒ†ãƒ ç•¥ç§°ãŒ"dve68k"で,GNU開発環境を用いる場合には,ターゲット
    407 ç•¥ç§°ã¯"dve68k_gcc"となる.
    408 
    409 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’置くために,targetディレクトリの下に,ター
    410 ã‚²ãƒƒãƒˆç•¥ç§°ã‚’名称とするディレクトリを作成する.これをターゲット依存部ディ
    411 ãƒ¬ã‚¯ãƒˆãƒªã¨å‘¼ã¶ï¼Ž
    412 
    413 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‹ã‚‰ãƒ—ロセッサ依存部やチップ依存部を切り分ける場合には,
    414 ä¾å­˜éƒ¨ç•¥ç§°ã‚’定める.依存部略称は,プロセッサやチップの略称と開発環境略
    415 ç§°ã‚’"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英
    416 å°æ–‡å­—と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発
    417 ç’°å¢ƒã‚’用いる場合には,依存部略称は"m68k_gcc"となる.
    418 
    419 ã¾ãŸï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‹ã‚‰é–‹ç™ºç’°å¢ƒä¾å­˜éƒ¨ã‚’切り分ける場合には,開発環境
    420 ç•¥ç§°ã‚’依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc"
    421 ã¨ãªã‚‹ï¼Ž
    422 
    423 ã“れらの依存部のファイルを置くために,archディレクトリの下に,依存部略
    424 ç§°ã‚’名称とするディレクトリを作成する.
    425 
    426 ãªãŠï¼ŒGNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション
    427 ã‚¹ã‚¯ãƒªãƒ—ト(configure),サンプルのMakefile(sample/Makefile),一部の
    428 ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ãƒ—ログラム(utils/makedep)を,その開発環境用に用意するå¿
    429 
    430 è¦ãŒã‚る場合がある.その場合には,これらのファイルを,ターゲット依存部
    431 ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹é–‹ç™ºç’°å¢ƒä¾å­˜éƒ¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç½®ãã‚‚のとする.また,開発環
    432 å¢ƒç”¨ã®ãƒ—ロジェクトファイルがå¿
    433 è¦ãªå ´åˆã«ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆ
    434 ãƒªã«ç½®ãã‚‚のとする.
    435 
    436 2.2 Makefileのターゲット依存部
    437 
    438 Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた
    439 Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ
    440 ãƒ—・開発環境依存部で用意されるファイルなど)に含める.
    441 
    442 2.3 開発環境名とコマンド名の設定
    443 
    444 é–‹ç™ºç’°å¢ƒåã¨ã‚³ãƒžãƒ³ãƒ‰åã‚’設定するために,Makefileのターゲット依存部で次
    445 ã®å¤‰æ•°ã‚’定義する.
    446 
    447 (2-3-1) TOOL                                    開発環境名
    448 
    449 é–‹ç™ºç’°å¢ƒåã«å®šç¾©ã™ã‚‹ï¼ŽGNU開発環境を用いる場合には,gccに定義する.
    450 
    451 (2-3-2) GCC_TARGET                              GNU開発環境のターゲット名
    452 
    453 GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター
    454 ã‚²ãƒƒãƒˆåã«å®šç¾©ã™ã‚‹ï¼Žã“こで指定したターゲット名は,開発環境のコマンド名
    455 ã®å
    456 ˆé ­ã«ä»˜ä¸Žã•ã‚Œã‚‹æ–‡å­—列となる.例えば,GCC_TARGETをm68k-unknown-elfに
    457 å®šç¾©ã—た場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この
    458 å¤‰æ•°ãŒå®šç¾©ã•ã‚Œãªã„場合には,単なるgccが使われる.
    459 
    460 (2-3-3) CC                                              Cコンパイラドライバの名称
    461 (2-3-4) CXX                                             C++コンパイラドライバの名称
    462 (2-3-5) AS                                              アセンブラの名称
    463 (2-3-6) LD                                              リンカの名称
    464 (2-3-7) AR                                              アーカイバの名称
    465 (2-3-8) NM                                              nmプログラムの名称
    466 (2-3-9) RANLIB                                  ranlibプログラムの名称
    467 (2-3-10) OBJCOPY                                objcopyプログラムの名称
    468 (2-3-11) OBJDUMP                                objdumpプログラムの名称
    469 
    470 GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義
    471 ã™ã‚‹ï¼Žå¯¾å¿œã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãŒãªã„場合や,コマンドパラメータが異なる場合には,
    472 Makefile中でそのコマンドを呼び出している部分を変更するå¿
    473 è¦ãŒã‚る.
    474 
    475 GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義するå¿
    476 è¦
    477 ã¯ãªã„.
    478 
    479 2.4 コンパイルオプションとオブジェクトファイルの設定
    480 
    481 Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を
    482 ç”¨ã„て,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ
    483 ã®ä»–のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS :=
    484 $(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める.
    485 
    486 (2-4-1) COPTS                           ã‚³ãƒ³ãƒ‘イラに対するその他のオプション
    487 (2-4-2) CDEFS                           ãƒžã‚¯ãƒ­å®šç¾©ã‚ªãƒ—ション(-Dオプション)
    488 (2-4-3) INCLUDES                        ヘッダファイルの置かれたディレクトリ指定オ
    489                                                         プション(-Iオプション)
    490 (2-4-4) LDFLAGS                         ãƒªãƒ³ã‚«ã«å¯¾ã™ã‚‹ãã®ä»–のオプション
    491 (2-4-5) LIBS                            ライブラリリンク指定のためのオプション
    492 
    493 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—て,すべてのソースファイルにå
    494 ±é€šã™ã‚‹ã‚³ãƒ³ãƒ‘イルオプショ
    495 ãƒ³ã®è¿½åŠ ãŒå¿
    496 è¦ãªå ´åˆã«ã¯ï¼Œã‚ªãƒ—ションの種類毎に上に示した変数に定義する.
    497 
    498 ã»ã¨ã‚“どの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
    499 ä¸‹ã®è¨˜è¿°ã‚’含めるå¿
    500 è¦ãŒã‚る.
     223を記述する.
     224
     2251.4 アセンブリ言語とのヘッダファイルの共用
     226
     227ASPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから
     228もインクルードできるようにするために,次のルールに従って記述するものと
     229する.
     230
     231・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では
     232 解釈できない記述(マクロ定義以外の記述)を除くように記述する.
     233
     234・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ
     235 クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ
     236 ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの
     237 マクロを使って記述する必要はない.
     238
     239また,カーネル実装においては,次のルールに従うものとする.
     240
     241・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には,
     242 CASTマクロを用いて記述する.
     243
     244アセンブリ言語からヘッダファイルをインクルードする際には,必要に応じて,
     245TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー
     246ドしなければならない.
     247
     2481.5 インクルード記述の方法
     249
     250開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の
     251標準ヘッダファイルは,「#include <...>」によりインクルードする.
     252
     253その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
     254ダファイルが,カレントディレクトリやインクルードするファイルと同じディ
     255レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を
     256行う.
     257
     258・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている
     259 場合は,パス指定を行わず,ファイル名のみを記述する.
     260                例)#include "target_config.h"
     261
     262・archディレクトリ下のディレクトリに置かれている場合には,archディレク
     263 トリからの相対パスで記述する.
     264                例)#include "m68k_gcc/prc_config.h"
     265
     266・その他の場合には,ソースプログラムのルートディレクトリ(configureが置
     267 かれているディレクトリ)からの相対パスで記述する.
     268                例)#include "pdic/upd72001/upd72001.h"
     269
     270・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル
     271 をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する.
     272                例)#include "kernel_impl.h"
     273
     2741.6 クリティカルセクションの出入処理の実現に関する制約
     275
     276カーネル内で用いるクリティカルセクションの出入処理を実現する場合には,
     277次の2つの条件を満たすように実装しなければならない.
     278
     279(1-6-1) 出入処理から抜けた時点では,割込みの禁止/許可が完了していなけ
     280ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが
     281禁止/許可されるまで何命令か遅延するプロセッサの場合には,出入処理の中
     282にNOP命令を入れるなどの方法で,出入処理を抜けた時点では,割込みが禁止/
     283許可された状態になっていることを保証しなければならない.
     284
     285(1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方
     286法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの
     287方法でこの制約を満たすことができる.
     288
     289(a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分
     290        (具体的には,割込み禁止/許可する処理)を(インラインでない)通常
     291        の関数により実現する.
     292
     293(b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ
     294        ラによって実現している場合には,そのインラインアセンブラのclobber変
     295        数リストに"memory"を追加する.
     296
     297(c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ
     298        ン関数呼出しで実現している場合には,クリティカルセクションに入る処
     299        理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる.
     300
     301このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」
     302の「カーネルのデータ構造に対するvolatile宣言について」の節を参照するこ
     303と.
     304
     305
     3062.システム構築環境のターゲット依存部
     307
     308この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること
     309を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に
     310あわせて修正する必要がある.
     311
     3122.1 ターゲット略称とターゲット依存部のディレクトリ
     313
     314新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター
     315ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス
     316テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は
     317英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例
     318えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット
     319略称は"dve68k_gcc"となる.
     320
     321ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター
     322ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ
     323レクトリと呼ぶ.
     324
     325ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には,
     326依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略
     327称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英
     328小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発
     329環境を用いる場合には,依存部略称は"m68k_gcc"となる.
     330
     331また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境
     332略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc"
     333となる.
     334
     335これらの依存部のファイルを置くために,archディレクトリの下に,依存部略
     336称を名称とするディレクトリを作成する.
     337
     338なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション
     339スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の
     340ユーティリティプログラム(utils/makedep)を,その開発環境用に用意する必
     341要がある場合がある.その場合には,これらのファイルを,ターゲット依存部
     342ディレクトリか開発環境依存部ディレクトリに置くものとする.また,開発環
     343境用のプロジェクトファイルが必要な場合には,ターゲット依存部ディレクト
     344リに置くものとする.
     345
     3462.2 Makefileのターゲット依存部
     347
     348Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた
     349Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ
     350プ・開発環境依存部で用意されるファイルなど)に含める.
     351
     3522.3 開発環境名とコマンド名の設定
     353
     354開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次
     355の変数を定義する.
     356
     357(2-3-1) TOOL                                    開発環境名
     358
     359開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する.
     360
     361(2-3-2) GCC_TARGET                              GNU開発環境のターゲット名
     362
     363GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター
     364ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名
     365の先頭に付与される文字列となる.例えば,GCC_TARGETをm68k-unknown-elfに
     366定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この
     367変数が定義されない場合には,単なるgccが使われる.
     368
     369(2-3-3) CC                                              Cコンパイラドライバの名称
     370(2-3-4) CXX                                             C++コンパイラドライバの名称
     371(2-3-5) AS                                              アセンブラの名称
     372(2-3-6) LD                                              リンカの名称
     373(2-3-7) AR                                              アーカイバの名称
     374(2-3-8) NM                                              nmプログラムの名称
     375(2-3-9) RANLIB                                  ranlibプログラムの名称
     376(2-3-10) OBJCOPY                                objcopyプログラムの名称
     377(2-3-11) OBJDUMP                                objdumpプログラムの名称
     378
     379GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義
     380する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には,
     381Makefile中でそのコマンドを呼び出している部分を変更する必要がある.
     382
     383GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必要
     384はない.
     385
     3862.4 コンパイルオプションとオブジェクトファイルの設定
     387
     388Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を
     389用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ
     390の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS :=
     391$(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める.
     392
     393(2-4-1) COPTS                           コンパイラに対するその他のオプション
     394(2-4-2) CDEFS                           マクロ定義オプション(-Dオプション)
     395(2-4-3) INCLUDES                        ヘッダファイルの置かれたディレクトリ指定オ
     396                                                        プション(-Iオプション)
     397(2-4-4) LDFLAGS                         リンカに対するその他のオプション
     398(2-4-5) LIBS                            ライブラリリンク指定のためのオプション
     399
     400ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ
     401ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する.
     402
     403ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     404下の記述を含める必要がある.
    501405
    502406----------------------------------------
     
    504408----------------------------------------
    505409
    506 ã“こでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また
    507 SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ
    508 ï¼ˆconfigureが置かれているディレクトリ)に定義されている.
    509 
    510 ã‚³ãƒ³ãƒ‘イラの問題等で,警告メッセージが出ることを防げない状況以外では,
    511 COPTSに-Werrorを追加することを推奨する.
     410ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また
     411SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ
     412(configureが置かれているディレクトリ)に定義されている.
     413
     414コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では,
     415COPTSに-Werrorを追加することを推奨する.
    512416
    513417----------------------------------------
     
    515419----------------------------------------
    516420
    517 ã‚«ãƒ¼ãƒãƒ«ã®ã‚³ãƒ³ãƒ‘イル時に,dereferencing type-punned pointer will break
    518 strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ
    519 ã®è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«é–¢ã™ã‚‹è©³ç´°ã¯ï¼Œã€ŒTOPPERS/ASPカーネル 設計メモ」の「型
    520 ã‚­ãƒ£ã‚¹ãƒˆã«ä¼´ã†è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€ã®ç¯€ã‚’参ç
    521 §ã™ã‚‹ã“と.
     421カーネルのコンパイル時に,dereferencing type-punned pointer will break
     422strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ
     423の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型
     424キャストに伴う警告メッセージ」の節を参照すること.
    522425
    523426----------------------------------------
     
    525428----------------------------------------
    526429
    527 ã¾ãŸï¼Œã‚¢ã‚»ãƒ³ãƒ–リ言語レベルの識別名が,C言語レベルの識別名のå
    528 ˆé ­ã«"_"が
    529 ä»˜ã„たものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する.
    530 
    531 (2-4-6) SYSSVC_DIR                      システムサービスのソースが置かれたディレクトリ
    532 (2-4-7) SYSSVC_ASMOBJS          アセンブリ言語で記述されたシステムサービスの
    533                                                         オブジェクト
    534 (2-4-8) SYSSVC_COBJS            C言語で記述されたシステムサービスのオブジェクト
    535 (2-4-9) SYSSVC_CFLAGS           ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スに対するコンパイルオプション
    536 (2-4-10) SYSSVC_LIBS            システムサービスに対するライブラリリンク指定
    537 
    538 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—て,システムサービス(システムログタスクやデバイスド
    539 ãƒ©ã‚¤ãƒãªã©ï¼‰ã®ã‚½ãƒ¼ã‚¹ãŒç½®ã‹ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スを構成する
    540 ã‚ªãƒ–ジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ
    541 ã‚¤ãƒ«ã‚ªãƒ—ション,その構成にå¿
    542 è¦ãªãƒ©ã‚¤ãƒ–ラリリンク指定を追加する場合には,
    543 ä¸Šã«ç¤ºã—た変数に定義する.
    544 
    545 (2-4-11) KERNEL_DIR                     ã‚«ãƒ¼ãƒãƒ«ã®ã‚½ãƒ¼ã‚¹ãŒç½®ã‹ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª
    546 (2-4-12) KERNEL_ASMOBJS         ã‚¢ã‚»ãƒ³ãƒ–リ言語で記述されたカーネルのオブジェクト
    547 (2-4-13) KERNEL_COBJS           C言語で記述されたカーネルのオブジェクト
    548 (2-4-14) KERNEL_CFLAGS          カーネルに対するコンパイルオプション
    549 
    550 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—て,カーネルのソースが置かれたディレクトリ,カーネル
    551 ã‚’構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用
    552 ã™ã‚‹ã‚³ãƒ³ãƒ‘イルオプションを追加する場合には,上に示した変数に定義する.
    553 
    554 ã»ã¨ã‚“どの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
    555 ä¸‹ã®è¨˜è¿°ã‚’含めるå¿
    556 è¦ãŒã‚る.
     430また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に"_"が
     431付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する.
     432
     433(2-4-6) SYSSVC_DIR                      システムサービスのソースが置かれたディレクトリ
     434(2-4-7) SYSSVC_ASMOBJS          アセンブリ言語で記述されたシステムサービスの
     435                                                        オブジェクト
     436(2-4-8) SYSSVC_COBJS            C言語で記述されたシステムサービスのオブジェクト
     437(2-4-9) SYSSVC_CFLAGS           システムサービスに対するコンパイルオプション
     438(2-4-10) SYSSVC_LIBS            システムサービスに対するライブラリリンク指定
     439
     440ターゲットに依存して,システムサービス(システムログタスクやデバイスド
     441ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する
     442オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ
     443イルオプション,その構成に必要なライブラリリンク指定を追加する場合には,
     444上に示した変数に定義する.
     445
     446(2-4-11) KERNEL_DIR                     カーネルのソースが置かれたディレクトリ
     447(2-4-12) KERNEL_ASMOBJS         アセンブリ言語で記述されたカーネルのオブジェクト
     448(2-4-13) KERNEL_COBJS           C言語で記述されたカーネルのオブジェクト
     449(2-4-14) KERNEL_CFLAGS          カーネルに対するコンパイルオプション
     450
     451ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル
     452を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用
     453するコンパイルオプションを追加する場合には,上に示した変数に定義する.
     454
     455ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     456下の記述を含める必要がある.
    557457
    558458----------------------------------------
     
    562462----------------------------------------
    563463
    564 (2-4-15) CFG_TABS                       ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹ã‚ªãƒ—ション
    565 
    566 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—て,コンフィギュレータに対するオプションを追加する場
    567 åˆã«ã¯ï¼Œä¸Šã«ç¤ºã—た変数に定義する.å
    568 ·ä½“的には,コンフィギュレータの値取
    569 å¾—シンボルテーブルのターゲット依存部(target_def.csv)がある場合には,
    570 ãã‚Œã‚’指定するオプションを追加するå¿
    571 è¦ãŒã‚る.
    572 
    573 ã»ã¨ã‚“どの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
    574 ä¸‹ã®è¨˜è¿°ã‚’含めるå¿
    575 è¦ãŒã‚る.
     464(2-4-15) CFG_TABS                       コンフィギュレータに対するオプション
     465
     466ターゲットに依存して,コンフィギュレータに対するオプションを追加する場
     467合には,上に示した変数に定義する.具体的には,コンフィギュレータの値取
     468得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には,
     469それを指定するオプションを追加する必要がある.
     470
     471ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     472下の記述を含める必要がある.
    576473
    577474----------------------------------------
     
    579476----------------------------------------
    580477
    581 (2-4-16) CFG1_OUT_LDFLAGS       cfg1_out.cに対するリンクオプション
    582 
    583 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—て,cfg1_out.cをリンクする際に適用するオプションを追
    584 åŠ ã™ã‚‹å ´åˆã«ã¯ï¼Œä¸Šã«ç¤ºã—た変数に定義する.
    585 
    586 ãªãŠï¼ŒLDFLAGSは,cfg1_out.cをリンクする際には適用されないため,LDFLAGS
    587 ã«å®šç¾©ã—たオプションで,cfg1_out.cをリンクする際にもå¿
    588 è¦ãªã‚‚のは,
    589 CFG1_OUT_LDFLAGSにも定義するå¿
    590 è¦ãŒã‚る.
    591 
    592 (2-4-17) CFG_ASMOBJS            アセンブリ言語で記述されたシステムコンフィ
    593                                                         ギュレーションのためのオブジェクト
    594 (2-4-18) CFG_COBJS                      C言語で記述されたシステムコンフィギュレー
    595                                                         ションのためのオブジェクト
    596 
    597 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—て,システムコンフィギュレーションのためのオブジェク
    598 ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’(kernel_cfg.o以外に)追加する場合には,上に示した変数に定
    599 ç¾©ã™ã‚‹ï¼Žã“の場合,追加したオブジェクトファイルの作成ルール(コンパイル/
    600 ã‚¢ã‚»ãƒ³ãƒ–ルルールと依存関係作成ルール)を,Makefileのターゲット依存部に
    601 è¨˜è¿°ã™ã‚‹å¿
    602 è¦ãŒã‚る.
     478(2-4-16) CFG1_OUT_LDFLAGS       cfg1_out.cに対するリンクオプション
     479
     480ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追
     481加する場合には,上に示した変数に定義する.
     482
     483なお,LDFLAGSは,cfg1_out.cをリンクする際には適用されないため,LDFLAGS
     484に定義したオプションで,cfg1_out.cをリンクする際にも必要なものは,
     485CFG1_OUT_LDFLAGSにも定義する必要がある.
     486
     487(2-4-17) CFG_ASMOBJS            アセンブリ言語で記述されたシステムコンフィ
     488                                                        ギュレーションのためのオブジェクト
     489(2-4-18) CFG_COBJS                      C言語で記述されたシステムコンフィギュレー
     490                                                        ションのためのオブジェクト
     491
     492ターゲットに依存して,システムコンフィギュレーションのためのオブジェク
     493トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定
     494義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/
     495アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に
     496記述する必要がある.
    603497
    604498(2-4-19) CFG2_OUT_SRCS
    605499
    606 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—て,コンフィギュレータのパス2でkernel_cfg.cと
    607 kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する.
     500ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと
     501kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する.
    608502
    609503(2-4-20) OMIT_WARNING_ALL
    610504(2-4-21) OMIT_OPTIMIZATION
    611505
    612 ã‚µãƒ³ãƒ—ルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」
    613 ã‚’追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で
    614 OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には,
    615 Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する.
    616 
    617 2.5 オフセットファイルの生成方法
    618 
    619 ã‚¢ã‚»ãƒ³ãƒ–リ言語で記述されるプログラムから,C言語の構造体にアクセスする場
    620 åˆã«ã¯ï¼Œæ§‹é€ ä½“の各フィールドのオフセット値を参ç
    621 §ã™ã‚‹ã“とがå¿
    622 è¦ã§ã‚る.
    623 ASPカーネルでは,å¿
    624 è¦ãªã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤ã‚’求めてファイル(標準ではoffset.h)
    625 ã«ç”Ÿæˆã™ã‚‹ãŸã‚ã®ä»•çµ„みを用意している.
    626 
    627 ã“の仕組みを用いることで,例えば,TCB中のtexptnフィールドのオフセット値
    628 ã‚’TCB_texptnにマクロ定義することや,TCB中のタスクコンテキストブロック
    629 ï¼ˆtskctxb)に含まれるpcフィールドのオフセット値をTCB_pcにマクロ定義する
    630 ã“とができる.また,TCB中のenatexフィールドのオフセット値,ビット位置,
    631 ãƒ“ットマスクを,それぞれTCB_enatex,TCB_enatex_bit,TCB_enatex_maskにマ
    632 ã‚¯ãƒ­å®šç¾©ã™ã‚‹ã“とができる.
    633 
    634 offset.hを生成するための仕組みとして,現時点では,コンフィギュレータを
    635 ç”¨ã„る方法と,makeoffset.cとgenoffsetを用いる方法を用意している.後è€
    636 ã®
    637 æ–¹æ³•ã¯ï¼ŒGNU開発環境にしか対応していないことから,将来のバージョンでは,
    638 å¾Œè€
    639 ã®æ–¹æ³•ã®ã‚µãƒãƒ¼ãƒˆã‚’やめる計画である.新たにポーティングする場合には,
    640 å‰è€
    641 ã®æ–¹æ³•ã‚’用いることを推奨する.
    642 
    643 ã“れらの仕組みでオフセットファイルを生成できない時には,offset.hをター
    644 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ç”¨æ„ã—,Makefileのターゲット依存部でOMIT_MAKEOFFSETを
    645 "true"に定義する.
    646 
    647 æ‹¡å¼µãƒ‘ッケージの中には,TCBにフィールドを追加するものがあるため,TCB中
    648 ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤ã¯å¤‰åŒ–する.offset.hを生成する場合でも,ター
    649 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ç”¨æ„ã™ã‚‹å ´åˆã§ã‚‚,拡張パッケージに対応するためには,この
    650 ã“とを考æ
    651 ®ã™ã‚‹å¿
    652 è¦ãŒã‚る.
    653 
    654 2.5.1 コンフィギュレータを用いる方法
    655 
    656 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス1で生成するcfg1_out.cをコンパイルして生成したオ
    657 ãƒ–ジェクトファイルから,コンフィギュレータによってoffset.hを生成する方
    658 æ³•ã§ã‚る.この方法を用いるためには,ターゲット依存部でオフセットファイ
    659 ãƒ«ç”Ÿæˆç”¨ãƒ†ãƒ³ãƒ—レートファイルを用意し,target_cfg1_out.h(または,そこか
    660 ã‚‰ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ï¼‰ã¨target_def.csv(または,同等の役割を持
    661 ã¤ãƒ•ã‚¡ã‚¤ãƒ«ï¼‰ã«è¨˜è¿°ã‚’追加するå¿
    662 è¦ãŒã‚る.なお,これらのファイルを新たに
    663 ç”¨æ„ã—た際や修正した際には,offset.hに妥当な定義が生成されていることを
    664 ç¢ºèªã™ã¹ãã§ã‚る.
    665 
    666 ã‚ªãƒ•ã‚»ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«ç”Ÿæˆç”¨ãƒ†ãƒ³ãƒ—レートファイルは,ターゲット依存部で,
    667 target_offset.tf(または,プロセッサ依存部やチップ依存部で用意するそれ
    668 ã«ä»£ã‚ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ï¼‰ã«ç”¨æ„ã™ã‚‹ï¼Žã¾ãŸï¼ŒMakefileのターゲット依存部で,次の
    669 ä¾‹ã®ã‚ˆã†ã«ï¼ŒOFFSET_TFにオフセットファイル生成用テンプレートファイルのファ
    670 ã‚¤ãƒ«åã‚’定義する.
    671 
    672 ----------------------------------------
    673 # オフセットファイル生成のための定義
     506サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」
     507を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で
     508OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には,
     509Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する.
     510
     5112.5 オフセットファイルの生成方法
     512
     513アセンブリ言語で記述されるプログラムから,C言語の構造体にアクセスする場
     514合には,構造体の各フィールドのオフセット値を参照することが必要である.
     515ASPカーネルでは,必要なオフセット値を求めてファイル(標準ではoffset.h)
     516に生成するための仕組みを用意している.
     517
     518この仕組みを用いることで,例えば,TCB中のtexptnフィールドのオフセット値
     519をTCB_texptnにマクロ定義することや,TCB中のタスクコンテキストブロック
     520(tskctxb)に含まれるpcフィールドのオフセット値をTCB_pcにマクロ定義する
     521ことができる.また,TCB中のenatexフィールドのオフセット値,ビット位置,
     522ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,TCB_enatex_maskにマ
     523クロ定義することができる.
     524
     525offset.hを生成するための仕組みとして,現時点では,コンフィギュレータを
     526用いる方法と,makeoffset.cとgenoffsetを用いる方法を用意している.後者の
     527方法は,GNU開発環境にしか対応していないことから,将来のバージョンでは,
     528後者の方法のサポートをやめる計画である.新たにポーティングする場合には,
     529前者の方法を用いることを推奨する.
     530
     531これらの仕組みでオフセットファイルを生成できない時には,offset.hをター
     532ゲット依存部で用意し,Makefileのターゲット依存部でOMIT_MAKEOFFSETを
     533"true"に定義する.
     534
     535拡張パッケージの中には,TCBにフィールドを追加するものがあるため,TCB中
     536のフィールドのオフセット値は変化する.offset.hを生成する場合でも,ター
     537ゲット依存部で用意する場合でも,拡張パッケージに対応するためには,この
     538ことを考慮する必要がある.
     539
     5402.5.1 コンフィギュレータを用いる方法
     541
     542コンフィギュレータのパス1で生成するcfg1_out.cをコンパイルして生成したオ
     543ブジェクトファイルから,コンフィギュレータによってoffset.hを生成する方
     544法である.この方法を用いるためには,ターゲット依存部でオフセットファイ
     545ル生成用テンプレートファイルを用意し,target_cfg1_out.h(または,そこか
     546らインクルードされるファイル)とtarget_def.csv(または,同等の役割を持
     547つファイル)に記述を追加する必要がある.なお,これらのファイルを新たに
     548用意した際や修正した際には,offset.hに妥当な定義が生成されていることを
     549確認すべきである.
     550
     551オフセットファイル生成用テンプレートファイルは,ターゲット依存部で,
     552target_offset.tf(または,プロセッサ依存部やチップ依存部で用意するそれ
     553に代わるファイル)に用意する.また,Makefileのターゲット依存部で,次の
     554例のように,OFFSET_TFにオフセットファイル生成用テンプレートファイルのファ
     555イル名を定義する.
     556
     557----------------------------------------
     558# オフセットファイル生成のための定義
    674559OFFSET_TF = $(TARGETDIR)/target_offset.tf
    675560----------------------------------------
    676561
    677 ã‚ªãƒ•ã‚»ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«ç”Ÿæˆç”¨ãƒ†ãƒ³ãƒ—レートファイルには,以下のå†
    678 å®¹ã‚’記述する.
    679 
    680 (1) 標準テンプレートファイルのインクルード
    681 
    682 ã‚ªãƒ•ã‚»ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«ç”Ÿæˆç”¨ã®æ¨™æº–テンプレートファイル(kernel/genoffset.tf)
    683 ã‚’インクルードする.標準テンプレートファイルには,以下で用いるDEFINE関
    684 æ•°ã‚„DEFINE_BIT関数の定義などが含まれている.
    685 
    686 ----------------------------------------
    687 $ 標準テンプレートファイルのインクルード
     562オフセットファイル生成用テンプレートファイルには,以下の内容を記述する.
     563
     564(1) 標準テンプレートファイルのインクルード
     565
     566オフセットファイル生成用の標準テンプレートファイル(kernel/genoffset.tf)
     567をインクルードする.標準テンプレートファイルには,以下で用いるDEFINE関
     568数やDEFINE_BIT関数の定義などが含まれている.
     569
     570----------------------------------------
     571$ 標準テンプレートファイルのインクルード
    688572$INCLUDE "kernel/genoffset.tf"$
    689573----------------------------------------
    690574
    691 (2) オフセット値のマクロ定義の生成
    692 
    693 DEFINE関数を用いて,オフセット値のマクロ定義を生成する.例えば,TCB中の
    694 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ–ロック(tskctxb)に含まれるpcフィールドのオフセット
    695 å€¤ã‚’,TCB_pcにマクロ定義する場合には,次のように記述する.
    696 
    697 ----------------------------------------
    698 $ オフセット値のマクロ定義の生成
     575(2) オフセット値のマクロ定義の生成
     576
     577DEFINE関数を用いて,オフセット値のマクロ定義を生成する.例えば,TCB中の
     578タスクコンテキストブロック(tskctxb)に含まれるpcフィールドのオフセット
     579値を,TCB_pcにマクロ定義する場合には,次のように記述する.
     580
     581----------------------------------------
     582$ オフセット値のマクロ定義の生成
    699583$DEFINE("TCB_pc", offsetof_TCB_pc)$
    700584----------------------------------------
    701585
    702 ã“こで,DEFINE関数の第1パラメータはマクロ定義するシンボル,第2パラメー
    703 ã‚¿ã¯ï¼Œã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤ã‚’保持するコンフィギュレータの変数である.
    704 
    705 ã¾ãŸï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒï¼Œã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤ã‚’保持する変数(上の例では
    706 offsetof_TCB_pc)に値を設定するために,target_def.csv(または,同等の役
    707 å‰²ã‚’持つファイル)に次の例のような行を追加する.
     586ここで,DEFINE関数の第1パラメータはマクロ定義するシンボル,第2パラメー
     587タは,オフセット値を保持するコンフィギュレータの変数である.
     588
     589また,コンフィギュレータが,オフセット値を保持する変数(上の例では
     590offsetof_TCB_pc)に値を設定するために,target_def.csv(または,同等の役
     591割を持つファイル)に次の例のような行を追加する.
    708592
    709593----------------------------------------
     
    711595----------------------------------------
    712596
    713 ãŸã ã—,各オブジェクトの初期化ブロックのターゲット非依存のフィールドの
    714 ã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤ã‚’取得するための記述は,kernel/kernel_def.csvに含まれている.
    715 kernel/kernel_def.csvに含まれている記述は,target_def.csv(または,同等
    716 ã®å½¹å‰²ã‚’持つファイル)に追加するå¿
    717 è¦ã¯ãªã„.
    718 
    719 (3) ビットオフセット値等のマクロ定義の生成
    720 
    721 DEFINE_BIT関数を用いて,ビットのオフセット値,ビット位置,ビットマスク
    722 ã®ãƒžã‚¯ãƒ­å®šç¾©ã‚’生成する.例えば,TCB中のenatexフィールドのオフセット値,
    723 ãƒ“ット位置,ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,
    724 TCB_enatex_maskにマクロ定義する場合には,次のように記述する.
     597ただし,各オブジェクトの初期化ブロックのターゲット非依存のフィールドの
     598オフセット値を取得するための記述は,kernel/kernel_def.csvに含まれている.
     599kernel/kernel_def.csvに含まれている記述は,target_def.csv(または,同等
     600の役割を持つファイル)に追加する必要はない.
     601
     602(3) ビットオフセット値等のマクロ定義の生成
     603
     604DEFINE_BIT関数を用いて,ビットのオフセット値,ビット位置,ビットマスク
     605のマクロ定義を生成する.例えば,TCB中のenatexフィールドのオフセット値,
     606ビット位置,ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,
     607TCB_enatex_maskにマクロ定義する場合には,次のように記述する.
    725608
    726609----------------------------------------
     
    728611----------------------------------------
    729612
    730 ã“こで,DEFINE_BIT関数の第1パラメータはマクロ定義するシンボル(のå
    731 ˆé ­éƒ¨
    732 åˆ†ï¼‰ï¼Œç¬¬2パラメータは構造体のサイズである.第3パラメータには,ビットの
    733 ã‚ªãƒ•ã‚»ãƒƒãƒˆï¼Œãƒ“ット位置,ビットマスクを,8ビット単位(バイト単位)で求め
    734 ã‚‹å ´åˆã«ã¯"B"を,16ビット単位で求める場合には"H"を,32ビット単位で求め
    735 ã‚‹å ´åˆã«ã¯"W"を指定する.なお,ビット位置は,LSBを0とした値(ビットリト
    736 ãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã‚’想定)を求める.
    737 
    738 ã¾ãŸï¼Œtarget_cfg1_out.h(または,そこからインクルードされるファイル)に,
    739 ãƒ“ットオフセット値等を求めるための構造体の変数定義を追加する.この構造
    740 ä½“の変数は,名称をマクロ定義するシンボル(DEFINE_BIT関数の第1パラメータ)
    741 ã¨ã—,対象のビットのみが1で,他のすべてのビットが0になるように初期化す
    742 ã‚‹ï¼Žã¾ãŸï¼Œconst修飾子を付加する.例えば,TCB中のenatexフィールドのビッ
    743 ãƒˆã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤ç­‰ã‚’求める場合には,次のような定義を追加する(tskctxbの初
    744 æœŸå€¤ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ãªã®ã§æ³¨æ„ã™ã‚‹ã“と).
     613ここで,DEFINE_BIT関数の第1パラメータはマクロ定義するシンボル(の先頭部
     614分),第2パラメータは構造体のサイズである.第3パラメータには,ビットの
     615オフセット,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求め
     616る場合には"B"を,16ビット単位で求める場合には"H"を,32ビット単位で求め
     617る場合には"W"を指定する.なお,ビット位置は,LSBを0とした値(ビットリト
     618ルエンディアンを想定)を求める.
     619
     620また,target_cfg1_out.h(または,そこからインクルードされるファイル)に,
     621ビットオフセット値等を求めるための構造体の変数定義を追加する.この構造
     622体の変数は,名称をマクロ定義するシンボル(DEFINE_BIT関数の第1パラメータ)
     623とし,対象のビットのみが1で,他のすべてのビットが0になるように初期化す
     624る.また,const修飾子を付加する.例えば,TCB中のenatexフィールドのビッ
     625トオフセット値等を求める場合には,次のような定義を追加する(tskctxbの初
     626期値は,ターゲット依存なので注意すること).
    745627
    746628----------------------------------------
     
    768650----------------------------------------
    769651
    770 ã•ã‚‰ã«ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒï¼Œæ§‹é€ ä½“のサイズ(上の例ではsizeof_TCB)に
    771 å€¤ã‚’設定するために,target_def.csv(または,同等の役割を持つファイル)
    772 ã«æ¬¡ã®ä¾‹ã®ã‚ˆã†ãªè¡Œã‚’追加する.
     652さらに,コンフィギュレータが,構造体のサイズ(上の例ではsizeof_TCB)に
     653値を設定するために,target_def.csv(または,同等の役割を持つファイル)
     654に次の例のような行を追加する.
    773655
    774656----------------------------------------
     
    776658----------------------------------------
    777659
    778 ãŸã ã—,前述した通り,kernel/kernel_def.csvに含まれている記述は,
    779 target_def.csv(または,同等の役割を持つファイル)に追加するå¿
    780 è¦ã¯ãªã„.
    781 
    782 æœ€å¾Œã«ï¼Œtarget_cfg1_out.h(または,そこからインクルードされるファイル)
    783 ã«ï¼Œoffset.hを生成する仕組みが正しく動作していることを確認するための次
    784 ã®è¨˜è¿°ã‚’追加する.
     660ただし,前述した通り,kernel/kernel_def.csvに含まれている記述は,
     661target_def.csv(または,同等の役割を持つファイル)に追加する必要はない.
     662
     663最後に,target_cfg1_out.h(または,そこからインクルードされるファイル)
     664に,offset.hを生成する仕組みが正しく動作していることを確認するための次
     665の記述を追加する.
    785666
    786667----------------------------------------
     
    790671----------------------------------------
    791672
    792 2.5.2 makeoffset.cとgenoffsetを用いる方法
    793 
    794 makeoffset.cは,どのオフセット値をoffset.hに生成するかを指定するファイ
    795 ãƒ«ã§ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ç”¨æ„ã™ã‚‹ï¼Žgenoffsetは,makeoffset.cをコンパイル
    796 ã—て得られるアセンブリソースファイルから,offset.hを生成するスクリプト
    797 ã§ã‚る.genoffsetは,GNU開発環境にのみ対応している.
    798 
    799 makeoffset.cを記述する場合には,既存のターゲット依存部に含まれる
    800 makeoffset.cを修正するのが近道である.標準的なmakeoffset.cは,以下の6つ
    801 ã®éƒ¨åˆ†ã§æ§‹æˆã•ã‚Œã¦ã„る.なお,makeoffset.cを新たに記述した際には,
    802 offset.hに妥当な定義が生成されていることを確認すべきである.
    803 
    804 (1) å¿
    805 è¦ãªãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰
    806 
    807 ã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤ã‚’求めたいフィールドを含む構造体を定義するヘッダファイルを
    808 ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã‚‹ï¼ŽTCB中のフィールドのオフセット値を求めたい場合には,以
    809 ä¸‹ã®3行を含めればよい.
     6732.5.2 makeoffset.cとgenoffsetを用いる方法
     674
     675makeoffset.cは,どのオフセット値をoffset.hに生成するかを指定するファイ
     676ルで,ターゲット依存部で用意する.genoffsetは,makeoffset.cをコンパイル
     677して得られるアセンブリソースファイルから,offset.hを生成するスクリプト
     678である.genoffsetは,GNU開発環境にのみ対応している.
     679
     680makeoffset.cを記述する場合には,既存のターゲット依存部に含まれる
     681makeoffset.cを修正するのが近道である.標準的なmakeoffset.cは,以下の6つ
     682の部分で構成されている.なお,makeoffset.cを新たに記述した際には,
     683offset.hに妥当な定義が生成されていることを確認すべきである.
     684
     685(1) 必要なファイルのインクルード
     686
     687オフセット値を求めたいフィールドを含む構造体を定義するヘッダファイルを
     688インクルードする.TCB中のフィールドのオフセット値を求めたい場合には,以
     689下の3行を含めればよい.
    810690
    811691#include "kernel_impl.h"
     
    813693#include "sil.h"
    814694
    815 (2) オフセット値出力用マクロの定義
    816 
    817 æ§‹é€ ä½“中のフィールドのオフセット値の定義を生成するために用いるマクロ
    818 ï¼ˆOFFSET_DEFとOFFSET_DEF2)の定義.これらのマクロの定義は,修正するå¿
    819 è¦
    820 ãŒãªã„.
    821 
    822 (3) オフセット値出力用関数の定義
    823 
    824 æ§‹é€ ä½“中のフィールドのオフセット値の定義を生成するための関数
    825 ï¼ˆmakeoffset)の定義.オフセット値のマクロ定義を生成したいフィールド毎
    826 ã«ï¼Œæ¬¡ã®ã„ずれかのマクロを記述する.
     695(2) オフセット値出力用マクロの定義
     696
     697構造体中のフィールドのオフセット値の定義を生成するために用いるマクロ
     698(OFFSET_DEFとOFFSET_DEF2)の定義.これらのマクロの定義は,修正する必要
     699がない.
     700
     701(3) オフセット値出力用関数の定義
     702
     703構造体中のフィールドのオフセット値の定義を生成するための関数
     704(makeoffset)の定義.オフセット値のマクロ定義を生成したいフィールド毎
     705に,次のいずれかのマクロを記述する.
    827706
    828707(2-5-2-1) OFFSET_DEF(TYPE, FIELD)
    829708
    830 TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
    831 TYPE_FIELDという名前のシンボルに,そのフィールドのオフセット値をマクロ
    832 å®šç¾©ã™ã‚‹è¨˜è¿°ã‚’生成する.
     709TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
     710TYPE_FIELDという名前のシンボルに,そのフィールドのオフセット値をマクロ
     711定義する記述を生成する.
    833712
    834713(2-5-2-2) OFFSET_DEF2(TYPE, FIELD, FIELDNAME)
    835714
    836 TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
    837 TYPE_FIELDNAMEという名前のシンボルに,そのフィールドのオフセット値をマ
    838 ã‚¯ãƒ­å®šç¾©ã™ã‚‹è¨˜è¿°ã‚’生成する.構造体に含まれる構造体中のフィールドのオフ
    839 ã‚»ãƒƒãƒˆå€¤ã‚’求めたい場合には,こちらのマクロを使用する.
    840 
    841 (4) エンディアンを参ç
    842 §ã™ã‚‹ãŸã‚ã®é–¢æ•°ã®å®šç¾©
    843 
    844 SILで定義されたエンディアンを参ç
    845 §ã™ã‚‹ãŸã‚ã®é–¢æ•°ï¼ˆsil_endian)の定義.こ
    846 ã®é–¢æ•°ã®å®šç¾©ã¯ï¼Œä¿®æ­£ã™ã‚‹å¿
    847 è¦ãŒãªã„.
    848 
    849 (5) ビットオフセット値出力のための参ç
    850 §å®šç¾©
    851 
    852 åˆæœŸå€¤ã‚’持った変数定義に対して,コンパイラが生成するアセンブリ命令を参
    853 ç
    854 §ã™ã‚‹ãŸã‚ã®å¤‰æ•°ï¼ˆBIT_REF_4,BIT_REF_2,BIT_REF_1)の定義.これらの定義
    855 ã¯ï¼Œã»ã¨ã‚“どの場合に修正するå¿
    856 è¦ãŒãªã„.ただし,uint8_t型のサポートされ
    857 ã¦ã„ないターゲットでは,BIT_REF_1の定義は削除するå¿
    858 è¦ãŒã‚る.また,ポイ
    859 ãƒ³ã‚¿ãŒ64ビットのターゲット等では,BIT_REF_8の定義を追加しなければならな
    860 ã„と思われる.
    861 
    862 (6) ビットオフセット値出力用変数の定義
    863 
    864 ãƒ“ットのオフセット値,ビット位置,ビットマスクの定義を生成するためのデー
    865 ã‚¿åž‹ã®å®šç¾©ï¼Žã“れらの定義を生成したいビットフィールド毎に,以下の説明す
    866 ã‚‹å¤‰æ•°ã‚’定義する.
    867 
    868 æ§‹é€ ä½“のデータ型名がTYPE,その構造体中のビットフィールド名がFIELDの場合
    869 ã«ï¼Œãƒ‡ãƒ¼ã‚¿åž‹ãŒTYPEで,変数名がBIT_xy_TYPE_FIELDの変数を定義する.また,
    870 ãã®å¤‰æ•°ã‚’,対象のビットのみが1で,他のすべてのビットが0になるように初
    871 æœŸåŒ–する.ここで,xはエンディアンを指定する文字で,B(ビッグエンディア
    872 ãƒ³ï¼‰ã¾ãŸã¯L(リトルエンディアン)を指定する.またyには,ビットのオフセッ
    873 ãƒˆï¼Œãƒ“ット位置,ビットマスクを,8ビット単位(バイト単位)で求める場合に
    874 ã¯Bを,16ビット単位で求める場合にはHを,32ビット単位で求める場合にはWを
    875 æŒ‡å®šã™ã‚‹ï¼Ž
    876 
    877 ã“れにより,TYPE_FIELDという名前のシンボルにそのビットのオフセット,
    878 TYPE_FIELD_bitという名前のシンボルにビット位置,TYPE_FIELD_maskという名
    879 å‰ã®ã‚·ãƒ³ãƒœãƒ«ã«ãƒ“ットマスクをマクロ定義する記述を生成する.なお,ビット
    880 ä½ç½®ã¯ï¼ŒLSBを0とした値(ビットリトルエンディアンを想定)を求める.
    881 
    882 2.6 リンク方法の設定
    883 
    884 (2-6-1) LDSCRIPT                                リンカスクリプトのファイル名
    885 
    886 é–‹ç™ºç’°å¢ƒã«æ¨™æº–のリンカスクリプトが使用できない場合には,ターゲット依存
    887 éƒ¨ã§ãƒªãƒ³ã‚«ã‚¹ã‚¯ãƒªãƒ—トを用意し,そのファイル名をこの変数に定義する.
    888 
    889 (2-6-2) TEXT_START_ADDRESS              テキストセクションのå
    890 ˆé ­ç•ªåœ°
    891 (2-6-3) DATA_START_ADDRESS              データセクションのå
    892 ˆé ­ç•ªåœ°
    893 
    894 å„セクションのå
    895 ˆé ­ç•ªåœ°ã®æŒ‡å®šãŒå¿
    896 è¦ãªå ´åˆã«ã¯ï¼Œã“れらの変数にå
    897 ˆé ­ç•ªåœ°ã‚’
    898 å®šç¾©ã™ã‚‹ï¼Ž
    899 
    900 (2-6-4) START_OBJS                              å
    901 ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«å
    902 (2-6-5) END_OBJS                                最後にリンクすべきモジュール名
    903 
    904 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ã‚ˆã£ã¦ã¯ï¼Œãƒ­ãƒ¼ãƒ‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®å
    905 ˆé ­ã¨æœ€å¾Œã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ¢ã‚¸ãƒ¥ãƒ¼
    906 ãƒ«ã‚’,ターゲット依存部で用意するå¿
    907 è¦ãŒã‚る.多くの場合,スタートアップ
    908 ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’ロードモジュールのå
    909 ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã‚‹å¿
    910 è¦ãŒã‚る.
    911 
    912 ãƒ­ãƒ¼ãƒ‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®å
    913 ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ—ログラムがある場合には,Makefile
    914 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«ãŠã„て,そのオブジェクトファイル名をSTART_OBJSに定
    915 ç¾©ã—,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー
    916 ãƒ‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®æœ€å¾Œã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒã‚る場合には,そのオブジェ
    917 ã‚¯ãƒˆãƒ•ã‚¡ã‚¤ãƒ«åã‚’END_OBJSに定義し,それに対するコンパイルルールと依存関
    918 ä¿‚作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o)
    919 ã‚’リンクしないように,LDFLAGSとCFG1_OUT_LDFLAGSに-nostdlibを追加するå¿
    920 
    921 è¦ãŒã‚る.さらに,-nostdlibをつけることで標準ライブラリがリンクされなく
    922 ãªã‚‹ãŸã‚ï¼ŒLIBSに-lgccを追加しなければならない.
    923 
    924 ä¾‹ãˆã°ï¼Œã‚¹ã‚¿ãƒ¼ãƒˆã‚¢ãƒƒãƒ—モジュールのソースファイルがstart.Sの場合には,
    925 Makefileのターゲット依存部に次のような記述をå
    926 ¥ã‚Œã‚‹ã¨ã‚ˆã„.
    927 
    928 ----------------------------------------
    929 # スタートアップモジュールのオブジェクトファイル名
     715TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
     716TYPE_FIELDNAMEという名前のシンボルに,そのフィールドのオフセット値をマ
     717クロ定義する記述を生成する.構造体に含まれる構造体中のフィールドのオフ
     718セット値を求めたい場合には,こちらのマクロを使用する.
     719
     720(4) エンディアンを参照するための関数の定義
     721
     722SILで定義されたエンディアンを参照するための関数(sil_endian)の定義.こ
     723の関数の定義は,修正する必要がない.
     724
     725(5) ビットオフセット値出力のための参照定義
     726
     727初期値を持った変数定義に対して,コンパイラが生成するアセンブリ命令を参
     728照するための変数(BIT_REF_4,BIT_REF_2,BIT_REF_1)の定義.これらの定義
     729は,ほとんどの場合に修正する必要がない.ただし,uint8_t型のサポートされ
     730ていないターゲットでは,BIT_REF_1の定義は削除する必要がある.また,ポイ
     731ンタが64ビットのターゲット等では,BIT_REF_8の定義を追加しなければならな
     732いと思われる.
     733
     734(6) ビットオフセット値出力用変数の定義
     735
     736ビットのオフセット値,ビット位置,ビットマスクの定義を生成するためのデー
     737タ型の定義.これらの定義を生成したいビットフィールド毎に,以下の説明す
     738る変数を定義する.
     739
     740構造体のデータ型名がTYPE,その構造体中のビットフィールド名がFIELDの場合
     741に,データ型がTYPEで,変数名がBIT_xy_TYPE_FIELDの変数を定義する.また,
     742その変数を,対象のビットのみが1で,他のすべてのビットが0になるように初
     743期化する.ここで,xはエンディアンを指定する文字で,B(ビッグエンディア
     744ン)またはL(リトルエンディアン)を指定する.またyには,ビットのオフセッ
     745ト,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求める場合に
     746はBを,16ビット単位で求める場合にはHを,32ビット単位で求める場合にはWを
     747指定する.
     748
     749これにより,TYPE_FIELDという名前のシンボルにそのビットのオフセット,
     750TYPE_FIELD_bitという名前のシンボルにビット位置,TYPE_FIELD_maskという名
     751前のシンボルにビットマスクをマクロ定義する記述を生成する.なお,ビット
     752位置は,LSBを0とした値(ビットリトルエンディアンを想定)を求める.
     753
     7542.6 リンク方法の設定
     755
     756(2-6-1) LDSCRIPT                                リンカスクリプトのファイル名
     757
     758開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存
     759部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する.
     760
     761(2-6-2) TEXT_START_ADDRESS              テキストセクションの先頭番地
     762(2-6-3) DATA_START_ADDRESS              データセクションの先頭番地
     763
     764各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を
     765定義する.
     766
     767(2-6-4) START_OBJS                              先頭にリンクすべきモジュール名
     768(2-6-5) END_OBJS                                最後にリンクすべきモジュール名
     769
     770ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきモジュー
     771ルを,ターゲット依存部で用意する必要がある.多くの場合,スタートアップ
     772モジュールをロードモジュールの先頭にリンクする必要がある.
     773
     774ロードモジュールの先頭にリンクすべきプログラムがある場合には,Makefile
     775のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定
     776義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー
     777ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ
     778クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関
     779係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o)
     780をリンクしないように,LDFLAGSとCFG1_OUT_LDFLAGSに-nostdlibを追加する必
     781要がある.さらに,-nostdlibをつけることで標準ライブラリがリンクされなく
     782なるため,LIBSに-lgccを追加しなければならない.
     783
     784例えば,スタートアップモジュールのソースファイルがstart.Sの場合には,
     785Makefileのターゲット依存部に次のような記述を入れるとよい.
     786
     787----------------------------------------
     788# スタートアップモジュールのオブジェクトファイル名
    930789START_OBJS = start.o
    931790
    932 # スタートアップモジュールのコンパイルルール
     791# スタートアップモジュールのコンパイルルール
    933792$(START_OBJS): %.o: %.S
    934793        $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
    935794
    936 # スタートアップモジュールの依存関係作成ルール
     795# スタートアップモジュールの依存関係作成ルール
    937796$(START_OBJS:.o=.d): %.d: %.S
    938797        @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
    939798                -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
    940799
    941 # リンカに対するオプション
     800# リンカに対するオプション
    942801LDFLAGS := -nostdlib $(LDFLAGS)
    943802CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS)
     
    945804----------------------------------------
    946805
    947 ã¾ãŸï¼ŒGNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合
    948 ã«ã¯ï¼ŒMakefile のターゲット依存部に次のような記述をå
    949 ¥ã‚Œã‚‹ã¨ã‚ˆã„.
    950 
    951 ----------------------------------------
    952 # オブジェクトファイル名
     806また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合
     807には,Makefile のターゲット依存部に次のような記述を入れるとよい.
     808
     809----------------------------------------
     810# オブジェクトファイル名
    953811START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
    954812END_OBJS = $(shell $(CC) -print-file-name=crtend.o)
    955813
    956 # 依存関係作成ルール
     814# 依存関係作成ルール
    957815$(START_OBJS:.o=.d): %.d:
    958816$(END_OBJS:.o=.d): %.d:
    959817
    960 # リンカに対するオプション
     818# リンカに対するオプション
    961819LDFLAGS := -nostdlib $(LDFLAGS)
    962820CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS)
     
    964822----------------------------------------
    965823
    966 ã“の場合,これらのファイルをコンパイルすることはないため,コンパイルルー
    967 ãƒ«ã¯ä¸è¦ã§ã‚る.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
    968 ãƒ«ãŒãªã„とエラーになる).
    969 
    970 (2-6-6) HIDDEN_OBJS                             æŒ‡å®šã—なくてもリンクされるモジュール名
    971 
    972 ãƒ­ãƒ¼ãƒ‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’,リンカに対するパラメータで
    973 ã¯ãªãï¼Œãƒªãƒ³ã‚«ã‚¹ã‚¯ãƒªãƒ—ト中に(例えば,GNU開発環境のリンカスクリプトの
    974 STARTUPを使って)記述する場合には,そのオブジェクトファイル名を,
    975 ï¼ˆSTART_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ
    976 ãƒ³ãƒ‘イルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ
    977 ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ï¼Œãƒªãƒ³ã‚«ã«å¯¾ã™ã‚‹ãƒ‘ラメータからは除外される.LDFLAGSと
    978 CFG1_OUT_LDFLAGS,LIBSについては,START_OBJSまたはEND_OBJSを用いる場合
    979 ã¨åŒæ§˜ã§ã‚る.
    980 
    981 ä¾‹ãˆã°ï¼Œã‚¹ã‚¿ãƒ¼ãƒˆã‚¢ãƒƒãƒ—モジュールのソースファイルがstart.Sで,start.oを
    982 ãƒªãƒ³ã‚¯ã™ã‚‹ã“とをリンカスクリプト中に記述する場合には,Makefileのターゲッ
    983 ãƒˆä¾å­˜éƒ¨ã«æ¬¡ã®ã‚ˆã†ãªè¨˜è¿°ã‚’å
    984 ¥ã‚Œã‚‹ã¨ã‚ˆã„.
    985 
    986 ----------------------------------------
    987 # スタートアップモジュールのオブジェクトファイル名
     824この場合,これらのファイルをコンパイルすることはないため,コンパイルルー
     825ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
     826ルがないとエラーになる).
     827
     828(2-6-6) HIDDEN_OBJS                             指定しなくてもリンクされるモジュール名
     829
     830ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで
     831はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの
     832STARTUPを使って)記述する場合には,そのオブジェクトファイル名を,
     833(START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ
     834ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ
     835ジュールは,リンカに対するパラメータからは除外される.LDFLAGSと
     836CFG1_OUT_LDFLAGS,LIBSについては,START_OBJSまたはEND_OBJSを用いる場合
     837と同様である.
     838
     839例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを
     840リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ
     841ト依存部に次のような記述を入れるとよい.
     842
     843----------------------------------------
     844# スタートアップモジュールのオブジェクトファイル名
    988845HIDDEN_OBJS = start.o
    989846
    990 # スタートアップモジュールのコンパイルルール
     847# スタートアップモジュールのコンパイルルール
    991848$(HIDDEN_OBJS): %.o: %.S
    992849        $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
    993850
    994 # スタートアップモジュールの依存関係作成ルール
     851# スタートアップモジュールの依存関係作成ルール
    995852$(HIDDEN_OBJS:.o=.d): %.d: %.S
    996853        @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
    997854                -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
    998855
    999 # リンカに対するオプション
     856# リンカに対するオプション
    1000857LDFLAGS := -nostdlib $(LDFLAGS)
    1001858CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS)
     
    1003860----------------------------------------
    1004861
    1005 2.7 依存関係の定義
    1006 
    1007 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®å„パスに対して,ターゲット依存のファイルへの依存関
    1008 ä¿‚を定義する.å
    1009 ·ä½“的には,パス1,パス2,パス3が依存するファイルを,それ
    1010 ãžã‚Œcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で
    1011 è¨˜è¿°ã™ã‚‹ï¼Ž
    1012 
    1013 ã»ã¨ã‚“どの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
    1014 ä¸‹ã®è¨˜è¿°ã‚’含めるå¿
    1015 è¦ãŒã‚る.
     8622.7 依存関係の定義
     863
     864コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関
     865係を定義する.具体的には,パス1,パス2,パス3が依存するファイルを,それ
     866ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で
     867記述する.
     868
     869ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
     870下の記述を含める必要がある.
    1016871
    1017872----------------------------------------
     
    1021876----------------------------------------
    1022877
    1023 2.8 その他の設定
    1024 
    1025 (2-8-1) CLEAN_FILES                             cleanにより削除するファイル名
    1026 
    1027 cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ
    1028 ã‚¤ãƒ«åã‚’この変数に追加定義する.
    1029 
    1030 (2-8-2) REALCLEAN_FILES                 realcleanにより削除するファイル名
    1031 
    1032 realcleanにより削除するファイルをターゲット依存部で追加したい場合には,
    1033 ãƒ•ã‚¡ã‚¤ãƒ«åã‚’この変数に追加定義する.
    1034 
    1035 
    1036 ï¼“.TOPPERSå
    1037 ±é€šå®šç¾©ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
    1038 
    1039 TOPPERSå
    1040 ±é€šå®šç¾©ï¼ˆt_stddef.h)のターゲット依存部は,target_stddef.hまた
    1041 ã¯ãã“からインクルードされるファイル(プロセッサ・チップ・開発環境依存
    1042 éƒ¨ã§ç”¨æ„ã•ã‚Œã‚‹ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ãªã©ï¼‰ã«å«ã‚ã‚‹ï¼Ž
    1043 
    1044 3.1 ターゲット識別マクロ
    1045 
    1046 ã‚¢ãƒ—リケーションやシステムサービスでターゲットを識別するために,
    1047 "TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば,
    1048 "TOPPERS_DVE68K")をマクロ定義する.
    1049 
    1050 ã¾ãŸï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‹ã‚‰ãƒ—ロセッサ依存部やチップ依存部を切り分けた場
    1051 åˆã«ã¯ï¼Œ"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え
    1052 ã°ï¼Œ"TOPPERS_M68K")をマクロ定義する.
    1053 
    1054 3.2 整数型の最大値・最小値・ビット数
    1055 
    1056 (3-2-1) INT_MAX                         intに格納できる最大値(C90準拠)
    1057 (3-2-2) INT_MIN                         intに格納できる最小値(C90準拠)
    1058 (3-2-3) UINT_MAX                        unsigned intに格納できる最大値(C90準拠)
    1059 (3-2-4) LONG_MAX                        longに格納できる最大値(C90準拠)
    1060 (3-2-5) LONG_MIN                        longに格納できる最小値(C90準拠)
    1061 (3-2-6) ULONG_MAX                       unsigned longに格納できる最大値(C90準拠)
    1062 (3-2-7) CHAR_BIT                        char型のビット数(C90準拠)
    1063 
    1064 æ•´æ•°åž‹ã®æœ€å¤§å€¤ãƒ»æœ€å°å€¤ãƒ»ãƒ“ット数を,これらのシンボルにマクロに定義する.
    1065 
    1066 ã“れらのマクロは,C90に準拠したものである.開発環境にC90に準拠した
    1067 limits.hが用意されている場合には,これらのマクロを定義することに代えて,
    1068 limits.hをインクルードすればよい.
    1069 
    1070 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
    1071 
    1072 (3-3-1) int8_t                          符号付き8ビット整数(オプション,C99準拠)
    1073 (3-3-2) uint8_t                         ç¬¦å·ç„¡ã—8ビット整数(オプション,C99準拠)
    1074 (3-3-3) int16_t                         ç¬¦å·ä»˜ã16ビット整数(C99準拠)
    1075 (3-3-4) uint16_t                        符号無し16ビット整数(C99準拠)
    1076 (3-3-5) int32_t                         ç¬¦å·ä»˜ã32ビット整数(C99準拠)
    1077 (3-3-6) uint32_t                        符号無し32ビット整数(C99準拠)
    1078 (3-3-7) int64_t                         ç¬¦å·ä»˜ã64ビット整数(オプション,C99準拠)
    1079 (3-3-8) uint64_t                        符号無し64ビット整数(オプション,C99準拠)
    1080 (3-3-9) int128_t                        符号付き128ビット整数(オプション,C99準拠)
    1081 (3-3-10) uint128_t                      符号無し128ビット整数(オプション,C99準拠)
    1082 (3-3-11) int_least8_t           8ビット以上の符号付き整数(C99準拠)
    1083 (3-3-12) uint_least8_t          8ビット以上の符号無し整数(C99準拠)
    1084 (3-3-13) intptr_t                       ãƒã‚¤ãƒ³ã‚¿ã‚’格納できるサイズの符号付き整数(C99準拠)
    1085 (3-3-14) uintptr_t                      ポインタを格納できるサイズの符号無し整数(C99準拠)
    1086 (3-3-15) INT8_MAX                       int8_tに格納できる最大値(オプション,C99準拠)
    1087 (3-3-16) INT8_MIN                       int8_tに格納できる最小値(オプション,C99準拠)
    1088 (3-3-17) UINT8_MAX                      uint8_tに格納できる最大値(オプション,C99準拠)
    1089 (3-3-18) INT16_MAX                      int16_tに格納できる最大値(C99準拠)
    1090 (3-3-19) INT16_MIN                      int16_tに格納できる最小値(C99準拠)
    1091 (3-3-20) UINT16_MAX                     uint16_tに格納できる最大値(C99準拠)
    1092 (3-3-21) INT32_MAX                      int32_tに格納できる最大値(C99準拠)
    1093 (3-3-22) INT32_MIN                      int32_tに格納できる最小値(C99準拠)
    1094 (3-3-23) UINT32_MAX                     uint32_tに格納できる最大値(C99準拠)
    1095 (3-3-24) INT64_MAX                      int64_tに格納できる最大値(オプション,C99準拠)
    1096 (3-3-25) INT64_MIN                      int64_tに格納できる最小値(オプション,C99準拠)
    1097 (3-3-26) UINT64_MAX                     uint64_tに格納できる最大値(オプション,C99準拠)
    1098 (3-3-27) INT128_MAX                     int128_tに格納できる最大値(オプション,C99準拠)
    1099 (3-3-28) INT128_MIN                     int128_tに格納できる最小値(オプション,C99準拠)
    1100 (3-3-29) UINT128_MAX            uint128_tに格納できる最大値(オプション,C99準拠)
    1101 (3-3-30) INT_LEAST8_MAX         int_least8_tに格納できる最大値(C99準拠)
    1102 (3-3-31) INT_LEAST8_MIN         int_least8_tに格納できる最小値(C99準拠)
    1103 (3-3-32) UINT_LEAST8_MAX        uint_least8_tに格納できる最大値(C99準拠)
    1104 (3-3-33) INT8_C(val)            int_least8_t型の定数を作るマクロ(C99準拠)
    1105 (3-3-34) UINT8_C(val)           uint_least8_t型の定数を作るマクロ(C99準拠)
    1106 (3-3-35) INT16_C(val)           int16_t型の定数を作るマクロ(C99準拠)
    1107 (3-3-36) UINT16_C(val)          uint16_t型の定数を作るマクロ(C99準拠)
    1108 (3-3-37) INT32_C(val)           int32_t型の定数を作るマクロ(C99準拠)
    1109 (3-3-38) UINT32_C(val)          uint32_t型の定数を作るマクロ(C99準拠)
    1110 (3-3-39) INT64_C(val)           int64_t型の定数を作るマクロ(オプション,C99準拠)
    1111 (3-3-40) UINT64_C(val)          uint64_t型の定数を作るマクロ(オプション,C99準拠)
    1112 (3-3-41) INT128_C(val)          int128_t型の定数を作るマクロ(オプション,C99準拠)
    1113 (3-3-42) UINT128_C(val)         uint128_t型の定数を作るマクロ(オプション,C99準拠)
    1114 
    1115 æŒ‡å®šã•ã‚ŒãŸã‚µã‚¤ã‚ºã®æ•´æ•°åž‹ã‚’,これらのシンボルに型定義する.また,データ
    1116 åž‹ã«æ ¼ç´ã§ãã‚‹æœ€å¤§å€¤ãƒ»æœ€å°å€¤ã¨ï¼Œæ•´æ•°å®šæ•°ã‚’作るマクロを,これらのシンボ
    1117 ãƒ«ã«ãƒžã‚¯ãƒ­å®šç¾©ã™ã‚‹ï¼Ž
    1118 
    1119 ã“れらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99
    1120 ã«æº–拠したstdint.hが用意されている場合には,これらのデータ型およびマク
    1121 ãƒ­ã‚’定義することに代えて,stdint.hをインクルードすればよい.
    1122 
    1123 ä¸Šã§ã‚ªãƒ—ションと記述したものは,該当するデータ型がコンパイラでサポート
    1124 ã•ã‚Œã¦ã„る場合にのみ定義することを示す.
    1125 
    1126 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
    1127 
    1128 (3-4-1) float32_t                       IEEE754準拠の32ビット単精度浮動小数点数(オプ
    1129                                                         ション)
    1130 (3-4-2) double64_t                      IEEE754準拠の64ビット倍精度浮動小数点数(オプ
    1131                                                         ション)
    1132 (3-4-3) FLOAT32_MIN                     float32_tに格納できる最小の正規化された正の浮
    1133                                                         動小数点数(オプション)
    1134 (3-4-4) FLOAT32_MAX                     float32_tに格納できる表現可能な最大の有限浮動
    1135                                                         小数点数(オプション)
    1136 (3-4-5) DOUBLE64_MIN            double64_tに格納できる最小の正規化された正の浮
    1137                                                         動小数点数(オプション)
    1138 (3-4-6) DOUBLE64_MAX            double64_tに格納できる表現可能な最大の有限浮動
    1139                                                         小数点数(オプション)
    1140 
    1141 æŒ‡å®šã•ã‚ŒãŸã‚µã‚¤ã‚ºãƒ»è¡¨ç¾å½¢å¼ã®æµ®å‹•å°æ•°ç‚¹åž‹ã‚’,これらのシンボルに型定義す
    1142 ã‚‹ï¼Žã¾ãŸï¼Œãƒ‡ãƒ¼ã‚¿åž‹ã«æ ¼ç´ã§ãã‚‹æœ€å¤§å€¤ãƒ»æœ€å°å€¤ã‚’,これらのシンボルにマク
    1143 ãƒ­å®šç¾©ã™ã‚‹ï¼Ž
    1144 
    1145 ã„ずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定
    1146 ç¾©ã™ã‚‹ï¼Ž
    1147 
    1148 3.5 コンパイラの拡張機能のためのマクロ定義
    1149 
    1150 ã‚³ãƒ³ãƒ‘イラの拡張機能を用いるためのマクロとして,å¿
    1151 è¦ã«å¿œã˜ã¦ï¼Œä»¥ä¸‹ã®ãƒž
    1152 ã‚¯ãƒ­ã®å®šç¾©ã‚’含める.
    1153 
    1154 (3-5-1) inline(オプション,デフォルトは未定義)
    1155 (3-5-2) Inline(オプション,デフォルトはstatic inline)
    1156 
    1157 ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³é–¢æ•°ã§ã‚ることを示す指定.Inlineは,コンパイル単位にローカル
    1158 ãªã‚¤ãƒ³ãƒ©ã‚¤ãƒ³é–¢æ•°ã§ã‚ることを示す.
    1159 
    1160 (3-5-3) asm(オプション,デフォルトは未定義)
    1161 (3-5-4) Asm(オプション,デフォルトは未定義)
    1162 
    1163 ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ã‚¢ã‚»ãƒ³ãƒ–ラを記述するための指定.Asmは,最適化により削除しては
    1164 ãªã‚‰ãªã„ことを示す.これらは,ターゲット依存部でのみ使うマクロであるた
    1165 ã‚ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ä½¿ã‚ãªã„なら定義するå¿
    1166 è¦ã¯ãªã„.
    1167 
    1168 (3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり)
    1169 
    1170 æ§‹é€ ä½“structureの中での,フィールドfieldのオフセットを求めるマクロ.
    1171 
    1172 (3-5-6) alignof(type)(オプション,デフォルトの定義あり)
    1173 
    1174 ãƒ‡ãƒ¼ã‚¿åž‹typeのアラインメント単位を求めるマクロ.
    1175 
    1176 (3-5-7) NoReturn(オプション,デフォルトは未定義)
    1177 
    1178 ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹ã“とのない関数であることを示す指定.これは,ターゲット依存
    1179 éƒ¨ã®ã¿ä½¿ã†ãƒžã‚¯ãƒ­ã§ã‚るため,ターゲット依存部で使わないなら定義するå¿
    1180 è¦
    1181 ã¯ãªã„.
    1182 
    1183 3.6 標準的な定義の上書き
    1184 
    1185 t_stddef.hに含まれるTOPPERSå
    1186 ±é€šå®šç¾©ã®æ¨™æº–的な定義を上書きする場合には,
    1187 ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã‚’定義する.
    1188 
    1189 (3-6-1) TOPPERS_bool(オプション,デフォルトはint)
    1190 (3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t)
    1191 (3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ)
    1192 
    1193 ãã‚Œãžã‚Œï¼Œbool_t,SIZE,FPに型定義すべきデータ型.
    1194 
    1195 (3-6-4) UINT_C(val)(オプション,デフォルトはUを付加)
    1196 (3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加)
    1197 
    1198 ãã‚Œãžã‚Œï¼Œunsigned uint型,unsigned long型の定数を作るためのマクロ.
    1199 
    1200 (3-6-6) NULL(オプション,デフォルトは0)
    1201 
    1202 C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを
    1203 ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã—てもよい.
    1204 
    1205 (3-6-7) ERCD(mercd, sercd)(オプション)
    1206 (3-6-8) MERCD(ercd)(オプション)
    1207 (3-6-9) SERCD(ercd)(オプション)
    1208 
    1209 ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており,
    1210 å³ã‚·ãƒ•ãƒˆæ¼”算子(>>)が算術シフトされることを仮定している.多くのコンパ
    1211 ã‚¤ãƒ©ã§ã“の仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ
    1212 ã‚‰ã®å®šç¾©ã‚’上書きするå¿
    1213 è¦ãŒã‚る.
    1214 
    1215 (3-6-10) ALIGN_TYPE(addr, type)(オプション)
    1216 
    1217 ã‚¢ãƒ‰ãƒ¬ã‚¹addrが,データ型typeのアラインメント単位にアラインしているか
    1218 ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒžã‚¯ãƒ­ï¼Ž
    1219 
    1220 3.7 アサーションのための定義
    1221 
    1222 t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの
    1223 ãƒ‘ラメータがfalseになった場合)の処理を,ターゲット依存に用意するå¿
    1224 è¦ãŒ
    1225 ã‚る.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降
    1226 ã«ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„てもよい.なお,assertを無効に
    1227 ã™ã‚‹ï¼ˆNDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する
    1228 å¿
    1229 è¦ã¯ãªã„.
     8782.8 その他の設定
     879
     880(2-8-1) CLEAN_FILES                             cleanにより削除するファイル名
     881
     882cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ
     883イル名をこの変数に追加定義する.
     884
     885(2-8-2) REALCLEAN_FILES                 realcleanにより削除するファイル名
     886
     887realcleanにより削除するファイルをターゲット依存部で追加したい場合には,
     888ファイル名をこの変数に追加定義する.
     889
     890
     8913.TOPPERS共通定義のターゲット依存部
     892
     893TOPPERS共通定義(t_stddef.h)のターゲット依存部は,target_stddef.hまた
     894はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
     895部で用意されるヘッダファイルなど)に含める.
     896
     8973.1 ターゲット識別マクロ
     898
     899アプリケーションやシステムサービスでターゲットを識別するために,
     900"TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば,
     901"TOPPERS_DVE68K")をマクロ定義する.
     902
     903また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場
     904合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え
     905ば,"TOPPERS_M68K")をマクロ定義する.
     906
     9073.2 整数型の最大値・最小値・ビット数
     908
     909(3-2-1) INT_MAX                         intに格納できる最大値(C90準拠)
     910(3-2-2) INT_MIN                         intに格納できる最小値(C90準拠)
     911(3-2-3) UINT_MAX                        unsigned intに格納できる最大値(C90準拠)
     912(3-2-4) LONG_MAX                        longに格納できる最大値(C90準拠)
     913(3-2-5) LONG_MIN                        longに格納できる最小値(C90準拠)
     914(3-2-6) ULONG_MAX                       unsigned longに格納できる最大値(C90準拠)
     915(3-2-7) CHAR_BIT                        char型のビット数(C90準拠)
     916
     917整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する.
     918
     919これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した
     920limits.hが用意されている場合には,これらのマクロを定義することに代えて,
     921limits.hをインクルードすればよい.
     922
     9233.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
     924
     925(3-3-1) int8_t                          符号付き8ビット整数(オプション,C99準拠)
     926(3-3-2) uint8_t                         符号無し8ビット整数(オプション,C99準拠)
     927(3-3-3) int16_t                         符号付き16ビット整数(C99準拠)
     928(3-3-4) uint16_t                        符号無し16ビット整数(C99準拠)
     929(3-3-5) int32_t                         符号付き32ビット整数(C99準拠)
     930(3-3-6) uint32_t                        符号無し32ビット整数(C99準拠)
     931(3-3-7) int64_t                         符号付き64ビット整数(オプション,C99準拠)
     932(3-3-8) uint64_t                        符号無し64ビット整数(オプション,C99準拠)
     933(3-3-9) int128_t                        符号付き128ビット整数(オプション,C99準拠)
     934(3-3-10) uint128_t                      符号無し128ビット整数(オプション,C99準拠)
     935(3-3-11) int_least8_t           8ビット以上の符号付き整数(C99準拠)
     936(3-3-12) uint_least8_t          8ビット以上の符号無し整数(C99準拠)
     937(3-3-13) intptr_t                       ポインタを格納できるサイズの符号付き整数(C99準拠)
     938(3-3-14) uintptr_t                      ポインタを格納できるサイズの符号無し整数(C99準拠)
     939(3-3-15) INT8_MAX                       int8_tに格納できる最大値(オプション,C99準拠)
     940(3-3-16) INT8_MIN                       int8_tに格納できる最小値(オプション,C99準拠)
     941(3-3-17) UINT8_MAX                      uint8_tに格納できる最大値(オプション,C99準拠)
     942(3-3-18) INT16_MAX                      int16_tに格納できる最大値(C99準拠)
     943(3-3-19) INT16_MIN                      int16_tに格納できる最小値(C99準拠)
     944(3-3-20) UINT16_MAX                     uint16_tに格納できる最大値(C99準拠)
     945(3-3-21) INT32_MAX                      int32_tに格納できる最大値(C99準拠)
     946(3-3-22) INT32_MIN                      int32_tに格納できる最小値(C99準拠)
     947(3-3-23) UINT32_MAX                     uint32_tに格納できる最大値(C99準拠)
     948(3-3-24) INT64_MAX                      int64_tに格納できる最大値(オプション,C99準拠)
     949(3-3-25) INT64_MIN                      int64_tに格納できる最小値(オプション,C99準拠)
     950(3-3-26) UINT64_MAX                     uint64_tに格納できる最大値(オプション,C99準拠)
     951(3-3-27) INT128_MAX                     int128_tに格納できる最大値(オプション,C99準拠)
     952(3-3-28) INT128_MIN                     int128_tに格納できる最小値(オプション,C99準拠)
     953(3-3-29) UINT128_MAX            uint128_tに格納できる最大値(オプション,C99準拠)
     954(3-3-30) INT_LEAST8_MAX         int_least8_tに格納できる最大値(C99準拠)
     955(3-3-31) INT_LEAST8_MIN         int_least8_tに格納できる最小値(C99準拠)
     956(3-3-32) UINT_LEAST8_MAX        uint_least8_tに格納できる最大値(C99準拠)
     957(3-3-33) INT8_C(val)            int_least8_t型の定数を作るマクロ(C99準拠)
     958(3-3-34) UINT8_C(val)           uint_least8_t型の定数を作るマクロ(C99準拠)
     959(3-3-35) INT16_C(val)           int16_t型の定数を作るマクロ(C99準拠)
     960(3-3-36) UINT16_C(val)          uint16_t型の定数を作るマクロ(C99準拠)
     961(3-3-37) INT32_C(val)           int32_t型の定数を作るマクロ(C99準拠)
     962(3-3-38) UINT32_C(val)          uint32_t型の定数を作るマクロ(C99準拠)
     963(3-3-39) INT64_C(val)           int64_t型の定数を作るマクロ(オプション,C99準拠)
     964(3-3-40) UINT64_C(val)          uint64_t型の定数を作るマクロ(オプション,C99準拠)
     965(3-3-41) INT128_C(val)          int128_t型の定数を作るマクロ(オプション,C99準拠)
     966(3-3-42) UINT128_C(val)         uint128_t型の定数を作るマクロ(オプション,C99準拠)
     967
     968指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ
     969型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ
     970ルにマクロ定義する.
     971
     972これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99
     973に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク
     974ロを定義することに代えて,stdint.hをインクルードすればよい.
     975
     976上でオプションと記述したものは,該当するデータ型がコンパイラでサポート
     977されている場合にのみ定義することを示す.
     978
     9793.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
     980
     981(3-4-1) float32_t                       IEEE754準拠の32ビット単精度浮動小数点数(オプ
     982                                                        ション)
     983(3-4-2) double64_t                      IEEE754準拠の64ビット倍精度浮動小数点数(オプ
     984                                                        ション)
     985(3-4-3) FLOAT32_MIN                     float32_tに格納できる最小の正規化された正の浮
     986                                                        動小数点数(オプション)
     987(3-4-4) FLOAT32_MAX                     float32_tに格納できる表現可能な最大の有限浮動
     988                                                        小数点数(オプション)
     989(3-4-5) DOUBLE64_MIN            double64_tに格納できる最小の正規化された正の浮
     990                                                        動小数点数(オプション)
     991(3-4-6) DOUBLE64_MAX            double64_tに格納できる表現可能な最大の有限浮動
     992                                                        小数点数(オプション)
     993
     994指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す
     995る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク
     996ロ定義する.
     997
     998いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定
     999義する.
     1000
     10013.5 コンパイラの拡張機能のためのマクロ定義
     1002
     1003コンパイラの拡張機能を用いるためのマクロとして,必要に応じて,以下のマ
     1004クロの定義を含める.
     1005
     1006(3-5-1) inline(オプション,デフォルトは未定義)
     1007(3-5-2) Inline(オプション,デフォルトはstatic inline)
     1008
     1009インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル
     1010なインライン関数であることを示す.
     1011
     1012(3-5-3) asm(オプション,デフォルトは未定義)
     1013(3-5-4) Asm(オプション,デフォルトは未定義)
     1014
     1015インラインアセンブラを記述するための指定.Asmは,最適化により削除しては
     1016ならないことを示す.これらは,ターゲット依存部でのみ使うマクロであるた
     1017め,ターゲット依存部で使わないなら定義する必要はない.
     1018
     1019(3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり)
     1020
     1021構造体structureの中での,フィールドfieldのオフセットを求めるマクロ.
     1022
     1023(3-5-6) alignof(type)(オプション,デフォルトの定義あり)
     1024
     1025データ型typeのアラインメント単位を求めるマクロ.
     1026
     1027(3-5-7) NoReturn(オプション,デフォルトは未定義)
     1028
     1029リターンすることのない関数であることを示す指定.これは,ターゲット依存
     1030部のみ使うマクロであるため,ターゲット依存部で使わないなら定義する必要
     1031はない.
     1032
     10333.6 標準的な定義の上書き
     1034
     1035t_stddef.hに含まれるTOPPERS共通定義の標準的な定義を上書きする場合には,
     1036以下のマクロを定義する.
     1037
     1038(3-6-1) TOPPERS_bool(オプション,デフォルトはint)
     1039(3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t)
     1040(3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ)
     1041
     1042それぞれ,bool_t,SIZE,FPに型定義すべきデータ型.
     1043
     1044(3-6-4) UINT_C(val)(オプション,デフォルトはUを付加)
     1045(3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加)
     1046
     1047それぞれ,unsigned uint型,unsigned long型の定数を作るためのマクロ.
     1048
     1049(3-6-6) NULL(オプション,デフォルトは0)
     1050
     1051C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを
     1052インクルードしてもよい.
     1053
     1054(3-6-7) ERCD(mercd, sercd)(オプション)
     1055(3-6-8) MERCD(ercd)(オプション)
     1056(3-6-9) SERCD(ercd)(オプション)
     1057
     1058ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており,
     1059右シフト演算子(>>)が算術シフトされることを仮定している.多くのコンパ
     1060イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ
     1061らの定義を上書きする必要がある.
     1062
     1063(3-6-10) ALIGN_TYPE(addr, type)(オプション)
     1064
     1065アドレスaddrが,データ型typeのアラインメント単位にアラインしているか
     1066チェックするマクロ.
     1067
     10683.7 アサーションのための定義
     1069
     1070t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの
     1071パラメータがfalseになった場合)の処理を,ターゲット依存に用意する必要が
     1072ある.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降
     1073にインクルードされるファイルに含まれていてもよい.なお,assertを無効に
     1074する(NDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する
     1075必要はない.
    12301076
    12311077(3-7-1) TOPPERS_assert_abort(void)
    12321078
    1233 assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ
    1234 ãƒãƒƒã‚¬ã«è½ã¨ã™ã®ãŒç†æƒ³çš„である.システム稼働時には例外処理を行わせるこ
    1235 ã¨ã«ãªã‚‹ï¼Ž
     1079assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ
     1080バッガに落とすのが理想的である.システム稼働時には例外処理を行わせるこ
     1081とになる.
    12361082
    12371083(3-7-2) TOPPERS_assert_fail(exp, file, line)
    12381084
    1239 assertが失敗した時のæƒ
    1240 å ±ã‚’表示/記録するためのマクロ.システムログ機能を
    1241 ç”¨ã„る場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま
    1242 ã‚Œã¦ã„るので,ターゲット依存部で用意するå¿
    1243 è¦ã¯ãªã„.
    1244 
    1245 
    1246 ï¼”.システムインタフェースレイヤ(SIL)のターゲット依存部
    1247 
    1248 ã‚·ã‚¹ãƒ†ãƒ ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ¬ã‚¤ãƒ¤ï¼ˆSIL,sil.h)のターゲット依存部の定義は,
    1249 target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ
    1250 ãƒ—・開発環境依存部で用意されるヘッダファイルなど)に含める.
    1251 
    1252 SILのサービスコールは,任意のシステム状æ
    1253 ‹ã§å‘¼ã³å‡ºã™ã“とができる.そのた
    1254 ã‚ï¼ŒSILのターゲット依存部の関数は,任意のシステム状æ
    1255 ‹ã§å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«
    1256 å®Ÿè£
    1257 ã—なければならない.
    1258 
    1259 4.1 å
    1260 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1261 ‹ã®ç®¡ç†
    1262 
    1263 SILのターゲット依存部では,å
    1264 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1265 ‹ã¸é·ç§»ã™ã‚‹æ©Ÿèƒ½ã¨ï¼Œå
    1266 ƒã®çŠ¶æ
    1267 ‹
    1268 ã¸æˆ»ã™æ©Ÿèƒ½ï¼ˆå
    1269 ƒã®çŠ¶æ
    1270 ‹ã‚’記憶するために変数を使う)を提供する.å
    1271 ¨å‰²è¾¼ã¿ãƒ­ãƒƒ
    1272 ã‚¯çŠ¶æ
    1273 ‹ã§ã‚るかを判別する機能は提供するå¿
    1274 è¦ãŒãªã„.
    1275 
    1276 SILの機能は,カーネルを使用しない場合にも使用できるå¿
    1277 è¦ãŒã‚る.そのため,
    1278 å
    1279 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1280 ‹ã¸ã®é·ç§»ã¨å
    1281 ƒã®çŠ¶æ
    1282 ‹ã¸ã®å¾©å¸°ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã‚’用いず,プロ
    1283 ã‚»ãƒƒã‚µã®ãƒªã‚½ãƒ¼ã‚¹ã‚’直接操作することによって実現する.また,å
    1284 ¨å‰²è¾¼ã¿ãƒ­ãƒƒ
    1285 ã‚¯çŠ¶æ
    1286 ‹ã¸ã®é·ç§»ã¨å
    1287 ƒã®çŠ¶æ
    1288 ‹ã¸ã®å¾©å¸°ã¯ï¼Œå
    1289 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1290 ‹ã‚„CPUロック状æ
    1291 ‹ã§
    1292 ã‚‚行えるå¿
    1293 è¦ãŒã‚る.
    1294 
    1295 ä¿è­·æ©Ÿèƒ½ã‚’持ったカーネルでは,ユーザタスクからプロセッサのリソースを直
    1296 æŽ¥æ“ä½œã™ã‚‹ã“とができないため,ユーザタスクからはこれらの機能を用いるこ
    1297 ã¨ãŒã§ããªã„.用いた場合の振舞いはターゲットプロセッサに依存するが,å
    1298 ¸
    1299 åž‹çš„には,特権命令違反などのCPU例外が発生することになる.
     1085assertが失敗した時の情報を表示/記録するためのマクロ.システムログ機能を
     1086用いる場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま
     1087れているので,ターゲット依存部で用意する必要はない.
     1088
     1089
     10904.システムインタフェースレイヤ(SIL)のターゲット依存部
     1091
     1092システムインタフェースレイヤ(SIL,sil.h)のターゲット依存部の定義は,
     1093target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ
     1094プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
     1095
     1096SILのサービスコールは,任意のシステム状態で呼び出すことができる.そのた
     1097め,SILのターゲット依存部の関数は,任意のシステム状態で呼び出せるように
     1098実装しなければならない.
     1099
     11004.1 全割込みロック状態の管理
     1101
     1102SILのターゲット依存部では,全割込みロック状態へ遷移する機能と,元の状態
     1103へ戻す機能(元の状態を記憶するために変数を使う)を提供する.全割込みロッ
     1104ク状態であるかを判別する機能は提供する必要がない.
     1105
     1106SILの機能は,カーネルを使用しない場合にも使用できる必要がある.そのため,
     1107全割込みロック状態への遷移と元の状態への復帰は,カーネルを用いず,プロ
     1108セッサのリソースを直接操作することによって実現する.また,全割込みロッ
     1109ク状態への遷移と元の状態への復帰は,全割込みロック状態やCPUロック状態で
     1110も行える必要がある.
     1111
     1112保護機能を持ったカーネルでは,ユーザタスクからプロセッサのリソースを直
     1113接操作することができないため,ユーザタスクからはこれらの機能を用いるこ
     1114とができない.用いた場合の振舞いはターゲットプロセッサに依存するが,典
     1115型的には,特権命令違反などのCPU例外が発生することになる.
    13001116
    13011117(4-1-1) SIL_PRE_LOC
    13021118
    1303 å
    1304 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ãƒ•ãƒ©ã‚°ã®çŠ¶æ
    1305 ‹ã‚’保存するための変数を定義するマクロ.型名の
    1306 å¾Œã«ï¼Œå¤‰æ•°åã‚’続けたものに定義する.変数名は,他の名前と衝突しないよう
    1307 ã«ï¼Œ"TOPPERS_"で始まる名前にする.
     1119全割込みロックフラグの状態を保存するための変数を定義するマクロ.型名の
     1120後に,変数名を続けたものに定義する.変数名は,他の名前と衝突しないよう
     1121に,"TOPPERS_"で始まる名前にする.
    13081122
    13091123(4-1-2) SIL_LOC_INT()
    13101124
    1311 ç¾åœ¨ã®å
    1312 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ãƒ•ãƒ©ã‚°ã®çŠ¶æ
    1313 ‹ã‚’SIL_PRE_LOCで定義した変数に保存し,å
    1314 ¨
    1315 å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1316 ‹ã«é·ç§»ã•ã›ã‚‹ãƒžã‚¯ãƒ­ï¼Žã“のマクロを実現する際には,「1.6
    1317 ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®å‡ºå
    1318 ¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„」の節に記述されてい
    1319 ã‚‹åˆ¶ç´„に従わなければならない.
     1125現在の全割込みロックフラグの状態をSIL_PRE_LOCで定義した変数に保存し,全
     1126割込みロック状態に遷移させるマクロ.このマクロを実現する際には,「1.6
     1127クリティカルセクションの出入処理の実現に関する制約」の節に記述されてい
     1128る制約に従わなければならない.
    13201129
    13211130(4-1-3) SIL_UNL_INT()
    13221131
    1323 SIL_LOC_INT()によって変数に保存した状æ
    1324 ‹ã«æˆ»ã™ãƒžã‚¯ãƒ­ï¼Žã“のマクロを実現す
    1325 ã‚‹éš›ã«ã¯ï¼Œã€Œ1.6 クリティカルセクションの出å
    1326 ¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„」の
    1327 ç¯€ã«è¨˜è¿°ã•ã‚Œã¦ã„る制約に従わなければならない.
    1328 
    1329 4.2 微少時間å¾
    1330 ã¡
     1132SIL_LOC_INT()によって変数に保存した状態に戻すマクロ.このマクロを実現す
     1133る際には,「1.6 クリティカルセクションの出入処理の実現に関する制約」の
     1134節に記述されている制約に従わなければならない.
     1135
     11364.2 微少時間待ち
    13311137
    13321138(4-2-1) void sil_dly_nse(ulong_t dlytim)
    13331139
    1334 dlytimで指定された以上の時間(単位はナノ秒),ループなどによってå¾
    1335 ã¤é–¢
    1336 æ•°ï¼Ž
    1337 
    1338 ä»¥ä¸‹ã®é–¢æ•°ã¨ç­‰ä¾¡ãªå‡¦ç†ã‚’,アセンブリ言語で記述する方法を,標準的な実è£
    1339 
    1340 æ–¹æ³•ã¨ã™ã‚‹ï¼Žã‚¢ã‚»ãƒ³ãƒ–リ言語で記述するのは,コンパイラの最適化に依存しな
    1341 ã„ようにするためである.またこの関数は,キャッシュ等の影響を受けないよ
    1342 ã†ã«ï¼Œã§ãã‚‹é™ã‚Šãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ã‚’行わないように実è£
    1343 ã™ã¹ãã§ã‚る.
     1140dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ関
     1141数.
     1142
     1143以下の関数と等価な処理を,アセンブリ言語で記述する方法を,標準的な実装
     1144方法とする.アセンブリ言語で記述するのは,コンパイラの最適化に依存しな
     1145いようにするためである.またこの関数は,キャッシュ等の影響を受けないよ
     1146うに,できる限りメモリアクセスを行わないように実装すべきである.
    13441147
    13451148        void sil_dly_nse(ulong_t dlytim)
    13461149        {
    13471150                dlytim -= SIL_DLY_TIM1;
    1348                 if (結果が0より大きい) {
     1151                if (結果が0より大きい) {
    13491152                        do {
    13501153                                dlytim -= SIL_DLY_TIM2;
    1351                         } while (結果が0より大きい);
     1154                        } while (結果が0より大きい);
    13521155                }
    13531156        }
    13541157
    1355 ã“の関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最
    1356 åˆã®if文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ
    1357 ã‚Šå¤§ããï¼Œ(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は
    1358 æˆç«‹ã™ã‚‹ãŒï¼Œdoループは1回も回らずに関数から抜ける.dlytimが
    1359 (SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以
    1360 ä¸‹ã®å ´åˆã«ã¯ï¼Œdoループを1回だけ回って関数から抜ける.その後,dlytimが
    1361 SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える.
    1362 
    1363 ãªãŠï¼Œã“の関数をアセンブリ言語(または,C言語)で記述する場合,どのファ
    1364 ã‚¤ãƒ«ã«è¨˜è¿°ã™ã‚‹ã‹ãŒå•é¡Œã«ãªã‚‹ï¼ŽSILのターゲット依存部には,標準では,アセ
    1365 ãƒ³ãƒ–リ言語(または,C言語)の関数定義を記述するためのファイルを用意して
    1366 ã„ない.ターゲット依存で用意してもよいが,例外的に,カーネル実è£
    1367 ã®ã‚¿ãƒ¼
    1368 ã‚²ãƒƒãƒˆä¾å­˜ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ï¼ˆtarget_support.Sまたはtarget_config.c)に記述して
    1369 ã‚‚よいことにする.
    1370 
    1371 (4-2-2) SIL_DLY_TIM1(オプション)
    1372 (4-2-3) SIL_DLY_TIM2(オプション)
    1373 
    1374 sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ
    1375 ãƒˆä¾å­˜éƒ¨ã§ãƒžã‚¯ãƒ­å®šç¾©ã™ã‚‹ï¼Ž
    1376 
    1377 SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒)
    1378 ã«è¨­å®šã™ã‚‹ï¼Žã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ—ロセッサの命令セットにもよるが,おおよそ,減算
    1379 å‘½ä»¤ã¨æ¡ä»¶åˆ†å²å‘½ä»¤å„1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼
    1380 å‡ºã—も含めたå
    1381 ¨ä½“の時間がdlytimで指定された以上の時間になるように,
    1382 SIL_DLY_TIM1を決める.
    1383 
    1384 ã“の2つの定数値の決定を支援するプログラムとして,testディレクトリに,
    1385 test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得
    1386 ã‚‰ã‚Œã‚‹ï¼Ž
     1158この関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最
     1159初のif文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ
     1160り大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は
     1161成立するが,doループは1回も回らずに関数から抜ける.dlytimが
     1162(SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以
     1163下の場合には,doループを1回だけ回って関数から抜ける.その後,dlytimが
     1164SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える.
     1165
     1166なお,この関数をアセンブリ言語(または,C言語)で記述する場合,どのファ
     1167イルに記述するかが問題になる.SILのターゲット依存部には,標準では,アセ
     1168ンブリ言語(または,C言語)の関数定義を記述するためのファイルを用意して
     1169いない.ターゲット依存で用意してもよいが,例外的に,カーネル実装のター
     1170ゲット依存モジュール(target_support.Sまたはtarget_config.c)に記述して
     1171もよいことにする.
     1172
     1173(4-2-2) SIL_DLY_TIM1(オプション)
     1174(4-2-3) SIL_DLY_TIM2(オプション)
     1175
     1176sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ
     1177ト依存部でマクロ定義する.
     1178
     1179SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒)
     1180に設定する.ターゲットプロセッサの命令セットにもよるが,おおよそ,減算
     1181命令と条件分岐命令各1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼
     1182出しも含めた全体の時間がdlytimで指定された以上の時間になるように,
     1183SIL_DLY_TIM1を決める.
     1184
     1185この2つの定数値の決定を支援するプログラムとして,testディレクトリに,
     1186test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得
     1187られる.
    13871188
    13881189-- for fitting parameters --
     
    13911192sil_dly_nse(510): 520 OK
    13921193sil_dly_nse(600): 610 OK
    1393 <中略>
     1194<中略>
    13941195-- for checking boundary conditions --
    13951196sil_dly_nse(421): 520 OK
     
    13971198sil_dly_nse(601): 700 OK
    13981199
    1399 "for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場
    1400 åˆã®å¾
    1401 ã¡æ™‚間を測定した結果である.このプログラムを用いて,":"の右側の数
    1402 å€¤ãŒï¼Œdlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を
    1403 èª¿æ•´ã™ã‚‹ï¼Ž"for checking boundary conditions"に続く出力は,プログラムの
    1404 å¦¥å½“性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい
    1405 ã“とを確認する(近い値になるå¿
    1406 è¦ã¯ãªã„).
    1407 
    1408 4.3 プロセッサのエンディアン
     1200"for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場
     1201合の待ち時間を測定した結果である.このプログラムを用いて,":"の右側の数
     1202値が,dlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を
     1203調整する."for checking boundary conditions"に続く出力は,プログラムの
     1204妥当性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい
     1205ことを確認する(近い値になる必要はない).
     1206
     12074.3 プロセッサのエンディアン
    14091208
    14101209(4-3-1) SIL_ENDIAN_BIG
    14111210(4-3-2) SIL_ENDIAN_LITTLE
    14121211
    1413 ãƒ—ロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する.
    1414 
    1415 (4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション)
    1416 (4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション)
    1417 
    1418 ãã‚Œãžã‚Œï¼Œ16ビット,32ビットの符号無し整数のエンディアンを反転させるマ
    1419 ã‚¯ãƒ­ï¼Žãƒ—ロセッサがエンディアン反転のための命令を持つ場合には,その命令
    1420 ã‚’用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル
    1421 ãƒˆã®å®šç¾©ãŒä½¿ã‚ã‚Œã‚‹ï¼Ž
    1422 
    1423 4.4 メモリ空間アクセス関数
     1212プロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する.
     1213
     1214(4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション)
     1215(4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション)
     1216
     1217それぞれ,16ビット,32ビットの符号無し整数のエンディアンを反転させるマ
     1218クロ.プロセッサがエンディアン反転のための命令を持つ場合には,その命令
     1219を用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル
     1220トの定義が使われる.
     1221
     12224.4 メモリ空間アクセス関数
    14241223
    14251224(4-4-1) TOPPERS_OMIT_SIL_ACCESS
    14261225
    1427 æ¨™æº–のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合
    1428 ã«ã¯ï¼Œã“のシンボルをマクロ定義する.
     1226標準のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合
     1227には,このシンボルをマクロ定義する.
    14291228
    14301229(4-4-2) TOPPERS_OMIT_SIL_REH_LEM
     
    14371236(4-4-9) TOPPERS_OMIT_SIL_WRW_BEM
    14381237
    1439 ãã‚Œãžã‚Œï¼Œæ¨™æº–のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem,
    1440 sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ
    1441 ãƒˆä¾å­˜éƒ¨ã§ç”¨æ„ã™ã‚‹å ´åˆã«ã¯ï¼Œã“れらのシンボルをマクロ定義する.
    1442 
    1443 4.5 I/O空間アクセス関数
    1444 
    1445 ãƒ¡ãƒ¢ãƒªç©ºé–“とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ
    1446 ã‚¸ã‚¹ã‚¿ã‚’アクセスするための関数として,sil_reb_iop,sil_wrb_iop,
    1447 sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep,
    1448 sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep,
    1449 sil_rew_bep,sil_wrw_bepの中でå¿
    1450 è¦ãªã‚‚のを,ターゲット依存部で用意する.
    1451 
    1452 
    1453 ï¼•ï¼Žã‚«ãƒ¼ãƒãƒ«APIのターゲット依存部
    1454 
    1455 ã‚«ãƒ¼ãƒãƒ«API(kernel.h)のターゲット依存部の定義は,target_kernel.hまた
    1456 ã¯ãã“からインクルードされるファイル(プロセッサ・チップ・開発環境依存
    1457 éƒ¨ã§ç”¨æ„ã•ã‚Œã‚‹ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ãªã©ï¼‰ã«å«ã‚ã‚‹ï¼Ž
    1458 
    1459 5.1 ターゲット定義でサポートする機能
    1460 
    1461 (5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT          dis_intをサポートする
    1462 (5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT          ena_intをサポートする
    1463 (5-1-3) TOPPERS_TARGET_SUPPORT_GET_UTM          get_utmをサポートする
    1464 
    1465 dis_int,ena_int,get_utmをサポートする場合に,それぞれのシンボルをマク
    1466 ãƒ­å®šç¾©ã™ã‚‹ï¼Ž
    1467 
    1468 5.2 割込み優å
    1469 ˆåº¦ã®ç¯„囲
    1470 
    1471 (5-2-1) TMIN_INTPRI                             å‰²è¾¼ã¿å„ªå
    1472 ˆåº¦ã®æœ€å°å€¤ï¼ˆæœ€é«˜å€¤ï¼‰
    1473 (5-2-2) TMAX_INTPRI                             å‰²è¾¼ã¿å„ªå
    1474 ˆåº¦ã®æœ€å¤§å€¤ï¼ˆæœ€ä½Žå€¤ï¼‰
    1475 
    1476 ãã‚Œãžã‚Œï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã®å‰²è¾¼ã¿å„ªå
    1477 ˆåº¦ã®æœ€å°å€¤ï¼ˆï¼å„ªå
    1478 ˆåº¦ãŒæœ€é«˜ï¼‰ï¼Œã‚«ãƒ¼ãƒ
    1479 ãƒ«ç®¡ç†ã®å‰²è¾¼ã¿å„ªå
    1480 ˆåº¦ã®æœ€å¤§å€¤ï¼ˆå„ªå
    1481 ˆåº¦ãŒæœ€ä½Žï¼‰ã«å®šç¾©ã™ã‚‹ï¼ŽTMAX_INTPRIは-1
    1482 ã«å›ºå®šã•ã‚Œã¦ã„るが,対称性のために,ターゲット依存部で定義することにし
    1483 ã¦ã„る.
    1484 
    1485 5.3 タイムティックの定義
    1486 
    1487 (5-3-1) TIC_NUME                                タイムティックの周期の分子
    1488 (5-3-2) TIC_DENO                                タイムティックの周期の分母
    1489 
    1490 ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã®å‘¨æœŸï¼ˆsignal_timeを呼び出す周期)を,ミリ秒単位で,
    1491 TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合
    1492 ã«ã¯ï¼ŒTIC_NUMEを100に,TIC_DENOを3に定義すればよい.
    1493 
    1494 ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã®å‘¨æœŸã¯ï¼Œ1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1
    1495 ã«å®šç¾©ã™ã‚‹ï¼‰ã“とを推奨するが,シミュレーション環境や性能の低いプロセッ
    1496 ã‚µã§ãã‚ŒãŒé©åˆ‡ã§ãªã„場合には,それ以外の値としてもよい.その場合でも,
    1497 å¯èƒ½ãªé™ã‚Šï¼Œ1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが
    1498 æœ›ã¾ã—い.
    1499 
    1500 TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で
    1501 ãã‚‹ã‚ˆã†ã«ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’実è£
    1502 ã™ã‚‹å ´åˆã«ã¯ï¼Œã“の2つの定数の定義はデフォ
    1503 ãƒ«ãƒˆå€¤ã‚’与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」
    1504 ã€Œ#endif」で囲んで記述する.
    1505 
    1506 5.4 メモリ領域確保のための型定義
    1507 
    1508 (5-4-1) TOPPERS_STK_T   ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã‚’確保するための型(オプション)
    1509 (5-4-2) TOPPERS_MPF_T   å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール領域を確保するための型(オプション)
    1510 
    1511 ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã¨å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール領域は,標準では,intptr_t型のé
    1512 åˆ—とし
    1513 ã¦ç¢ºä¿ã™ã‚‹ãŒï¼Œã‚ˆã‚Šå¤§ãã„単位でアラインさせたいなどの理由で,それ以外の
    1514 åž‹ã®é
    1515 åˆ—として確保する場合には,それぞれTOPPERS_STK_TとTOPPERS_MPF_Tを,
    1516 é
    1517 åˆ—のベースとなるデータ型にマクロ定義する.
    1518 
    1519 5.5 ビットパターンのビット数
    1520 
    1521 (5-5-1) TBIT_TEXPTN             ã‚¿ã‚¹ã‚¯ä¾‹å¤–要因のビット数(オプション)
    1522 (5-5-2) TBIT_FLGPTN             ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°ã®ãƒ“ット数(オプション)
    1523 
    1524 TBIT_TEXPTN,TBIT_FLGPTNの標準の定義では,整数型の有効ビット数が,その
    1525 åž‹ã®sizeofにCHAR_BITを乗じたものと一致していることを仮定している.多く
    1526 ã®ã‚³ãƒ³ãƒ‘イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存
    1527 éƒ¨ã§ã“れらの定義を上書きするå¿
    1528 è¦ãŒã‚る.ただし,これらの値は16以上でな
    1529 ã‘ればならない.
    1530 
    1531 5.6 メモリ領域確保のためのマクロ
    1532 
    1533 (5-6-1) TOPPERS_ROUND_SZ(オプション)
    1534 (5-6-2) TOPPERS_COUNT_SZ(オプション)
    1535 
    1536 TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ
    1537 ã‚¤ã‚ºãŒszのメモリ領域をサイズがunitのデータ型のé
    1538 åˆ—で確保する場合の要素
    1539 æ•°ã‚’求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ
    1540 ãŸã‚‚のにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ
    1541 ãŒunitのデータ型のé
    1542 åˆ—で確保する場合のトータルサイズを求めるために用い
    1543 ã‚‹ï¼Ž
    1544 
    1545 ãã‚Œãžã‚Œï¼Œæ¨™æº–のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ
    1546 ãƒˆä¾å­˜éƒ¨ã§ç”¨æ„ã™ã‚‹å ´åˆã«ã¯ï¼Œã“れらのシンボルを適切な値にマクロ定義する.
    1547 
    1548 5.7 オーバランハンドラ機能拡張のための定義(オプション)
    1549 
    1550 ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージをサポートする(使用できるようにす
    1551 ã‚‹ï¼‰å ´åˆã«ã¯ï¼Œæ¬¡ã®3つを実施することがå¿
    1552 è¦ã§ã‚る.
    1553 
    1554 ãƒ»ã“の節で説明する定義を行う.
    1555 ãƒ»ï¼–章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されている場
    1556 ã€€åˆã«ã®ã¿æœ‰åŠ¹ã¨ãªã‚‹ã‚³ãƒ¼ãƒ‰ã‚’実è£
    1557 ã™ã‚‹ï¼Ž
    1558 ãƒ»ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’用意する.オーバランタイマドライバについて
    1559 ã€€ã¯ï¼Œã€Œ6.14 オーバランタイマドライバ」の節を参ç
    1560 §ã™ã‚‹ã“と.
     1238それぞれ,標準のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem,
     1239sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ
     1240ト依存部で用意する場合には,これらのシンボルをマクロ定義する.
     1241
     12424.5 I/O空間アクセス関数
     1243
     1244メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ
     1245ジスタをアクセスするための関数として,sil_reb_iop,sil_wrb_iop,
     1246sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep,
     1247sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep,
     1248sil_rew_bep,sil_wrw_bepの中で必要なものを,ターゲット依存部で用意する.
     1249
     1250
     12515.カーネルAPIのターゲット依存部
     1252
     1253カーネルAPI(kernel.h)のターゲット依存部の定義は,target_kernel.hまた
     1254はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
     1255部で用意されるヘッダファイルなど)に含める.
     1256
     12575.1 ターゲット定義でサポートする機能
     1258
     1259(5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT          dis_intをサポートする
     1260(5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT          ena_intをサポートする
     1261(5-1-3) TOPPERS_TARGET_SUPPORT_GET_UTM          get_utmをサポートする
     1262
     1263dis_int,ena_int,get_utmをサポートする場合に,それぞれのシンボルをマク
     1264ロ定義する.
     1265
     12665.2 割込み優先度の範囲
     1267
     1268(5-2-1) TMIN_INTPRI                             割込み優先度の最小値(最高値)
     1269(5-2-2) TMAX_INTPRI                             割込み優先度の最大値(最低値)
     1270
     1271それぞれ,カーネル管理の割込み優先度の最小値(=優先度が最高),カーネ
     1272ル管理の割込み優先度の最大値(優先度が最低)に定義する.TMAX_INTPRIは-1
     1273に固定されているが,対称性のために,ターゲット依存部で定義することにし
     1274ている.
     1275
     12765.3 タイムティックの定義
     1277
     1278(5-3-1) TIC_NUME                                タイムティックの周期の分子
     1279(5-3-2) TIC_DENO                                タイムティックの周期の分母
     1280
     1281タイムティックの周期(signal_timeを呼び出す周期)を,ミリ秒単位で,
     1282TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合
     1283には,TIC_NUMEを100に,TIC_DENOを3に定義すればよい.
     1284
     1285タイムティックの周期は,1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1
     1286に定義する)ことを推奨するが,シミュレーション環境や性能の低いプロセッ
     1287サでそれが適切でない場合には,それ以外の値としてもよい.その場合でも,
     1288可能な限り,1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが
     1289望ましい.
     1290
     1291TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で
     1292きるようにタイマドライバを実装する場合には,この2つの定数の定義はデフォ
     1293ルト値を与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」
     1294「#endif」で囲んで記述する.
     1295
     12965.4 メモリ領域確保のための型定義
     1297
     1298(5-4-1) TOPPERS_STK_T   スタック領域を確保するための型(オプション)
     1299(5-4-2) TOPPERS_MPF_T   固定長メモリプール領域を確保するための型(オプション)
     1300
     1301スタック領域と固定長メモリプール領域は,標準では,intptr_t型の配列とし
     1302て確保するが,より大きい単位でアラインさせたいなどの理由で,それ以外の
     1303型の配列として確保する場合には,それぞれTOPPERS_STK_TとTOPPERS_MPF_Tを,
     1304配列のベースとなるデータ型にマクロ定義する.
     1305
     13065.5 ビットパターンのビット数
     1307
     1308(5-5-1) TBIT_TEXPTN             タスク例外要因のビット数(オプション)
     1309(5-5-2) TBIT_FLGPTN             イベントフラグのビット数(オプション)
     1310
     1311TBIT_TEXPTN,TBIT_FLGPTNの標準の定義では,整数型の有効ビット数が,その
     1312型のsizeofにCHAR_BITを乗じたものと一致していることを仮定している.多く
     1313のコンパイラでこの仮定が成り立つが,そうでない場合には,ターゲット依存
     1314部でこれらの定義を上書きする必要がある.ただし,これらの値は16以上でな
     1315ければならない.
     1316
     13175.6 メモリ領域確保のためのマクロ
     1318
     1319(5-6-1) TOPPERS_ROUND_SZ(オプション)
     1320(5-6-2) TOPPERS_COUNT_SZ(オプション)
     1321
     1322TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ
     1323イズがszのメモリ領域をサイズがunitのデータ型の配列で確保する場合の要素
     1324数を求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ
     1325たものにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ
     1326がunitのデータ型の配列で確保する場合のトータルサイズを求めるために用い
     1327る.
     1328
     1329それぞれ,標準のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ
     1330ト依存部で用意する場合には,これらのシンボルを適切な値にマクロ定義する.
     1331
     13325.7 オーバランハンドラ機能拡張のための定義(オプション)
     1333
     1334オーバランハンドラ機能拡張パッケージをサポートする(使用できるようにす
     1335る)場合には,次の3つを実施することが必要である.
     1336
     1337・この節で説明する定義を行う.
     1338・6章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されている場
     1339 合にのみ有効となるコードを実装する.
     1340・オーバランタイマドライバを用意する.オーバランタイマドライバについて
     1341 は,「6.14 オーバランタイマドライバ」の節を参照すること.
    15611342
    15621343(5-7-1) TOPPERS_TARGET_SUPPORT_OVRHDR
    15631344
    1564 ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージをサポートする場合には,このシンボ
    1565 ãƒ«ã‚’マクロ定義する.
    1566 
    1567 (5-7-2) TMAX_OVRTIM(オプション,デフォルトはULONG_MAX)
    1568 
    1569 ãƒ—ロセッサ時間としてオーバランタイマに設定できる最大値(単位はマイクロ
    1570 ç§’)にマクロ定義する.
    1571 
    1572 
    1573 ï¼–.カーネル実è£
    1574 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
    1575 
    1576 6.1 カーネル実è£
    1577 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®å
    1578 ±é€šäº‹é 
    1579 
    1580 
    1581 6.1.1 カーネル実è£
    1582 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®æ§‹æˆè¦ç´ 
    1583 
    1584 ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    1585 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼Œä»¥ä¸‹ã®è¦ç´ ã§æ§‹æˆã•ã‚Œã‚‹ï¼Ž
    1586 
    1587 (a) カーネル実è£
    1588 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®å®šç¾©
    1589 
    1590 ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    1591 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã‹ã‚‰å‚ç
    1592 §ã•ã‚Œã‚‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®å®šç¾©ã¯ï¼Œ
    1593 target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ
    1594 ãƒ—・開発環境依存部で用意されるヘッダファイルなど)に含める.
    1595 
    1596 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢è³‡æºï¼ˆå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ã‚„CPU例外ハンドラ番号,
    1597 ãƒ‡ãƒã‚¤ã‚¹ãƒ¬ã‚¸ã‚¹ã‚¿ã®ç•ªåœ°ãªã©ï¼‰ã®å®šç¾©ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スやアプリケーショ
    1598 ãƒ³ã«ã‚‚有用であるため,カーネル実è£
    1599 ã®ã¿ã«æœ‰ç”¨ãªå®šç¾©ã‚’含むファイルとは切
    1600 ã‚Šåˆ†ã‘て,独立したヘッダファイルに含める.このヘッダファイルの標準的な
    1601 åç§°ã‚’,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする.
    1602 
    1603 (b) カーネル実è£
    1604 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«
    1605 
    1606 ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    1607 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®å¤‰æ•°å®šç¾©ã‚„関数を含むモジュール.C言語で記
    1608 è¿°ã•ã‚Œã‚‹éƒ¨åˆ†ã‚’target_config.c,アセンブリ言語で記述される部分を
    1609 target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け
    1610 ã‚‹ã“とや,ファイルが大きくなる場合に複数のファイルに分割することも可能
    1611 ã§ã‚る.
    1612 
    1613 (c) カーネル実è£
    1614 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãŸã‚ã®ãƒªãƒãƒ¼ãƒ è¨˜è¿°
    1615 
    1616 ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    1617 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®å¤‰æ•°åã‚„関数名を,å
    1618 ˆé ­ã«_kernel_を付与
    1619 ã—た名前にリネームするためのモジュール.target_rename.defを用意し,ツー
    1620 ãƒ«ï¼ˆutils/genrename)により,target_rename.hとtarget_unrename.hを生成す
    1621 ã‚‹ï¼Žãƒ—ロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記
    1622 è¿°ã‚‚切り分ける.
    1623 
    1624 (d) タイマドライバ
    1625 
    1626 ã‚«ãƒ¼ãƒãƒ«ã«ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã‚’通知する(signal_timeを周期的に呼び出す)ため
    1627 ã®ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã®ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ï¼Œå®Ÿè£
    1628 ãƒ•ã‚¡ã‚¤ãƒ«ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼
    1629 ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã‚’,それぞれ,target_timer.h,target_timer.c,
    1630 target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け
    1631 ã‚‹ã“とも可能である.
    1632 
    1633 ã¾ãŸï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージをサポートする場合には,オー
    1634 ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©ã‚’起動する(call_ovrhdrを呼び出す)ためのオーバランタイマ
    1635 ãƒ‰ãƒ©ã‚¤ãƒã‚‚,同じファイルに含める.
    1636 
    1637 ãªãŠï¼Œã“の章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されて
    1638 ã„る場合にのみ有効となるコードは,オーバランハンドラ機能拡張パッケージ
    1639 ã‚’サポートしない場合には,実è£
    1640 ã™ã‚‹å¿
    1641 è¦ãŒãªã„.
    1642 
    1643 (e) コンフィギュレータ設定ファイル
    1644 
    1645 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‚’,target_def.csv,
    1646 target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの
    1647 è¨˜è¿°æ–¹æ³•ã«ã¤ã„ては,7章で説明する.
    1648 
    1649 6.1.2 ターゲット依存部の関数の命名規則
    1650 
    1651 ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    1652 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‚’構成する関数の中で,t_で始まるものはタ
    1653 ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆå°‚用,i_で始まるものは非タスクコンテキスト専用,x_で始
    1654 ã¾ã‚‹ã‚‚のはいずれのコンテキストからでも呼び出すことができる関数である.
    1655 
    1656 6.2 トレースログ機能への対応
    1657 
    1658 ã‚«ãƒ¼ãƒãƒ«ã®ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°æ©Ÿèƒ½ã®ä¸­ã§ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチャ,割込みハンドラ,CPU例
    1659 å¤–ハンドラの開始・終了のトレースログ取得は,ターゲット依存部で実è£
    1660 ã™ã‚‹
    1661 å¿
    1662 è¦ãŒã‚る.ほとんどのターゲットシステムにおいて,それらの処理はアセン
    1663 ãƒ–リ言語で記述されており,ターゲット非依存部向けのトレースログマクロと
    1664 åŒã˜æ–¹æ³•ï¼ˆãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ãƒžã‚¯ãƒ­ã‚’,トレースログ取得処理のC言語記述にマクロ
    1665 å®šç¾©ã™ã‚‹æ–¹æ³•ï¼‰ã¯ï¼Œç”¨ã„ることができない.
    1666 
    1667 ãã“で,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込
    1668 ã‚€å ´åˆã«ã¯ï¼Œãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ãƒžã‚¯ãƒ­ãŒå®šç¾©ã•ã‚Œã¦ã„れば,それが何に定義されて
    1669 ã„るかは無視して,標準的なトレースログ関数がC言語で記述されていると想定
    1670 ã—て,それを呼び出すようにコーディングする.
    1671 
    1672 å
    1673 ·ä½“的には,下の表の左側に示したトレースログマクロが定義されていれば,
    1674 è¡¨ã®å³å´ã«ç¤ºã—たC言語記述と同等の処理を行うようにコーディングする.
    1675 
    1676         トレースログマクロ             ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°å–得処理
     1345オーバランハンドラ機能拡張パッケージをサポートする場合には,このシンボ
     1346ルをマクロ定義する.
     1347
     1348(5-7-2) TMAX_OVRTIM(オプション,デフォルトはULONG_MAX)
     1349
     1350プロセッサ時間としてオーバランタイマに設定できる最大値(単位はマイクロ
     1351秒)にマクロ定義する.
     1352
     1353
     13546.カーネル実装のターゲット依存部
     1355
     13566.1 カーネル実装のターゲット依存部の共通事項
     1357
     13586.1.1 カーネル実装のターゲット依存部の構成要素
     1359
     1360カーネル実装のターゲット依存部は,以下の要素で構成される.
     1361
     1362(a) カーネル実装のターゲット依存の定義
     1363
     1364カーネル実装のターゲット非依存部から参照されるターゲット依存の定義は,
     1365target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ
     1366プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
     1367
     1368ターゲットのハードウェア資源(割込みハンドラ番号やCPU例外ハンドラ番号,
     1369デバイスレジスタの番地など)の定義は,システムサービスやアプリケーショ
     1370ンにも有用であるため,カーネル実装のみに有用な定義を含むファイルとは切
     1371り分けて,独立したヘッダファイルに含める.このヘッダファイルの標準的な
     1372名称を,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする.
     1373
     1374(b) カーネル実装のターゲット依存モジュール
     1375
     1376カーネル実装のターゲット依存の変数定義や関数を含むモジュール.C言語で記
     1377述される部分をtarget_config.c,アセンブリ言語で記述される部分を
     1378target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け
     1379ることや,ファイルが大きくなる場合に複数のファイルに分割することも可能
     1380である.
     1381
     1382(c) カーネル実装のターゲット依存部のためのリネーム記述
     1383
     1384カーネル実装のターゲット依存部の変数名や関数名を,先頭に_kernel_を付与
     1385した名前にリネームするためのモジュール.target_rename.defを用意し,ツー
     1386ル(utils/genrename)により,target_rename.hとtarget_unrename.hを生成す
     1387る.プロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記
     1388述も切り分ける.
     1389
     1390(d) タイマドライバ
     1391
     1392カーネルにタイムティックを通知する(signal_timeを周期的に呼び出す)ため
     1393のタイマドライバのヘッダファイル,実装ファイル,システムコンフィギュレー
     1394ションファイルを,それぞれ,target_timer.h,target_timer.c,
     1395target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け
     1396ることも可能である.
     1397
     1398また,オーバランハンドラ機能拡張パッケージをサポートする場合には,オー
     1399バランハンドラを起動する(call_ovrhdrを呼び出す)ためのオーバランタイマ
     1400ドライバも,同じファイルに含める.
     1401
     1402なお,この章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されて
     1403いる場合にのみ有効となるコードは,オーバランハンドラ機能拡張パッケージ
     1404をサポートしない場合には,実装する必要がない.
     1405
     1406(e) コンフィギュレータ設定ファイル
     1407
     1408コンフィギュレータの設定ファイルのターゲット依存部を,target_def.csv,
     1409target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの
     1410記述方法については,7章で説明する.
     1411
     14126.1.2 ターゲット依存部の関数の命名規則
     1413
     1414カーネル実装のターゲット依存部を構成する関数の中で,t_で始まるものはタ
     1415スクコンテキスト専用,i_で始まるものは非タスクコンテキスト専用,x_で始
     1416まるものはいずれのコンテキストからでも呼び出すことができる関数である.
     1417
     14186.2 トレースログ機能への対応
     1419
     1420カーネルのトレースログ機能の中で,ディスパッチャ,割込みハンドラ,CPU例
     1421外ハンドラの開始・終了のトレースログ取得は,ターゲット依存部で実装する
     1422必要がある.ほとんどのターゲットシステムにおいて,それらの処理はアセン
     1423ブリ言語で記述されており,ターゲット非依存部向けのトレースログマクロと
     1424同じ方法(トレースログマクロを,トレースログ取得処理のC言語記述にマクロ
     1425定義する方法)は,用いることができない.
     1426
     1427そこで,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込
     1428む場合には,トレースログマクロが定義されていれば,それが何に定義されて
     1429いるかは無視して,標準的なトレースログ関数がC言語で記述されていると想定
     1430して,それを呼び出すようにコーディングする.
     1431
     1432具体的には,下の表の左側に示したトレースログマクロが定義されていれば,
     1433表の右側に示したC言語記述と同等の処理を行うようにコーディングする.
     1434
     1435        トレースログマクロ               トレースログ取得処理
    16771436        -----------------------------------------------
    16781437        LOG_DSP_ENTER                   log_dsp_enter(p_runtsk)
     
    16831442        LOG_EXC_LEAVE                   log_exc_leave(excno)
    16841443
    1685 6.3 システム状æ
    1686 ‹ã®ç®¡ç†
    1687 
    1688 ASPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な
    1689 ä½œæ¥­ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ãŒå®šç¾©ã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ çŠ¶æ
    1690 ‹ã‚’,ハードウェア(プロセッサ)上
    1691 ã§ã©ã®ã‚ˆã†ã«å®Ÿç¾ã™ã‚‹ã‹ã§ã‚る.以下の説明は,TOPPERS新世代カーネルにおけ
    1692 ã‚‹ã‚·ã‚¹ãƒ†ãƒ çŠ¶æ
    1693 ‹ã®å®šç¾©ãƒ»æ„å‘³ã‚’知っていることを前提に記述している.
    1694 
    1695 6.3.1 å
    1696 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1697 ‹ã®ç®¡ç†
    1698 
    1699 å
    1700 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1701 ‹ã¯ï¼ŒNMIを除くすべての割込みをマスクした状æ
    1702 ‹ã§ã‚る.å
    1703 ¨
    1704 å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1705 ‹ã‚’管理する機能は,システムインタフェースレイヤ(SIL)に
    1706 ã‚ˆã£ã¦æä¾›ã•ã‚Œï¼Œã‚«ãƒ¼ãƒãƒ«ã¯å
    1707 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1708 ‹ã‚’管理しない.
    1709 
    1710 å
    1711 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1712 ‹ã§ã¯ï¼Œsns_kerとext_ker以外のカーネルのサービスコール
    1713 ã‚’呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して
    1714 ã„ない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの
    1715 ã‚µãƒ¼ãƒ“スコールを除くと,call_exit_kernelのみである.そのため,
    1716 call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の
    1717 é–¢æ•°ãŒï¼Œå
    1718 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1719 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹çŠ¶æ³ã¯è€ƒãˆã‚‹å¿
    1720 è¦ãŒãªã„.
    1721 
    1722 6.3.2 コンテキストの管理
    1723 
    1724 å‡¦ç†å˜ä½ãŒå®Ÿè¡Œã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¨éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†
    1725 ã‚­ã‚¹ãƒˆã«åˆ†é¡žã•ã‚Œã‚‹ï¼Ž
    1726 
    1727 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼Œå®Ÿè¡Œä¸­ã®å‡¦ç†å˜ä½ãŒï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§å®Ÿè¡Œã•ã‚Œã¦
    1728 ã„るか非タスクコンテキストで実行されているかを判別する機能を提供する.
    1729 ã¾ãŸï¼ŒCPU例外が発生したコンテキストについて判別する機能を提供する.
    1730 
    1731 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ã¯ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¨CPU例外ハンドラのå
    1732 ¥å£å‡¦ç†ã§éžã‚¿ã‚¹
    1733 ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«åˆ‡ã‚Šæ›ãˆï¼Œãã‚Œã‚‰ã®å‡ºå£å‡¦ç†ã§å
    1734 ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«æˆ»ã™ï¼Žã¾
    1735 ãŸï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチャのå†
    1736 éƒ¨ã§ä¸€æ™‚的に非タスクコンテキストに切り換える.
     14446.3 システム状態の管理
     1445
     1446ASPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な
     1447作業は,カーネルが定義するシステム状態を,ハードウェア(プロセッサ)上
     1448でどのように実現するかである.以下の説明は,TOPPERS新世代カーネルにおけ
     1449るシステム状態の定義・意味を知っていることを前提に記述している.
     1450
     14516.3.1 全割込みロック状態の管理
     1452
     1453全割込みロック状態は,NMIを除くすべての割込みをマスクした状態である.全
     1454割込みロック状態を管理する機能は,システムインタフェースレイヤ(SIL)に
     1455よって提供され,カーネルは全割込みロック状態を管理しない.
     1456
     1457全割込みロック状態では,sns_kerとext_ker以外のカーネルのサービスコール
     1458を呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して
     1459いない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの
     1460サービスコールを除くと,call_exit_kernelのみである.そのため,
     1461call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の
     1462関数が,全割込みロック状態で呼び出される状況は考える必要がない.
     1463
     14646.3.2 コンテキストの管理
     1465
     1466処理単位が実行されるコンテキストは,タスクコンテキストと非タスクコンテ
     1467キストに分類される.
     1468
     1469ターゲット依存部は,実行中の処理単位が,タスクコンテキストで実行されて
     1470いるか非タスクコンテキストで実行されているかを判別する機能を提供する.
     1471また,CPU例外が発生したコンテキストについて判別する機能を提供する.
     1472
     1473ターゲット依存部では,割込みハンドラとCPU例外ハンドラの入口処理で非タス
     1474クコンテキストに切り換え,それらの出口処理で元のコンテキストに戻す.ま
     1475た,ディスパッチャの内部で一時的に非タスクコンテキストに切り換える.
    17371476
    17381477(6-3-2-1) bool_t sense_context(void)
    17391478
    1740 å®Ÿè¡Œä¸­ã®å‡¦ç†å˜ä½ãŒï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§å®Ÿè¡Œã•ã‚Œã¦ã„る場合にはfalse,非
    1741 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§å®Ÿè¡Œã•ã‚Œã¦ã„る場合にはtrueを返す関数.この関数は,
    1742 CPUロック状æ
    1743 ‹ã§ã‚‚CPUロック解除状æ
    1744 ‹ã§ã‚‚呼び出せるように実è£
    1745 ã—なければな
    1746 ã‚‰ãªã„.
    1747 
    1748 6.3.3 CPUロック状æ
    1749 ‹ã®ç®¡ç†
    1750 
    1751 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼ŒCPUロック状æ
    1752 ‹ã¸é·ç§»ã™ã‚‹æ©Ÿèƒ½ï¼ŒCPUロック解除状æ
    1753 ‹ã¸é·
    1754 ç§»ã™ã‚‹æ©Ÿèƒ½ï¼ŒCPUロック状æ
    1755 ‹ã§ã‚るかを判別する機能を提供する.
     1479実行中の処理単位が,タスクコンテキストで実行されている場合にはfalse,非
     1480タスクコンテキストで実行されている場合にはtrueを返す関数.この関数は,
     1481CPUロック状態でもCPUロック解除状態でも呼び出せるように実装しなければな
     1482らない.
     1483
     14846.3.3 CPUロック状態の管理
     1485
     1486ターゲット依存部は,CPUロック状態へ遷移する機能,CPUロック解除状態へ遷
     1487移する機能,CPUロック状態であるかを判別する機能を提供する.
    17561488
    17571489(6-3-3-1) void t_lock_cpu(void)
     
    17591491(6-3-3-3) void x_lock_cpu(void)
    17601492
    1761 CPUロック解除状æ
    1762 ‹ã‹ã‚‰ï¼ŒCPUロック状æ
    1763 ‹ã¸é·ç§»ã•ã›ã‚‹é–¢æ•°ï¼Žã“れらの関数は,
    1764 CPUロック状æ
    1765 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã“とはなく,呼び出された場合の動作は保証する
    1766 å¿
    1767 è¦ãŒãªã„.
    1768 
    1769 ã“れらの関数を実現する際には,「1.6 クリティカルセクションの出å
    1770 ¥å‡¦ç†ã®
    1771 å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„」の節に記述されている制約に従わなければならない.
     1493CPUロック解除状態から,CPUロック状態へ遷移させる関数.これらの関数は,
     1494CPUロック状態で呼び出されることはなく,呼び出された場合の動作は保証する
     1495必要がない.
     1496
     1497これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
     1498実現に関する制約」の節に記述されている制約に従わなければならない.
    17721499
    17731500(6-3-3-4) void t_unlock_cpu(void)
     
    17751502(6-3-3-6) void x_unlock_cpu(void)
    17761503
    1777 CPUロック状æ
    1778 ‹ã‹ã‚‰ï¼ŒCPUロック解除状æ
    1779 ‹ã¸é·ç§»ã•ã›ã‚‹é–¢æ•°ï¼Žã“れらの関数は,
    1780 CPUロック解除状æ
    1781 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã“とはなく,呼び出された場合の動作は保証
    1782 ã™ã‚‹å¿
    1783 è¦ãŒãªã„.
    1784 
    1785 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§CPUロック状æ
    1786 ‹ã«é·ç§»ã—た場合には,CPUロック解除状æ
    1787 ‹
    1788 ã«æˆ»ã‚‹ã®ã¯ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«é™ã‚‰ã‚Œï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§CPUロック解
    1789 é™¤çŠ¶æ
    1790 ‹ã«æˆ»ã‚‹ã“とはない.言い換えると,t_unlock_cpuが呼び出されるのは,
    1791 t_lock_cpuによってCPUロック状æ
    1792 ‹ã«ãªã£ã¦ã„る時である.i_lock_cpuによって
    1793 CPUロック状æ
    1794 ‹ã«ãªã£ã¦ã„る時には,t_unlock_cpuが呼び出されることはない.
    1795 
    1796 åŒæ§˜ã«ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§CPUロック状æ
    1797 ‹ã«é·ç§»ã—た場合には,CPUロッ
    1798 ã‚¯è§£é™¤çŠ¶æ
    1799 ‹ã«æˆ»ã‚‹ã®ã¯éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«é™ã‚‰ã‚Œï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§
    1800 CPUロック解除状æ
    1801 ‹ã«æˆ»ã‚‹ã“とはない.言い換えると,i_unlock_cpuが呼び出さ
    1802 ã‚Œã‚‹ã®ã¯ï¼Œi_lock_cpuによってCPUロック状æ
    1803 ‹ã«ãªã£ã¦ã„る時である.
    1804 t_lock_cpuによってCPUロック状æ
    1805 ‹ã«ãªã£ã¦ã„る時には,i_unlock_cpuが呼び出
    1806 ã•ã‚Œã‚‹ã“とはない.
    1807 
    1808 ã“れらの関数を実現する際には,「1.6 クリティカルセクションの出å
    1809 ¥å‡¦ç†ã®
    1810 å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„」の節に記述されている制約に従わなければならない.
     1504CPUロック状態から,CPUロック解除状態へ遷移させる関数.これらの関数は,
     1505CPUロック解除状態で呼び出されることはなく,呼び出された場合の動作は保証
     1506する必要がない.
     1507
     1508タスクコンテキストでCPUロック状態に遷移した場合には,CPUロック解除状態
     1509に戻るのはタスクコンテキストに限られ,非タスクコンテキストでCPUロック解
     1510除状態に戻ることはない.言い換えると,t_unlock_cpuが呼び出されるのは,
     1511t_lock_cpuによってCPUロック状態になっている時である.i_lock_cpuによって
     1512CPUロック状態になっている時には,t_unlock_cpuが呼び出されることはない.
     1513
     1514同様に,非タスクコンテキストでCPUロック状態に遷移した場合には,CPUロッ
     1515ク解除状態に戻るのは非タスクコンテキストに限られ,タスクコンテキストで
     1516CPUロック解除状態に戻ることはない.言い換えると,i_unlock_cpuが呼び出さ
     1517れるのは,i_lock_cpuによってCPUロック状態になっている時である.
     1518t_lock_cpuによってCPUロック状態になっている時には,i_unlock_cpuが呼び出
     1519されることはない.
     1520
     1521これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
     1522実現に関する制約」の節に記述されている制約に従わなければならない.
    18111523
    18121524(6-3-3-7) bool_t t_sense_lock(void)
     
    18141526(6-3-3-9) bool_t x_sense_lock(void)
    18151527
    1816 ç¾åœ¨ã®ã‚·ã‚¹ãƒ†ãƒ çŠ¶æ
    1817 ‹ãŒï¼ŒCPUロック状æ
    1818 ‹ã®å ´åˆã¯true,CPUロック解除状æ
    1819 ‹ã®å ´
    1820 åˆã«ã¯falseを返す関数.
    1821 
    1822 ã“れらの関数がå
    1823 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1824 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹çŠ¶æ³ã¯è€ƒãˆã‚‹å¿
    1825 è¦ãŒãªã„こ
    1826 ã¨ã‹ã‚‰ï¼Œå
    1827 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1828 ‹ã¨CPUロック状æ
    1829 ‹ã‚’区別できるå¿
    1830 è¦ã¯ãªã„.NMI以
    1831 å¤–にカーネルの管理外の割込みを設けない場合には,å
    1832 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1833 ‹ã¨
    1834 CPUロック状æ
    1835 ‹ãŒå
    1836 ¨ãåŒä¸€ã®çŠ¶æ
    1837 ‹ã§ã‚‚かまわない.
    1838 
    1839 6.4 割込みに関連するシステム状æ
    1840 ‹ã®ç®¡ç†
    1841 
    1842 6.4.1 割込み優å
    1843 ˆåº¦ãƒžã‚¹ã‚¯ã®ç®¡ç†
    1844 
    1845 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼Œå‰²è¾¼ã¿å„ªå
    1846 ˆåº¦ãƒžã‚¹ã‚¯ã‚’設定する機能と,割込み優å
    1847 ˆåº¦ãƒž
    1848 ã‚¹ã‚¯ã‚’参ç
    1849 §ã™ã‚‹æ©Ÿèƒ½ã‚’提供する.
    1850 
    1851 (6-4-1-1) bool_t VALID_INTPRI_CHGIPM(PRI intpri)(オプション)
    1852 
    1853 intpriが,chg_ipmに対する割込み優å
    1854 ˆåº¦ã¨ã—て有効な値である場合にtrue,そ
    1855 ã†ã§ãªã„場合にfalseを返すマクロ.標準では,TMIN_INTPRI以上,TIPM_ENAALL
    1856 ï¼ˆï¼0)以下の値がchg_ipmに対する割込み優å
    1857 ˆåº¦ã¨ã—て有効であるが,ターゲッ
    1858 ãƒˆä¾å­˜éƒ¨ã§ã“のマクロを定義することで,TMIN_INTPRIよりも小さい値を有効と
    1859 ã™ã‚‹ã“とができる(有効な値の範囲を狭めてはならない).
     1528現在のシステム状態が,CPUロック状態の場合はtrue,CPUロック解除状態の場
     1529合にはfalseを返す関数.
     1530
     1531これらの関数が全割込みロック状態で呼び出される状況は考える必要がないこ
     1532とから,全割込みロック状態とCPUロック状態を区別できる必要はない.NMI以
     1533外にカーネルの管理外の割込みを設けない場合には,全割込みロック状態と
     1534CPUロック状態が全く同一の状態でもかまわない.
     1535
     15366.4 割込みに関連するシステム状態の管理
     1537
     15386.4.1 割込み優先度マスクの管理
     1539
     1540ターゲット依存部は,割込み優先度マスクを設定する機能と,割込み優先度マ
     1541スクを参照する機能を提供する.
     1542
     1543(6-4-1-1) bool_t VALID_INTPRI_CHGIPM(PRI intpri)(オプション)
     1544
     1545intpriが,chg_ipmに対する割込み優先度として有効な値である場合にtrue,そ
     1546うでない場合にfalseを返すマクロ.標準では,TMIN_INTPRI以上,TIPM_ENAALL
     1547(=0)以下の値がchg_ipmに対する割込み優先度として有効であるが,ターゲッ
     1548ト依存部でこのマクロを定義することで,TMIN_INTPRIよりも小さい値を有効と
     1549することができる(有効な値の範囲を狭めてはならない).
    18601550
    18611551(6-4-1-2) void x_set_ipm(PRI intpri)
     
    18631553(6-4-1-4) void i_set_ipm(PRI intpri)
    18641554
    1865 å‰²è¾¼ã¿å„ªå
    1866 ˆåº¦ãƒžã‚¹ã‚¯ã®å€¤ã‚’intpriに設定する関数.
    1867 
    1868 ã“れらの関数は,CPUロック状æ
    1869 ‹ã§ã‚‚CPUロック解除状æ
    1870 ‹ã§ã‚‚呼び出せるように
    1871 å®Ÿè£
    1872 ã™ã‚‹ã®ãŒæœ›ã¾ã—い.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存
    1873 éƒ¨ãŒCPUロック解除状æ
    1874 ‹ã§å‘¼ã³å‡ºã™ã“とはないため,CPUロック解除状æ
    1875 ‹ã§å‘¼ã³
    1876 å‡ºã•ã‚ŒãŸå ´åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    1877 è¦ãŒãªã„.i_set_ipmは,CPUロック状æ
    1878 ‹ã§ã‚‚
    1879 CPUロック解除状æ
    1880 ‹ã§ã‚‚呼び出せるように実è£
    1881 ã—なければならない.
    1882 
    1883 ã¾ãŸï¼Œã“れらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対
    1884 ã—てのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証するå¿
    1885 
    1886 è¦ãŒãªã„.
     1555割込み優先度マスクの値をintpriに設定する関数.
     1556
     1557これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
     1558実装するのが望ましい.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存
     1559部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
     1560出された場合の動作は保証する必要がない.i_set_ipmは,CPUロック状態でも
     1561CPUロック解除状態でも呼び出せるように実装しなければならない.
     1562
     1563また,これらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対
     1564してのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証する必
     1565要がない.
    18871566
    18881567(6-4-1-5) PRI x_get_ipm(void)
     
    18901569(6-4-1-7) PRI i_get_ipm(void)
    18911570
    1892 å‰²è¾¼ã¿å„ªå
    1893 ˆåº¦ãƒžã‚¹ã‚¯ã®å€¤ã‚’参ç
    1894 §ã—て返す関数.
    1895 
    1896 ã“れらの関数は,CPUロック状æ
    1897 ‹ã§ã‚‚CPUロック解除状æ
    1898 ‹ã§ã‚‚呼び出せるように
    1899 å®Ÿè£
    1900 ã™ã‚‹ã®ãŒæœ›ã¾ã—い.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存
    1901 éƒ¨ãŒCPUロック解除状æ
    1902 ‹ã§å‘¼ã³å‡ºã™ã“とはないため,CPUロック解除状æ
    1903 ‹ã§å‘¼ã³
    1904 å‡ºã•ã‚ŒãŸå ´åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    1905 è¦ãŒãªã„.i_get_ipmは,CPUロック状æ
    1906 ‹ã§ã‚‚
    1907 CPUロック解除状æ
    1908 ‹ã§ã‚‚呼び出せるように実è£
    1909 ã—なければならない.
    1910 
    1911 å‰²è¾¼ã¿å„ªå
    1912 ˆåº¦ãƒžã‚¹ã‚¯ã‚’用いてカーネル管理の割込みをすべてマスクした状æ
    1913 ‹ã¯ï¼Œ
    1914 CPUロック状æ
    1915 ‹ã¨åŒºåˆ¥ã§ãã‚‹ã“とがå¿
    1916 è¦ã§ã‚る.å
    1917 ·ä½“的には,CPUロック解除状
    1918 æ
    1919 ‹ã«ãŠã„て,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合
    1920 ã§ã‚‚,x_sense_lockはfalseを返す.
    1921 
    1922 ãã‚Œã«å¯¾ã—て,割込み優å
    1923 ˆåº¦ãƒžã‚¹ã‚¯ã‚’用いてNMIを除くすべての割込みをマスク
    1924 ã§ãã‚‹å ´åˆï¼Œãã®çŠ¶æ
    1925 ‹ã¨å
    1926 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    1927 ‹ã‚’区別できるå¿
    1928 è¦ã¯ãªãï¼Œå
    1929 ¨ãåŒ
    1930 ä¸€ã®çŠ¶æ
    1931 ‹ã§ã‚‚かまわない.
    1932 
    1933 6.4.2 割込み要求禁止フラグの管理
    1934 
    1935 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼Œå‰²è¾¼ã¿è¦æ±‚禁止フラグをセットする機能とクリアする機
    1936 èƒ½ã‚’提供する.
     1571割込み優先度マスクの値を参照して返す関数.
     1572
     1573これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
     1574実装するのが望ましい.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存
     1575部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
     1576出された場合の動作は保証する必要がない.i_get_ipmは,CPUロック状態でも
     1577CPUロック解除状態でも呼び出せるように実装しなければならない.
     1578
     1579割込み優先度マスクを用いてカーネル管理の割込みをすべてマスクした状態は,
     1580CPUロック状態と区別できることが必要である.具体的には,CPUロック解除状
     1581態において,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合
     1582でも,x_sense_lockはfalseを返す.
     1583
     1584それに対して,割込み優先度マスクを用いてNMIを除くすべての割込みをマスク
     1585できる場合,その状態と全割込みロック状態を区別できる必要はなく,全く同
     1586一の状態でもかまわない.
     1587
     15886.4.2 割込み要求禁止フラグの管理
     1589
     1590ターゲット依存部は,割込み要求禁止フラグをセットする機能とクリアする機
     1591能を提供する.
    19371592
    19381593(6-4-2-1) bool_t VALID_INTNO_DISINT(INTNO intno)
    19391594
    1940 intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に
    1941 true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/
    1942 ã‚¯ãƒªã‚¢ã§ããªã„intnoに対しては,このマクロがfalseを返すようにする.
     1595intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に
     1596true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/
     1597クリアできないintnoに対しては,このマクロがfalseを返すようにする.
    19431598
    19441599(6-4-2-2) bool_t x_disable_int(INTNO intno)
     
    19461601(6-4-2-4) bool_t i_disable_int(INTNO intno)
    19471602
    1948 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし,
    1949 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
    1950 ã‚Œã¦ã„ない場合には,falseを返す.
    1951 
    1952 ã“れらの関数は,ターゲット非依存部がCPUロック解除状æ
    1953 ‹ã§å‘¼ã³å‡ºã™ã“とはな
    1954 ã„ため,CPUロック解除状æ
    1955 ‹ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    1956 è¦ãŒãªã„.
    1957 ãŸã ã—,ターゲット依存部からCPUロック解除状æ
    1958 ‹ã§å‘¼ã³å‡ºã™å ´åˆã«ã¯ï¼Œä¿è¨¼ã™
    1959 ã‚‹å¿
    1960 è¦ãŒã‚る.
    1961 
    1962 ã¾ãŸï¼Œã“れらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
    1963 ã¦ã®ã¿å‘¼ã°ã‚Œã‚‹ï¼Žintnoにそうでない値が渡された場合の動作は保証するå¿
    1964 è¦ãŒ
    1965 ãªã„.
    1966 
    1967 dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク
    1968 ãƒ­å®šç¾©ã™ã‚‹å ´åˆï¼‰ã«ã¯ï¼Œt_disable_intが用意されていなければならない.
     1603intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし,
     1604trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
     1605れていない場合には,falseを返す.
     1606
     1607これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
     1608いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
     1609ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
     1610る必要がある.
     1611
     1612また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
     1613てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
     1614ない.
     1615
     1616dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク
     1617ロ定義する場合)には,t_disable_intが用意されていなければならない.
    19691618
    19701619(6-4-2-5) bool_t x_enable_int(INTNO intno)
     
    19721621(6-4-2-7) bool_t i_enable_int(INTNO intno)
    19731622
    1974 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし,
    1975 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
    1976 ã‚Œã¦ã„ない場合には,falseを返す.
    1977 
    1978 ã“れらの関数は,ターゲット非依存部がCPUロック解除状æ
    1979 ‹ã§å‘¼ã³å‡ºã™ã“とはな
    1980 ã„ため,CPUロック解除状æ
    1981 ‹ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    1982 è¦ãŒãªã„.
    1983 ãŸã ã—,ターゲット依存部からCPUロック解除状æ
    1984 ‹ã§å‘¼ã³å‡ºã™å ´åˆã«ã¯ï¼Œä¿è¨¼ã™
    1985 ã‚‹å¿
    1986 è¦ãŒã‚る.
    1987 
    1988 ã¾ãŸï¼Œã“れらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
    1989 ã¦ã®ã¿å‘¼ã°ã‚Œã‚‹ï¼Žintnoにそうでない値が渡された場合の動作は保証するå¿
    1990 è¦ãŒ
    1991 ãªã„.
    1992 
    1993 ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク
    1994 ãƒ­å®šç¾©ã™ã‚‹å ´åˆï¼‰ã«ã¯ï¼Œt_enable_intが用意されていなければならない.
    1995 
    1996 6.4.3 割込み要求のクリア
     1623intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし,
     1624trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
     1625れていない場合には,falseを返す.
     1626
     1627これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
     1628いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
     1629ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
     1630る必要がある.
     1631
     1632また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
     1633てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
     1634ない.
     1635
     1636ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク
     1637ロ定義する場合)には,t_enable_intが用意されていなければならない.
     1638
     16396.4.3 割込み要求のクリア
    19971640
    19981641(6-4-3-1) void x_clear_int(INTNO intno)
     
    20001643(6-4-3-3) void i_clear_int(INTNO intno)
    20011644
    2002 intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ
    2003 ãŸå‰²è¾¼ã¿è¦æ±‚をクリアする関数.intnoで指定された割込み要求ラインがレベル
    2004 ãƒˆãƒªã‚¬ã§ã‚る場合には何もしない.
    2005 
    2006 ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
    2007 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‚„システムサービスで呼び出す可能性が高いため,用意する
    2008 ã“ととしている.そのため,これらの関数がどのようなシステム状æ
    2009 ‹ã§å‘¼ã³å‡º
    2010 ã›ã‚‹ã‹ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨å†
    2011 ã§ä¸€è²«ã—ていればよい.
    2012 
    2013 6.4.4 割込み要求のプローブ
     1645intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ
     1646た割込み要求をクリアする関数.intnoで指定された割込み要求ラインがレベル
     1647トリガである場合には何もしない.
     1648
     1649ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
     1650ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
     1651こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
     1652せるかは,ターゲット依存部内で一貫していればよい.
     1653
     16546.4.4 割込み要求のプローブ
    20141655
    20151656(6-4-4-1) bool_t x_probe_int(INTNO intno)
     
    20171658(6-4-4-3) bool_t i_probe_int(INTNO intno)
    20181659
    2019 intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に
    2020 true,そうでない場合にfalseを返す関数.
    2021 
    2022 ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
    2023 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‚„システムサービスで呼び出す可能性が高いため,用意する
    2024 ã“ととしている.そのため,これらの関数がどのようなシステム状æ
    2025 ‹ã§å‘¼ã³å‡º
    2026 ã›ã‚‹ã‹ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨å†
    2027 ã§ä¸€è²«ã—ていればよい.
    2028 
    2029 6.4.5 割込みハンドラのå
    2030 ˆé ­å‡¦ç†ã¨æœ«å°¾å‡¦ç†
     1660intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に
     1661true,そうでない場合にfalseを返す関数.
     1662
     1663ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
     1664ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
     1665こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
     1666せるかは,ターゲット依存部内で一貫していればよい.
     1667
     16686.4.5 割込みハンドラの先頭処理と末尾処理
    20311669
    20321670(6-4-5-1) void i_begin_int(INTNO intno)
    20331671
    2034 intnoで指定された割込み要求ラインに対する割込みハンドラのå
    2035 ˆé ­ã§è¡Œã†ã¹ã
    2036 å‡¦ç†ã‚’行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト
    2037 ãƒªã‚¬ã§ã‚る場合のトリガされた割込み要求のクリアが挙げられる.
    2038 
    2039 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
    2040 å
    2041 ˆé ­ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žãã®ãŸã‚ã“の関数は,割込みハンドラのå
    2042 ˆé ­ï¼ˆé€šå¸¸ã¯
    2043 CPUロック解除状æ
    2044 ‹ï¼‰ã§å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«å®Ÿè£
    2045 ã—なければならない.
     1672intnoで指定された割込み要求ラインに対する割込みハンドラの先頭で行うべき
     1673処理を行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト
     1674リガである場合のトリガされた割込み要求のクリアが挙げられる.
     1675
     1676intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
     1677先頭で呼び出される.そのためこの関数は,割込みハンドラの先頭(通常は
     1678CPUロック解除状態)で呼び出せるように実装しなければならない.
    20461679
    20471680(6-4-5-2) void i_end_int(INTNO intno)
    20481681
    2049 intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき
    2050 å‡¦ç†ã‚’行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に
    2051 å¯¾ã™ã‚‹å‰²è¾¼ã¿å‡¦ç†ã®çµ‚了通知が挙げられる.
    2052 
    2053 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
    2054 æœ«å°¾ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žãã®ãŸã‚ã“の関数は,割込みハンドラの末尾(通常は
    2055 CPUロック解除状æ
    2056 ‹ï¼‰ã§å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«å®Ÿè£
    2057 ã—なければならない.
    2058 
    2059 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ã‚ˆã£ã¦ã¯ï¼ŒIRCに対する割込み処理の終了通知を行う前に,すべて
    2060 ã®å‰²è¾¼ã¿ã‚’禁止しなければならない場合がある.この場合には,この関数の中
    2061 ã§å‰²è¾¼ã¿ã‚’禁止し,その状æ
    2062 ‹ã®ã¾ã¾ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹ï¼Žå‰²è¾¼
    2063 ã¿ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³å‰ã«ã¯ï¼Œå‰²è¾¼ã¿ç¦æ­¢ã‚’解除するのが原則であるが,
    2064 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®å‡ºå£å‡¦ç†ã§å
    2065 ƒã«æˆ»ã™å‡¦ç†ã‚’行うので差し支えないはずである.
    2066 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®å‡ºå£å‡¦ç†ãŒï¼Œã“れで差し支えない実è£
    2067 ã«ãªã£ã¦ã„ることを確
    2068 èªã™ã‚‹ã¹ãã§ã‚る.
    2069 
    2070 6.5 タスクディスパッチャ
    2071 
    2072 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
     1682intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき
     1683処理を行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に
     1684対する割込み処理の終了通知が挙げられる.
     1685
     1686intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
     1687末尾で呼び出される.そのためこの関数は,割込みハンドラの末尾(通常は
     1688CPUロック解除状態)で呼び出せるように実装しなければならない.
     1689
     1690ターゲットによっては,IRCに対する割込み処理の終了通知を行う前に,すべて
     1691の割込みを禁止しなければならない場合がある.この場合には,この関数の中
     1692で割込みを禁止し,その状態のまま,割込みハンドラからリターンする.割込
     1693みハンドラからのリターン前には,割込み禁止を解除するのが原則であるが,
     1694割込みハンドラの出口処理で元に戻す処理を行うので差し支えないはずである.
     1695割込みハンドラの出口処理が,これで差し支えない実装になっていることを確
     1696認するべきである.
     1697
     16986.5 タスクディスパッチャ
     1699
     17006.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
    20731701
    20741702(6-5-1-1) TSKCTXB
    20751703
    2076 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’保存するために,TCB中に持つことがå¿
    2077 
    2078 è¦ãªãƒ‡ãƒ¼ã‚¿æ§‹é€ ã®åž‹ã‚’,TSKCTXBに定義する.標準的には,TSKCTXBには,タス
    2079 ã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã¨å®Ÿè¡Œå†é–‹ç•ªåœ°ã‚’格納する.
    2080 
    2081 (6-5-1-2) USE_TSKINICTXB(オプション)
    2082 (6-5-1-3) TSKINICTXB(オプション)
    2083 
    2084 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®æƒ
    2085 å ±ã‚’タスク初期化ブロック(TINIB)にå
    2086 ¥ã‚ŒãŸã„場合や,
    2087 TINIB中のスタック領域のサイズとå
    2088 ˆé ­ç•ªåœ°ã®æŒã¡æ–¹ã‚’ターゲット依存に変更し
    2089 ãŸã„場合には,USE_TSKINICTXBをマクロ定義し,TINIB中に持つことがå¿
    2090 è¦ãªãƒ‡ãƒ¼
    2091 ã‚¿æ§‹é€ ã®åž‹ã‚’,TSKINICTXBに定義する.
    2092 
    2093 USE_TSKINICTXBをマクロ定義すると,TINIB中にスタック領域とサイズとå
    2094 ˆé ­ç•ª
    2095 åœ°ãŒå«ã¾ã‚Œãªããªã‚‹ãŸã‚ï¼Œãã‚Œã«ä»£ã‚ã‚‹æƒ
    2096 å ±ã‚’TSKINICTXB中に持つå¿
    2097 è¦ãŒã‚る.
    2098 ã¾ãŸï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス2のテンプレートファイルのターゲット非依存
    2099 éƒ¨ã§ï¼ŒTSKINICTXBの初期化æƒ
    2100 å ±ã‚’生成するためのGENERATE_TSKINICTXBを,パス
    2101 3のテンプレートファイルのターゲット非依存部で,TINIBからスタック領域の
    2102 å
    2103 ˆé ­ç•ªåœ°ã‚’取り出すためのGET_STK_TSKINICTXBを定義するå¿
    2104 è¦ãŒã‚る.
    2105 
    2106 6.5.2 ディスパッチャ本体
    2107 
    2108 ãƒ‡ã‚£ã‚¹ãƒ‘ッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ
    2109 ã‚Œã‚‹ã“とはなく,カーネルのターゲット依存部のå†
    2110 éƒ¨ã‹ã‚‰ã®ã¿å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
    2111 dispatcherは,タスクコンテキスト・CPUロック状æ
    2112 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    2113 ˆåº¦ãƒžã‚¹ã‚¯å
    2114 ¨è§£
    2115 é™¤çŠ¶æ
    2116 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    2117 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
    2118 
    2119 dispatcherの処理å†
    2120 å®¹ã¯æ¬¡ã®é€šã‚Šï¼Ž
     1704ターゲット依存のタスクコンテキストを保存するために,TCB中に持つことが必
     1705要なデータ構造の型を,TSKCTXBに定義する.標準的には,TSKCTXBには,タス
     1706クのスタックポインタと実行再開番地を格納する.
     1707
     1708(6-5-1-2) USE_TSKINICTXB(オプション)
     1709(6-5-1-3) TSKINICTXB(オプション)
     1710
     1711ターゲット依存の情報をタスク初期化ブロック(TINIB)に入れたい場合や,
     1712TINIB中のスタック領域のサイズと先頭番地の持ち方をターゲット依存に変更し
     1713たい場合には,USE_TSKINICTXBをマクロ定義し,TINIB中に持つことが必要なデー
     1714タ構造の型を,TSKINICTXBに定義する.
     1715
     1716USE_TSKINICTXBをマクロ定義すると,TINIB中にスタック領域とサイズと先頭番
     1717地が含まれなくなるため,それに代わる情報をTSKINICTXB中に持つ必要がある.
     1718また,コンフィギュレータのパス2のテンプレートファイルのターゲット非依存
     1719部で,TSKINICTXBの初期化情報を生成するためのGENERATE_TSKINICTXBを,パス
     17203のテンプレートファイルのターゲット非依存部で,TINIBからスタック領域の
     1721先頭番地を取り出すためのGET_STK_TSKINICTXBを定義する必要がある.
     1722
     17236.5.2 ディスパッチャ本体
     1724
     1725ディスパッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ
     1726れることはなく,カーネルのターゲット依存部の内部からのみ呼び出される.
     1727dispatcherは,タスクコンテキスト・CPUロック状態・割込み優先度マスク全解
     1728除状態・ディスパッチ許可状態で呼び出される.
     1729
     1730dispatcherの処理内容は次の通り.
    21211731
    21221732----------------------------------------
     
    21291739  dispatcher_0:
    21301740        while ((p_runtsk = p_schedtsk) == NULL) {
    2131                 割込みを許可したらCPUロック解除状æ
    2132 ‹ã«ãªã‚‹ã‚ˆã†æº–備する
    2133                 非タスクコンテキストに切り換える … (*1)
     1741                割込みを許可したらCPUロック解除状態になるよう準備する
     1742                非タスクコンテキストに切り換える … (*1)
    21341743                do {
    2135                         割込みをすべて許可し,割込み発生をå¾
    2136 ã¤ … (*2)
    2137                         割込み許可前の状æ
    2138 ‹ã«æˆ»ã™ï¼ˆï¼ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã®å‰²è¾¼ã¿ã‚’禁止する)
     1744                        割込みをすべて許可し,割込み発生を待つ … (*2)
     1745                        割込み許可前の状態に戻す(=カーネル管理の割込みを禁止する)
    21391746                } while (!reqflg);
    21401747                reqflg = false;
    2141                 タスクコンテキストに戻す … (*1)
    2142                 CPUロック状æ
    2143 ‹ã«æˆ»ã™ ... (*3)
     1748                タスクコンテキストに戻す … (*1)
     1749                CPUロック状態に戻す ... (*3)
    21441750        }
    2145         自タスク(p_runtsk)のTCBからスタックポインタを復帰する
     1751        自タスク(p_runtsk)のTCBからスタックポインタを復帰する
    21461752#ifdef LOG_DSP_LEAVE
    21471753        log_dsp_leave(p_runtsk);
    21481754#endif /* LOG_DSP_LEAVE */
    2149         自タスクのTCBから実行再開番地を復帰し,そこへ分岐する … (*a)
     1755        自タスクのTCBから実行再開番地を復帰し,そこへ分岐する … (*a)
    21501756}
    21511757----------------------------------------
    21521758
    2153 å‰²è¾¼ã¿ç™ºç”Ÿã‚’å¾
    2154 ã¤é–“に非タスクコンテキストに切り換えるのは,この間に実行
    2155 ã•ã‚Œã‚‹å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©å†
    2156 ã§ï¼Œã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチをしないようにするためであ
    2157 ã‚‹ï¼Žã“の時,割込みハンドラが,非タスクコンテキスト用のスタックを使うよ
    2158 ã†ã«ã—なければならない.通常は,非タスクコンテキストに切り換える際に非
    2159 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯ã«åˆ‡ã‚Šæ›ãˆï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«æˆ»ã™éš›ã«
    2160 å
    2161 ƒã®ã‚¹ã‚¿ãƒƒã‚¯ã«åˆ‡ã‚Šæ›ãˆã‚‹ï¼Ž
    2162 
    2163 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ã‚ˆã£ã¦ã¯ï¼ˆç‰¹ã«ï¼Œã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ç’°å¢ƒã®å ´åˆï¼‰ï¼Œå¼·åˆ¶çš„に非タ
    2164 ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«åˆ‡ã‚Šæ›ãˆã‚‹ã“とが難しい場合がある.その場合には,この
    2165 é–“に実行される割込みハンドラå†
    2166 ã§ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチをしないような仕組み
    2167 ã‚’実è£
    2168 ã™ã‚‹ã“とで,非タスクコンテキストへの切換えを省略することができる.
    2169 
    2170 (*1)の非タスクコンテキストに切り換える処理とタスクコンテキストに戻す処
    2171 ç†ã¯ï¼Œdoループの中で行ってもよい(ターゲットによっては,割込みの許可/
    2172 ç¦æ­¢ã¨ã¾ã¨ã‚ã¦å‡¦ç†ã—た方が効率が良い).
    2173 
    2174 (*2)において,割込みを許可する処理と,割込み発生をå¾
    2175 ã¤å‡¦ç†ã¨ã¯ï¼Œä¸å¯åˆ†
    2176 ã«è¡Œãªã†å¿
    2177 è¦ãŒã‚る.これを不可分に行なわない場合,割込みを許可した直後
    2178 ã«å‰²è¾¼ã¿ãŒå
    2179 ¥ã‚Šï¼Œãã®ä¸­ã§ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œå¯èƒ½çŠ¶æ
    2180 ‹ã«ãªã‚‹ã¨ï¼Œå®Ÿè¡Œã™ã¹ãã‚¿ã‚¹ã‚¯
    2181 ãŒã‚るにもかかわらずプロセッサが割込みå¾
    2182 ã¡ã«ãªã£ã¦ã—まう.
    2183 
    2184 ã¾ãŸï¼Œ(*2)において,割込み発生をå¾
    2185 ã¤å‘½ä»¤ãŒç”¨æ„ã•ã‚Œã¦ã„ない場合や,それ
    2186 ã‚’発行するのが不都合な場合には,割込みをすべて許可して割込みを受け付け
    2187 ã‚‰ã‚Œã‚‹çŠ¶æ
    2188 ‹ã«ãªã£ãŸå¾Œã«ï¼Œå‰²è¾¼ã¿ç™ºç”Ÿã‚’å¾
    2189 ãŸãšã«æ¬¡ã«é€²ã‚“でもよい.この場合,
    2190 ãã®å¤–側のdoループによって,割込み発生をå¾
    2191 ã¤ã“とになる.
    2192 
    2193 CPUロックを解除するためのæƒ
    2194 å ±ï¼ˆä¾‹ãˆã°ï¼ŒCPUロック前の割込み優å
    2195 ˆåº¦ãƒžã‚¹ã‚¯ï¼‰
    2196 ã‚’変数に保持している場合には,(*3)でCPUロック状æ
    2197 ‹ã«æˆ»ã™éš›ã«ï¼Œãã®å¤‰æ•°ã®
    2198 å€¤ã‚‚å
    2199 ƒã«æˆ»ã£ã¦ã„ã‚‹å¿
    2200 è¦ãŒã‚る.特に,その変数が,割込みå¾
    2201 ã¡ã®é–“に実行し
    2202 ãŸå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©å†
    2203 ã§æ›¸ãæ›ãˆã‚‰ã‚Œã‚‹å ´åˆã¯ï¼Œå
    2204 ƒã®å€¤ã«æˆ»ã™ã“とがå¿
    2205 è¦ã§ã‚る.
    2206 
    2207 å‰²è¾¼ã¿å¾
    2208 ã¡ã®é–“は,p_runtskをNULL(=0)に設定しなければならない(上の処
    2209 ç†å†
    2210 å®¹ã‚’そのまま実è£
    2211 ã™ã‚Œã°ã“うなる).このように設定しないと,割込みハ
    2212 ãƒ³ãƒ‰ãƒ©ã‹ã‚‰iget_tidを呼び出した際の動作が仕様に合致しなくなる.
    2213 
    2214 dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は,
    2215 ã€Œ6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ
    2216 ã¨ï¼ŽãªãŠï¼Œlog_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave は
    2217 åˆ‡æ›ãˆå¾Œã®ã‚¿ã‚¹ã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯ã§å®Ÿè¡Œã™ã‚‹ï¼Ž
    2218 
    2219 6.5.3 タスクコンテキストからのディスパッチ
     1759割込み発生を待つ間に非タスクコンテキストに切り換えるのは,この間に実行
     1760される割込みハンドラ内で,タスクディスパッチをしないようにするためであ
     1761る.この時,割込みハンドラが,非タスクコンテキスト用のスタックを使うよ
     1762うにしなければならない.通常は,非タスクコンテキストに切り換える際に非
     1763タスクコンテキスト用のスタックに切り換え,タスクコンテキストに戻す際に
     1764元のスタックに切り換える.
     1765
     1766ターゲットによっては(特に,シミュレーション環境の場合),強制的に非タ
     1767スクコンテキストに切り換えることが難しい場合がある.その場合には,この
     1768間に実行される割込みハンドラ内でタスクディスパッチをしないような仕組み
     1769を実装することで,非タスクコンテキストへの切換えを省略することができる.
     1770
     1771(*1)の非タスクコンテキストに切り換える処理とタスクコンテキストに戻す処
     1772理は,doループの中で行ってもよい(ターゲットによっては,割込みの許可/
     1773禁止とまとめて処理した方が効率が良い).
     1774
     1775(*2)において,割込みを許可する処理と,割込み発生を待つ処理とは,不可分
     1776に行なう必要がある.これを不可分に行なわない場合,割込みを許可した直後
     1777に割込みが入り,その中でタスクが実行可能状態になると,実行すべきタスク
     1778があるにもかかわらずプロセッサが割込み待ちになってしまう.
     1779
     1780また,(*2)において,割込み発生を待つ命令が用意されていない場合や,それ
     1781を発行するのが不都合な場合には,割込みをすべて許可して割込みを受け付け
     1782られる状態になった後に,割込み発生を待たずに次に進んでもよい.この場合,
     1783その外側のdoループによって,割込み発生を待つことになる.
     1784
     1785CPUロックを解除するための情報(例えば,CPUロック前の割込み優先度マスク)
     1786を変数に保持している場合には,(*3)でCPUロック状態に戻す際に,その変数の
     1787値も元に戻っている必要がある.特に,その変数が,割込み待ちの間に実行し
     1788た割込みハンドラ内で書き換えられる場合は,元の値に戻すことが必要である.
     1789
     1790割込み待ちの間は,p_runtskをNULL(=0)に設定しなければならない(上の処
     1791理内容をそのまま実装すればこうなる).このように設定しないと,割込みハ
     1792ンドラからiget_tidを呼び出した際の動作が仕様に合致しなくなる.
     1793
     1794dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は,
     1795「6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ
     1796と.なお,log_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave は
     1797切換え後のタスクのスタックで実行する.
     1798
     17996.5.3 タスクコンテキストからのディスパッチ
    22201800
    22211801(6-5-3-1) void dispatch(void)
    2222 (6-5-3-2) OMIT_CALLTEX(オプション)
    2223 
    2224 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‹ã‚‰ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(dispatch)は,タスクコンテキスト
    2225 ç”¨ã®ã‚µãƒ¼ãƒ“スコール処理においてタスク切換えがå¿
    2226 è¦ã«ãªã£ãŸå ´åˆã«ï¼Œã‚¿ãƒ¼ã‚²ãƒƒ
    2227 ãƒˆéžä¾å­˜éƒ¨ã®ã‚µãƒ¼ãƒ“スコール処理関数から呼び出される.
    2228 
    2229 dispatchは,タスクコンテキスト・CPUロック状æ
    2230 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    2231 ˆåº¦ãƒžã‚¹ã‚¯å
    2232 ¨è§£é™¤
    2233 çŠ¶æ
    2234 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    2235 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
    2236 
    2237 dispatchの処理å†
    2238 å®¹ã¯æ¬¡ã®é€šã‚Šï¼Ž
     1802(6-5-3-2) OMIT_CALLTEX(オプション)
     1803
     1804タスクコンテキストからのディスパッチ(dispatch)は,タスクコンテキスト
     1805用のサービスコール処理においてタスク切換えが必要になった場合に,ターゲッ
     1806ト非依存部のサービスコール処理関数から呼び出される.
     1807
     1808dispatchは,タスクコンテキスト・CPUロック状態・割込み優先度マスク全解除
     1809状態・ディスパッチ許可状態で呼び出される.
     1810
     1811dispatchの処理内容は次の通り.
    22391812
    22401813----------------------------------------
     
    22431816{
    22441817#ifdef TOPPERS_SUPPORT_OVRHDR
    2245         ovrtimer_stop();                                        /* オーバランタイマの停止 */
     1818        ovrtimer_stop();                                        /* オーバランタイマの停止 */
    22461819#endif /* TOPPERS_SUPPORT_OVRHDR */
    2247         スクラッチレジスタ(*)を除くすべてのレジスタをスタックに保存する
    2248         スタックポインタを自タスク(p_runtsk)のTCBに保存する
    2249         dispatch_rを,実行再開番地として自タスクのTCBに保存する … (*a)
    2250         dispatcherに分岐する
     1820        スクラッチレジスタ(*)を除くすべてのレジスタをスタックに保存する
     1821        スタックポインタを自タスク(p_runtsk)のTCBに保存する
     1822        dispatch_rを,実行再開番地として自タスクのTCBに保存する … (*a)
     1823        dispatcherに分岐する
    22511824
    22521825  dispatch_r:
    2253         スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
     1826        スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
    22541827#ifdef TOPPERS_SUPPORT_OVRHDR
    2255         ovrtimer_start();                                       /* オーバランタイマの動作開始 */
     1828        ovrtimer_start();                                       /* オーバランタイマの動作開始 */
    22561829#endif /* TOPPERS_SUPPORT_OVRHDR */
    2257         calltex(); … (*b)
     1830        calltex(); (*b)
    22581831}
    22591832----------------------------------------
    22601833
    2261 ã“こでスクラッチレジスタ(*)とは,関数呼出しにより保存されないレジスタの
    2262 ã“とである.å¿
    2263 è¦ãªå ´åˆã«ã¯ï¼Œé–¢æ•°ã‚’呼び出す側で保存しなければならないた
    2264 ã‚ï¼Œcaller saved registerと呼ばれる場合もある.
    2265 
    2266 dispatchを呼び出したタスクが次に実行される時には,実行再開番地として登
    2267 éŒ²ã—たdispatch_rに戻ってくる.dispatch_rには,dispatcherのみから分岐し,
    2268 ãã®æ™‚の状æ
    2269 ‹ã¯ï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ»CPUロック状æ
    2270 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    2271 ˆåº¦ãƒžã‚¹ã‚¯å
    2272 ¨
    2273 è§£é™¤çŠ¶æ
    2274 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    2275 ‹ã§ã‚る.
    2276 
    2277 (*b)でcalltexを呼ぶ代わりに,calltexの処理å†
    2278 å®¹ï¼ˆp_runtsk->enatexがtrue
    2279 ã§ï¼Œp_runtsk->texptnが0でなく,ipmflgがtrueの場合に,call_texrtnを呼ぶ)
    2280 ã‚’ここにインライン展開した方が効率がよい.ターゲット非依存部のcalltexを
    2281 ä½¿ã‚ãªã„場合には,OMIT_CALLTEXをマクロ定義することで,ターゲット非依存
    2282 éƒ¨ã‹ã‚‰calltexを取り除くことができる.
    2283 
    2284 6.5.4 ディスパッチャの動作開始
     1834ここでスクラッチレジスタ(*)とは,関数呼出しにより保存されないレジスタの
     1835ことである.必要な場合には,関数を呼び出す側で保存しなければならないた
     1836め,caller saved registerと呼ばれる場合もある.
     1837
     1838dispatchを呼び出したタスクが次に実行される時には,実行再開番地として登
     1839録したdispatch_rに戻ってくる.dispatch_rには,dispatcherのみから分岐し,
     1840その時の状態は,タスクコンテキスト・CPUロック状態・割込み優先度マスク全
     1841解除状態・ディスパッチ許可状態である.
     1842
     1843(*b)でcalltexを呼ぶ代わりに,calltexの処理内容(p_runtsk->enatexがtrue
     1844で,p_runtsk->texptnが0でなく,ipmflgがtrueの場合に,call_texrtnを呼ぶ)
     1845をここにインライン展開した方が効率がよい.ターゲット非依存部のcalltexを
     1846使わない場合には,OMIT_CALLTEXをマクロ定義することで,ターゲット非依存
     1847部からcalltexを取り除くことができる.
     1848
     18496.5.4 ディスパッチャの動作開始
    22851850
    22861851(6-5-4-1) void start_dispatch(void)
    22871852
    2288 ãƒ‡ã‚£ã‚¹ãƒ‘ッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ
    2289 ãƒ«ã®åˆæœŸåŒ–処理から呼び出される.start_dispatchは,リターンすることのな
    2290 ã„関数である.
    2291 
    2292 start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス
    2293 ã‚¯ã—た状æ
    2294 ‹ï¼ˆå
    2295 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    2296 ‹ã¨åŒç­‰ã®çŠ¶æ
    2297 ‹ï¼‰ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žstart_dispatch
    2298 å†
    2299 ã§ï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«åˆ‡ã‚Šæ›ãˆï¼ŒCPUロック状æ
    2300 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    2301 ˆåº¦ãƒžã‚¹ã‚¯å
    2302 ¨
    2303 è§£é™¤çŠ¶æ
    2304 ‹ã«ã—なければならない.
    2305 
    2306 start_dispatchの処理å†
    2307 å®¹ã¯æ¬¡ã®é€šã‚Šï¼Ž
     1853ディスパッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ
     1854ルの初期化処理から呼び出される.start_dispatchは,リターンすることのな
     1855い関数である.
     1856
     1857start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス
     1858クした状態(全割込みロック状態と同等の状態)で呼び出される.start_dispatch
     1859内で,タスクコンテキストに切り換え,CPUロック状態・割込み優先度マスク全
     1860解除状態にしなければならない.
     1861
     1862start_dispatchの処理内容は次の通り.
    23081863
    23091864----------------------------------------
     
    23111866start_dispatch(void)
    23121867{
    2313         タスクコンテキストに切り換える
    2314         CPUロック状æ
    2315 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    2316 ˆåº¦ãƒžã‚¹ã‚¯å
    2317 ¨è§£é™¤çŠ¶æ
    2318 ‹ã«ã™ã‚‹
    2319         dispatcher_0に分岐する
     1868        タスクコンテキストに切り換える
     1869        CPUロック状態・割込み優先度マスク全解除状態にする
     1870        dispatcher_0に分岐する
    23201871}
    23211872----------------------------------------
    23221873
    2323 6.5.5 現在のコンテキストを捨ててディスパッチ
     18746.5.5 現在のコンテキストを捨ててディスパッチ
    23241875
    23251876(6-5-5-1) void exit_and_dispatch(void)
    23261877
    2327 ç¾åœ¨ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’捨ててディスパッチ(exit_and_dispatch)は,自タスク
    2328 ã‚’終了させるサービスコール処理関数から呼び出される.exit_and_dispatchは,
    2329 ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹ã“とのない関数である.
    2330 
    2331 exit_and_dispatchは,タスクコンテキスト・CPUロック状æ
    2332 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    2333 ˆåº¦ãƒž
    2334 ã‚¹ã‚¯å
    2335 ¨è§£é™¤çŠ¶æ
    2336 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    2337 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
    2338 
    2339 exit_and_dispatchの処理å†
    2340 å®¹ã¯æ¬¡ã®é€šã‚Šï¼Ž
     1878現在のコンテキストを捨ててディスパッチ(exit_and_dispatch)は,自タスク
     1879を終了させるサービスコール処理関数から呼び出される.exit_and_dispatchは,
     1880リターンすることのない関数である.
     1881
     1882exit_and_dispatchは,タスクコンテキスト・CPUロック状態・割込み優先度マ
     1883スク全解除状態・ディスパッチ許可状態で呼び出される.
     1884
     1885exit_and_dispatchの処理内容は次の通り.
    23411886
    23421887----------------------------------------
     
    23441889exit_and_dispatch(void)
    23451890{
    2346         dispatcherに分岐する
     1891        dispatcherに分岐する
    23471892}
    23481893----------------------------------------
    23491894
    2350 6.5.6 タスクの起動処理
     18956.5.6 タスクの起動処理
    23511896
    23521897(6-5-6-1) void activate_context(TCB *p_tcb)
    23531898
    2354 ã‚¿ã‚¹ã‚¯ã®èµ·å‹•å‡¦ç†ï¼ˆactivate_context)は,タスクを休止状æ
    2355 ‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹
    2356 çŠ¶æ
    2357 ‹ã«ã™ã‚‹æ™‚に呼ばれ,p_tcbで指定されたタスク(対象タスク)のTCB中のス
    2358 ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã‚’初期化し,実行再開番地をタスク開始時処理(start_r)に設
    2359 å®šã™ã‚‹ï¼Žã“の時点では,後述する理由で,対象タスクのスタック領域を使って
    2360 ã¯ãªã‚‰ãªã„.
    2361 
    2362 å¯¾è±¡ã‚¿ã‚¹ã‚¯ãŒæœ€åˆã«å®Ÿè¡Œã•ã‚Œã‚‹æ™‚には,対象タスクを自タスクとして,実行再
    2363 é–‹ç•ªåœ°ã¨ã—て登録したstart_rに分岐してくる.start_rには,dispatcherのみ
    2364 ã‹ã‚‰åˆ†å²ã—,その時の状æ
    2365 ‹ã¯ï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ»CPUロック状æ
    2366 ‹ãƒ»å‰²è¾¼ã¿å„ª
    2367 å
    2368 ˆåº¦ãƒžã‚¹ã‚¯å
    2369 ¨è§£é™¤çŠ¶æ
    2370 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    2371 ‹ã§ã‚る.
    2372 
    2373 start_rは,CPUロック状æ
    2374 ‹ã‚’解除した後,タスクの起動番地を呼び出す.さら
    2375 ã«ï¼Œã‚¿ã‚¹ã‚¯ã®èµ·å‹•ç•ªåœ°ã‹ã‚‰æˆ»ã£ã¦ããŸå ´åˆã«ã¯ï¼Œext_tskを呼び出す.
    2376 
    2377 activate_contextとstart_rの処理å†
    2378 å®¹ã¯æ¬¡ã®é€šã‚Šï¼Ž
     1899タスクの起動処理(activate_context)は,タスクを休止状態から実行できる
     1900状態にする時に呼ばれ,p_tcbで指定されたタスク(対象タスク)のTCB中のス
     1901タックポインタを初期化し,実行再開番地をタスク開始時処理(start_r)に設
     1902定する.この時点では,後述する理由で,対象タスクのスタック領域を使って
     1903はならない.
     1904
     1905対象タスクが最初に実行される時には,対象タスクを自タスクとして,実行再
     1906開番地として登録したstart_rに分岐してくる.start_rには,dispatcherのみ
     1907から分岐し,その時の状態は,タスクコンテキスト・CPUロック状態・割込み優
     1908先度マスク全解除状態・ディスパッチ許可状態である.
     1909
     1910start_rは,CPUロック状態を解除した後,タスクの起動番地を呼び出す.さら
     1911に,タスクの起動番地から戻ってきた場合には,ext_tskを呼び出す.
     1912
     1913activate_contextとstart_rの処理内容は次の通り.
    23791914
    23801915----------------------------------------
     
    23821917activate_context(TCB *p_tcb)
    23831918{
    2384         指定されたタスク(p_tcb)のTCB中のスタックポインタを初期化する
    2385         start_rを,実行再開番地として自タスクのTCBに保存する … (*a)
     1919        指定されたタスク(p_tcb)のTCB中のスタックポインタを初期化する
     1920        start_rを,実行再開番地として自タスクのTCBに保存する … (*a)
    23861921        return;
    23871922
    23881923  start_r:
    23891924#ifdef TOPPERS_SUPPORT_OVRHDR
    2390         ovrtimer_start();                                       /* オーバランタイマの動作開始 */
     1925        ovrtimer_start();                                       /* オーバランタイマの動作開始 */
    23911926#endif /* TOPPERS_SUPPORT_OVRHDR */
    2392         CPUロック解除状æ
    2393 ‹ã«ã™ã‚‹
    2394         自タスク(p_runtsk)の起動番地を,拡張æƒ
    2395 å ±ã‚’パラメータとして呼び出す
    2396         ext_tskに分岐する ... (*c)
     1927        CPUロック解除状態にする
     1928        自タスク(p_runtsk)の起動番地を,拡張情報をパラメータとして呼び出す
     1929        ext_tskに分岐する ... (*c)
    23971930}
    23981931----------------------------------------
    23991932
    2400 (*c)でext_tskを呼ぶ代わりに,自タスクの起動番地を呼び出す時の返り番地を
    2401 ext_tskの番地としておく方法がある.
    2402 
    2403 ã“こで,タスクの起動処理において対象タスクのスタック領域を使ってはなら
    2404 ãªã„理由は,次の通り.制約タスク拡張パッケージにおいて,複数の制約タス
    2405 ã‚¯ãŒã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã‚’å
    2406 ±æœ‰ã—ている場合に,タスクの起動時点では,そのタスク
    2407 ã¨ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã‚’å
    2408 ±æœ‰ã—ているタスクが,スタック領域を使用している可能性
    2409 ãŒã‚るためである.
    2410 
    2411 ã“のポーティングガイドでは,タスクの実行再開番地をTCBに保存している
    2412 (*a)。これをスタックに保存する方法も考えられるが,タスクの起動処理でス
    2413 ã‚¿ãƒƒã‚¯é ˜åŸŸãŒä½¿ãˆãªã„ことから,タスクの起動処理だけは例外扱いしなければ
    2414 ãªã‚‰ãªã„.例えば,タスクの起動処理においてはTCB中のスタックポインタを特
    2415 æ®Šãªå€¤ï¼ˆä¾‹ãˆã°0)に設定しておき,ディスパッチャ本体でTCB中のスタックポ
    2416 ã‚¤ãƒ³ã‚¿ãŒãã®å€¤ã®å ´åˆã«ã¯start_rに分岐させ,start_rにおいてスタックポイ
    2417 ãƒ³ã‚¿ã‚’初期化する方法が考えられる.
    2418 
    2419 6.6 割込みハンドラ
    2420 
    2421 6.6.1 割込みハンドラの出å
    2422 ¥å£å‡¦ç†
    2423 
    2424 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã®å‰²è¾¼ã¿ã®å‡ºå
    2425 ¥å£å‡¦ç†ã®æ–¹æ³•ã¯ï¼Œãƒ—ロセッサによって大きく異な
    2426 ã‚‹ãŒï¼ŒãŠãŠã‚ˆãã®å‡¦ç†å†
    2427 å®¹ã¯æ¬¡ã®é€šã‚Šï¼Ž
     1933(*c)でext_tskを呼ぶ代わりに,自タスクの起動番地を呼び出す時の返り番地を
     1934ext_tskの番地としておく方法がある.
     1935
     1936ここで,タスクの起動処理において対象タスクのスタック領域を使ってはなら
     1937ない理由は,次の通り.制約タスク拡張パッケージにおいて,複数の制約タス
     1938クがスタック領域を共有している場合に,タスクの起動時点では,そのタスク
     1939とスタック領域を共有しているタスクが,スタック領域を使用している可能性
     1940があるためである.
     1941
     1942このポーティングガイドでは,タスクの実行再開番地をTCBに保存している
     1943(*a)。これをスタックに保存する方法も考えられるが,タスクの起動処理でス
     1944タック領域が使えないことから,タスクの起動処理だけは例外扱いしなければ
     1945ならない.例えば,タスクの起動処理においてはTCB中のスタックポインタを特
     1946殊な値(例えば0)に設定しておき,ディスパッチャ本体でTCB中のスタックポ
     1947インタがその値の場合にはstart_rに分岐させ,start_rにおいてスタックポイ
     1948ンタを初期化する方法が考えられる.
     1949
     19506.6 割込みハンドラ
     1951
     19526.6.1 割込みハンドラの出入口処理
     1953
     1954カーネル管理の割込みの出入口処理の方法は,プロセッサによって大きく異な
     1955るが,おおよその処理内容は次の通り.
    24281956
    24291957----------------------------------------
    24301958void
    2431 <割込みの出å
    2432 ¥å£å‡¦ç†>(void)
     1959<割込みの出入口処理>(void)
    24331960{
    2434         少なくともカーネル管理の割込みを禁止した状æ
    2435 ‹ã«ã™ã‚‹ … (*f)
    2436         スクラッチレジスタをスタックに保存する
    2437         if (タスクコンテキストで割込み発生) {
     1961        少なくともカーネル管理の割込みを禁止した状態にする … (*f)
     1962        スクラッチレジスタをスタックに保存する
     1963        if (タスクコンテキストで割込み発生) {
    24381964#ifdef TOPPERS_SUPPORT_OVRHDR
    2439                 ovrtimer_stop();                                /* オーバランタイマの停止 */
     1965                ovrtimer_stop();                                /* オーバランタイマの停止 */
    24401966#endif /* TOPPERS_SUPPORT_OVRHDR */
    2441                 スタックを非タスクコンテキスト用のスタックに切り換え,
    2442                                                                 非タスクコンテキストに切り換える
     1967                スタックを非タスクコンテキスト用のスタックに切り換え,
     1968                                                                非タスクコンテキストに切り換える
    24431969        }
    2444         割込み優å
    2445 ˆåº¦ãƒžã‚¹ã‚¯ã‚’,受け付けた割込み要求の割込優å
    2446 ˆåº¦ã«è¨­å®šã—,
    2447                                 CPUロック解除状æ
    2448 ‹ã«ã™ã‚‹ï¼ˆå—け付けた割込みよりも
    2449                                 優å
    2450 ˆåº¦ã®é«˜ã„割込みを受け付けるようにする)… (*i)
     1970        割込み優先度マスクを,受け付けた割込み要求の割込優先度に設定し,
     1971                                CPUロック解除状態にする(受け付けた割込みよりも
     1972                                優先度の高い割込みを受け付けるようにする)… (*i)
    24511973
    24521974
    24531975#ifdef LOG_INH_ENTER
    2454         log_inh_enter(割込みハンドラ番号);
     1976        log_inh_enter(割込みハンドラ番号);
    24551977#endif /* LOG_INH_ENTER */
    2456         割込みハンドラを呼び出す
     1978        割込みハンドラを呼び出す
    24571979#ifdef LOG_INH_LEAVE
    2458         log_inh_leave(割込みハンドラ番号);
     1980        log_inh_leave(割込みハンドラ番号);
    24591981#endif /* LOG_INH_LEAVE */
    24601982
    24611983  ret_int:
    2462         if (タスクコンテキストで割込み発生) {
    2463                 (少なくとも)カーネル管理の割込みを禁止した状æ
    2464 ‹ã«ã™ã‚‹ … (*d)
    2465                 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
    2466                                                                                                                                 … (*g)
     1984        if (タスクコンテキストで割込み発生) {
     1985                (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d)
     1986                スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
     1987                                                                                                                                … (*g)
    24671988                if (reqflg) {
    24681989                        reqflg = false;
    2469                         CPUロック状æ
    2470 ‹ã«ã™ã‚‹ … (*e)
    2471                         割込み優å
    2472 ˆåº¦ãƒžã‚¹ã‚¯ã‚’,å
    2473 ¨è§£é™¤çŠ¶æ
    2474 ‹ï¼ˆTIPM_ENAALL)に設定する … (*h)
     1990                        CPUロック状態にする … (*e)
     1991                        割込み優先度マスクを,全解除状態(TIPM_ENAALL)に設定する … (*h)
    24751992                        if (dspflg && p_runtsk != p_schedtsk) {
    2476                                 スクラッチレジスタを除くすべてのレジスタをスタックに保存する
    2477                                 スタックポインタを自タスク(p_runtsk)のTCBに保存する
    2478                                 ret_int_rを,実行再開番地として自タスクのTCBに保存する … (*a)
    2479                                 dispatcherに分岐する
     1993                                スクラッチレジスタを除くすべてのレジスタをスタックに保存する
     1994                                スタックポインタを自タスク(p_runtsk)のTCBに保存する
     1995                                ret_int_rを,実行再開番地として自タスクのTCBに保存する … (*a)
     1996                                dispatcherに分岐する
    24801997
    24811998                          ret_int_r:
    2482                                 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
     1999                                スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
    24832000                        }
    24842001#ifdef TOPPERS_SUPPORT_OVRHDR
    2485                         ovrtimer_start();                       /* オーバランタイマの動作開始 */
     2002                        ovrtimer_start();                       /* オーバランタイマの動作開始 */
    24862003#endif /* TOPPERS_SUPPORT_OVRHDR */
    2487                         calltex(); … (*b)
     2004                        calltex(); (*b)
    24882005                }
    24892006#ifdef TOPPERS_SUPPORT_OVRHDR
    24902007                else {
    2491                         ovrtimer_start();                       /* オーバランタイマの動作開始 */
     2008                        ovrtimer_start();                       /* オーバランタイマの動作開始 */
    24922009                }
    24932010#endif /* TOPPERS_SUPPORT_OVRHDR */
    24942011        }
    2495         割込み処理からのリターン後に,割込み優å
    2496 ˆåº¦ãƒžã‚¹ã‚¯ãŒ
    2497                                                                         割込み処理前の値に戻るように準備する
    2498         割込み処理からのリターン後に,CPUロック解除状æ
    2499 ‹ã«æˆ»ã‚‹ã‚ˆã†ã«æº–備する
    2500         スクラッチレジスタをスタックから復帰する
    2501         割込み処理からのリターン
     2012        割込み処理からのリターン後に,割込み優先度マスクが
     2013                                                                        割込み処理前の値に戻るように準備する
     2014        割込み処理からのリターン後に,CPUロック解除状態に戻るように準備する
     2015        スクラッチレジスタをスタックから復帰する
     2016        割込み処理からのリターン
    25022017}
    25032018----------------------------------------
    25042019
    2505 å‰²è¾¼ã¿ã®å—付けにより,スタックポインタが切り換わらず,すべての割込みが
    2506 ç¦æ­¢ã•ã‚Œãªã„プロセッサでは,(*f)において,少なくともカーネル管理の割込
    2507 ã¿ã‚’禁止する.この理由は次の通りである.
    2508 
    2509 å‰²è¾¼ã¿ã®å
    2510 ¥å£å‡¦ç†ã«ãŠã„て,スタックを非タスクコンテキスト用のスタックに
    2511 åˆ‡ã‚Šæ›ãˆã‚‹å‰ã«å¤šé‡å‰²è¾¼ã¿ãŒç™ºç”Ÿã™ã‚‹ã¨ï¼Œã‚¿ã‚¹ã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸãŒä½¿ç”¨ã•ã‚Œã‚‹ï¼Ž
    2512 ä¸Šè¨˜ã®ã‚ˆã†ãªãƒ—ロセッサでは,スタックの切換え前に,最大で割込み優å
    2513 ˆåº¦ã®
    2514 æ®µæ•°åˆ†ã®å¤šé‡å‰²è¾¼ã¿ãŒç™ºç”Ÿã™ã‚‹ã“とを防ぐことはできず,各タスクのスタック
    2515 é ˜åŸŸã‚’確保する際に,その分を見込んで確保しなければならない.各タスクの
    2516 ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã‚’なるべく小さくするためには,スタックをなるべく使用しない
    2517 å†
    2518 ã«ï¼Œå¤šé‡å‰²è¾¼ã¿ã‚’禁止するのが望ましい.そのため,スクラッチレジスタを
    2519 ã‚¹ã‚¿ãƒƒã‚¯ã«ä¿å­˜ã™ã‚‹å‰ã«ï¼Œå‰²è¾¼ã¿ã‚’禁止する.ただし,割込みの禁止処理にå¿
    2520 
    2521 è¦ãªæœ€ä½Žé™ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã«ã¤ã„ては,割込みの禁止にå
    2522 ˆç«‹ã£ã¦ã‚¹ã‚¿ãƒƒã‚¯ã«ä¿å­˜ã™
    2523 ã‚‹å¿
    2524 è¦ãŒã‚る.
    2525 
    2526 åŒæ§˜ã®ã“とは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル
    2527 ç®¡ç†å¤–の割込みについても,スタックをなるべく使用しないå†
    2528 ã«ç¦æ­¢ã™ã‚‹ã®ãŒ
    2529 æœ›ã¾ã—い.このことから,カーネル管理外の割込みを使用する場合には,(*f)
    2530 ã«ãŠã„て,すべての割込みを禁止した状æ
    2531 ‹ã«ã™ã‚‹ã®ãŒæœ›ã¾ã—いことになる.一
    2532 æ–¹ã§ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みの禁止時間が長くなると,カーネル管理外の割
    2533 è¾¼ã¿ã®å¿œç­”性が低下するため,ユーザに注意を促すå¿
    2534 è¦ãŒã‚る.また,カーネ
    2535 ãƒ«ç®¡ç†å¤–の割込み処理においても,非タスクコンテキスト用のスタック(また
    2536 ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込み処理用のスタック)に切り換えることが望ましい
    2537 ãŒï¼Œã“れはカーネルの管轄外である.
    2538 
    2539 (*i)に含まれる割込み優å
    2540 ˆåº¦ãƒžã‚¹ã‚¯ã‚’設定する処理は,プロセッサがハードウェ
    2541 ã‚¢ã§å®Ÿç¾ã—ている場合も多い.
    2542 
    2543 (*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状æ
    2544 ‹ã«ã™
    2545 ã‚‹å¿
    2546 è¦ã¯ãªã„.例えば,CPUロック状æ
    2547 ‹ã§ã‚ることを示す変数を用意している場
    2548 åˆã«ã¯ï¼Œ(*d)の時点ではその変数をCPUロック状æ
    2549 ‹ã‚’示す値に変更するå¿
    2550 è¦ã¯ãª
    2551 ãï¼Œ(*e)において変更すればよい.
    2552 
    2553 (*g)においてタスクコンテキストに切り換える処理は,割込み処理からのリター
    2554 ãƒ³ã«ã‚ˆã‚Šã‚¹ã‚¿ãƒƒã‚¯ã¨ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒå
    2555 ƒã«æˆ»ã‚‹ãƒ—ロセッサでは,reqflgがtrueの
    2556 å ´åˆã«ã®ã¿è¡Œãˆã°ã‚ˆã„.reqflgがfalseの時は,非タスクコンテキストのまま処
    2557 ç†ã‚’続け,割込み処理からのリターンでタスクコンテキストに戻ることになる.
    2558 
    2559 (*e)においてCPUロック状æ
    2560 ‹ã«ã™ã‚‹ã®ã¯ï¼Œdispatcherに分岐する際と,(*b)にお
    2561 ã„てcalltex(または,それを展開した場合にはcall_texrtn)を呼び出す際に,
    2562 CPUロック状æ
    2563 ‹ã«ãªã£ã¦ã„ã‚‹å¿
    2564 è¦ãŒã‚るためである.
    2565 
    2566 (*h)の処理が実行されるのは,割込み処理前に割込み優å
    2567 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    2568 ¨è§£é™¤çŠ¶
    2569 æ
    2570 ‹ï¼ˆTIPM_ENAALL)であった場合に限られ,ここで割込み優å
    2571 ˆåº¦ãƒžã‚¹ã‚¯ã‚’å
    2572 ¨è§£é™¤
    2573 çŠ¶æ
    2574 ‹ã«è¨­å®šã™ã‚‹ã®ã¯ï¼Œå‰²è¾¼ã¿å‡¦ç†å‰ã®å€¤ã«æˆ»ã™ã®ã¨ç­‰ä¾¡ã§ã‚る.ここでこの処
    2575 ç†ã‚’行うのは,dispatcherに分岐する際と,(*b)においてcalltex(または,そ
    2576 ã‚Œã‚’展開した場合にはcall_texrtn)を呼び出す際には,割込み優å
    2577 ˆåº¦ãƒžã‚¹ã‚¯å
    2578 ¨
    2579 è§£é™¤çŠ¶æ
    2580 ‹ã«ãªã£ã¦ã„ã‚‹å¿
    2581 è¦ãŒã‚るためである.
    2582 
    2583 ã‚¿ã‚¹ã‚¯ã®å®Ÿè¡Œä¸­ã«å‰²è¾¼ã¿ãŒç™ºç”Ÿã—,上の処理中でdispatcherに分岐した場合,
    2584 ãã®ã‚¿ã‚¹ã‚¯ãŒæ¬¡ã«å®Ÿè¡Œã•ã‚Œã‚‹æ™‚には,実行再開番地として登録したret_int_rに
    2585 æˆ»ã£ã¦ãã‚‹ï¼Žret_int_rには,dispatcherのみから分岐し,その時の状æ
    2586 ‹ã¯ï¼Œã‚¿
    2587 ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ»CPUロック状æ
    2588 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    2589 ˆåº¦ãƒžã‚¹ã‚¯å
    2590 ¨è§£é™¤çŠ¶æ
    2591 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッ
    2592 ãƒè¨±å¯çŠ¶æ
    2593 ‹ã§ã‚る.
    2594 
    2595 å‰²è¾¼ã¿ã®å‡ºå
    2596 ¥å£å‡¦ç†ã‚’アセンブリ言語で記述する場合には,トレースログ取得
    2597 å‡¦ç†ã¯ï¼Œã€Œ6.2 トレースログ機能への対応」の節で記述した方法でコーディン
    2598 ã‚°ã™ã‚‹ã“と.
    2599 
    2600 6.6.2 割込みハンドラ毎の出å
    2601 ¥å£å‡¦ç†ã®ç”Ÿæˆ
    2602 
    2603 å‰²è¾¼ã¿ãƒ™ã‚¯ãƒˆãƒ«ã‚’ハードウェアで実現している場合など,割込みハンドラ毎に
    2604ʌ༌
    2605 ¥å£å‡¦ç†ã‚’用意した方が効率が良いターゲットのために,割込みハンドラ毎
    2606 ã«å‡ºå
    2607 ¥å£å‡¦ç†ã‚’生成する機構を用意している.
    2608 
    2609 ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã¯ï¼Œæ¨™æº–の割込み管理機能の初期化処理を用いた場合のみ,ター
    2610 ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§ä½¿ã‚ã‚Œã‚‹ï¼Žå‰²è¾¼ã¿ç®¡ç†æ©Ÿèƒ½ã®åˆæœŸåŒ–処理をターゲット依存部
    2611 ã§ç”¨æ„ã—,その中でこれらのマクロを使わない場合には,これらのマクロを用
    2612 æ„ã™ã‚‹å¿
    2613 è¦ã¯ãªã„.
     2020割込みの受付けにより,スタックポインタが切り換わらず,すべての割込みが
     2021禁止されないプロセッサでは,(*f)において,少なくともカーネル管理の割込
     2022みを禁止する.この理由は次の通りである.
     2023
     2024割込みの入口処理において,スタックを非タスクコンテキスト用のスタックに
     2025切り換える前に多重割込みが発生すると,タスクのスタック領域が使用される.
     2026上記のようなプロセッサでは,スタックの切換え前に,最大で割込み優先度の
     2027段数分の多重割込みが発生することを防ぐことはできず,各タスクのスタック
     2028領域を確保する際に,その分を見込んで確保しなければならない.各タスクの
     2029スタック領域をなるべく小さくするためには,スタックをなるべく使用しない
     2030内に,多重割込みを禁止するのが望ましい.そのため,スクラッチレジスタを
     2031スタックに保存する前に,割込みを禁止する.ただし,割込みの禁止処理に必
     2032要な最低限のレジスタについては,割込みの禁止に先立ってスタックに保存す
     2033る必要がある.
     2034
     2035同様のことは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル
     2036管理外の割込みについても,スタックをなるべく使用しない内に禁止するのが
     2037望ましい.このことから,カーネル管理外の割込みを使用する場合には,(*f)
     2038において,すべての割込みを禁止した状態にするのが望ましいことになる.一
     2039方で,カーネル管理外の割込みの禁止時間が長くなると,カーネル管理外の割
     2040込みの応答性が低下するため,ユーザに注意を促す必要がある.また,カーネ
     2041ル管理外の割込み処理においても,非タスクコンテキスト用のスタック(また
     2042は,カーネル管理外の割込み処理用のスタック)に切り換えることが望ましい
     2043が,これはカーネルの管轄外である.
     2044
     2045(*i)に含まれる割込み優先度マスクを設定する処理は,プロセッサがハードウェ
     2046アで実現している場合も多い.
     2047
     2048(*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状態にす
     2049る必要はない.例えば,CPUロック状態であることを示す変数を用意している場
     2050合には,(*d)の時点ではその変数をCPUロック状態を示す値に変更する必要はな
     2051く,(*e)において変更すればよい.
     2052
     2053(*g)においてタスクコンテキストに切り換える処理は,割込み処理からのリター
     2054ンによりスタックとコンテキストが元に戻るプロセッサでは,reqflgがtrueの
     2055場合にのみ行えばよい.reqflgがfalseの時は,非タスクコンテキストのまま処
     2056理を続け,割込み処理からのリターンでタスクコンテキストに戻ることになる.
     2057
     2058(*e)においてCPUロック状態にするのは,dispatcherに分岐する際と,(*b)にお
     2059いてcalltex(または,それを展開した場合にはcall_texrtn)を呼び出す際に,
     2060CPUロック状態になっている必要があるためである.
     2061
     2062(*h)の処理が実行されるのは,割込み処理前に割込み優先度マスクが全解除状
     2063態(TIPM_ENAALL)であった場合に限られ,ここで割込み優先度マスクを全解除
     2064状態に設定するのは,割込み処理前の値に戻すのと等価である.ここでこの処
     2065理を行うのは,dispatcherに分岐する際と,(*b)においてcalltex(または,そ
     2066れを展開した場合にはcall_texrtn)を呼び出す際には,割込み優先度マスク全
     2067解除状態になっている必要があるためである.
     2068
     2069タスクの実行中に割込みが発生し,上の処理中でdispatcherに分岐した場合,
     2070そのタスクが次に実行される時には,実行再開番地として登録したret_int_rに
     2071戻ってくる.ret_int_rには,dispatcherのみから分岐し,その時の状態は,タ
     2072スクコンテキスト・CPUロック状態・割込み優先度マスク全解除状態・ディスパッ
     2073チ許可状態である.
     2074
     2075割込みの出入口処理をアセンブリ言語で記述する場合には,トレースログ取得
     2076処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
     2077グすること.
     2078
     20796.6.2 割込みハンドラ毎の出入口処理の生成
     2080
     2081割込みベクトルをハードウェアで実現している場合など,割込みハンドラ毎に
     2082出入口処理を用意した方が効率が良いターゲットのために,割込みハンドラ毎
     2083に出入口処理を生成する機構を用意している.
     2084
     2085以下のマクロは,標準の割込み管理機能の初期化処理を用いた場合のみ,ター
     2086ゲット非依存部で使われる.割込み管理機能の初期化処理をターゲット依存部
     2087で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
     2088意する必要はない.
    26142089
    26152090(6-6-2-1) INT_ENTRY(inhno, inthdr)
    26162091
    2617 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ãŒinhno,割込みハンドラの関数名がinthdrである割込みハ
    2618 ãƒ³ãƒ‰ãƒ©ã®å‡ºå
    2619 ¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«ã‚’作るマクロ.INTHDR_ENTRYを用いて割込みハン
    2620 ãƒ‰ãƒ©æ¯Žã«å‡ºå
    2621 ¥å£å‡¦ç†ã‚’生成する場合には,次のように定義する.
     2092割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
     2093ンドラの出入口処理のラベルを作るマクロ.INTHDR_ENTRYを用いて割込みハン
     2094ドラ毎に出入口処理を生成する場合には,次のように定義する.
    26222095
    26232096#define INT_ENTRY(inhno, inthdr)        _kernel_##inthdr##_##inhno
    26242097
    2625 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©æ¯Žã«å‡ºå
    2626 ¥å£å‡¦ç†ã‚’作るå¿
    2627 è¦ãŒãªã„場合には,次のように定義し
    2628 ã¦ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®é–¢æ•°åã‚’そのまま返す.
     2098割込みハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し
     2099て,割込みハンドラの関数名をそのまま返す.
    26292100
    26302101#define INT_ENTRY(inhno, inthdr)        inthdr
     
    26322103(6-6-2-2) INTHDR_ENTRY(inhno, inhno_num, inthdr)
    26332104
    2634 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ãŒinhno,割込みハンドラの関数名がinthdrである割込みハ
    2635 ãƒ³ãƒ‰ãƒ©ã®å‡ºå
    2636 ¥å£å‡¦ç†ã‚’生成するマクロ.inhno_numには,アセンブリ言語記述用
    2637 ã«ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ãŒæ•°å€¤ã§æ¸¡ã•ã‚Œã‚‹ï¼Žå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©æ¯Žã«å‡ºå
    2638 ¥å£å‡¦ç†ã‚’
    2639 ä½œã‚‹å¿
    2640 è¦ãŒãªã„場合には,空に定義する.
    2641 
    2642 6.6.3 割込みハンドラの設定
    2643 
    2644 (6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション)
    2645 
    2646 inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に
    2647 true,そうでない場合にfalseを返すマクロ.
    2648 
    2649 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
    2650 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ä½¿ã‚ãªã„なら,用意するå¿
    2651 è¦ãŒãªã„.
     2105割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
     2106ンドラの出入口処理を生成するマクロ.inhno_numには,アセンブリ言語記述用
     2107に,割込みハンドラ番号が数値で渡される.割込みハンドラ毎に出入口処理を
     2108作る必要がない場合には,空に定義する.
     2109
     21106.6.3 割込みハンドラの設定
     2111
     2112(6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション)
     2113
     2114inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に
     2115true,そうでない場合にfalseを返すマクロ.
     2116
     2117ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
     2118ゲット依存部で使わないなら,用意する必要がない.
    26522119
    26532120(6-6-3-2) void x_define_inh(INHNO inhno, FP int_entry)
    26542121
    2655 inhnoで指定された割込みハンドラの出å
    2656 ¥å£å‡¦ç†ã®ç•ªåœ°ã‚’int_entryに設定する.
    2657 
    2658 ã“の関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
    2659 ãƒˆéžä¾å­˜éƒ¨ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žå‰²è¾¼ã¿ç®¡ç†æ©Ÿèƒ½ã®åˆæœŸåŒ–処理をターゲット依存
    2660 éƒ¨ã§ç”¨æ„ã—,その中でこの関数を呼び出さない場合には,この関数を用意する
    2661 å¿
    2662 è¦ã¯ãªã„.
    2663 
    2664 ã“の関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
    2665 ã‚«ãƒ¼ãƒãƒ«ã®åˆæœŸåŒ–処理(NMIを除くすべての割込みがマスクされている)から呼
    2666 ã³å‡ºã›ã‚‹ã‚ˆã†ã«å®Ÿè£
    2667 ã™ã‚Œã°ã‚ˆã„.
    2668 
    2669 æŒ‡å®šã•ã‚ŒãŸå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ãŒDEF_INHに対するものとして有効な値でない場
    2670 åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    2671 è¦ãŒãªã„(assertでエラーとするのが望ましい).これ
    2672 ã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒï¼Œãƒ‘ス2のテンプレートファイルのターゲット依存部
    2673 ã§å®šç¾©ã™ã‚‹INHNO_DEFINH_VALIDを用いてエラーを検出するためである.
    2674 
    2675 6.6.4 割込み要求ラインの属性の設定
    2676 
    2677 (6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション)
    2678 
    2679 intnoが,割込み番号として有効な値である場合にtrue,そうでない場合に
    2680 falseを返すマクロ.CFG_INTには,すべての割込み番号を指定することができ
    2681 ã‚‹ãŸã‚ï¼Œã“のマクロは,intnoが有効な値の場合にはtrue,intnoが無効の値の
    2682 å ´åˆã«ã¯falseを返すようにする.
    2683 
    2684 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
    2685 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ä½¿ã‚ãªã„なら,用意するå¿
    2686 è¦ãŒãªã„.
     2122inhnoで指定された割込みハンドラの出入口処理の番地をint_entryに設定する.
     2123
     2124この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
     2125ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
     2126部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
     2127必要はない.
     2128
     2129この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
     2130カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
     2131び出せるように実装すればよい.
     2132
     2133指定された割込みハンドラ番号がDEF_INHに対するものとして有効な値でない場
     2134合の動作は保証する必要がない(assertでエラーとするのが望ましい).これ
     2135は,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存部
     2136で定義するINHNO_DEFINH_VALIDを用いてエラーを検出するためである.
     2137
     21386.6.4 割込み要求ラインの属性の設定
     2139
     2140(6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション)
     2141
     2142intnoが,割込み番号として有効な値である場合にtrue,そうでない場合に
     2143falseを返すマクロ.CFG_INTには,すべての割込み番号を指定することができ
     2144るため,このマクロは,intnoが有効な値の場合にはtrue,intnoが無効の値の
     2145場合にはfalseを返すようにする.
     2146
     2147ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
     2148ゲット依存部で使わないなら,用意する必要がない.
    26872149
    26882150(6-6-4-2) void x_config_int(INTNO intno, ATR intatr, PRI intpri)
    26892151
    2690 intnoで指定された割込み要求ラインの割込み属性を,intatrで指定された通り
    2691 ã«è¨­å®šã™ã‚‹ï¼Žã¾ãŸï¼Œå‰²è¾¼ã¿å„ªå
    2692 ˆåº¦ã‚’,intpriで指定された値に設定する.
    2693 
    2694 ã“の関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
    2695 ãƒˆéžä¾å­˜éƒ¨ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žå‰²è¾¼ã¿ç®¡ç†æ©Ÿèƒ½ã®åˆæœŸåŒ–処理をターゲット依存
    2696 éƒ¨ã§ç”¨æ„ã—,その中でこの関数を呼び出さない場合には,この関数を用意する
    2697 å¿
    2698 è¦ã¯ãªã„.
    2699 
    2700 ã“の関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
    2701 ã‚«ãƒ¼ãƒãƒ«ã®åˆæœŸåŒ–処理(NMIを除くすべての割込みがマスクされている)から呼
    2702 ã³å‡ºã›ã‚‹ã‚ˆã†ã«å®Ÿè£
    2703 ã™ã‚Œã°ã‚ˆã„.
    2704 
    2705 intatrとして設定できる割込み属性は次の通り.
    2706 
    2707         TA_ENAINT               0x01    割込み要求禁止フラグをクリア
    2708         TA_EDGE                 0x02    エッジトリガ
    2709 
    2710 ã“の他に,ターゲット定義で割込み属性を追加してもよい.ターゲット定義で
    2711 è¿½åŠ ã™ã‚‹ãŸã‚ã«ï¼Œä»¥ä¸‹ã®å±žæ€§åãŒäºˆç´„されている.
    2712 
    2713         TA_POSEDGE                              ポジティブエッジトリガ
    2714         TA_NEGEDGE                              ネガティブエッジトリガ
    2715         TA_BOTHEDGE                             ä¸¡ã‚¨ãƒƒã‚¸ãƒˆãƒªã‚¬
    2716         TA_LOWLEVEL                             ãƒ­ãƒ¼ãƒ¬ãƒ™ãƒ«ãƒˆãƒªã‚¬
    2717         TA_HIGHLEVEL                    ハイレベルトリガ
    2718 
    2719 ã“れらの属性名をターゲット定義で追加する場合には,その属性値を決定し,
    2720 å®šç¾©ã‚’target_kernel.h(または,そこからインクルードされるファイル)に含
    2721 ã‚ã‚‹ï¼Žã¾ãŸï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ†ãƒ³ãƒ—レートファイルから参ç
    2722 §ã§ãã‚‹ã‚ˆã†ã«ï¼Œ
    2723 target_def.csv(または,同等の役割を持つファイル)に含め,コンフィギュ
    2724 ãƒ¬ãƒ¼ã‚¿ãƒ†ãƒ³ãƒ—レートファイルのターゲット非依存部でエラーとならないように,
    2725 target.tf(または,そこからインクルードされるファイル)でTARGET_INTATR
    2726 ã«è¨­å®šã™ã‚‹ï¼Ž
    2727 
    2728 æŒ‡å®šã•ã‚ŒãŸå‰²è¾¼ã¿ç•ªå·ãŒæœ‰åŠ¹ãªå€¤ã§ãªã„場合や,その割込み要求ラインに対し
    2729 ã¦è¨­å®šã§ããªã„属性を指定した場合,設定できない割込み優å
    2730 ˆåº¦ã‚’指定した場
    2731 åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    2732 è¦ãŒãªã„(assertでエラーとするのが望ましい).この
    2733 ã‚ˆã†ãªã‚±ãƒ¼ã‚¹ã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã§ã‚¨ãƒ©ãƒ¼ã‚’検出すべきである.コンフィ
    2734 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ†ãƒ³ãƒ—レートファイルのターゲット非依存部は,パス2のテンプレー
    2735 ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§å®šç¾©ã™ã‚‹INTNO_CFGINT_VALID,
    2736 TARGET_INTATR,INTPRI_CFGINT_VALIDを用いてエラーを検出するが,標準の割
    2737 è¾¼ã¿å±žæ€§ï¼ˆTA_ENAINT,TA_EDGE)が設定できない場合や,設定できない属性や
    2738 å‰²è¾¼ã¿å„ªå
    2739 ˆåº¦ãŒå‰²è¾¼ã¿è¦æ±‚ラインによって異なる場合には,コンフィギュレー
    2740 ã‚¿ãƒ†ãƒ³ãƒ—レートファイルのターゲット依存部で検出しなければならない.
    2741 
    2742 6.6.5 割込み管理機能の初期化処理の変更
    2743 
    2744 (6-6-5-1) OMIT_INITIALIZE_INTERRUPT(オプション)
    2745 
    2746 å‰²è¾¼ã¿ç®¡ç†æ©Ÿèƒ½ã®åˆæœŸåŒ–処理をターゲット依存部で用意し,ターゲット非依存
    2747 éƒ¨ã«å«ã¾ã‚Œã‚‹æ¨™æº–の割込み管理機能の初期化処理を用いない場合には,このシ
    2748 ãƒ³ãƒœãƒ«ã‚’マクロ定義する.
    2749 
    2750 ã“のシンボルをマクロ定義すると,INHINIB,INTINIB,initialize_interrupt
    2751 ã®å®šç¾©ãŒï¼Œã‚«ãƒ¼ãƒãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã‹ã‚‰å–り除かれる.また,
    2752 TNUM_INHNO,tnum_inhno,inhinib_table,TNUM_INTNO,tnum_intno,
    2753 intinib_tableの定義と,割込みハンドラ毎の出å
    2754 ¥å£å‡¦ç†ã‚’生成するための記述
    2755 ï¼ˆINTHDR_ENTRYマクロのリスト)が,コンフィギュレータのパス2のテンプレー
    2756 ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã«ã‚ˆã£ã¦kernel_cfg.cに生成されなくなる.
    2757 ãŸã ã—,コンフィギュレータのパス2のテンプレートファイルのターゲット依存
    2758 éƒ¨ã§ï¼ŒUSE_INHINIB_TABLEとUSE_INTINIB_TABLEを設定することで,その一部
    2759 åˆ†ã‚’kernel_cfg.cに生成することが可能である.
    2760 
    2761 (6-6-5-2) void initialize_interrupt(void)(オプション)
    2762 
    2763 OMIT_INITIALIZE_INTERRUPTをマクロ定義した場合には,この関数をターゲット
    2764 ä¾å­˜éƒ¨ã§ç”¨æ„ã™ã‚‹ï¼ŽOMIT_INITIALIZE_INTERRUPTをマクロ定義することにより取
    2765 ã‚Šé™¤ã‹ã‚Œã‚‹ãã®ä»–のデータ型,変数,マクロは,この関数で使用する場合にの
    2766 ã¿ç”¨æ„ã™ã‚Œã°ã‚ˆã„.
    2767 
    2768 6.6.6 デフォルトの割込みハンドラ
    2769 
    2770 (6-6-6-1) void default_int_handler(void)(オプション)
    2771 
    2772 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«ã‚ˆã‚Šå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®ãƒ†ãƒ¼ãƒ–ルを生成する場合などには,
    2773 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‚’登録しなかった割込みハンドラ番号に対して,デフォルトの
    2774 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¨ã—て,default_int_handlerを登録する.
    2775 
    2776 default_int_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
    2777 ãŒç”¨æ„ã—たもので置き換えられるように,OMIT_DEFAULT_INT_HANDLERをマクロ
    2778 å®šç¾©ã—た場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
    2779 ãŒç”¨æ„ã™ã‚‹å ´åˆã®åç§°ã¯ï¼Œ_kernel_default_int_handlerとなる.
    2780 
    2781 6.6.7 カーネル管理外の割込み
    2782 
    2783 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みハンドラは,カーネルå†
    2784 ã®å‰²è¾¼ã¿å‡ºå
    2785 ¥å£å‡¦ç†ã‚’経由せ
    2786 ãšã«å®Ÿè¡Œã™ã‚‹ã®ãŒåŸºæœ¬ã§ã‚る.
    2787 
    2788 ãŸã ã—,すべての割込みで同じアドレスに分岐するプロセッサでは,カーネル
    2789 å†
    2790 ã®å‰²è¾¼ã¿å‡ºå
    2791 ¥å£å‡¦ç†ã‚’å
    2792 ¨ãçµŒç”±ã›ãšã«ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みハンドラを実
    2793 è¡Œã™ã‚‹ã“とができないため,割込み出å
    2794 ¥å£å‡¦ç†ã®ãªã‚‹ã¹ãæ—©ã„タイミングで,
    2795 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みであるかを判別し,処理å†
    2796 å®¹ã‚’分けるå¿
    2797 è¦ãŒã‚る.å
    2798 ·
    2799 ä½“的には,カーネル管理外の割込みの出å
    2800 ¥å£å‡¦ç†ã§ã¯ï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©ã®
    2801 åœæ­¢ã¨å‹•ä½œé–‹å§‹ã‚’行ってはならない.また,reqflgをチェックし,タスク切換
    2802 ãˆã‚„タスク例外処理ルーチンの呼出しを行うå¿
    2803 è¦ãŒãªã„.さらに,NMIの出å
    2804 ¥å£
    2805 å‡¦ç†ã§ã¯ï¼Œãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°å–得処理(log_inh_enterおよびlog_inh_leave)を呼
    2806 ã³å‡ºã—てはならない.
    2807 
    2808 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みハンドラを実行する際に,カーネルå†
    2809 ã®å‰²è¾¼ã¿å‡ºå
    2810 ¥å£
    2811 å‡¦ç†ã®ä¸€éƒ¨åˆ†ã‚’経由する場合には,CPU例外が起こる可能性を極力減らすととも
    2812 ã«ï¼ŒCPU例外を起こす可能性がある場合には,その可能性をターゲット依存部の
    2813 ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã«è¨˜è¼‰ã—なければならない.
    2814 
    2815 æ¬¡ã«ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みの設定方法に関して,「TOPPERS新世代カーネル
    2816 çµ±åˆä»•æ§˜æ›¸ã€ã®ã€Œ2.7.8 カーネル管理外の割込みの設定方法」の節の3つの方法
    2817 ã®ã„ずれを採用するかを決定する.
    2818 
    2819 (a-1)または(a-2)を採用し,カーネル管理外とした割込みに対して,カーネル
    2820 ã®APIによる割込みハンドラの登録と割込み要求ラインの属性の設定をサポート
    2821 ã—ない場合には,それに代わる方法をターゲット依存部のユーザーズマニュア
    2822 ãƒ«ã«è¨˜è¿°ã™ã‚‹ï¼Ž
    2823 
    2824 (a-1)または(a-2)を採用してカーネルのAPIによる割込みハンドラの登録や割込
    2825 ã¿è¦æ±‚ラインの属性の設定をサポートする場合や,(b)を採用した場合には,ター
    2826 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«ãŠã„てそれを実現するå¿
    2827 è¦ãŒã‚る.
    2828 
    2829 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みに対して,DEF_INHによる割込みハンドラの登録をサポー
    2830 ãƒˆã™ã‚‹ã«ã¯ï¼Œæ¬¡ã®è¨­å®šãŒå¿
    2831 è¦ã«ãªã‚‹ï¼Ž
    2832 
    2833 ãƒ»TARGET_INHATRに,TA_NONKERNELを設定する.
    2834 
    2835 ãƒ»(a-1)または(a-2)を採用した場合には,INHNO_DEFINH_VALIDに,カーネル管
    2836 ã€€ç†å¤–とした割込みに対応する割込みハンドラ番号を含める.また,
    2837 ã€€VALID_INHNO_DEFINHを,カーネル管理外とした割込みハンドラ番号を有効な
    2838 ã€€å€¤ã¨åˆ¤å®šã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ï¼Ž
    2839 
    2840 ãƒ»(a-1)または(a-2)を採用した場合には,INHNO_FIX_KERNELにカーネル管理と
    2841 ã€€ã—た割込みハンドラ番号のリストを,INHNO_FIX_NONKERNELにカーネル管理外
    2842 ã€€ã¨ã—た割込みハンドラ番号のリスト設定する.
    2843 
    2844 ãƒ»DEF_INHがカーネル管理外の割込みに対応できるようにする.標準の割込み管
    2845 ã€€ç†æ©Ÿèƒ½ã®åˆæœŸåŒ–処理を用いる場合には,x_define_inhをカーネル管理外の割
    2846 ã€€è¾¼ã¿ã«å¯¾å¿œã•ã›ã‚‹ï¼Ž
    2847 
    2848 ãƒ»å¿
    2849 è¦ãªå ´åˆã«ã¯ï¼ŒTA_NONKERNEL属性が設定された割込みハンドラをカーネル
    2850 ã€€ç®¡ç†å¤–と扱うように,カーネルå†
    2851 ã®å‰²è¾¼ã¿å‡ºå
    2852 ¥å£å‡¦ç†ã‚’修正する.標準の割
    2853 ã€€è¾¼ã¿ç®¡ç†æ©Ÿèƒ½ã®åˆæœŸåŒ–処理を用いる場合,カーネル管理外の割込みに対して
    2854 ã€€ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«å†
    2855 ã®å‰²è¾¼ã¿å‡ºå
    2856 ¥å£å‡¦ç†ã‚’生成せず,アプリケーションが登録し
    2857 ã€€ãŸå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‚’直接呼び出すように,ターゲット非依存部により設定さ
    2858 ã€€ã‚Œã‚‹ãŸã‚ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ã¯å¯¾å¿œã™ã‚‹å¿
    2859 è¦ãŒãªã„.
    2860 
    2861 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みに対して,CFG_INTによる割込み要求ラインの属性の設
    2862 å®šã‚’サポートするには,次の設定がå¿
    2863 è¦ã«ãªã‚‹ï¼Ž
    2864 
    2865 ãƒ»(a-1)または(a-2)を採用した場合には,INTNO_CFGINT_VALIDに,カーネル管
    2866 ã€€ç†å¤–とした割込みに対応する割込み番号を含める.また,VALID_INTNO_CFGINT
    2867 ã€€ã‚’,カーネル管理外とした割込み番号を有効な値と判定するようにする.
    2868 
    2869 ãƒ»(a-1)または(a-2)を採用した場合には,INTNO_FIX_KERNELにカーネル管理と
    2870 ã€€ã—た割込み番号のリストを,INTNO_FIX_NONKERNELにカーネル管理外とした割
    2871 ã€€è¾¼ã¿ç•ªå·ã®ãƒªã‚¹ãƒˆè¨­å®šã™ã‚‹ï¼Ž
    2872 
    2873 ãƒ»INTPRI_CFGINT_VALIDに,カーネル管理外の割込みとなる優å
    2874 ˆåº¦ã‚’含める.
    2875 
    2876 ãƒ»CFG_INTがカーネル管理外の割込みに対応できるようにする.標準の割込み管
    2877 ã€€ç†æ©Ÿèƒ½ã®åˆæœŸåŒ–処理を用いる場合には,x_config_intをカーネル管理外の割
    2878 ã€€è¾¼ã¿ã«å¯¾å¿œã•ã›ã‚‹ï¼Ž
    2879 
    2880 chg_ipmにより,(NMI以外の)カーネル管理外の割込みをマスクできるように
    2881 ã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®è¨­å®šãŒå¿
    2882 è¦ã«ãªã‚‹ï¼Ž
    2883 
    2884 ãƒ»VALID_INTPRI_CHGIPMを,カーネル管理外の割込みとなる優å
    2885 ˆåº¦ã‚’有効な値と
    2886 ã€€åˆ¤å®šã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ï¼Ž
    2887 
    2888 ãƒ»t_set_ipmを,カーネル管理外の割込みとなる優å
    2889 ˆåº¦ã‚’扱えるようにする.
    2890 
    2891 6.6.8 割込みサービスルーチンの生成
     2152intnoで指定された割込み要求ラインの割込み属性を,intatrで指定された通り
     2153に設定する.また,割込み優先度を,intpriで指定された値に設定する.
     2154
     2155この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
     2156ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
     2157部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
     2158必要はない.
     2159
     2160この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
     2161カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
     2162び出せるように実装すればよい.
     2163
     2164intatrとして設定できる割込み属性は次の通り.
     2165
     2166        TA_ENAINT               0x01    割込み要求禁止フラグをクリア
     2167        TA_EDGE                 0x02    エッジトリガ
     2168
     2169この他に,ターゲット定義で割込み属性を追加してもよい.ターゲット定義で
     2170追加するために,以下の属性名が予約されている.
     2171
     2172        TA_POSEDGE                              ポジティブエッジトリガ
     2173        TA_NEGEDGE                              ネガティブエッジトリガ
     2174        TA_BOTHEDGE                             両エッジトリガ
     2175        TA_LOWLEVEL                             ローレベルトリガ
     2176        TA_HIGHLEVEL                    ハイレベルトリガ
     2177
     2178これらの属性名をターゲット定義で追加する場合には,その属性値を決定し,
     2179定義をtarget_kernel.h(または,そこからインクルードされるファイル)に含
     2180める.また,コンフィギュレータテンプレートファイルから参照できるように,
     2181target_def.csv(または,同等の役割を持つファイル)に含め,コンフィギュ
     2182レータテンプレートファイルのターゲット非依存部でエラーとならないように,
     2183target.tf(または,そこからインクルードされるファイル)でTARGET_INTATR
     2184に設定する.
     2185
     2186指定された割込み番号が有効な値でない場合や,その割込み要求ラインに対し
     2187て設定できない属性を指定した場合,設定できない割込み優先度を指定した場
     2188合の動作は保証する必要がない(assertでエラーとするのが望ましい).この
     2189ようなケースは,コンフィギュレータでエラーを検出すべきである.コンフィ
     2190ギュレータテンプレートファイルのターゲット非依存部は,パス2のテンプレー
     2191トファイルのターゲット依存部で定義するINTNO_CFGINT_VALID,
     2192TARGET_INTATR,INTPRI_CFGINT_VALIDを用いてエラーを検出するが,標準の割
     2193込み属性(TA_ENAINT,TA_EDGE)が設定できない場合や,設定できない属性や
     2194割込み優先度が割込み要求ラインによって異なる場合には,コンフィギュレー
     2195タテンプレートファイルのターゲット依存部で検出しなければならない.
     2196
     21976.6.5 割込み管理機能の初期化処理の変更
     2198
     2199(6-6-5-1) OMIT_INITIALIZE_INTERRUPT(オプション)
     2200
     2201割込み管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
     2202部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
     2203ンボルをマクロ定義する.
     2204
     2205このシンボルをマクロ定義すると,INHINIB,INTINIB,initialize_interrupt
     2206の定義が,カーネルのターゲット非依存部から取り除かれる.また,
     2207TNUM_INHNO,tnum_inhno,inhinib_table,TNUM_INTNO,tnum_intno,
     2208intinib_tableの定義と,割込みハンドラ毎の出入口処理を生成するための記述
     2209(INTHDR_ENTRYマクロのリスト)が,コンフィギュレータのパス2のテンプレー
     2210トファイルのターゲット非依存部によってkernel_cfg.cに生成されなくなる.
     2211ただし,コンフィギュレータのパス2のテンプレートファイルのターゲット依存
     2212部で,USE_INHINIB_TABLEとUSE_INTINIB_TABLEを設定することで,その一部
     2213分をkernel_cfg.cに生成することが可能である.
     2214
     2215(6-6-5-2) void initialize_interrupt(void)(オプション)
     2216
     2217OMIT_INITIALIZE_INTERRUPTをマクロ定義した場合には,この関数をターゲット
     2218依存部で用意する.OMIT_INITIALIZE_INTERRUPTをマクロ定義することにより取
     2219り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
     2220み用意すればよい.
     2221
     22226.6.6 デフォルトの割込みハンドラ
     2223
     2224(6-6-6-1) void default_int_handler(void)(オプション)
     2225
     2226コンフィギュレータにより割込みハンドラのテーブルを生成する場合などには,
     2227割込みハンドラを登録しなかった割込みハンドラ番号に対して,デフォルトの
     2228割込みハンドラとして,default_int_handlerを登録する.
     2229
     2230default_int_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
     2231が用意したもので置き換えられるように,OMIT_DEFAULT_INT_HANDLERをマクロ
     2232定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
     2233が用意する場合の名称は,_kernel_default_int_handlerとなる.
     2234
     22356.6.7 カーネル管理外の割込み
     2236
     2237カーネル管理外の割込みハンドラは,カーネル内の割込み出入口処理を経由せ
     2238ずに実行するのが基本である.
     2239
     2240ただし,すべての割込みで同じアドレスに分岐するプロセッサでは,カーネル
     2241内の割込み出入口処理を全く経由せずにカーネル管理外の割込みハンドラを実
     2242行することができないため,割込み出入口処理のなるべく早いタイミングで,
     2243カーネル管理外の割込みであるかを判別し,処理内容を分ける必要がある.具
     2244体的には,カーネル管理外の割込みの出入口処理では,オーバランハンドラの
     2245停止と動作開始を行ってはならない.また,reqflgをチェックし,タスク切換
     2246えやタスク例外処理ルーチンの呼出しを行う必要がない.さらに,NMIの出入口
     2247処理では,トレースログ取得処理(log_inh_enterおよびlog_inh_leave)を呼
     2248び出してはならない.
     2249
     2250カーネル管理外の割込みハンドラを実行する際に,カーネル内の割込み出入口
     2251処理の一部分を経由する場合には,CPU例外が起こる可能性を極力減らすととも
     2252に,CPU例外を起こす可能性がある場合には,その可能性をターゲット依存部の
     2253ユーザーズマニュアルに記載しなければならない.
     2254
     2255次に,カーネル管理外の割込みの設定方法に関して,「TOPPERS新世代カーネル
     2256統合仕様書」の「2.7.8 カーネル管理外の割込みの設定方法」の節の3つの方法
     2257のいずれを採用するかを決定する.
     2258
     2259(a-1)または(a-2)を採用し,カーネル管理外とした割込みに対して,カーネル
     2260のAPIによる割込みハンドラの登録と割込み要求ラインの属性の設定をサポート
     2261しない場合には,それに代わる方法をターゲット依存部のユーザーズマニュア
     2262ルに記述する.
     2263
     2264(a-1)または(a-2)を採用してカーネルのAPIによる割込みハンドラの登録や割込
     2265み要求ラインの属性の設定をサポートする場合や,(b)を採用した場合には,ター
     2266ゲット依存部においてそれを実現する必要がある.
     2267
     2268カーネル管理外の割込みに対して,DEF_INHによる割込みハンドラの登録をサポー
     2269トするには,次の設定が必要になる.
     2270
     2271・TARGET_INHATRに,TA_NONKERNELを設定する.
     2272
     2273・(a-1)または(a-2)を採用した場合には,INHNO_DEFINH_VALIDに,カーネル管
     2274 理外とした割込みに対応する割込みハンドラ番号を含める.また,
     2275 VALID_INHNO_DEFINHを,カーネル管理外とした割込みハンドラ番号を有効な
     2276 値と判定するようにする.
     2277
     2278・(a-1)または(a-2)を採用した場合には,INHNO_FIX_KERNELにカーネル管理と
     2279 した割込みハンドラ番号のリストを,INHNO_FIX_NONKERNELにカーネル管理外
     2280 とした割込みハンドラ番号のリスト設定する.
     2281
     2282・DEF_INHがカーネル管理外の割込みに対応できるようにする.標準の割込み管
     2283 理機能の初期化処理を用いる場合には,x_define_inhをカーネル管理外の割
     2284 込みに対応させる.
     2285
     2286・必要な場合には,TA_NONKERNEL属性が設定された割込みハンドラをカーネル
     2287 管理外と扱うように,カーネル内の割込み出入口処理を修正する.標準の割
     2288 込み管理機能の初期化処理を用いる場合,カーネル管理外の割込みに対して
     2289 は,カーネル内の割込み出入口処理を生成せず,アプリケーションが登録し
     2290 た割込みハンドラを直接呼び出すように,ターゲット非依存部により設定さ
     2291 れるため,ターゲット依存部では対応する必要がない.
     2292
     2293カーネル管理外の割込みに対して,CFG_INTによる割込み要求ラインの属性の設
     2294定をサポートするには,次の設定が必要になる.
     2295
     2296・(a-1)または(a-2)を採用した場合には,INTNO_CFGINT_VALIDに,カーネル管
     2297 理外とした割込みに対応する割込み番号を含める.また,VALID_INTNO_CFGINT
     2298 を,カーネル管理外とした割込み番号を有効な値と判定するようにする.
     2299
     2300・(a-1)または(a-2)を採用した場合には,INTNO_FIX_KERNELにカーネル管理と
     2301 した割込み番号のリストを,INTNO_FIX_NONKERNELにカーネル管理外とした割
     2302 込み番号のリスト設定する.
     2303
     2304・INTPRI_CFGINT_VALIDに,カーネル管理外の割込みとなる優先度を含める.
     2305
     2306・CFG_INTがカーネル管理外の割込みに対応できるようにする.標準の割込み管
     2307 理機能の初期化処理を用いる場合には,x_config_intをカーネル管理外の割
     2308 込みに対応させる.
     2309
     2310chg_ipmにより,(NMI以外の)カーネル管理外の割込みをマスクできるように
     2311する場合には,次の設定が必要になる.
     2312
     2313・VALID_INTPRI_CHGIPMを,カーネル管理外の割込みとなる優先度を有効な値と
     2314 判定するようにする.
     2315
     2316・t_set_ipmを,カーネル管理外の割込みとなる優先度を扱えるようにする.
     2317
     23186.6.8 割込みサービスルーチンの生成
    28922319
    28932320(6-6-8-1) bool_t VALID_INTNO_CREISR(INTNO intno)
    28942321
    2895 intnoが,acre_isrに対する割込み番号として有効な値である場合にtrue,そう
    2896 ã§ãªã„場合にfalseを返すマクロ.動的生成機能拡張パッケージを使用しない場
    2897 åˆã«ã¯ï¼Œå®šç¾©ã™ã‚‹å¿
    2898 è¦ãŒãªã„.
    2899 
    2900 6.7 CPU例外ハンドラとCPU例外発生時のシステム状æ
    2901 ‹ã®å‚ç
    2902 §
    2903 
    2904 6.7.1 CPU例外ハンドラの出å
    2905 ¥å£å‡¦ç†
    2906 
    2907 CPU例外の出å
    2908 ¥å£å‡¦ç†ã®æ–¹æ³•ã¯ãƒ—ロセッサによって大きく異なるが,おおよその
    2909 å‡¦ç†å†
    2910 å®¹ã¯æ¬¡ã®é€šã‚Šï¼Ž
     2322intnoが,acre_isrに対する割込み番号として有効な値である場合にtrue,そう
     2323でない場合にfalseを返すマクロ.動的生成機能拡張パッケージを使用しない場
     2324合には,定義する必要がない.
     2325
     23266.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
     2327
     23286.7.1 CPU例外ハンドラの出入口処理
     2329
     2330CPU例外の出入口処理の方法はプロセッサによって大きく異なるが,おおよその
     2331処理内容は次の通り.
    29112332
    29122333----------------------------------------
    29132334void
    2914 <CPU例外の出å
    2915 ¥å£å‡¦ç†>(void)
     2335<CPU例外の出入口処理>(void)
    29162336{
    2917         スクラッチレジスタをスタックに保存する
    2918         if (カーネル管理外のCPU例外) {
    2919                 if (タスクコンテキストでCPU例外発生) {
    2920                         スタックを非タスクコンテキスト用のスタックに切り換え,
    2921                                                                         非タスクコンテキストに切り換える … (*j)
     2337        スクラッチレジスタをスタックに保存する
     2338        if (カーネル管理外のCPU例外) {
     2339                if (タスクコンテキストでCPU例外発生) {
     2340                        スタックを非タスクコンテキスト用のスタックに切り換え,
     2341                                                                        非タスクコンテキストに切り換える … (*j)
    29222342                }
    2923                 システム状æ
    2924 ‹ï¼ˆã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯é™¤ãï¼‰ã‚’,CPU例外発生時の状æ
    2925 ‹ã«ã™ã‚‹
    2926                 CPU例外ハンドラを,CPU例外のæƒ
    2927 å ±ã‚’記憶している領域のå
    2928 ˆé ­ç•ªåœ°ã‚’
    2929                                                                         パラメータ(p_excinf)として呼び出す
    2930                 if (タスクコンテキストでCPU例外発生) {
    2931                         スタックをタスク用のスタックに戻し,
    2932                                                                         タスクコンテキストに切り換える … (*j)
     2343                システム状態(コンテキストは除く)を,CPU例外発生時の状態にする
     2344                CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を
     2345                                                                        パラメータ(p_excinf)として呼び出す
     2346                if (タスクコンテキストでCPU例外発生) {
     2347                        スタックをタスク用のスタックに戻し,
     2348                                                                        タスクコンテキストに切り換える … (*j)
    29332349                }
    2934                 CPU例外処理からのリターン後に,CPU例外発生時のシステム状æ
    2935 ‹ã«
    2936                                                                                                         戻るように準備する
     2350                CPU例外処理からのリターン後に,CPU例外発生時のシステム状態に
     2351                                                                                                        戻るように準備する
    29372352        }
    29382353        else {
    2939                 if (タスクコンテキストでCPU例外発生) {
    2940                         (少なくとも)カーネル管理の割込みを禁止した状æ
    2941 ‹ã«ã™ã‚‹
     2354                if (タスクコンテキストでCPU例外発生) {
     2355                        (少なくとも)カーネル管理の割込みを禁止した状態にする
    29422356#ifdef TOPPERS_SUPPORT_OVRHDR
    2943                         ovrtimer_stop();                        /* オーバランタイマの停止 */
     2357                        ovrtimer_stop();                        /* オーバランタイマの停止 */
    29442358#endif /* TOPPERS_SUPPORT_OVRHDR */
    2945                         スタックを非タスクコンテキスト用のスタックに切り換え,
    2946                                                                         非タスクコンテキストに切り換える
     2359                        スタックを非タスクコンテキスト用のスタックに切り換え,
     2360                                                                        非タスクコンテキストに切り換える
    29472361                }
    2948                 割込み優å
    2949 ˆåº¦ãƒžã‚¹ã‚¯ã‚’,CPU例外発生時の値に設定し,
    2950                                 CPUロック解除状æ
    2951 ‹ã«ã™ã‚‹ï¼ˆCPU例外発生時の割込み優å
    2952 ˆåº¦ãƒžã‚¹ã‚¯
    2953                                 よりも優å
    2954 ˆåº¦ã®é«˜ã„割込みを受け付けるようにする)
     2362                割込み優先度マスクを,CPU例外発生時の値に設定し,
     2363                                CPUロック解除状態にする(CPU例外発生時の割込み優先度マスク
     2364                                よりも優先度の高い割込みを受け付けるようにする)
    29552365
    29562366#ifdef LOG_EXC_ENTER
    2957                 log_exc_enter(CPU例外ハンドラ番号);
     2367                log_exc_enter(CPU例外ハンドラ番号);
    29582368#endif /* LOG_EXC_ENTER */
    2959                 CPU例外ハンドラを,CPU例外のæƒ
    2960 å ±ã‚’記憶している領域のå
    2961 ˆé ­ç•ªåœ°ã‚’
    2962                                                                         パラメータ(p_excinf)として呼び出す
     2369                CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を
     2370                                                                        パラメータ(p_excinf)として呼び出す
    29632371#ifdef LOG_EXC_LEAVE
    2964                 log_exc_leave(CPU例外ハンドラ番号);
     2372                log_exc_leave(CPU例外ハンドラ番号);
    29652373#endif /* LOG_EXC_LEAVE */
    29662374
    29672375          ret_exc:
    2968                 if (タスクコンテキストでCPU例外発生) {
    2969                         (少なくとも)カーネル管理の割込みを禁止した状æ
    2970 ‹ã«ã™ã‚‹ … (*d)
    2971                         スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
    2972                                                                                                                                         … (*g)
     2376                if (タスクコンテキストでCPU例外発生) {
     2377                        (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d)
     2378                        スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
     2379                                                                                                                                        … (*g)
    29732380                        if (reqflg) {
    29742381                                reqflg = false;
    2975                                 CPUロック状æ
    2976 ‹ã«ã™ã‚‹ … (*e)
     2382                                CPUロック状態にする … (*e)
    29772383                                if (dspflg && p_runtsk != p_schedtsk) {
    2978                                         スクラッチレジスタを除くすべてのレジスタをスタックに保存する
    2979                                         スタックポインタを自タスク(p_runtsk)のTCBに保存する
    2980                                         ret_exc_rを,実行再開番地として自タスクのTCBに保存する
    2981                                                                                                                                         … (*a)
    2982                                         dispatcherに分岐する
     2384                                        スクラッチレジスタを除くすべてのレジスタをスタックに保存する
     2385                                        スタックポインタを自タスク(p_runtsk)のTCBに保存する
     2386                                        ret_exc_rを,実行再開番地として自タスクのTCBに保存する
     2387                                                                                                                                        (*a)
     2388                                        dispatcherに分岐する
    29832389
    29842390                                  ret_exc_r:
    2985                                         スクラッチレジスタを除くすべてのレジスタを
    2986                                                                                                 スタックから復帰する
     2391                                        スクラッチレジスタを除くすべてのレジスタを
     2392                                                                                                スタックから復帰する
    29872393                                }
    29882394#ifdef TOPPERS_SUPPORT_OVRHDR
    2989                                 ovrtimer_start();               /* オーバランタイマの動作開始 */
     2395                                ovrtimer_start();               /* オーバランタイマの動作開始 */
    29902396#endif /* TOPPERS_SUPPORT_OVRHDR */
    2991                                 calltex(); … (*b)
     2397                                calltex(); (*b)
    29922398                        }
    29932399#ifdef TOPPERS_SUPPORT_OVRHDR
    29942400                        else {
    2995                                 ovrtimer_start();               /* オーバランタイマの動作開始 */
     2401                                ovrtimer_start();               /* オーバランタイマの動作開始 */
    29962402                        }
    29972403#endif /* TOPPERS_SUPPORT_OVRHDR */
    29982404                }
    2999                 CPU例外処理からのリターン後に,CPUロック解除状æ
    3000 ‹ã«æˆ»ã‚‹ã‚ˆã†ã«æº–備する
     2405                CPU例外処理からのリターン後に,CPUロック解除状態に戻るように準備する
    30012406        }
    3002         スクラッチレジスタをスタックから復帰する
    3003         CPU例外処理からのリターン
     2407        スクラッチレジスタをスタックから復帰する
     2408        CPU例外処理からのリターン
    30042409}
    30052410----------------------------------------
    30062411
    3007 CPU例外ハンドラは,非コンテキストに切り換えることを除いては,CPU例外発
    3008 ç”Ÿæ™‚と同じシステム状æ
    3009 ‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.例えば,CPU例外がCPU
    3010 ãƒ­ãƒƒã‚¯çŠ¶æ
    3011 ‹ã§ç™ºç”Ÿã—た場合にはCPUロック状æ
    3012 ‹ï¼ŒCPUロック解除状æ
    3013 ‹ã§ç™ºç”Ÿã—た
    3014 å ´åˆã«ã¯CPUロック解除状æ
    3015 ‹ã§ï¼ŒCPU例外ハンドラを呼び出さなければならない.
    3016 CPUロック状æ
    3017 ‹ã§ç™ºç”Ÿã—たCPU例外は,カーネル管理外のCPU例外となるため,カー
    3018 ãƒãƒ«ç®¡ç†ã®CPU例外ハンドラについては,CPUロック解除状æ
    3019 ‹ã§å‘¼ã³å‡ºã™ã“とに
    3020 ãªã‚‹ï¼Ž
    3021 
    3022 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ã‚ˆã£ã¦ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–のCPU例外を正確に判定するのが難しい
    3023 å ´åˆãŒã‚る.このような場合には,割込み優å
    3024 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    3025 ¨è§£é™¤ã§ãªã„状æ
    3026 ‹ã§
    3027 ç™ºç”Ÿã—たCPU例外を,カーネル管理外のCPU例外と扱っても支障がない.これは,
    3028 å‰²è¾¼ã¿å„ªå
    3029 ˆåº¦ãƒžã‚¹ã‚¯ãŒå
    3030 ¨è§£é™¤ã§ãªã„場合には,xsns_dpn,xsns_xpnともtrueを
    3031 è¿”すため,アプリケーションからはカーネル管理外のCPU例外と区別できないた
    3032 ã‚ã§ã‚る.
    3033 
    3034 å
    3035 ·ä½“的には,å
    3036 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ï¼ˆã¾ãŸã¯CPUロック)を小さいオーバヘッドで実現
    3037 ã—ようとすると,CPU例外ハンドラの中で,å
    3038 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3039 ‹ï¼ˆã¾ãŸã¯CPUロッ
    3040 ã‚¯çŠ¶æ
    3041 ‹ï¼‰ã¨å‰²è¾¼ã¿å„ªå
    3042 ˆåº¦ãƒžã‚¹ã‚¯ã‚’高いレベルに設定した状æ
    3043 ‹ã‚’区別できない場
    3044 åˆãŒã‚る.また,カーネル管理外の割込み処理中やカーネル実行中であること
    3045 ã‚’正確に判断することも難しい場合がある.
    3046 
    3047 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–のCPU例外ハンドラを呼ぶ時に,(*j)において,スタックを非タ
    3048 ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯ã«åˆ‡ã‚Šæ›ãˆï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«åˆ‡ã‚Šæ›ãˆ
    3049 ã¦ã„るが,この切換えはターゲット定義で省いても良い.これは,カーネル管
    3050 ç†å¤–のCPU例外は,カーネルå†
    3051 ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã‚»ã‚¯ã‚·ãƒ§ãƒ³ä¸­ã§ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒ
    3052 ã‚るため,安å
    3053 ¨ã«åˆ‡ã‚Šæ›ãˆã‚‰ã‚Œã‚‹ã¨ã¯é™ã‚‰ãªã„ためである.また,カーネル管
    3054 ç†å¤–の割込みハンドラを呼ぶ時のコンテキストやスタックはターゲット依存な
    3055 ã®ã§ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–のCPU例外ハンドラもそれと同様に扱って良いと考えられ
    3056 ã‚‹ãŸã‚ã§ã‚る.
    3057 
    3058 ä¸Šã®ã‚³ãƒ¼ãƒ‰ã§ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–のCPU例外に対して,トレースログ取得処理
    3059 ï¼ˆlog_exc_enterおよびlog_exc_leave)を呼び出していないが,å
    3060 ¨å‰²è¾¼ã¿ãƒ­ãƒƒ
    3061 ã‚¯çŠ¶æ
    3062 ‹ã‹NMIの処理中にCPU例外が発生した場合を除外すれば,呼び出してもか
    3063 ã¾ã‚ãªã„.å
    3064 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3065 ‹ã‹NMIの処理中に発生したCPU例外の場合には,
    3066 ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°å–得処理を呼び出してはならない.
    3067 
    3068 CPU例外ハンドラを実行する際に経由する部分では,CPU例外が起こる可能性を
    3069 æ¥µåŠ›æ¸›ã‚‰ã™ã¨ã¨ã‚‚に,CPU例外を起こす可能性がある場合(例えば,スクラッチ
    3070 ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’スタックに保存する時に,バスエラーなどのCPU例外が発生する可能
    3071 æ€§ãŒè€ƒãˆã‚‰ã‚Œã‚‹ï¼‰ã«ã¯ï¼Œãã®å¯èƒ½æ€§ã‚’ターゲット依存部のユーザーズマニュア
    3072 ãƒ«ã«è¨˜è¼‰ã—なければならない.
    3073 
    3074 ret_exc以降の処理は,割込みの出å
    3075 ¥å£å‡¦ç†ã®ret_int以降の処理とほぼ同じで
    3076 ã‚るため,ターゲットによっては,å
    3077 ±é€šã®ãƒ«ãƒ¼ãƒãƒ³ã‚’用いることができる可能
    3078 æ€§ãŒã‚る.
    3079 
    3080 CPU例外の出å
    3081 ¥å£å‡¦ç†ã‚’アセンブリ言語で記述する場合には,トレースログ取得
    3082 å‡¦ç†ã¯ï¼Œã€Œ6.2 トレースログ機能への対応」の節で記述した方法でコーディン
    3083 ã‚°ã™ã‚‹ã“と.
    3084 
    3085 6.7.2 CPU例外ハンドラの出å
    3086 ¥å£å‡¦ç†ã®ç”Ÿæˆ
    3087 
    3088 CPU例外ベクトルをハードウェアで実現している場合など,CPU例外ハンドラ毎
    3089 ã«å‡ºå
    3090 ¥å£å‡¦ç†ã‚’用意した方が効率が良いターゲットのために,CPU例外ハンドラ
    3091 æ¯Žã«å‡ºå
    3092 ¥å£å‡¦ç†ã‚’生成する機構を用意している.
    3093 
    3094 ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã¯ï¼Œæ¨™æº–のCPU例外管理機能の初期化処理を用いた場合のみ,ター
    3095 ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§ä½¿ã‚ã‚Œã‚‹ï¼ŽCPU例外管理機能の初期化処理をターゲット依存部
    3096 ã§ç”¨æ„ã—,その中でこれらのマクロを使わない場合には,これらのマクロを用
    3097 æ„ã™ã‚‹å¿
    3098 è¦ã¯ãªã„.
     2412CPU例外ハンドラは,非コンテキストに切り換えることを除いては,CPU例外発
     2413生時と同じシステム状態で呼び出さなければならない.例えば,CPU例外がCPU
     2414ロック状態で発生した場合にはCPUロック状態,CPUロック解除状態で発生した
     2415場合にはCPUロック解除状態で,CPU例外ハンドラを呼び出さなければならない.
     2416CPUロック状態で発生したCPU例外は,カーネル管理外のCPU例外となるため,カー
     2417ネル管理のCPU例外ハンドラについては,CPUロック解除状態で呼び出すことに
     2418なる.
     2419
     2420ターゲットによっては,カーネル管理外のCPU例外を正確に判定するのが難しい
     2421場合がある.このような場合には,割込み優先度マスクが全解除でない状態で
     2422発生したCPU例外を,カーネル管理外のCPU例外と扱っても支障がない.これは,
     2423割込み優先度マスクが全解除でない場合には,xsns_dpn,xsns_xpnともtrueを
     2424返すため,アプリケーションからはカーネル管理外のCPU例外と区別できないた
     2425めである.
     2426
     2427具体的には,全割込みロック(またはCPUロック)を小さいオーバヘッドで実現
     2428しようとすると,CPU例外ハンドラの中で,全割込みロック状態(またはCPUロッ
     2429ク状態)と割込み優先度マスクを高いレベルに設定した状態を区別できない場
     2430合がある.また,カーネル管理外の割込み処理中やカーネル実行中であること
     2431を正確に判断することも難しい場合がある.
     2432
     2433カーネル管理外のCPU例外ハンドラを呼ぶ時に,(*j)において,スタックを非タ
     2434スクコンテキスト用のスタックに切り換え,非タスクコンテキストに切り換え
     2435ているが,この切換えはターゲット定義で省いても良い.これは,カーネル管
     2436理外のCPU例外は,カーネル内のクリティカルセクション中で発生する可能性が
     2437あるため,安全に切り換えられるとは限らないためである.また,カーネル管
     2438理外の割込みハンドラを呼ぶ時のコンテキストやスタックはターゲット依存な
     2439ので,カーネル管理外のCPU例外ハンドラもそれと同様に扱って良いと考えられ
     2440るためである.
     2441
     2442上のコードでは,カーネル管理外のCPU例外に対して,トレースログ取得処理
     2443(log_exc_enterおよびlog_exc_leave)を呼び出していないが,全割込みロッ
     2444ク状態かNMIの処理中にCPU例外が発生した場合を除外すれば,呼び出してもか
     2445まわない.全割込みロック状態かNMIの処理中に発生したCPU例外の場合には,
     2446トレースログ取得処理を呼び出してはならない.
     2447
     2448CPU例外ハンドラを実行する際に経由する部分では,CPU例外が起こる可能性を
     2449極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,スクラッチ
     2450レジスタをスタックに保存する時に,バスエラーなどのCPU例外が発生する可能
     2451性が考えられる)には,その可能性をターゲット依存部のユーザーズマニュア
     2452ルに記載しなければならない.
     2453
     2454ret_exc以降の処理は,割込みの出入口処理のret_int以降の処理とほぼ同じで
     2455あるため,ターゲットによっては,共通のルーチンを用いることができる可能
     2456性がある.
     2457
     2458CPU例外の出入口処理をアセンブリ言語で記述する場合には,トレースログ取得
     2459処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
     2460グすること.
     2461
     24626.7.2 CPU例外ハンドラの出入口処理の生成
     2463
     2464CPU例外ベクトルをハードウェアで実現している場合など,CPU例外ハンドラ毎
     2465に出入口処理を用意した方が効率が良いターゲットのために,CPU例外ハンドラ
     2466毎に出入口処理を生成する機構を用意している.
     2467
     2468以下のマクロは,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ター
     2469ゲット非依存部で使われる.CPU例外管理機能の初期化処理をターゲット依存部
     2470で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
     2471意する必要はない.
    30992472
    31002473(6-7-2-1) EXC_ENTRY(excno, exchdr)
    31012474
    3102 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
    3103 å¤–ハンドラの出å
    3104 ¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«ã‚’作るマクロ.EXCHDR_ENTRYを用いてCPU例外
    3105 ãƒãƒ³ãƒ‰ãƒ©æ¯Žã«å‡ºå
    3106 ¥å£å‡¦ç†ã‚’生成する場合には,次のように定義する.
     2475CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
     2476外ハンドラの出入口処理のラベルを作るマクロ.EXCHDR_ENTRYを用いてCPU例外
     2477ハンドラ毎に出入口処理を生成する場合には,次のように定義する.
    31072478
    31082479#define EXC_ENTRY(excno, exchdr)        _kernel_##exchdr##_##excno
    31092480
    3110 CPU例外ハンドラ毎に出å
    3111 ¥å£å‡¦ç†ã‚’作るå¿
    3112 è¦ãŒãªã„場合には,次のように定義し
    3113 ã¦ï¼ŒCPU例外ハンドラの関数名をそのまま返す.
     2481CPU例外ハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し
     2482て,CPU例外ハンドラの関数名をそのまま返す.
    31142483
    31152484#define EXC_ENTRY(excno, exchdr)        exchdr
     
    31172486(6-7-2-2) EXCHDR_ENTRY(excno, excno_num, exchdr)
    31182487
    3119 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
    3120 å¤–ハンドラの出å
    3121 ¥å£å‡¦ç†ã‚’生成するマクロ.excno_numには,アセンブリ言語記
    3122 è¿°ç”¨ã«ï¼ŒCPU例外ハンドラ番号が数値で渡される.CPU例外ハンドラ毎に出å
    3123 ¥å£
    3124 å‡¦ç†ã‚’作るå¿
    3125 è¦ãŒãªã„場合には,空に定義する.
    3126 
    3127 6.7.3 CPU例外ハンドラの設定
    3128 
    3129 (6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)(オプション)
    3130 
    3131 excnoが,DEF_EXCに対するCPU例外ハンドラ番号として有効な値である場合に
    3132 true,そうでない場合にfalseを返すマクロ.
    3133 
    3134 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
    3135 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ä½¿ã‚ãªã„なら,用意するå¿
    3136 è¦ãŒãªã„.
     2488CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
     2489外ハンドラの出入口処理を生成するマクロ.excno_numには,アセンブリ言語記
     2490述用に,CPU例外ハンドラ番号が数値で渡される.CPU例外ハンドラ毎に出入口
     2491処理を作る必要がない場合には,空に定義する.
     2492
     24936.7.3 CPU例外ハンドラの設定
     2494
     2495(6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)(オプション)
     2496
     2497excnoが,DEF_EXCに対するCPU例外ハンドラ番号として有効な値である場合に
     2498true,そうでない場合にfalseを返すマクロ.
     2499
     2500ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
     2501ゲット依存部で使わないなら,用意する必要がない.
    31372502
    31382503(6-7-3-2) void x_define_exc(EXCNO excno, FP exc_entry)
    31392504
    3140 excnoで指定されたCPU例外ハンドラの出å
    3141 ¥å£å‡¦ç†ã®ç•ªåœ°ã‚’exc_entryに設定する.
    3142 
    3143 ã“の関数は,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ターゲッ
    3144 ãƒˆéžä¾å­˜éƒ¨ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼ŽCPU例外管理機能の初期化処理をターゲット依存
    3145 éƒ¨ã§ç”¨æ„ã—,その中でこの関数を呼び出さない場合には,この関数を用意する
    3146 å¿
    3147 è¦ã¯ãªã„.
    3148 
    3149 ã“の関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
    3150 ã‚«ãƒ¼ãƒãƒ«ã®åˆæœŸåŒ–処理(NMIを除くすべての割込みがマスクされている)から呼
    3151 ã³å‡ºã›ã‚‹ã‚ˆã†ã«å®Ÿè£
    3152 ã™ã‚Œã°ã‚ˆã„.
    3153 
    3154 æŒ‡å®šã•ã‚ŒãŸCPU例外ハンドラ番号がDEF_EXCに対するものとして有効な値でない
    3155 å ´åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿
    3156 è¦ãŒãªã„(assertでエラーとするのが望ましい).こ
    3157 ã‚Œã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒï¼Œãƒ‘ス2のテンプレートファイルのターゲット依存
    3158 éƒ¨ã§å®šç¾©ã™ã‚‹EXCNO_DEFEXC_VALIDを用いてエラーを検出するためである.
    3159 
    3160 6.7.4 CPU例外管理機能の初期化処理の変更
    3161 
    3162 (6-7-4-1) OMIT_INITIALIZE_EXCEPTION(オプション)
    3163 
    3164 CPU例外管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
    3165 éƒ¨ã«å«ã¾ã‚Œã‚‹æ¨™æº–の割込み管理機能の初期化処理を用いない場合には,このシ
    3166 ãƒ³ãƒœãƒ«ã‚’マクロ定義する.
    3167 
    3168 ã“のシンボルをマクロ定義すると,EXCINIBとinitialize_exceptionの定義が,
    3169 ã‚«ãƒ¼ãƒãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã‹ã‚‰å–り除かれる.また,TNUM_EXCNO,
    3170 tnum_excno,excinib_tableの定義と,CPU例外ハンドラ毎の出å
    3171 ¥å£å‡¦ç†ã‚’生成
    3172 ã™ã‚‹ãŸã‚ã®è¨˜è¿°ï¼ˆEXCHDR_ENTRYマクロのリスト)を,コンフィギュレータのパ
    3173 ã‚¹2のテンプレートファイルのターゲット非依存部によってkernel_cfg.cに生成
    3174 ã•ã‚Œãªããªã‚‹ï¼Ž
    3175 
    3176 (6-7-4-2) void initialize_exception(void)(オプション)
    3177 
    3178 OMIT_INITIALIZE_EXCEPTIONをマクロ定義した場合には,この関数をターゲット
    3179 ä¾å­˜éƒ¨ã§ç”¨æ„ã™ã‚‹ï¼ŽOMIT_INITIALIZE_EXCEPTIONをマクロ定義することにより取
    3180 ã‚Šé™¤ã‹ã‚Œã‚‹ãã®ä»–のデータ型,変数,マクロは,この関数で使用する場合にの
    3181 ã¿ç”¨æ„ã™ã‚Œã°ã‚ˆã„.
    3182 
    3183 6.7.5 デフォルトのCPU例外ハンドラ
    3184 
    3185 (6-7-5-1) void default_exc_handler(void *p_excinf)(オプション)
    3186 
    3187 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«ã‚ˆã‚ŠCPU例外ハンドラのテーブルを生成する場合などには,
    3188 CPU例外ハンドラを登録しなかったCPU例外ハンドラ番号に対して,デフォルト
    3189 ã®CPU例外ハンドラとして,default_exc_handlerを登録する.
    3190 
    3191 default_exc_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
    3192 ãŒç”¨æ„ã—たもので置き換えられるように,OMIT_DEFAULT_EXC_HANDLERをマクロ
    3193 å®šç¾©ã—た場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
    3194 ãŒç”¨æ„ã™ã‚‹å ´åˆã®åç§°ã¯ï¼Œ_kernel_default_exc_handlerとなる.
    3195 
    3196 6.7.6 CPU例外発生時のシステム状æ
    3197 ‹ã®å‚ç
    3198 §
     2505excnoで指定されたCPU例外ハンドラの出入口処理の番地をexc_entryに設定する.
     2506
     2507この関数は,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ターゲッ
     2508ト非依存部から呼び出される.CPU例外管理機能の初期化処理をターゲット依存
     2509部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
     2510必要はない.
     2511
     2512この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
     2513カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
     2514び出せるように実装すればよい.
     2515
     2516指定されたCPU例外ハンドラ番号がDEF_EXCに対するものとして有効な値でない
     2517場合の動作は保証する必要がない(assertでエラーとするのが望ましい).こ
     2518れは,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存
     2519部で定義するEXCNO_DEFEXC_VALIDを用いてエラーを検出するためである.
     2520
     25216.7.4 CPU例外管理機能の初期化処理の変更
     2522
     2523(6-7-4-1) OMIT_INITIALIZE_EXCEPTION(オプション)
     2524
     2525CPU例外管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
     2526部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
     2527ンボルをマクロ定義する.
     2528
     2529このシンボルをマクロ定義すると,EXCINIBとinitialize_exceptionの定義が,
     2530カーネルのターゲット非依存部から取り除かれる.また,TNUM_EXCNO,
     2531tnum_excno,excinib_tableの定義と,CPU例外ハンドラ毎の出入口処理を生成
     2532するための記述(EXCHDR_ENTRYマクロのリスト)を,コンフィギュレータのパ
     2533ス2のテンプレートファイルのターゲット非依存部によってkernel_cfg.cに生成
     2534されなくなる.
     2535
     2536(6-7-4-2) void initialize_exception(void)(オプション)
     2537
     2538OMIT_INITIALIZE_EXCEPTIONをマクロ定義した場合には,この関数をターゲット
     2539依存部で用意する.OMIT_INITIALIZE_EXCEPTIONをマクロ定義することにより取
     2540り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
     2541み用意すればよい.
     2542
     25436.7.5 デフォルトのCPU例外ハンドラ
     2544
     2545(6-7-5-1) void default_exc_handler(void *p_excinf)(オプション)
     2546
     2547コンフィギュレータによりCPU例外ハンドラのテーブルを生成する場合などには,
     2548CPU例外ハンドラを登録しなかったCPU例外ハンドラ番号に対して,デフォルト
     2549のCPU例外ハンドラとして,default_exc_handlerを登録する.
     2550
     2551default_exc_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
     2552が用意したもので置き換えられるように,OMIT_DEFAULT_EXC_HANDLERをマクロ
     2553定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
     2554が用意する場合の名称は,_kernel_default_exc_handlerとなる.
     2555
     25566.7.6 CPU例外発生時のシステム状態の参照
    31992557
    32002558(6-7-6-1) bool_t exc_sense_intmask(void *p_excinf)
    32012559
    3202 CPU例外の発生した時のシステム状æ
    3203 ‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†
    3204 ã‚­ã‚¹ãƒˆã§ã‚り,å
    3205 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3206 ‹ã§ãªãï¼ŒCPUロック状æ
    3207 ‹ã§ãªãï¼Œå‰²è¾¼ã¿å„ªå
    3208 ˆ
    3209 åº¦ãƒžã‚¹ã‚¯å
    3210 ¨è§£é™¤çŠ¶æ
    3211 ‹ã§ã‚る時にtrue,そうでない時にfalseを返す関数.
    3212 
    3213 p_excinfには,CPU例外のæƒ
    3214 å ±ã‚’記憶している領域のå
    3215 ˆé ­ç•ªåœ°ãŒæ¸¡ã•ã‚Œã‚‹ï¼Ž
    3216 
    3217 CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返さなけ
    3218 ã‚Œã°ãªã‚‰ãªã„ことに注意すること.
    3219 
    3220 6.8 カーネルの起動・終了とスタック領域など
    3221 
    3222 (6-8-1) スタートアップモジュール
    3223 
    3224 ã‚«ãƒ¼ãƒãƒ«ã®ã‚¹ã‚¿ãƒ¼ãƒˆã‚¢ãƒƒãƒ—モジュールは,システムのリセット後に最初に実行
    3225 ã•ã‚Œã‚‹ãƒ—ログラムである.スタートアップモジュールは,標準的には,プロセッ
    3226 ã‚µä¾å­˜éƒ¨ã¾ãŸã¯ãƒãƒƒãƒ—依存部で用意し以下の処理を行うが,それにこだわるå¿
    3227 
    3228 è¦ã¯ãªã„.å
    3229 ·ä½“的には,開発環境に用意されているスタートアップモジュール
    3230 ã‚’用いる方法(この場合,ターゲット依存部でmain関数を用意するå¿
    3231 è¦ãŒã‚る)
    3232 ã‚„,アプリケーションで用意する場合が考えられる.
    3233 
    3234 (a) プロセッサ状æ
    3235 ‹ã®åˆæœŸåŒ–
    3236 
    3237 ãƒ—ロセッサモード,スタックポインタ,フレームポインタ等,プロセッサの状
    3238 æ
    3239 ‹ã‚’初期化する.また,NMIを除くすべての割込みをマスクした状æ
    3240 ‹ï¼ˆå
    3241 ¨å‰²è¾¼ã¿
    3242 ãƒ­ãƒƒã‚¯çŠ¶æ
    3243 ‹ã¨åŒç­‰ã®çŠ¶æ
    3244 ‹ï¼‰ã¨ã™ã‚‹ï¼ŽDRAMコントローラの初期化など,メモリを
    3245 ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«å¿
    3246 è¦ãªåˆæœŸåŒ–処理をここで行ってもよい(次の
    3247 hardware_init_hookで行ってもよい).
    3248 
    3249 (b) hardware_init_hookを呼び出す
    3250 
    3251 ã‚·ã‚¹ãƒ†ãƒ ã®ãƒªã‚»ãƒƒãƒˆå¾Œã™ãã«è¡Œã†å¿
    3252 è¦ã®ã‚るターゲットシステム依存の初期化
    3253 å‡¦ç†ã‚’行うために,hardware_init_hookを呼び出す.hardware_init_hookが用
    3254 æ„ã•ã‚Œã¦ã„ない場合は,何もしない.GNU開発環境では,リンカスクリプト中の
    3255 weak definitionにより,hardware_init_hookが用意されていない場合の値を0
    3256 ã¨ã™ã‚‹ã“とで,これを実現できる.weak definitionの機能を持たない開発環境
    3257 ã§ã¯ï¼Œhardware_init_hookをå¿
    3258 ãšå‘¼ã³å‡ºã™ã“とにする.
    3259 
    3260 hardware_init_hookは,ターゲット依存部で用意するのが標準であるが,シス
    3261 ãƒ†ãƒ ã®ãƒªã‚»ãƒƒãƒˆå¾Œã™ãã«è¡Œã†å¿
    3262 è¦ã®ã‚る初期化処理を追加するために,アプリ
    3263 ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ç”¨æ„ã—たものを用いる場合もある.
    3264 
    3265 ãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ã«å¿
    3266 è¦ãªåˆæœŸåŒ–処理をhardware_init_hookで行う場合には,こ
    3267 ã‚Œã‚’呼び出す時点でメモリにアクセスすることができないため,関数(サブルー
    3268 ãƒãƒ³ï¼‰ã‚’呼び出すためにスタックを使用するプロセッサでは,戻り番地を汎用
    3269 ãƒ¬ã‚¸ã‚¹ã‚¿ã«å
    3270 ¥ã‚Œã¦å‘¼ã³å‡ºã™ã¨ã„った工夫がå¿
    3271 è¦ã§ã‚る.この場合,
    3272 hardware_init_hookをC言語で記述することはできなくなるが,やむをえない.
    3273 
    3274 (c) bssセクションとdataセクションの初期化
    3275 
    3276 bssセクションをクリアし,dataセクションに初期値を設定する.
    3277 
    3278 ãŸã ã—,カーネル本体は,kerflgがfalse(=0)に初期化されること以外に,
    3279 ã“れらのセクションが初期化されることに依存していないため,スタートアッ
    3280 ãƒ—モジュールをアプリケーションで用意する場合で,システムサービスやアプ
    3281 ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãŒã“れらのセクションが初期化されることに依存していない場合
    3282 ã«ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã®èµ·å‹•æ™‚間を短縮するために,kerflgをfalseに初期化するだけ
    3283 ã§ååˆ†ã§ã‚る.
    3284 
    3285 (d) software_init_hookを呼び出す
    3286 
    3287 é–‹ç™ºç’°å¢ƒï¼ˆç‰¹ã«ãƒ©ã‚¤ãƒ–ラリ)に依存してå¿
    3288 è¦ãªåˆæœŸåŒ–処理を行うために,
    3289 software_init_hookを呼び出す.software_init_hookが用意されていない場合
    3290 ã¯ï¼Œä½•ã‚‚しない.GNU開発環境では,リンカスクリプト中のweak definitionに
    3291 ã‚ˆã‚Šï¼Œsoftware_init_hookが用意されていない場合の値を0とすることで,これ
    3292 ã‚’実現できる.weak definitionの機能を持たない開発環境では,
    3293 software_init_hookをå¿
    3294 ãšå‘¼ã³å‡ºã™ã“とにする.
    3295 
    3296 software_init_hookは,ターゲット依存部で用意するのが標準である.
    3297 
    3298 (e) sta_kerへ分岐
    3299 
    3300 sta_kerを呼び出す.sta_kerは,NMIを除くすべての割込みをマスクした状æ
    3301 ‹
    3302 ï¼ˆå
    3303 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3304 ‹ã¨åŒç­‰ã®çŠ¶æ
    3305 ‹ï¼‰ã§å‘¼ã³å‡ºã•ãªã‘ればならない.sta_kerか
    3306 ã‚‰ã¯ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹ã“とがないため,スタートアップモジュールに戻ってくるこ
    3307 ã¨ã¯è€ƒãˆã‚‹å¿
    3308 è¦ãŒãªã„.
     2560CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコンテ
     2561キストであり,全割込みロック状態でなく,CPUロック状態でなく,割込み優先
     2562度マスク全解除状態である時にtrue,そうでない時にfalseを返す関数.
     2563
     2564p_excinfには,CPU例外の情報を記憶している領域の先頭番地が渡される.
     2565
     2566CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返さなけ
     2567ればならないことに注意すること.
     2568
     25696.8 カーネルの起動・終了とスタック領域など
     2570
     2571(6-8-1) スタートアップモジュール
     2572
     2573カーネルのスタートアップモジュールは,システムのリセット後に最初に実行
     2574されるプログラムである.スタートアップモジュールは,標準的には,プロセッ
     2575サ依存部またはチップ依存部で用意し以下の処理を行うが,それにこだわる必
     2576要はない.具体的には,開発環境に用意されているスタートアップモジュール
     2577を用いる方法(この場合,ターゲット依存部でmain関数を用意する必要がある)
     2578や,アプリケーションで用意する場合が考えられる.
     2579
     2580(a) プロセッサ状態の初期化
     2581
     2582プロセッサモード,スタックポインタ,フレームポインタ等,プロセッサの状
     2583態を初期化する.また,NMIを除くすべての割込みをマスクした状態(全割込み
     2584ロック状態と同等の状態)とする.DRAMコントローラの初期化など,メモリを
     2585アクセスするために必要な初期化処理をここで行ってもよい(次の
     2586hardware_init_hookで行ってもよい).
     2587
     2588(b) hardware_init_hookを呼び出す
     2589
     2590システムのリセット後すぐに行う必要のあるターゲットシステム依存の初期化
     2591処理を行うために,hardware_init_hookを呼び出す.hardware_init_hookが用
     2592意されていない場合は,何もしない.GNU開発環境では,リンカスクリプト中の
     2593weak definitionにより,hardware_init_hookが用意されていない場合の値を0
     2594とすることで,これを実現できる.weak definitionの機能を持たない開発環境
     2595では,hardware_init_hookを必ず呼び出すことにする.
     2596
     2597hardware_init_hookは,ターゲット依存部で用意するのが標準であるが,シス
     2598テムのリセット後すぐに行う必要のある初期化処理を追加するために,アプリ
     2599ケーションで用意したものを用いる場合もある.
     2600
     2601メモリアクセスに必要な初期化処理をhardware_init_hookで行う場合には,こ
     2602れを呼び出す時点でメモリにアクセスすることができないため,関数(サブルー
     2603チン)を呼び出すためにスタックを使用するプロセッサでは,戻り番地を汎用
     2604レジスタに入れて呼び出すといった工夫が必要である.この場合,
     2605hardware_init_hookをC言語で記述することはできなくなるが,やむをえない.
     2606
     2607(c) bssセクションとdataセクションの初期化
     2608
     2609bssセクションをクリアし,dataセクションに初期値を設定する.
     2610
     2611ただし,カーネル本体は,kerflgがfalse(=0)に初期化されること以外に,
     2612これらのセクションが初期化されることに依存していないため,スタートアッ
     2613プモジュールをアプリケーションで用意する場合で,システムサービスやアプ
     2614リケーションがこれらのセクションが初期化されることに依存していない場合
     2615には,システムの起動時間を短縮するために,kerflgをfalseに初期化するだけ
     2616で十分である.
     2617
     2618(d) software_init_hookを呼び出す
     2619
     2620開発環境(特にライブラリ)に依存して必要な初期化処理を行うために,
     2621software_init_hookを呼び出す.software_init_hookが用意されていない場合
     2622は,何もしない.GNU開発環境では,リンカスクリプト中のweak definitionに
     2623より,software_init_hookが用意されていない場合の値を0とすることで,これ
     2624を実現できる.weak definitionの機能を持たない開発環境では,
     2625software_init_hookを必ず呼び出すことにする.
     2626
     2627software_init_hookは,ターゲット依存部で用意するのが標準である.
     2628
     2629(e) sta_kerへ分岐
     2630
     2631sta_kerを呼び出す.sta_kerは,NMIを除くすべての割込みをマスクした状態
     2632(全割込みロック状態と同等の状態)で呼び出さなければならない.sta_kerか
     2633らはリターンすることがないため,スタートアップモジュールに戻ってくるこ
     2634とは考える必要がない.
    33092635
    33102636(6-8-2) void target_initialize(void)
    33112637
    3312 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®åˆæœŸåŒ–を行う関数.sta_kerの最初で呼び出される.プロセッ
    3313 ã‚µãƒ»ãƒãƒƒãƒ—・開発環境依存の初期化処理を,それらの依存部に切り分けること
    3314 ã‚‚可能である.
    3315 
    3316 ã“の関数は,あくまでもカーネルのターゲット依存部の初期化処理を行うため
    3317 ã®ã‚‚のである.アプリケーションにå¿
    3318 è¦ãªåˆæœŸåŒ–処理は,初期化ルーチンで行
    3319 ã†ã®ãŒåŸºæœ¬ã§ã‚るが,システムのリセット後すぐに行うå¿
    3320 è¦ãŒã‚る場合には,
    3321 hardware_init_hookを用いる.
     2638ターゲット依存部の初期化を行う関数.sta_kerの最初で呼び出される.プロセッ
     2639サ・チップ・開発環境依存の初期化処理を,それらの依存部に切り分けること
     2640も可能である.
     2641
     2642この関数は,あくまでもカーネルのターゲット依存部の初期化処理を行うため
     2643のものである.アプリケーションに必要な初期化処理は,初期化ルーチンで行
     2644うのが基本であるが,システムのリセット後すぐに行う必要がある場合には,
     2645hardware_init_hookを用いる.
    33222646
    33232647(6-8-3) void call_exit_kernel(void)
    33242648
    3325 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«åˆ‡ã‚Šæ›ãˆã¦ï¼Œexit_kernelへ分岐する関数.ext_kerか
    3326 ã‚‰å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žexit_kernelからはリターンすることがないため,この関数に
    3327 æˆ»ã£ã¦ãã‚‹ã“とは考えるå¿
    3328 è¦ãŒãªã„.
    3329 
    3330 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«åˆ‡ã‚Šæ›ãˆã‚‹ã®ã¯ï¼Œçµ‚了処理ルーチンを,非タスクコン
    3331 ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯ã§å®Ÿè¡Œã™ã‚‹ãŸã‚ã§ã‚る.終了処理ルーチンをタスク用の
    3332 ã‚¹ã‚¿ãƒƒã‚¯ã§å®Ÿè¡Œã™ã‚‹ã¨ï¼Œå„タスクのスタック領域のサイズを決定する際に,終
    3333 äº†å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ãŒä½¿ç”¨ã™ã‚‹ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã‚’考æ
    3334 ®ã—なければならない.これには,
    3335 çµ‚了処理ルーチンが使用するスタック領域が大きい場合に各タスクのスタック
    3336 é ˜åŸŸã‚’無駄に大きくしなければならないことに加えて,意図しないスタックオー
    3337 ãƒãƒ¼ãƒ•ãƒ­ãƒ¼ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ã‚’高めるという問題がある.
    3338 
    3339 ã“の関数は,å
    3340 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3341 ‹ã§å‘¼ã°ã‚Œã‚‹ãŸã‚ï¼Œå
    3342 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3343 ‹ã‹ã‚‰å‘¼
    3344 ã³å‡ºã™ã“とができない関数を呼ばないように実è£
    3345 ã—なければならない.
     2649非タスクコンテキストに切り換えて,exit_kernelへ分岐する関数.ext_kerか
     2650ら呼び出される.exit_kernelからはリターンすることがないため,この関数に
     2651戻ってくることは考える必要がない.
     2652
     2653非タスクコンテキストに切り換えるのは,終了処理ルーチンを,非タスクコン
     2654テキスト用のスタックで実行するためである.終了処理ルーチンをタスク用の
     2655スタックで実行すると,各タスクのスタック領域のサイズを決定する際に,終
     2656了処理ルーチンが使用するスタック領域を考慮しなければならない.これには,
     2657終了処理ルーチンが使用するスタック領域が大きい場合に各タスクのスタック
     2658領域を無駄に大きくしなければならないことに加えて,意図しないスタックオー
     2659バーフローが発生する可能性を高めるという問題がある.
     2660
     2661この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼
     2662び出すことができない関数を呼ばないように実装しなければならない.
    33462663
    33472664(6-8-4) void target_exit(void)
    33482665
    3349 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®çµ‚了処理を行う関数.この関数は,カーネル終了処理の最
    3350 å¾Œã«å‘¼ã³å‡ºã•ã‚Œï¼Œãƒªã‚¿ãƒ¼ãƒ³ã—てはならない.プロセッサ・チップ・開発環境依
    3351 å­˜ã®çµ‚了処理を,それらの依存部に切り分けることも可能である.
    3352 
    3353 ã“の関数では,最初に,atexitによって登録された関数とデストラクタを呼び
    3354 å‡ºã™ã“とを意図しており,標準的には,software_term_hookを呼び出す.
    3355 software_term_hookが用意されていない場合は,何もしない.GNU開発環境では,
    3356 ãƒªãƒ³ã‚«ã‚¹ã‚¯ãƒªãƒ—ト中のweak definitionにより,software_term_hookが用意され
    3357 ã¦ã„ない場合の値を0とすることで,これを実現できる.weak definitionの機
    3358 èƒ½ã‚’持たない開発環境では,software_term_hookをå¿
    3359 ãšå‘¼ã³å‡ºã™ã“とにする.
    3360 
    3361 ã“の関数は,å
    3362 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3363 ‹ã§å‘¼ã°ã‚Œã‚‹ãŸã‚ï¼Œå
    3364 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    3365 ‹ã‹ã‚‰å‘¼
    3366 ã³å‡ºã™ã“とができない関数を呼ばないように実è£
    3367 ã—なければならない.
    3368 
    3369 6.9 カーネルå†
    3370 éƒ¨ã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°
    3371 
    3372 6.9.1 ビットマップサーチ
    3373 
    3374 (6-9-1-1) OMIT_BITMAP_SEARCH(オプション)
    3375 (6-9-1-2) uint_t bitmap_search(uint16_t bitmap)(オプション)
    3376 
    3377 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§ï¼Œuint16_t型の整数値(bitmap)中の1のビットのå†
    3378 ï¼Œæœ€
    3379 ã‚‚下位(右)のものをサーチし,そのビット番号を返す関数bitmap_searchを用
    3380 æ„ã—ている.ここで,ビット番号は最下位ビットを0とし,bitmapに0を指定し
    3381 ã¦ã¯ãªã‚‰ãªã„ものとしている.
    3382 
    3383 ãƒ“ットサーチ命令を持つプロセッサでは,bitmap_searchを,ビットサーチ命令
    3384 ã‚’使うように書き直した方が効率が良い場合がある.このような場合には,ター
    3385 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ãƒ“ットサーチ命令を使ったbitmap_searchを定義し,
    3386 OMIT_BITMAP_SEARCHをマクロ定義する.
    3387 
    3388 æ¨™æº–ライブラリにビットサーチ命令を用いたffsがある場合,bitmap_searchを
    3389 (ffs(bitmap) - 1)に定義するとよい.
    3390 
    3391 (6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)(オプション)
    3392 
    3393 ãƒ“ットサーチ命令のサーチ方向が逆などの理由で,優å
    3394 ˆåº¦ã¨ãƒ“ットとの対応を
    3395 å¤‰æ›´ã—たい場合には,PRIMAP_BITをマクロ定義する.
    3396 
    3397 6.9.2 ビットフィールド
    3398 
    3399 (6-9-2-1) BIT_FIELD_UINT(オプション)
    3400 
    3401 8ビット以下のå¹
    3402 ã®ãƒ“ットフィールドで,符号無し整数値を保持したい場合に用
    3403 ã„るべきデータ型.デフォルトの定義はunsigned intとなっているが,ターゲッ
    3404 ãƒˆã‚„ツール依存で,unsigned charまたはunsigned shortに定義した方が効率が
    3405 è‰¯ã„場合がある.
    3406 
    3407 (6-9-2-2) BIT_FIELD_BOOL(オプション)
    3408 
    3409 1ビットå¹
    3410 ã®ãƒ“ットフィールドで,ブール値を保持したい場合に用いるべきデー
    3411 ã‚¿åž‹ï¼Žãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯BIT_FIELD_UINTと同一に定義しているが,ブール値を保
    3412 æŒã™ã‚‹ã“とを明示するために別の名前としている.
    3413 
    3414 (6-9-2-3) TBIT_TCB_PRIORITY(オプション)
    3415 
    3416 ç¾åœ¨å„ªå
    3417 ˆåº¦ï¼ˆãŠã‚ˆã³ï¼ŒãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ‹¡å¼µã«ãŠã‘るベース優å
    3418 ˆåº¦ï¼‰ã‚’保持する
    3419 ãŸã‚ã®TCB中のフィールドのビット数.デフォルトでは8ビットに定義している
    3420 ãŒï¼Œãã‚Œä»¥å¤–に定義したい場合に,ビット数をこの名前にマクロ定義する.
    3421 
    3422 6.10 カーネル実è£
    3423 ã«é–¢ã™ã‚‹ãã®ä»–の定義
    3424 
    3425 6.10.1 ターゲット依存のオブジェクト属性
    3426 
    3427 (6-10-1-1) TARGET_TSKATR(オプション)   ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã®ã‚¿ã‚¹ã‚¯å±žæ€§
    3428 (6-10-1-2) TARGET_ISRATR(オプション)   ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã®ISR属性
    3429 (6-10-1-3) TARGET_INHATR(オプション)   ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã®å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©å±žæ€§
    3430 (6-10-1-4) TARGET_INTATR(オプション)   ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã®å‰²è¾¼ã¿å±žæ€§
    3431 (6-10-1-5) TARGET_EXCATR(オプション)   ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã®CPU例外ハンドラ属性
    3432 
    3433 å„オブジェクトの属性を,ターゲット定義に拡張する場合に,該当するオブジェ
    3434 ã‚¯ãƒˆå±žæ€§ã‚’示す変数に,拡張に使用するビットの論理和を定義する.これによ
    3435 ã‚Šï¼Œæ‹¡å¼µã«ä½¿ç”¨ã™ã‚‹ãƒ“ットが設定されている場合に,エラーになるのを防ぐ.
    3436 
    3437 ãªãŠï¼ŒTOPPERS新世代カーネル統合仕様書では,割込みサービスルーチン(ISR)
    3438 å±žæ€§ã‚’ターゲット定義で拡張できる仕様とはなっていない.
    3439 
    3440 6.10.2 エラーチェック方法の指定
    3441 
    3442 (6-10-2-1) TARGET_MIN_STKSZ(オプション)
    3443 
    3444 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã§ï¼Œã‚¿ã‚¹ã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯ã‚µã‚¤ã‚ºã®æœ€å°å€¤ã‚’設定する場合には,こ
    3445 ã®å¤‰æ•°ã‚’スタックサイズの最小値に定義する.
    3446 
    3447 (6-10-2-2) TARGET_MIN_ISTKSZ(オプション)
    3448 
    3449 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã§ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ã‚¹ã‚¿ãƒƒã‚¯ã‚µã‚¤ã‚ºã®æœ€å°å€¤ã‚’設定す
    3450 ã‚‹å ´åˆã«ã¯ï¼Œã“の変数をスタックサイズの最小値に定義する.
    3451 
    3452 (6-10-2-3) CHECK_STKSZ_ALIGN(オプション)
    3453 
    3454 ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®ã‚µã‚¤ã‚ºãŒã‚る値(アライン単位)の倍数でなければならない場
    3455 åˆã«ï¼Œã“の変数をアライン単位に定義する.この変数を定義することで,
    3456 kernel.tfおよびacre_tsk(動的生成機能拡張パッケージのみ)において,スタッ
    3457 ã‚¯é ˜åŸŸã®ã‚µã‚¤ã‚ºãŒæ­£ã—くない(この変数に定義した値の倍数でない)場合のエ
    3458 ãƒ©ãƒ¼ã‚’チェックするようになる.チェックがå¿
    3459 è¦ãªã„場合には,この変数を定
    3460 ç¾©ã—ない.
    3461 
    3462 (6-10-2-4) CHECK_FUNC_ALIGN(オプション)        処理単位のアライン単位
    3463 (6-10-2-5) CHECK_FUNC_NONNULL(オプション)      処理単位の非NULLチェック
    3464 (6-10-2-6) CHECK_STACK_ALIGN(オプション)       ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®ã‚¢ãƒ©ã‚¤ãƒ³å˜ä½
    3465 (6-10-2-7) CHECK_STACK_NONNULL(オプション)スタック領域の非NULLチェック
    3466 (6-10-2-8) CHECK_MPF_ALIGN(オプション) 固定長メモリプール領域のアライン単位
    3467 (6-10-2-9) CHECK_MPF_NONNULL(オプション)固定長メモリプール領域の非NULLチェック
    3468 
    3469 å‡¦ç†å˜ä½ï¼ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸï¼å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール領域のå
    3470 ˆé ­ç•ªåœ°ãŒã‚る値(アラ
    3471 ã‚¤ãƒ³å˜ä½ï¼‰ã®å€æ•°ã§ãªã‘ればならない場合に,それぞれ,CHECK_FUNC_ALIGN/
    3472 CHECK_STACK_ALIGN/CHECK_MPF_ALIGNをアライン単位に定義する.処理単位/
    3473 ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸï¼å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール領域のå
    3474 ˆé ­ç•ªåœ°ãŒNULLでないかのチェック
    3475 ã‚’行う場合には,それぞれCHECK_FUNC_NONNULL/CHECK_STACK_NONNULL/
    3476 CHECK_MPF_NONNULLを定義する.
    3477 
    3478 (6-10-2-10) CHECK_MB_ALIGN(オプション) 管理領域のアライン単位
    3479 
    3480 ã‚«ãƒ¼ãƒãƒ«å†
    3481 ã®ç®¡ç†é ˜åŸŸï¼ˆå
    3482 ·ä½“的には,データキュー管理領域,優å
    3483 ˆåº¦ãƒ‡ãƒ¼ã‚¿
    3484 ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸï¼Œå›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール管理領域)のå
    3485 ˆé ­ç•ªåœ°ãŒã‚る値(アライ
    3486 ãƒ³å˜ä½ï¼‰ã®å€æ•°ã§ãªã‘ればならない場合に,この変数をアライン単位に定義す
    3487 ã‚‹ï¼Žå‹•çš„生成機能拡張パッケージを使用しない場合には,定義するå¿
    3488 è¦ãŒãªã„.
    3489 
    3490 6.10.3 非タスクコンテキスト用のスタック領域
     2666ターゲット依存部の終了処理を行う関数.この関数は,カーネル終了処理の最
     2667後に呼び出され,リターンしてはならない.プロセッサ・チップ・開発環境依
     2668存の終了処理を,それらの依存部に切り分けることも可能である.
     2669
     2670この関数では,最初に,atexitによって登録された関数とデストラクタを呼び
     2671出すことを意図しており,標準的には,software_term_hookを呼び出す.
     2672software_term_hookが用意されていない場合は,何もしない.GNU開発環境では,
     2673リンカスクリプト中のweak definitionにより,software_term_hookが用意され
     2674ていない場合の値を0とすることで,これを実現できる.weak definitionの機
     2675能を持たない開発環境では,software_term_hookを必ず呼び出すことにする.
     2676
     2677この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼
     2678び出すことができない関数を呼ばないように実装しなければならない.
     2679
     26806.9 カーネル内部のチューニング
     2681
     26826.9.1 ビットマップサーチ
     2683
     2684(6-9-1-1) OMIT_BITMAP_SEARCH(オプション)
     2685(6-9-1-2) uint_t bitmap_search(uint16_t bitmap)(オプション)
     2686
     2687ターゲット非依存部で,uint16_t型の整数値(bitmap)中の1のビットの内,最
     2688も下位(右)のものをサーチし,そのビット番号を返す関数bitmap_searchを用
     2689意している.ここで,ビット番号は最下位ビットを0とし,bitmapに0を指定し
     2690てはならないものとしている.
     2691
     2692ビットサーチ命令を持つプロセッサでは,bitmap_searchを,ビットサーチ命令
     2693を使うように書き直した方が効率が良い場合がある.このような場合には,ター
     2694ゲット依存部でビットサーチ命令を使ったbitmap_searchを定義し,
     2695OMIT_BITMAP_SEARCHをマクロ定義する.
     2696
     2697標準ライブラリにビットサーチ命令を用いたffsがある場合,bitmap_searchを
     2698(ffs(bitmap) - 1)に定義するとよい.
     2699
     2700(6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)(オプション)
     2701
     2702ビットサーチ命令のサーチ方向が逆などの理由で,優先度とビットとの対応を
     2703変更したい場合には,PRIMAP_BITをマクロ定義する.
     2704
     27056.9.2 ビットフィールド
     2706
     2707(6-9-2-1) BIT_FIELD_UINT(オプション)
     2708
     27098ビット以下の幅のビットフィールドで,符号無し整数値を保持したい場合に用
     2710いるべきデータ型.デフォルトの定義はunsigned intとなっているが,ターゲッ
     2711トやツール依存で,unsigned charまたはunsigned shortに定義した方が効率が
     2712良い場合がある.
     2713
     2714(6-9-2-2) BIT_FIELD_BOOL(オプション)
     2715
     27161ビット幅のビットフィールドで,ブール値を保持したい場合に用いるべきデー
     2717タ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブール値を保
     2718持することを明示するために別の名前としている.
     2719
     2720(6-9-2-3) TBIT_TCB_PRIORITY(オプション)
     2721
     2722現在優先度(および,ミューテックス拡張におけるベース優先度)を保持する
     2723ためのTCB中のフィールドのビット数.デフォルトでは8ビットに定義している
     2724が,それ以外に定義したい場合に,ビット数をこの名前にマクロ定義する.
     2725
     27266.10 カーネル実装に関するその他の定義
     2727
     27286.10.1 ターゲット依存のオブジェクト属性
     2729
     2730(6-10-1-1) TARGET_TSKATR(オプション) ターゲット定義のタスク属性
     2731(6-10-1-2) TARGET_ISRATR(オプション) ターゲット定義のISR属性
     2732(6-10-1-3) TARGET_INHATR(オプション) ターゲット定義の割込みハンドラ属性
     2733(6-10-1-4) TARGET_INTATR(オプション) ターゲット定義の割込み属性
     2734(6-10-1-5) TARGET_EXCATR(オプション) ターゲット定義のCPU例外ハンドラ属性
     2735
     2736各オブジェクトの属性を,ターゲット定義に拡張する場合に,該当するオブジェ
     2737クト属性を示す変数に,拡張に使用するビットの論理和を定義する.これによ
     2738り,拡張に使用するビットが設定されている場合に,エラーになるのを防ぐ.
     2739
     2740なお,TOPPERS新世代カーネル統合仕様書では,割込みサービスルーチン(ISR)
     2741属性をターゲット定義で拡張できる仕様とはなっていない.
     2742
     27436.10.2 エラーチェック方法の指定
     2744
     2745(6-10-2-1) TARGET_MIN_STKSZ(オプション)
     2746
     2747ターゲット定義で,タスクのスタックサイズの最小値を設定する場合には,こ
     2748の変数をスタックサイズの最小値に定義する.
     2749
     2750(6-10-2-2) TARGET_MIN_ISTKSZ(オプション)
     2751
     2752ターゲット定義で,非タスクコンテキストのスタックサイズの最小値を設定す
     2753る場合には,この変数をスタックサイズの最小値に定義する.
     2754
     2755(6-10-2-3) CHECK_STKSZ_ALIGN(オプション)
     2756
     2757スタック領域のサイズがある値(アライン単位)の倍数でなければならない場
     2758合に,この変数をアライン単位に定義する.この変数を定義することで,
     2759kernel.tfおよびacre_tsk(動的生成機能拡張パッケージのみ)において,スタッ
     2760ク領域のサイズが正しくない(この変数に定義した値の倍数でない)場合のエ
     2761ラーをチェックするようになる.チェックが必要ない場合には,この変数を定
     2762義しない.
     2763
     2764(6-10-2-4) CHECK_FUNC_ALIGN(オプション)      処理単位のアライン単位
     2765(6-10-2-5) CHECK_FUNC_NONNULL(オプション)    処理単位の非NULLチェック
     2766(6-10-2-6) CHECK_STACK_ALIGN(オプション)     スタック領域のアライン単位
     2767(6-10-2-7) CHECK_STACK_NONNULL(オプション)スタック領域の非NULLチェック
     2768(6-10-2-8) CHECK_MPF_ALIGN(オプション)       固定長メモリプール領域のアライン単位
     2769(6-10-2-9) CHECK_MPF_NONNULL(オプション)固定長メモリプール領域の非NULLチェック
     2770
     2771処理単位/スタック領域/固定長メモリプール領域の先頭番地がある値(アラ
     2772イン単位)の倍数でなければならない場合に,それぞれ,CHECK_FUNC_ALIGN/
     2773CHECK_STACK_ALIGN/CHECK_MPF_ALIGNをアライン単位に定義する.処理単位/
     2774スタック領域/固定長メモリプール領域の先頭番地がNULLでないかのチェック
     2775を行う場合には,それぞれCHECK_FUNC_NONNULL/CHECK_STACK_NONNULL/
     2776CHECK_MPF_NONNULLを定義する.
     2777
     2778(6-10-2-10) CHECK_MB_ALIGN(オプション)       管理領域のアライン単位
     2779
     2780カーネル内の管理領域(具体的には,データキュー管理領域,優先度データ
     2781キュー管理領域,固定長メモリプール管理領域)の先頭番地がある値(アライ
     2782ン単位)の倍数でなければならない場合に,この変数をアライン単位に定義す
     2783る.動的生成機能拡張パッケージを使用しない場合には,定義する必要がない.
     2784
     27856.10.3 非タスクコンテキスト用のスタック領域
    34912786
    34922787(6-10-3-1) DEFAULT_ISTKSZ
    34932788
    3494 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
    3495 ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®ã‚µã‚¤ã‚ºï¼Ž
    3496 
    3497 (6-10-3-2) DEFAULT_ISTK(オプション)
    3498 
    3499 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
    3500 ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®å
    3501 ˆé ­ç•ªåœ°ï¼Žã“のマクロが定義されない場合には,
    3502 ã‚µã‚¤ã‚ºãŒDEFAULT_ISTKSZのスタック領域が,é
    3503 åˆ—により確保される.
    3504 
    3505 (6-10-3-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)(オプション)
    3506 
    3507 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã®åˆæœŸå€¤ã‚’保持する変数(istkpt)
    3508 ã‚’用いる場合に,このシンボルに,スタック領域のå
    3509 ˆé ­ç•ªåœ°ï¼ˆistk)とスタッ
    3510 ã‚¯é ˜åŸŸã®ã‚µã‚¤ã‚ºï¼ˆistksz)から,スタックポインタの初期値を求めるマクロを
    3511 å®šç¾©ã™ã‚‹ï¼Ž
    3512 
    3513 6.10.4 空ラベルの定義
    3514 
    3515 (6-10-4-1) TOPPERS_EMPTY_LABEL(type, symbol)(オプション)
    3516 
    3517 ãƒªãƒ³ã‚¯ã‚¨ãƒ©ãƒ¼ã‚’防ぐために,データ型typeのé
    3518 åˆ—である変数symbolに定義を与
    3519 ãˆã‚‹ãŸã‚ã®ãƒžã‚¯ãƒ­ï¼Žä¸ŽãˆãŸå®šç¾©ãŒå‚ç
    3520 §ã•ã‚Œã‚‹ã“とはないため,どのような定義
    3521 ã‚’与えてもよい.
    3522 
    3523 ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ï¼Œsymbolを,要素型がtypeでサイズが0のé
    3524 åˆ—に定義している.
    3525 ã‚µã‚¤ã‚ºãŒ0のé
    3526 åˆ—がエラーとならないコンパイラ(GCCはこれに該当)を用いる
    3527 å ´åˆã«ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§å®šç¾©ã™ã‚‹å¿
    3528 è¦ã¯ãªã„.
    3529 
    3530 6.11 トレースログ機能に関する設定
    3531 
    3532 ASPカーネルのソースコードには,カーネルの実行トレースログを取得するため
    3533 ã®ãƒžã‚¯ãƒ­ç­‰ãŒåŸ‹ã‚è¾¼ã‚“である.デフォルトでは,これらのマクロは空に定義さ
    3534 ã‚Œã¦ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ã®å–得は行わないが,これらのマクロを適切に定義すること
    3535 ã§ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ã®å–得を行うことができる.
    3536 
    3537 6.11.1 取得できるトレースログの種類とマクロ
    3538 
    3539 å–得できるトレースログの種類と,それを取得するために定義するマクロは次
    3540 ã®é€šã‚Šã§ã‚る.
    3541 
    3542 (a) カーネルの動作開始と終了
    3543 
    3544 æ¬¡ã®ãƒžã‚¯ãƒ­ã‚’定義することで,カーネルの動作開始時と終了時のトレースログ
    3545 ã‚’取得することができる.
    3546 
    3547         LOG_KER_ENTER           ã‚«ãƒ¼ãƒãƒ«ãŒå‹•ä½œã‚’開始する直前(初期化の完了後)
    3548         LOG_KER_LEAVE           ã‚«ãƒ¼ãƒãƒ«ã®çµ‚了(ext_ker)が呼ばれた直後(終了処
    3549                                                 理の実行前)
    3550 
    3551 (b) 処理単位の実行開始と終了
    3552 
    3553 æ¬¡ã®ãƒžã‚¯ãƒ­ã‚’定義することで,割込みハンドラ(INH),割込みサービスルーチ
    3554 ãƒ³ï¼ˆISR),周期ハンドラ(CYC),アラームハンドラ(ALM),CPU例外ハンド
    3555 ãƒ©ï¼ˆEXC),タスク例外処理ルーチン(TEX)の実行開始前と終了後のトレース
    3556 ãƒ­ã‚°ã‚’取得することができる.
    3557 
    3558         LOG_<処理単位略号>_ENTER  処理単位の実行開始直前
    3559         LOG_<処理単位略号>_LEAVE  処理単位の終了直後
    3560 
    3561 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¯ï¼Œã‚¢ãƒ—リケーションが登録したもののみを対象とし,割込み
    3562 ã‚µãƒ¼ãƒ“スルーチンを呼び出すためにカーネルå†
    3563 ã«ç”Ÿæˆã•ã‚Œã‚‹ã‚‚のは対象としな
    3564 ã„.タスクの実行開始と終了は,他の方法で取得できるため,この方法は用意
    3565 ã—ていない.
    3566 
    3567 ãªãŠï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¨CPU例外ハンドラの実行開始と終了のトレースログ取得
    3568 ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§å®Ÿè£
    3569 ã™ã‚‹å¿
    3570 è¦ãŒã‚る.詳しくは,「6.2 トレースログ
    3571 æ©Ÿèƒ½ã¸ã®å¯¾å¿œã€ã€Œ6.6.1 割込みハンドラの出å
    3572 ¥å£å‡¦ç†ã€ã€Œ6.7.1 CPU例外ハンド
    3573 ãƒ©ã®å‡ºå
    3574 ¥å£å‡¦ç†ã€ã®ç¯€ã‚’参ç
    3575 §ã™ã‚‹ã“と.
    3576 
    3577 (c) タスク状æ
    3578 ‹ã®å¤‰åŒ–
    3579 
    3580 æ¬¡ã®ãƒžã‚¯ãƒ­ã‚’定義することで,タスク状æ
    3581 ‹ãŒå¤‰åŒ–した時のトレースログを取得
    3582 ã™ã‚‹ã“とができる.ただし,実行状æ
    3583 ‹ã¨å®Ÿè¡Œå¯èƒ½çŠ¶æ
    3584 ‹ã®é–“の遷移は,他の方法
    3585 ã§å–得できるため,このマクロでは取得できない.
    3586 
    3587         LOG_TSKSTAT             ã‚¿ã‚¹ã‚¯çŠ¶æ
    3588 ‹ã®å¤‰åŒ–
    3589 
    3590 (d) ディスパッチャの実行開始と終了
    3591 
    3592 æ¬¡ã®ãƒžã‚¯ãƒ­ã‚’定義することで,ディスパッチャが実行開始する時と,終了する
    3593 æ™‚のトレースログを取得することができる.
    3594 
    3595         LOG_DSP_ENTER   ãƒ‡ã‚£ã‚¹ãƒ‘ッチャの実行開始
    3596         LOG_DSP_LEAVE   ãƒ‡ã‚£ã‚¹ãƒ‘ッチャの終了
    3597 
    3598 ãƒ‡ã‚£ã‚¹ãƒ‘ッチャの実行開始は,タスクが実行状æ
    3599 ‹ã‹ã‚‰å®Ÿè¡Œå¯èƒ½çŠ¶æ
    3600 ‹ã«é·ç§»ã™ã‚‹
    3601 ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ã‚るため,実行可能状æ
    3602 ‹ã¸é·ç§»ã™ã‚‹ã‚¿ã‚¹ã‚¯ã®TCBへのポインタをパ
    3603 ãƒ©ãƒ¡ãƒ¼ã‚¿ã¨ã™ã‚‹ï¼Žé€†ã«ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチャの終了は,タスクが実行可能状æ
    3604 ‹ã‹ã‚‰
    3605 å®Ÿè¡ŒçŠ¶æ
    3606 ‹ã«é·ç§»ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ã‚るため,実行状æ
    3607 ‹ã¸é·ç§»ã™ã‚‹ã‚¿ã‚¹ã‚¯ã®TCBへ
    3608 ã®ãƒã‚¤ãƒ³ã‚¿ã‚’パラメータとする.
    3609 
    3610 ASPカーネルでは,実行できるタスクがなく,カーネルがアイドル状æ
    3611 ‹ã«ãªã‚‹å ´
    3612 åˆã«ã¯ï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチャの中に留まる.そのため,アイドル状æ
    3613 ‹ã¸ã®é·ç§»ã¨ã‚¢
    3614 ã‚¤ãƒ‰ãƒ«çŠ¶æ
    3615 ‹ã‹ã‚‰ä»–の状æ
    3616 ‹ã¸ã®é·ç§»ã¯ï¼Œã“のマクロでは取得できない.
    3617 
    3618 ãªãŠï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチャの実行開始と終了のトレースログ取得は,ターゲット依
    3619 å­˜éƒ¨ã§å®Ÿè£
    3620 ã™ã‚‹å¿
    3621 è¦ãŒã‚る.詳しくは,「6.2 トレースログ機能への対応」と
    3622 ã€Œ6.5.2 ディスパッチャ本体」の節を参ç
    3623 §ã™ã‚‹ã“と.
    3624 
    3625 (e) サービスコールのå
    3626 ¥å£ã¨å‡ºå£
    3627 
    3628 æ¬¡ã®ãƒžã‚¯ãƒ­ã‚’定義することで,各サービスコールのå
    3629 ¥å£ã¨å‡ºå£ã®ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°
    3630 ã‚’取得することができる.
    3631 
    3632         LOG_<サービスコールの大文字表記>_ENTER             ã‚µãƒ¼ãƒ“スコール名のå
    3633 ¥å£
    3634         LOG_<サービスコールの大文字表記>_LEAVE             ã‚µãƒ¼ãƒ“スコール名の出口
    3635 
    3636 ãã‚Œãžã‚Œã®ãƒžã‚¯ãƒ­ã®åç§°ã‚„パラメータの詳細については,カーネルのソースコー
    3637 ãƒ‰ã‚’参ç
    3638 §ã™ã‚‹ã“と.
    3639 
    3640 6.11.2 トレースログ記録のサンプルコード
    3641 
    3642 ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ã‚’記録する方法の一例として,メモリ上にトレースログを記録す
    3643 ã‚‹ãŸã‚ã®ã‚µãƒ³ãƒ—ルコードをarch/logtraceディレクトリに用意している.このサ
    3644 ãƒ³ãƒ—ルコードは,システムログ機能と同様のトレースログ機能を用意し,トレー
    3645 ã‚¹ãƒ­ã‚°æƒ
    3646 å ±ã‚’メモリ上に記録するとともに,それを読み出して表示する機能を
    3647 å®Ÿç¾ã—ている.
    3648 
    3649 ã“のサンプルコードを組み込む方法は次の通りである.
    3650 
    3651 (1) target_config.hおよびtarget_syssvc.hに,次の記述を追加する.
     2789DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
     2790デフォルトのスタック領域のサイズ.
     2791
     2792(6-10-3-2) DEFAULT_ISTK(オプション)
     2793
     2794DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
     2795デフォルトのスタック領域の先頭番地.このマクロが定義されない場合には,
     2796サイズがDEFAULT_ISTKSZのスタック領域が,配列により確保される.
     2797
     2798(6-10-3-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)(オプション)
     2799
     2800非タスクコンテキスト用のスタックポインタの初期値を保持する変数(istkpt)
     2801を用いる場合に,このシンボルに,スタック領域の先頭番地(istk)とスタッ
     2802ク領域のサイズ(istksz)から,スタックポインタの初期値を求めるマクロを
     2803定義する.
     2804
     28056.10.4 空ラベルの定義
     2806
     2807(6-10-4-1) TOPPERS_EMPTY_LABEL(type, symbol)(オプション)
     2808
     2809リンクエラーを防ぐために,データ型typeの配列である変数symbolに定義を与
     2810えるためのマクロ.与えた定義が参照されることはないため,どのような定義
     2811を与えてもよい.
     2812
     2813デフォルトでは,symbolを,要素型がtypeでサイズが0の配列に定義している.
     2814サイズが0の配列がエラーとならないコンパイラ(GCCはこれに該当)を用いる
     2815場合には,ターゲット依存部で定義する必要はない.
     2816
     28176.11 トレースログ機能に関する設定
     2818
     2819ASPカーネルのソースコードには,カーネルの実行トレースログを取得するため
     2820のマクロ等が埋め込んである.デフォルトでは,これらのマクロは空に定義さ
     2821れてトレースログの取得は行わないが,これらのマクロを適切に定義すること
     2822でトレースログの取得を行うことができる.
     2823
     28246.11.1 取得できるトレースログの種類とマクロ
     2825
     2826取得できるトレースログの種類と,それを取得するために定義するマクロは次
     2827の通りである.
     2828
     2829(a) カーネルの動作開始と終了
     2830
     2831次のマクロを定義することで,カーネルの動作開始時と終了時のトレースログ
     2832を取得することができる.
     2833
     2834        LOG_KER_ENTER           カーネルが動作を開始する直前(初期化の完了後)
     2835        LOG_KER_LEAVE           カーネルの終了(ext_ker)が呼ばれた直後(終了処
     2836                                                理の実行前)
     2837
     2838(b) 処理単位の実行開始と終了
     2839
     2840次のマクロを定義することで,割込みハンドラ(INH),割込みサービスルーチ
     2841ン(ISR),周期ハンドラ(CYC),アラームハンドラ(ALM),CPU例外ハンド
     2842ラ(EXC),タスク例外処理ルーチン(TEX)の実行開始前と終了後のトレース
     2843ログを取得することができる.
     2844
     2845        LOG_<処理単位略号>_ENTER      処理単位の実行開始直前
     2846        LOG_<処理単位略号>_LEAVE      処理単位の終了直後
     2847
     2848割込みハンドラは,アプリケーションが登録したもののみを対象とし,割込み
     2849サービスルーチンを呼び出すためにカーネル内に生成されるものは対象としな
     2850い.タスクの実行開始と終了は,他の方法で取得できるため,この方法は用意
     2851していない.
     2852
     2853なお,割込みハンドラとCPU例外ハンドラの実行開始と終了のトレースログ取得
     2854は,ターゲット依存部で実装する必要がある.詳しくは,「6.2 トレースログ
     2855機能への対応」「6.6.1 割込みハンドラの出入口処理」「6.7.1 CPU例外ハンド
     2856ラの出入口処理」の節を参照すること.
     2857
     2858(c) タスク状態の変化
     2859
     2860次のマクロを定義することで,タスク状態が変化した時のトレースログを取得
     2861することができる.ただし,実行状態と実行可能状態の間の遷移は,他の方法
     2862で取得できるため,このマクロでは取得できない.
     2863
     2864        LOG_TSKSTAT             タスク状態の変化
     2865
     2866(d) ディスパッチャの実行開始と終了
     2867
     2868次のマクロを定義することで,ディスパッチャが実行開始する時と,終了する
     2869時のトレースログを取得することができる.
     2870
     2871        LOG_DSP_ENTER   ディスパッチャの実行開始
     2872        LOG_DSP_LEAVE   ディスパッチャの終了
     2873
     2874ディスパッチャの実行開始は,タスクが実行状態から実行可能状態に遷移する
     2875タイミングであるため,実行可能状態へ遷移するタスクのTCBへのポインタをパ
     2876ラメータとする.逆に,ディスパッチャの終了は,タスクが実行可能状態から
     2877実行状態に遷移するタイミングであるため,実行状態へ遷移するタスクのTCBへ
     2878のポインタをパラメータとする.
     2879
     2880ASPカーネルでは,実行できるタスクがなく,カーネルがアイドル状態になる場
     2881合には,ディスパッチャの中に留まる.そのため,アイドル状態への遷移とア
     2882イドル状態から他の状態への遷移は,このマクロでは取得できない.
     2883
     2884なお,ディスパッチャの実行開始と終了のトレースログ取得は,ターゲット依
     2885存部で実装する必要がある.詳しくは,「6.2 トレースログ機能への対応」と
     2886「6.5.2 ディスパッチャ本体」の節を参照すること.
     2887
     2888(e) サービスコールの入口と出口
     2889
     2890次のマクロを定義することで,各サービスコールの入口と出口のトレースログ
     2891を取得することができる.
     2892
     2893        LOG_<サービスコールの大文字表記>_ENTER               サービスコール名の入口
     2894        LOG_<サービスコールの大文字表記>_LEAVE               サービスコール名の出口
     2895
     2896それぞれのマクロの名称やパラメータの詳細については,カーネルのソースコー
     2897ドを参照すること.
     2898
     28996.11.2 トレースログ記録のサンプルコード
     2900
     2901トレースログを記録する方法の一例として,メモリ上にトレースログを記録す
     2902るためのサンプルコードをarch/logtraceディレクトリに用意している.このサ
     2903ンプルコードは,システムログ機能と同様のトレースログ機能を用意し,トレー
     2904スログ情報をメモリ上に記録するとともに,それを読み出して表示する機能を
     2905実現している.
     2906
     2907このサンプルコードを組み込む方法は次の通りである.
     2908
     2909(1) target_config.hおよびtarget_syssvc.hに,次の記述を追加する.
    36522910
    36532911        #ifdef TOPPERS_ENABLE_TRACE
     
    36552913        #endif /* TOPPERS_ENABLE_TRACE */
    36562914
    3657 (2) Makefile.targetに,次の記述を追加する.
     2915(2) Makefile.targetに,次の記述を追加する.
    36582916
    36592917        ifeq ($(ENABLE_TRACE),true)
     
    36632921        endif
    36642922
    3665 (3) スタートアップモジュールで,bssセクションのクリアを省略している場合
    3666     には,trace_modeをTRACE_STOP(=0)に初期化するコードを追加する.こ
    3667     れは,トレースログ機能が初期化される前に書き込まれるトレースログを
    3668     無視するためである.
    3669 
    3670 ã“のサンプルコードを用いて,トレースログを記録・ダンプする方法の例につ
    3671 ã„ては,「TOPPERS/ASPカーネル ユーザーズマニュアル」の「11.6 トレースロ
    3672 ã‚°è¨˜éŒ²ã®ã‚µãƒ³ãƒ—ルコードの使用方法」の節を参ç
    3673 §ã™ã‚‹ã“と.
    3674 
    3675 ãªãŠï¼Œã“のサンプルコードでは,ディスパッチャの出口,タスクの状æ
    3676 ‹é·ç§»ï¼Œ
    3677 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã®å‡ºåŠ›ã®3つのトレースログのみを記録している.他のトレースロ
    3678 ã‚°ã‚’記録したい場合には,trace_config.h(およびtrace_dump.c)を修正する
    3679 å¿
    3680 è¦ãŒã‚る.なお,カーネルのトレースログを網ç¾
    3681 çš„に記録するためのコード
    3682 ã¯ï¼ŒTLV(TraceLogVisualizer)のé
    3683 å¸ƒãƒ‘ッケージに含まれている.
    3684 
    3685 6.12 カーネル実è£
    3686 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãŸã‚ã®ãƒªãƒãƒ¼ãƒ è¨˜è¿°
    3687 
    3688 ã‚«ãƒ¼ãƒãƒ«å†
    3689 éƒ¨ã«é–‰ã˜ã¦ä½¿ã‚ã‚Œã‚‹é–¢æ•°ã‚„変数などの名称で,オブジェクトファイ
    3690 ãƒ«ã®ã‚·ãƒ³ãƒœãƒ«è¡¨ã«ç™»éŒ²ã•ã‚Œã¦å¤–部から参ç
    3691 §ã§ãã‚‹åç§°ã¯ï¼ŒC言語レベルで,å
    3692 ˆé ­
    3693 ãŒ"_kernel_"または"_KERNEL_"である名称としなければならないが,ASPカーネ
    3694 ãƒ«ã§ã¯ï¼Œã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’コンパクトに保ちつつこれを実現するために,リネー
    3695 ãƒ è¨˜è¿°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å°Žå
    3696 ¥ã—ている.
    3697 
    3698 å
    3699 ·ä½“的には,リネームすべき名称をリストアップしたxxx_rename.defを用意し,
    3700 ã“のファイルからツール(utils/genrename)により,名称をリネームするため
    3701 ã®ãƒžã‚¯ãƒ­å®šç¾©ã‚’含むxxx_rename.hと,それらのマクロ定義を解除するための
    3702 xxx_unrename.hを生成する.ツールの起動方法は次の通りである.
     2923(3) スタートアップモジュールで,bssセクションのクリアを省略している場合
     2924    には,trace_modeをTRACE_STOP(=0)に初期化するコードを追加する.こ
     2925    れは,トレースログ機能が初期化される前に書き込まれるトレースログを
     2926    無視するためである.
     2927
     2928このサンプルコードを用いて,トレースログを記録・ダンプする方法の例につ
     2929いては,「TOPPERS/ASPカーネル ユーザーズマニュアル」の「11.6 トレースロ
     2930グ記録のサンプルコードの使用方法」の節を参照すること.
     2931
     2932なお,このサンプルコードでは,ディスパッチャの出口,タスクの状態遷移,
     2933システムログの出力の3つのトレースログのみを記録している.他のトレースロ
     2934グを記録したい場合には,trace_config.h(およびtrace_dump.c)を修正する
     2935必要がある.なお,カーネルのトレースログを網羅的に記録するためのコード
     2936は,TLV(TraceLogVisualizer)の配布パッケージに含まれている.
     2937
     29386.12 カーネル実装のターゲット依存部のためのリネーム記述
     2939
     2940カーネル内部に閉じて使われる関数や変数などの名称で,オブジェクトファイ
     2941ルのシンボル表に登録されて外部から参照できる名称は,C言語レベルで,先頭
     2942が"_kernel_"または"_KERNEL_"である名称としなければならないが,ASPカーネ
     2943ルでは,ソースコードをコンパクトに保ちつつこれを実現するために,リネー
     2944ム記述ファイルを導入している.
     2945
     2946具体的には,リネームすべき名称をリストアップしたxxx_rename.defを用意し,
     2947このファイルからツール(utils/genrename)により,名称をリネームするため
     2948のマクロ定義を含むxxx_rename.hと,それらのマクロ定義を解除するための
     2949xxx_unrename.hを生成する.ツールの起動方法は次の通りである.
    37032950
    37042951        % genrename xxx
    37052952
    3706 xxx_rename.defには,リネームすべき名称を1行に1つ記述する.xxxxという名
    3707 ç§°ãŒè¨˜è¿°ã•ã‚Œã¦ã„る場合,xxx_rename.hには次のような記述が生成される.
     2953xxx_rename.defには,リネームすべき名称を1行に1つ記述する.xxxxという名
     2954称が記述されている場合,xxx_rename.hには次のような記述が生成される.
    37082955
    37092956#define xxxx                            _kernel_xxxx
     
    37122959#endif /* TOPPERS_LABEL_ASM */
    37132960
    3714 ã¾ãŸï¼Œxxx_unrename.hには次のような記述が生成される.
     2961また,xxx_unrename.hには次のような記述が生成される.
    37152962
    37162963#undef xxxx
     
    37192966#endif /* TOPPERS_LABEL_ASM */
    37202967
    3721 xxx_rename.defの中には,他のリネーム記述を取り込むために,「INCLUDE
    3722 "yyy"」または「INCLUDE <yyy>」という記述を含めることができる.この記述
    3723 ãŒã•ã‚Œã¦ã„る場合,xxx_rename.hには「#include "yyy_rename.h"」または
    3724 ã€Œ#include <yyy_rename.h>」という記述が,xxx_unrename.hには「#include
    3725 "yyy_unrename.h"」または「#include <yyy_unrename.h>」という記述が生成さ
    3726 ã‚Œã‚‹ï¼Ž
    3727 
    3728 xxx_rename.defの中の"#"で始まる行はコメントとして読み飛ばされる.また,
    3729 ç©ºè¡Œã‚‚無視される.
    3730 
    3731 ã‚«ãƒ¼ãƒãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§ä½¿ã‚ã‚Œã‚‹åç§°ã‚’リネームするために,kernel
    3732 ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ï¼Œkernel_rename.defと,そこから生成したkernel_rename.hお
    3733 ã‚ˆã³kernel_unrename.hが用意されている.kernel_rename.defには,
    3734 ã€ŒINCLUDE "target"」という記述が含まれており,ターゲット依存部のリネー
    3735 ãƒ è¨˜è¿°ã‚’取り込むようになっている.ターゲット依存部で定義し,ターゲット
    3736 éžä¾å­˜éƒ¨ã§å‚ç
    3737 §ã•ã‚Œã‚‹åç§°ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒªãƒãƒ¼ãƒ è¨˜è¿°ã«å«ã‚ã‚‹ï¼Ž
    3738 
    3739 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ä½¿ã‚ã‚Œã‚‹åç§°ã‚’リネームするため
    3740 ã«ï¼Œtarget_rename.defと,そこから生成したtarget_rename.hおよび
    3741 target_unrename.hを用意する.ターゲット依存部からプロセッサ・チップ・開
    3742 ç™ºç’°å¢ƒä¾å­˜éƒ¨ã‚’切り分ける場合には,target_rename.defにINCLUDE記述をå
    3743 ¥ã‚Œï¼Œ
    3744 ãƒ—ロセッサ・チップ・開発環境依存部のリネーム記述を取り込むようにする.
    3745 
    3746 6.13 タイマドライバ
    3747 
    3748 ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã«ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã‚’通知するためのタイマドライ
    3749 ãƒã§ã‚る.
    3750 
    3751 6.13.1 タイマドライバのファイル構成
    3752 
    3753 ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’組み込むための静的APIを記述したシステムコンフィギュレー
    3754 ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã‚’,target_timer.cfgに用意する.このファイルには,タイマ
    3755 ãƒ‰ãƒ©ã‚¤ãƒã‚’初期化するための初期化ルーチンの追加,タイマドライバを終了さ
    3756 ã›ã‚‹ãŸã‚ã®çµ‚了処理ルーチンの追加,タイマ割込みのための割込みハンドラの
    3757 å®šç¾©ï¼ˆã¾ãŸã¯ï¼Œå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンの追加),タイマ割込みのための割込
    3758 ã¿è¦æ±‚ラインの属性の設定の静的APIなどを含むことになる.
    3759 
    3760 ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’呼び出すためにå¿
    3761 è¦ãªå®šç¾©ã‚’含むヘッダファイルを,
    3762 target_timer.hに用意する.また,タイマドライバの実è£
    3763 ãƒ•ã‚¡ã‚¤ãƒ«ã‚’
    3764 target_timer.cに用意する.
    3765 
    3766 ã‚¿ã‚¤ãƒ ãƒ†ã‚£ãƒƒã‚¯ã®é€šçŸ¥ã«ã‚ˆã‚Šè¡Œã†å‡¦ç†ã®å¤šãã¯ï¼Œã‚¿ã‚¹ã‚¯ã®èµ·å‹•ã‚„å¾
    3767 ã¡è§£é™¤ã‚’è¡Œ
    3768 ã†ã‚‚のであるため,タイマ割込みの割込み優å
    3769 ˆåº¦ã¯ï¼Œå‰²è¾¼ã¿ã®ä¸­ã§æœ€ä½Žã®å„ªå
    3770 ˆ
    3771 åº¦ã§ååˆ†ã§ã‚る.ただし,周期ハンドラやアラームハンドラの実行開始é
    3772 ã‚ŒãŒ
    3773 å•é¡Œã«ãªã‚‹å ´åˆã«ã¯ï¼Œã‚¿ã‚¤ãƒžå‰²è¾¼ã¿ã®å‰²è¾¼ã¿å„ªå
    3774 ˆåº¦ã‚’より高い値に設定したい.
    3775 ãã“で,タイマ割込みの割込み優å
    3776 ˆåº¦ã‚’変更する方法を,ターゲット依存部の
    3777 ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã«è¨˜è¼‰ã™ã¹ãã§ã‚る.
    3778 
    3779 6.13.2 タイマの初期化・終了処理・割込み処理
     2968xxx_rename.defの中には,他のリネーム記述を取り込むために,「INCLUDE
     2969"yyy"」または「INCLUDE <yyy>」という記述を含めることができる.この記述
     2970がされている場合,xxx_rename.hには「#include "yyy_rename.h"」または
     2971「#include <yyy_rename.h>」という記述が,xxx_unrename.hには「#include
     2972"yyy_unrename.h"」または「#include <yyy_unrename.h>」という記述が生成さ
     2973れる.
     2974
     2975xxx_rename.defの中の"#"で始まる行はコメントとして読み飛ばされる.また,
     2976空行も無視される.
     2977
     2978カーネルのターゲット非依存部で使われる名称をリネームするために,kernel
     2979ディレクトリに,kernel_rename.defと,そこから生成したkernel_rename.hお
     2980よびkernel_unrename.hが用意されている.kernel_rename.defには,
     2981「INCLUDE "target"」という記述が含まれており,ターゲット依存部のリネー
     2982ム記述を取り込むようになっている.ターゲット依存部で定義し,ターゲット
     2983非依存部で参照される名称は,ターゲット依存部のリネーム記述に含める.
     2984
     2985ターゲット依存部では,ターゲット依存部で使われる名称をリネームするため
     2986に,target_rename.defと,そこから生成したtarget_rename.hおよび
     2987target_unrename.hを用意する.ターゲット依存部からプロセッサ・チップ・開
     2988発環境依存部を切り分ける場合には,target_rename.defにINCLUDE記述を入れ,
     2989プロセッサ・チップ・開発環境依存部のリネーム記述を取り込むようにする.
     2990
     29916.13 タイマドライバ
     2992
     2993タイマドライバは,カーネルにタイムティックを通知するためのタイマドライ
     2994バである.
     2995
     29966.13.1 タイマドライバのファイル構成
     2997
     2998タイマドライバを組み込むための静的APIを記述したシステムコンフィギュレー
     2999ションファイルを,target_timer.cfgに用意する.このファイルには,タイマ
     3000ドライバを初期化するための初期化ルーチンの追加,タイマドライバを終了さ
     3001せるための終了処理ルーチンの追加,タイマ割込みのための割込みハンドラの
     3002定義(または,割込みサービスルーチンの追加),タイマ割込みのための割込
     3003み要求ラインの属性の設定の静的APIなどを含むことになる.
     3004
     3005タイマドライバを呼び出すために必要な定義を含むヘッダファイルを,
     3006target_timer.hに用意する.また,タイマドライバの実装ファイルを
     3007target_timer.cに用意する.
     3008
     3009タイムティックの通知により行う処理の多くは,タスクの起動や待ち解除を行
     3010うものであるため,タイマ割込みの割込み優先度は,割込みの中で最低の優先
     3011度で十分である.ただし,周期ハンドラやアラームハンドラの実行開始遅れが
     3012問題になる場合には,タイマ割込みの割込み優先度をより高い値に設定したい.
     3013そこで,タイマ割込みの割込み優先度を変更する方法を,ターゲット依存部の
     3014ユーザーズマニュアルに記載すべきである.
     3015
     30166.13.2 タイマの初期化・終了処理・割込み処理
    37803017
    37813018(6-13-2-1) void target_timer_initialize(intptr_t exinf)
    37823019
    3783 ã‚¿ã‚¤ãƒžã‚’初期化し,タイマ割込みを周期的に発生させる関数.タイマ割込みの
    3784 å‘¨æœŸã¯ï¼ŒTIC_NUMEとTIC_DENOで指定された時間と一致させる(「5.2 タイム
    3785 ãƒ†ã‚£ãƒƒã‚¯ã®å®šç¾©ã€ã®ç¯€ã‚’参ç
    3786 §ï¼‰ï¼Ž
    3787 
    3788 ã“の関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
    3789 ã—てカーネルに登録することを想定している.
     3020タイマを初期化し,タイマ割込みを周期的に発生させる関数.タイマ割込みの
     3021周期は,TIC_NUMEとTIC_DENOで指定された時間と一致させる(「5.2 タイム
     3022ティックの定義」の節を参照).
     3023
     3024この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
     3025してカーネルに登録することを想定している.
    37903026
    37913027(6-13-2-2) void target_timer_terminate(intptr_t exinf)
    37923028
    3793 ã‚¿ã‚¤ãƒžã®å‹•ä½œã‚’停止させ,タイマ割込みを発生しないようにする関数.
    3794 
    3795 ã“の関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
    3796 ã¨ã—てカーネルに登録することを想定している.
     3029タイマの動作を停止させ,タイマ割込みを発生しないようにする関数.
     3030
     3031この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
     3032としてカーネルに登録することを想定している.
    37973033
    37983034(6-13-2-3) void target_timer_handler(void)
    3799     または void target_timer_isr(intptr_t exinf)
    3800 
    3801 ã‚¿ã‚¤ãƒžå‰²è¾¼ã¿ã«ã‚ˆã‚Šèµ·å‹•ã•ã‚Œã‚‹å‰²è¾¼ã¿å‡¦ç†ãƒ—ログラム.割込みハンドラとして
    3802 å®Ÿç¾ã™ã‚‹å ´åˆã«ã¯target_timer_handler,割込みサービスルーチンとして実現
    3803 ã™ã‚‹å ´åˆã«ã¯target_timer_isrの名称とする.ターゲット非依存部の
    3804 signal_timeを呼び出す.
    3805 
    3806 target_timer_handlerは,標準的には次のように定義する.
     3035    または void target_timer_isr(intptr_t exinf)
     3036
     3037タイマ割込みにより起動される割込み処理プログラム.割込みハンドラとして
     3038実現する場合にはtarget_timer_handler,割込みサービスルーチンとして実現
     3039する場合にはtarget_timer_isrの名称とする.ターゲット非依存部の
     3040signal_timeを呼び出す.
     3041
     3042target_timer_handlerは,標準的には次のように定義する.
    38073043
    38083044----------------------------------------
     
    38103046target_timer_handler(void)
    38113047{
    3812         i_begin_int(<タイマ割込みの割込み番号>);
     3048        i_begin_int(<タイマ割込みの割込み番号>);
    38133049        signal_time();
    3814         i_end_int(<タイマ割込みの割込み番号>);
     3050        i_end_int(<タイマ割込みの割込み番号>);
    38153051}
    38163052----------------------------------------
    38173053
    3818 ã“の関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
    3819 ãŸã¯å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンとしてカーネルに登録することを想定している.
    3820 
    3821 6.13.3 性能評価用システム時刻の参ç
    3822 §ã®ãŸã‚ã®æ©Ÿèƒ½
    3823 
    3824 æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻の参ç
    3825 §æ©Ÿèƒ½ï¼ˆget_utm)をサポートする場合には,タイ
    3826 ãƒžãƒ‰ãƒ©ã‚¤ãƒã§ï¼Œä»¥ä¸‹ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚„関数などを用意する.
    3827 
    3828 (6-13-3-1) OMIT_GET_UTM(オプション)
    3829 
    3830 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã®get_utmの実è£
    3831 ã‚’使用せず,ターゲット依存部でget_utm
    3832 ã‚’用意する場合には,このシンボルをマクロ定義する.このシンボルをマクロ
    3833 å®šç¾©ã—た場合,以下のデータ型や関数などを用意するå¿
    3834 è¦ã¯ãªã„.
     3054この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
     3055たは割込みサービスルーチンとしてカーネルに登録することを想定している.
     3056
     30576.13.3 性能評価用システム時刻の参照のための機能
     3058
     3059性能評価用システム時刻の参照機能(get_utm)をサポートする場合には,タイ
     3060マドライバで,以下のデータ型や関数などを用意する.
     3061
     3062(6-13-3-1) OMIT_GET_UTM(オプション)
     3063
     3064ターゲット非依存部のget_utmの実装を使用せず,ターゲット依存部でget_utm
     3065を用意する場合には,このシンボルをマクロ定義する.このシンボルをマクロ
     3066定義した場合,以下のデータ型や関数などを用意する必要はない.
    38353067
    38363068(6-13-3-2) CLOCK
    38373069
    3838 ã‚¿ã‚¤ãƒžå€¤ã®å†
    3839 éƒ¨è¡¨ç¾ã®ãŸã‚ã®ãƒ‡ãƒ¼ã‚¿åž‹ï¼Ž
     3070タイマ値の内部表現のためのデータ型.
    38403071
    38413072(6-13-3-3) CLOCK target_timer_get_current(void)
    38423073
    3843 ã‚¿ã‚¤ãƒžã®ç¾åœ¨å€¤ã‚’読み出し,å†
    3844 éƒ¨è¡¨ç¾ã§è¿”す関数.タイマ値は,時間の経過と
    3845 ã¨ã‚‚に増加することを想定している.ハードウェアのタイマが,タイマ値が減
    3846 å°‘するものである場合には,この関数å†
    3847 ã§å¢—加する値となるように変換する.
     3074タイマの現在値を読み出し,内部表現で返す関数.タイマ値は,時間の経過と
     3075ともに増加することを想定している.ハードウェアのタイマが,タイマ値が減
     3076少するものである場合には,この関数内で増加する値となるように変換する.
    38483077
    38493078(6-13-3-4) bool_t target_timer_probe_int(void)
    38503079
    3851 ã‚¿ã‚¤ãƒžå‰²è¾¼ã¿è¦æ±‚をチェックする関数.タイマ割込みが要求されている場合に
    3852 true,要求されていない場合にfalseを返す.
     3080タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に
     3081true,要求されていない場合にfalseを返す.
    38533082
    38543083(6-13-3-5) TO_USEC(clock)
    38553084
    3856 ã‚¿ã‚¤ãƒžå€¤ã®å†
    3857 éƒ¨è¡¨ç¾ã‚’,1μ秒単位に変換するためのマクロ(または関数).
    3858 targettimer_get_currentで読み出した値を,タイマ割込み発生からの経過時間
    3859 ï¼ˆå˜ä½: 1μ秒)に変換するために用いる.
    3860 
    3861 6.14 オーバランタイマドライバ(オプション)
    3862 
    3863 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©ã‚’起動するためのタイマの
    3864 ãƒ‰ãƒ©ã‚¤ãƒã§ã‚る.オーバランハンドラ機能拡張パッケージをサポートしない場
    3865 åˆã«ã¯ï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’用意するå¿
    3866 è¦ã¯ãªã„.
    3867 
    3868 6.14.1 オーバランタイマドライバのファイル構成
    3869 
    3870 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã¨åŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸­ã«è¨˜è¿°ã™ã‚‹ï¼Ž
    3871 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã®ãŸã‚ã®è¨˜è¿°ã¯ï¼ŒTOPPERS_SUPPORT_OVRHDRがマクロ
    3872 å®šç¾©ã•ã‚Œã¦ã„る場合にのみ有効になるようにする.
    3873 
    3874 ã™ãªã‚ã¡ï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’組み込むための静的APIは
    3875 target_timer.cfgの中に記述する.このファイルには,オーバランタイマドラ
    3876 ã‚¤ãƒã‚’初期化するための初期化ルーチンの追加,オーバランタイマドライバを
    3877 çµ‚了させるための終了処理ルーチンの追加,オーバランタイマ割込みのための
    3878 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®å®šç¾©ï¼ˆã¾ãŸã¯ï¼Œå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンの追加),オーバラ
    3879 ãƒ³ã‚¿ã‚¤ãƒžå‰²è¾¼ã¿ã®ãŸã‚ã®å‰²è¾¼ã¿è¦æ±‚ラインの属性の設定の静的APIなどを含むこ
    3880 ã¨ã«ãªã‚‹ï¼Ž
    3881 
    3882 ã¾ãŸï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’呼び出すためにå¿
    3883 è¦ãªå®šç¾©ã¯
    3884 target_timer.hの中に,オーバランタイマドライバの実è£
    3885 ã¯target_timer.cの
    3886 ä¸­ã«è¨˜è¿°ã™ã‚‹ï¼Ž
    3887 
    3888 ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©ã¯ï¼Œã‚¿ã‚¹ã‚¯ã®ã‚ªãƒ¼ãƒãƒ©ãƒ³ã«å¯¾ã™ã‚‹å‡¦ç†ã‚’行うものであるた
    3889 ã‚ï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžå‰²è¾¼ã¿ã®å‰²è¾¼ã¿å„ªå
    3890 ˆåº¦ã¯ï¼Œå‰²è¾¼ã¿ã®ä¸­ã§æœ€ä½Žã®å„ªå
    3891 ˆåº¦ã§
    3892 ååˆ†ã§ã‚る.ただし,オーバランタイマ割込みの割込み優å
    3893 ˆåº¦ã‚’より高い値に
    3894 è¨­å®šã—たい場合もないとは言えないため,オーバランタイマ割込みの割込み優
    3895 å
    3896 ˆåº¦ã‚’変更する方法を,ターゲット依存部のユーザーズマニュアルに記載すべ
    3897 ãã§ã‚る.
    3898 
    3899 6.14.2 オーバランタイマの操作と割込み処理
     3085タイマ値の内部表現を,1μ秒単位に変換するためのマクロ(または関数).
     3086targettimer_get_currentで読み出した値を,タイマ割込み発生からの経過時間
     3087(単位: 1μ秒)に変換するために用いる.
     3088
     30896.14 オーバランタイマドライバ(オプション)
     3090
     3091オーバランタイマドライバは,オーバランハンドラを起動するためのタイマの
     3092ドライバである.オーバランハンドラ機能拡張パッケージをサポートしない場
     3093合には,オーバランタイマドライバを用意する必要はない.
     3094
     30956.14.1 オーバランタイマドライバのファイル構成
     3096
     3097オーバランタイマドライバは,タイマドライバと同じファイルの中に記述する.
     3098オーバランタイマドライバのための記述は,TOPPERS_SUPPORT_OVRHDRがマクロ
     3099定義されている場合にのみ有効になるようにする.
     3100
     3101すなわち,オーバランタイマドライバを組み込むための静的APIは
     3102target_timer.cfgの中に記述する.このファイルには,オーバランタイマドラ
     3103イバを初期化するための初期化ルーチンの追加,オーバランタイマドライバを
     3104終了させるための終了処理ルーチンの追加,オーバランタイマ割込みのための
     3105割込みハンドラの定義(または,割込みサービスルーチンの追加),オーバラ
     3106ンタイマ割込みのための割込み要求ラインの属性の設定の静的APIなどを含むこ
     3107とになる.
     3108
     3109また,オーバランタイマドライバを呼び出すために必要な定義は
     3110target_timer.hの中に,オーバランタイマドライバの実装はtarget_timer.cの
     3111中に記述する.
     3112
     3113オーバランハンドラは,タスクのオーバランに対する処理を行うものであるた
     3114め,オーバランタイマ割込みの割込み優先度は,割込みの中で最低の優先度で
     3115十分である.ただし,オーバランタイマ割込みの割込み優先度をより高い値に
     3116設定したい場合もないとは言えないため,オーバランタイマ割込みの割込み優
     3117先度を変更する方法を,ターゲット依存部のユーザーズマニュアルに記載すべ
     3118きである.
     3119
     31206.14.2 オーバランタイマの操作と割込み処理
    39003121
    39013122(6-14-2-1) void target_ovrtimer_initialize(intptr_t exinf)
    39023123
    3903 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžã®åˆæœŸåŒ–処理を行う.タイマの動作開始は行わない.
    3904 
    3905 ã“の関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
    3906 ã—てカーネルに登録することを想定している.
     3124オーバランタイマの初期化処理を行う.タイマの動作開始は行わない.
     3125
     3126この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
     3127してカーネルに登録することを想定している.
    39073128
    39083129(6-14-2-2) void target_ovrtimer_terminate(intptr_t exinf)
    39093130
    3910 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžã‚’停止させ,オーバランタイマ割込みを発生しないようにす
    3911 ã‚‹ï¼Ž
    3912 
    3913 ã“の関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
    3914 ã¨ã—てカーネルに登録することを想定している.
     3131オーバランタイマを停止させ,オーバランタイマ割込みを発生しないようにす
     3132る.
     3133
     3134この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
     3135としてカーネルに登録することを想定している.
    39153136
    39163137(6-14-2-3) void target_ovrtimer_start(OVRTIM ovrtim)
    39173138
    3918 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžã«ï¼Œæ®‹ã‚Šæ™‚é–“ovrtimを設定し,動作開始する.ovrtimの単位
    3919 ã¯ãƒžã‚¤ã‚¯ãƒ­ç§’とする.
     3139オーバランタイマに,残り時間ovrtimを設定し,動作開始する.ovrtimの単位
     3140はマイクロ秒とする.
    39203141
    39213142(6-14-2-4) OVRTIM target_ovrtimer_stop(void)
    39223143
    3923 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžã‚’停止し,タイマの残り時間を読み出す.もし残り時間が
    3924 0(またはそれ未満)になっていた場合には,1を返す.また,オーバランタイ
    3925 ãƒžã‹ã‚‰ã®å‰²è¾¼ã¿ã‚’クリアする.
     3144オーバランタイマを停止し,タイマの残り時間を読み出す.もし残り時間が
     31450(またはそれ未満)になっていた場合には,1を返す.また,オーバランタイ
     3146マからの割込みをクリアする.
    39263147
    39273148(6-14-2-5) OVRTIM target_ovrtimer_get_current(void)
    39283149
    3929 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžã®æ®‹ã‚Šæ™‚間を読み出す.もし残り時間が0(またはそれ未満)
    3930 ã«ãªã£ã¦ã„た場合には,0を返す.オーバランタイマからの割込みはクリアしな
    3931 ã„.
     3150オーバランタイマの残り時間を読み出す.もし残り時間が0(またはそれ未満)
     3151になっていた場合には,0を返す.オーバランタイマからの割込みはクリアしな
     3152い.
    39323153
    39333154(6-14-2-6) void target_ovrtimer_handler(void)
    3934     または void target_ovrtimer_isr(intptr_t exinf)
    3935 
    3936 ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžå‰²è¾¼ã¿ã«ã‚ˆã‚Šèµ·å‹•ã•ã‚Œã‚‹å‰²è¾¼ã¿å‡¦ç†ãƒ—ログラム.割込みハン
    3937 ãƒ‰ãƒ©ã¨ã—て実現する場合にはtarget_ovrtimer_handler,割込みサービスルーチ
    3938 ãƒ³ã¨ã—て実現する場合にはtarget_ovrtimer_isrの名称とする.ターゲット非依
    3939 å­˜éƒ¨ã®call_ovrhdrを呼び出す.
    3940 
    3941 target_timer_handlerは,標準的には次のように定義する.
     3155    または void target_ovrtimer_isr(intptr_t exinf)
     3156
     3157オーバランタイマ割込みにより起動される割込み処理プログラム.割込みハン
     3158ドラとして実現する場合にはtarget_ovrtimer_handler,割込みサービスルーチ
     3159ンとして実現する場合にはtarget_ovrtimer_isrの名称とする.ターゲット非依
     3160存部のcall_ovrhdrを呼び出す.
     3161
     3162target_timer_handlerは,標準的には次のように定義する.
    39423163
    39433164----------------------------------------
     
    39453166target_ovrtimer_handler(void)
    39463167{
    3947         i_begin_int(<オーバランタイマ割込みの割込み番号>);
    3948         オーバランタイマ割込み要求のクリア(å¿
    3949 è¦ãªã‚‰ï¼‰
     3168        i_begin_int(<オーバランタイマ割込みの割込み番号>);
     3169        オーバランタイマ割込み要求のクリア(必要なら)
    39503170        call_ovrhdr();
    3951         i_end_int(<オーバランタイマ割込みの割込み番号>);
     3171        i_end_int(<オーバランタイマ割込みの割込み番号>);
    39523172}
    39533173----------------------------------------
    39543174
    3955 ã“の関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
    3956 ãŸã¯å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンとしてカーネルに登録することを想定している.
     3175この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
     3176たは割込みサービスルーチンとしてカーネルに登録することを想定している.
    39573177
    39583178(6-14-2-7) OMIT_OVRTIMER_START
    39593179(6-14-2-8) OMIT_OVRTIMER_STOP
    39603180
    3961 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‹ã‚‰å‘¼ã³å‡ºã™ovrtimer_startとovrtimer_stopを,アセンブリ
    3962 è¨€èªžã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å±•é–‹ã—,C言語の関数が不要になる場合には,それぞれ,
    3963 OMIT_OVRTIMER_STARTとOMIT_OVRTIMER_STOPをマクロ定義する.
    3964 
    3965 6.15 動的メモリ管理(オプション)
    3966 
    3967 å‹•çš„生成機能拡張パッケージを使用する場合には,カーネルå†
    3968 ã§ã®å‹•çš„メモリ
    3969 ç®¡ç†ã®æ–¹æ³•ã‚’決めるå¿
    3970 è¦ãŒã‚る.
    3971 
    3972 å‹•çš„生成機能拡張パッケージのターゲット非依存部では,メモリ領域をå
    3973 ˆé ­ã‹
    3974 ã‚‰é †ã«å‰²ã‚Šå½“て,解放されたメモリ領域を再利用しないメモリ管理モジュール
    3975 ã®ã¿ã‚’実è£
    3976 ã—ている.デフォルトでは,このメモリ管理モジュールが使用され
    3977 ã‚‹ï¼Ž
    3978 
    3979 æœ¬æ ¼çš„な動的メモリ管理を行いたい場合には,ターゲット依存部またはユーザ
    3980 å´ã§ï¼Œä»¥ä¸‹ã®é–¢æ•°ã‚’定義したメモリ管理モジュールを用意するå¿
    3981 è¦ãŒã‚る.
    3982 
    3983 (6-15-1) OMIT_KMM_ALLOCONLY(オプション)
    3984 
    3985 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã®ãƒ¡ãƒ¢ãƒªç®¡ç†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’使用せず,ターゲット依存部ま
    3986 ãŸã¯ãƒ¦ãƒ¼ã‚¶å´ã§ç”¨æ„ã™ã‚‹å ´åˆã«ã¯ï¼Œã“のシンボルをマクロ定義する.
    3987 
    3988 (6-15-2) void initialize_kmm(void)(オプション)
    3989 
    3990 ãƒ¡ãƒ¢ãƒªç®¡ç†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’初期化する関数.カーネルの割り付けるメモリ領域の
    3991 ã‚µã‚¤ã‚ºã¨å
    3992 ˆé ­ç•ªåœ°ã¯ï¼Œãã‚Œãžã‚Œkmmszとkmmによって参ç
    3993 §ã§ãã‚‹ï¼Ž
    3994 
    3995 (6-15-3) void *kernel_malloc(SIZE size)(オプション)
    3996 
    3997 sizeで指定されたサイズのメモリ領域を割り付け,そのå
    3998 ˆé ­ç•ªåœ°ã‚’返す関数.
    3999 å‰²ã‚Šä»˜ã‘ることができない場合には,NULLを返す.
    4000 
    4001 (6-15-4) void kernel_free(void *ptr)(オプション)
    4002 
    4003 ptrで指定されたメモリ領域を解放する関数.
    4004 
    4005 6.15.1 TLSFを用いたメモリ管理モジュールの例
    4006 
    4007 ã‚ªãƒ¼ãƒ—ンソースのメモリ割付けライブラリであるTLSFを用いて動的メモリ管理
    4008 ã‚’実現するには,OMIT_KMM_ALLOCONLYをマクロ定義し,以下の関数定義等をC言
    4009 èªžã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã‚ã‚Œã°ã‚ˆã„.
     3181ターゲット依存部から呼び出すovrtimer_startとovrtimer_stopを,アセンブリ
     3182言語のソースコード中に展開し,C言語の関数が不要になる場合には,それぞれ,
     3183OMIT_OVRTIMER_STARTとOMIT_OVRTIMER_STOPをマクロ定義する.
     3184
     31856.15 動的メモリ管理(オプション)
     3186
     3187動的生成機能拡張パッケージを使用する場合には,カーネル内での動的メモリ
     3188管理の方法を決める必要がある.
     3189
     3190動的生成機能拡張パッケージのターゲット非依存部では,メモリ領域を先頭か
     3191ら順に割り当て,解放されたメモリ領域を再利用しないメモリ管理モジュール
     3192のみを実装している.デフォルトでは,このメモリ管理モジュールが使用され
     3193る.
     3194
     3195本格的な動的メモリ管理を行いたい場合には,ターゲット依存部またはユーザ
     3196側で,以下の関数を定義したメモリ管理モジュールを用意する必要がある.
     3197
     3198(6-15-1) OMIT_KMM_ALLOCONLY(オプション)
     3199
     3200ターゲット非依存部のメモリ管理モジュールを使用せず,ターゲット依存部ま
     3201たはユーザ側で用意する場合には,このシンボルをマクロ定義する.
     3202
     3203(6-15-2) void initialize_kmm(void)(オプション)
     3204
     3205メモリ管理モジュールを初期化する関数.カーネルの割り付けるメモリ領域の
     3206サイズと先頭番地は,それぞれkmmszとkmmによって参照できる.
     3207
     3208(6-15-3) void *kernel_malloc(SIZE size)(オプション)
     3209
     3210sizeで指定されたサイズのメモリ領域を割り付け,その先頭番地を返す関数.
     3211割り付けることができない場合には,NULLを返す.
     3212
     3213(6-15-4) void kernel_free(void *ptr)(オプション)
     3214
     3215ptrで指定されたメモリ領域を解放する関数.
     3216
     32176.15.1 TLSFを用いたメモリ管理モジュールの例
     3218
     3219オープンソースのメモリ割付けライブラリであるTLSFを用いて動的メモリ管理
     3220を実現するには,OMIT_KMM_ALLOCONLYをマクロ定義し,以下の関数定義等をC言
     3221語ソースファイルに含めればよい.
    40103222
    40113223----------------------------------------
     
    40433255
    40443256
    4045 ï¼—.コンフィギュレータ設定ファイルのターゲット依存部
    4046 
    4047 7.1 設定ファイルとターゲット依存部の位置付け
    4048 
    4049 ASPカーネルのコンフィギュレータは,設定ファイルの記述に従ってファイルの
    4050 ç”ŸæˆãŠã‚ˆã³ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯ã‚’行う.コンフィギュレータの設定ファイルには,
    4051 ä»¥ä¸‹ã®4つがある.
    4052 
    4053 (a) 静的APIテーブル
    4054 
    4055 é™çš„APIの一覧と,各静的APIのパラメータについて記述したファイル.静的
    4056 APIを拡張する場合以外は変更するå¿
    4057 è¦ãŒãªã„ため,ターゲット非依存部で用意
    4058 ã—ている(kernel/kernel_api.csv).
    4059 
    4060 (b) 値取得シンボルテーブル
    4061 
    4062 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス1において,パラメータ計算用C言語ファイルに出力
    4063 ã—,値を求めたいシンボル(一般には式)を記述するためのファイル.ターゲッ
    4064 ãƒˆéžä¾å­˜éƒ¨ã§ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã›ãšã«å¿
    4065 è¦ã¨ãªã‚‹ã‚·ãƒ³ãƒœãƒ«ã‚’記述したファ
    4066 ã‚¤ãƒ«ã‚’用意している(kernel/kernel_def.csv).
    4067 
    4068 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã—てå¿
    4069 è¦ã¨ãªã‚‹ã‚·ãƒ³ãƒœãƒ«ãŒã‚る場合には,targetディレクト
    4070 ãƒªã«ç½®ã‹ã‚ŒãŸtarget_def.csv中に記述する.target_def.csv中に記述して値を
    4071 æ±‚めることができるシンボルは,kernel/kernel_int.hおよびそこからインクルー
    4072 ãƒ‰ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§å®šç¾©ã•ã‚Œã¦ã„なければならない.kernel_int.hからは,
    4073 target_stddef.h,target_kernel.h,target_config.hを(間接的に)インクルー
    4074 ãƒ‰ã—ているため,これらのファイルおよびそこからインクルードされるファイ
    4075 ãƒ«ã§å®šç¾©ã•ã‚Œã‚‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®ã‚·ãƒ³ãƒœãƒ«ã¯ï¼Œtarget_def.csv中に記述するこ
    4076 ã¨ãŒã§ãã‚‹ï¼Ž
    4077 
    4078 ã“こで値を求めたシンボルの値は,コンフィギュレータのパス2およびパス3の
    4079 ãƒ†ãƒ³ãƒ—レートファイル中で参ç
    4080 §ã™ã‚‹ã“とができる.
    4081 
    4082 (c) パス2のテンプレートファイル
    4083 
    4084 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス2は,テンプレートファイルに従って,カーネルの構
    4085 æˆãƒ»åˆæœŸåŒ–ファイル(kernel_cfg.c),構成・初期化ヘッダファイル
    4086 ï¼ˆkernel_cfg.h)などを生成する.このテンプレートファイルは,ターゲット
    4087 éžä¾å­˜éƒ¨ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«åˆ‡ã‚Šåˆ†ã‘てあるが,他のファイルのターゲット
    4088 ä¾å­˜éƒ¨ã¨ã¯é€†ã«ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‹ã‚‰ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã‚’インクルードす
    4089 ã‚‹å½¢ã«ãªã£ã¦ã„る.
    4090 
    4091 å
    4092 ·ä½“的には,targetディレクトリに置かれたtarget.tfで,å¿
    4093 è¦ãªå¤‰æ•°ã‚’定義し
    4094 ãŸå¾Œï¼Œãƒ†ãƒ³ãƒ—レートファイルのターゲット非依存部(kernel/kernel.tf)をイ
    4095 ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã‚‹ï¼Žkernel.tfでは,カーネルのターゲット非依存部で使用する変
    4096 æ•°å®šç¾©ç­‰ã‚’生成する.kernel.tfをインクルードした後,target.tfでは,カー
    4097 ãƒãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ä½¿ç”¨ã™ã‚‹å¤‰æ•°å®šç¾©ç­‰ã‚’生成する.target.tfから,プ
    4098 ãƒ­ã‚»ãƒƒã‚µä¾å­˜éƒ¨ï¼Œãƒãƒƒãƒ—依存部を,開発環境依存部を切り分けてもよい.
    4099 
    4100 (d) パス3のテンプレートファイル
    4101 
    4102 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス3は,テンプレートファイルに従って,静的APIの一
    4103 èˆ¬å®šæ•°å¼ãƒ‘ラメータのチェックを行う.このテンプレートファイルも,ターゲッ
    4104 ãƒˆéžä¾å­˜éƒ¨ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«åˆ‡ã‚Šåˆ†ã‘てあり,ターゲット依存部からター
    4105 ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã‚’インクルードする形になっている.
    4106 
    4107 å
    4108 ·ä½“的には,targetディレクトリに置かれたtarget_check.tfで,å¿
    4109 è¦ãªå¤‰æ•°ã‚’
    4110 å®šç¾©ã—た後,テンプレートファイルのターゲット非依存部
    4111 ï¼ˆkernel/kernel_check.tf)をインクルードする.kernel_check.tfでは,カー
    4112 ãƒãƒ«ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§åˆæœŸåŒ–ブロックに出力した一般定数式パラメータ
    4113 ã®ãƒã‚§ãƒƒã‚¯ã‚’行う.kernel_check.tfをインクルードした後,target_check.tf
    4114 ã§ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ä¾å­˜ã™ã‚‹ãƒã‚§ãƒƒã‚¯ã‚’行う.target_check.tfから,プロセッ
    4115 ã‚µä¾å­˜éƒ¨ï¼Œãƒãƒƒãƒ—依存部を,開発環境依存部を切り分けてもよい.
    4116 
    4117 ãªãŠï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®è©³ç´°ä»•æ§˜ã¨è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®è¨˜è¿°æ–¹æ³•ã«ã¤ã„ては,
    4118 åˆ¥é€”PDFファイルの形でé
    4119 å¸ƒã—ている「TOPPERS新世代カーネル用コンフィギュ
    4120 ãƒ¬ãƒ¼ã‚¿ä»•æ§˜ã€ãŠã‚ˆã³ã€ŒTOPPERS新世代カーネル用コンフィギュレータå†
    4121 è”µãƒžã‚¯ãƒ­
    4122 ãƒ—ロセッサ仕様」を参ç
    4123 §ã™ã‚‹ã“と.
    4124 
    4125 7.2 パス2のテンプレートファイルのターゲット依存部
    4126 
    4127 ä»¥ä¸‹ã§ã¯ï¼Œãƒ‘ス2のテンプレートファイルのターゲット依存部を記述する上でå¿
    4128 
    4129 è¦ãªäº‹é 
    4130 ã«ã¤ã„て説明する.
    4131 
    4132 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
    4133 
    4134 target.tfからkernel.tfをインクルードする前に,次の変数を定義しておかな
    4135 ã‘ればならない.
    4136 
    4137 (7-2-1-1) INTNO_ATTISR_VALID    ATT_ISRで使用できる割込み番号
    4138 (7-2-1-2) INHNO_ATTISR_VALID    INTNO_ATTISR_VALIDに対応する割込ハンドラ番号
    4139 (7-2-1-3) INHNO_DEFINH_VALID    DEF_INTで使用できる割込みハンドラ番号
    4140 (7-2-1-4) EXCNO_DEFEXC_VALID    DEF_EXCで使用できるCPU例外ハンドラ番号
    4141 (7-2-1-5) INTNO_CFGINT_VALID    CFG_INTで使用できる割込み番号
    4142 (7-2-1-6) INTPRI_CFGINT_VALID   CFG_INTで使用できる割込み優å
    4143 ˆåº¦
    4144 
    4145 APIで使用できる割込み番号/割込みハンドラ番号/CPU例外ハンドラ番号/割
    4146 è¾¼ã¿å„ªå
    4147 ˆåº¦ã®ãƒªã‚¹ãƒˆã‚’,各変数に定義する.INHNO_ATTISR_VALIDには,
    4148 INTNO_ATTISR_VALIDにリストアップした割込み番号に対応する割込みハンドラ
    4149 ç•ªå·ã®ãƒªã‚¹ãƒˆã‚’定義する.CFG_INTには,すべての割込み番号を指定することが
    4150 ã§ãã‚‹ãŸã‚ï¼ŒINTNO_CFGINT_VALIDには,有効な割込み番号をすべてリストアッ
    4151 ãƒ—する.
    4152 
    4153 (7-2-1-7) INTNO_FIX_KERNEL(オプション) カーネル管理に固定されている
    4154                                                                                         割込み番号
    4155 (7-2-1-8) INHNO_FIX_KERNEL(オプション) カーネル管理に固定されている
    4156                                                                                         割込みハンドラ番号
    4157 (7-2-1-9) INHNO_FIX_NONKERNEL(オプション)      カーネル管理外に固定されている
    4158                                                                                         割込み番号
    4159 (7-2-1-10) INHNO_FIX_NONKERNEL(オプション)カーネル管理外に固定されている
    4160                                                                                         割込みハンドラ番号
    4161 
    4162 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã¾ãŸã¯ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–に固定されている割込みがある場合には,
    4163 ãã‚Œã‚‰ã®å‰²è¾¼ã¿ç•ªå·ã¨å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ã®ãƒªã‚¹ãƒˆã‚’,各変数に定義する.
    4164 
    4165 (7-2-1-11) USE_INHINIB_TABLE(オプション)
    4166 
    4167 OMIT_INITIALIZE_INTERRUPTを定義したが,割込みハンドラの初期化にå¿
    4168 è¦ãªæƒ
    4169 
    4170 å ±ã‚’kernel_cfg.cに生成したい場合には,この変数を1に設定する.å
    4171 ·ä½“的には,
    4172 TNUM_INHNO,tnum_inhno,inhinib_tableの定義と,割込みハンドラ毎の出å
    4173 ¥å£
    4174 å‡¦ç†ã‚’生成するための記述(INTHDR_ENTRYマクロのリスト)が,ターゲット非
    4175 ä¾å­˜éƒ¨ã«ã‚ˆã£ã¦ç”Ÿæˆã•ã‚Œã‚‹ï¼Ž
    4176 
    4177 (7-2-1-12) USE_INTINIB_TABLE(オプション)
    4178 
    4179 OMIT_INITIALIZE_INTERRUPTを定義したが,割込み要求ラインの初期化にå¿
    4180 è¦ãª
    4181 æƒ
    4182 å ±ã‚’kernel_cfg.cに生成したい場合には,この変数を1に設定する.å
    4183 ·ä½“的に
    4184 ã¯ï¼ŒTNUM_INTNO,tnum_intno,intinib_tableの定義が,ターゲット非依存部に
    4185 ã‚ˆã£ã¦ç”Ÿæˆã•ã‚Œã‚‹ï¼Ž
    4186 
    4187 (7-2-1-13) GENERATE_TSKINICTXB(オプション)
    4188 
    4189 USE_TSKINICTXBをマクロ定義した場合,TSKINICTXBの初期化æƒ
    4190 å ±ã‚’生成するた
    4191 ã‚ãƒ†ãƒ³ãƒ—レートファイル関数GENERATE_TSKINICTXBを定義する.
    4192 GENERATE_TSKINICTXBには,タスクIDがパラメータとして渡される.
    4193 
    4194 (7-2-1-14) ALLOC_STACK(オプション)
    4195 
    4196 ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®ç”Ÿæˆæ–¹æ³•ã‚’デフォルトから変更したい場合には,スタック領域
    4197 ã‚’生成するためのテンプレートファイル関数ALLOC_STACKを定義する.
    4198 ALLOC_STACKには,スタック領域の変数名と丸める前のサイズがパラメータとし
    4199 ã¦æ¸¡ã•ã‚Œã‚‹ã®ã§ï¼Œã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã‚’生成するコードを生成し,大きい方に丸めた
    4200 ã‚µã‚¤ã‚ºã‚’表す文字列を返す.
    4201 
    4202 7.2.2 ターゲット非依存部で定義される変数
    4203 
    4204 kernel.tfの中では次の変数が定義されるため,kernel.tfをインクルードした
    4205 å¾Œï¼Œtarget.tfの中でこれらを参ç
    4206 §ã™ã‚‹ã“とができる.
    4207 
    4208 (7-2-2-1) INTNO[inhno]          inhnoを対応するintnoに変換するための連想é
    4209 åˆ—
    4210 (7-2-2-2) INHNO[intno]          intnoを対応するinhnoに変換するための連想é
    4211 åˆ—
    4212 
    4213 7.3 パス3のテンプレートファイルのターゲット依存部
    4214 
    4215 ä»¥ä¸‹ã§ã¯ï¼Œãƒ‘ス3のテンプレートファイルのターゲット依存部を記述する上でå¿
    4216 
    4217 è¦ãªäº‹é 
    4218 ã«ã¤ã„て説明する.
    4219 
    4220 7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
    4221 
    4222 target_check.tfからkernel_check.tfをインクルードする前に,å¿
    4223 è¦ã«å¿œã˜ã¦ï¼Œ
    4224 æ¬¡ã®å¤‰æ•°ã‚’定義しておかなければならない.
    4225 
    4226 (7-3-1-1) GET_STK_TSKINICTXB(オプション)
    4227 
    4228 USE_TSKINICTXBをマクロ定義した場合,TINIBからスタック領域のå
    4229 ˆé ­ç•ªåœ°ã‚’取
    4230 ã‚Šå‡ºã™ãŸã‚ã®ãƒ†ãƒ³ãƒ—レートファイル関数GET_STK_TSKINICTXBを定義する.
    4231 GET_STK_TSKINICTXBには,タスク初期化ブロック(TINIB)のå
    4232 ˆé ­ç•ªåœ°ãŒãƒ‘ラメー
    4233 ã‚¿ã¨ã—て渡される.CHECK_STACK_ALIGN,CHECK_STACK_NONNULLとも定義しない
    4234 å ´åˆã«ã¯ï¼ŒGET_STK_TSKINICTXBを定義するå¿
    4235 è¦ã¯ãªã„.
    4236 
    4237 (7-3-1-2) LMA.ORDER_LIST(オプション)
    4238 (7-3-1-3) LMA.START_DATA[lmano](オプション)
    4239 (7-3-1-4) LMA.END_DATA[lmano](オプション)
    4240 (7-3-1-5) LMA.START_IDATA[lmano](オプション)
    4241 
    4242 ãƒ‘ス3のテンプレートファイルのターゲット依存部でdataセクションからデータ
    4243 ã‚’取得する場合や,rodataセクションをRAMに置く場合(ユーザーズマニュアル
    4244 ã®ã€Œ11.8 rodataセクションをRAMに置く場合」の節を参ç
    4245 §ï¼‰ã«ã¯ï¼Œã“れらのセ
    4246 ã‚¯ã‚·ãƒ§ãƒ³ã®å†
    4247 å®¹ã‚’,é
    4248 ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ˆROMå†
    4249 ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ŒLMAと呼ぶ)からアクセ
    4250 ã‚¹ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ˆRAMå†
    4251 ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ŒVMAと呼ぶ)にコピーするå¿
    4252 è¦ãŒã‚る.
    4253 
    4254 ã“のコピーは,LMA.ORDER_LISTに,コピーするセクションの番号(lmano)のリ
    4255 ã‚¹ãƒˆï¼ˆç•ªå·ã¯ä»»æ„ã«ä»˜ä¸Žã—てよい),LMA.START_DATA[lmano]にコピーするセク
    4256 ã‚·ãƒ§ãƒ³ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å
    4257 ˆé ­ã®ãƒ©ãƒ™ãƒ«ï¼ŒLMA.END_DATA[lmano]に末尾のラベ
    4258 ãƒ«ï¼ŒLMA.START_IDATA[lmano]にそのé
    4259 ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å
    4260 ˆé ­ã®ãƒ©ãƒ™ãƒ«ã‚’設定するこ
    4261 ã¨ã§ï¼Œãƒ‘ス3のテンプレートファイルのターゲット非依存部で実施する.
    4262 
    4263 ä¾‹ãˆã°ï¼Œã‚³ãƒ”ーするセクションのアクセスアドレスのå
    4264 ˆé ­ã®ãƒ©ãƒ™ãƒ«ãŒ
    4265 "__data_start",末尾のラベルが"__data_end",そのé
    4266 ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å
    4267 ˆé ­ã®ãƒ©
    4268 ãƒ™ãƒ«ãŒ"__idata_start"の場合には,パス3のテンプレートファイルのターゲッ
    4269 ãƒˆä¾å­˜éƒ¨ã«ä»¥ä¸‹ã®è¨˜è¿°ã‚’含める.
     32577.コンフィギュレータ設定ファイルのターゲット依存部
     3258
     32597.1 設定ファイルとターゲット依存部の位置付け
     3260
     3261ASPカーネルのコンフィギュレータは,設定ファイルの記述に従ってファイルの
     3262生成およびエラーチェックを行う.コンフィギュレータの設定ファイルには,
     3263以下の4つがある.
     3264
     3265(a) 静的APIテーブル
     3266
     3267静的APIの一覧と,各静的APIのパラメータについて記述したファイル.静的
     3268APIを拡張する場合以外は変更する必要がないため,ターゲット非依存部で用意
     3269している(kernel/kernel_api.csv).
     3270
     3271(b) 値取得シンボルテーブル
     3272
     3273コンフィギュレータのパス1において,パラメータ計算用C言語ファイルに出力
     3274し,値を求めたいシンボル(一般には式)を記述するためのファイル.ターゲッ
     3275ト非依存部では,ターゲットに依存せずに必要となるシンボルを記述したファ
     3276イルを用意している(kernel/kernel_def.csv).
     3277
     3278ターゲットに依存して必要となるシンボルがある場合には,targetディレクト
     3279リに置かれたtarget_def.csv中に記述する.target_def.csv中に記述して値を
     3280求めることができるシンボルは,kernel/kernel_int.hおよびそこからインクルー
     3281ドされるファイルで定義されていなければならない.kernel_int.hからは,
     3282target_stddef.h,target_kernel.h,target_config.hを(間接的に)インクルー
     3283ドしているため,これらのファイルおよびそこからインクルードされるファイ
     3284ルで定義されるターゲット依存のシンボルは,target_def.csv中に記述するこ
     3285とができる.
     3286
     3287ここで値を求めたシンボルの値は,コンフィギュレータのパス2およびパス3の
     3288テンプレートファイル中で参照することができる.
     3289
     3290(c) パス2のテンプレートファイル
     3291
     3292コンフィギュレータのパス2は,テンプレートファイルに従って,カーネルの構
     3293成・初期化ファイル(kernel_cfg.c),構成・初期化ヘッダファイル
     3294(kernel_cfg.h)などを生成する.このテンプレートファイルは,ターゲット
     3295非依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット
     3296依存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードす
     3297る形になっている.
     3298
     3299具体的には,targetディレクトリに置かれたtarget.tfで,必要な変数を定義し
     3300た後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)をイ
     3301ンクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用する変
     3302数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,カー
     3303ネルのターゲット依存部で使用する変数定義等を生成する.target.tfから,プ
     3304ロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
     3305
     3306(d) パス3のテンプレートファイル
     3307
     3308コンフィギュレータのパス3は,テンプレートファイルに従って,静的APIの一
     3309般定数式パラメータのチェックを行う.このテンプレートファイルも,ターゲッ
     3310ト非依存部とターゲット依存部に切り分けてあり,ターゲット依存部からター
     3311ゲット非依存部をインクルードする形になっている.
     3312
     3313具体的には,targetディレクトリに置かれたtarget_check.tfで,必要な変数を
     3314定義した後,テンプレートファイルのターゲット非依存部
     3315(kernel/kernel_check.tf)をインクルードする.kernel_check.tfでは,カー
     3316ネルのターゲット非依存部で初期化ブロックに出力した一般定数式パラメータ
     3317のチェックを行う.kernel_check.tfをインクルードした後,target_check.tf
     3318では,ターゲットに依存するチェックを行う.target_check.tfから,プロセッ
     3319サ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
     3320
     3321なお,コンフィギュレータの詳細仕様と設定ファイルの記述方法については,
     3322別途PDFファイルの形で配布している「TOPPERS新世代カーネル用コンフィギュ
     3323レータ仕様」および「TOPPERS新世代カーネル用コンフィギュレータ内蔵マクロ
     3324プロセッサ仕様」を参照すること.
     3325
     33267.2 パス2のテンプレートファイルのターゲット依存部
     3327
     3328以下では,パス2のテンプレートファイルのターゲット依存部を記述する上で必
     3329要な事項について説明する.
     3330
     33317.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
     3332
     3333target.tfからkernel.tfをインクルードする前に,次の変数を定義しておかな
     3334ければならない.
     3335
     3336(7-2-1-1) INTNO_ATTISR_VALID    ATT_ISRで使用できる割込み番号
     3337(7-2-1-2) INHNO_ATTISR_VALID    INTNO_ATTISR_VALIDに対応する割込ハンドラ番号
     3338(7-2-1-3) INHNO_DEFINH_VALID    DEF_INTで使用できる割込みハンドラ番号
     3339(7-2-1-4) EXCNO_DEFEXC_VALID    DEF_EXCで使用できるCPU例外ハンドラ番号
     3340(7-2-1-5) INTNO_CFGINT_VALID    CFG_INTで使用できる割込み番号
     3341(7-2-1-6) INTPRI_CFGINT_VALID   CFG_INTで使用できる割込み優先度
     3342
     3343APIで使用できる割込み番号/割込みハンドラ番号/CPU例外ハンドラ番号/割
     3344込み優先度のリストを,各変数に定義する.INHNO_ATTISR_VALIDには,
     3345INTNO_ATTISR_VALIDにリストアップした割込み番号に対応する割込みハンドラ
     3346番号のリストを定義する.CFG_INTには,すべての割込み番号を指定することが
     3347できるため,INTNO_CFGINT_VALIDには,有効な割込み番号をすべてリストアッ
     3348プする.
     3349
     3350(7-2-1-7) INTNO_FIX_KERNEL(オプション)       カーネル管理に固定されている
     3351                                                                                        割込み番号
     3352(7-2-1-8) INHNO_FIX_KERNEL(オプション)       カーネル管理に固定されている
     3353                                                                                        割込みハンドラ番号
     3354(7-2-1-9) INHNO_FIX_NONKERNEL(オプション)    カーネル管理外に固定されている
     3355                                                                                        割込み番号
     3356(7-2-1-10) INHNO_FIX_NONKERNEL(オプション)カーネル管理外に固定されている
     3357                                                                                        割込みハンドラ番号
     3358
     3359カーネル管理またはカーネル管理外に固定されている割込みがある場合には,
     3360それらの割込み番号と割込みハンドラ番号のリストを,各変数に定義する.
     3361
     3362(7-2-1-11) USE_INHINIB_TABLE(オプション)
     3363
     3364OMIT_INITIALIZE_INTERRUPTを定義したが,割込みハンドラの初期化に必要な情
     3365報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的には,
     3366TNUM_INHNO,tnum_inhno,inhinib_tableの定義と,割込みハンドラ毎の出入口
     3367処理を生成するための記述(INTHDR_ENTRYマクロのリスト)が,ターゲット非
     3368依存部によって生成される.
     3369
     3370(7-2-1-12) USE_INTINIB_TABLE(オプション)
     3371
     3372OMIT_INITIALIZE_INTERRUPTを定義したが,割込み要求ラインの初期化に必要な
     3373情報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的に
     3374は,TNUM_INTNO,tnum_intno,intinib_tableの定義が,ターゲット非依存部に
     3375よって生成される.
     3376
     3377(7-2-1-13) GENERATE_TSKINICTXB(オプション)
     3378
     3379USE_TSKINICTXBをマクロ定義した場合,TSKINICTXBの初期化情報を生成するた
     3380めテンプレートファイル関数GENERATE_TSKINICTXBを定義する.
     3381GENERATE_TSKINICTXBには,タスクIDがパラメータとして渡される.
     3382
     3383(7-2-1-14) ALLOC_STACK(オプション)
     3384
     3385スタック領域の生成方法をデフォルトから変更したい場合には,スタック領域
     3386を生成するためのテンプレートファイル関数ALLOC_STACKを定義する.
     3387ALLOC_STACKには,スタック領域の変数名と丸める前のサイズがパラメータとし
     3388て渡されるので,スタック領域を生成するコードを生成し,大きい方に丸めた
     3389サイズを表す文字列を返す.
     3390
     33917.2.2 ターゲット非依存部で定義される変数
     3392
     3393kernel.tfの中では次の変数が定義されるため,kernel.tfをインクルードした
     3394後,target.tfの中でこれらを参照することができる.
     3395
     3396(7-2-2-1) INTNO[inhno]          inhnoを対応するintnoに変換するための連想配列
     3397(7-2-2-2) INHNO[intno]          intnoを対応するinhnoに変換するための連想配列
     3398
     33997.3 パス3のテンプレートファイルのターゲット依存部
     3400
     3401以下では,パス3のテンプレートファイルのターゲット依存部を記述する上で必
     3402要な事項について説明する.
     3403
     34047.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
     3405
     3406target_check.tfからkernel_check.tfをインクルードする前に,必要に応じて,
     3407次の変数を定義しておかなければならない.
     3408
     3409(7-3-1-1) GET_STK_TSKINICTXB(オプション)
     3410
     3411USE_TSKINICTXBをマクロ定義した場合,TINIBからスタック領域の先頭番地を取
     3412り出すためのテンプレートファイル関数GET_STK_TSKINICTXBを定義する.
     3413GET_STK_TSKINICTXBには,タスク初期化ブロック(TINIB)の先頭番地がパラメー
     3414タとして渡される.CHECK_STACK_ALIGN,CHECK_STACK_NONNULLとも定義しない
     3415場合には,GET_STK_TSKINICTXBを定義する必要はない.
     3416
     3417(7-3-1-2) LMA.ORDER_LIST(オプション)
     3418(7-3-1-3) LMA.START_DATA[lmano](オプション)
     3419(7-3-1-4) LMA.END_DATA[lmano](オプション)
     3420(7-3-1-5) LMA.START_IDATA[lmano](オプション)
     3421
     3422パス3のテンプレートファイルのターゲット依存部でdataセクションからデータ
     3423を取得する場合や,rodataセクションをRAMに置く場合(ユーザーズマニュアル
     3424の「11.8 rodataセクションをRAMに置く場合」の節を参照)には,これらのセ
     3425クションの内容を,配置アドレス(ROM内のアドレス,LMAと呼ぶ)からアクセ
     3426スアドレス(RAM内のアドレス,VMAと呼ぶ)にコピーする必要がある.
     3427
     3428このコピーは,LMA.ORDER_LISTに,コピーするセクションの番号(lmano)のリ
     3429スト(番号は任意に付与してよい),LMA.START_DATA[lmano]にコピーするセク
     3430ションのアクセスアドレスの先頭のラベル,LMA.END_DATA[lmano]に末尾のラベ
     3431ル,LMA.START_IDATA[lmano]にその配置アドレスの先頭のラベルを設定するこ
     3432とで,パス3のテンプレートファイルのターゲット非依存部で実施する.
     3433
     3434例えば,コピーするセクションのアクセスアドレスの先頭のラベルが
     3435"__data_start",末尾のラベルが"__data_end",その配置アドレスの先頭のラ
     3436ベルが"__idata_start"の場合には,パス3のテンプレートファイルのターゲッ
     3437ト依存部に以下の記述を含める.
    42703438
    42713439----------------------------------------
     
    42773445
    42783446
    4279 7.3.2 ターゲット依存部で行うべきエラーチェック
    4280 
    4281 ä»¥ä¸‹ã®å
    4282 ˆé ­ç•ªåœ°ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§ç”Ÿæˆã™ã‚‹ãƒ†ãƒ¼ãƒ–ルに出力されないた
    4283 ã‚ï¼Œãƒ‘ス3のターゲット非依存部(kernel_check.tf)では,プログラムの開始
    4284 ç•ªåœ°ã¨ã—て正しくない場合のエラーをチェックしない.そのため,ターゲット
    4285 ä¾å­˜éƒ¨ã§ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯ã‚’行うå¿
    4286 è¦ãŒã‚る.
    4287 
    4288 ãƒ»å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンのå
    4289 ˆé ­ç•ªåœ°ï¼ˆATT_ISRのisr)
    4290 ãƒ»å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®å
    4291 ˆé ­ç•ªåœ°ï¼ˆDEF_INHのinthdr)
    4292 ãƒ»CPU例外ハンドラのå
    4293 ˆé ­ç•ªåœ°ï¼ˆDEF_EXCのexchdr)
    4294 ãƒ»åˆæœŸåŒ–ルーチンのå
    4295 ˆé ­ç•ªåœ°ï¼ˆATT_INIのinirtn)
    4296 ãƒ»çµ‚了処理ルーチンのå
    4297 ˆé ­ç•ªåœ°ï¼ˆATT_TERのterrtn)
    4298 
    4299 ãŸã ã—,ターゲット依存部においても,これらのエラーチェックを行えるとは
    4300 é™ã‚‰ãªã„ため,ユーザーズマニュアルの「1.5 既知の問題」の節には,ターゲッ
    4301 ãƒˆä¾å­˜ã§ã“れらのエラーが検出されないことがある旨を記載してある.
    4302 
    4303 7.4 cfg1_out.cのリンクにå¿
    4304 è¦ãªã‚¹ã‚¿ãƒ–の定義ファイル
    4305 
    4306 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«é–¢ã—てターゲット依存に用意するå¿
    4307 è¦ãŒã‚るファイルと
    4308 ã—て,設定ファイル以外に,cfg1_out.cをリンクするためにå¿
    4309 è¦ãªã‚¹ã‚¿ãƒ–の定
    4310 ç¾©ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚る.
    4311 
    4312 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス1では,静的APIの整数定数式パラメータの値をCコン
    4313 ãƒ‘イラを用いて求めるために,cfg1_out.cを生成する.これをコンパイル,リ
    4314 ãƒ³ã‚¯ã—てオブジェクトファイルを生成する際に,スタートアップモジュールか
    4315 ã‚‰å‚ç
    4316 §ã•ã‚Œã‚‹ã‚·ãƒ³ãƒœãƒ«ã®å®šç¾©ã‚’与えるå¿
    4317 è¦ãŒã‚る.
    4318 
    4319 ã“の定義を与えるために,cfg1_out.cから,ターゲット依存部の
    4320 target_cfg1_out.hをインクルードしている.target_cfg1_out.h(または,そ
    4321 ã“からインクルードされるファイル)には,スタートアップモジュールから参
    4322 ç
    4323 §ã•ã‚Œã‚‹ã‚·ãƒ³ãƒœãƒ«ã®ã‚¹ã‚¿ãƒ–の定義を含める.å
    4324 ¸åž‹çš„には,以下のような定義を
    4325 å«ã‚ã‚‹å¿
    4326 è¦ãŒã‚る.
     34477.3.2 ターゲット依存部で行うべきエラーチェック
     3448
     3449以下の先頭番地は,ターゲット非依存部で生成するテーブルに出力されないた
     3450め,パス3のターゲット非依存部(kernel_check.tf)では,プログラムの開始
     3451番地として正しくない場合のエラーをチェックしない.そのため,ターゲット
     3452依存部でエラーチェックを行う必要がある.
     3453
     3454・割込みサービスルーチンの先頭番地(ATT_ISRのisr)
     3455・割込みハンドラの先頭番地(DEF_INHのinthdr)
     3456・CPU例外ハンドラの先頭番地(DEF_EXCのexchdr)
     3457・初期化ルーチンの先頭番地(ATT_INIのinirtn)
     3458・終了処理ルーチンの先頭番地(ATT_TERのterrtn)
     3459
     3460ただし,ターゲット依存部においても,これらのエラーチェックを行えるとは
     3461限らないため,ユーザーズマニュアルの「1.5 既知の問題」の節には,ターゲッ
     3462ト依存でこれらのエラーが検出されないことがある旨を記載してある.
     3463
     34647.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
     3465
     3466コンフィギュレータに関してターゲット依存に用意する必要があるファイルと
     3467して,設定ファイル以外に,cfg1_out.cをリンクするために必要なスタブの定
     3468義ファイルがある.
     3469
     3470コンフィギュレータのパス1では,静的APIの整数定数式パラメータの値をCコン
     3471パイラを用いて求めるために,cfg1_out.cを生成する.これをコンパイル,リ
     3472ンクしてオブジェクトファイルを生成する際に,スタートアップモジュールか
     3473ら参照されるシンボルの定義を与える必要がある.
     3474
     3475この定義を与えるために,cfg1_out.cから,ターゲット依存部の
     3476target_cfg1_out.hをインクルードしている.target_cfg1_out.h(または,そ
     3477こからインクルードされるファイル)には,スタートアップモジュールから参
     3478照されるシンボルのスタブの定義を含める.典型的には,以下のような定義を
     3479含める必要がある.
    43273480
    43283481----------------------------------------
     
    43443497----------------------------------------
    43453498
    4346 ã¾ãŸï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’用いてオフセットファイル(offset.h)を生成す
    4347 ã‚‹å ´åˆã«ã¯ï¼Œãã®ãŸã‚ã®è¨˜è¿°ã‚’target_cfg1_out.h(または,そこからインクルー
    4348 ãƒ‰ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ï¼‰ã«è¿½åŠ ã™ã‚‹å¿
    4349 è¦ãŒã‚る.詳しくは,「2.5.1 コンフィギュ
    4350 ãƒ¬ãƒ¼ã‚¿ã‚’用いる方法」の節を参ç
    4351 §ã™ã‚‹ã“と.
    4352 
    4353 
    4354 ï¼˜ï¼Žã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“ス等のターゲット依存部
    4355 
    4356 8.0 システムサービスのターゲット依存部
    4357 
    4358 ã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆæ•°ã‚„システムログタスク関連の定数など,システムサービスの
    4359 æ§‹æˆã‚’決定するための定義をtarget_syssvc.hまたはそこからインクルードされ
    4360 ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆãƒ—ロセッサ・チップ・開発環境依存部で用意されるヘッダファイ
    4361 ãƒ«ãªã©ï¼‰ã«å«ã‚ã‚‹ï¼Ž
    4362 
    4363 ãªãŠï¼ŒTOPPERS組込みコンポーネントシステムが導å
    4364 ¥ã•ã‚Œã‚‹ã¨ï¼Œã“のファイルの
    4365 å†
    4366 å®¹ã¯ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆè¨˜è¿°ãƒ•ã‚¡ã‚¤ãƒ«ã«è¨˜è¿°ã•ã‚Œã‚‹ã“とになり,このファイルは
    4367 ç„¡ããªã‚‹ï¼ˆã¾ãŸã¯ï¼Œå¤§å¹
    4368 ã«ç¸®å°ã•ã‚Œã‚‹ï¼‰è¦‹è¾¼ã¿ã§ã‚る.
    4369 
    4370 8.1 システムログ機能のターゲット依存定義
    4371 
    4372 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‚’使用する場合で,スタートアップモジュールでbssセクショ
    4373 ãƒ³ã®ã‚¯ãƒªã‚¢ã‚’省略している場合には,syslog_logmaskとsyslog_lowmask_notを
    4374 0に初期化するコードを追加する.これは,システムログ機能が初期化される前
    4375 ã«å‡ºåŠ›ã•ã‚ŒãŸãƒ­ã‚°æƒ
    4376 å ±ã‚’,低レベル出力機能を用いて出力するためである.
    4377 
    4378 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§æä¾›ã™ã¹ãã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®ãŸã‚ã®å®šç¾©ã¯æ¬¡ã®é€šã‚Šã§ã‚
    4379 ã‚‹ï¼Ž
     3499また,コンフィギュレータを用いてオフセットファイル(offset.h)を生成す
     3500る場合には,そのための記述をtarget_cfg1_out.h(または,そこからインクルー
     3501ドされるファイル)に追加する必要がある.詳しくは,「2.5.1 コンフィギュ
     3502レータを用いる方法」の節を参照すること.
     3503
     3504
     35058.システムサービス等のターゲット依存部
     3506
     35078.0 システムサービスのターゲット依存部
     3508
     3509シリアルポート数やシステムログタスク関連の定数など,システムサービスの
     3510構成を決定するための定義をtarget_syssvc.hまたはそこからインクルードされ
     3511るファイル(プロセッサ・チップ・開発環境依存部で用意されるヘッダファイ
     3512ルなど)に含める.
     3513
     3514なお,TOPPERS組込みコンポーネントシステムが導入されると,このファイルの
     3515内容はコンポーネント記述ファイルに記述されることになり,このファイルは
     3516無くなる(または,大幅に縮小される)見込みである.
     3517
     35188.1 システムログ機能のターゲット依存定義
     3519
     3520システムログ機能を使用する場合で,スタートアップモジュールでbssセクショ
     3521ンのクリアを省略している場合には,syslog_logmaskとsyslog_lowmask_notを
     35220に初期化するコードを追加する.これは,システムログ機能が初期化される前
     3523に出力されたログ情報を,低レベル出力機能を用いて出力するためである.
     3524
     3525ターゲット依存部で提供すべきシステムログ機能のための定義は次の通りであ
     3526る.
    43803527
    43813528(8-1-1) TCNT_SYSLOG_BUFFER
    43823529
    4383 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®ãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’定義するマクロ.定義しない場合
    4384 ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã¯32.
     3530システムログ機能のログバッファのサイズを定義するマクロ.定義しない場合
     3531のデフォルト値は32.
    43853532
    43863533(8-1-2) void target_fput_log(char c)
    43873534
    4388 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã®ä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›ã®ãŸã‚ã®æ–‡å­—出力関数.ターゲット依存の方法で,
    4389 æ–‡å­—cを表示/出力/保存する.
    4390 
    4391 ã“の関数は,リエントラントに実è£
    4392 ã—なければならない.この関数å†
    4393 ã§æŽ’他制
    4394 å¾¡ãŒå¿
    4395 è¦ãªå ´åˆã«ã¯ï¼ŒSILを用いてå
    4396 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    4397 ‹ã«ã™ã‚‹ã“と.また,å
    4398 ¨å‰²
    4399 è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    4400 ‹ã§å‘¼ã°ã‚Œã‚‹å ´åˆãŒã‚るため,å
    4401 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    4402 ‹ã‹ã‚‰å‘¼ã³å‡ºã™
    4403 ã“とができない関数を呼ばないように実è£
    4404 ã—なければならない.
    4405 
    4406 ä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›ã‚’シリアルポート経由で行う場合で,シリアルインタフェースド
    4407 ãƒ©ã‚¤ãƒã¨ãƒãƒ¼ãƒˆã‚’å
    4408 ±ç”¨ã—ないことが望ましいが,ポート数が足りないためにや
    4409 ã‚€ã‚’えずå
    4410 ±ç”¨ã™ã‚‹å ´åˆã«ã¯ï¼Œä¸¡è€
    4411 ãŒç«¶åˆã—ないように注意がå¿
    4412 è¦ã§ã‚る.å
    4413 ·ä½“
    4414 çš„には,両è€
    4415 ãŒåŒã˜è¨­å®šã§ã‚·ãƒªã‚¢ãƒ«I/Oデバイスを使うようにし,シリアルイン
    4416 ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã®å‹•ä½œä¸­ã«ä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›ãŒè¡Œã‚ã‚Œã¦ã‚‚差し支えないように
    4417 è¨­è¨ˆã™ã‚‹ï¼Žã¾ãŸï¼Œä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›ãŒå‹•ä½œé–‹å§‹å¾Œã«ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤
    4418 ãƒãŒã‚·ãƒªã‚¢ãƒ«I/Oデバイスを初期化すると,文字化けが起こる可能性があるため,
    4419 å
    4420 ±ç”¨ã™ã‚‹ãƒãƒ¼ãƒˆã¯ï¼Œä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½å´ã§åˆæœŸåŒ–し,シリアルインタフェース
    4421 ãƒ‰ãƒ©ã‚¤ãƒã§ã¯åˆæœŸåŒ–しないようにするとよい.
    4422 
    4423 ãªãŠï¼Œã“の関数の本体を,どのファイルに記述するかが問題になる.システム
    4424 ã‚µãƒ¼ãƒ“スのターゲット依存部には,標準では,関数定義を記述するためのファ
    4425 ã‚¤ãƒ«ã‚’用意していない.ターゲット依存で用意してもよいが,例外的に,カー
    4426 ãƒãƒ«å®Ÿè£
    4427 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ï¼ˆtarget_config.c)に記述してもよい.
    4428 ã“の場合,target_fput_logを,リネーム記述(target_rename.defなど)に含
    4429 ã‚ã¦ã¯ãªã‚‰ãªã„.
    4430 
    4431 8.2 ログタスクのターゲット依存定義
    4432 
    4433 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§æä¾›ã™ã¹ããƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®ãŸã‚ã®å®šç¾©ã¯æ¬¡ã®é€šã‚Šã§ã‚る.こ
    4434 ã‚Œã‚‰ã®å®šç¾©ã¯ï¼Œtarget_syssvc.hまたはそこからインクルードされるファイルに
    4435 å«ã‚ã‚‹ï¼Ž
    4436 
    4437 (8-2-1) LOGTASK_PRIORITY(オプション)
    4438 
    4439 ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®å„ªå
    4440 ˆåº¦ã‚’定義するマクロ.定義しない場合のデフォルト値は3.
    4441 
    4442 (8-2-2) LOGTASK_STACK_SIZE(オプション)
    4443 
    4444 ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯ã‚µã‚¤ã‚ºã‚’定義するマクロ.定義しない場合のデフォルト
    4445 å€¤ã¯1024.
    4446 
    4447 (8-2-3) LOGTASK_PORTID(オプション)
    4448 
    4449 ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®å‡ºåŠ›å
    4450 ˆã®ã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆç•ªå·ï¼Žå®šç¾©ã—ない場合のデフォルト値は1.
    4451 
    4452 (8-2-4) LOGTASK_INTERVAL(オプション)
    4453 
    4454 ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®å‹•ä½œé–“隔(単位はミリ秒).定義しない場合のデフォルト値は10.
    4455 
    4456 (8-2-5) LOGTASK_FLUSH_WAIT(オプション)
    4457 
    4458 ãƒ­ã‚°å‡ºåŠ›ã‚’å¾
    4459 ã¡åˆã‚ã›ã‚‹å‡¦ç†ã«ãŠã„て,タスクをå¾
    4460 ãŸã›ã‚‹å˜ä½ã¨ãªã‚‹æ™‚間(単
    4461 ä½ã¯ãƒŸãƒªç§’).定義しない場合のデフォルト値は1.
    4462 
    4463 8.3 シリアルインタフェースドライバのターゲット依存部
    4464 
    4465 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§æä¾›ã™ã¹ãã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã®ãŸã‚ã®å®šç¾©
    4466 ã¯æ¬¡ã®é€šã‚Šã§ã‚る.これらの定義は,別に指定がない限り,target_serial.hま
    4467 ãŸã¯ãã“からインクルードされるファイルに含め,å¿
    4468 è¦ãªã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§
    4469 ãƒ³æƒ
    4470 å ±ã‚’target_serial.cfgに記述する.関数の実体がå¿
    4471 è¦ãªå ´åˆã«ã¯ï¼Œ
    4472 target_serial.c等のファイルを用意する.
    4473 
    4474 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã®ä¸­ã§ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ã‚·ãƒªã‚¢ãƒ«I/Oデバイスに
    4475 ä¾å­˜ã™ã‚‹éƒ¨åˆ†ã‚’,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイス
    4476 ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼ŒãŠãŠã‚ˆãï¼ŒITRONデバイスドライバ設計ガイドラインのPDICに相当
    4477 ã™ã‚‹ï¼ŽPDICに相当するファイルで,他のシステムにもå
    4478 ±é€šã«ä½¿ãˆã‚‹å¯èƒ½æ€§ãŒã‚
    4479 ã‚‹å ´åˆã«ã¯ï¼Œpdicディレクトリに置く.
    4480 
    4481 8.3.1 変数,データ型,管理関数
     3535システムログの低レベル出力のための文字出力関数.ターゲット依存の方法で,
     3536文字cを表示/出力/保存する.
     3537
     3538この関数は,リエントラントに実装しなければならない.この関数内で排他制
     3539御が必要な場合には,SILを用いて全割込みロック状態にすること.また,全割
     3540込みロック状態で呼ばれる場合があるため,全割込みロック状態から呼び出す
     3541ことができない関数を呼ばないように実装しなければならない.
     3542
     3543低レベル出力をシリアルポート経由で行う場合で,シリアルインタフェースド
     3544ライバとポートを共用しないことが望ましいが,ポート数が足りないためにや
     3545むをえず共用する場合には,両者が競合しないように注意が必要である.具体
     3546的には,両者が同じ設定でシリアルI/Oデバイスを使うようにし,シリアルイン
     3547タフェースドライバの動作中に低レベル出力が行われても差し支えないように
     3548設計する.また,低レベル出力が動作開始後にシリアルインタフェースドライ
     3549バがシリアルI/Oデバイスを初期化すると,文字化けが起こる可能性があるため,
     3550共用するポートは,低レベル出力機能側で初期化し,シリアルインタフェース
     3551ドライバでは初期化しないようにするとよい.
     3552
     3553なお,この関数の本体を,どのファイルに記述するかが問題になる.システム
     3554サービスのターゲット依存部には,標準では,関数定義を記述するためのファ
     3555イルを用意していない.ターゲット依存で用意してもよいが,例外的に,カー
     3556ネル実装のターゲット依存モジュール(target_config.c)に記述してもよい.
     3557この場合,target_fput_logを,リネーム記述(target_rename.defなど)に含
     3558めてはならない.
     3559
     35608.2 ログタスクのターゲット依存定義
     3561
     3562ターゲット依存部で提供すべきログタスクのための定義は次の通りである.こ
     3563れらの定義は,target_syssvc.hまたはそこからインクルードされるファイルに
     3564含める.
     3565
     3566(8-2-1) LOGTASK_PRIORITY(オプション)
     3567
     3568ログタスクの優先度を定義するマクロ.定義しない場合のデフォルト値は3.
     3569
     3570(8-2-2) LOGTASK_STACK_SIZE(オプション)
     3571
     3572ログタスクのスタックサイズを定義するマクロ.定義しない場合のデフォルト
     3573値は1024.
     3574
     3575(8-2-3) LOGTASK_PORTID(オプション)
     3576
     3577ログタスクの出力先のシリアルポート番号.定義しない場合のデフォルト値は1.
     3578
     3579(8-2-4) LOGTASK_INTERVAL(オプション)
     3580
     3581ログタスクの動作間隔(単位はミリ秒).定義しない場合のデフォルト値は10.
     3582
     3583(8-2-5) LOGTASK_FLUSH_WAIT(オプション)
     3584
     3585ログ出力を待ち合わせる処理において,タスクを待たせる単位となる時間(単
     3586位はミリ秒).定義しない場合のデフォルト値は1.
     3587
     35888.3 シリアルインタフェースドライバのターゲット依存部
     3589
     3590ターゲット依存部で提供すべきシリアルインタフェースドライバのための定義
     3591は次の通りである.これらの定義は,別に指定がない限り,target_serial.hま
     3592たはそこからインクルードされるファイルに含め,必要なコンフィギュレーショ
     3593ン情報をtarget_serial.cfgに記述する.関数の実体が必要な場合には,
     3594target_serial.c等のファイルを用意する.
     3595
     3596シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイスに
     3597依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイス
     3598ドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに相当
     3599する.PDICに相当するファイルで,他のシステムにも共通に使える可能性があ
     3600る場合には,pdicディレクトリに置く.
     3601
     36028.3.1 変数,データ型,管理関数
    44823603
    44833604(8-3-1-1) TNUM_PORT
    44843605
    4485 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹ã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆæ•°ã‚’定義する
    4486 ãƒžã‚¯ãƒ­ï¼Žã“のマクロの定義は,target_syssvc.hまたはそこからインクルードさ
    4487 ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã‚ã‚‹ï¼Ž
    4488 
    4489 (8-3-1-2) void sio_initialize(intptr_t exinf)(オプション)
    4490 
    4491 ã‚·ãƒªã‚¢ãƒ«I/Oデバイスドライバの初期化処理.target_serial.cfgに,この関数
    4492 ã‚’初期化ルーチンとして登録する静的APIを含める.
    4493 
    4494 (8-3-1-3) void sio_terminate(intptr_t exinf)(オプション)
    4495 
    4496 ã‚·ãƒªã‚¢ãƒ«I/Oデバイスドライバの終了処理.target_serial.cfgに,この関数を
    4497 çµ‚了処理ルーチンとして登録する静的APIを含める.
     3606シリアルインタフェースドライバがサポートするシリアルポート数を定義する
     3607マクロ.このマクロの定義は,target_syssvc.hまたはそこからインクルードさ
     3608れるファイルに含める.
     3609
     3610(8-3-1-2) void sio_initialize(intptr_t exinf)(オプション)
     3611
     3612シリアルI/Oデバイスドライバの初期化処理.target_serial.cfgに,この関数
     3613を初期化ルーチンとして登録する静的APIを含める.
     3614
     3615(8-3-1-3) void sio_terminate(intptr_t exinf)(オプション)
     3616
     3617シリアルI/Oデバイスドライバの終了処理.target_serial.cfgに,この関数を
     3618終了処理ルーチンとして登録する静的APIを含める.
    44983619
    44993620(8-3-1-4) void sio_isr(intptr_t exinf)
    45003621
    4501 ã‚·ãƒªã‚¢ãƒ«I/Oデバイスの割込みサービスルーチン.target_serial.cfgに,この
    4502 é–¢æ•°ã‚’割込みサービスルーチンとして登録する静的APIを含める.また,その静
    4503 çš„APIにå¿
    4504 è¦ãªã‚·ãƒªã‚¢ãƒ«I/Oデバイスの割込み番号などは,target_serial.hでマ
    4505 ã‚¯ãƒ­å®šç¾©ã™ã‚‹ï¼Žå‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンではなく,割込みハンドラとすること
    4506 ã‚‚できる.
     3622シリアルI/Oデバイスの割込みサービスルーチン.target_serial.cfgに,この
     3623関数を割込みサービスルーチンとして登録する静的APIを含める.また,その静
     3624的APIに必要なシリアルI/Oデバイスの割込み番号などは,target_serial.hでマ
     3625クロ定義する.割込みサービスルーチンではなく,割込みハンドラとすること
     3626もできる.
    45073627
    45083628(8-3-1-5) SIOPCB
    45093629
    4510 ã‚·ãƒªã‚¢ãƒ«I/Oポート管理ブロックのデータ型(target_serial.hには,データ型
    4511 ã®å®£è¨€ã ã‘含まれていればよい).
    4512 
    4513 (8-3-1-6) SIO_RDY_SNDとSIO_RDY_RCV
    4514 
    4515 é€ä¿¡å¯èƒ½ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã®è­˜åˆ¥ç•ªå·ã‚’SIO_RDY_SNDに,受信通知コールバックの識
    4516 åˆ¥ç•ªå·ã‚’SIO_RDY_RCVにマクロ定義する.コールバックの禁止/許可を行なうサー
    4517 ãƒ“スコール(sio_ena_cbrとsio_dis_cbr)で用いる.
    4518 
    4519 8.3.2 デバイスサービスルーチン
    4520 
    4521 ä»¥ä¸‹ã®ãƒ‡ãƒã‚¤ã‚¹ã‚µãƒ¼ãƒ“ルルーチンは,(少なくとも)シリアルI/Oポートからの
    4522 å‰²è¾¼ã¿ãŒãƒžã‚¹ã‚¯ã•ã‚ŒãŸçŠ¶æ
    4523 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆï¼Œéžã‚¿
    4524 ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ã„ずれで呼び出される場合もある(いずれで呼び出されて
    4525 ã‚‚動作するようにしなければならない).
     3630シリアルI/Oポート管理ブロックのデータ型(target_serial.hには,データ型
     3631の宣言だけ含まれていればよい).
     3632
     3633(8-3-1-6) SIO_RDY_SNDとSIO_RDY_RCV
     3634
     3635送信可能コールバックの識別番号をSIO_RDY_SNDに,受信通知コールバックの識
     3636別番号をSIO_RDY_RCVにマクロ定義する.コールバックの禁止/許可を行なうサー
     3637ビスコール(sio_ena_cbrとsio_dis_cbr)で用いる.
     3638
     36398.3.2 デバイスサービスルーチン
     3640
     3641以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートからの
     3642割込みがマスクされた状態で呼び出される.また,タスクコンテキスト,非タ
     3643スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて
     3644も動作するようにしなければならない).
    45263645
    45273646(8-3-2-1) SIOPCB *sio_opn_por(ID siopid, intptr_t exinf)
    45283647
    4529 siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル
    4530 I/Oポートに対する拡張æƒ
    4531 å ±ã§ï¼Œã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’呼ぶ時にポートを区別するた
    4532 ã‚ã«æ¸¡ã™ï¼Ž
     3648siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル
     3649I/Oポートに対する拡張情報で,コールバックを呼ぶ時にポートを区別するた
     3650めに渡す.
    45333651
    45343652(8-3-2-2) void sio_cls_por(SIOPCB *siopcb)
    45353653
    4536 siopcbで指定されるシリアルI/Oポートをクローズする関数.
     3654siopcbで指定されるシリアルI/Oポートをクローズする関数.
    45373655
    45383656(8-3-2-3) bool_t sio_snd_chr(SIOPCB *siopcb, char c)
    45393657
    4540 siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数.
    4541 æ–‡å­—を送信レジスタにå
    4542 ¥ã‚ŒãŸå ´åˆã«ã¯trueを,前に送信した文字の送信が終わっ
    4543 ã¦ã„ないために,文字を送信レジスタにå
    4544 ¥ã‚Œã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã«ã¯falseを返す.
     3658siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数.
     3659文字を送信レジスタに入れた場合にはtrueを,前に送信した文字の送信が終わっ
     3660ていないために,文字を送信レジスタに入れられなかった場合にはfalseを返す.
    45453661
    45463662(8-3-2-4) int_t sio_rcv_chr(SIOPCB *siopcb)
    45473663
    4548 siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信してい
    4549 ãŸå ´åˆï¼Œèª­ã‚“だ文字のコードは正の値として返し,文字を受信していない場合
    4550 ã«ã¯-1を返す.
     3664siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信してい
     3665た場合,読んだ文字のコードは正の値として返し,文字を受信していない場合
     3666には-1を返す.
    45513667
    45523668(8-3-2-5) void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
    45533669
    4554 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
    4555 ã‚¯ã‚’許可する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
     3670siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
     3671クを許可する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
    45563672
    45573673(8-3-2-6) void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
    45583674
    4559 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
    4560 ã‚¯ã‚’禁止する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
    4561 
    4562 8.3.3 コールバックルーチン
    4563 
    4564 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼Œå¿
    4565 è¦ãªã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ï¼Œã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒ
    4566 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã«å«ã¾ã‚Œã‚‹ä»¥ä¸‹ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ«ãƒ¼ãƒãƒ³ã‚’呼び出びださ
    4567 ãªã‘ればならない.ただし,それぞれのコールバックが禁止されている時は,
    4568 ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ«ãƒ¼ãƒãƒ³ã‚’呼び出してはならない.
    4569 
    4570 ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ«ãƒ¼ãƒãƒ³ã¯ï¼Œï¼ˆå°‘なくとも)シリアルI/Oポートからの割込みが禁
    4571 æ­¢ã•ã‚ŒãŸçŠ¶æ
    4572 ‹ã§ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§å‘¼ã³å‡ºã™ï¼Žexinfには,シリアルI/O
    4573 ãƒãƒ¼ãƒˆã®ã‚ªãƒ¼ãƒ—ン時に指定された拡張æƒ
    4574 å ±ã‚’渡す.
     3675siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
     3676クを禁止する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
     3677
     36788.3.3 コールバックルーチン
     3679
     3680ターゲット依存部は,必要なタイミングで,シリアルインタフェースドライバ
     3681のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ
     3682なければならない.ただし,それぞれのコールバックが禁止されている時は,
     3683コールバックルーチンを呼び出してはならない.
     3684
     3685コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが禁
     3686止された状態で,非タスクコンテキストで呼び出す.exinfには,シリアルI/O
     3687ポートのオープン時に指定された拡張情報を渡す.
    45753688
    45763689(8-3-3-1) void sio_irdy_snd(intptr_t exinf)
    45773690
    4578 é€ä¿¡å¯èƒ½ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ«ãƒ¼ãƒãƒ³ï¼Žã‚·ãƒªã‚¢ãƒ«I/Oポートに対して文字が送信できる
    4579 çŠ¶æ
    4580 ‹ã«ãªã£ãŸå ´åˆã«å‘¼ã³å‡ºã™ï¼Žã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã“のコー
    4581 ãƒ«ãƒãƒƒã‚¯ãƒ«ãƒ¼ãƒãƒ³ã®ä¸­ã§ï¼Œsio_snd_chrを呼び出して次の文字を送信するか,送
    4582 ä¿¡ã™ã¹ãæ–‡å­—がない場合には送信可能コールバックを禁止する.
     3691送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信できる
     3692状態になった場合に呼び出す.シリアルインタフェースドライバは,このコー
     3693ルバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか,送
     3694信すべき文字がない場合には送信可能コールバックを禁止する.
    45833695
    45843696(8-3-3-2) void sio_irdy_rcv(intptr_t exinf)
    45853697
    4586 å—信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合に
    4587 å‘¼ã³å‡ºã™ï¼Žã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã“のコールバックルーチンの
    4588 ä¸­ã§ï¼Œå¿
    4589 ãšsio_rcv_chrを呼び出して受信した文字を取り出す.
    4590 
    4591 8.4 カーネル起動メッセージの出力のターゲット依存定義
    4592 
    4593 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§æä¾›ã™ã¹ãã‚«ãƒ¼ãƒãƒ«èµ·å‹•ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡ºåŠ›ã®ãŸã‚ã®å®šç¾©ã¯
    4594 æ¬¡ã®é€šã‚Šã§ã‚る.
     3698受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合に
     3699呼び出す.シリアルインタフェースドライバは,このコールバックルーチンの
     3700中で,必ずsio_rcv_chrを呼び出して受信した文字を取り出す.
     3701
     37028.4 カーネル起動メッセージの出力のターゲット依存定義
     3703
     3704ターゲット依存部で提供すべきカーネル起動メッセージの出力のための定義は
     3705次の通りである.
    45953706
    45963707(8-4-1) TARGET_NAME
    45973708
    4598 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®åç§°ã«å®šç¾©ã™ã‚‹ï¼Ž
    4599 
    4600 (8-4-2) TARGET_COPYRIGHT(オプション)
    4601 
    4602 ã‚«ãƒ¼ãƒãƒ«èµ·å‹•ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è‘—作権表示を追加するための
    4603 ãƒžã‚¯ãƒ­ï¼Žãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è‘—作権表示を追加しない.
    4604 
    4605 8.5 サンプルプログラムとテストプログラムのターゲット依存定義
    4606 
    4607 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§æä¾›ã™ã¹ãã‚µãƒ³ãƒ—ルプログラムおよびテストプログラムの
    4608 ãŸã‚ã®å®šç¾©ã¯æ¬¡ã®é€šã‚Šã§ã‚る.これらの定義は,target_test.h(またはそれら
    4609 ã‹ã‚‰ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ï¼‰ã«å«ã‚ã‚‹ï¼Ž
    4610 
    4611 (8-5-1) STACK_SIZE(オプション)
    4612 
    4613 ã‚µãƒ³ãƒ—ルプログラムおよびテストプログラムのタスクのスタックサイズを定義
    4614 ã™ã‚‹ãƒžã‚¯ãƒ­ï¼Žå®šç¾©ã—ない場合のデフォルト値は4096.デフォルト設定ではメモ
    4615 ãƒªãŒä¸è¶³ã™ã‚‹å ´åˆã‚„,シミュレーション環境などで大きいスタック領域がå¿
    4616 è¦
    4617 ãªå ´åˆã«ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§ã“のマクロを設定するスタックサイズに定義
    4618 ã™ã‚‹ï¼Ž
    4619 
    4620 (8-5-2) CPUEXC1(オプション)
    4621 
    4622 ã‚µãƒ³ãƒ—ルプログラムおよびテストプログラムで用いるCPU例外のCPU例外ハンド
    4623 ãƒ©ç•ªå·ã‚’定義するマクロ.このマクロを定義しない場合,CPU例外ハンドラを使
    4624 ã†éƒ¨åˆ†ãŒã‚µãƒ³ãƒ—ルプログラムから除外される.CPU例外ハンドラのテストをする
    4625 ãƒ†ã‚¹ãƒˆãƒ—ログラムはコンパイルできない.
    4626 
    4627 (8-5-3) RAISE_CPU_EXCEPTION(オプション)
    4628 
    4629 CPUEXC1に定義したCPU例外を発生させるC言語のプログラムを定義するマクロ.
    4630 CPUEXC1を定義した場合にはå¿
    4631 ãšå®šç¾©ã—なければならない.
    4632 
    4633 (8-5-4) CANNOT_RETURN_CPUEXC(オプション)
    4634 
    4635 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚·ã‚¹ãƒ†ãƒ ã®åˆ¶ç´„により,CPU例外ハンドラからリターンした後に,タ
    4636 ã‚¹ã‚¯ã®å®Ÿè¡Œã‚’継続できない場合に定義するマクロ.このマクロを定義すると,
    4637 CPU例外ハンドラのテストをするテストプログラムから,CPU例外ハンドラから
    4638 ãƒªã‚¿ãƒ¼ãƒ³ã—た後の処理が除外される.サンプルプログラムの該当部分は正しく
    4639 å‹•ä½œã—ない.
    4640 
    4641 (8-5-5) TASK_PORTID(オプション)
    4642 
    4643 ã‚µãƒ³ãƒ—ルプログラムにおいて,コマンド文字を読み込むシリアルポート番号を
    4644 å®šç¾©ã™ã‚‹ãƒžã‚¯ãƒ­ï¼Žå®šç¾©ã—ない場合のデフォルト値は1.
    4645 
    4646 (8-5-6) LOOP_REF(オプション)
    4647 
    4648 ã‚µãƒ³ãƒ—ルプログラムにおいて,プロセッサの速度を計測するためのループ回数
    4649 ã‚’定義するマクロ.定義しない場合のデフォルト値は1000000.デフォルト設定
    4650 ã§ã¯ï¼Œå€¤ãŒå¤§ãéŽãŽã¦è¨ˆæ¸¬ã«æ™‚間がかかりすぎる場合や,値が小さ過ぎて計測
    4651 çµæžœãŒå®‰å®šã—ない場合に,ターゲット依存部でこのマクロを設定するループ回
    4652 æ•°ã«å®šç¾©ã™ã‚‹ï¼Ž
    4653 
    4654 (8-5-7) MEASURE_TWICE(オプション)
    4655 
    4656 ã‚µãƒ³ãƒ—ルプログラムにおいて,プロセッサの速度を2度計測する場合に定義する
    4657 ãƒžã‚¯ãƒ­ï¼Žã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ç’°å¢ƒãªã©ãƒ—ロセッサの速度が変動する環境で,1度の
    4658 è¨ˆæ¸¬ã§ã¯è¨ˆæ¸¬çµæžœãŒå®‰å®šã—ない場合に定義する.
    4659 
    4660 (8-5-8) TASK_LOOP(オプション)
    4661 
    4662 ã‚µãƒ³ãƒ—ルプログラムにおいて,プロセッサの速度を計測せずに,タスクå†
    4663 ã§ã®
    4664 ãƒ«ãƒ¼ãƒ—回数を固定する場合に,ループ回数を定義するマクロ.ループå
    4665 ¨ä½“の実
    4666 è¡Œæ™‚間が0.4秒程度になるようなループ回数を,このマクロに定義する.
    4667 
    4668 8.6 実行時間分布集計モジュールのターゲット依存定義
    4669 
    4670 å®Ÿè¡Œæ™‚間分布集計モジュールの設定をターゲット依存部で変更する場合に,ター
    4671 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§æä¾›ã™ã¹ãå®Ÿè¡Œæ™‚間分布集計モジュールのための定義は次の通
    4672 ã‚Šã§ã‚る.これらの定義は,target_test.h(またはそこからインクルードされ
    4673 ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ï¼‰ã«å«ã‚ã‚‹ï¼Žã“の他に,ターゲット依存でå¿
    4674 è¦ãªåˆæœŸåŒ–処理がある
    4675 å ´åˆã«ã‚‚,ターゲット依存部に含める.
    4676 
    4677 (8-6-1) HISTTIM(オプション)
    4678 
    4679 å®Ÿè¡Œæ™‚間計測用の時刻のデータ型を定義するマクロ.定義しない場合のデフォ
    4680 ãƒ«ãƒˆã¯SYSUTM.
    4681 
    4682 (8-6-2) void HIST_GET_TIM(HISTTIM *p_time)(オプション)
    4683 
    4684 å®Ÿè¡Œæ™‚間計測用の現在時刻を*p_timeに取得する処理に定義するマクロ.定義し
    4685 ãªã„場合のデフォルトはget_utm.
    4686 
    4687 (8-6-3) uint_t HIST_CONV_TIM(HISTTIM time)(オプション)
    4688 
    4689 å®Ÿè¡Œæ™‚間計測用の時刻の差(時間)を,実行時間分布集計用の値に変換する処
    4690 ç†ã«å®šç¾©ã™ã‚‹ãƒžã‚¯ãƒ­ï¼Žæ™‚刻が過去に戻ったかオーバフローしたかの区別がつか
    4691 ãªã„場合には,最上位ビットが1の値(INT_MAXよりも大きい値)を返す.定義
    4692 ã—ない場合のデフォルトは,timeをuint_tにキャストする処理.
    4693 
    4694 (8-6-4) void HIST_BM_HOOK(void)(オプション)
    4695 
    4696 å®Ÿè¡Œæ™‚間計測直前に行うべき処理に定義するマクロ.キャッシュのパージやフィ
    4697 ãƒ«ï¼Œãƒ¡ãƒ¢ãƒªãƒãƒªã‚¢å‡¦ç†ç­‰ã‚’行いたい場合には,このマクロに定義する.定義し
    4698 ãªã„場合のデフォルトは,空の処理になる.
    4699 
    4700 
    4701 ï¼™ï¼Žãã®ä»–
    4702 
    4703 9.1 ドキュメント
    4704 
    4705 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’,target_user.txtに用意する.プ
    4706 ãƒ­ã‚»ãƒƒã‚µãƒ»ãƒãƒƒãƒ—・開発環境依存部のユーザーズマニュアルを切り分けてもよ
    4707 ã„し,ファイルが大きくなる場合には複数のファイルに分割してよいが,その
    4708 å ´åˆã«ã¯ï¼Œtarget_user.txt中にそれらのファイル名を記述すること.
    4709 
    4710 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã«ã¯ï¼Œå°‘なくとも次のようなå†
    4711 å®¹ã‚’
    4712 è¨˜è¿°ã™ã‚‹ã“とが望ましい.
    4713 
    4714 (1) 対応しているターゲットシステムの種類・構成,バージョン番号
    4715         ・ターゲットハードウェア(ボード等)の名称と対応している構成
    4716         ・ターゲット略称
    4717         ・ターゲット非依存部のバージョン番号
    4718         ・プロセッサ,チップ,開発環境依存部の構成とバージョン番号
    4719         ・使用するPDICとバージョン番号
    4720 
    4721 (2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
    4722         ・言語処理系(コンパイラ,アセンブラ,リンカ等)
    4723         ・デバッグ環境
    4724 
    4725 (3) ターゲット定義事é 
    4726 ã®è¦å®š
    4727 
    4728 (3-1) データ型に関する規定
    4729         ・int_t型,long_t型のサイズ
    4730         ・char型,int_least8_t型,void *型,intptr_t型のサイズ
    4731         ・int8_t型,uint8_t型,int64_t型,uint64_t型,int128_t型,
    4732          uint128_t型,float32_t型,double64_t型のサポートの有無
    4733 
    4734 (3-2) 割込み処理に関する規定
    4735         ・割込みハンドラ番号と割込み番号の割当て,両è€
    4736 ã®å¯¾å¿œ
    4737         ・割込み優å
    4738 ˆåº¦ã®æ®µéšŽæ•°ï¼ˆTMIN_INTPRIの値)
    4739         ・dis_intとena_intのサポートの有無,その制限事é 
    4740 
    4741         ・CFG_INTの制限事é 
    4742 ã¨æ‹¡å¼µï¼ˆã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©ã§ä½¿ç”¨ã§ãã‚‹å‰²è¾¼ã¿å±žæ€§ï¼‰
    4743         ・TOPPERS標準割込み処理モデルからのその他の逸脱
    4744         ・デフォルトの割込みハンドラ(default_int_handler)の有無と処理å†
    4745 å®¹
    4746 
    4747 (3-3) カーネル管理外の割込みに関する規定
    4748         ・TMIN_INTPRIは固定か設定できるか,その設定方法
    4749         ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか)
    4750         ・カーネル管理外の割込みの設定方法
    4751         ・カーネル管理外の割込みに対してDEF_INH,CFG_INTをサポートするか
    4752         ・カーネル管理外の割込みハンドラが実行開始される時のシステム状æ
    4753 ‹ã¨
    4754          コンテキスト
    4755         ・割込みハンドラの終了時に行われる処理
    4756         ・カーネル管理外の割込みハンドラの記述方法
    4757         ・カーネルå†
    4758 ã®å‰²è¾¼ã¿å‡ºå
    4759 ¥å£å‡¦ç†ã§èµ·ã“る可能性のあるCPU例外
    4760 
    4761 (3-4) CPU例外処理に関する規定
    4762         ・CPU例外ハンドラ番号の割当て
    4763         ・割込み優å
    4764 ˆåº¦ãƒžã‚¹ã‚¯ã‚’TMIN_INTPRIと同じかそれよりも高い値に設定して
    4765          いる状æ
    4766 ‹ã§ç™ºç”Ÿã—たCPU例外を,カーネル管理外のCPU例外と扱うか
    4767         ・カーネルå†
    4768 ã®CPU例外出å
    4769 ¥å£å‡¦ç†ã§èµ·ã“る可能性のあるCPU例外
    4770         ・デフォルトのCPU例外ハンドラ(default_exc_handler)の有無と処理å†
    4771 å®¹
    4772 
    4773 (3-5) 性能評価用システム時刻の参ç
    4774 §ã«é–¢ã™ã‚‹è¦å®š
    4775         ・get_utmのサポートの有無,その制限事é 
    4776 
    4777 
    4778 (3-6) 拡張パッケージに関する規定
    4779         ・各拡張パッケージのサポートの有無
    4780                 - ミューテックス機能拡張パッケージ
    4781                 - オーバランハンドラ機能拡張パッケージ
    4782                 - タスク優å
    4783 ˆåº¦æ‹¡å¼µãƒ‘ッケージ
    4784                 - 制約タスク拡張パッケージ
    4785                 - 動的生成機能拡張パッケージ
    4786         ・オーバランハンドラ機能拡張パッケージをサポートする場合に,プロセッ
    4787          サ時間に指定できる値の最大値(TMAX_OVRTIMの値)
    4788         ・動的生成機能拡張パッケージをサポートする場合に,動的メモリ管理の
    4789          方法
    4790 
    4791 (3-7) その他
    4792         ・その他の制限事é 
    4793 
    4794         ・その他の拡張機能
    4795 
    4796 (4) カーネルの起動/終了処理に関するæƒ
    4797 å ±
    4798         ・用意しているスタートアップモジュールの処理å†
    4799 å®¹
    4800         ・スタートアップモジュールからhardware_init_hookを呼び出している場
    4801          合には,hardware_init_hookをアプリケーションで用意する場合の作成
    4802          方法や制限事é 
    4803 ãªã©
    4804         ・カーネルを終了した後の振舞い
    4805 
    4806 (5) メモリマップ
    4807         ・デフォルトのメモリマップ,その変更方法
    4808 
    4809 (6) タイマドライバ関連のæƒ
    4810 å ±
    4811         ・タイムティックの周期,その変更方法
    4812         ・使用するリソース(タイマ)
    4813         ・タイマ割込みの割込み優å
    4814 ˆåº¦ã®å¤‰æ›´æ–¹æ³•
    4815         ・オーバランタイマ割込みの割込み優å
    4816 ˆåº¦ã®å¤‰æ›´æ–¹æ³•
    4817 
    4818 (7) シリアルインタフェースドライバのæƒ
    4819 å ±
    4820         ・使用するリソース(SIOコントローラ)
    4821         ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
    4822 
    4823 (8) システムログ機能のæƒ
    4824 å ±
    4825         ・システムログの低レベル出力の実現方法
    4826         ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
    4827 
    4828 (9) システム構築手順
    4829 
    4830 (10) ターゲットシステム固有の注意事é 
    4831 
    4832         ・タスクコンテキストに含まれるレジスタ,含まれないレジスタ
    4833 
    4834 (11) 類似のターゲットにポーティングする開発è€
    4835 å‘けの参考æƒ
    4836 å ±
    4837 
    4838 (12) ディレクトリ構成・ファイル構成
    4839 
    4840 (13) バージョン履歴
    4841 
    4842 ã¾ãŸï¼Œå¿
    4843 è¦ã«å¿œã˜ã¦ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¨­è¨ˆãƒ¡ãƒ¢ã‚’,target_design.txtに用
    4844 æ„ã™ã‚‹ï¼Žãƒ—ロセッサ・チップ・開発環境依存部に関する設計メモを切り分けて
    4845 ã‚‚よいし,ファイルが大きくなる場合には複数のファイルに分割してもよいが,
    4846 ãã®å ´åˆã«ã¯ï¼Œtarget_design.txt中にそれらのファイル名を記述すること.
    4847 
    4848 9.2 パッケージ記述ファイル
    4849 
    4850 ãƒªãƒªãƒ¼ã‚¹ãƒ‘ッケージ(個別パッケージおよび簡易パッケージ)を作成するため
    4851 ã«ï¼Œãƒ‘ッケージに含めるファイルを記述したパッケージ記述ファイルを用意す
    4852 ã‚‹ï¼Žãƒ‘ッケージ記述ファイルの名称は,個別パッケージ用をMANIFEST,簡易パッ
    4853 ã‚±ãƒ¼ã‚¸ç”¨ã‚’E_PACKAGEとする.
    4854 
    4855 ä¾‹ãˆã°ï¼Œarch/arm_gccディレクトリに置かれたMANIFESTファイルを用いて個別
    4856 ãƒ‘ッケージを作成する場合には,次のコマンドを実行する.
     3709ターゲットの名称に定義する.
     3710
     3711(8-4-2) TARGET_COPYRIGHT(オプション)
     3712
     3713カーネル起動メッセージに,ターゲット依存部の著作権表示を追加するための
     3714マクロ.デフォルトでは,ターゲット依存部の著作権表示を追加しない.
     3715
     37168.5 サンプルプログラムとテストプログラムのターゲット依存定義
     3717
     3718ターゲット依存部で提供すべきサンプルプログラムおよびテストプログラムの
     3719ための定義は次の通りである.これらの定義は,target_test.h(またはそれら
     3720からインクルードされるファイル)に含める.
     3721
     3722(8-5-1) STACK_SIZE(オプション)
     3723
     3724サンプルプログラムおよびテストプログラムのタスクのスタックサイズを定義
     3725するマクロ.定義しない場合のデフォルト値は4096.デフォルト設定ではメモ
     3726リが不足する場合や,シミュレーション環境などで大きいスタック領域が必要
     3727な場合には,ターゲット依存部でこのマクロを設定するスタックサイズに定義
     3728する.
     3729
     3730(8-5-2) CPUEXC1(オプション)
     3731
     3732サンプルプログラムおよびテストプログラムで用いるCPU例外のCPU例外ハンド
     3733ラ番号を定義するマクロ.このマクロを定義しない場合,CPU例外ハンドラを使
     3734う部分がサンプルプログラムから除外される.CPU例外ハンドラのテストをする
     3735テストプログラムはコンパイルできない.
     3736
     3737(8-5-3) RAISE_CPU_EXCEPTION(オプション)
     3738
     3739CPUEXC1に定義したCPU例外を発生させるC言語のプログラムを定義するマクロ.
     3740CPUEXC1を定義した場合には必ず定義しなければならない.
     3741
     3742(8-5-4) CANNOT_RETURN_CPUEXC(オプション)
     3743
     3744ターゲットシステムの制約により,CPU例外ハンドラからリターンした後に,タ
     3745スクの実行を継続できない場合に定義するマクロ.このマクロを定義すると,
     3746CPU例外ハンドラのテストをするテストプログラムから,CPU例外ハンドラから
     3747リターンした後の処理が除外される.サンプルプログラムの該当部分は正しく
     3748動作しない.
     3749
     3750(8-5-5) TASK_PORTID(オプション)
     3751
     3752サンプルプログラムにおいて,コマンド文字を読み込むシリアルポート番号を
     3753定義するマクロ.定義しない場合のデフォルト値は1.
     3754
     3755(8-5-6) LOOP_REF(オプション)
     3756
     3757サンプルプログラムにおいて,プロセッサの速度を計測するためのループ回数
     3758を定義するマクロ.定義しない場合のデフォルト値は1000000.デフォルト設定
     3759では,値が大き過ぎて計測に時間がかかりすぎる場合や,値が小さ過ぎて計測
     3760結果が安定しない場合に,ターゲット依存部でこのマクロを設定するループ回
     3761数に定義する.
     3762
     3763(8-5-7) MEASURE_TWICE(オプション)
     3764
     3765サンプルプログラムにおいて,プロセッサの速度を2度計測する場合に定義する
     3766マクロ.シミュレーション環境などプロセッサの速度が変動する環境で,1度の
     3767計測では計測結果が安定しない場合に定義する.
     3768
     3769(8-5-8) TASK_LOOP(オプション)
     3770
     3771サンプルプログラムにおいて,プロセッサの速度を計測せずに,タスク内での
     3772ループ回数を固定する場合に,ループ回数を定義するマクロ.ループ全体の実
     3773行時間が0.4秒程度になるようなループ回数を,このマクロに定義する.
     3774
     37758.6 実行時間分布集計モジュールのターゲット依存定義
     3776
     3777実行時間分布集計モジュールの設定をターゲット依存部で変更する場合に,ター
     3778ゲット依存部で提供すべき実行時間分布集計モジュールのための定義は次の通
     3779りである.これらの定義は,target_test.h(またはそこからインクルードされ
     3780るファイル)に含める.この他に,ターゲット依存で必要な初期化処理がある
     3781場合にも,ターゲット依存部に含める.
     3782
     3783(8-6-1) HISTTIM(オプション)
     3784
     3785実行時間計測用の時刻のデータ型を定義するマクロ.定義しない場合のデフォ
     3786ルトはSYSUTM.
     3787
     3788(8-6-2) void HIST_GET_TIM(HISTTIM *p_time)(オプション)
     3789
     3790実行時間計測用の現在時刻を*p_timeに取得する処理に定義するマクロ.定義し
     3791ない場合のデフォルトはget_utm.
     3792
     3793(8-6-3) uint_t HIST_CONV_TIM(HISTTIM time)(オプション)
     3794
     3795実行時間計測用の時刻の差(時間)を,実行時間分布集計用の値に変換する処
     3796理に定義するマクロ.時刻が過去に戻ったかオーバフローしたかの区別がつか
     3797ない場合には,最上位ビットが1の値(INT_MAXよりも大きい値)を返す.定義
     3798しない場合のデフォルトは,timeをuint_tにキャストする処理.
     3799
     3800(8-6-4) void HIST_BM_HOOK(void)(オプション)
     3801
     3802実行時間計測直前に行うべき処理に定義するマクロ.キャッシュのパージやフィ
     3803ル,メモリバリア処理等を行いたい場合には,このマクロに定義する.定義し
     3804ない場合のデフォルトは,空の処理になる.
     3805
     3806
     38079.その他
     3808
     38099.1 ドキュメント
     3810
     3811ターゲット依存部のユーザーズマニュアルを,target_user.txtに用意する.プ
     3812ロセッサ・チップ・開発環境依存部のユーザーズマニュアルを切り分けてもよ
     3813いし,ファイルが大きくなる場合には複数のファイルに分割してよいが,その
     3814場合には,target_user.txt中にそれらのファイル名を記述すること.
     3815
     3816ターゲット依存部のユーザーズマニュアルには,少なくとも次のような内容を
     3817記述することが望ましい.
     3818
     3819(1) 対応しているターゲットシステムの種類・構成,バージョン番号
     3820        ・ターゲットハードウェア(ボード等)の名称と対応している構成
     3821        ・ターゲット略称
     3822        ・ターゲット非依存部のバージョン番号
     3823        ・プロセッサ,チップ,開発環境依存部の構成とバージョン番号
     3824        ・使用するPDICとバージョン番号
     3825
     3826(2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
     3827        ・言語処理系(コンパイラ,アセンブラ,リンカ等)
     3828        ・デバッグ環境
     3829
     3830(3) ターゲット定義事項の規定
     3831
     3832(3-1) データ型に関する規定
     3833        ・int_t型,long_t型のサイズ
     3834        ・char型,int_least8_t型,void *型,intptr_t型のサイズ
     3835        ・int8_t型,uint8_t型,int64_t型,uint64_t型,int128_t型,
     3836         uint128_t型,float32_t型,double64_t型のサポートの有無
     3837
     3838(3-2) 割込み処理に関する規定
     3839        ・割込みハンドラ番号と割込み番号の割当て,両者の対応
     3840        ・割込み優先度の段階数(TMIN_INTPRIの値)
     3841        ・dis_intとena_intのサポートの有無,その制限事項
     3842        ・CFG_INTの制限事項と拡張(ターゲット定義で使用できる割込み属性)
     3843        ・TOPPERS標準割込み処理モデルからのその他の逸脱
     3844        ・デフォルトの割込みハンドラ(default_int_handler)の有無と処理内容
     3845
     3846(3-3) カーネル管理外の割込みに関する規定
     3847        ・TMIN_INTPRIは固定か設定できるか,その設定方法
     3848        ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか)
     3849        ・カーネル管理外の割込みの設定方法
     3850        ・カーネル管理外の割込みに対してDEF_INH,CFG_INTをサポートするか
     3851        ・カーネル管理外の割込みハンドラが実行開始される時のシステム状態と
     3852         コンテキスト
     3853        ・割込みハンドラの終了時に行われる処理
     3854        ・カーネル管理外の割込みハンドラの記述方法
     3855        ・カーネル内の割込み出入口処理で起こる可能性のあるCPU例外
     3856
     3857(3-4) CPU例外処理に関する規定
     3858        ・CPU例外ハンドラ番号の割当て
     3859        ・割込み優先度マスクをTMIN_INTPRIと同じかそれよりも高い値に設定して
     3860         いる状態で発生したCPU例外を,カーネル管理外のCPU例外と扱うか
     3861        ・カーネル内のCPU例外出入口処理で起こる可能性のあるCPU例外
     3862        ・デフォルトのCPU例外ハンドラ(default_exc_handler)の有無と処理内容
     3863
     3864(3-5) 性能評価用システム時刻の参照に関する規定
     3865        ・get_utmのサポートの有無,その制限事項
     3866
     3867(3-6) 拡張パッケージに関する規定
     3868        ・各拡張パッケージのサポートの有無
     3869                - ミューテックス機能拡張パッケージ
     3870                - オーバランハンドラ機能拡張パッケージ
     3871                - タスク優先度拡張パッケージ
     3872                - 制約タスク拡張パッケージ
     3873                - 動的生成機能拡張パッケージ
     3874        ・オーバランハンドラ機能拡張パッケージをサポートする場合に,プロセッ
     3875         サ時間に指定できる値の最大値(TMAX_OVRTIMの値)
     3876        ・動的生成機能拡張パッケージをサポートする場合に,動的メモリ管理の
     3877         方法
     3878
     3879(3-7) その他
     3880        ・その他の制限事項
     3881        ・その他の拡張機能
     3882
     3883(4) カーネルの起動/終了処理に関する情報
     3884        ・用意しているスタートアップモジュールの処理内容
     3885        ・スタートアップモジュールからhardware_init_hookを呼び出している場
     3886         合には,hardware_init_hookをアプリケーションで用意する場合の作成
     3887         方法や制限事項など
     3888        ・カーネルを終了した後の振舞い
     3889
     3890(5) メモリマップ
     3891        ・デフォルトのメモリマップ,その変更方法
     3892
     3893(6) タイマドライバ関連の情報
     3894        ・タイムティックの周期,その変更方法
     3895        ・使用するリソース(タイマ)
     3896        ・タイマ割込みの割込み優先度の変更方法
     3897        ・オーバランタイマ割込みの割込み優先度の変更方法
     3898
     3899(7) シリアルインタフェースドライバの情報
     3900        ・使用するリソース(SIOコントローラ)
     3901        ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
     3902
     3903(8) システムログ機能の情報
     3904        ・システムログの低レベル出力の実現方法
     3905        ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
     3906
     3907(9) システム構築手順
     3908
     3909(10) ターゲットシステム固有の注意事項
     3910        ・タスクコンテキストに含まれるレジスタ,含まれないレジスタ
     3911
     3912(11) 類似のターゲットにポーティングする開発者向けの参考情報
     3913
     3914(12) ディレクトリ構成・ファイル構成
     3915
     3916(13) バージョン履歴
     3917
     3918また,必要に応じて,ターゲット依存部の設計メモを,target_design.txtに用
     3919意する.プロセッサ・チップ・開発環境依存部に関する設計メモを切り分けて
     3920もよいし,ファイルが大きくなる場合には複数のファイルに分割してもよいが,
     3921その場合には,target_design.txt中にそれらのファイル名を記述すること.
     3922
     39239.2 パッケージ記述ファイル
     3924
     3925リリースパッケージ(個別パッケージおよび簡易パッケージ)を作成するため
     3926に,パッケージに含めるファイルを記述したパッケージ記述ファイルを用意す
     3927る.パッケージ記述ファイルの名称は,個別パッケージ用をMANIFEST,簡易パッ
     3928ケージ用をE_PACKAGEとする.
     3929
     3930例えば,arch/arm_gccディレクトリに置かれたMANIFESTファイルを用いて個別
     3931パッケージを作成する場合には,次のコマンドを実行する.
    48573932
    48583933        % utils/makerelease arch/arm_gcc/MANIFEST
    48593934
    4860 ã“のコマンドにより,RELEASE/asp_arch_arm_gcc-<バージョン番号>.tar.gzが
    4861 ä½œæˆã•ã‚Œã‚‹ï¼Žã¾ãŸï¼Œtarget/at91skyeye_gccディレクトリに置かれたE_PACKAGE
    4862 ãƒ•ã‚¡ã‚¤ãƒ«ã‚’用いて簡易パッケージを作成する場合には,次のコマンドを実行す
    4863 ã‚‹ï¼Ž
     3935このコマンドにより,RELEASE/asp_arch_arm_gcc-<バージョン番号>.tar.gzが
     3936作成される.また,target/at91skyeye_gccディレクトリに置かれたE_PACKAGE
     3937ファイルを用いて簡易パッケージを作成する場合には,次のコマンドを実行す
     3938る.
    48643939
    48653940        % utils/makerelease target/at91skyeye_gcc/E_PACKAGE
    48663941
    4867 ã“のコマンドにより,RELEASE/asp_at91skyeye_gcc-<バージョン番号>.tar.gz
    4868 ãŒä½œæˆã•ã‚Œã‚‹ï¼ˆRELEASEディレクトリがない場合には,ディレクトリが作られ
    4869 ã‚‹ï¼‰ï¼Ž
    4870 
    4871 ãªãŠï¼Œmakereleaseユーティリティは,ASPカーネルのソースファイルが置かれ
    4872 ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒï¼Œaspという名称であることを仮定している(異なる名称の場
    4873 åˆã§ã‚‚パッケージは作成できるが,パッケージを展開した時に展開されるディ
    4874 ãƒ¬ã‚¯ãƒˆãƒªãŒaspでなくなる).また,標準のtarコマンドがGNU tarであること
    4875 ï¼ˆæ­£ç¢ºã«ã¯ï¼Œzオプションに対応していること)を想定している.
    4876 
    4877 ãƒ‘ッケージ記述ファイルには,パッケージに含めるファイル名を,パッケージ
    4878 è¨˜è¿°ãƒ•ã‚¡ã‚¤ãƒ«ãŒç½®ã‹ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ã®ç›¸å¯¾ãƒ‘ス名で,1行に1つずつ記述
    4879 ã™ã‚‹ï¼Žã¾ãŸï¼Œå¿
    4880 è¦ã«å¿œã˜ã¦ï¼Œä»¥ä¸‹ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–を含める.
    4881 
    4882 (a) E_PACKAGE <簡易パッケージ名>
    4883 
    4884 ç°¡æ˜“パッケージ名を指定する.簡易パッケージ記述ファイル(E_PACKAGE)のå
    4885 ˆ
    4886 é ­ã«è¨˜è¿°ã™ã‚‹ï¼Žç°¡æ˜“パッケージ名は,asp_<ターゲット略称>とする.例えば,
    4887 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆç•¥ç§°ãŒat91skyeye_gccの場合には,asp_at91skyeye_gccとなる.個
    4888 åˆ¥ãƒ‘ッケージと区別するために,簡易パッケージのファイル名には"target"を
    4889 å«ã‚ãªã„.
    4890 
    4891 (b) PACKAGE <個別パッケージ名>
    4892 
    4893 å€‹åˆ¥ãƒ‘ッケージ名を指定する.個別パッケージ記述ファイル(MANIFEST)のå
    4894 ˆ
    4895 é ­ã«è¨˜è¿°ã™ã‚‹ï¼Žã¾ãŸï¼Œãã“からインクルードされる各ファイルのå
    4896 ˆé ­ã«ã‚‚記述
    4897 ã—,それをインクルードしている個別パッケージ名を指定する.ターゲット依
    4898 å­˜éƒ¨ã®å€‹åˆ¥ãƒ‘ッケージ名は,個別パッケージ記述ファイルが置かれたディレク
    4899 ãƒˆãƒªã®ç›¸å¯¾ãƒ‘ス中の"/"を"_"に置き換えた文字列を,"asp_"の後につなげたも
    4900 ã®ã¨ã™ã‚‹ï¼Žä¾‹ãˆã°ï¼Œå€‹åˆ¥ãƒ‘ッケージ記述ファイルがarch/arm_gcc/MANIFESTの場
    4901 åˆã«ã¯ï¼Œasp_arch_arm_gccとなる.
    4902 
    4903 (c) VERSION <バージョン番号>
    4904 
    4905 ãƒ‘ッケージのバージョン番号を指定する.簡易パッケージ記述ファイルおよび
    4906 å€‹åˆ¥ãƒ‘ッケージ記述ファイルの中に記述する.簡易パッケージにおいて,バー
    4907 ã‚¸ãƒ§ãƒ³ç•ªå·ã‚’パッケージ化した日付とする場合には,パッケージ番号の代わり
    4908 ã«%dateと記述する.
    4909 
    4910 ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®ä»˜ä¸Žæ–¹æ³•ã«ã¤ã„ては,「TOPPERS/ASPカーネル ユーザーズマ
    4911 ãƒ‹ãƒ¥ã‚¢ãƒ«ã€ã®ã€Œ2.2 簡易パッケージ」および「2.3 個別パッケージ」の節を参
    4912 ç
    4913 §ã™ã‚‹ã“と.
    4914 
    4915 (d) INCLUDE <ファイル名>
    4916 
    4917 åˆ¥ã®ãƒ‘ッケージ記述ファイルをインクルードする.簡易パッケージ記述ファイ
    4918 ãƒ«ã‹ã‚‰ã¯ï¼Œå€‹åˆ¥ãƒ‘ッケージ記述ファイルのみをインクルードするのを原則とす
    4919 ã‚‹ï¼Žå€‹åˆ¥ãƒ‘ッケージ記述ファイルからインクルードされるファイル中で指定さ
    4920 ã‚Œã‚‹å€‹åˆ¥ãƒ‘ッケージ名は,すべて一致していなければならない.
    4921 
    4922 
    4923 ï¼‘0.リファレンス
    4924 
    4925 10.1 ターゲット依存部のファイル一覧
    4926 
    4927 æ¨™æº–的なターゲット依存部のファイル構成は次の通りである.
    4928 
    4929 Makefile.target         Makefileのターゲット依存部(2章).
    4930 target_offset.tf        オフセットファイル生成用テンプレートファイル(2.5.1節,
    4931                                         オプション)
    4932 
    4933 target_stddef.h         TOPPERSå
    4934 ±é€šå®šç¾©ï¼ˆt_stddef.h)のターゲット依存部(3
    4935                                         章).アプリケーションとカーネルの両方からインクルー
    4936                                         ドされる.
    4937 target_sil.h            システムインタフェースレイヤ(sil.h)のターゲット依
    4938                                         存部(4章).アプリケーションとカーネルの両方から
    4939                                         インクルードされる.
    4940 target_kernel.h         ã‚«ãƒ¼ãƒãƒ«API(kernel.h)のターゲット依存部(5章).
    4941                                         アプリケーションとカーネルの両方からインクルードさ
    4942                                         れる.
    4943 
    4944 target_config.h         ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    4945 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆï¼–
    4946                                         章).カーネルのみからインクルードされる.
    4947 target_config.c         ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    4948 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®C言語で記述される
    4949                                         部分(6章,オプション).
    4950 target_support.S        カーネル実è£
    4951 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ã‚¢ã‚»ãƒ³ãƒ–リ言語で記
    4952                                         述される部分(6章,オプション).
    4953 target_rename.def       ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    4954 ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãŸã‚ã®ãƒªãƒãƒ¼ãƒ è¨˜è¿°
    4955                                         (6.12節).
    4956 target_rename.h         target_rename.defから生成されるファイル(6.12節).
    4957 target_unrename.h       target_rename.defから生成されるファイル(6.12節).
    4958 target_timer.cfg        タイマドライバのシステムコンフィギュレーションファ
    4959                                         イル(6.13節).
    4960 target_timer.h          タイマドライバのヘッダファイル(6.13節).カーネル
    4961                                         のみからインクルードされる.
    4962 target_timer.c          タイマドライバの実è£
    4963 ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆ6.13節,オプション).
    4964 ã‚·ã‚¹ãƒ†ãƒ ç•¥ç§°.h            ターゲットのハードウェア資源(割込みハンドラ番号や
    4965                                         CPU例外ハンドラ番号,デバイスレジスタの番地など)の
    4966                                         定義を含むヘッダファイル.アプリケーションとカーネ
    4967                                         ルの両方からインクルードされる(6章,オプション).
    4968 
    4969 target_def.csv          コンフィギュレータの値取得シンボルテーブルのターゲッ
    4970                                         ト依存部(7章,オプション).
    4971 target.tf                       ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス2のテンプレートファイルの
    4972                                         ターゲット依存部(7.2節).
    4973 target_check.tf         ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス3のテンプレートファイル(7.3
    4974                                         節).
    4975 target_cfg1_out.h       cfg1_out.cのリンクにå¿
    4976 è¦ãªã‚¹ã‚¿ãƒ–の定義ファイル(7.4
    4977                                         節).
    4978 
    4979 target_syssvc.h         ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スのターゲット依存定義(8.0節).
    4980 target_serial.cfg       ã‚·ãƒªã‚¢ãƒ«ãƒ‰ãƒ©ã‚¤ãƒã®ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡
    4981                                         イル(8.3節).
    4982 target_serial.h         ã‚·ãƒªã‚¢ãƒ«ãƒ‰ãƒ©ã‚¤ãƒã®ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆ8.3節).シリアル
    4983                                         ドライバのみからインクルードされる.
    4984 target_serial.c         ã‚·ãƒªã‚¢ãƒ«ãƒ‰ãƒ©ã‚¤ãƒã®å®Ÿè£
    4985 ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆ8.3節,オプション).
    4986 target_test.h           ãƒ†ã‚¹ãƒˆãƒ—ログラムのターゲット依存定義(8.4節).
    4987 
    4988 target_user.txt         ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ï¼ˆ9.1節)
    4989 target_design.txt       è¨­è¨ˆãƒ¡ãƒ¢ï¼ˆ9.1節,オプション)
    4990 MANIFEST                        個別パッケージに含めるファイルのリスト(9.2節,オプ
    4991                                         ション)
    4992 E_PACKAGE                       ç°¡æ˜“パッケージに含めるファイルのリスト(9.2節,オプ
    4993                                         ション)
    4994 
    4995 ä»¥ä¸Š
     3942このコマンドにより,RELEASE/asp_at91skyeye_gcc-<バージョン番号>.tar.gz
     3943が作成される(RELEASEディレクトリがない場合には,ディレクトリが作られ
     3944る).
     3945
     3946なお,makereleaseユーティリティは,ASPカーネルのソースファイルが置かれ
     3947たディレクトリが,aspという名称であることを仮定している(異なる名称の場
     3948合でもパッケージは作成できるが,パッケージを展開した時に展開されるディ
     3949レクトリがaspでなくなる).また,標準のtarコマンドがGNU tarであること
     3950(正確には,zオプションに対応していること)を想定している.
     3951
     3952パッケージ記述ファイルには,パッケージに含めるファイル名を,パッケージ
     3953記述ファイルが置かれたディレクトリからの相対パス名で,1行に1つずつ記述
     3954する.また,必要に応じて,以下のディレクティブを含める.
     3955
     3956(a) E_PACKAGE <簡易パッケージ名>
     3957
     3958簡易パッケージ名を指定する.簡易パッケージ記述ファイル(E_PACKAGE)の先
     3959頭に記述する.簡易パッケージ名は,asp_<ターゲット略称>とする.例えば,
     3960ターゲット略称がat91skyeye_gccの場合には,asp_at91skyeye_gccとなる.個
     3961別パッケージと区別するために,簡易パッケージのファイル名には"target"を
     3962含めない.
     3963
     3964(b) PACKAGE <個別パッケージ名>
     3965
     3966個別パッケージ名を指定する.個別パッケージ記述ファイル(MANIFEST)の先
     3967頭に記述する.また,そこからインクルードされる各ファイルの先頭にも記述
     3968し,それをインクルードしている個別パッケージ名を指定する.ターゲット依
     3969存部の個別パッケージ名は,個別パッケージ記述ファイルが置かれたディレク
     3970トリの相対パス中の"/"を"_"に置き換えた文字列を,"asp_"の後につなげたも
     3971のとする.例えば,個別パッケージ記述ファイルがarch/arm_gcc/MANIFESTの場
     3972合には,asp_arch_arm_gccとなる.
     3973
     3974(c) VERSION <バージョン番号>
     3975
     3976パッケージのバージョン番号を指定する.簡易パッケージ記述ファイルおよび
     3977個別パッケージ記述ファイルの中に記述する.簡易パッケージにおいて,バー
     3978ジョン番号をパッケージ化した日付とする場合には,パッケージ番号の代わり
     3979に%dateと記述する.
     3980
     3981バージョン番号の付与方法については,「TOPPERS/ASPカーネル ユーザーズマ
     3982ニュアル」の「2.2 簡易パッケージ」および「2.3 個別パッケージ」の節を参
     3983照すること.
     3984
     3985(d) INCLUDE <ファイル名>
     3986
     3987別のパッケージ記述ファイルをインクルードする.簡易パッケージ記述ファイ
     3988ルからは,個別パッケージ記述ファイルのみをインクルードするのを原則とす
     3989る.個別パッケージ記述ファイルからインクルードされるファイル中で指定さ
     3990れる個別パッケージ名は,すべて一致していなければならない.
     3991
     3992
     399310.リファレンス
     3994
     399510.1 ターゲット依存部のファイル一覧
     3996
     3997標準的なターゲット依存部のファイル構成は次の通りである.
     3998
     3999Makefile.target         Makefileのターゲット依存部(2章).
     4000target_offset.tf        オフセットファイル生成用テンプレートファイル(2.5.1節,
     4001                                        オプション)
     4002
     4003target_stddef.h         TOPPERS共通定義(t_stddef.h)のターゲット依存部(3
     4004                                        章).アプリケーションとカーネルの両方からインクルー
     4005                                        ドされる.
     4006target_sil.h            システムインタフェースレイヤ(sil.h)のターゲット依
     4007                                        存部(4章).アプリケーションとカーネルの両方から
     4008                                        インクルードされる.
     4009target_kernel.h         カーネルAPI(kernel.h)のターゲット依存部(5章).
     4010                                        アプリケーションとカーネルの両方からインクルードさ
     4011                                        れる.
     4012
     4013target_config.h         カーネル実装のターゲット依存部のヘッダファイル(6
     4014                                        章).カーネルのみからインクルードされる.
     4015target_config.c         カーネル実装のターゲット依存部のC言語で記述される
     4016                                        部分(6章,オプション).
     4017target_support.S        カーネル実装のターゲット依存部のアセンブリ言語で記
     4018                                        述される部分(6章,オプション).
     4019target_rename.def       カーネル実装のターゲット依存部のためのリネーム記述
     4020                                        (6.12節).
     4021target_rename.h         target_rename.defから生成されるファイル(6.12節).
     4022target_unrename.h       target_rename.defから生成されるファイル(6.12節).
     4023target_timer.cfg        タイマドライバのシステムコンフィギュレーションファ
     4024                                        イル(6.13節).
     4025target_timer.h          タイマドライバのヘッダファイル(6.13節).カーネル
     4026                                        のみからインクルードされる.
     4027target_timer.c          タイマドライバの実装ファイル(6.13節,オプション).
     4028システム略称.h                ターゲットのハードウェア資源(割込みハンドラ番号や
     4029                                        CPU例外ハンドラ番号,デバイスレジスタの番地など)の
     4030                                        定義を含むヘッダファイル.アプリケーションとカーネ
     4031                                        ルの両方からインクルードされる(6章,オプション).
     4032
     4033target_def.csv          コンフィギュレータの値取得シンボルテーブルのターゲッ
     4034                                        ト依存部(7章,オプション).
     4035target.tf                       コンフィギュレータのパス2のテンプレートファイルの
     4036                                        ターゲット依存部(7.2節).
     4037target_check.tf         コンフィギュレータのパス3のテンプレートファイル(7.3
     4038                                        節).
     4039target_cfg1_out.h       cfg1_out.cのリンクに必要なスタブの定義ファイル(7.4
     4040                                        節).
     4041
     4042target_syssvc.h         システムサービスのターゲット依存定義(8.0節).
     4043target_serial.cfg       シリアルドライバのシステムコンフィギュレーションファ
     4044                                        イル(8.3節).
     4045target_serial.h         シリアルドライバのヘッダファイル(8.3節).シリアル
     4046                                        ドライバのみからインクルードされる.
     4047target_serial.c         シリアルドライバの実装ファイル(8.3節,オプション).
     4048target_test.h           テストプログラムのターゲット依存定義(8.4節).
     4049
     4050target_user.txt         ユーザーズマニュアル(9.1節)
     4051target_design.txt       設計メモ(9.1節,オプション)
     4052MANIFEST                        個別パッケージに含めるファイルのリスト(9.2節,オプ
     4053                                        ション)
     4054E_PACKAGE                       簡易パッケージに含めるファイルのリスト(9.2節,オプ
     4055                                        ション)
     4056
     4057以上
  • rubycfg_asp/trunk/asp_dcre/doc/user.txt

    • Property svn:mime-type changed from text/plain to text/plane; charset=UTF-8
    r313 r315  
    11
    2                 TOPPERS/ASPカーネル
    3                 ユーザーズマニュアル
    4 
    5                 対応バージョン: Release 1.9.3
    6                 最終更新: 2017å¹´4月29日
    7 
    8 ã“のドキュメントは,TOPPERS/ASPカーネルを使用するためにå¿
    9 è¦ãªäº‹é 
    10 ã‚’説明
    11 ã™ã‚‹ã‚‚のである.
     2                TOPPERS/ASPカーネル
     3                ユーザーズマニュアル
     4
     5                対応バージョン: Release 1.9.3
     6                最終更新: 2017年4月29日
     7
     8このドキュメントは,TOPPERS/ASPカーネルを使用するために必要な事項を説明
     9するものである.
    1210
    1311----------------------------------------------------------------------
     
    1917             Graduate School of Information Science, Nagoya Univ., JAPAN
    2018 
    21  ä¸Šè¨˜è‘—作権è€
    22 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    23  ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    24  å¤‰ãƒ»å†é
    25 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    26  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    27      æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    28      ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    29  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    30      ç”¨ã§ãã‚‹å½¢ã§å†é
    31 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    32 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    33      è€
    34 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    35      ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    36  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    37      ç”¨ã§ããªã„形で再é
    38 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    39      ã¨ï¼Ž
    40    (a) 再é
    41 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    42 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    43        ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    44    (b) 再é
    45 å¸ƒã®å½¢æ
    46 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    47        å ±å‘Šã™ã‚‹ã“と.
    48  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    49      å®³ã‹ã‚‰ã‚‚,上記著作権è€
    50 ãŠã‚ˆã³TOPPERSプロジェクトをå
    51 è²¬ã™ã‚‹ã“と.
    52      ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    53      ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    54 ãŠã‚ˆã³TOPPERSプロジェクトを
    55      å
    56 è²¬ã™ã‚‹ã“と.
     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     免責すること.
    5741 
    58  æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    59 ãŠ
    60  ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    61  ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    62  ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    63  ã®è²¬ä»»ã‚’負わない.
     42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     46 の責任を負わない.
    6447 
    6548 $Id$
    6649----------------------------------------------------------------------
    6750
    68 â—‹ç›®æ¬¡
    69 
    70 ï¼‘.TOPPERS/ASPカーネルの概要
    71         1.1 TOPPERS/ASPカーネルの位置付け
    72         1.2 TOPPERS/ASPカーネルの仕様
    73         1.3 マイグレーションガイド
    74         1.4 機能拡張・チューニングガイド
    75         1.5 既知の問題
    76         1.6 Cygwin環境における注意事é 
    77 
    78 ï¼’.ターゲット依存部
    79         2.1 ターゲット依存部の概要
    80         2.2 簡易パッケージ
    81         2.3 個別パッケージ
    82 ï¼“.クイックスタートガイド
    83         3.1 開発環境の準備
    84         3.2 コンフィギュレータの構築
    85         3.3 サンプルプログラムの構築と実行
    86         3.4 カーネルを関数単位でライブラリ化する方法
    87         3.5 アプリケーションとカーネルを別ã€
    88 ã«æ§‹ç¯‰ã™ã‚‹æ–¹æ³•
    89 ï¼”.ディレクトリ構成・ファイル構成
    90         4.1 é
    91 å¸ƒãƒ‘ッケージのディレクトリ構成
    92         4.2 ターゲット非依存部のファイル構成
    93 ï¼•ï¼Žã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トの使い方
    94 ï¼–.Makefileの修正方法
    95         6.1 Makefileの変数定義
    96         6.2 コンパイルオプション
    97 ï¼—.コンフィギュレータの使い方
    98 ï¼˜ï¼Žã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“ス
    99         8.1 システムログ機能
    100                 8.1.1 システムログ機能の位置付け
    101                 8.1.2 ログバッファへの記録と低レベル出力
    102                 8.1.3 ログæƒ
    103 å ±ã®ç¨®åˆ¥
    104                 8.1.4 ログæƒ
    105 å ±ã®é‡è¦åº¦
    106                 8.1.5 ログæƒ
    107 å ±ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ 
    108                 8.1.6 システムログ機能のサービスコール
    109                 8.1.7 システムログ機能のためのライブラリ関数とマクロ
    110                 8.1.8 システムログ機能のその他のサービス
    111         8.2 シリアルインタフェースドライバ
    112                 8.2.1 シリアルインタフェースドライバのサービスコール
    113                 8.2.2 シリアルインタフェースドライバのその他のサービス
    114         8.3 システムログタスク
    115                 8.3.1 システムログタスクのサービスコール
    116                 8.3.2 システムログタスクのその他のサービス
    117         8.4 カーネル起動メッセージの出力
    118 ï¼™ï¼Žã‚µãƒãƒ¼ãƒˆãƒ©ã‚¤ãƒ–ラリ
    119         9.1 基本的なライブラリ関数
    120         9.2 キュー操作ライブラリ関数
    121         9.3 システムログ出力用ライブラリ関数
    122         9.4 実行時間分布集計モジュール
    123 ï¼‘0.テストプログラム
    124         10.1 テストプログラム用ライブラリ
    125         10.2 カーネルの整合性検査
    126         10.3 機能テストプログラム
    127         10.4 性能評価プログラム
    128 ï¼‘1.使用上の注意とヒント
    129         11.1 タイマドライバの組込み
    130         11.2 assertマクロの処理
    131         11.3 システムログ機能の扱い
    132         11.4 オブジェクトIDの管理
    133         11.5 カーネルのå†
    134 éƒ¨ã‚·ãƒ³ãƒœãƒ«ã®ãƒªãƒãƒ¼ãƒ 
    135         11.6 トレースログ記録のサンプルコードの使用方法
    136         11.7 システムの起動時の初期化処理
    137         11.8 rodataセクションをRAMに置く場合
    138 ï¼‘2.参考æƒ
    139 å ±
    140         12.1 利用条件と利用報告
    141         12.2 保証・適用性・サポート
    142         12.3 バグレポート
    143         12.4 ウェブサイト
    144         12.5 TOPPERSユーザーズメーリングリスト
    145         12.6 TOPPERSプロジェクトのメンバ向けのサービス
    146         12.7 TOPPERSプロジェクトへの参加
    147 ï¼‘3.リファレンス
    148         13.1 サービスコール一覧
    149         13.2 静的API一覧
    150         13.3 バージョン履歴
    151 
    152 
    153 ï¼‘.TOPPERS/ASPカーネルの概要
    154 
    155 1.1 TOPPERS/ASPカーネルの位置付け
    156 
    157 TOPPERS/ASPカーネル(以下,ASPカーネル)は,TOPPERS新世代カーネルの基盤
    158 ã¨ãªã‚‹ã‚‚のとして,TOPPERSプロジェクトにおいて開発したリアルタイムカーネ
    159 ãƒ«ã§ã‚る.μITRON4.0仕様のスタンダードプロファイル準拠のリアルタイムカー
    160 ãƒãƒ«ã§ã‚ã‚‹TOPPERS/JSPカーネルを拡張・改良する形で開発した.
    161 
    162 1.2 TOPPERS/ASPカーネルの仕様
    163 
    164 ASPカーネルの仕様の概要については,「TOPPERS/ASPカーネルの仕様概要」を
    165 å‚ç
    166 §ã™ã‚‹ã“と.また,ASPカーネルを含むTOPPERS新世代カーネルの仕様の詳細
    167 ã«ã¤ã„ては,別途PDFファイルの形でé
    168 å¸ƒã—ている「TOPPERS新世代カーネル統
    169 åˆä»•æ§˜æ›¸ï¼ˆRelease 1.7.1)」を参ç
    170 §ã™ã‚‹ã“と.
    171 
    172 1.3 マイグレーションガイド
    173 
    174 å¾“来のTOPPERSカーネルや他のμITRON4.0仕様準拠のカーネルから,TOPPERS新
    175 ä¸–代カーネルに移行するための方法(またはヒント)を説明した「TOPPERS新世
    176 ä»£ã‚«ãƒ¼ãƒãƒ«ã¸ã®ãƒžã‚¤ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¬ã‚¤ãƒ‰ã€ã‚’,別途PDFファイルの形でé
    177 å¸ƒã—て
    178 ã„る.å¿
    179 è¦ã«å¿œã˜ã¦å‚ç
    180 §ã™ã‚‹ã“と.
    181 
    182 1.4 機能拡張・チューニングガイド
    183 
    184 TOPPERS/ASPカーネルを,機能拡張・チューニングするための方法(またはヒン
    185 ãƒˆï¼‰ã‚’説明した「機能拡張・チューニングガイド」を用意している.拡張パッ
    186 ã‚±ãƒ¼ã‚¸ã®ä½¿ç”¨æ–¹æ³•ã¯ï¼Œã€Œæ©Ÿèƒ½æ‹¡å¼µãƒ»ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°ã‚¬ã‚¤ãƒ‰ã€ã«å«ã¾ã‚Œã¦ã„る.å¿
    187 
    188 è¦ã«å¿œã˜ã¦å‚ç
    189 §ã™ã‚‹ã“と.
    190 
    191 1.5 既知の問題
    192 
    193 å‰²è¾¼ã¿ã‚µãƒ¼ãƒ“スルーチンのå
    194 ˆé ­ç•ªåœ°ï¼ˆATT_ISRのisr),割込みハンドラのå
    195 ˆé ­
    196 ç•ªåœ°ï¼ˆDEF_INHのinthdr),CPU例外ハンドラのå
    197 ˆé ­ç•ªåœ°ï¼ˆDEF_EXCのexchdr),
    198 åˆæœŸåŒ–ルーチンのå
    199 ˆé ­ç•ªåœ°ï¼ˆATT_INIのinirtn),終了処理ルーチンのå
    200 ˆé ­ç•ªåœ°
    201 ï¼ˆATT_TERのterrtn)がプログラムの開始番地として正しくない場合のエラーは,
    202 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«æ¤œå‡ºã•ã‚Œãªã„場合がある(ターゲットに依存).
    203 
    204 kernel_cfg.c(およびcfg1_out.c)は,カーネル,システムサービス,アプリ
    205 ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®ã„ずれのインクルードファイルもインクルードし,いずれのシン
    206 ãƒœãƒ«ã‚‚参ç
    207 §ã™ã‚‹å¯èƒ½æ€§ãŒã‚る.そのため,カーネル,システムサービス,アプ
    208 ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã‚·ãƒ³ãƒœãƒ«ç­‰ãŒè¡çªã—ている場合や,コンパイルオプションが食
    209 ã„違っている場合に,kernel_cfg.c(およびcfg1_out.c)が正しくコンパイル
    210 ã§ããªããªã‚‹å ´åˆãŒè€ƒãˆã‚‰ã‚Œã‚‹ï¼Žã‚«ãƒ¼ãƒãƒ«ã®ã‚·ãƒ³ãƒœãƒ«ã‚’リネームするなどの方
    211 æ³•ã§è»½æ¸›ã•ã‚Œã¦ã¯ã„るが,問題がなくなっているわけではない.
    212 
    213 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹
    214 INCLUDEディレクティブにより他のコンフィギュレーションファイルをインクルー
    215 ãƒ‰ã—ている場合に,その中に含まれるC言語プリプロセッサのインクルードディ
    216 ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–(#include)で,コンフィギュレーションファイルの置かれている
    217 ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒï¼Œãƒ•ã‚¡ã‚¤ãƒ«ã‚’検索するパスにはいらないという問題がある.例
    218 ãˆã°ï¼Œsyssvc/syslog.cfgに「#include "syslog.h"」と記述できないのは,こ
    219 ã®å•é¡ŒãŒã‚るためである.
    220 
    221 ç¾æ™‚点では,アドレスが64ビットの環境には対応していない.64ビットアドレ
    222 ã‚¹ç’°å¢ƒã‚’サポートするための最大の課題は,モトローラSレコードフォーマット
    223 ãŒ64ビットアドレスに対応していないことである.
    224 
    225 1.6 Cygwin環境における注意事é 
    226 
    227 
    228 Cygwin環境においては,ディレクトリの指定を相対パスで行うことを推奨する.
    229 ã“れは,Cygwin環境の絶対パスは,Windowsネイティブでビルドされたツールは
    230 è§£é‡ˆã§ããªã„ためである.
    231 
    232 
    233 ï¼’.ターゲット依存部
    234 
    235 2.1 ターゲット依存部の概要
    236 
    237 ASPカーネルのターゲット非依存部と,各種のターゲットシステムに対応するた
    238 ã‚ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã¯ï¼Œåˆ¥ã€
    239 ã«é–‹ç™ºã•ã‚Œã¦ã„る.そのため,ASPカーネルが対
    240 å¿œã—ているすべてのターゲット依存部を,バージョンを整合させてパッケージ
    241 åŒ–することは困難である.そこで,主に初級のユーザを対象にした簡易パッケー
    242 ã‚¸ã¨ï¼Œä¸Šç´šã®ãƒ¦ãƒ¼ã‚¶ã‚„カーネル開発è€
    243 ã‚’対象にした個別パッケージを用意して
    244 ã„る.
    245 
    246 ASPカーネルを未サポートのターゲットシステムへポーティングするためにå¿
    247 è¦
    248 ãªä½œæ¥­ã¯ï¼Œé–‹ç™ºç’°å¢ƒã®æ§‹ç¯‰ã¨æ¨™æº–の開発環境との差異の吸収,カーネル自身の
    249 ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スのポーティングなどからなる.詳しくは,
    250 ã€Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ ポーティングガイド」を参ç
    251 §ã™ã‚‹ã“と.
    252 
    253 2.2 簡易パッケージ
    254 
    255 ç°¡æ˜“パッケージは,ASPカーネルが対応しているターゲットシステム毎に用意さ
    256 ã‚Œï¼Œãã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚·ã‚¹ãƒ†ãƒ ä¸Šã§ASPカーネルを動作させるためにå¿
    257 è¦ãªãƒ•ã‚¡ã‚¤
    258 ãƒ«ä¸€å¼ã‚’パッケージ化したものである.簡易パッケージに含まれるファイルは,
    259 ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ•´åˆã—ていることが確認されている.
    260 
    261 ç°¡æ˜“パッケージのバージョン番号は,パッケージ化した日付とすることを原則
    262 ã¨ã™ã‚‹ãŒï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚·ã‚¹ãƒ†ãƒ æ¯Žã®äº‹æƒ
    263 ã«ã‚ˆã‚Šã“の原則に従わない場合がある.
    264 
    265 ç°¡æ˜“パッケージは,基本的には,次に説明する個別パッケージを複数まとめた
    266 ã‚‚のである.そのため,対象ターゲットシステムにå¿
    267 è¦ã®ãªã„ファイルも含ま
    268 ã‚Œã¦ã„る.また,簡易パッケージに含まれている個別パッケージのバージョン
    269 ã¯ï¼Œå€‹åˆ¥ãƒ‘ッケージのMANIFESTファイルを参ç
    270 §ã™ã‚‹ã“とで知ることができる.
    271 
    272 2.3 個別パッケージ
    273 
    274 å€‹åˆ¥ãƒ‘ッケージは,ASPカーネルの開発単位毎に,その開発単位で開発をæ‹
    275 å½“し
    276 ã¦ã„るファイル一式をパッケージ化したものである.ASPカーネルのターゲット
    277 éžä¾å­˜éƒ¨ã‚‚,一つの個別パッケージとしてé
    278 å¸ƒã•ã‚Œã‚‹ï¼Žã‚る個別パッケージを
    279 ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ã¯ï¼Œä¸€èˆ¬ã«ã¯ï¼Œä»–の個別パッケージがå¿
    280 è¦ã¨ãªã‚‹ï¼Žã‚¿ãƒ¼ã‚²ãƒƒãƒˆ
    281 ä¾å­˜éƒ¨ã®å€‹åˆ¥ãƒ‘ッケージを使用するためにå¿
    282 è¦ã¨ãªã‚‹å€‹åˆ¥ãƒ‘ッケージとそのバー
    283 ã‚¸ãƒ§ãƒ³ã«ã¤ã„ては,ターゲット依存部のユーザーズマニュアルを参ç
    284 §ã™ã‚‹ã“と.
    285 ä½¿ç”¨ã™ã‚‹å€‹åˆ¥ãƒ‘ッケージのバージョンを整合させることは,ユーザの責任であ
    286 ã‚‹ï¼Ž
    287 
    288 å€‹åˆ¥ãƒ‘ッケージのバージョン番号は,X.Y.Zの形で表現される.ターゲット非依
    289 å­˜éƒ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã‚’,ASPカーネルå
    290 ¨ä½“のリリース番号とする.ターゲット
    291 ä¾å­˜éƒ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã¯ï¼ŒXとYが,それが依存するターゲット非依存部と一
    292 è‡´ã—ている.それに対して,Zは一致しているとは限らない.例えば,ターゲッ
    293 ãƒˆéžä¾å­˜éƒ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³1.1.0に対応するターゲット依存部は,バージョン
    294 1.1.Zの形となる.ターゲット依存部のみがバージョンアップした場合には,Z
    295 ãŒå¤‰æ›´ã•ã‚Œã‚‹ï¼Ž
    296 
    297 ä½¿ç”¨ã™ã‚‹å€‹åˆ¥ãƒ‘ッケージは,次の例のように,ターゲット非依存部の個別パッ
    298 ã‚±ãƒ¼ã‚¸ã‚’展開したのと同じディレクトリで展開する.
     51○目次
     52
     531.TOPPERS/ASPカーネルの概要
     54        1.1 TOPPERS/ASPカーネルの位置付け
     55        1.2 TOPPERS/ASPカーネルの仕様
     56        1.3 マイグレーションガイド
     57        1.4 機能拡張・チューニングガイド
     58        1.5 既知の問題
     59        1.6 Cygwin環境における注意事項
     602.ターゲット依存部
     61        2.1 ターゲット依存部の概要
     62        2.2 簡易パッケージ
     63        2.3 個別パッケージ
     643.クイックスタートガイド
     65        3.1 開発環境の準備
     66        3.2 コンフィギュレータの構築
     67        3.3 サンプルプログラムの構築と実行
     68        3.4 カーネルを関数単位でライブラリ化する方法
     69        3.5 アプリケーションとカーネルを別々に構築する方法
     704.ディレクトリ構成・ファイル構成
     71        4.1 配布パッケージのディレクトリ構成
     72        4.2 ターゲット非依存部のファイル構成
     735.コンフィギュレーションスクリプトの使い方
     746.Makefileの修正方法
     75        6.1 Makefileの変数定義
     76        6.2 コンパイルオプション
     777.コンフィギュレータの使い方
     788.システムサービス
     79        8.1 システムログ機能
     80                8.1.1 システムログ機能の位置付け
     81                8.1.2 ログバッファへの記録と低レベル出力
     82                8.1.3 ログ情報の種別
     83                8.1.4 ログ情報の重要度
     84                8.1.5 ログ情報のデータ構造
     85                8.1.6 システムログ機能のサービスコール
     86                8.1.7 システムログ機能のためのライブラリ関数とマクロ
     87                8.1.8 システムログ機能のその他のサービス
     88        8.2 シリアルインタフェースドライバ
     89                8.2.1 シリアルインタフェースドライバのサービスコール
     90                8.2.2 シリアルインタフェースドライバのその他のサービス
     91        8.3 システムログタスク
     92                8.3.1 システムログタスクのサービスコール
     93                8.3.2 システムログタスクのその他のサービス
     94        8.4 カーネル起動メッセージの出力
     959.サポートライブラリ
     96        9.1 基本的なライブラリ関数
     97        9.2 キュー操作ライブラリ関数
     98        9.3 システムログ出力用ライブラリ関数
     99        9.4 実行時間分布集計モジュール
     10010.テストプログラム
     101        10.1 テストプログラム用ライブラリ
     102        10.2 カーネルの整合性検査
     103        10.3 機能テストプログラム
     104        10.4 性能評価プログラム
     10511.使用上の注意とヒント
     106        11.1 タイマドライバの組込み
     107        11.2 assertマクロの処理
     108        11.3 システムログ機能の扱い
     109        11.4 オブジェクトIDの管理
     110        11.5 カーネルの内部シンボルのリネーム
     111        11.6 トレースログ記録のサンプルコードの使用方法
     112        11.7 システムの起動時の初期化処理
     113        11.8 rodataセクションをRAMに置く場合
     11412.参考情報
     115        12.1 利用条件と利用報告
     116        12.2 保証・適用性・サポート
     117        12.3 バグレポート
     118        12.4 ウェブサイト
     119        12.5 TOPPERSユーザーズメーリングリスト
     120        12.6 TOPPERSプロジェクトのメンバ向けのサービス
     121        12.7 TOPPERSプロジェクトへの参加
     12213.リファレンス
     123        13.1 サービスコール一覧
     124        13.2 静的API一覧
     125        13.3 バージョン履歴
     126
     127
     1281.TOPPERS/ASPカーネルの概要
     129
     1301.1 TOPPERS/ASPカーネルの位置付け
     131
     132TOPPERS/ASPカーネル(以下,ASPカーネル)は,TOPPERS新世代カーネルの基盤
     133となるものとして,TOPPERSプロジェクトにおいて開発したリアルタイムカーネ
     134ルである.μITRON4.0仕様のスタンダードプロファイル準拠のリアルタイムカー
     135ネルであるTOPPERS/JSPカーネルを拡張・改良する形で開発した.
     136
     1371.2 TOPPERS/ASPカーネルの仕様
     138
     139ASPカーネルの仕様の概要については,「TOPPERS/ASPカーネルの仕様概要」を
     140参照すること.また,ASPカーネルを含むTOPPERS新世代カーネルの仕様の詳細
     141については,別途PDFファイルの形で配布している「TOPPERS新世代カーネル統
     142合仕様書(Release 1.7.1)」を参照すること.
     143
     1441.3 マイグレーションガイド
     145
     146従来のTOPPERSカーネルや他のμITRON4.0仕様準拠のカーネルから,TOPPERS新
     147世代カーネルに移行するための方法(またはヒント)を説明した「TOPPERS新世
     148代カーネルへのマイグレーションガイド」を,別途PDFファイルの形で配布して
     149いる.必要に応じて参照すること.
     150
     1511.4 機能拡張・チューニングガイド
     152
     153TOPPERS/ASPカーネルを,機能拡張・チューニングするための方法(またはヒン
     154ト)を説明した「機能拡張・チューニングガイド」を用意している.拡張パッ
     155ケージの使用方法は,「機能拡張・チューニングガイド」に含まれている.必
     156要に応じて参照すること.
     157
     1581.5 既知の問題
     159
     160割込みサービスルーチンの先頭番地(ATT_ISRのisr),割込みハンドラの先頭
     161番地(DEF_INHのinthdr),CPU例外ハンドラの先頭番地(DEF_EXCのexchdr),
     162初期化ルーチンの先頭番地(ATT_INIのinirtn),終了処理ルーチンの先頭番地
     163(ATT_TERのterrtn)がプログラムの開始番地として正しくない場合のエラーは,
     164コンフィギュレータに検出されない場合がある(ターゲットに依存).
     165
     166kernel_cfg.c(およびcfg1_out.c)は,カーネル,システムサービス,アプリ
     167ケーションのいずれのインクルードファイルもインクルードし,いずれのシン
     168ボルも参照する可能性がある.そのため,カーネル,システムサービス,アプ
     169リケーションでシンボル等が衝突している場合や,コンパイルオプションが食
     170い違っている場合に,kernel_cfg.c(およびcfg1_out.c)が正しくコンパイル
     171できなくなる場合が考えられる.カーネルのシンボルをリネームするなどの方
     172法で軽減されてはいるが,問題がなくなっているわけではない.
     173
     174システムコンフィギュレーションファイルから,コンフィギュレータに対する
     175INCLUDEディレクティブにより他のコンフィギュレーションファイルをインクルー
     176ドしている場合に,その中に含まれるC言語プリプロセッサのインクルードディ
     177レクティブ(#include)で,コンフィギュレーションファイルの置かれている
     178ディレクトリが,ファイルを検索するパスにはいらないという問題がある.例
     179えば,syssvc/syslog.cfgに「#include "syslog.h"」と記述できないのは,こ
     180の問題があるためである.
     181
     182現時点では,アドレスが64ビットの環境には対応していない.64ビットアドレ
     183ス環境をサポートするための最大の課題は,モトローラSレコードフォーマット
     184が64ビットアドレスに対応していないことである.
     185
     1861.6 Cygwin環境における注意事項
     187
     188Cygwin環境においては,ディレクトリの指定を相対パスで行うことを推奨する.
     189これは,Cygwin環境の絶対パスは,Windowsネイティブでビルドされたツールは
     190解釈できないためである.
     191
     192
     1932.ターゲット依存部
     194
     1952.1 ターゲット依存部の概要
     196
     197ASPカーネルのターゲット非依存部と,各種のターゲットシステムに対応するた
     198めのターゲット依存部は,別々に開発されている.そのため,ASPカーネルが対
     199応しているすべてのターゲット依存部を,バージョンを整合させてパッケージ
     200化することは困難である.そこで,主に初級のユーザを対象にした簡易パッケー
     201ジと,上級のユーザやカーネル開発者を対象にした個別パッケージを用意して
     202いる.
     203
     204ASPカーネルを未サポートのターゲットシステムへポーティングするために必要
     205な作業は,開発環境の構築と標準の開発環境との差異の吸収,カーネル自身の
     206ポーティング,システムサービスのポーティングなどからなる.詳しくは,
     207「ターゲット依存部 ポーティングガイド」を参照すること.
     208
     2092.2 簡易パッケージ
     210
     211簡易パッケージは,ASPカーネルが対応しているターゲットシステム毎に用意さ
     212れ,そのターゲットシステム上でASPカーネルを動作させるために必要なファイ
     213ル一式をパッケージ化したものである.簡易パッケージに含まれるファイルは,
     214バージョンが整合していることが確認されている.
     215
     216簡易パッケージのバージョン番号は,パッケージ化した日付とすることを原則
     217とするが,ターゲットシステム毎の事情によりこの原則に従わない場合がある.
     218
     219簡易パッケージは,基本的には,次に説明する個別パッケージを複数まとめた
     220ものである.そのため,対象ターゲットシステムに必要のないファイルも含ま
     221れている.また,簡易パッケージに含まれている個別パッケージのバージョン
     222は,個別パッケージのMANIFESTファイルを参照することで知ることができる.
     223
     2242.3 個別パッケージ
     225
     226個別パッケージは,ASPカーネルの開発単位毎に,その開発単位で開発を担当し
     227ているファイル一式をパッケージ化したものである.ASPカーネルのターゲット
     228非依存部も,一つの個別パッケージとして配布される.ある個別パッケージを
     229使用するためには,一般には,他の個別パッケージが必要となる.ターゲット
     230依存部の個別パッケージを使用するために必要となる個別パッケージとそのバー
     231ジョンについては,ターゲット依存部のユーザーズマニュアルを参照すること.
     232使用する個別パッケージのバージョンを整合させることは,ユーザの責任であ
     233る.
     234
     235個別パッケージのバージョン番号は,X.Y.Zの形で表現される.ターゲット非依
     236存部のバージョン番号を,ASPカーネル全体のリリース番号とする.ターゲット
     237依存部のバージョン番号は,XとYが,それが依存するターゲット非依存部と一
     238致している.それに対して,Zは一致しているとは限らない.例えば,ターゲッ
     239ト非依存部のバージョン1.1.0に対応するターゲット依存部は,バージョン
     2401.1.Zの形となる.ターゲット依存部のみがバージョンアップした場合には,Z
     241が変更される.
     242
     243使用する個別パッケージは,次の例のように,ターゲット非依存部の個別パッ
     244ケージを展開したのと同じディレクトリで展開する.
    299245
    300246        % tar xvfz asp-1.1.0.tar.gz
    301247        % tar xvfz asp_arch_arm_gcc_1.1.2.tar.gz
    302248
    303 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã®å€‹åˆ¥ãƒ‘ッケージには,以下のターゲット依存部が含まれ
    304 ã¦ã„るが,これらは他のターゲットシステムにポーティングする際の参考にす
    305 ã‚‹ãŸã‚ã«ç”¨æ„ã—ているものであり,その動作については未検証である.
    306 
    307         target/dve68k_gcc       DVE-68K/40(GNU開発環境)用ターゲット依存部
    308         arch/m68k_gcc           M68040(GNU開発環境)用プロセッサ依存部
    309         pdic/upd72001           Î¼PD72001用 簡易SIOドライバ
    310 
    311 
    312 ï¼“.クイックスタートガイド
    313 
    314 ã“こでは,ターゲット依存部が用意されているターゲットシステム上で,ASPカー
    315 ãƒãƒ«ä¸Šã§å‹•ä½œã™ã‚‹ã‚µãƒ³ãƒ—ルプログラムを構築・動作させるまでの手順を示す.
    316 
    317 3.1 開発環境の準備
    318 
    319 ASPカーネルを用いたシステム構築には,以下のツールがå¿
    320 è¦ã§ã‚る.
    321 
    322         ホストシステム用のツール
    323                 perl            動作確認:5.10.0
    324                 GNU Make        動作確認:3.81
    325 
    326         TOPPERS新世代カーネル用コンフィギュレータ
    327                 cfg                     å‹•ä½œç¢ºèªï¼š1.9.4
    328                                         ※ 1.5以前のバージョンでは動作しない.
    329 
    330         ターゲットシステム用のツール(クロス開発環境)
    331                 標準規格に準拠したCコンパイラ
    332                 アセンブラ,リンカ,ライブラリアン
    333                 シンボルファイル出力ツール,ヘキサファイル出力ツール
    334                 標準Cライブラリ(å¿
    335 é ˆã§ã¯ãªã„)
    336 
    337 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚·ã‚¹ãƒ†ãƒ ç”¨ã®ãƒ„ールにGNU開発環境を用いる場合には,以下のツール
    338 ãŒå¿
    339 è¦ã§ã‚る.
    340 
    341         ターゲットシステム用のGNU開発環境ツール
    342                 BINUTILS(as,ld,ar,nm,ranlib,objcopy,objdump)
    343                 GCCまたはGCC-CORE(gccおよびそこから呼び出されるツール)
    344                 NEWLIB(標準Cライブラリ,å¿
    345 é ˆã§ã¯ãªã„)
    346 
    347 å‹•ä½œç¢ºèªã•ã‚Œã¦ã„るターゲットシステム用のツールについては,ターゲット依
    348 å­˜éƒ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’参ç
    349 §ã™ã‚‹ã“と.
    350 
    351 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚·ã‚¹ãƒ†ãƒ ç”¨ã®æ¨™æº–Cライブラリは,アプリケーションが標準Cライブ
    352 ãƒ©ãƒªã‚’使用しない場合には,å¿
    353 è¦ãªã„.ただし,コンパイラが標準Cライブラリ
    354 é–¢æ•°ï¼ˆmemcpy,memsetなど)を呼び出すコードを生成する場合があり,その場
    355 åˆã«ã¯æ¨™æº–Cライブラリがå¿
    356 è¦ã§ã‚る.標準Cライブラリを用意する代わりに,
    357 ç”Ÿæˆã—たコードが呼び出す関数のみを自分で用意してもよい.
    358 
    359 ä»¥ä¸‹ã§ã¯ï¼Œã“れらのツールが用意できていることを前提に,UNIXマシン上での
    360 æ§‹ç¯‰æ‰‹é †ã‚’説明する.また以下の説明では,makeコマンドがGNU Makeであるも
    361 ã®ã¨ã™ã‚‹ï¼ˆASPカーネルのサンプルのMakefileは,GNU Makeの拡張機能を用いて
    362 ã„る).
    363 
    364 3.2 コンフィギュレータの構築
    365 
    366 ã‚«ãƒ¼ãƒãƒ«ã‚’構築する前に,まず,TOPPERS新世代カーネル用コンフィギュレータ
    367 ã‚’構築するå¿
    368 è¦ãŒã‚る.簡易パッケージに含まれていた場合など,コンフィギュ
    369 ãƒ¬ãƒ¼ã‚¿ã‚’実行ファイル形式でå
    370 ¥æ‰‹ã—た場合には,このステップはå¿
    371 è¦ãªã„.
    372 
    373 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®æ§‹ç¯‰ã«ã¯ï¼Œä»¥ä¸‹ã®ãƒ„ールがå¿
    374 è¦ã§ã‚る.
    375 
    376         ホストシステム用のツール(セルフ開発環境)
    377                 C++コンパイラ,C++ライブラリ
    378                                         動作確認(Mac OS X環境):GNU C++ 4.2.1
    379                 Boost           å‹•ä½œç¢ºèªï¼š1.52.0
    380                 GNU Make        動作確認:3.81
    381 
    382 æœ€åˆã«ï¼Œãƒ‘ッケージにコンフィギュレータのソースファイルが含まれていない
    383 å ´åˆã«ã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ッケージを,ASPカーネルのソースファイル
    384 ã‚’展開したディレクトリの下に展開する.
     249ターゲット非依存部の個別パッケージには,以下のターゲット依存部が含まれ
     250ているが,これらは他のターゲットシステムにポーティングする際の参考にす
     251るために用意しているものであり,その動作については未検証である.
     252
     253        target/dve68k_gcc       DVE-68K/40(GNU開発環境)用ターゲット依存部
     254        arch/m68k_gcc           M68040(GNU開発環境)用プロセッサ依存部
     255        pdic/upd72001           μPD72001用 簡易SIOドライバ
     256
     257
     2583.クイックスタートガイド
     259
     260ここでは,ターゲット依存部が用意されているターゲットシステム上で,ASPカー
     261ネル上で動作するサンプルプログラムを構築・動作させるまでの手順を示す.
     262
     2633.1 開発環境の準備
     264
     265ASPカーネルを用いたシステム構築には,以下のツールが必要である.
     266
     267        ホストシステム用のツール
     268                perl            動作確認:5.10.0
     269                GNU Make        動作確認:3.81
     270
     271        TOPPERS新世代カーネル用コンフィギュレータ
     272                cfg                     動作確認:1.9.4
     273                                        ※ 1.5以前のバージョンでは動作しない.
     274
     275        ターゲットシステム用のツール(クロス開発環境)
     276                標準規格に準拠したCコンパイラ
     277                アセンブラ,リンカ,ライブラリアン
     278                シンボルファイル出力ツール,ヘキサファイル出力ツール
     279                標準Cライブラリ(必須ではない)
     280
     281ターゲットシステム用のツールにGNU開発環境を用いる場合には,以下のツール
     282が必要である.
     283
     284        ターゲットシステム用のGNU開発環境ツール
     285                BINUTILS(as,ld,ar,nm,ranlib,objcopy,objdump)
     286                GCCまたはGCC-CORE(gccおよびそこから呼び出されるツール)
     287                NEWLIB(標準Cライブラリ,必須ではない)
     288
     289動作確認されているターゲットシステム用のツールについては,ターゲット依
     290存部のユーザーズマニュアルを参照すること.
     291
     292ターゲットシステム用の標準Cライブラリは,アプリケーションが標準Cライブ
     293ラリを使用しない場合には,必要ない.ただし,コンパイラが標準Cライブラリ
     294関数(memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場
     295合には標準Cライブラリが必要である.標準Cライブラリを用意する代わりに,
     296生成したコードが呼び出す関数のみを自分で用意してもよい.
     297
     298以下では,これらのツールが用意できていることを前提に,UNIXマシン上での
     299構築手順を説明する.また以下の説明では,makeコマンドがGNU Makeであるも
     300のとする(ASPカーネルのサンプルのMakefileは,GNU Makeの拡張機能を用いて
     301いる).
     302
     3033.2 コンフィギュレータの構築
     304
     305カーネルを構築する前に,まず,TOPPERS新世代カーネル用コンフィギュレータ
     306を構築する必要がある.簡易パッケージに含まれていた場合など,コンフィギュ
     307レータを実行ファイル形式で入手した場合には,このステップは必要ない.
     308
     309コンフィギュレータの構築には,以下のツールが必要である.
     310
     311        ホストシステム用のツール(セルフ開発環境)
     312                C++コンパイラ,C++ライブラリ
     313                                        動作確認(Mac OS X環境):GNU C++ 4.2.1
     314                Boost           動作確認:1.52.0
     315                GNU Make        動作確認:3.81
     316
     317最初に,パッケージにコンフィギュレータのソースファイルが含まれていない
     318場合には,コンフィギュレータのパッケージを,ASPカーネルのソースファイル
     319を展開したディレクトリの下に展開する.
    385320
    386321        % cd asp
    387322        % tar xvfz cfg-1.9.4.tar.gz
    388323
    389 ã¾ãŸã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ッケージを他のディレクトリに展開し,ASPカー
    390 ãƒãƒ«ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’展開したディレクトリからシンボリックリンクをはっ
    391 ã¦ã‚‚よい.
    392 
    393 ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ãŒå±•é–‹ã§ãã‚‹ã¨ï¼Œcfgディレクトリに移動し,コンフィギュレー
    394 ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—ト(configure)でMakefileの環境依存部(Makefile.config)
    395 ã‚’生成した後,makeコマンドによりコンフィギュレータ(cfgプログラム)が構
    396 ç¯‰ã§ãã‚‹ï¼Ž
     324または,コンフィギュレータのパッケージを他のディレクトリに展開し,ASPカー
     325ネルのソースファイルを展開したディレクトリからシンボリックリンクをはっ
     326てもよい.
     327
     328ソースファイルが展開できると,cfgディレクトリに移動し,コンフィギュレー
     329ションスクリプト(configure)でMakefileの環境依存部(Makefile.config)
     330を生成した後,makeコマンドによりコンフィギュレータ(cfgプログラム)が構
     331築できる.
    397332
    398333        % cd cfg
     
    401336        % make
    402337
    403 ãŸã ã—,Boostをインストールしたディレクトリおよび名称が標準で想定してい
    404 ã‚‹ã‚‚のとは違う場合には,configureの--with-headersおよび--with-libraries
    405 ã‚ªãƒ—ションにより,ヘッダファイルおよびライブラリの置かれたディレクトリ
    406 ã‚’指定するå¿
    407 è¦ãŒã‚る.--without-xmlは,AUTOSAR XMLファイルの読み込み機
    408 èƒ½ï¼ˆASPカーネル用にはå¿
    409 è¦ãªã„)を取り込まないことを指定するオプションで
    410 ã‚る(AUTOSAR XMLファイルの読み込み機能を取り込むには,Xerces-C++ XML
    411 Parserがå¿
    412 è¦ã«ãªã‚‹ï¼‰ï¼Ž
    413 
    414 ã¾ãŸï¼Œãƒ›ã‚¹ãƒˆã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ã¯ï¼Œæœ€é©åŒ–レベルを上げると正しくコンパイル
    415 ã§ããªã„ことが知られている.そのような場合には,最適化レベルを下げるか,
    416 æœ€é©åŒ–を抑止するように,Makefileを修正するå¿
    417 è¦ãŒã‚る.
    418 
    419 ãªãŠï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ä½¿ç”¨æ–¹æ³•ã«ã¤ã„ては,「7.コンフィギュレータ
    420 ã®ä½¿ã„方」の章で説明する.
    421 
    422 3.3 サンプルプログラムの構築と実行
    423 
    424 æ¬¡ã«ï¼ŒASPカーネル上で動作するサンプルプログラムを構築する方法を説明する.
    425 
    426 ã¾ãšï¼Œã‚µãƒ³ãƒ—ルプログラムのオブジェクトファイルを置くディレクトリを作成
    427 ã—,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ
    428 ã‚¤ãƒ«ã‚’置くディレクトリを,ASPカーネルのソースファイルを展開したディレ
    429 ã‚¯ãƒˆãƒªã®ä¸‹ã®OBJという名称のディレクトリにする場合には,次のコマンドを
    430 å®Ÿè¡Œã™ã‚‹ï¼ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å ´æ‰€ã¨åç§°ã¯ä»»æ„ã«æ±ºã‚ã¦ã‚ˆã„).
     338ただし,Boostをインストールしたディレクトリおよび名称が標準で想定してい
     339るものとは違う場合には,configureの--with-headersおよび--with-libraries
     340オプションにより,ヘッダファイルおよびライブラリの置かれたディレクトリ
     341を指定する必要がある.--without-xmlは,AUTOSAR XMLファイルの読み込み機
     342能(ASPカーネル用には必要ない)を取り込まないことを指定するオプションで
     343ある(AUTOSAR XMLファイルの読み込み機能を取り込むには,Xerces-C++ XML
     344Parserが必要になる).
     345
     346また,ホストシステムによっては,最適化レベルを上げると正しくコンパイル
     347できないことが知られている.そのような場合には,最適化レベルを下げるか,
     348最適化を抑止するように,Makefileを修正する必要がある.
     349
     350なお,コンフィギュレータの使用方法については,「7.コンフィギュレータ
     351の使い方」の章で説明する.
     352
     3533.3 サンプルプログラムの構築と実行
     354
     355次に,ASPカーネル上で動作するサンプルプログラムを構築する方法を説明する.
     356
     357まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成
     358し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ
     359イルを置くディレクトリを,ASPカーネルのソースファイルを展開したディレ
     360クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを
     361実行する(ディレクトリの場所と名称は任意に決めてよい).
    431362
    432363        % cd asp
    433364        % mkdir OBJ
    434365        % cd OBJ
    435         % perl ../configure -T <ターゲット略称>
    436 
    437 ã“こで,<ターゲット略称>は,targetディレクトリの下に置かれているターゲッ
    438 ãƒˆä¾å­˜éƒ¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åç§°ã§ã‚る.コンフィギュレーションスクリプトのオ
    439 ãƒ—ションについては,「5.コンフィギュレーションスクリプトの使い方」の
    440 ç« ã§èª¬æ˜Žã™ã‚‹ï¼Ž
    441 
    442 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トの実行により,カレントディレクトリには,
    443 ã‚µãƒ³ãƒ—ルプログラムを構築するためのMakefile,サンプルプログラム用のコン
    444 ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆsample1.cfg),サンプルプログラム本体
    445 ï¼ˆsample1.hおよびsample1.c)が生成される.
    446 
    447 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トの実行後,å¿
    448 è¦ã§ã‚ればMakefileを修正す
    449 ã‚‹ï¼ŽMakefileの修正方法については,「6.Makefileの修正方法」の章で説明
    450 ã™ã‚‹ï¼Ž
    451 
    452 ãã®å¾Œï¼Œmake dependで依存関係ファイル(Makefile.depend)を生成した後,
    453 makeコマンドによりサンプルプログラムのロードモジュール(aspまたは
    454 asp.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる.
     366        % perl ../configure -T <ターゲット略称>
     367
     368ここで,<ターゲット略称>は,targetディレクトリの下に置かれているターゲッ
     369ト依存部ディレクトリの名称である.コンフィギュレーションスクリプトのオ
     370プションについては,「5.コンフィギュレーションスクリプトの使い方」の
     371章で説明する.
     372
     373コンフィギュレーションスクリプトの実行により,カレントディレクトリには,
     374サンプルプログラムを構築するためのMakefile,サンプルプログラム用のコン
     375フィギュレーションファイル(sample1.cfg),サンプルプログラム本体
     376(sample1.hおよびsample1.c)が生成される.
     377
     378コンフィギュレーションスクリプトの実行後,必要であればMakefileを修正す
     379る.Makefileの修正方法については,「6.Makefileの修正方法」の章で説明
     380する.
     381
     382その後,make dependで依存関係ファイル(Makefile.depend)を生成した後,
     383makeコマンドによりサンプルプログラムのロードモジュール(aspまたは
     384asp.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる.
    455385
    456386        % make depend
    457387        % make
    458388
    459 ã“こで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg)
    460 ã¯ï¼ŒASPカーネルの基本的な動作を確認するためのものである.このプログラ
    461 ãƒ ã®æ¦‚要説明は,sample1.cのå
    462 ˆé ­ã®ã‚³ãƒ¡ãƒ³ãƒˆã«ã‚る.
    463 
    464 3.4 カーネルを関数単位でライブラリ化する方法
    465 
    466 å‰ç¯€ã®æ‰‹é †ã§ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã‚’ファイル単位でコンパイルし,ライブラリ化して
    467 ã„たが,カーネルのコードサイズを縮小するためには,使用しないサービスコー
    468 ãƒ«ã¯ãƒªãƒ³ã‚¯ã—ない方が望ましい.そこでASPカーネルでは,カーネルを関数単位
    469 ã§ã‚³ãƒ³ãƒ‘イルし,ライブラリ化する方法を用意している.
    470 
    471 ã“の方法でサンプルプログラムを構築するには,コンフィギュレーションスク
    472 ãƒªãƒ—トに,それを指示するオプション(-f)を付加するだけでよい.
     389ここで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg)
     390は,ASPカーネルの基本的な動作を確認するためのものである.このプログラ
     391ムの概要説明は,sample1.cの先頭のコメントにある.
     392
     3933.4 カーネルを関数単位でライブラリ化する方法
     394
     395前節の手順では,カーネルをファイル単位でコンパイルし,ライブラリ化して
     396いたが,カーネルのコードサイズを縮小するためには,使用しないサービスコー
     397ルはリンクしない方が望ましい.そこでASPカーネルでは,カーネルを関数単位
     398でコンパイルし,ライブラリ化する方法を用意している.
     399
     400この方法でサンプルプログラムを構築するには,コンフィギュレーションスク
     401リプトに,それを指示するオプション(-f)を付加するだけでよい.
    473402
    474403        % mkdir OBJ_LIB
    475404        % cd OBJ_LIB
    476         % perl ../configure -T <ターゲット略称> -f
    477 
    478 ã“こで,OBJ_LIBというディレクトリの場所と名称は,任意に決めてよい.これ
    479 ä»¥é™ã®æ‰‹é †ã¯ï¼Œå‰ç¯€ã¨åŒã˜ã§ã‚る.
    480 
    481 3.5 アプリケーションとカーネルを別ã€
    482 ã«æ§‹ç¯‰ã™ã‚‹æ–¹æ³•
    483 
    484 å‰ç¯€ã§èª¬æ˜Žã—た方法では,アプリケーションとカーネルを同時に生成するため,
    485 ã‚ªãƒ–ジェクトファイルを置くディレクトリに非常に多くのファイルが作成され
    486 ã¦ï¼Œæ‰±ã„にくくなる.そこで,カーネルを修正する頻度が低い場合には,カー
    487 ãƒãƒ«ã¯äº‹å‰ã«æ§‹ç¯‰ã—ておき,後でアプリケーションだけを構築する方法を用意
    488 ã—ている.以下では,サンプルプログラムを構築を例に,その手順について説
    489 æ˜Žã™ã‚‹ï¼Ž
    490 
    491 ã¾ãšï¼Œã‚«ãƒ¼ãƒãƒ«ã‚’構築するディレクトリを作成し,コンフィギュレーションス
    492 ã‚¯ãƒªãƒ—トを実行する.例えば,カーネルを構築するディレクトリを,ASPカー
    493 ãƒãƒ«ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’展開したディレクトリの下のKERNEL_LIBという名称の
    494 ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行する(ディレクトリの場所
    495 ã¨åç§°ã¯ä»»æ„ã«æ±ºã‚ã¦ã‚ˆã„).
     405        % perl ../configure -T <ターゲット略称> -f
     406
     407ここで,OBJ_LIBというディレクトリの場所と名称は,任意に決めてよい.これ
     408以降の手順は,前節と同じである.
     409
     4103.5 アプリケーションとカーネルを別々に構築する方法
     411
     412前節で説明した方法では,アプリケーションとカーネルを同時に生成するため,
     413オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され
     414て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー
     415ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意
     416している.以下では,サンプルプログラムを構築を例に,その手順について説
     417明する.
     418
     419まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス
     420クリプトを実行する.例えば,カーネルを構築するディレクトリを,ASPカー
     421ネルのソースファイルを展開したディレクトリの下のKERNEL_LIBという名称の
     422ディレクトリにする場合には,次のコマンドを実行する(ディレクトリの場所
     423と名称は任意に決めてよい).
    496424
    497425        % mkdir KERNEL_LIB
    498426        % cd KERNEL_LIB
    499         % perl ../configure -T <ターゲット略称> -f
    500 
    501 ã“れにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg,
    502 sample1.h,sample1.cが生成されるが,Makefile以外は実質的には使用しない.
    503 
    504 make dependで依存関係ファイル(Makefile.depend)を生成した後,make
    505 libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる.
     427        % perl ../configure -T <ターゲット略称> -f
     428
     429これにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg,
     430sample1.h,sample1.cが生成されるが,Makefile以外は実質的には使用しない.
     431
     432make dependで依存関係ファイル(Makefile.depend)を生成した後,make
     433libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる.
    506434
    507435        % make depend
    508436        % make libkernel.a
    509437
    510 æ¬¡ã«ï¼Œã‚¢ãƒ—リケーションを構築するディレクトリを作成し,コンフィギュレー
    511 ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トを実行する.例えば,アプリケーションを構築するディレク
    512 ãƒˆãƒªã‚’,ASPカーネルのソースファイルを展開したディレクトリの下のAPLとい
    513 ã†åç§°ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行する(ディレクト
    514 ãƒªã®å ´æ‰€ã¨åç§°ã¯ä»»æ„ã«æ±ºã‚ã¦ã‚ˆã„).
     438次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー
     439ションスクリプトを実行する.例えば,アプリケーションを構築するディレク
     440トリを,ASPカーネルのソースファイルを展開したディレクトリの下のAPLとい
     441う名称のディレクトリにする場合には,次のコマンドを実行する(ディレクト
     442リの場所と名称は任意に決めてよい).
    515443
    516444        % cd ..
    517445        % mkdir APL
    518446        % cd APL
    519         % perl ../configure -T <ターゲット略称> -L ../KERNEL_LIB
    520 
    521 ã“こで-Lオプションには,カーネルを構築したディレクトリのパスを指定する.
    522 
    523 æœ€å¾Œã«ï¼Œmake dependで依存関係ファイル(Makefile.depend)を生成した後,
    524 makeコマンドによりサンプルプログラムのロードモジュール(aspまたは
    525 asp.exe)が生成できる.
     447        % perl ../configure -T <ターゲット略称> -L ../KERNEL_LIB
     448
     449ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する.
     450
     451最後に,make dependで依存関係ファイル(Makefile.depend)を生成した後,
     452makeコマンドによりサンプルプログラムのロードモジュール(aspまたは
     453asp.exe)が生成できる.
    526454
    527455        % make depend
    528456        % make
    529457
    530 ã“の手順では,アプリケーション構築時にはカーネルの再構築がå¿
    531 è¦ã‹ãƒã‚§ãƒƒ
    532 ã‚¯ã—ないため,カーネルのソースコードを修正した場合には,カーネルを構築
    533 ã—たディレクトリでmake libkernel.aを再実行するå¿
    534 è¦ãŒã‚る.
    535 
    536 ä»¥ä¸Šã§ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã¨ã‚¢ãƒ—リケーションを別ã€
    537 ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§æ§‹ç¯‰ã—たが,
    538 -Lオプションにカレントディレクトリ(ただし,"."という記述では不可)を指
    539 å®šã™ã‚‹ã“とで,カーネルとアプリケーションを同じディレクトリで別ã€
    540 ã«æ§‹ç¯‰
    541 ã™ã‚‹ã“ともできる.å
    542 ·ä½“的には,次の手順となる.
     458この手順では,アプリケーション構築時にはカーネルの再構築が必要かチェッ
     459クしないため,カーネルのソースコードを修正した場合には,カーネルを構築
     460したディレクトリでmake libkernel.aを再実行する必要がある.
     461
     462以上では,カーネルとアプリケーションを別々のディレクトリで構築したが,
     463-Lオプションにカレントディレクトリ(ただし,"."という記述では不可)を指
     464定することで,カーネルとアプリケーションを同じディレクトリで別々に構築
     465することもできる.具体的には,次の手順となる.
    543466
    544467        % mkdir OBJ
    545468        % cd OBJ
    546         % perl ../configure -T <ターゲット略称> -L ../OBJ
     469        % perl ../configure -T <ターゲット略称> -L ../OBJ
    547470        % make depend
    548471        % make libkernel.a
     
    550473        % make
    551474
    552 ã“こで,make cleankernelは,カーネルライブラリを生成するための中間ファ
    553 ã‚¤ãƒ«ã‚’削除するものである.この手順では,make dependによりカーネルライ
    554 ãƒ–ラリに関する依存関係を生成しないため,カーネルのソースコードを修正し
    555 ãŸå ´åˆã«ã¯ï¼Œå¿
    556 ãšmake cleankernel(または,make clean)してから,make
    557 libkernel.aするå¿
    558 è¦ãŒã‚るので注意すること.
    559 
    560 ãªãŠï¼Œmake realcleanすると,make dependとmakeにより生成したファイルをす
    561 ã¹ã¦å‰Šé™¤ã™ã‚‹ï¼Žãã‚Œã«å¯¾ã—て,make cleanでは,make dependにより生成した依
    562 å­˜é–¢ä¿‚ファイルは削除しない.
    563 
    564 
    565 ï¼”.ディレクトリ構成・ファイル構成
    566 
    567 4.1 é
    568 å¸ƒãƒ‘ッケージのディレクトリ構成
    569 
    570         include/                アプリケーション向けヘッダファイル
    571         kernel/                 ã‚«ãƒ¼ãƒãƒ«ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«
    572         syssvc/                 ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スのヘッダファイル,ソースファイル
    573         library/                サポートライブラリのソースファイル
    574         target/                 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
    575         arch/                   ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®å
    576 ±é€šéƒ¨åˆ†
    577                 gcc/            GCC開発環境依存部
    578                 logtrace/       ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°è¨˜éŒ²ã®ã‚µãƒ³ãƒ—ルコード
    579         pdic/                   PDIC(デバイスドライバのOS非依存部分)
    580         utils/                  ユーティリティプログラム
    581         sample/                 ã‚µãƒ³ãƒ—ルプログラムとMakefile
    582         doc/                    ドキュメント
    583         test/                   ãƒ†ã‚¹ãƒˆãƒ—ログラム
    584         extension/              拡張パッケージ
    585 
    586 4.2 ターゲット非依存部のファイル構成
    587 
    588 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ï¼ˆãƒ†ã‚¹ãƒˆãƒ—ログラムと拡張パッケージは除く)の各ファイ
    589 ãƒ«ã®æ¦‚要は次の通り.
    590 
    591         README.txt                      TOPPERS/ASPカーネルの簡単な紹介
    592         configure                       ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—ト(GNU開発環境用)
    593         MANIFEST                        個別パッケージのファイルリスト
     475ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ
     476イルを削除するものである.この手順では,make dependによりカーネルライ
     477ブラリに関する依存関係を生成しないため,カーネルのソースコードを修正し
     478た場合には,必ずmake cleankernel(または,make clean)してから,make
     479libkernel.aする必要があるので注意すること.
     480
     481なお,make realcleanすると,make dependとmakeにより生成したファイルをす
     482べて削除する.それに対して,make cleanでは,make dependにより生成した依
     483存関係ファイルは削除しない.
     484
     485
     4864.ディレクトリ構成・ファイル構成
     487
     4884.1 配布パッケージのディレクトリ構成
     489
     490        include/                アプリケーション向けヘッダファイル
     491        kernel/                 カーネルのソースファイル
     492        syssvc/                 システムサービスのヘッダファイル,ソースファイル
     493        library/                サポートライブラリのソースファイル
     494        target/                 ターゲット依存部
     495        arch/                   ターゲット依存部の共通部分
     496                gcc/            GCC開発環境依存部
     497                logtrace/       トレースログ記録のサンプルコード
     498        pdic/                   PDIC(デバイスドライバのOS非依存部分)
     499        utils/                  ユーティリティプログラム
     500        sample/                 サンプルプログラムとMakefile
     501        doc/                    ドキュメント
     502        test/                   テストプログラム
     503        extension/              拡張パッケージ
     504
     5054.2 ターゲット非依存部のファイル構成
     506
     507ターゲット非依存部(テストプログラムと拡張パッケージは除く)の各ファイ
     508ルの概要は次の通り.
     509
     510        README.txt                      TOPPERS/ASPカーネルの簡単な紹介
     511        configure                       コンフィギュレーションスクリプト(GNU開発環境用)
     512        MANIFEST                        個別パッケージのファイルリスト
    594513
    595514        include/
    596                 kernel.h                ASPカーネルを使用するための定義
    597                 sil.h                   ã‚·ã‚¹ãƒ†ãƒ ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ¬ã‚¤ãƒ¤ã‚’使用するための定義
    598                 t_stddef.h              TOPPERSå
    599 ±é€šãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«
    600                 itron.h                 ITRON仕様å
    601 ±é€šè¦å®šã®ãƒ‡ãƒ¼ã‚¿åž‹ãƒ»å®šæ•°ãƒ»ãƒžã‚¯ãƒ­
    602                 t_syslog.h              システムログ出力を行うための定義
    603                 t_stdlib.h              基本的なライブラリ関数を使用するための定義
    604                 queue.h                 ã‚­ãƒ¥ãƒ¼æ“ä½œãƒ©ã‚¤ãƒ–ラリを使用するための定義
    605                 test_lib.h              テストプログラム用ライブラリを使用するための定義
    606                 histogram.h             å®Ÿè¡Œæ™‚間分布集計モジュールを使用するための定義
    607                 log_output.h    システムログのフォーマット出力を使用するための定義
     515                kernel.h                ASPカーネルを使用するための定義
     516                sil.h                   システムインタフェースレイヤを使用するための定義
     517                t_stddef.h              TOPPERS共通ヘッダファイル
     518                itron.h                 ITRON仕様共通規定のデータ型・定数・マクロ
     519                t_syslog.h              システムログ出力を行うための定義
     520                t_stdlib.h              基本的なライブラリ関数を使用するための定義
     521                queue.h                 キュー操作ライブラリを使用するための定義
     522                test_lib.h              テストプログラム用ライブラリを使用するための定義
     523                histogram.h             実行時間分布集計モジュールを使用するための定義
     524                log_output.h    システムログのフォーマット出力を使用するための定義
    608525
    609526        kernel/
    610                 Makefile.kernel         ã‚«ãƒ¼ãƒãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«æ§‹æˆã®å®šç¾©
    611                 kernel_impl.h           ã‚«ãƒ¼ãƒãƒ«å®Ÿè£
    612 ç”¨æ¨™æº–ヘッダファイル
    613                 kernel_int.h            kernel_cfg.c用のヘッダファイル
    614                 kernel_rename.def       ã‚«ãƒ¼ãƒãƒ«ã®å†
    615 éƒ¨è­˜åˆ¥åã®ãƒªãƒãƒ¼ãƒ å®šç¾©
    616                 kernel_rename.h         ã‚«ãƒ¼ãƒãƒ«ã®å†
    617 éƒ¨è­˜åˆ¥åã®ãƒªãƒãƒ¼ãƒ 
    618                 kernel_unrename.h       ã‚«ãƒ¼ãƒãƒ«ã®å†
    619 éƒ¨è­˜åˆ¥åã®ãƒªãƒãƒ¼ãƒ è§£é™¤       
    620                 kernel_api.csv          コンフィギュレータの静的APIテーブル
    621                 kernel_def.csv          コンフィギュレータの値取得シンボルテーブル
    622                 kernel.tf                       ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス2のテンプレートファイル
    623                 kernel_check.tf         ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス3のテンプレートファイル
    624                 genoffset.tf            オフセットファイル生成用のテンプレートファイル
    625                 allfunc.h               ã™ã¹ã¦ã®é–¢æ•°ã‚’コンパイルするための定義
    626                 check.h                 ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯ç”¨ãƒžã‚¯ãƒ­
    627                 startup.c               ã‚«ãƒ¼ãƒãƒ«ã®åˆæœŸåŒ–と終了処理
    628                 task.h                  タスク操作ルーチン関連の定義
    629                 task.c                  タスク操作ルーチン
    630                 wait.h                  å¾
    631 ã¡çŠ¶æ
    632 ‹æ“ä½œãƒ«ãƒ¼ãƒãƒ³é–¢é€£ã®å®šç¾©
    633                 wait.c                  å¾
    634 ã¡çŠ¶æ
    635 ‹æ“ä½œãƒ«ãƒ¼ãƒãƒ³
    636                 time_event.h    タイムイベント管理関連の定義
    637                 time_event.c    タイムイベント管理
    638                 task_manage.c   ã‚¿ã‚¹ã‚¯ç®¡ç†æ©Ÿèƒ½
    639                 task_refer.c    タスク状æ
    640 ‹å‚ç
    641 §æ©Ÿèƒ½
    642                 task_sync.c             ã‚¿ã‚¹ã‚¯ä»˜å±žåŒæœŸæ©Ÿèƒ½
    643                 task_except.c   ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理機能
    644                 semaphore.h             ã‚»ãƒžãƒ•ã‚©æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
    645                 semaphore.c             ã‚»ãƒžãƒ•ã‚©æ©Ÿèƒ½
    646                 eventflag.h             ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
    647                 eventflag.c             ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ã‚°æ©Ÿèƒ½
    648                 dataqueue.h             ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
    649                 dataqueue.c             ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½
    650                 pridataq.h              優å
    651 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
    652                 pridataq.c              優å
    653 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½
    654                 mailbox.h               ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
    655                 mailbox.c               ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹æ©Ÿèƒ½
    656                 mempfix.h               å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール機能関連の定義
    657                 mempfix.c               å›ºå®šé•·ãƒ¡ãƒ¢ãƒªãƒ—ール機能
    658                 time_manage.c   ã‚·ã‚¹ãƒ†ãƒ æ™‚刻管理機能
    659                 cyclic.h                周期ハンドラ機能関連の定義
    660                 cyclic.c                周期ハンドラ機能
    661                 alarm.h                 ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
    662                 alarm.c                 ã‚¢ãƒ©ãƒ¼ãƒ ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½
    663                 sys_manage.c    システム状æ
    664 ‹ç®¡ç†æ©Ÿèƒ½
    665                 interrupt.h             å‰²è¾¼ã¿ç®¡ç†æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
    666                 interrupt.c             å‰²è¾¼ã¿ç®¡ç†æ©Ÿèƒ½
    667                 exception.h             CPU例外管理機能関連の定義
    668                 exception.c             CPU例外管理機能
     527                Makefile.kernel         カーネルのファイル構成の定義
     528                kernel_impl.h           カーネル実装用標準ヘッダファイル
     529                kernel_int.h            kernel_cfg.c用のヘッダファイル
     530                kernel_rename.def       カーネルの内部識別名のリネーム定義
     531                kernel_rename.h         カーネルの内部識別名のリネーム
     532                kernel_unrename.h       カーネルの内部識別名のリネーム解除       
     533                kernel_api.csv          コンフィギュレータの静的APIテーブル
     534                kernel_def.csv          コンフィギュレータの値取得シンボルテーブル
     535                kernel.tf                       コンフィギュレータのパス2のテンプレートファイル
     536                kernel_check.tf         コンフィギュレータのパス3のテンプレートファイル
     537                genoffset.tf            オフセットファイル生成用のテンプレートファイル
     538                allfunc.h               すべての関数をコンパイルするための定義
     539                check.h                 エラーチェック用マクロ
     540                startup.c               カーネルの初期化と終了処理
     541                task.h                  タスク操作ルーチン関連の定義
     542                task.c                  タスク操作ルーチン
     543                wait.h                  待ち状態操作ルーチン関連の定義
     544                wait.c                  待ち状態操作ルーチン
     545                time_event.h    タイムイベント管理関連の定義
     546                time_event.c    タイムイベント管理
     547                task_manage.c   タスク管理機能
     548                task_refer.c    タスク状態参照機能
     549                task_sync.c             タスク付属同期機能
     550                task_except.c   タスク例外処理機能
     551                semaphore.h             セマフォ機能関連の定義
     552                semaphore.c             セマフォ機能
     553                eventflag.h             イベントフラグ機能関連の定義
     554                eventflag.c             イベントフラグ機能
     555                dataqueue.h             データキュー機能関連の定義
     556                dataqueue.c             データキュー機能
     557                pridataq.h              優先度データキュー機能関連の定義
     558                pridataq.c              優先度データキュー機能
     559                mailbox.h               メールボックス機能関連の定義
     560                mailbox.c               メールボックス機能
     561                mempfix.h               固定長メモリプール機能関連の定義
     562                mempfix.c               固定長メモリプール機能
     563                time_manage.c   システム時刻管理機能
     564                cyclic.h                周期ハンドラ機能関連の定義
     565                cyclic.c                周期ハンドラ機能
     566                alarm.h                 アラームハンドラ機能関連の定義
     567                alarm.c                 アラームハンドラ機能
     568                sys_manage.c    システム状態管理機能
     569                interrupt.h             割込み管理機能関連の定義
     570                interrupt.c             割込み管理機能
     571                exception.h             CPU例外管理機能関連の定義
     572                exception.c             CPU例外管理機能
    669573
    670574        syssvc/
    671                 banner.h                カーネル起動メッセージの出力のための定義
    672                 banner.c                カーネル起動メッセージの出力
    673                 banner.cfg              カーネル起動メッセージの出力のコンフィギュレー
    674                                                 ションファイル
    675                 logtask.h               ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã‚’使用するための定義
    676                 logtask.c               ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯
    677                 logtask.cfg             ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«
    678                 serial.h                シリアルインタフェースドライバを使用するための定義
    679                 serial.c                シリアルインタフェースドライバ
    680                 serial.cfg              シリアルドライバのコンフィギュレーションファイル
    681                 syslog.h                システムログ機能を使用するための定義
    682                 syslog.c                システムログ機能
    683                 syslog.cfg              システムログ機能のコンフィギュレーションファイル
     575                banner.h                カーネル起動メッセージの出力のための定義
     576                banner.c                カーネル起動メッセージの出力
     577                banner.cfg              カーネル起動メッセージの出力のコンフィギュレー
     578                                                ションファイル
     579                logtask.h               システムログタスクを使用するための定義
     580                logtask.c               システムログタスク
     581                logtask.cfg             システムログタスクのコンフィギュレーションファイル
     582                serial.h                シリアルインタフェースドライバを使用するための定義
     583                serial.c                シリアルインタフェースドライバ
     584                serial.cfg              シリアルドライバのコンフィギュレーションファイル
     585                syslog.h                システムログ機能を使用するための定義
     586                syslog.c                システムログ機能
     587                syslog.cfg              システムログ機能のコンフィギュレーションファイル
    684588
    685589        library/
    686                 histogram.c             å®Ÿè¡Œæ™‚間分布集計モジュール
    687                 log_output.c    システムログのフォーマット出力
    688                 strerror.c              エラーメッセージ文字列を返す関数
    689                 t_perror.c              エラーメッセージの出力
    690                 test_lib.c              テストプログラム用ライブラリ
    691                 vasyslog.c              可変数引数のシステムログライブラリ
     590                histogram.c             実行時間分布集計モジュール
     591                log_output.c    システムログのフォーマット出力
     592                strerror.c              エラーメッセージ文字列を返す関数
     593                t_perror.c              エラーメッセージの出力
     594                test_lib.c              テストプログラム用ライブラリ
     595                vasyslog.c              可変数引数のシステムログライブラリ
    692596
    693597        arch/gcc/
    694                 MANIFEST                個別パッケージのファイルリスト
    695                 tool_stddef.h   t_stddef.hの開発環境依存部(GCC用)
     598                MANIFEST                個別パッケージのファイルリスト
     599                tool_stddef.h   t_stddef.hの開発環境依存部(GCC用)
    696600
    697601        arch/logtrace/
    698                 MANIFEST                個別パッケージのファイルリスト
    699                 trace_config.h  トレースログに関する設定
    700                 trace_config.c  トレースログ機能
    701                 trace_dump.c    トレースログのダンプ
     602                MANIFEST                個別パッケージのファイルリスト
     603                trace_config.h  トレースログに関する設定
     604                trace_config.c  トレースログ機能
     605                trace_dump.c    トレースログのダンプ
    702606
    703607        utils/
    704                 applyrename             ãƒ•ã‚¡ã‚¤ãƒ«ã«ãƒªãƒãƒ¼ãƒ ã‚’適用
    705                 genoffset               offset.hの生成(GNU開発環境用)
    706                 genrename               ãƒªãƒãƒ¼ãƒ ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ã®ç”Ÿæˆ
    707                 gentest                 ãƒ†ã‚¹ãƒˆãƒ—ログラムの生成
    708                 makedep                 ä¾å­˜é–¢ä¿‚リストの生成(GNU開発環境用)
    709                 makerelease             ãƒªãƒªãƒ¼ã‚¹ãƒ‘ッケージの生成
     608                applyrename             ファイルにリネームを適用
     609                genoffset               offset.hの生成(GNU開発環境用)
     610                genrename               リネームヘッダファイルの生成
     611                gentest                 テストプログラムの生成
     612                makedep                 依存関係リストの生成(GNU開発環境用)
     613                makerelease             リリースパッケージの生成
    710614
    711615        sample/
    712                 Makefile                サンプルのMakefile(GNU開発環境用)
    713                 sample1.h               ã‚µãƒ³ãƒ—ルプログラム(1)に関する定義
    714                 sample1.c               ã‚µãƒ³ãƒ—ルプログラム(1)
    715                 sample1.cfg             ã‚µãƒ³ãƒ—ルプログラム(1)のコンフィギュレーションファイル
     616                Makefile                サンプルのMakefile(GNU開発環境用)
     617                sample1.h               サンプルプログラム(1)に関する定義
     618                sample1.c               サンプルプログラム(1)
     619                sample1.cfg             サンプルプログラム(1)のコンフィギュレーションファイル
    716620
    717621        doc/
    718                 user.txt                        ユーザーズマニュアル
    719                 asp_spec.txt            TOPPERS/ASPカーネルの仕様概要
    720                 extension.txt           æ©Ÿèƒ½æ‹¡å¼µãƒ»ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°ã‚¬ã‚¤ãƒ‰
    721                 porting.txt                     ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ ポーティングガイド
    722                 configurator.txt        コンフィギュレータ仕様
    723                 design.txt                      設計メモ
    724                 version.txt                     å¤‰æ›´å±¥æ­´
    725 
    726 
    727 ï¼•ï¼Žã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トの使い方
    728 
    729 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—ト(configure)は,ASPカーネルおよびアプ
    730 ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãƒ—ログラムを構築するためにå¿
    731 è¦ãªåŸºæœ¬çš„なコンフィギュレーショ
    732 ãƒ³ã‚’行うためのプログラムである.
    733 
    734 ASPカーネルを用いてアプリケーションを作成する場合には,まずオブジェクト
    735 ãƒ•ã‚¡ã‚¤ãƒ«ã‚’置くディレクトリを作成し,そのディレクトリでコンフィギュレー
    736 ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トを実行する.オブジェクトファイルを置くディレクトリの場
    737 æ‰€ã¨åç§°ã¯ï¼Œä»»æ„ã«æ±ºã‚ã¦ã‚ˆã„.
    738 
    739 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トに対するオプションは次の通り.
    740 
    741         -T <ターゲット略称>
    742                 ターゲットシステムの名称を,targetディレクトリの下に置かれてい
    743                 るターゲット依存部ディレクトリの名称で指定する(å¿
    744 é ˆï¼‰ï¼Ž
    745 
    746         -A <アプリケーションプログラム名>
    747                 アプリケーションプログラムの名称を指定する.省略した場合には,
    748                 サンプルプログラム(sample1)となる.
    749 
    750         -a <アプリケーションのディレクトリ名>
    751                 アプリケーションプログラムのソースファイル(システムコンフィギュ
    752                 レーションファイルを除く)を置いたディレクトリ名を指定する.省
    753                 略した場合には,オブジェクトファイルを置くディレクトリに置かれ
    754                 ていることを仮定する.システムコンフィギュレーションファイルは,
    755                 オブジェクトファイルを置くディレクトリに置くこと.
    756 
    757         -U <オブジェクトファイル名>
    758                 アプリケーションプログラムのメインのオブジェクトファイル(-A
    759                 で指定したアプリケーションプログラム名に".o"を付加したもの)以
    760                 外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した
    761                 形で指定する.""で囲むことによって,複数のファイルを指定するこ
    762                 とも可能である(-Uオプションを複数使ってはならない).
    763 
    764         -L <カーネルライブラリのディレクトリ名>
    765                 事前に構築したカーネルライブラリ(libkernel.a)を用いて,アプリ
    766                 ケーションのみを構築する場合には,このオプションにカーネルライ
    767                 ブラリの置かれたディレクトリ名を指定する.このオプションの使用
    768                 例については,「3.5 アプリケーションとカーネルを別ã€
    769 ã«æ§‹ç¯‰ã™ã‚‹
    770                 方法」の節を参ç
    771 §ã™ã‚‹ã“と.
     622                user.txt                        ユーザーズマニュアル
     623                asp_spec.txt            TOPPERS/ASPカーネルの仕様概要
     624                extension.txt           機能拡張・チューニングガイド
     625                porting.txt                     ターゲット依存部 ポーティングガイド
     626                configurator.txt        コンフィギュレータ仕様
     627                design.txt                      設計メモ
     628                version.txt                     変更履歴
     629
     630
     6315.コンフィギュレーションスクリプトの使い方
     632
     633コンフィギュレーションスクリプト(configure)は,ASPカーネルおよびアプ
     634リケーションプログラムを構築するために必要な基本的なコンフィギュレーショ
     635ンを行うためのプログラムである.
     636
     637ASPカーネルを用いてアプリケーションを作成する場合には,まずオブジェクト
     638ファイルを置くディレクトリを作成し,そのディレクトリでコンフィギュレー
     639ションスクリプトを実行する.オブジェクトファイルを置くディレクトリの場
     640所と名称は,任意に決めてよい.
     641
     642コンフィギュレーションスクリプトに対するオプションは次の通り.
     643
     644        -T <ターゲット略称>
     645                ターゲットシステムの名称を,targetディレクトリの下に置かれてい
     646                るターゲット依存部ディレクトリの名称で指定する(必須).
     647
     648        -A <アプリケーションプログラム名>
     649                アプリケーションプログラムの名称を指定する.省略した場合には,
     650                サンプルプログラム(sample1)となる.
     651
     652        -a <アプリケーションのディレクトリ名>
     653                アプリケーションプログラムのソースファイル(システムコンフィギュ
     654                レーションファイルを除く)を置いたディレクトリ名を指定する.省
     655                略した場合には,オブジェクトファイルを置くディレクトリに置かれ
     656                ていることを仮定する.システムコンフィギュレーションファイルは,
     657                オブジェクトファイルを置くディレクトリに置くこと.
     658
     659        -U <オブジェクトファイル名>
     660                アプリケーションプログラムのメインのオブジェクトファイル(-A
     661                で指定したアプリケーションプログラム名に".o"を付加したもの)以
     662                外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した
     663                形で指定する.""で囲むことによって,複数のファイルを指定するこ
     664                とも可能である(-Uオプションを複数使ってはならない).
     665
     666        -L <カーネルライブラリのディレクトリ名>
     667                事前に構築したカーネルライブラリ(libkernel.a)を用いて,アプリ
     668                ケーションのみを構築する場合には,このオプションにカーネルライ
     669                ブラリの置かれたディレクトリ名を指定する.このオプションの使用
     670                例については,「3.5 アプリケーションとカーネルを別々に構築する
     671                方法」の節を参照すること.
    772672
    773673        -f
    774                 カーネルを関数単位でコンパイルしライブラリ化する場合に,このオ
    775                 プションを指定する.このオプションの使用例については,「3.4 カー
    776                 ネルを関数単位でライブラリ化する方法」の節を参ç
    777 §ã™ã‚‹ã“と.
    778 
    779         -D <ASPカーネルのソースディレクトリ名>
    780                 ASPカーネルのソースファイルを置いたディレクトリ名を指定する.省
    781                 略した場合には,configureの置かれているディレクトリとなる.
    782 
    783         -l <プログラミング言語>
    784                 アプリケーションプログラムのプログラミング言語を指定する.現時
    785                 点では,cとc++のみをサポートしている.
    786 
    787         -t <テンプレートディレクトリ名>
    788                 Makefileやサンプルプログラムのテンプレートの置かれたディレクト
    789                 リ名を指定する.省略した場合には,ASPカーネルのソースファイルを
    790                 置いたディレクトリの下のsampleディレクトリとなる.
    791 
    792         -m <テンプレートMakefile名>
    793                 Makefileのテンプレートとするファイル名を指定する.省略した場合
    794                 には,Makefileとなる.
    795 
    796         -d <実行環境名>
    797                 ターゲットシステム上でのプログラムの実行環境(ないしは,デバッ
    798                 グ環境)の名称を指定する.このオプションを指定すると,実行環境
    799                 を指定するシンボル(TOPPERS_<デバッグ環境名>)がマクロ定義され
    800                 る.省略した場合には,実行環境を指定するシンボルはマクロ定義さ
    801                 れない.
     674                カーネルを関数単位でコンパイルしライブラリ化する場合に,このオ
     675                プションを指定する.このオプションの使用例については,「3.4 カー
     676                ネルを関数単位でライブラリ化する方法」の節を参照すること.
     677
     678        -D <ASPカーネルのソースディレクトリ名>
     679                ASPカーネルのソースファイルを置いたディレクトリ名を指定する.省
     680                略した場合には,configureの置かれているディレクトリとなる.
     681
     682        -l <プログラミング言語>
     683                アプリケーションプログラムのプログラミング言語を指定する.現時
     684                点では,cとc++のみをサポートしている.
     685
     686        -t <テンプレートディレクトリ名>
     687                Makefileやサンプルプログラムのテンプレートの置かれたディレクト
     688                リ名を指定する.省略した場合には,ASPカーネルのソースファイルを
     689                置いたディレクトリの下のsampleディレクトリとなる.
     690
     691        -m <テンプレートMakefile名>
     692                Makefileのテンプレートとするファイル名を指定する.省略した場合
     693                には,Makefileとなる.
     694
     695        -d <実行環境名>
     696                ターゲットシステム上でのプログラムの実行環境(ないしは,デバッ
     697                グ環境)の名称を指定する.このオプションを指定すると,実行環境
     698                を指定するシンボル(TOPPERS_<デバッグ環境名>)がマクロ定義され
     699                る.省略した場合には,実行環境を指定するシンボルはマクロ定義さ
     700                れない.
    802701
    803702        -r
    804                 トレースログ記録のサンプルコードを有効にする場合に,このオプショ
    805                 ンを指定する.このオプションの使用例については,「11.6 トレース
    806                 ログ記録のサンプルコードの使用方法」の節を参ç
    807 §ã™ã‚‹ã“と.
    808 
    809         -p <perlのパス名>
    810                 perlのパス名を指定する.省略した場合には,/usr/local/binと
    811                 /usr/binを探索し,perlのパス名を決定する.
    812 
    813         -g <コンフィギュレータのパス名>
    814                 コンフィギュレータ(cfg)のパス名を指定する.省略した場合には,
    815                 デフォルトのパス名(ASPカーネルのソースディレクトリの下の
    816                 cfg/cfg/cfg)となる.
    817 
    818         -o <オプション文字列>
    819                 コンパイラに与えるオプション文字列で,シンボル定義以外のもの.
    820                 シンボル定義のオプションは,-Oオプションを使用する.オプション
    821                 文字列にスペースが含まれる場合には,"-O2 -Wall"のように,""で囲
    822                 んで記述するå¿
    823 è¦ãŒã‚る.
    824 
    825         -O <オプション文字列>
    826                 コンパイラに与えるシンボル定義のためのオプション文字列.オプショ
    827                 ン文字列にスペースが含まれる場合には,"-DTEST -DPERF"のように,
    828                 ""で囲んで記述するå¿
    829 è¦ãŒã‚る.
    830 
    831         -k <オプション文字列>
    832                 リンカに与えるオプション文字列.オプション文字列にスペースが含
    833                 まれる場合には,""で囲んで記述するå¿
    834 è¦ãŒã‚る.
    835 
    836 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トが行う処理は次の通りである.
    837 
    838 (1) Makefileの生成
    839 
    840 ãƒ†ãƒ³ãƒ—レートディレクトリ(デフォルトでは,sample)から適切なMakefileを
    841 é¸æŠžã—,å¿
    842 è¦ãªç®‡æ‰€ã‚’書き換えて,Makefileを生成する.
    843 
    844 (2) サンプルプログラムの生成
    845 
    846 æŒ‡å®šã—たアプリケーションプログラムがテンプレートディレクトリにある場合,
    847 é©åˆ‡ãªã‚¢ãƒ—リケーションプログラムのソースファイルを選択し,å¿
    848 è¦ãªç®‡æ‰€ã‚’
    849 æ›¸ãæ›ãˆã¦ï¼Œã‚¢ãƒ—リケーションプログラムのソースファイル(例えば,
    850 sample1.h,sample1.c,sample1.cfg)を生成する.
    851 
    852 (3) コンフィギュレータが用意できているかのチェック
    853 
    854 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ï¼ˆcfg)の実行ファイルがあるかチェックし,ファイルがな
    855 ã„場合には,その旨を出力する.
    856 
    857 
    858 ï¼–.Makefileの修正方法
    859 
    860 å‰ã®ç« ã§èª¬æ˜Žã—たように,コンフィギュレーションスクリプトに与えるオプショ
    861 ãƒ³ç­‰ã‹ã‚‰Makefileが生成されるが,コンフィギュレーションスクリプトで対応
    862 ã§ããªã„場合には,Makefileを直接修正するå¿
    863 è¦ãŒã‚る.ここでは,Makefile
    864 ã®ä¸­ã§ï¼Œä¿®æ­£ãŒå¿
    865 è¦ã¨ãªã‚‹å¯èƒ½æ€§ã®é«˜ã„箇所について説明する.
    866 
    867 ãªãŠï¼ŒMakefileを修正した後にコンフィギュレーションスクリプトを再実行す
    868 ã‚‹ã¨ï¼Œä¿®æ­£ã—たMakefileが上書きされてしまうので注意すること(古いものが
    869 Makefile.bakに保存される).
    870 
    871 6.1 Makefileの変数定義
    872 
    873 (A) ターゲット略称
    874 
    875 TARGETには,ターゲットシステムの名称を,targetディレクトリの下に置かれ
    876 ã¦ã„るターゲット依存部ディレクトリの名称で指定する.この定義は,通常は,
    877 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トに対する-Tオプションにより行う.
    878 
    879 (B) オブジェクトファイルの拡張子
    880 
    881 Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義するå¿
    882 è¦ãŒã‚る.こ
    883 ã‚Œã¯ï¼ŒCygwin環境では,ロードモジュールのファイル名に拡張子".exe"が付加
    884 ã•ã‚Œã‚‹ã®ã«å¯¾å¿œã™ã‚‹ãŸã‚ã®ã‚‚のである.Cygwin環境であることを判定できれば,
    885 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トがこの定義を行う.
    886 
    887 (C) 実行環境(ターゲット依存)
    888 
    889 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ã‚ˆã£ã¦ã¯ï¼Œå®Ÿè¡Œç’°å¢ƒã«å¯¾å¿œã—てターゲット依存部のコードを差し
    890 æ›ãˆã‚‹å ´åˆãŒã‚る.これを可能にするために,実行環境の名称をDBGENVに定義
    891 ã—ている.この定義は,通常は,コンフィギュレーションスクリプトに対す
    892 ã‚‹-Dオプションにより行う.どのターゲットがどの実行環境に対応しているか
    893 ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’参ç
    894 §ã™ã‚‹ã“と.
    895 
    896 (D) カーネルライブラリのディレクトリ名
    897 
    898 KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する.
    899 ã“の定義は,通常は,コンフィギュレーションスクリプトに対する-Lオプショ
    900 ãƒ³ã«ã‚ˆã‚Šè¡Œã†ï¼Ž
    901 
    902 (E) カーネルを関数単位でコンパイルするかどうか
    903 
    904 KERNEL_FUNCOBJSは,カーネルを関数単位でコンパイルする場合にはtrueに定義
    905 ã—,ファイル単位でコンパイルする場合には未定義とする.この定義は,通常
    906 ã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トに対する-fオプションにより行う.
    907 
    908 (F) å
    909 ±é€šã‚³ãƒ³ãƒ‘イルオプション
    910 
    911 ã™ã¹ã¦ã®ãƒ—ログラムにå
    912 ±é€šã™ã‚‹ã‚³ãƒ³ãƒ‘イルオプションの追加がå¿
    913 è¦ãªå ´åˆã«ã¯ï¼Œ
    914 ä¸‹ã®å¤‰æ•°ã®å®šç¾©ã‚’変更する.そのコンパイルオプションが,特定のターゲット
    915 ã§å¸¸ã«å¿
    916 è¦ãªå ´åˆã«ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®å®šç¾©ã‚’å
    917 ¥ã‚ŒãŸMakefile.target等を修
    918 æ­£ã™ã¹ãã§ã‚る.
    919 
    920         CDEFS           ã‚³ãƒ³ãƒ‘イラに対する-Dオプションを記述する.
    921         INCLUDES        コンパイラに対する-Iオプションを記述する.
    922         COPTS           ã‚³ãƒ³ãƒ‘イラに対するその他のオプションを記述する.
    923         LDFLAGS         ãƒªãƒ³ã‚«ã«å¯¾ã™ã‚‹ã‚ªãƒ—ションを記述する.
    924         LIBS            ライブラリリンクのためのオプションを記述する.
    925 
    926 è¿½åŠ ã®å¯èƒ½æ€§ã®ã‚るコンパイルオプションについては,「6.2 コンパイルオプ
    927 ã‚·ãƒ§ãƒ³ã€ã®ç¯€ã‚’参ç
    928 §ã®ã“と.
    929 
    930 (G) アプリケーションプログラム名
    931 
    932 APPLNAMEには,アプリケーションプログラム名を定義する.システムコンフィ
    933 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«åã¯ï¼ŒAPPLNAMEに定義した名前に拡張子".cfg"を付加
    934 ã—た名前とする.また,アプリケーションのメインファイルは,APPLNAMEに定
    935 ç¾©ã—た名前に拡張子".c"を付加した名前とする.この定義は,通常は,コンフィ
    936 ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トに対する-Aオプションにより行う.
    937 
    938 (H) アプリケーションのディレクトリ名
    939 
    940 ã‚¢ãƒ—リケーションのソースファイルを,オブジェクトファイルを置くのとは別
    941 ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç½®ãå ´åˆã«ã¯ï¼ŒAPPLDIRにそのディレクトリ名を定義する.こ
    942 ã®å®šç¾©ã¯ï¼Œé€šå¸¸ã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トに対する-aオプション
    943 ã«ã‚ˆã‚Šè¡Œã†ï¼Žã‚¢ãƒ—リケーションのソースファイルを置くディレクトリが複数あ
    944 ã‚‹å ´åˆã«ã¯ï¼ŒAPPL_DIRの定義を変更することで対応する.
    945 
    946 (I) アプリケーションのプログラムファイル名
    947 
    948 ã‚¢ãƒ—リケーションが複数のソースファイルで構成される場合には,そのオブジェ
    949 ã‚¯ãƒˆãƒ•ã‚¡ã‚¤ãƒ«åã‚’,APPL_ASMOBJS,APPL_COBJS,APPL_CXXOBJSに列挙する.
    950 
    951 (J) アプリケーションのコンパイルオプション
    952 
    953 ã‚¢ãƒ—リケーションのコンパイルにå¿
    954 è¦ãªã‚³ãƒ³ãƒ‘イルオプションや,アプリケー
    955 ã‚·ãƒ§ãƒ³ãŒãƒ©ã‚¤ãƒ–ラリをå¿
    956 è¦ã¨ã™ã‚‹å ´åˆã«ã¯ï¼ŒAPPL_CFLAGSおよびAPPL_LIBSに定
    957 ç¾©ã™ã‚‹ï¼Ž
    958 
    959 (K) ロードモジュールのファイル名
    960 
    961 æ¨™æº–のロードモジュールのファイル名をOBJNAMEに定義する.デフォルトはasp
    962 ã§ã‚る.
    963 
    964 (L) ターゲットファイルの定義
    965 
    966 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆ"all"の依存ファイルとして,ロードモジュールの形式を指定する.
    967 å
    968 ·ä½“的には,ELF形式の時は$(OBJFILE),バイナリ形式の時は$(OBJNAME).bin,
    969 ãƒ¢ãƒˆãƒ­ãƒ¼ãƒ© S形式の時は$(OBJNAME).srecを指定する.$(OBJFILE)は,Cygwin
    970 ç’°å¢ƒã§OBJEXTを"exe"に定義した時には$(OBJNAME).exe,そうでない場合には
    971 $(OBJNAME)となる.
    972 
    973 (M) makedepのオプションの定義
    974 
    975 Cygwin環境でルートディレクトリが"cygdrive"でない場合には,makedepの-Rオ
    976 ãƒ—ションでルートディレクトリ名を与えるå¿
    977 è¦ãŒã‚る.また,Makefileのター
    978 ã‚²ãƒƒãƒˆéƒ¨ï¼ˆ":"の左側)に複数のファイル名を記述すると(カーネルを関数単位
    979 ã§ãƒ©ã‚¤ãƒ–ラリ化する場合に,このような記述が生成される)正しく動作しない
    980 å ´åˆã«ã¯ï¼ˆCygwin環境のGNU Makeでこのような制限があるという報告がある),
    981 makedepに-Sオプションを付与するå¿
    982 è¦ãŒã‚る.
    983 
    984 makedepのオプションは,次の例のように,MAKEDEP_OPTSに定義する.
     703                トレースログ記録のサンプルコードを有効にする場合に,このオプショ
     704                ンを指定する.このオプションの使用例については,「11.6 トレース
     705                ログ記録のサンプルコードの使用方法」の節を参照すること.
     706
     707        -p <perlのパス名>
     708                perlのパス名を指定する.省略した場合には,/usr/local/binと
     709                /usr/binを探索し,perlのパス名を決定する.
     710
     711        -g <コンフィギュレータのパス名>
     712                コンフィギュレータ(cfg)のパス名を指定する.省略した場合には,
     713                デフォルトのパス名(ASPカーネルのソースディレクトリの下の
     714                cfg/cfg/cfg)となる.
     715
     716        -o <オプション文字列>
     717                コンパイラに与えるオプション文字列で,シンボル定義以外のもの.
     718                シンボル定義のオプションは,-Oオプションを使用する.オプション
     719                文字列にスペースが含まれる場合には,"-O2 -Wall"のように,""で囲
     720                んで記述する必要がある.
     721
     722        -O <オプション文字列>
     723                コンパイラに与えるシンボル定義のためのオプション文字列.オプショ
     724                ン文字列にスペースが含まれる場合には,"-DTEST -DPERF"のように,
     725                ""で囲んで記述する必要がある.
     726
     727        -k <オプション文字列>
     728                リンカに与えるオプション文字列.オプション文字列にスペースが含
     729                まれる場合には,""で囲んで記述する必要がある.
     730
     731コンフィギュレーションスクリプトが行う処理は次の通りである.
     732
     733(1) Makefileの生成
     734
     735テンプレートディレクトリ(デフォルトでは,sample)から適切なMakefileを
     736選択し,必要な箇所を書き換えて,Makefileを生成する.
     737
     738(2) サンプルプログラムの生成
     739
     740指定したアプリケーションプログラムがテンプレートディレクトリにある場合,
     741適切なアプリケーションプログラムのソースファイルを選択し,必要な箇所を
     742書き換えて,アプリケーションプログラムのソースファイル(例えば,
     743sample1.h,sample1.c,sample1.cfg)を生成する.
     744
     745(3) コンフィギュレータが用意できているかのチェック
     746
     747コンフィギュレータ(cfg)の実行ファイルがあるかチェックし,ファイルがな
     748い場合には,その旨を出力する.
     749
     750
     7516.Makefileの修正方法
     752
     753前の章で説明したように,コンフィギュレーションスクリプトに与えるオプショ
     754ン等からMakefileが生成されるが,コンフィギュレーションスクリプトで対応
     755できない場合には,Makefileを直接修正する必要がある.ここでは,Makefile
     756の中で,修正が必要となる可能性の高い箇所について説明する.
     757
     758なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す
     759ると,修正したMakefileが上書きされてしまうので注意すること(古いものが
     760Makefile.bakに保存される).
     761
     7626.1 Makefileの変数定義
     763
     764(A) ターゲット略称
     765
     766TARGETには,ターゲットシステムの名称を,targetディレクトリの下に置かれ
     767ているターゲット依存部ディレクトリの名称で指定する.この定義は,通常は,
     768コンフィギュレーションスクリプトに対する-Tオプションにより行う.
     769
     770(B) オブジェクトファイルの拡張子
     771
     772Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義する必要がある.こ
     773れは,Cygwin環境では,ロードモジュールのファイル名に拡張子".exe"が付加
     774されるのに対応するためのものである.Cygwin環境であることを判定できれば,
     775コンフィギュレーションスクリプトがこの定義を行う.
     776
     777(C) 実行環境(ターゲット依存)
     778
     779ターゲットによっては,実行環境に対応してターゲット依存部のコードを差し
     780換える場合がある.これを可能にするために,実行環境の名称をDBGENVに定義
     781している.この定義は,通常は,コンフィギュレーションスクリプトに対す
     782る-Dオプションにより行う.どのターゲットがどの実行環境に対応しているか
     783は,ターゲット依存部のユーザーズマニュアルを参照すること.
     784
     785(D) カーネルライブラリのディレクトリ名
     786
     787KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する.
     788この定義は,通常は,コンフィギュレーションスクリプトに対する-Lオプショ
     789ンにより行う.
     790
     791(E) カーネルを関数単位でコンパイルするかどうか
     792
     793KERNEL_FUNCOBJSは,カーネルを関数単位でコンパイルする場合にはtrueに定義
     794し,ファイル単位でコンパイルする場合には未定義とする.この定義は,通常
     795は,コンフィギュレーションスクリプトに対する-fオプションにより行う.
     796
     797(F) 共通コンパイルオプション
     798
     799すべてのプログラムに共通するコンパイルオプションの追加が必要な場合には,
     800下の変数の定義を変更する.そのコンパイルオプションが,特定のターゲット
     801で常に必要な場合には,ターゲット依存の定義を入れたMakefile.target等を修
     802正すべきである.
     803
     804        CDEFS           コンパイラに対する-Dオプションを記述する.
     805        INCLUDES        コンパイラに対する-Iオプションを記述する.
     806        COPTS           コンパイラに対するその他のオプションを記述する.
     807        LDFLAGS         リンカに対するオプションを記述する.
     808        LIBS            ライブラリリンクのためのオプションを記述する.
     809
     810追加の可能性のあるコンパイルオプションについては,「6.2 コンパイルオプ
     811ション」の節を参照のこと.
     812
     813(G) アプリケーションプログラム名
     814
     815APPLNAMEには,アプリケーションプログラム名を定義する.システムコンフィ
     816ギュレーションファイル名は,APPLNAMEに定義した名前に拡張子".cfg"を付加
     817した名前とする.また,アプリケーションのメインファイルは,APPLNAMEに定
     818義した名前に拡張子".c"を付加した名前とする.この定義は,通常は,コンフィ
     819ギュレーションスクリプトに対する-Aオプションにより行う.
     820
     821(H) アプリケーションのディレクトリ名
     822
     823アプリケーションのソースファイルを,オブジェクトファイルを置くのとは別
     824のディレクトリに置く場合には,APPLDIRにそのディレクトリ名を定義する.こ
     825の定義は,通常は,コンフィギュレーションスクリプトに対する-aオプション
     826により行う.アプリケーションのソースファイルを置くディレクトリが複数あ
     827る場合には,APPL_DIRの定義を変更することで対応する.
     828
     829(I) アプリケーションのプログラムファイル名
     830
     831アプリケーションが複数のソースファイルで構成される場合には,そのオブジェ
     832クトファイル名を,APPL_ASMOBJS,APPL_COBJS,APPL_CXXOBJSに列挙する.
     833
     834(J) アプリケーションのコンパイルオプション
     835
     836アプリケーションのコンパイルに必要なコンパイルオプションや,アプリケー
     837ションがライブラリを必要とする場合には,APPL_CFLAGSおよびAPPL_LIBSに定
     838義する.
     839
     840(K) ロードモジュールのファイル名
     841
     842標準のロードモジュールのファイル名をOBJNAMEに定義する.デフォルトはasp
     843である.
     844
     845(L) ターゲットファイルの定義
     846
     847ターゲット"all"の依存ファイルとして,ロードモジュールの形式を指定する.
     848具体的には,ELF形式の時は$(OBJFILE),バイナリ形式の時は$(OBJNAME).bin,
     849モトローラ S形式の時は$(OBJNAME).srecを指定する.$(OBJFILE)は,Cygwin
     850環境でOBJEXTを"exe"に定義した時には$(OBJNAME).exe,そうでない場合には
     851$(OBJNAME)となる.
     852
     853(M) makedepのオプションの定義
     854
     855Cygwin環境でルートディレクトリが"cygdrive"でない場合には,makedepの-Rオ
     856プションでルートディレクトリ名を与える必要がある.また,Makefileのター
     857ゲット部(":"の左側)に複数のファイル名を記述すると(カーネルを関数単位
     858でライブラリ化する場合に,このような記述が生成される)正しく動作しない
     859場合には(Cygwin環境のGNU Makeでこのような制限があるという報告がある),
     860makedepに-Sオプションを付与する必要がある.
     861
     862makedepのオプションは,次の例のように,MAKEDEP_OPTSに定義する.
    985863
    986864MAKEDEP_OPTS = -R cygdrive -S
    987865
    988 6.2 コンパイルオプション
    989 
    990 ASPカーネルのコード中には,assertマクロが使われている.assertマクロは,
    991 NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー
    992 ãƒãƒ«ã®ãƒ‡ãƒãƒƒã‚°ãŒçµ‚了すれば,-DNDEBUGを指定してコンパイルした方が効率が
    993 ã‚ˆããªã‚‹ï¼Ž
    994 
    995 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã«ãŠã„て,コンパイルオプションに-Werror(警告をエラー扱
    996 ã„する)を指定している場合がある.そのようなターゲットにおいて,アプリ
    997 ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§è­¦å‘ŠãŒé¿ã‘られない場合には,ターゲット依存部を修正してコン
    998 ãƒ‘イルオプションを削除するå¿
    999 è¦ãŒã‚る.
    1000 
    1001 ã¾ãŸï¼ŒTOPPERS_OMIT_SYSLOGを定義してコンパイルすることで,システムログ出
    1002 åŠ›ã‚’抑止することができる.
    1003 
    1004 
    1005 ï¼—.コンフィギュレータの使い方
    1006 
    1007 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ï¼ˆcfg)は,TOPPERS新世代カーネル統合仕様書の2.12.5節
    1008 ã®è¨˜è¿°ã®é€šã‚Šï¼Œ3つのパスで構成される.
    1009 
    1010 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«åã‚’パラメー
    1011 ã‚¿ã«å–り,以下のオプションを持つ(重要なもののみ).
     8666.2 コンパイルオプション
     867
     868ASPカーネルのコード中には,assertマクロが使われている.assertマクロは,
     869NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー
     870ネルのデバッグが終了すれば,-DNDEBUGを指定してコンパイルした方が効率が
     871よくなる.
     872
     873ターゲット依存部において,コンパイルオプションに-Werror(警告をエラー扱
     874いする)を指定している場合がある.そのようなターゲットにおいて,アプリ
     875ケーションで警告が避けられない場合には,ターゲット依存部を修正してコン
     876パイルオプションを削除する必要がある.
     877
     878また,TOPPERS_OMIT_SYSLOGを定義してコンパイルすることで,システムログ出
     879力を抑止することができる.
     880
     881
     8827.コンフィギュレータの使い方
     883
     884コンフィギュレータ(cfg)は,TOPPERS新世代カーネル統合仕様書の2.12.5節
     885の記述の通り,3つのパスで構成される.
     886
     887コンフィギュレータは,システムコンフィギュレーションファイル名をパラメー
     888タに取り,以下のオプションを持つ(重要なもののみ).
    1012889
    1013890        --help
    1014                 オプションのリストと説明を表示する.
    1015 
    1016         -vï¼»--versionï¼½
    1017                 コンフィギュレータのバージョンを表示する.
    1018 
    1019         -kï¼»--kernelï¼½<カーネル名>
    1020                 カーネルの名称を指定する.デフォルトはasp.
    1021 
    1022         -pï¼»--passï¼½<パス番号>
    1023                 パス番号を指定する.1~3のいずれか.
    1024 
    1025         -Iï¼»--include-pathï¼½<インクルードパス名>
    1026                 INCLUDEディレクティブにおいて,インクルードするコンフィギュレー
    1027                 ションファイルを探すパス名を指定する.
    1028 
    1029         -Tï¼»--template-fileï¼½<テンプレートファイル名>
    1030                 テンプレートファイルの名称を指定する.パス2とパス3で有効.
    1031 
    1032         --api-table <静的APIテーブルファイル名>
    1033                 静的APIテーブルのファイル名を指定する.
    1034 
    1035         --cfg1-def-table <値取得シンボルテーブルファイル名>
    1036                 値取得シンボルテーブルのファイル名を指定する.
    1037 
    1038         -rï¼»--rom-imageï¼½<ロードモジュール名>
    1039                 ロードモジュールをSレコードフォーマットの形に変換したファイルの
    1040                 名称を指定する.パス3でのみ有効.
    1041 
    1042         -s [--symbol-table] <シンボルファイル名>
    1043                 ロードモジュール中の各シンボルとアドレスの対応表を含むシンボル
    1044                 ファイルの名称を指定する.パス3でのみ有効.
    1045 
    1046         --id-output-file <ID番号出力ファイル名>
    1047                 オブジェクトのID番号の割付け結果を,指定した名前のファイルに書
    1048                 き出す.パス2でのみ有効.
    1049 
    1050         --id-input-file <ID番号å
    1051 ¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«å>
    1052                 オブジェクトのID番号の割付けを,指定した名前のファイルから取り
    1053                 込む.パス2でのみ有効.
     891                オプションのリストと説明を表示する.
     892
     893        -v[--version]
     894                コンフィギュレータのバージョンを表示する.
     895
     896        -k[--kernel]<カーネル名>
     897                カーネルの名称を指定する.デフォルトはasp.
     898
     899        -p[--pass]<パス番号>
     900                パス番号を指定する.1~3のいずれか.
     901
     902        -I[--include-path]<インクルードパス名>
     903                INCLUDEディレクティブにおいて,インクルードするコンフィギュレー
     904                ションファイルを探すパス名を指定する.
     905
     906        -T[--template-file]<テンプレートファイル名>
     907                テンプレートファイルの名称を指定する.パス2とパス3で有効.
     908
     909        --api-table <静的APIテーブルファイル名>
     910                静的APIテーブルのファイル名を指定する.
     911
     912        --cfg1-def-table <値取得シンボルテーブルファイル名>
     913                値取得シンボルテーブルのファイル名を指定する.
     914
     915        -r[--rom-image]<ロードモジュール名>
     916                ロードモジュールをSレコードフォーマットの形に変換したファイルの
     917                名称を指定する.パス3でのみ有効.
     918
     919        -s [--symbol-table] <シンボルファイル名>
     920                ロードモジュール中の各シンボルとアドレスの対応表を含むシンボル
     921                ファイルの名称を指定する.パス3でのみ有効.
     922
     923        --id-output-file <ID番号出力ファイル名>
     924                オブジェクトのID番号の割付け結果を,指定した名前のファイルに書
     925                き出す.パス2でのみ有効.
     926
     927        --id-input-file <ID番号入力ファイル名>
     928                オブジェクトのID番号の割付けを,指定した名前のファイルから取り
     929                込む.パス2でのみ有効.
    1054930
    1055931        --external-id
    1056                 オブジェクトのID番号を保持する変数の定義を生成する.パス2でのみ
    1057                 有効.
    1058 
    1059         -Mï¼»--print-dependenciesï¼½<ターゲットシンボル>
    1060                 システムコンフィギュレーションファイルの依存関係を出力する.
    1061                 Makefile中の依存関係を生成する際に用いる.
    1062 
    1063 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®è©³ç´°ä»•æ§˜ã«ã¤ã„ては,別途PDFファイルの形でé
    1064 å¸ƒã—てい
    1065 ã‚‹ã€ŒTOPPERS新世代カーネル用コンフィギュレータ仕様」を参ç
    1066 §ã™ã‚‹ã“と.
    1067 
    1068 
    1069 ï¼˜ï¼Žã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“ス
    1070 
    1071 8.1 システムログ機能
    1072 
    1073 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«å†
    1074 ã§ç™ºç”Ÿã—た異常事象やカーネルのトレースロ
    1075 ã‚°ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スやアプリケーションで発生した異常事象やトレースログ
    1076 ã‚’,ログæƒ
    1077 å ±ã¨ã—て記録するための機能である.また,記録したログæƒ
    1078 å ±ã‚’取
    1079 ã‚Šå‡ºã™æ©Ÿèƒ½ã‚‚持つ.
    1080 
    1081 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã§syslog.cfg
    1082 ã‚’インクルードすることで,システムに組み込むことができる.システムログ
    1083 å‡ºåŠ›ã‚’行うソースファイルでは,t_syslog.hをインクルードする.また,シス
    1084 ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®ãã®ä»–のサービスコールを呼び出すソースファイルでは,
    1085 syslog.hをインクルードする.
    1086 
    1087 8.1.1 システムログ機能の位置付け
    1088 
    1089 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«å†
    1090 ã‹ã‚‰ã‚‚呼び出すことができるため,カーネル
    1091 ã‚ˆã‚Šä¸‹ã®éšŽå±¤ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ä½ç½®ä»˜ã‘ることができる.この意味では,他のシ
    1092 ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スとは位置付けが異なる.
    1093 
    1094 ä¸€æ–¹ï¼Œãƒ­ã‚°æƒ
    1095 å ±ã‚’システム外部に出力するためには,シリアルインタフェース
    1096 ãƒ‰ãƒ©ã‚¤ãƒãªã©ï¼Œã‚«ãƒ¼ãƒãƒ«ä¸Šã§å‹•ä½œã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スを用いるå¿
    1097 è¦ãŒã‚る.
    1098 ãã“で,ログæƒ
    1099 å ±ã‚’システム外部に出力するためのサービス(これを,システ
    1100 ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã¨å‘¼ã¶ï¼‰ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¨ã¯åˆ†é›¢ã—て実è£
    1101 ã™ã‚‹ã“ととし,
    1102 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ãƒ­ã‚°æƒ
    1103 å ±ã®è¨˜éŒ²ãƒ»å–出しのための機能に絞っている.
    1104 
    1105 ä»¥ä¸Šã®ã‚ˆã†ã«ï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ã‚«ãƒ¼ãƒãƒ«ã‚ˆã‚Šä¸‹ã®éšŽå±¤ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã§ã‚ã‚‹
    1106 ãŒï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®ä¸­ã§ãƒ­ã‚°æ™‚刻を取り出すために,カーネルの機能をå¿
    1107 
    1108 è¦ã¨ã™ã‚‹ï¼Žå®Ÿè£
    1109 ä¸Šã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã®å†
    1110 éƒ¨å¤‰æ•°ã‚’直接参ç
    1111 §ã—ている.そのため,カー
    1112 ãƒãƒ«ã®å®Ÿè¡Œé–‹å§‹å‰ã‚„終了後は,ログ時刻は正しく記録されない.
    1113 
    1114 8.1.2 ログバッファへの記録と低レベル出力
    1115 
    1116 ä¸Šè¿°ã—たように,ログæƒ
    1117 å ±ã‚’システムの外部に出力するためには,カーネル上
    1118 ã§å‹•ä½œã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スを用いるå¿
    1119 è¦ãŒã‚るため,カーネルの動作を継続
    1120 ã§ããªã„ような重大な異常事象が起こった場合には,ログæƒ
    1121 å ±ã‚’出力できなく
    1122 ãªã‚‹ï¼Žã¾ãŸï¼Œã“れらのシステムサービス自身をデバッグする場合にも,ログæƒ
    1123 
    1124 å ±ã®å‡ºåŠ›ãŒã§ããªã„.
    1125 
    1126 ãã“で,カーネル上で動作するシステムサービスが使えない場合にでもログæƒ
    1127 
    1128 å ±ã‚’出力するために,低レベル出力機能を用意する.低レベル出力機能は,ター
    1129 ã‚²ãƒƒãƒˆä¾å­˜ã«ç”¨æ„ã™ã‚‹ä½Žãƒ¬ãƒ™ãƒ«ã®æ–‡å­—出力関数(target_fput_log)を用いてロ
    1130 ã‚°æƒ
    1131 å ±ã‚’出力する機能である.低レベルの文字出力関数は,ターゲット依存部
    1132 ã§ç”¨æ„ã™ã‚‹ã“ととしているが,最終製品に組み込まれる場合などでは,文字を
    1133 å‡ºåŠ›ã™ã‚‹æ–¹æ³•ãŒãªã„状況も考えられる.そのような場合,低レベルの文字出力
    1134 é–¢æ•°ã«é€ã‚‰ã‚ŒãŸæ–‡å­—は,メモリ上に残しておくか,捨ててしまうしかない.
    1135 
    1136 ãƒ­ã‚°æƒ
    1137 å ±ã‚’,ログバッファへ記録するか低レベル出力機能を用いて出力するか
    1138 ã®è¨­å®šã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®ã‚µãƒ¼ãƒ“スコール(syslog_msk_log)によって行
    1139 ã†ã“とができる.syslog_msk_logの使い方については後述する.デフォルトで
    1140 ã¯ï¼ˆã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã‚’動作させず,syslog_msk_logも呼び出さない場合),
    1141 ã™ã¹ã¦ã®ãƒ­ã‚°æƒ
    1142 å ±ã‚’低レベル出力機能を用いて出力し,ログバッファには記録
    1143 ã—ない.
    1144 
    1145 ä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½ã‚’用いると,ログメッセージの作成処理(printf相当の処理)
    1146 ã¨ä½Žãƒ¬ãƒ™ãƒ«ã®æ–‡å­—出力処理をカーネルå†
    1147 ã§è¡Œã†ãŸã‚ã«ï¼Œã‚«ãƒ¼ãƒãƒ«ã®å¿œç­”性が悪
    1148 ããªã‚‹ã“とに注意しなければならない.特に,低レベルの文字出力処理はデバ
    1149 ã‚¤ã‚¹ã‚’ポーリングする形で実è£
    1150 ã™ã‚‹ã®ãŒé€šå¸¸ã§ï¼Œãã®å ´åˆã«ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã®å¿œ
    1151 ç­”性は実用的と言えない程に悪くなる.
    1152 
    1153 8.1.3 ログæƒ
    1154 å ±ã®ç¨®åˆ¥
    1155 
    1156 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ï¼Œãƒ­ã‚°æƒ
    1157 å ±ã«ä»¥ä¸‹ã®ç¨®åˆ¥ã‚’設けている.
    1158 
    1159                 LOG_TYPE_COMMENT        コメント
    1160                 LOG_TYPE_ASSERT         ã‚¢ã‚µãƒ¼ã‚·ãƒ§ãƒ³ã®å¤±æ•—
    1161                 LOG_TYPE_INH            割込みハンドラ
    1162                 LOG_TYPE_ISR            割込みサービスルーチン
    1163                 LOG_TYPE_CYC            周期ハンドラ
    1164                 LOG_TYPE_ALM            アラームハンドラ
    1165                 LOG_TYPE_OVR            オーバランハンドラ
    1166                 LOG_TYPE_EXC            CPU例外ハンドラ
    1167                 LOG_TYPE_TEX            タスク例外処理ルーチン
    1168                 LOG_TYPE_TSKSTAT        タスク状æ
    1169 ‹å¤‰åŒ–
    1170                 LOG_TYPE_DSP            ディスパッチャ
    1171                 LOG_TYPE_SVC            サービスコール
    1172 
    1173 ãƒ­ã‚°æƒ
    1174 å ±ã®ç¨®åˆ¥ã®ä¸­ã§ï¼ŒLOG_TYPE_COMMENTとLOG_TYPE_ASSERT以外は,カーネル
    1175 ã®ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ã«ç”¨ã„るためのものであるが,使用するかどうかはターゲット
    1176 ä¾å­˜éƒ¨ã«ä»»ã•ã‚Œã¦ã„る.
    1177 
    1178 8.1.4 ログæƒ
    1179 å ±ã®é‡è¦åº¦
    1180 
    1181 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ï¼Œãƒ­ã‚°æƒ
    1182 å ±ã‚’出力する際に指定する重要度に基づいて,実
    1183 éš›ã«å‡ºåŠ›ã™ã‚‹ãƒ­ã‚°æƒ
    1184 å ±ã‚’動的に設定することができる.これは,UNIXのシステ
    1185 ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‚’まねたもので,ログの重要度の種類や指定方法もUNIXのAPIを参考
    1186 ã«ã—ている.また,低レベル出力機能を用いて出力するログæƒ
    1187 å ±ã‚‚,重要度に
    1188 åŸºã¥ã„て動的に設定することができる.
    1189 
    1190 å
    1191 ·ä½“的には,ログの重要度として次の8段階を用意している.
    1192 
    1193                 LOG_EMERG               ã‚«ãƒ¼ãƒãƒ«ã®å‹•ä½œã‚’継続できないエラー
     932                オブジェクトのID番号を保持する変数の定義を生成する.パス2でのみ
     933                有効.
     934
     935        -M[--print-dependencies]<ターゲットシンボル>
     936                システムコンフィギュレーションファイルの依存関係を出力する.
     937                Makefile中の依存関係を生成する際に用いる.
     938
     939コンフィギュレータの詳細仕様については,別途PDFファイルの形で配布してい
     940る「TOPPERS新世代カーネル用コンフィギュレータ仕様」を参照すること.
     941
     942
     9438.システムサービス
     944
     9458.1 システムログ機能
     946
     947システムログ機能は,カーネル内で発生した異常事象やカーネルのトレースロ
     948グ,システムサービスやアプリケーションで発生した異常事象やトレースログ
     949を,ログ情報として記録するための機能である.また,記録したログ情報を取
     950り出す機能も持つ.
     951
     952システムログ機能は,システムコンフィギュレーションファイルでsyslog.cfg
     953をインクルードすることで,システムに組み込むことができる.システムログ
     954出力を行うソースファイルでは,t_syslog.hをインクルードする.また,シス
     955テムログ機能のその他のサービスコールを呼び出すソースファイルでは,
     956syslog.hをインクルードする.
     957
     9588.1.1 システムログ機能の位置付け
     959
     960システムログ機能は,カーネル内からも呼び出すことができるため,カーネル
     961より下の階層のモジュールと位置付けることができる.この意味では,他のシ
     962ステムサービスとは位置付けが異なる.
     963
     964一方,ログ情報をシステム外部に出力するためには,シリアルインタフェース
     965ドライバなど,カーネル上で動作するシステムサービスを用いる必要がある.
     966そこで,ログ情報をシステム外部に出力するためのサービス(これを,システ
     967ムログタスクと呼ぶ)は,システムログ機能とは分離して実装することとし,
     968システムログ機能はログ情報の記録・取出しのための機能に絞っている.
     969
     970以上のように,システムログ機能はカーネルより下の階層のモジュールである
     971が,システムログ機能の中でログ時刻を取り出すために,カーネルの機能を必
     972要とする.実装上は,カーネルの内部変数を直接参照している.そのため,カー
     973ネルの実行開始前や終了後は,ログ時刻は正しく記録されない.
     974
     9758.1.2 ログバッファへの記録と低レベル出力
     976
     977上述したように,ログ情報をシステムの外部に出力するためには,カーネル上
     978で動作するシステムサービスを用いる必要があるため,カーネルの動作を継続
     979できないような重大な異常事象が起こった場合には,ログ情報を出力できなく
     980なる.また,これらのシステムサービス自身をデバッグする場合にも,ログ情
     981報の出力ができない.
     982
     983そこで,カーネル上で動作するシステムサービスが使えない場合にでもログ情
     984報を出力するために,低レベル出力機能を用意する.低レベル出力機能は,ター
     985ゲット依存に用意する低レベルの文字出力関数(target_fput_log)を用いてロ
     986グ情報を出力する機能である.低レベルの文字出力関数は,ターゲット依存部
     987で用意することとしているが,最終製品に組み込まれる場合などでは,文字を
     988出力する方法がない状況も考えられる.そのような場合,低レベルの文字出力
     989関数に送られた文字は,メモリ上に残しておくか,捨ててしまうしかない.
     990
     991ログ情報を,ログバッファへ記録するか低レベル出力機能を用いて出力するか
     992の設定は,システムログ機能のサービスコール(syslog_msk_log)によって行
     993うことができる.syslog_msk_logの使い方については後述する.デフォルトで
     994は(システムログタスクを動作させず,syslog_msk_logも呼び出さない場合),
     995すべてのログ情報を低レベル出力機能を用いて出力し,ログバッファには記録
     996しない.
     997
     998低レベル出力機能を用いると,ログメッセージの作成処理(printf相当の処理)
     999と低レベルの文字出力処理をカーネル内で行うために,カーネルの応答性が悪
     1000くなることに注意しなければならない.特に,低レベルの文字出力処理はデバ
     1001イスをポーリングする形で実装するのが通常で,その場合には,カーネルの応
     1002答性は実用的と言えない程に悪くなる.
     1003
     10048.1.3 ログ情報の種別
     1005
     1006システムログ機能は,ログ情報に以下の種別を設けている.
     1007
     1008                LOG_TYPE_COMMENT        コメント
     1009                LOG_TYPE_ASSERT         アサーションの失敗
     1010                LOG_TYPE_INH            割込みハンドラ
     1011                LOG_TYPE_ISR            割込みサービスルーチン
     1012                LOG_TYPE_CYC            周期ハンドラ
     1013                LOG_TYPE_ALM            アラームハンドラ
     1014                LOG_TYPE_OVR            オーバランハンドラ
     1015                LOG_TYPE_EXC            CPU例外ハンドラ
     1016                LOG_TYPE_TEX            タスク例外処理ルーチン
     1017                LOG_TYPE_TSKSTAT        タスク状態変化
     1018                LOG_TYPE_DSP            ディスパッチャ
     1019                LOG_TYPE_SVC            サービスコール
     1020
     1021ログ情報の種別の中で,LOG_TYPE_COMMENTとLOG_TYPE_ASSERT以外は,カーネル
     1022のトレースログに用いるためのものであるが,使用するかどうかはターゲット
     1023依存部に任されている.
     1024
     10258.1.4 ログ情報の重要度
     1026
     1027システムログ機能は,ログ情報を出力する際に指定する重要度に基づいて,実
     1028際に出力するログ情報を動的に設定することができる.これは,UNIXのシステ
     1029ムログ機能をまねたもので,ログの重要度の種類や指定方法もUNIXのAPIを参考
     1030にしている.また,低レベル出力機能を用いて出力するログ情報も,重要度に
     1031基づいて動的に設定することができる.
     1032
     1033具体的には,ログの重要度として次の8段階を用意している.
     1034
     1035                LOG_EMERG               カーネルの動作を継続できないエラー
    11941036                LOG_ALERT
    11951037                LOG_CRIT
    1196                 LOG_ERROR               é‡è¦æ€§ã®ä½Žã„システムエラー
    1197                 LOG_WARNING             è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼Žã‚·ã‚¹ãƒ†ãƒ ã¯å®‰å
    1198 ¨ã«ç¶™ç¶šå‹•ä½œã§ãã‚‹
     1038                LOG_ERROR               重要性の低いシステムエラー
     1039                LOG_WARNING             警告メッセージ.システムは安全に継続動作できる
    11991040                LOG_NOTICE
    12001041                LOG_INFO
    1201                 LOG_DEBUG               ãƒ‡ãƒãƒƒã‚°ã®ãŸã‚ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
    1202 
    1203 ã©ã®é‡è¦åº¦ã®ãƒ­ã‚°æƒ
    1204 å ±ã‚’ログバッファに記録するかと,どの重要度のログæƒ
    1205 å ±
    1206 ã‚’低レベル出力機能を用いて出力するかは,システムログ機能のサービスコー
    1207 ãƒ«ï¼ˆsyslog_msk_log)によって設定することができる.
    1208 
    1209 8.1.5 ログæƒ
    1210 å ±ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ 
    1211 
    1212 ãƒ­ã‚°æƒ
    1213 å ±ã‚’格納するためのデータ型として,SYSLOG構造体を用意している.
    1214 SYSLOG構造体には,ログæƒ
    1215 å ±ã®ç¨®åˆ¥ï¼ˆlogtypeフィールド),ログ時刻
    1216 ï¼ˆlogtimフィールド),その他のログæƒ
    1217 å ±ï¼ˆloginfoフィールド)が含まれる.
    1218 
    1219 SYSLOG構造体に格納されたログæƒ
    1220 å ±ã‚’出力する場合には,ログ時刻は出力関数
    1221 ï¼ˆsyslog_wri_log)によって書き込まれるため,出力関数を呼ぶ側で書き込む
    1222 å¿
    1223 è¦ã¯ãªã„.
    1224 
    1225 8.1.6 システムログ機能のサービスコール
    1226 
    1227 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®æä¾›ã™ã‚‹ã‚µãƒ¼ãƒ“スコールは次の通りである.これらのサー
    1228 ãƒ“スコールを呼び出すソースファイルでは,syslog.hをインクルードするå¿
    1229 è¦
    1230 ãŒã‚る.
     1042                LOG_DEBUG               デバッグのためのメッセージ
     1043
     1044どの重要度のログ情報をログバッファに記録するかと,どの重要度のログ情報
     1045を低レベル出力機能を用いて出力するかは,システムログ機能のサービスコー
     1046ル(syslog_msk_log)によって設定することができる.
     1047
     10488.1.5 ログ情報のデータ構造
     1049
     1050ログ情報を格納するためのデータ型として,SYSLOG構造体を用意している.
     1051SYSLOG構造体には,ログ情報の種別(logtypeフィールド),ログ時刻
     1052(logtimフィールド),その他のログ情報(loginfoフィールド)が含まれる.
     1053
     1054SYSLOG構造体に格納されたログ情報を出力する場合には,ログ時刻は出力関数
     1055(syslog_wri_log)によって書き込まれるため,出力関数を呼ぶ側で書き込む
     1056必要はない.
     1057
     10588.1.6 システムログ機能のサービスコール
     1059
     1060システムログ機能の提供するサービスコールは次の通りである.これらのサー
     1061ビスコールを呼び出すソースファイルでは,syslog.hをインクルードする必要
     1062がある.
    12311063
    12321064(1) ER syslog_wri_log(uint_t prio, const SYSLOG *p_syslog)
    12331065
    1234 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã«ï¼Œp_syslogで指定されるログæƒ
    1235 å ±ã‚’,prioで指定される重
    1236 è¦åº¦ã§å‡ºåŠ›ã™ã‚‹ï¼ˆãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ã¸è¨˜éŒ²ã™ã‚‹ã‹ä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½ã‚’用いて出力す
    1237 ã‚‹ï¼‰ï¼Ž
    1238 
    1239 ãƒ—ロトタイプ宣言において,*p_syslogにconst指定がされているが,実際には,
    1240 ã“の関数の中で,*p_syslogのlogtimフィールドにシステム時刻を書き込んでい
    1241 ã‚‹ï¼Ž
     1066システムログ機能に,p_syslogで指定されるログ情報を,prioで指定される重
     1067要度で出力する(ログバッファへ記録するか低レベル出力機能を用いて出力す
     1068る).
     1069
     1070プロトタイプ宣言において,*p_syslogにconst指定がされているが,実際には,
     1071この関数の中で,*p_syslogのlogtimフィールドにシステム時刻を書き込んでい
     1072る.
    12421073
    12431074(2) ER_UINT syslog_rea_log(SYSLOG *p_syslog)
    12441075
    1245 ãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ãƒ­ã‚°æƒ
    1246 å ±ã‚’1つ取り出す.ログバッファが空の時はE_OBJ,そ
    1247 ã†ã§ãªã„場合は,ログバッファのオーバフローにより失われたログæƒ
    1248 å ±ã®æ•°
    1249 ï¼ˆãƒ­ã‚°æƒ
    1250 å ±ãŒå¤±ã‚ã‚Œã¦ã„ない場合は0)を返す.システムログタスクが用いるこ
    1251 ã¨ã‚’想定している.
     1076ログバッファからログ情報を1つ取り出す.ログバッファが空の時はE_OBJ,そ
     1077うでない場合は,ログバッファのオーバフローにより失われたログ情報の数
     1078(ログ情報が失われていない場合は0)を返す.システムログタスクが用いるこ
     1079とを想定している.
    12521080
    12531081(3) ER syslog_msk_log(uint_t logmask, uint_t lowmask)
    12541082
    1255 ãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ã«è¨˜éŒ²ã™ã¹ããƒ­ã‚°æƒ
    1256 å ±ã®é‡è¦åº¦ã®ç¤ºã™ãƒ“ットマップ(logmask)と,
    1257 ä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½ã‚’用いて出力すべきログæƒ
    1258 å ±ã®é‡è¦åº¦ã‚’示すビットマップ
    1259 ï¼ˆlowmask)を設定する.ビットマップを作るためのマクロとして,LOG_MASKと
    1260 LOG_UPTOを用意している.
     1083ログバッファに記録すべきログ情報の重要度の示すビットマップ(logmask)と,
     1084低レベル出力機能を用いて出力すべきログ情報の重要度を示すビットマップ
     1085(lowmask)を設定する.ビットマップを作るためのマクロとして,LOG_MASKと
     1086LOG_UPTOを用意している.
    12611087
    12621088(4) ER syslog_ref_log(T_SYSLOG_RLOG *pk_rlog)
    12631089
    1264 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®çŠ¶æ
    1265 ‹ã‚’参ç
    1266 §ã™ã‚‹ï¼Žå
    1267 ·ä½“的には,ログバッファに記録されて
    1268 ã„るログæƒ
    1269 å ±ã®æ•°ï¼ˆT_SYSLOG_RLOG構造体のcountフィールド),ログバッファ
    1270 ã®ã‚ªãƒ¼ãƒãƒ•ãƒ­ãƒ¼ã«ã‚ˆã‚Šå¤±ã‚ã‚ŒãŸãƒ­ã‚°æƒ
    1271 å ±ã®æ•°ï¼ˆlostフィールド),ログバッファ
    1272 ã«è¨˜éŒ²ã™ã¹ããƒ­ã‚°æƒ
    1273 å ±ã®é‡è¦åº¦ã®ç¤ºã™ãƒ“ットマップ(logmaskフィールド),低
    1274 ãƒ¬ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½ã‚’用いて出力すべきログæƒ
    1275 å ±ã®é‡è¦åº¦ã‚’示すビットマップ
    1276 ï¼ˆlowmaskフィールド)を参ç
    1277 §ã™ã‚‹ã“とができる.
    1278 
    1279 8.1.7 システムログ機能のためのライブラリ関数とマクロ
    1280 
    1281 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°å‡ºåŠ›ã®ãŸã‚ã®ãƒ©ã‚¤ãƒ–ラリ関数とマクロは次の通りである.これら
    1282 ã ã‘を呼び出すソースファイルでは,t_syslog.hをインクルードすればよい.
     1090システムログ機能の状態を参照する.具体的には,ログバッファに記録されて
     1091いるログ情報の数(T_SYSLOG_RLOG構造体のcountフィールド),ログバッファ
     1092のオーバフローにより失われたログ情報の数(lostフィールド),ログバッファ
     1093に記録すべきログ情報の重要度の示すビットマップ(logmaskフィールド),低
     1094レベル出力機能を用いて出力すべきログ情報の重要度を示すビットマップ
     1095(lowmaskフィールド)を参照することができる.
     1096
     10978.1.7 システムログ機能のためのライブラリ関数とマクロ
     1098
     1099システムログ出力のためのライブラリ関数とマクロは次の通りである.これら
     1100だけを呼び出すソースファイルでは,t_syslog.hをインクルードすればよい.
    12831101
    12841102(1) void _syslog_n(uint_t prio, uint_t type, intptr_t arg1, ..., intptr_t argn)
    1285     ※ nは0~6のいずれか.
    1286 
    1287 ãƒ­ã‚°ç¨®åˆ¥ãŒtype,パラメータがarg1~argnのログæƒ
    1288 å ±ã‚’,重要度prioで出力す
    1289 ã‚‹ãŸã‚ã®é–¢æ•°ï¼Ž
     1103    ※ nは0~6のいずれか.
     1104
     1105ログ種別がtype,パラメータがarg1~argnのログ情報を,重要度prioで出力す
     1106るための関数.
    12901107
    12911108(2) void syslog_n(uint_t prio, const char *format, arg1, ..., argn)
    1292     ※ nは0~5のいずれか.
    1293 
    1294 format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
    1295 LOG_TYPE_COMMENTのログæƒ
    1296 å ±ã¨ã—て,重要度prioで出力するためのマクロ.
    1297 
    1298 formatはメッセージのフォーマット記述,arg1~argnはフォーマット記述中で
    1299 å‚ç
    1300 §ã•ã‚Œã‚‹å€¤ã§ï¼Œprintfのフォーマット記述のサブセットとなっている.arg1~
    1301 argnは,このマクロ中でintptr_t型にキャストされるため,intptr_t型に型変
    1302 æ›ã§ãã‚‹ä»»æ„ã®åž‹ã‚’渡すことができ,型チェックはされない.formatおよび
    1303 arg1~argnには,次の制限がある.
    1304 
    1305 ãƒ»formatのフォーマット記述は,定数文字列を渡すことを想定しており,この
    1306 ãƒžã‚¯ãƒ­å‡¦ç†ã‚’終えた後も変化してはならない.
    1307 
    1308 ãƒ»format中に使えるフォーマット指定は次の通り.
    1309 
    1310         %d              引数をint_t型とみなし,10進数で表示
    1311         %u              引数をuint_t型とみなし,10進数で表示
    1312         %x              引数をuint_t型とみなし,16進数(英文字は小文字)で表示
    1313         %X              引数をuint_t型とみなし,16進数(英文字は大文字)で表示
    1314         %p              引数をポインタとみなし,16進数(英文字は小文字)で表示
    1315         %c              引数を文字コードとみなし,文字を表示
    1316         %s              引数を文字列を示すポインタとみなし,文字列を表示
    1317         %%              '%'を表示(引数は取らない)
    1318 
    1319 %d, %u, %x, %Xにおいては,'%'の直後に表示桁数を指定する10進数値を記述す
    1320 ã‚‹ã“とができる.その場合,表示すべき文字列が指定した桁数に満たない場合
    1321 ã«ã¯ï¼ŒæŒ‡å®šã—た桁数å†
    1322 ã«å³è©°ã‚ã§è¡¨ç¤ºã™ã‚‹ï¼Ž10進数値が'0'で始まる場合には,
    1323 ãã®é–“に'0'を埋める.
    1324 
    1325 ã¾ãŸï¼Œintptr_t型のサイズがlong型のサイズ以上である環境においては,次の
    1326 ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæŒ‡å®šã‚‚使用することができる.この他のフォーマット指定に'l'
    1327 ã‚’付加した場合には無視する(%lcと%lsには対応していない).
    1328 
    1329         %ld             å¼•æ•°ã‚’long_t型とみなし,10進数で表示
    1330         %lu             å¼•æ•°ã‚’ulong_t型とみなし,10進数で表示
    1331         %lx             å¼•æ•°ã‚’ulong_t型とみなし,16進数(英文字は小文字)で表示
    1332         %lX             å¼•æ•°ã‚’ulong_t型とみなし,16進数(英文字は大文字)で表示
    1333 
    1334 ãƒ»arg1~argnにポインタを渡す場合(%sに対応する引数の場合)に,ポインタ
    1335 ã®æŒ‡ã™ãƒ‡ãƒ¼ã‚¿ã¯ï¼Œã“のマクロ処理を終えた後も変化してはならない.定数文字
    1336 åˆ—を渡すことを想定している.
     1109    ※ nは0~5のいずれか.
     1110
     1111format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
     1112LOG_TYPE_COMMENTのログ情報として,重要度prioで出力するためのマクロ.
     1113
     1114formatはメッセージのフォーマット記述,arg1~argnはフォーマット記述中で
     1115参照される値で,printfのフォーマット記述のサブセットとなっている.arg1~
     1116argnは,このマクロ中でintptr_t型にキャストされるため,intptr_t型に型変
     1117換できる任意の型を渡すことができ,型チェックはされない.formatおよび
     1118arg1~argnには,次の制限がある.
     1119
     1120・formatのフォーマット記述は,定数文字列を渡すことを想定しており,この
     1121マクロ処理を終えた後も変化してはならない.
     1122
     1123・format中に使えるフォーマット指定は次の通り.
     1124
     1125        %d              引数をint_t型とみなし,10進数で表示
     1126        %u              引数をuint_t型とみなし,10進数で表示
     1127        %x              引数をuint_t型とみなし,16進数(英文字は小文字)で表示
     1128        %X              引数をuint_t型とみなし,16進数(英文字は大文字)で表示
     1129        %p              引数をポインタとみなし,16進数(英文字は小文字)で表示
     1130        %c              引数を文字コードとみなし,文字を表示
     1131        %s              引数を文字列を示すポインタとみなし,文字列を表示
     1132        %%              '%'を表示(引数は取らない)
     1133
     1134%d, %u, %x, %Xにおいては,'%'の直後に表示桁数を指定する10進数値を記述す
     1135ることができる.その場合,表示すべき文字列が指定した桁数に満たない場合
     1136には,指定した桁数内に右詰めで表示する.10進数値が'0'で始まる場合には,
     1137その間に'0'を埋める.
     1138
     1139また,intptr_t型のサイズがlong型のサイズ以上である環境においては,次の
     1140フォーマット指定も使用することができる.この他のフォーマット指定に'l'
     1141を付加した場合には無視する(%lcと%lsには対応していない).
     1142
     1143        %ld             引数をlong_t型とみなし,10進数で表示
     1144        %lu             引数をulong_t型とみなし,10進数で表示
     1145        %lx             引数をulong_t型とみなし,16進数(英文字は小文字)で表示
     1146        %lX             引数をulong_t型とみなし,16進数(英文字は大文字)で表示
     1147
     1148・arg1~argnにポインタを渡す場合(%sに対応する引数の場合)に,ポインタ
     1149の指すデータは,このマクロ処理を終えた後も変化してはならない.定数文字
     1150列を渡すことを想定している.
    13371151
    13381152(3) void syslog(uint_t prio, const char *format, ...)
    13391153
    1340 format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
    1341 LOG_TYPE_COMMENTのログæƒ
    1342 å ±ã¨ã—て,重要度prioで出力するための関数で,引
    1343 æ•°ã®æ•°ã‚’可変にしたもの.formatに続く引数は最大5個まで.formatおよびそれ
    1344 ã«ç¶šãå¼•æ•°ã«ã¯ï¼Œsyslog_nと同様の制限がある.
    1345 
    1346 ã“のライブラリ関数は,可変数引数を処理するためにå†
    1347 éƒ¨ã§æ–‡å­—列をスキャン
    1348 ã™ã‚‹ï¼Žãã®ãŸã‚ï¼Œå®Ÿè¡Œæ™‚間が長くなる可能性があり,割込み禁止状æ
    1349 ‹ã§å‘¼ã³å‡º
    1350 ã™ã¹ãã§ã¯ãªã„.主にアプリケーションプログラムが用いることを想定してい
    1351 ã‚‹ï¼Ž
     1154format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
     1155LOG_TYPE_COMMENTのログ情報として,重要度prioで出力するための関数で,引
     1156数の数を可変にしたもの.formatに続く引数は最大5個まで.formatおよびそれ
     1157に続く引数には,syslog_nと同様の制限がある.
     1158
     1159このライブラリ関数は,可変数引数を処理するために内部で文字列をスキャン
     1160する.そのため,実行時間が長くなる可能性があり,割込み禁止状態で呼び出
     1161すべきではない.主にアプリケーションプログラムが用いることを想定してい
     1162る.
    13521163
    13531164(4) UINT LOG_MASK(UINT prio)
    13541165
    1355 é‡è¦åº¦prioのみセットされたビットマップを作るマクロ.syslog_msk_logに渡
    1356 ã™å¼•æ•°ã‚’作るために用いる.
     1166重要度prioのみセットされたビットマップを作るマクロ.syslog_msk_logに渡
     1167す引数を作るために用いる.
    13571168
    13581169(5) UINT LOG_UPTO(UINT prio)
    13591170
    1360 é‡è¦åº¦prio以上の重要度がすべてセットされたビットマップを作るマクロ.
    1361 syslog_msk_logに渡す引数を作るために用いる.
    1362 
    1363 8.1.8 システムログ機能のその他のサービス
    1364 
    1365 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã¯ï¼Œå‰è¨˜ã®ã‚µãƒ¼ãƒ“スコール等に加えて,初期化処理のための
    1366 é–¢æ•°ã‚’持つ.
     1171重要度prio以上の重要度がすべてセットされたビットマップを作るマクロ.
     1172syslog_msk_logに渡す引数を作るために用いる.
     1173
     11748.1.8 システムログ機能のその他のサービス
     1175
     1176システムログ機能は,前記のサービスコール等に加えて,初期化処理のための
     1177関数を持つ.
    13671178
    13681179(1) void syslog_initialize(intptr_t exinf)
    13691180
    1370 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‚’初期化する.ログバッファにログæƒ
    1371 å ±ãŒè¨˜éŒ²ã•ã‚Œã¦ã„ã‚‹å ´
    1372 åˆã«ã¯ï¼Œæ¶ˆåŽ»ã•ã‚Œã‚‹ï¼Žsyslog.cfgによって,カーネルに初期化ルーチンとして
    1373 ç™»éŒ²ã•ã‚Œã‚‹ï¼Žexinfは無視される.
    1374 
    1375 8.2 シリアルインタフェースドライバ
    1376 
    1377 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆã‚’扱うためのドライバで
    1378 ã‚る.
    1379 
    1380 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤
    1381 ãƒ«ã§serial.cfgをインクルードすることで,システムに組み込むことができる.
    1382 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã‚’呼び出すソースファイルでは,serial.hを
    1383 ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã‚‹ï¼Ž
    1384 
    1385 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œãƒãƒ¼ãƒˆæ¯Žã«ã‚»ãƒžãƒ•ã‚©ã‚’2個ずつ使用する.
    1386 ã‚»ãƒžãƒ•ã‚©ã‚’生成する静的APIは,serial.cfgに含まれている.
    1387 
    1388 8.2.1 シリアルインタフェースドライバのサービスコール
    1389 
    1390 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã‚’呼び出すサービスコールの仕様は次の通り
    1391 ã§ã‚る.この中で,シリアルポートのID番号(portid)の解釈はターゲット依
    1392 å­˜ã¨ãªã‚‹ï¼Ž
    1393 
    1394 ã“れらのサービスコールは,非タスクコンテキストから呼び出すことはできな
    1395 ã„.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状æ
    1396 ‹ã§å‘¼ã³
    1397 å‡ºã™ã“とはできない.いずれも,呼び出した場合にはE_CTXエラーとなる.
     1181システムログ機能を初期化する.ログバッファにログ情報が記録されている場
     1182合には,消去される.syslog.cfgによって,カーネルに初期化ルーチンとして
     1183登録される.exinfは無視される.
     1184
     11858.2 シリアルインタフェースドライバ
     1186
     1187シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで
     1188ある.
     1189
     1190シリアルインタフェースドライバは,システムコンフィギュレーションファイ
     1191ルでserial.cfgをインクルードすることで,システムに組み込むことができる.
     1192シリアルインタフェースドライバを呼び出すソースファイルでは,serial.hを
     1193インクルードする.
     1194
     1195シリアルインタフェースドライバは,ポート毎にセマフォを2個ずつ使用する.
     1196セマフォを生成する静的APIは,serial.cfgに含まれている.
     1197
     11988.2.1 シリアルインタフェースドライバのサービスコール
     1199
     1200シリアルインタフェースドライバを呼び出すサービスコールの仕様は次の通り
     1201である.この中で,シリアルポートのID番号(portid)の解釈はターゲット依
     1202存となる.
     1203
     1204これらのサービスコールは,非タスクコンテキストから呼び出すことはできな
     1205い.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状態で呼び
     1206出すことはできない.いずれも,呼び出した場合にはE_CTXエラーとなる.
    13981207
    13991208(1) ER serial_opn_por(ID portid)
    14001209
    1401 portidで指定されたシリアルポートをオープンし,受信/送信が可能な状æ
    1402 ‹ã«
    1403 ã™ã‚‹ï¼Ž
     1210portidで指定されたシリアルポートをオープンし,受信/送信が可能な状態に
     1211する.
    14041212
    14051213(2) ER serial_cls_por(ID portid)
    14061214
    1407 portidで指定されたシリアルポートをクローズする.
     1215portidで指定されたシリアルポートをクローズする.
    14081216
    14091217(3) ER_UINT serial_rea_dat(ID portid, char *buf, uint_t len)
    14101218
    1411 portidで指定されたシリアルポートから,lenバイトの文字列を受信し,bufか
    1412 ã‚‰ã®é ˜åŸŸã«å
    1413 ¥ã‚Œã‚‹ï¼Žlenバイト受信するまで,å¾
    1414 ã¡çŠ¶æ
    1415 ‹ã¨ãªã‚‹ï¼Žå—信した文字数
    1416 ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’返す.
     1219portidで指定されたシリアルポートから,lenバイトの文字列を受信し,bufか
     1220らの領域に入れる.lenバイト受信するまで,待ち状態となる.受信した文字数
     1221またはエラーコードを返す.
    14171222
    14181223(4) ER_UINT serial_wri_dat(ID portid, const char *buf, uint_t len)
    14191224
    1420 portidで指定されたシリアルポートに,bufからのlenバイトの文字列を送信す
    1421 ã‚‹ï¼Žlenバイト送信バッファにå
    1422 ¥ã‚Œã‚‹ã¾ã§ï¼Œå¾
    1423 ã¡çŠ¶æ
    1424 ‹ã¨ãªã‚‹ï¼Žé€ä¿¡ã—た文字数ま
    1425 ãŸã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’返す.
     1225portidで指定されたシリアルポートに,bufからのlenバイトの文字列を送信す
     1226る.lenバイト送信バッファに入れるまで,待ち状態となる.送信した文字数ま
     1227たはエラーコードを返す.
    14261228
    14271229(5) ER serial_ctl_por(ID portid, uint_t ioctl)
    14281230
    1429 portidで指定されたシリアルポートの制御æƒ
    1430 å ±ã‚’,ioctlで示される値に設定す
    1431 ã‚‹ï¼Ž
    1432 
    1433 ioctlには,以下の制御æƒ
    1434 å ±ã‚’表す定数を,ビット毎に論理和をとったものを
    1435 æŒ‡å®šã™ã‚‹ï¼Ž
    1436 
    1437         IOCTL_ECHO(エコーバックモード)
    1438                 このビットを設定すると,シリアルインタフェースドライバがエコー
    1439                 バックを行う.å
    1440 ·ä½“的には,バッファから文字を取り出す度に,その
    1441                 文字を書き出す.
    1442 
    1443         IOCTL_CRLF(改行モード)
    1444                 LF(line feed)を書き出すと,CR(carriage return)+LFに変換し
    1445                 て書き出す.
    1446 
    1447         IOCTL_FCSND(送信フロー制御)
    1448                 文字を送信する処理に対して,XON/XOFFによるフロー制御を行う.
    1449                 すなわち,STOP(コントロール-S)を受信すると送信を停止し,
    1450                 START(コントロール-Q)を受信すると送信を再開する.
    1451 
    1452         IOCTL_FCANY(送信フロー制御で任意の文字で送信再開)
    1453                 IOCTL_FCSNDを指定している時に,送信停止中に受信した任意の文字
    1454                 で送信を再開する.
    1455 
    1456         IOCTL_FCRCV(受信フロー制御)
    1457                 文字を受信する処理に対して,XON/XOFFによるフロー制御を行う.
    1458                 すなわち,受信バッファの残り領域が少なくなるとSTOP(コントロー
    1459                 ル-S)を送出し,残り領域が増えればSTART(コントロール-Q)を送
    1460                 出する.
    1461 
    1462 ãªãŠï¼Œã‚ªãƒ¼ãƒ—ン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF |
    1463 IOCTL_FCSND | IOCTL_FCRCV)である.
     1231portidで指定されたシリアルポートの制御情報を,ioctlで示される値に設定す
     1232る.
     1233
     1234ioctlには,以下の制御情報を表す定数を,ビット毎に論理和をとったものを
     1235指定する.
     1236
     1237        IOCTL_ECHO(エコーバックモード)
     1238                このビットを設定すると,シリアルインタフェースドライバがエコー
     1239                バックを行う.具体的には,バッファから文字を取り出す度に,その
     1240                文字を書き出す.
     1241
     1242        IOCTL_CRLF(改行モード)
     1243                LF(line feed)を書き出すと,CR(carriage return)+LFに変換し
     1244                て書き出す.
     1245
     1246        IOCTL_FCSND(送信フロー制御)
     1247                文字を送信する処理に対して,XON/XOFFによるフロー制御を行う.
     1248                すなわち,STOP(コントロール-S)を受信すると送信を停止し,
     1249                START(コントロール-Q)を受信すると送信を再開する.
     1250
     1251        IOCTL_FCANY(送信フロー制御で任意の文字で送信再開)
     1252                IOCTL_FCSNDを指定している時に,送信停止中に受信した任意の文字
     1253                で送信を再開する.
     1254
     1255        IOCTL_FCRCV(受信フロー制御)
     1256                文字を受信する処理に対して,XON/XOFFによるフロー制御を行う.
     1257                すなわち,受信バッファの残り領域が少なくなるとSTOP(コントロー
     1258                ル-S)を送出し,残り領域が増えればSTART(コントロール-Q)を送
     1259                出する.
     1260
     1261なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF |
     1262IOCTL_FCSND | IOCTL_FCRCV)である.
    14641263
    14651264(6) ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
    14661265
    1467 portidで指定されたシリアルポートの状æ
    1468 ‹ã‚’参ç
    1469 §ã—,pk_rporで指定されるパケッ
    1470 ãƒˆã«è¿”す.パケット中のreacntには受信バッファ中の文字数を,wricntには送
    1471 ä¿¡ãƒãƒƒãƒ•ã‚¡ä¸­ã®æ–‡å­—数を返す.
    1472 
    1473 8.2.2 シリアルインタフェースドライバのその他のサービス
    1474 
    1475 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œå‰è¨˜ã®ã‚µãƒ¼ãƒ“スコールに加えて,初期化
    1476 å‡¦ç†ã¨æœªé€ä¿¡æ–‡å­—の取出し処理を持つ.初期化処理は,カーネルに初期化ルー
    1477 ãƒãƒ³ã¨ã—て登録する.また,ターゲット依存で,初期化処理,終了処理,割込
    1478 ã¿ã‚µãƒ¼ãƒ“スルーチンを持つ.これらの登録処理はserial.cfgに含まれる.
     1266portidで指定されたシリアルポートの状態を参照し,pk_rporで指定されるパケッ
     1267トに返す.パケット中のreacntには受信バッファ中の文字数を,wricntには送
     1268信バッファ中の文字数を返す.
     1269
     12708.2.2 シリアルインタフェースドライバのその他のサービス
     1271
     1272シリアルインタフェースドライバは,前記のサービスコールに加えて,初期化
     1273処理と未送信文字の取出し処理を持つ.初期化処理は,カーネルに初期化ルー
     1274チンとして登録する.また,ターゲット依存で,初期化処理,終了処理,割込
     1275みサービスルーチンを持つ.これらの登録処理はserial.cfgに含まれる.
    14791276
    14801277(1) void serial_initialize(intptr_t exinf)
    14811278
    1482 ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã‚’初期化する.カーネルに初期化ルーチンと
    1483 ã—て登録する.exinfは無視する.
     1279シリアルインタフェースドライバを初期化する.カーネルに初期化ルーチンと
     1280して登録する.exinfは無視する.
    14841281
    14851282(2) bool_t serial_get_chr(ID portid, char *p_c)
    14861283
    1487 portidで指定されたシリアルポートの送信バッファ中の文字を,p_cの指す番地
    1488 ã«å–り出し,trueを返す関数.文字がなかった時には,falseを返す.終了処理
    1489 ãƒ«ãƒ¼ãƒãƒ³ä¸­ã§å‘¼ã³å‡ºã™ã“とを想定している.
    1490 
    1491 8.3 システムログタスク
    1492 
    1493 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‹ã‚‰ãƒ­ã‚°æƒ
    1494 å ±ã‚’取り出し,それをシ
    1495 ã‚¹ãƒ†ãƒ ã®å¤–部に出力するためのサービスである.
    1496 
    1497 ASPカーネルのリリースパッケージに含まれるシステムログタスクは,シリアル
    1498 ãƒãƒ¼ãƒˆã«ãƒ­ã‚°æƒ
    1499 å ±ã‚’文字列の形で出力するもので,システムログタスクの一例
    1500 ã¨ã„う位置付けで提供している.
    1501 
    1502 ã“のシステムログタスクは,システムコンフィギュレーションファイルで
    1503 logtask.cfgをインクルードすることで,システムに組み込むことができる.シ
    1504 ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®ã‚µãƒ¼ãƒ“スを呼び出すソースファイルでは,logtask.hをイン
    1505 ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã‚‹ï¼Ž
    1506 
    1507 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œé–‹å§‹ã•ã‚Œã‚‹ã¨ï¼Œé‡è¦åº¦ãŒLOG_EMERGのログæƒ
    1508 å ±ã‚’低レ
    1509 ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½ã‚’用いて出力し,重要度がLOG_NOTICEかそれより高いログæƒ
    1510 å ±ã‚’
    1511 ãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ã«è¨˜éŒ²ã™ã‚‹ã‚ˆã†ã«ï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®è¨­å®šãŒå¤‰æ›´ã•ã‚Œã‚‹ï¼Ž
    1512 
    1513 8.3.1 システムログタスクのサービスコール
    1514 
    1515 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®ã‚µãƒ¼ãƒ“スを呼び出すサービスコールの仕様は次の通りで
    1516 ã‚る.
     1284portidで指定されたシリアルポートの送信バッファ中の文字を,p_cの指す番地
     1285に取り出し,trueを返す関数.文字がなかった時には,falseを返す.終了処理
     1286ルーチン中で呼び出すことを想定している.
     1287
     12888.3 システムログタスク
     1289
     1290システムログタスクは,システムログ機能からログ情報を取り出し,それをシ
     1291ステムの外部に出力するためのサービスである.
     1292
     1293ASPカーネルのリリースパッケージに含まれるシステムログタスクは,シリアル
     1294ポートにログ情報を文字列の形で出力するもので,システムログタスクの一例
     1295という位置付けで提供している.
     1296
     1297このシステムログタスクは,システムコンフィギュレーションファイルで
     1298logtask.cfgをインクルードすることで,システムに組み込むことができる.シ
     1299ステムログタスクのサービスを呼び出すソースファイルでは,logtask.hをイン
     1300クルードする.
     1301
     1302システムログタスクが実行開始されると,重要度がLOG_EMERGのログ情報を低レ
     1303ベル出力機能を用いて出力し,重要度がLOG_NOTICEかそれより高いログ情報を
     1304ログバッファに記録するように,システムログ機能の設定が変更される.
     1305
     13068.3.1 システムログタスクのサービスコール
     1307
     1308システムログタスクのサービスを呼び出すサービスコールの仕様は次の通りで
     1309ある.
    15171310
    15181311(1) ER logtask_flush(uint_t count)
    15191312
    1520 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®ãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ä¸­ã®ãƒ­ã‚°æƒ
    1521 å ±ã®æ•°ãŒcount以下になるまでå¾
    1522 ã¤ï¼Ž
    1523 countが0の場合には,シリアルインタフェースドライバの送信バッファが空に
    1524 ãªã‚‹ã®ã‚‚å¾
    1525 ã¤ï¼Ž
    1526 
    1527 8.3.2 システムログタスクのその他のサービス
    1528 
    1529 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã¯ï¼Œå‰è¨˜ã®ã‚µãƒ¼ãƒ“スコールに加えて,メイン処理と終了処
    1530 ç†ã‚’持つ.メイン処理はタスクとして,終了処理は終了処理ルーチンとして登
    1531 éŒ²ã™ã‚‹ï¼Žã“れらの登録処理はlogtask.cfgに含まれる.
     1313システムログ機能のログバッファ中のログ情報の数がcount以下になるまで待つ.
     1314countが0の場合には,シリアルインタフェースドライバの送信バッファが空に
     1315なるのも待つ.
     1316
     13178.3.2 システムログタスクのその他のサービス
     1318
     1319システムログタスクは,前記のサービスコールに加えて,メイン処理と終了処
     1320理を持つ.メイン処理はタスクとして,終了処理は終了処理ルーチンとして登
     1321録する.これらの登録処理はlogtask.cfgに含まれる.
    15321322
    15331323(1) void logtask_main(intptr_t exinf)
    15341324
    1535 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®ãƒ¡ã‚¤ãƒ³å‡¦ç†ï¼Žexinfには,ログæƒ
    1536 å ±ã‚’出力するシリアルポー
    1537 ãƒˆã®ID番号を渡す.
     1325システムログタスクのメイン処理.exinfには,ログ情報を出力するシリアルポー
     1326トのID番号を渡す.
    15381327
    15391328(2) void logtask_terminate(intptr_t exinf)
    15401329
    1541 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®çµ‚了処理.シリアルインタフェースドライバの送信バッ
    1542 ãƒ•ã‚¡ã«è“„積されたデータと,ログバッファに記録されたログæƒ
    1543 å ±ã‚’,低レベル
    1544 å‡ºåŠ›æ©Ÿèƒ½ã‚’用いて出力する.出力すべきログæƒ
    1545 å ±ãŒã‚る場合には,それを出力
    1546 ã™ã‚‹å‰ã«ï¼Œ"-- buffered messages --"という文字列を出力する.exinfは無視
    1547 ã™ã‚‹ï¼Ž
    1548 
    1549 ã“の関数を終了処理ルーチンとして登録することで,カーネル終了時点で未出
    1550 åŠ›ã®ãƒ­ã‚°æƒ
    1551 å ±ã®ã»ã¨ã‚“どを出力することができる.ただし,未出力のログæƒ
    1552 å ±
    1553 ã®å†
    1554 ï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®ãƒ¡ã‚¤ãƒ³å‡¦ç†ãŒï¼Œãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰å–り出したが,
    1555 ã¾ã ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã«é€ä¿¡ã—ていないæƒ
    1556 å ±ã¯ï¼Œã“の関数では
    1557 å‡ºåŠ›ã§ããªã„.
    1558 
    1559 8.4 カーネル起動メッセージの出力
    1560 
    1561 ã‚«ãƒ¼ãƒãƒ«èµ·å‹•ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡ºåŠ›ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã®èµ·å‹•æ™‚に,カーネルの名称やバー
    1562 ã‚¸ãƒ§ãƒ³ç•ªå·ï¼Œè‘—作権表示などを出力するための機能である.
    1563 
    1564 ã‚«ãƒ¼ãƒãƒ«èµ·å‹•ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡ºåŠ›ã¯ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«
    1565 ã§banner.cfgをインクルードすることで,システムに組み込むことができる.
    1566 
    1567 ã‚«ãƒ¼ãƒãƒ«èµ·å‹•ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡ºåŠ›ã¯ï¼Œæ¬¡ã®é–¢æ•°ã§æ§‹æˆã•ã‚Œã‚‹ï¼Ž
     1330システムログタスクの終了処理.シリアルインタフェースドライバの送信バッ
     1331ファに蓄積されたデータと,ログバッファに記録されたログ情報を,低レベル
     1332出力機能を用いて出力する.出力すべきログ情報がある場合には,それを出力
     1333する前に,"-- buffered messages --"という文字列を出力する.exinfは無視
     1334する.
     1335
     1336この関数を終了処理ルーチンとして登録することで,カーネル終了時点で未出
     1337力のログ情報のほとんどを出力することができる.ただし,未出力のログ情報
     1338の内,システムログタスクのメイン処理が,ログバッファから取り出したが,
     1339まだシリアルインタフェースドライバに送信していない情報は,この関数では
     1340出力できない.
     1341
     13428.4 カーネル起動メッセージの出力
     1343
     1344カーネル起動メッセージの出力は,カーネルの起動時に,カーネルの名称やバー
     1345ジョン番号,著作権表示などを出力するための機能である.
     1346
     1347カーネル起動メッセージの出力は,システムコンフィギュレーションファイル
     1348でbanner.cfgをインクルードすることで,システムに組み込むことができる.
     1349
     1350カーネル起動メッセージの出力は,次の関数で構成される.
    15681351
    15691352(1) void print_banner(intptr_t exinf)
    15701353
    1571 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‚’用いて,カーネル起動メッセージを出力する.banner.cfg
    1572 ã«ã‚ˆã£ã¦ï¼Œã‚«ãƒ¼ãƒãƒ«ã«åˆæœŸåŒ–ルーチンとして登録される.exinfは無視される.
    1573 
    1574 
    1575 ï¼™ï¼Žã‚µãƒãƒ¼ãƒˆãƒ©ã‚¤ãƒ–ラリ
    1576 
    1577 ã‚µãƒãƒ¼ãƒˆãƒ©ã‚¤ãƒ–ラリは,アプリケーションやシステムサービスを作成するため
    1578 ã«åˆ©ç”¨ã§ãã‚‹ãƒ©ã‚¤ãƒ–ラリ関数群である.
    1579 
    1580 9.1 基本的なライブラリ関数
    1581 
    1582 åŸºæœ¬çš„なライブラリ関数を用いる場合には,t_stdlib.hをインクルードし,å¿
    1583 
    1584 è¦ã«å¿œã˜ã¦strerror.cとt_perror.cをコンパイル・リンクする.
     1354システムログ機能を用いて,カーネル起動メッセージを出力する.banner.cfg
     1355によって,カーネルに初期化ルーチンとして登録される.exinfは無視される.
     1356
     1357
     13589.サポートライブラリ
     1359
     1360サポートライブラリは,アプリケーションやシステムサービスを作成するため
     1361に利用できるライブラリ関数群である.
     1362
     13639.1 基本的なライブラリ関数
     1364
     1365基本的なライブラリ関数を用いる場合には,t_stdlib.hをインクルードし,必
     1366要に応じてstrerror.cとt_perror.cをコンパイル・リンクする.
    15851367
    15861368(1) const char *itron_strerror(ER ercd)
    15871369
    1588 ercdで示されるエラーコードに対応するメインエラーコードの文字列を返す.
     1370ercdで示されるエラーコードに対応するメインエラーコードの文字列を返す.
    15891371
    15901372(2) void t_perror(uint_t prio, const char *file, int_t line,
    15911373                                                                                const char *expr, ER ercd);
    15921374
    1593 ã‚µãƒ¼ãƒ“スコールがエラーを返した場合に用いることを想定した関数で,ファイ
    1594 ãƒ«åï¼Œè¡Œç•ªå·ï¼Œãƒ¡ã‚¤ãƒ³ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ç­‰ã‚’,重要度prioで,システムログ機能を
    1595 ç”¨ã„て出力する.
    1596 
    1597 9.2 キュー操作ライブラリ関数
    1598 
    1599 ã‚­ãƒ¥ãƒ¼æ“ä½œãƒ©ã‚¤ãƒ–ラリは,キューヘッダを含むリング構造のダブルリンクキュー
    1600 ã‚’扱うライブラリである.キューヘッダの次エントリはキューのå
    1601 ˆé ­ã®ã‚¨ãƒ³ãƒˆ
    1602 ãƒªï¼Œå‰ã‚¨ãƒ³ãƒˆãƒªã¯ã‚­ãƒ¥ãƒ¼ã®æœ«å°¾ã®ã‚¨ãƒ³ãƒˆãƒªã¨ã™ã‚‹ï¼Žã¾ãŸï¼Œã‚­ãƒ¥ãƒ¼ã®å
    1603 ˆé ­ã®ã‚¨ãƒ³
    1604 ãƒˆãƒªã®å‰ã‚¨ãƒ³ãƒˆãƒªã¨ï¼Œã‚­ãƒ¥ãƒ¼ã®æœ«å°¾ã®ã‚¨ãƒ³ãƒˆãƒªã®æ¬¡ã‚¨ãƒ³ãƒˆãƒªã¯ï¼Œã‚­ãƒ¥ãƒ¼ãƒ˜ãƒƒãƒ€
    1605 ã¨ã™ã‚‹ï¼Žç©ºã®ã‚­ãƒ¥ãƒ¼ã¯ï¼Œæ¬¡ã‚¨ãƒ³ãƒˆãƒªï¼Œå‰ã‚¨ãƒ³ãƒˆãƒªã¨ã‚‚自分自身を指すキューヘッ
    1606 ãƒ€ã§ã‚らわす.
    1607 
    1608 ã‚­ãƒ¥ãƒ¼æ“ä½œãƒ©ã‚¤ãƒ–ラリ関数を用いる場合には,queue.hをインクルードする.
    1609 
    1610 ã‚­ãƒ¥ãƒ¼ãƒ˜ãƒƒãƒ€ã¨ã‚¨ãƒ³ãƒˆãƒªã®ãŸã‚ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã¨ã—て,QUEUE構造体を用いる.
    1611 QUEUE構造体の定義は次の通り.
     1375サービスコールがエラーを返した場合に用いることを想定した関数で,ファイ
     1376ル名,行番号,メインエラーコード等を,重要度prioで,システムログ機能を
     1377用いて出力する.
     1378
     13799.2 キュー操作ライブラリ関数
     1380
     1381キュー操作ライブラリは,キューヘッダを含むリング構造のダブルリンクキュー
     1382を扱うライブラリである.キューヘッダの次エントリはキューの先頭のエント
     1383リ,前エントリはキューの末尾のエントリとする.また,キューの先頭のエン
     1384トリの前エントリと,キューの末尾のエントリの次エントリは,キューヘッダ
     1385とする.空のキューは,次エントリ,前エントリとも自分自身を指すキューヘッ
     1386ダであらわす.
     1387
     1388キュー操作ライブラリ関数を用いる場合には,queue.hをインクルードする.
     1389
     1390キューヘッダとエントリのためのデータ構造として,QUEUE構造体を用いる.
     1391QUEUE構造体の定義は次の通り.
    16121392
    16131393        typedef struct queue {
    1614                 struct queue *p_next;           /* 次エントリへのポインタ */
    1615                 struct queue *p_prev;           /* 前エントリへのポインタ */
     1394                struct queue *p_next;           /* 次エントリへのポインタ */
     1395                struct queue *p_prev;           /* 前エントリへのポインタ */
    16161396        } QUEUE;
    16171397
    1618 ã‚­ãƒ¥ãƒ¼æ“ä½œã®ãŸã‚ã«ç”¨æ„ã—ている関数は次の通り.
     1398キュー操作のために用意している関数は次の通り.
    16191399
    16201400(1) void queue_initialize(QUEUE *p_queue);
    16211401
    1622 ã‚­ãƒ¥ãƒ¼ã‚’初期化する.p_queueにはキューヘッダを指定する.
     1402キューを初期化する.p_queueにはキューヘッダを指定する.
    16231403
    16241404(2) void queue_insert_prev(QUEUE *p_queue, QUEUE *p_entry);
    16251405
    1626 p_queueで指定するエントリの前に,p_entryで指定するエントリを挿å
    1627 ¥ã™ã‚‹ï¼Ž
    1628 p_queueにキューヘッダを指定した場合には,キューの末尾にp_entryで指定す
    1629 ã‚‹ã‚¨ãƒ³ãƒˆãƒªã‚’挿å
    1630 ¥ã™ã‚‹ã“とになる.
     1406p_queueで指定するエントリの前に,p_entryで指定するエントリを挿入する.
     1407p_queueにキューヘッダを指定した場合には,キューの末尾にp_entryで指定す
     1408るエントリを挿入することになる.
    16311409
    16321410(3) void queue_insert_next(QUEUE *p_queue, QUEUE *p_entry);
    16331411
    1634 p_queueで指定するエントリの次に,p_entryで指定するエントリを挿å
    1635 ¥ã™ã‚‹ï¼Ž
    1636 p_queueにキューヘッダを指定した場合には,キューのå
    1637 ˆé ­ã«p_entryで指定す
    1638 ã‚‹ã‚¨ãƒ³ãƒˆãƒªã‚’挿å
    1639 ¥ã™ã‚‹ã“とになる.
     1412p_queueで指定するエントリの次に,p_entryで指定するエントリを挿入する.
     1413p_queueにキューヘッダを指定した場合には,キューの先頭にp_entryで指定す
     1414るエントリを挿入することになる.
    16401415
    16411416(4) void queue_delete(QUEUE *p_entry);
    16421417
    1643 p_entryで指定するエントリを,キューから削除する.
     1418p_entryで指定するエントリを,キューから削除する.
    16441419
    16451420(5) QUEUE *queue_delete_next(QUEUE *p_queue);
    16461421
    1647 p_queueで指定するエントリの次のエントリをキューから削除し,削除したエン
    1648 ãƒˆãƒªã‚’返す.p_queueにキューヘッダを指定した場合には,キューのå
    1649 ˆé ­ã®ã‚¨ãƒ³
    1650 ãƒˆãƒªã‚’取り出すことになる.p_queueに空のキューを指定して呼び出してはなら
    1651 ãªã„.
     1422p_queueで指定するエントリの次のエントリをキューから削除し,削除したエン
     1423トリを返す.p_queueにキューヘッダを指定した場合には,キューの先頭のエン
     1424トリを取り出すことになる.p_queueに空のキューを指定して呼び出してはなら
     1425ない.
    16521426
    16531427(6) bool_t queue_empty(QUEUE *p_queue);
    16541428
    1655 ã‚­ãƒ¥ãƒ¼ãŒç©ºã®å ´åˆã«ã¯true,そうでない場合にはfalseを返す.p_queueには
    1656 ã‚­ãƒ¥ãƒ¼ãƒ˜ãƒƒãƒ€ã‚’指定する.
    1657 
    1658 9.3 システムログ出力用ライブラリ関数
    1659 
    1660 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°å‡ºåŠ›ç”¨ãƒ©ã‚¤ãƒ–ラリ関数は,ログæƒ
    1661 å ±ã‚’フォーマット出力するため
    1662 ã«ï¼Œã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ãŠã‚ˆã³ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã§ç”¨ã„るための関数群である.
    1663 
    1664 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°å‡ºåŠ›ç”¨ãƒ©ã‚¤ãƒ–ラリ関数を用いる場合には,log_output.hをインク
    1665 ãƒ«ãƒ¼ãƒ‰ã—,log_output.cをコンパイル・リンクする.
     1429キューが空の場合にはtrue,そうでない場合にはfalseを返す.p_queueには
     1430キューヘッダを指定する.
     1431
     14329.3 システムログ出力用ライブラリ関数
     1433
     1434システムログ出力用ライブラリ関数は,ログ情報をフォーマット出力するため
     1435に,システムログタスクおよびシステムログ機能で用いるための関数群である.
     1436
     1437システムログ出力用ライブラリ関数を用いる場合には,log_output.hをインク
     1438ルードし,log_output.cをコンパイル・リンクする.
    16661439
    16671440(1) void syslog_printf(const char *format, const intptr_t *p_args,
    16681441                                                                                                void (*putc)(char))
    16691442
    1670 formatで指定されるフォーマット記述とp_argsで指定される引数列から作成し
    1671 ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’,1文字出力関数putcを用いて出力する.
     1443formatで指定されるフォーマット記述とp_argsで指定される引数列から作成し
     1444たメッセージを,1文字出力関数putcを用いて出力する.
    16721445
    16731446(2) void syslog_print(const SYSLOG *p_syslog, void (*putc)(char))
    16741447
    1675 p_syslogで指定されるログæƒ
    1676 å ±ã‚’文字列に直し,1文字出力関数putcを用いて出
    1677 åŠ›ã™ã‚‹ï¼Ž
     1448p_syslogで指定されるログ情報を文字列に直し,1文字出力関数putcを用いて出
     1449力する.
    16781450
    16791451(3) void syslog_lostmsg(uint_t lost, void (*putc)(char))
    16801452
    1681 lost個のログæƒ
    1682 å ±ãŒå¤±ã‚ã‚ŒãŸæ—¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’,1文字出力関数putcを用いて出
    1683 åŠ›ã™ã‚‹ï¼Ž
    1684 
    1685 9.4 実行時間分布集計モジュール
    1686 
    1687 å®Ÿè¡Œæ™‚間分布集計モジュールは,システムのリアルタイム性能を評価するため
    1688 ã«ï¼Œãƒ—ログラム区間の実行時間を計測し,その分布を集計・表示するためのラ
    1689 ã‚¤ãƒ–ラリ関数群である.
    1690 
    1691 å®Ÿè¡Œæ™‚間分布集計モジュールを用いる場合には,histogram.hをインクルードし,
    1692 histogram.cをコンパイル・リンクする.
    1693 
    1694 å®Ÿè¡Œæ™‚間分布集計モジュールは,複数のプログラム区間の実行時間を計測・集
    1695 è¨ˆãƒ»è¡¨ç¤ºã™ã‚‹ã“とができる.プログラム区間毎に,実行時間分布を記録するた
    1696 ã‚ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã‚’持つ.どのデータ構造を用いるかを,ID番号(histid)で指
    1697 å®šã™ã‚‹ï¼Žä½¿ç”¨ã§ãã‚‹ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã®æ•°ã¯ï¼ŒTNUM_HISTで定義される.すなわち,
    1698 ID番号として,1~TNUM_HISTを指定することができる.TNUM_HISTは,デフォル
    1699 ãƒˆå€¤ãŒhistgram.cの中で定義されており,コンパイルオプションやターゲット
    1700 ä¾å­˜éƒ¨ï¼ˆtarget_test.hまたはそこからインクルードされるファイル)により変
    1701 æ›´ã™ã‚‹ã“とができる.
    1702 
    1703 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§è¨­å®šã‚’変更していない場合,実行時間分布集計モジュール
    1704 ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã®æ€§èƒ½è©•ä¾¡ç”¨ã‚·ã‚¹ãƒ†ãƒ æ™‚刻を参ç
    1705 §ã™ã‚‹æ©Ÿèƒ½ï¼ˆget_utm)を用いて実
    1706 è¡Œæ™‚間を計測する.そのため,実行時間はマイクロ秒単位で記録される(精度
    1707 ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ï¼‰ï¼Žã¾ãŸï¼Œè¨˜éŒ²ã•ã‚Œã‚‹æ™‚間には,計測のためのオーバヘッド
    1708 ï¼ˆget_utmの実行時間+α)が含まれる.
    1709 
    1710 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§è¨­å®šã‚’変更している場合の仕様については,ターゲット依
    1711 å­˜éƒ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ºãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’参ç
    1712 §ã™ã‚‹ã“と.
     1453lost個のログ情報が失われた旨のメッセージを,1文字出力関数putcを用いて出
     1454力する.
     1455
     14569.4 実行時間分布集計モジュール
     1457
     1458実行時間分布集計モジュールは,システムのリアルタイム性能を評価するため
     1459に,プログラム区間の実行時間を計測し,その分布を集計・表示するためのラ
     1460イブラリ関数群である.
     1461
     1462実行時間分布集計モジュールを用いる場合には,histogram.hをインクルードし,
     1463histogram.cをコンパイル・リンクする.
     1464
     1465実行時間分布集計モジュールは,複数のプログラム区間の実行時間を計測・集
     1466計・表示することができる.プログラム区間毎に,実行時間分布を記録するた
     1467めのデータ構造を持つ.どのデータ構造を用いるかを,ID番号(histid)で指
     1468定する.使用できるデータ構造の数は,TNUM_HISTで定義される.すなわち,
     1469ID番号として,1~TNUM_HISTを指定することができる.TNUM_HISTは,デフォル
     1470ト値がhistgram.cの中で定義されており,コンパイルオプションやターゲット
     1471依存部(target_test.hまたはそこからインクルードされるファイル)により変
     1472更することができる.
     1473
     1474ターゲット依存部で設定を変更していない場合,実行時間分布集計モジュール
     1475は,カーネルの性能評価用システム時刻を参照する機能(get_utm)を用いて実
     1476行時間を計測する.そのため,実行時間はマイクロ秒単位で記録される(精度
     1477はターゲット依存).また,記録される時間には,計測のためのオーバヘッド
     1478(get_utmの実行時間+α)が含まれる.
     1479
     1480ターゲット依存部で設定を変更している場合の仕様については,ターゲット依
     1481存部のユーザーズマニュアルを参照すること.
    17131482
    17141483(1) void init_hist(ID histid, uint_t maxval, uint_t histarea[])
    17151484
    1716 histidで指定されたデータ構造を初期化する.maxvalには記録する最大時間を,
    1717 histareaには記録領域のå
    1718 ˆé ­ç•ªåœ°ã‚’指定する.histareaで始まる記憶領域は,
    1719 è¦ç´ æ•°ãŒmaxvalに指定した値+1のuint_t型のé
    1720 åˆ—として確保する.例えば,
    1721 maxvalに1000を指定する場合には,histareaには要素数が1001のuint_t型のé
    1722 
    1723 åˆ—のå
    1724 ˆé ­ç•ªåœ°ã‚’渡す.
     1485histidで指定されたデータ構造を初期化する.maxvalには記録する最大時間を,
     1486histareaには記録領域の先頭番地を指定する.histareaで始まる記憶領域は,
     1487要素数がmaxvalに指定した値+1のuint_t型の配列として確保する.例えば,
     1488maxvalに1000を指定する場合には,histareaには要素数が1001のuint_t型の配
     1489列の先頭番地を渡す.
    17251490
    17261491(2) void begin_measure(ID histid)
    17271492
    1728 å®Ÿè¡Œæ™‚間を計測するプログラム区間の直前に呼び出す関数.histidで指定され
    1729 ãŸãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«ï¼Œç¾åœ¨ã®ã‚·ã‚¹ãƒ†ãƒ æ™‚刻を記録する.
     1493実行時間を計測するプログラム区間の直前に呼び出す関数.histidで指定され
     1494たデータ構造に,現在のシステム時刻を記録する.
    17301495
    17311496(3) void end_measure(ID histid)
    17321497
    1733 å®Ÿè¡Œæ™‚間を計測するプログラム区間の直後に呼び出す関数.現在のシステム時
    1734 åˆ»ã¨ï¼Œhistidで指定されたデータ構造に記録された開始時刻から,プログラム
    1735 åŒºé–“の実行時間を求め,その結果を記録する.
     1498実行時間を計測するプログラム区間の直後に呼び出す関数.現在のシステム時
     1499刻と,histidで指定されたデータ構造に記録された開始時刻から,プログラム
     1500区間の実行時間を求め,その結果を記録する.
    17361501
    17371502(4) void print_hist(ID histid)
    17381503
    1739 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‚’用いて,実行時間分布の計測結果を出力する.
    1740 
    1741 
    1742 ï¼‘0.テストプログラム
    1743 
    1744 ãƒ†ã‚¹ãƒˆãƒ—ログラムは,カーネルの機能テストおよび性能評価を行うためのプロ
    1745 ã‚°ãƒ©ãƒ ç¾¤ã§ã‚る.
    1746 
    1747 10.1 テストプログラム用ライブラリ
    1748 
    1749 ãƒ†ã‚¹ãƒˆãƒ—ログラム用ライブラリは,プログラム中のチェックポイントが正しい
    1750 é †åºã§å®Ÿè¡Œã•ã‚ŒãŸã“となど,プログラムが正しく動作していることをチェック
    1751 ã™ã‚‹ãŸã‚ã®é–¢æ•°ç¾¤ã§ã‚る.プログラムが正しく動作していないことを検出した
    1752 å ´åˆã«ã¯ï¼Œãƒ—ログラムを終了させる.
    1753 
    1754 ãƒ†ã‚¹ãƒˆãƒ—ログラム用ライブラリ関数を用いる場合には,test_lib.hをインクルー
    1755 ãƒ‰ã—,test_lib.cをコンパイル・リンクする.
     1504システムログ機能を用いて,実行時間分布の計測結果を出力する.
     1505
     1506
     150710.テストプログラム
     1508
     1509テストプログラムは,カーネルの機能テストおよび性能評価を行うためのプロ
     1510グラム群である.
     1511
     151210.1 テストプログラム用ライブラリ
     1513
     1514テストプログラム用ライブラリは,プログラム中のチェックポイントが正しい
     1515順序で実行されたことなど,プログラムが正しく動作していることをチェック
     1516するための関数群である.プログラムが正しく動作していないことを検出した
     1517場合には,プログラムを終了させる.
     1518
     1519テストプログラム用ライブラリ関数を用いる場合には,test_lib.hをインクルー
     1520ドし,test_lib.cをコンパイル・リンクする.
    17561521
    17571522(1) void check_point(uint_t count)
    17581523
    1759 ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚’通過する際に呼び出す関数.countには,何番目のチェック
    1760 ãƒã‚¤ãƒ³ãƒˆã§ã‚るかを指定する(最初のチェックポイントでは1を指定する).
    1761 countの値が,最初のチェックポイントにおいては1でない場合に,それ以降の
    1762 ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã„ては,前のチェックポイント通過時にcountに指定した
    1763 å€¤ã«1を加えた値でない場合に,プログラムが正しく動作していないと見なし,
    1764 ãƒ—ログラムを終了させる.
     1524チェックポイントを通過する際に呼び出す関数.countには,何番目のチェック
     1525ポイントであるかを指定する(最初のチェックポイントでは1を指定する).
     1526countの値が,最初のチェックポイントにおいては1でない場合に,それ以降の
     1527チェックポイントにおいては,前のチェックポイント通過時にcountに指定した
     1528値に1を加えた値でない場合に,プログラムが正しく動作していないと見なし,
     1529プログラムを終了させる.
    17651530
    17661531(2) void check_finish(uint_t count)
    17671532
    1768 æœ€å¾Œã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«åˆ°é”した際に呼び出す関数.countには,何番目の
    1769 ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã§ã‚るかを指定する(最初のチェックポイントでは1を指定す
    1770 ã‚‹ï¼‰ï¼Žcountの値が,前のチェックポイント通過時にcountに指定した値に1を加
    1771 ãˆãŸå€¤ã§ãªã„場合に,プログラムが正しく動作していないと見なす.この関数
    1772 ã¯ï¼Œãƒ—ログラムが正しく動作している/いないに関わらず,プログラムを終了
    1773 ã•ã›ã‚‹ï¼Ž
     1533最後のチェックポイントに到達した際に呼び出す関数.countには,何番目の
     1534チェックポイントであるかを指定する(最初のチェックポイントでは1を指定す
     1535る).countの値が,前のチェックポイント通過時にcountに指定した値に1を加
     1536えた値でない場合に,プログラムが正しく動作していないと見なす.この関数
     1537は,プログラムが正しく動作している/いないに関わらず,プログラムを終了
     1538させる.
    17741539
    17751540(3) void check_assert(bool_t exp)
    17761541
    1777 expが真であることをチェックしたい場合に呼び出す関数.expが偽である場合
    1778 ã«ï¼Œãƒ—ログラムが正しく動作していないと見なし,プログラムを終了させる.
     1542expが真であることをチェックしたい場合に呼び出す関数.expが偽である場合
     1543に,プログラムが正しく動作していないと見なし,プログラムを終了させる.
    17791544
    17801545(4) void check_ercd(ER ercd, ER expected_ercd)
    17811546
    1782 ercdがexpected_ercdに一致していることをチェックしたい場合に呼び出す関数.
    1783 ercdがexpected_ercdに一致していない場合に,プログラムが正しく動作してい
    1784 ãªã„と見なし,プログラムを終了させる.
     1547ercdがexpected_ercdに一致していることをチェックしたい場合に呼び出す関数.
     1548ercdがexpected_ercdに一致していない場合に,プログラムが正しく動作してい
     1549ないと見なし,プログラムを終了させる.
    17851550
    17861551(5) void check_state(bool_t ctx, bool_t loc, PRI ipm,
    17871552                                                bool_t dsp, bool_t dpn, bool_t tex)
    17881553
    1789 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«ãŠã„て,システム状æ
    1790 ‹ãŒæœŸå¾
    1791 ã—たものになっているか
    1792 ãƒã‚§ãƒƒã‚¯ã—たい時に呼び出す関数.ctx,loc,dsp,dpn,texにはそれぞれ
    1793 sns_ctx(),sns_loc(),sns_dsp(),sns_dpn(),sns_tex()の返値として期å¾
    1794 ã•
    1795 ã‚Œã‚‹å€¤ã‚’,ipmにはget_ipm()で参ç
    1796 §ã§ãã‚‹å‰²è¾¼ã¿å„ªå
    1797 ˆåº¦ãƒžã‚¹ã‚¯ã¨ã—て期å¾
    1798 ã•ã‚Œ
    1799 ã‚‹å€¤ã‚’指定する.このå†
    1800 ã®ã„ずれかが期å¾
    1801 ã•ã‚Œã‚‹å€¤ã¨ä¸€è‡´ã—ていない場合に,
    1802 ãƒ—ログラムが正しく動作していないと見なし,プログラムを終了させる.
     1554タスクコンテキストにおいて,システム状態が期待したものになっているか
     1555チェックしたい時に呼び出す関数.ctx,loc,dsp,dpn,texにはそれぞれ
     1556sns_ctx(),sns_loc(),sns_dsp(),sns_dpn(),sns_tex()の返値として期待さ
     1557れる値を,ipmにはget_ipm()で参照できる割込み優先度マスクとして期待され
     1558る値を指定する.この内のいずれかが期待される値と一致していない場合に,
     1559プログラムが正しく動作していないと見なし,プログラムを終了させる.
    18031560
    18041561(6) void check_state_i(bool_t ctx, bool_t loc,
    18051562                                                bool_t dsp, bool_t dpn, bool_t tex)
    18061563
    1807 éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«ãŠã„て,システム状æ
    1808 ‹ãŒæœŸå¾
    1809 ã—たものになっているか
    1810 ãƒã‚§ãƒƒã‚¯ã—たい時に呼び出す関数.ctx,loc,dsp,dpn,texにはそれぞれ
    1811 sns_ctx(),sns_loc(),sns_dsp(),sns_dpn(),sns_tex()の返値として期å¾
    1812 ã•
    1813 ã‚Œã‚‹å€¤ã‚’指定する.このå†
    1814 ã®ã„ずれかが期å¾
    1815 ã•ã‚Œã‚‹å€¤ã¨ä¸€è‡´ã—ていない場合に,
    1816 ãƒ—ログラムが正しく動作していないと見なし,プログラムを終了させる.
     1564非タスクコンテキストにおいて,システム状態が期待したものになっているか
     1565チェックしたい時に呼び出す関数.ctx,loc,dsp,dpn,texにはそれぞれ
     1566sns_ctx(),sns_loc(),sns_dsp(),sns_dpn(),sns_tex()の返値として期待さ
     1567れる値を指定する.この内のいずれかが期待される値と一致していない場合に,
     1568プログラムが正しく動作していないと見なし,プログラムを終了させる.
    18171569
    18181570(7) void set_bit_func(BIT_FUNC bit_func)
    18191571
    1820 ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã„て呼び出す自己診断関数を設定するための関数.
     1572チェックポイントにおいて呼び出す自己診断関数を設定するための関数.
    18211573
    18221574(8) void test_start(char *progname)
    18231575
    1824 ãƒ†ã‚¹ãƒˆé–‹å§‹æ™‚に,テストプログラム名を出力するための関数.
     1576テスト開始時に,テストプログラム名を出力するための関数.
    18251577
    18261578(9) void syslog_flush(void)
    18271579
    1828 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã«è¨˜éŒ²ã•ã‚ŒãŸãƒ­ã‚°æƒ
    1829 å ±ã‚’,低レベル出力機能に用いる文字出
    1830 åŠ›é–¢æ•°ã«ã‚ˆã‚Šå‡ºåŠ›ã™ã‚‹ï¼Ž
     1580システムログ機能に記録されたログ情報を,低レベル出力機能に用いる文字出
     1581力関数により出力する.
    18311582
    18321583(10) void test_finish(void)
    18331584
    1834 ãƒ—ログラムを終了させる関数.チェックポイントを使用しない場合に,この関
    1835 æ•°ã‚’用いる.
    1836 
    1837 10.2 カーネルの整合性検査
    1838 
    1839 ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã„て呼び出す自己診断に使うためのプログラムとして,
    1840 ã‚«ãƒ¼ãƒãƒ«ã®æ•´åˆæ€§æ¤œæŸ»ã‚’用意している.カーネルの整合性検査は,カーネルå†
    1841 
    1842 ã®å„データ構造の一貫性を検査する(現時点では未完成).
    1843 
    1844 ã‚«ãƒ¼ãƒãƒ«ã®æ•´åˆæ€§æ¤œæŸ»ã‚’用いる場合には,bit_kernel.cをコンパイル・リンク
    1845 ã™ã‚‹ï¼Ž
     1585プログラムを終了させる関数.チェックポイントを使用しない場合に,この関
     1586数を用いる.
     1587
     158810.2 カーネルの整合性検査
     1589
     1590チェックポイントにおいて呼び出す自己診断に使うためのプログラムとして,
     1591カーネルの整合性検査を用意している.カーネルの整合性検査は,カーネル内
     1592の各データ構造の一貫性を検査する(現時点では未完成).
     1593
     1594カーネルの整合性検査を用いる場合には,bit_kernel.cをコンパイル・リンク
     1595する.
    18461596
    18471597(1) ER bit_kernel(void)
    18481598
    1849 ã‚«ãƒ¼ãƒãƒ«å†
    1850 ã®å„データ構造の一貫性を検査し,一貫性が確認できた場合にE_OK,
    1851 ã§ããªã‹ã£ãŸå ´åˆã«E_SYSエラーを返す関数.E_SYSエラーを返す際のサブエラー
    1852 ã‚³ãƒ¼ãƒ‰ã¨ã—て,一貫性が確認できなかったé 
    1853 ç›®ã‚’示すコードを返す.
    1854 
    1855 10.3 機能テストプログラム
    1856 
    1857 testディレクトリに置かれた"test"で始まるプログラムは,カーネルの機能テ
    1858 ã‚¹ãƒˆã‚’行うためのプログラムである.
    1859 
    1860 æ©Ÿèƒ½ãƒ†ã‚¹ãƒˆãƒ—ログラムはテストプログラム用ライブラリを使用しているため,
    1861 æ§‹ç¯‰ã™ã‚‹å ´åˆã«ã¯ï¼ŒMakefileのAPPL_COBJSに,test_lib.oを追加するå¿
    1862 è¦ãŒã‚
    1863 ã‚‹ï¼Žã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トを使用する場合には,-Uオプションで
    1864 test_lib.oを指定する.å
    1865 ·ä½“的には,次のコマンドを実行すればよい(構築用
    1866 ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒï¼ŒASPカーネルのソースファイルを展開したディレクトリの直
    1867 ä¸‹ã«ã‚ると仮定している).
    1868 
    1869         % perl ../configure -T <ターゲット略称> -A <機能テストプログラム名> \
     1599カーネル内の各データ構造の一貫性を検査し,一貫性が確認できた場合にE_OK,
     1600できなかった場合にE_SYSエラーを返す関数.E_SYSエラーを返す際のサブエラー
     1601コードとして,一貫性が確認できなかった項目を示すコードを返す.
     1602
     160310.3 機能テストプログラム
     1604
     1605testディレクトリに置かれた"test"で始まるプログラムは,カーネルの機能テ
     1606ストを行うためのプログラムである.
     1607
     1608機能テストプログラムはテストプログラム用ライブラリを使用しているため,
     1609構築する場合には,MakefileのAPPL_COBJSに,test_lib.oを追加する必要があ
     1610る.コンフィギュレーションスクリプトを使用する場合には,-Uオプションで
     1611test_lib.oを指定する.具体的には,次のコマンドを実行すればよい(構築用
     1612のディレクトリが,ASPカーネルのソースファイルを展開したディレクトリの直
     1613下にあると仮定している).
     1614
     1615        % perl ../configure -T <ターゲット略称> -A <機能テストプログラム名> \
    18701616                                                                                        -a ../test -U test_lib.o
    18711617
    1872 ãŸã ã—,CPU例外処理のテスト(1)~(13)は,同一のシステムコンフィギュレー
    1873 ã‚·ãƒ§ãƒ³ã‚’å
    1874 ±ç”¨ã—ているため,test_cpuexc.cfgを次のようにコピーしておくå¿
    1875 è¦
    1876 ãŒã‚る.
    1877 
    1878         % cp ../test/test_cpuexc.cfg test_cpuexc<テスト番号>.cfg
    1879 
    1880 ç¾ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ç”¨æ„ã—ている機能テストプログラムは次の通り.
    1881 
    1882 (1) test_cpuexc1                        CPU例外処理のテスト(1)
    1883 (2) test_cpuexc2                        CPU例外処理のテスト(2)
    1884 (3) test_cpuexc3                        CPU例外処理のテスト(3)
    1885 (4) test_cpuexc4                        CPU例外処理のテスト(4)
    1886 (5) test_cpuexc5                        CPU例外処理のテスト(5)
    1887 (6) test_cpuexc6                        CPU例外処理のテスト(6)
    1888 (7) test_cpuexc7                        CPU例外処理のテスト(7)
    1889 (8) test_cpuexc8                        CPU例外処理のテスト(8)
    1890 (9) test_cpuexc9                        CPU例外処理のテスト(9)
    1891 (10) test_cpuexc10                      CPU例外処理のテスト(10)
    1892 (11) test_cpuexc11                      CPU例外処理のテスト(11)
    1893 (12) test_cpuexc12                      CPU例外処理のテスト(12)
    1894 (13) test_cpuexc13                      CPU例外処理のテスト(13)
    1895 (14) test_dlynse                        sil_dly_nseに関するテスト
    1896 (15) test_sem1                          セマフォ機能のテスト(1)
    1897 (16) test_sem2                          セマフォ機能のテスト(2)
    1898 (17) test_sysstat1                      システム状æ
    1899 ‹ã«é–¢ã™ã‚‹ãƒ†ã‚¹ãƒˆ(1)
    1900 (18) test_task1                         ã‚¿ã‚¹ã‚¯ç®¡ç†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ãƒ†ã‚¹ãƒˆ(1)
    1901 (19) test_tex1                          タスク例外処理に関するテスト(1)
    1902 (20) test_tex2                          タスク例外処理に関するテスト(2)
    1903 (21) test_utm1                          get_utmに関するテスト(1)
    1904 
    1905 CPU例外処理のテストプログラムの一部は,CPU例外ハンドラからリターンした
    1906 å ´åˆã«ï¼ŒCPU例外を発生させた命令の次から実行が継続されることを前提に作成
    1907 ã•ã‚Œã¦ã„る.この前提が成り立たない場合には,テストプログラムのターゲッ
    1908 ãƒˆä¾å­˜å®šç¾©ã«ãŠã„て,CANNOT_RETURN_CPUEXCをマクロ定義することがå¿
    1909 è¦ã§ã‚
    1910 ã‚‹ï¼Žè©³ã—くは,「ターゲット依存部 ポーティングガイド」を参ç
    1911 §ã™ã‚‹ã“と.
    1912 
    1913 10.4 性能評価プログラム
    1914 
    1915 testディレクトリに置かれた"perf"で始まるプログラムは,カーネルの性能評
    1916 ä¾¡ã‚’行うためのプログラムである.
    1917 
    1918 æ€§èƒ½è©•ä¾¡ãƒ—ログラムは,計測対象となる処理を繰り返し実行し,その実行時間
    1919 ã‚’計測して,実行時間分布を表示する.
    1920 
    1921 è¨ˆæ¸¬ã—た実行時間には,時間計測のオーバヘッド(時間計測処理の実行にかか
    1922 ã‚‹æ™‚間)が含まれる.計測対象の処理の正味の実行時間を求めるためには,計
    1923 æ¸¬ã•ã‚ŒãŸæ™‚間から,時間計測のオーバヘッドを計測するためのプログラム
    1924 ï¼ˆperf0)で計測された時間を減算するå¿
    1925 è¦ãŒã‚る.
    1926 
    1927 ã¾ãŸï¼Œå®Ÿè¡Œæ™‚間の計測は,別に記述がない限り割込みを許可したまま行うため,
    1928 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ï¼ˆå°‘なくとも,タイマ割込みハンドラ)の処理時間が含まれた
    1929 å®Ÿè¡ŒçµæžœãŒè¨ˆæ¸¬ã•ã‚Œã‚‹ï¼Ž
    1930 
    1931 ã‚«ãƒ¼ãƒãƒ«ã®æ€§èƒ½è©•ä¾¡ã«ã‚たっては,ハードウェア(特にキャッシュ)の設定に
    1932 ç•™æ„ã™ã‚‹å¿
    1933 è¦ãŒã‚る.
    1934 
    1935 æ€§èƒ½è©•ä¾¡ãƒ—ログラムはテストプログラム用ライブラリと実行時間分布集計モ
    1936 ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’使用しているため,構築する場合には,MakefileのAPPL_COBJSに,
    1937 test_lib.oとhistogram.oを追加するå¿
    1938 è¦ãŒã‚る.コンフィギュレーションスク
    1939 ãƒªãƒ—トを使用する場合には,-Uオプションでtest_lib.oとhistgram.oを指定す
    1940 ã‚‹ï¼Žå
    1941 ·ä½“的には,次のコマンドを実行すればよい(構築用のディレクトリが,
    1942 ASPカーネルのソースファイルを展開したディレクトリの直下にあると仮定して
    1943 ã„る).
    1944 
    1945         % perl ../configure -T <ターゲット略称> -A <性能評価プログラム名> \
     1618ただし,CPU例外処理のテスト(1)~(13)は,同一のシステムコンフィギュレー
     1619ションを共用しているため,test_cpuexc.cfgを次のようにコピーしておく必要
     1620がある.
     1621
     1622        % cp ../test/test_cpuexc.cfg test_cpuexc<テスト番号>.cfg
     1623
     1624現バージョンで用意している機能テストプログラムは次の通り.
     1625
     1626(1) test_cpuexc1                        CPU例外処理のテスト(1)
     1627(2) test_cpuexc2                        CPU例外処理のテスト(2)
     1628(3) test_cpuexc3                        CPU例外処理のテスト(3)
     1629(4) test_cpuexc4                        CPU例外処理のテスト(4)
     1630(5) test_cpuexc5                        CPU例外処理のテスト(5)
     1631(6) test_cpuexc6                        CPU例外処理のテスト(6)
     1632(7) test_cpuexc7                        CPU例外処理のテスト(7)
     1633(8) test_cpuexc8                        CPU例外処理のテスト(8)
     1634(9) test_cpuexc9                        CPU例外処理のテスト(9)
     1635(10) test_cpuexc10                      CPU例外処理のテスト(10)
     1636(11) test_cpuexc11                      CPU例外処理のテスト(11)
     1637(12) test_cpuexc12                      CPU例外処理のテスト(12)
     1638(13) test_cpuexc13                      CPU例外処理のテスト(13)
     1639(14) test_dlynse                        sil_dly_nseに関するテスト
     1640(15) test_sem1                          セマフォ機能のテスト(1)
     1641(16) test_sem2                          セマフォ機能のテスト(2)
     1642(17) test_sysstat1                      システム状態に関するテスト(1)
     1643(18) test_task1                         タスク管理モジュールのテスト(1)
     1644(19) test_tex1                          タスク例外処理に関するテスト(1)
     1645(20) test_tex2                          タスク例外処理に関するテスト(2)
     1646(21) test_utm1                          get_utmに関するテスト(1)
     1647
     1648CPU例外処理のテストプログラムの一部は,CPU例外ハンドラからリターンした
     1649場合に,CPU例外を発生させた命令の次から実行が継続されることを前提に作成
     1650されている.この前提が成り立たない場合には,テストプログラムのターゲッ
     1651ト依存定義において,CANNOT_RETURN_CPUEXCをマクロ定義することが必要であ
     1652る.詳しくは,「ターゲット依存部 ポーティングガイド」を参照すること.
     1653
     165410.4 性能評価プログラム
     1655
     1656testディレクトリに置かれた"perf"で始まるプログラムは,カーネルの性能評
     1657価を行うためのプログラムである.
     1658
     1659性能評価プログラムは,計測対象となる処理を繰り返し実行し,その実行時間
     1660を計測して,実行時間分布を表示する.
     1661
     1662計測した実行時間には,時間計測のオーバヘッド(時間計測処理の実行にかか
     1663る時間)が含まれる.計測対象の処理の正味の実行時間を求めるためには,計
     1664測された時間から,時間計測のオーバヘッドを計測するためのプログラム
     1665(perf0)で計測された時間を減算する必要がある.
     1666
     1667また,実行時間の計測は,別に記述がない限り割込みを許可したまま行うため,
     1668割込みハンドラ(少なくとも,タイマ割込みハンドラ)の処理時間が含まれた
     1669実行結果が計測される.
     1670
     1671カーネルの性能評価にあたっては,ハードウェア(特にキャッシュ)の設定に
     1672留意する必要がある.
     1673
     1674性能評価プログラムはテストプログラム用ライブラリと実行時間分布集計モ
     1675ジュールを使用しているため,構築する場合には,MakefileのAPPL_COBJSに,
     1676test_lib.oとhistogram.oを追加する必要がある.コンフィギュレーションスク
     1677リプトを使用する場合には,-Uオプションでtest_lib.oとhistgram.oを指定す
     1678る.具体的には,次のコマンドを実行すればよい(構築用のディレクトリが,
     1679ASPカーネルのソースファイルを展開したディレクトリの直下にあると仮定して
     1680いる).
     1681
     1682        % perl ../configure -T <ターゲット略称> -A <性能評価プログラム名> \
    19461683                                                                        -a ../test -U "test_lib.o histogram.o"
    19471684
    1948 ç¾ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ç”¨æ„ã—ている性能評価プログラムは次の通り.
    1949 
    1950 (1) perf0               æ™‚間計測のオーバヘッドの評価
    1951 
    1952 æ™‚間計測のオーバヘッドを計測するためのプログラム.å
    1953 ·ä½“的には,空のプロ
    1954 ã‚°ãƒ©ãƒ ï¼ˆbegin_mearsureとend_measureを続けて呼び出すプログラム)の実行時
    1955 é–“を計測する.
    1956 
    1957 ä»–の性能評価プログラムで計測された時間から,このプログラムで計測された
    1958 æ™‚間を減算した時間が,計測対象の処理の正味の実行時間である.
    1959 
    1960 (2) perf1               slp_tsk,wup_tskによるタスク切換え時間の評価
    1961 
    1962 slp_tsk,wup_tskによるタスク切換え時間を計測するためのプログラム.å
    1963 ·ä½“
    1964 çš„には,高い優å
    1965 ˆåº¦ã®ã‚¿ã‚¹ã‚¯ãŒèµ·åºŠå¾
    1966 ã¡çŠ¶æ
    1967 ‹ã§ã‚る時に,低い優å
    1968 ˆåº¦ã®ã‚¿ã‚¹ã‚¯
    1969 ãŒwup_tskにより高い優å
    1970 ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã‚’起床し,高い優å
    1971 ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã«åˆ‡ã‚Šæ›ã‚
    1972 ã‚‹ã¾ã§ã®æ™‚間と,高い優å
    1973 ˆåº¦ã®ã‚¿ã‚¹ã‚¯ãŒslp_tskにより起床å¾
    1974 ã¡çŠ¶æ
    1975 ‹ã¨ãªã‚Šï¼Œä½Ž
    1976 ã„優å
    1977 ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã«åˆ‡ã‚Šæ›ã‚ã‚‹ã¾ã§ã®æ™‚間を計測する.
    1978 
    1979 (3) perf2               snd_pdqの処理時間の評価
    1980 
    1981ʌ㻌
    1982 ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«è“„積されているデータの数により,snd_pdqの処理時間が
    1983 ã©ã®ã‚ˆã†ã«å¤‰åŒ–するかを計測するためのプログラム.å
    1984 ·ä½“的には,優å
    1985 ˆåº¦ãƒ‡ãƒ¼
    1986 ã‚¿ã‚­ãƒ¥ãƒ¼ä¸­ã«é«˜ã„優å
    1987 ˆåº¦ã®ãƒ‡ãƒ¼ã‚¿ãŒn個蓄積されている時に,snd_dtqにより低
    1988 ã„優å
    1989 ˆåº¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’å
    1990 ¥ã‚Œã‚‹ã®ã«ã‹ã‹ã‚‹æ™‚間を計測する.nを0,10,20,30,40,
    1991 50,100,200,300と変化させて計測する.
    1992 
    1993 (4) perf3               set_flgの処理時間の評価
    1994 
    1995 å¾
    1996 ã¡è§£é™¤ã™ã‚‹ã‚¿ã‚¹ã‚¯ã®æ•°ã«ã‚ˆã‚Šï¼Œset_flgの処理時間がどのように変化するかを
    1997 è¨ˆæ¸¬ã™ã‚‹ãŸã‚ã®ãƒ—ログラム.å
    1998 ·ä½“的には,TA_WMUL属性のイベントフラグに対し
    1999 ã¦ï¼Œn個のタスクがå¾
    2000 ã£ã¦ã„る時に,set_flgによりそのすべてをå¾
    2001 ã¡è§£é™¤ã™ã‚‹
    2002 ã®ã«ã‹ã‹ã‚‹æ™‚間を計測する.nを0,1,2,3,4,5,10,20と変化させて計測す
    2003 ã‚‹ï¼Ž
    2004 
    2005 (5) perf4               act_tsk,iact_tskの処理時間とタスク切換え時間の評価
    2006 
    2007 act_tsk,iact_tskの処理時間とタスク切換え時間を計測するためのプログラム.
    2008 å
    2009 ·ä½“的には,(1) タスク切換えを起こさないact_tskの処理時間,(2) タスク切
    2010 æ›ãˆã‚’起こすact_tskの処理時間(タスク切換え時間を含む),(3) タスク切換
    2011 ãˆã‚’起こすiact_tskの処理時間(タスク切換え時間とタイマ割込み中で実行さ
    2012 ã‚Œã‚‹ã‚·ã‚¹ãƒ†ãƒ æ™‚刻の更新処理時間を含む)の3つの時間を計測する.
    2013 
    2014 ï¼‘1.使用上の注意とヒント
    2015 
    2016 11.1 タイマドライバの組込み
    2017 
    2018 ã‚¿ã‚¤ãƒžãƒ‰ãƒ©ã‚¤ãƒã‚’システムに組み込むために,システムコンフィギュレーショ
    2019 ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã®å
    2020 ˆé ­ã§target_timer.cfgをインクルードするå¿
    2021 è¦ãŒã‚る.
    2022 
    2023 11.2 assertマクロの処理
    2024 
    2025 ASPカーネルのコード中には,assertマクロが使われている.assertマクロの定
    2026 ç¾©ã¯t_stddef.hに含まれ,assertが失敗した場合の最後の処理(通常は,プロ
    2027 ã‚°ãƒ©ãƒ ã‚’停止させる処理)は,ターゲット依存部のTOPPERS_assert_abortで決
    2028 å®šã•ã‚Œã‚‹ï¼Ž
    2029 
    2030 assertが失敗した場合,システム開発中はデバッガに落とすのが望ましいが,
    2031 ã‚·ã‚¹ãƒ†ãƒ ç¨¼åƒæ™‚の対処法は,システムに対する要件に依存する.そこで,ター
    2032 ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®TOPPERS_assert_abortを,システム要件に合致した適切な処理
    2033 ã«ç½®ãæ›ãˆã‚‹å¿
    2034 è¦ãŒã‚る.システム要件によっては,NDEBUGを定義してassert
    2035 ãƒžã‚¯ãƒ­ã®å‡¦ç†ã‚’オブジェクトコード中から消す(「6.2 コンパイルオプション」
    2036 ã®ç¯€ã‚’参ç
    2037 §ï¼‰æ–¹æ³•ã‚‚考えられる.
    2038 
    2039 11.3 システムログ機能の扱い
    2040 
    2041 TOPPERS/ASPカーネルでは,システム開発時の利便性を考æ
    2042 ®ã—,システムログ機
    2043 èƒ½ã‚’組み込む設定をデフォルトとしている.
    2044 
    2045 ãã‚Œã«å¯¾ã—て,TOPPERS/ASPカーネルを用いたシステムを機器に組み込む場合は,
    2046 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ãŒæ„å‘³ãŒãªã„場合も多い.機器への組込みに際してのシステ
    2047 ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®è¨­å®šæ–¹æ³•ã«ã¯ï¼Œä»¥ä¸‹ã®æ–¹æ³•ãŒè€ƒãˆã‚‰ã‚Œã‚‹ï¼Ž
    2048 
    2049 (1) システムログ機能を用いない
    2050 
    2051 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‚’一切使用しない場合には,システムログ機能をシステムに
    2052 çµ„み込まず(システムコンフィギュレーションファイルでsyslog.cfgをインク
    2053 ãƒ«ãƒ¼ãƒ‰ã—ない),システムログ機能のサービスコールを呼び出すソースファイ
    2054 ãƒ«ã‚’TOPPERS_OMIT_SYSLOGを定義してコンパイルすればよい.
    2055 
    2056 (2) ログæƒ
    2057 å ±ã®è“„積のみを行う
    2058 
    2059 æ©Ÿå™¨ã«çµ„み込んだ状æ
    2060 ‹ã§ï¼Œã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆç­‰ã‚’介してシステムを外部と接続す
    2061 ã‚‹ã“とができる場合には,システム稼働時にはログæƒ
    2062 å ±ã®è“„積のみを行い,シ
    2063 ã‚¹ãƒ†ãƒ ã«éšœå®³ãŒèµ·ããŸæ™‚などにログæƒ
    2064 å ±ã‚’取り出すことで,障害の原因分析の
    2065 åŠ©ã‘とすることができる.
    2066 
    2067 å
    2068 ·ä½“的な設定方法として,次の2つの方法が考えられる.
    2069 
    2070 (2-1) 低レベル出力をメモリに蓄積する
    2071 
    2072 å¿
    2073 è¦ãªãƒ­ã‚°æƒ
    2074 å ±ã‚’低レベル出力機能を用いて出力するように設定し,低レベル
    2075 ã®æ–‡å­—出力関数(target_fput_log)に送られた文字をメモリ(å
    2076 ¸åž‹çš„にはリン
    2077 ã‚°ãƒãƒƒãƒ•ã‚¡ï¼‰ã«è“„積するようにする.システムの障害時には,そのメモリ領域
    2078 ã‚’読み出す.
    2079 
    2080 (2-2) システムログ機能のログバッファに蓄積する
    2081 
    2082 å¿
    2083 è¦ãªãƒ­ã‚°æƒ
    2084 å ±ã‚’システムログ機能のログバッファに記録するように設定する.
    2085 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã‚’動作させないと,ログæƒ
    2086 å ±ã¯ãƒ­ã‚°ãƒãƒƒãƒ•ã‚¡ã«è“„積されて
    2087 ã„く.システムの障害時には,ログバッファの領域を読み出すか,システムロ
    2088 ã‚°ã‚¿ã‚¹ã‚¯ã‚’動作させてログæƒ
    2089 å ±ã‚’出力させる.
    2090 
    2091 (3) 開発時の設定のままとする
    2092 
    2093 ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®è¨­å®šã‚’,システム開発時のまま変更せず,シリアルポート
    2094 ç­‰ã«ãƒ­ã‚°æƒ
    2095 å ±ã‚’垂れ流す方法も考えられる.
    2096 
    2097 11.4 オブジェクトIDの管理
    2098 
    2099 TOPPERS/ASPカーネルでは,オブジェクトのID番号を,コンフィギュレータが割
    2100 ã‚Šä»˜ã‘る方法が基本となっている.
    2101 
    2102 ã‚¢ãƒ—リケーションプログラム中でオブジェクトのID番号を参ç
    2103 §ã™ã‚‹å ´åˆã«ã¯ï¼Œ
    2104 æ¬¡ã®2つの方法が考えられる.
    2105 
    2106 (1) オブジェクト識別名を用いる
    2107 
    2108 ã‚ªãƒ–ジェクト生成のための静的API(CRE_YYY)の第1パラメータに記述したオブ
    2109 ã‚¸ã‚§ã‚¯ãƒˆè­˜åˆ¥åã‚’,アプリケーションプログラム中でも用いる方法.
    2110 
    2111 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã¯ï¼Œã‚ªãƒ–ジェクト識別名を,割り付けたID番号にマクロ定
    2112 ç¾©ã™ã‚‹C言語プリプロセッサのディレクティブ(#define)をkernel_cfg.hに生
    2113 æˆã™ã‚‹ãŸã‚ï¼Œã‚¢ãƒ—リケーションプログラムからkernel_cfg.hをインクルードす
    2114 ã‚‹å¿
    2115 è¦ãŒã‚る.
    2116 
    2117 ã“の方法は,オブジェクトコード中にID番号が直接埋め込まれるために実行効
    2118 çŽ‡ãŒè‰¯ã„一方で,コンフィギュレータが実行されてkernel_cfg.hが書き換わる
    2119 åº¦ã«ï¼Œã‚¢ãƒ—リケーションプログラムの再コンパイルがå¿
    2120 è¦ã«ãªã‚‹ã¨ã„う欠点が
    2121 ã‚る.そのため,アプリケーションプログラムを構成するファイルの中で,一
    2122 éƒ¨ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿ã§ã‚ªãƒ–ジェクト識別名を参ç
    2123 §ã™ã‚‹æ§‹æˆã«ã™ã‚‹ã¨ã„った工夫を
    2124 ã™ã‚‹ã“とが望ましい.
    2125 
    2126 (2) オブジェクトのID番号を保持する変数を用いる
    2127 
    2128 ã‚ªãƒ–ジェクトのID番号を保持するconst属性を付加した変数を用意し,アプリケー
    2129 ã‚·ãƒ§ãƒ³ãƒ—ログラム中では,その変数を用いる方法.
    2130 
    2131 ä¾‹ãˆã°ï¼ŒTASK1というオブジェクト識別名のタスクに対して,次のような変数を
    2132 ç”¨æ„ã™ã‚‹ï¼Ž
     1685現バージョンで用意している性能評価プログラムは次の通り.
     1686
     1687(1) perf0               時間計測のオーバヘッドの評価
     1688
     1689時間計測のオーバヘッドを計測するためのプログラム.具体的には,空のプロ
     1690グラム(begin_mearsureとend_measureを続けて呼び出すプログラム)の実行時
     1691間を計測する.
     1692
     1693他の性能評価プログラムで計測された時間から,このプログラムで計測された
     1694時間を減算した時間が,計測対象の処理の正味の実行時間である.
     1695
     1696(2) perf1               slp_tsk,wup_tskによるタスク切換え時間の評価
     1697
     1698slp_tsk,wup_tskによるタスク切換え時間を計測するためのプログラム.具体
     1699的には,高い優先度のタスクが起床待ち状態である時に,低い優先度のタスク
     1700がwup_tskにより高い優先度のタスクを起床し,高い優先度のタスクに切り換わ
     1701るまでの時間と,高い優先度のタスクがslp_tskにより起床待ち状態となり,低
     1702い優先度のタスクに切り換わるまでの時間を計測する.
     1703
     1704(3) perf2               snd_pdqの処理時間の評価
     1705
     1706優先度データキューに蓄積されているデータの数により,snd_pdqの処理時間が
     1707どのように変化するかを計測するためのプログラム.具体的には,優先度デー
     1708タキュー中に高い優先度のデータがn個蓄積されている時に,snd_dtqにより低
     1709い優先度のデータを入れるのにかかる時間を計測する.nを0,10,20,30,40,
     171050,100,200,300と変化させて計測する.
     1711
     1712(4) perf3               set_flgの処理時間の評価
     1713
     1714待ち解除するタスクの数により,set_flgの処理時間がどのように変化するかを
     1715計測するためのプログラム.具体的には,TA_WMUL属性のイベントフラグに対し
     1716て,n個のタスクが待っている時に,set_flgによりそのすべてを待ち解除する
     1717のにかかる時間を計測する.nを0,1,2,3,4,5,10,20と変化させて計測す
     1718る.
     1719
     1720(5) perf4               act_tsk,iact_tskの処理時間とタスク切換え時間の評価
     1721
     1722act_tsk,iact_tskの処理時間とタスク切換え時間を計測するためのプログラム.
     1723具体的には,(1) タスク切換えを起こさないact_tskの処理時間,(2) タスク切
     1724換えを起こすact_tskの処理時間(タスク切換え時間を含む),(3) タスク切換
     1725えを起こすiact_tskの処理時間(タスク切換え時間とタイマ割込み中で実行さ
     1726れるシステム時刻の更新処理時間を含む)の3つの時間を計測する.
     1727
     172811.使用上の注意とヒント
     1729
     173011.1 タイマドライバの組込み
     1731
     1732タイマドライバをシステムに組み込むために,システムコンフィギュレーショ
     1733ンファイルの先頭でtarget_timer.cfgをインクルードする必要がある.
     1734
     173511.2 assertマクロの処理
     1736
     1737ASPカーネルのコード中には,assertマクロが使われている.assertマクロの定
     1738義はt_stddef.hに含まれ,assertが失敗した場合の最後の処理(通常は,プロ
     1739グラムを停止させる処理)は,ターゲット依存部のTOPPERS_assert_abortで決
     1740定される.
     1741
     1742assertが失敗した場合,システム開発中はデバッガに落とすのが望ましいが,
     1743システム稼働時の対処法は,システムに対する要件に依存する.そこで,ター
     1744ゲット依存部のTOPPERS_assert_abortを,システム要件に合致した適切な処理
     1745に置き換える必要がある.システム要件によっては,NDEBUGを定義してassert
     1746マクロの処理をオブジェクトコード中から消す(「6.2 コンパイルオプション」
     1747の節を参照)方法も考えられる.
     1748
     174911.3 システムログ機能の扱い
     1750
     1751TOPPERS/ASPカーネルでは,システム開発時の利便性を考慮し,システムログ機
     1752能を組み込む設定をデフォルトとしている.
     1753
     1754それに対して,TOPPERS/ASPカーネルを用いたシステムを機器に組み込む場合は,
     1755システムログ機能が意味がない場合も多い.機器への組込みに際してのシステ
     1756ムログ機能の設定方法には,以下の方法が考えられる.
     1757
     1758(1) システムログ機能を用いない
     1759
     1760システムログ機能を一切使用しない場合には,システムログ機能をシステムに
     1761組み込まず(システムコンフィギュレーションファイルでsyslog.cfgをインク
     1762ルードしない),システムログ機能のサービスコールを呼び出すソースファイ
     1763ルをTOPPERS_OMIT_SYSLOGを定義してコンパイルすればよい.
     1764
     1765(2) ログ情報の蓄積のみを行う
     1766
     1767機器に組み込んだ状態で,シリアルポート等を介してシステムを外部と接続す
     1768ることができる場合には,システム稼働時にはログ情報の蓄積のみを行い,シ
     1769ステムに障害が起きた時などにログ情報を取り出すことで,障害の原因分析の
     1770助けとすることができる.
     1771
     1772具体的な設定方法として,次の2つの方法が考えられる.
     1773
     1774(2-1) 低レベル出力をメモリに蓄積する
     1775
     1776必要なログ情報を低レベル出力機能を用いて出力するように設定し,低レベル
     1777の文字出力関数(target_fput_log)に送られた文字をメモリ(典型的にはリン
     1778グバッファ)に蓄積するようにする.システムの障害時には,そのメモリ領域
     1779を読み出す.
     1780
     1781(2-2) システムログ機能のログバッファに蓄積する
     1782
     1783必要なログ情報をシステムログ機能のログバッファに記録するように設定する.
     1784システムログタスクを動作させないと,ログ情報はログバッファに蓄積されて
     1785いく.システムの障害時には,ログバッファの領域を読み出すか,システムロ
     1786グタスクを動作させてログ情報を出力させる.
     1787
     1788(3) 開発時の設定のままとする
     1789
     1790システムログ機能の設定を,システム開発時のまま変更せず,シリアルポート
     1791等にログ情報を垂れ流す方法も考えられる.
     1792
     179311.4 オブジェクトIDの管理
     1794
     1795TOPPERS/ASPカーネルでは,オブジェクトのID番号を,コンフィギュレータが割
     1796り付ける方法が基本となっている.
     1797
     1798アプリケーションプログラム中でオブジェクトのID番号を参照する場合には,
     1799次の2つの方法が考えられる.
     1800
     1801(1) オブジェクト識別名を用いる
     1802
     1803オブジェクト生成のための静的API(CRE_YYY)の第1パラメータに記述したオブ
     1804ジェクト識別名を,アプリケーションプログラム中でも用いる方法.
     1805
     1806コンフィギュレータは,オブジェクト識別名を,割り付けたID番号にマクロ定
     1807義するC言語プリプロセッサのディレクティブ(#define)をkernel_cfg.hに生
     1808成するため,アプリケーションプログラムからkernel_cfg.hをインクルードす
     1809る必要がある.
     1810
     1811この方法は,オブジェクトコード中にID番号が直接埋め込まれるために実行効
     1812率が良い一方で,コンフィギュレータが実行されてkernel_cfg.hが書き換わる
     1813度に,アプリケーションプログラムの再コンパイルが必要になるという欠点が
     1814ある.そのため,アプリケーションプログラムを構成するファイルの中で,一
     1815部のファイルのみでオブジェクト識別名を参照する構成にするといった工夫を
     1816することが望ましい.
     1817
     1818(2) オブジェクトのID番号を保持する変数を用いる
     1819
     1820オブジェクトのID番号を保持するconst属性を付加した変数を用意し,アプリケー
     1821ションプログラム中では,その変数を用いる方法.
     1822
     1823例えば,TASK1というオブジェクト識別名のタスクに対して,次のような変数を
     1824用意する.
    21331825
    21341826const ID TASK1_id = TASK1;
    21351827
    2136 ã‚¢ãƒ—リケーションプログラム中では,この変数(TASK1_id)を用いることで,
    2137 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒå®Ÿè¡Œã•ã‚Œã¦kernel_cfg.hが書き換わる度に,上記の変数
    2138 å®šç¾©ã‚’含んだファイルのみを再コンパイルすればよいことになる.
    2139 
    2140 ã“の方法は,アプリケーションプログラムの再コンパイルを最小限にできる利
    2141 ç‚¹ãŒã‚る一方で,変数のためのメモリ領域がå¿
    2142 è¦ã«ãªã‚‹ã“とに加えて,(プロ
    2143 ã‚»ãƒƒã‚µã«ã‚ˆã£ã¦ã¯ï¼‰å¤‰æ•°ã‚¢ã‚¯ã‚»ã‚¹ã®ãŸã‚ã®ã‚ªãƒ¼ãƒãƒ˜ãƒƒãƒ‰ãŒç”Ÿã˜ã‚‹ã¨ã„う欠点が
    2144 ã‚る.また,定数ではなく変数であることから,他の変数の初期化には使えな
    2145 ã„という制限がある.
    2146 
    2147 ãªãŠï¼ŒTOPPERS/ASPカーネルのコンフィギュレータは,--external-idオプショ
    2148 ãƒ³ã‚’付加することにより,上記の変数定義をkernel_cfg.c中に生成する機能を
    2149 æŒã£ã¦ã„るので,すべてのオブジェクトIDをこの方法で参ç
    2150 §ã™ã‚‹å ´åˆã«ã¯ï¼Œã“
    2151 ã®æ©Ÿèƒ½ã‚’用いることを推奨する.
    2152 
    2153 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«ã‚ˆã‚‹ID番号割付けのもう1つの課題として,コンフィギュ
    2154 ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿®æ­£ã«ã‚ˆã‚Šï¼Œã‚ªãƒ–ジェクトIDの割付けが変わってしまう
    2155 ã“とが挙げられる.これは,アプリケーションソフトウェアの設計仕様書にID
    2156 ç•ªå·ãŒè¨˜è¼‰ã•ã‚Œã¦ã„る場合や,デバッグ作業においてID番号を直接扱っている
    2157 å ´åˆã«ï¼Œä½œæ¥­åŠ¹çŽ‡ã‚’低下させる可能性が考えられる.
    2158 
    2159 ã“の問題に対応するために,TOPPERS/ASPカーネルのコンフィギュレータに,
    2160 ID番号の割付け結果をファイルに書き出す機能(--id-output-fileオプション)
    2161 ã¨ï¼ŒID番号の割付けをファイルから取り込む機能(--id-input-fileオプション)
    2162 ã‚’用意している.これらの機能を用いて,コンフィギュレータを実行する度に,
    2163 å‰å›žã«å®Ÿè¡Œã—た時にファイルに書き出したID番号の割付けを取り込むことで,
    2164 å‰å›žå®Ÿè¡Œæ™‚と同じ割付けを行うことができる.ただし,TOPPERS/ASPカーネルで
    2165 ã¯ï¼ŒID番号に抜けがあるのは許されないため,オブジェクトの数が減った場合
    2166 ã«ã¯ï¼ˆID番号が大きい方のオブジェクトが減った場合を除いて)エラーとなる.
    2167 ã“の場合には,ダミーのオブジェクトを生成する方法で回避するしかない.
    2168 
    2169 11.5 カーネルのå†
    2170 éƒ¨ã‚·ãƒ³ãƒœãƒ«ã®ãƒªãƒãƒ¼ãƒ 
    2171 
    2172 ASPカーネルでは,モジュールå†
    2173 éƒ¨ã®åç§°ãŒä»–のモジュールå†
    2174 éƒ¨ã®åç§°ã¨è¡çªã™
    2175 ã‚‹ã“とを避けるために,カーネルのå†
    2176 éƒ¨ã‚·ãƒ³ãƒœãƒ«ã¯ï¼ŒC言語レベルで,å
    2177 ˆé ­ãŒ
    2178 "_kernel_"または"_KERNEL_"である名称としている.
    2179 
    2180 ã“れをソースコードの可読性と両立させるために,ASPカーネルでは,ソースコー
    2181 ãƒ‰ã¯è‡ªç„¶ãªåå‰ã‚’用いて記述し,C言語プリプロセッサのマクロ定義(#define)
    2182 ã‚’用いて,それを"_kernel_"または"_KERNEL_"で始まる名前(自然な名前が
    2183 yyyyyの場合には,_kernel_yyyyy)にリネームする仕組みを用いている.
    2184 
    2185 å
    2186 ·ä½“的には,関連するディレクトリにxxx_rename.defを置き,そこからリネー
    2187 ãƒ ã®ãŸã‚ã®ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆxxx_rename.hおよびxxx_unrename.h)を生成する
    2188 ãƒ„ール(utils/genrename)を用意している.
    2189 
    2190 ã“の仕組みは,ソースコードの可読性向上に役立つ一方で,弊害もある.例え
    2191 ã°ï¼Œå¤šãã®ãƒ‡ãƒãƒƒã‚¬ã§ï¼Œã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã®åç§°ã¨ã‚ªãƒ–ジェクトコード中の名称
    2192 ãŒç•°ãªã‚‹ãŸã‚ã«ï¼Œã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã®å¤‰æ•°åã‚’指定して値を読んだり,関数名を
    2193 æŒ‡å®šã—てブレークポイントを置くといったことができない.
    2194 
    2195 ã“の状況に対応するために,ASPカーネルでは,ソースコード中の該当する名称
    2196 ã‚’リネームするためのユーティリティ(utils/applyrename)を用意している.
    2197 applyrenameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプ
    2198 ãƒªãƒ•ã‚£ãƒƒã‚¯ã‚¹ï¼ˆxxxの部分)と,リネームしたいファイルリストを与えると,リ
    2199 ãƒãƒ¼ãƒ å‡¦ç†ã‚’行なう.例えば,kernelディレクトリのすべてのファイルに対し
    2200 ã¦ï¼Œã‚«ãƒ¼ãƒãƒ«ã®å†
    2201 éƒ¨ã‚·ãƒ³ãƒœãƒ«ã‚’リネームするには,次のコマンドを実行すれば
    2202 ã‚ˆã„.
     1828アプリケーションプログラム中では,この変数(TASK1_id)を用いることで,
     1829コンフィギュレータが実行されてkernel_cfg.hが書き換わる度に,上記の変数
     1830定義を含んだファイルのみを再コンパイルすればよいことになる.
     1831
     1832この方法は,アプリケーションプログラムの再コンパイルを最小限にできる利
     1833点がある一方で,変数のためのメモリ領域が必要になることに加えて,(プロ
     1834セッサによっては)変数アクセスのためのオーバヘッドが生じるという欠点が
     1835ある.また,定数ではなく変数であることから,他の変数の初期化には使えな
     1836いという制限がある.
     1837
     1838なお,TOPPERS/ASPカーネルのコンフィギュレータは,--external-idオプショ
     1839ンを付加することにより,上記の変数定義をkernel_cfg.c中に生成する機能を
     1840持っているので,すべてのオブジェクトIDをこの方法で参照する場合には,こ
     1841の機能を用いることを推奨する.
     1842
     1843コンフィギュレータによるID番号割付けのもう1つの課題として,コンフィギュ
     1844レーションファイルの修正により,オブジェクトIDの割付けが変わってしまう
     1845ことが挙げられる.これは,アプリケーションソフトウェアの設計仕様書にID
     1846番号が記載されている場合や,デバッグ作業においてID番号を直接扱っている
     1847場合に,作業効率を低下させる可能性が考えられる.
     1848
     1849この問題に対応するために,TOPPERS/ASPカーネルのコンフィギュレータに,
     1850ID番号の割付け結果をファイルに書き出す機能(--id-output-fileオプション)
     1851と,ID番号の割付けをファイルから取り込む機能(--id-input-fileオプション)
     1852を用意している.これらの機能を用いて,コンフィギュレータを実行する度に,
     1853前回に実行した時にファイルに書き出したID番号の割付けを取り込むことで,
     1854前回実行時と同じ割付けを行うことができる.ただし,TOPPERS/ASPカーネルで
     1855は,ID番号に抜けがあるのは許されないため,オブジェクトの数が減った場合
     1856には(ID番号が大きい方のオブジェクトが減った場合を除いて)エラーとなる.
     1857この場合には,ダミーのオブジェクトを生成する方法で回避するしかない.
     1858
     185911.5 カーネルの内部シンボルのリネーム
     1860
     1861ASPカーネルでは,モジュール内部の名称が他のモジュール内部の名称と衝突す
     1862ることを避けるために,カーネルの内部シンボルは,C言語レベルで,先頭が
     1863"_kernel_"または"_KERNEL_"である名称としている.
     1864
     1865これをソースコードの可読性と両立させるために,ASPカーネルでは,ソースコー
     1866ドは自然な名前を用いて記述し,C言語プリプロセッサのマクロ定義(#define)
     1867を用いて,それを"_kernel_"または"_KERNEL_"で始まる名前(自然な名前が
     1868yyyyyの場合には,_kernel_yyyyy)にリネームする仕組みを用いている.
     1869
     1870具体的には,関連するディレクトリにxxx_rename.defを置き,そこからリネー
     1871ムのためのヘッダファイル(xxx_rename.hおよびxxx_unrename.h)を生成する
     1872ツール(utils/genrename)を用意している.
     1873
     1874この仕組みは,ソースコードの可読性向上に役立つ一方で,弊害もある.例え
     1875ば,多くのデバッガで,ソースコード中の名称とオブジェクトコード中の名称
     1876が異なるために,ソースコード中の変数名を指定して値を読んだり,関数名を
     1877指定してブレークポイントを置くといったことができない.
     1878
     1879この状況に対応するために,ASPカーネルでは,ソースコード中の該当する名称
     1880をリネームするためのユーティリティ(utils/applyrename)を用意している.
     1881applyrenameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプ
     1882リフィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ
     1883ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し
     1884て,カーネルの内部シンボルをリネームするには,次のコマンドを実行すれば
     1885よい.
    22031886
    22041887        % cd kernel
    22051888        % ../utils/applyrename kernel *
    22061889
    2207 ã¾ãŸï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—て,カーネ
    2208 ãƒ«ã®å†
    2209 éƒ¨ã‚·ãƒ³ãƒœãƒ«ã‚’リネームするには,次のようなコマンドを実行すればよい.
     1890また,ターゲット依存部のディレクトリのすべてのファイルに対して,カーネ
     1891ルの内部シンボルをリネームするには,次のようなコマンドを実行すればよい.
    22101892
    22111893        % cd target/dve68k_gcc/
     
    22131895        % ../../utils/applyrename ../../kernel/kernel *
    22141896
    2215 11.6 トレースログ記録のサンプルコードの使用方法
    2216 
    2217 ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°è¨˜éŒ²ã®ã‚µãƒ³ãƒ—ルコードがターゲット依存部に組み込まれている場
    2218 åˆã«ã¯ï¼Œã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ã‚¯ãƒªãƒ—トにそれを使用することを指示する
    2219 ã‚ªãƒ—ション(-r)を付加することで,メモリ上にトレースログを記録する機能
    2220 ãŒæœ‰åŠ¹ã«ãªã‚‹ï¼Ž
    2221 
    2222 ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°è¨˜éŒ²ã®ä½¿ç”¨æ–¹æ³•ã®ä¸€ä¾‹ã¨ã—て,システム起動時にトレースログの
    2223 è¨˜éŒ²ã‚’開始し,システム終了時に記録したトレースログをダンプするためには,
    2224 ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¬¡ã®ã‚ˆã†ãªè¨˜è¿°ã‚’追加する.
     189711.6 トレースログ記録のサンプルコードの使用方法
     1898
     1899トレースログ記録のサンプルコードがターゲット依存部に組み込まれている場
     1900合には,コンフィギュレーションスクリプトにそれを使用することを指示する
     1901オプション(-r)を付加することで,メモリ上にトレースログを記録する機能
     1902が有効になる.
     1903
     1904トレースログ記録の使用方法の一例として,システム起動時にトレースログの
     1905記録を開始し,システム終了時に記録したトレースログをダンプするためには,
     1906システムコンフィギュレーションファイルに次のような記述を追加する.
    22251907
    22261908        #include "logtrace/trace_config.h"
     
    22281910        ATT_TER({ TA_NULL, target_fput_log, trace_dump });
    22291911
    2230 ã“こで,初期化ルーチン(trace_initialize)への引数は,初期化直後のトレー
    2231 ã‚¹ãƒ­ã‚°ã®å‹•ä½œãƒ¢ãƒ¼ãƒ‰ã‚’指定するものである.指定できる動作モードについては,
    2232 arch/logtrace/trace_config.h中のコメントに説明がある.
    2233 
    2234 çµ‚了処理ルーチン(trace_dump)は,記録されたトレースログをターゲット依
    2235 å­˜ã®ä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½ï¼ˆtarget_fput_log)を利用してダンプするためのもので
    2236 ã‚る.トレースログを別の方法で取り出す場合には,終了処理ルーチンを登録
    2237 ã™ã‚‹å¿
    2238 è¦ã¯ãªã„.
    2239 
    2240 ä»¥ä¸Šã®æ–¹æ³•ã§ã¯ï¼Œtrace_initializeを初期化ルーチンで,trace_dumpを終了処
    2241 ç†ãƒ«ãƒ¼ãƒãƒ³ã§å‘¼ã³å‡ºã—ているため,初期化ルーチンを呼び出す前や終了処理ルー
    2242 ãƒãƒ³ã‚’呼び出した後には,トレースログ記録の機能を利用できない.初期化ルー
    2243 ãƒãƒ³ã‚’呼び出す前や終了処理ルーチンを呼び出した後に実行される処理(例え
    2244 ã°ï¼Œã‚«ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトの初期化処理や,trace_initializeよりもå
    2245 ˆã«ç™»éŒ²
    2246 ã—た初期化ルーチン,trace_dumpよりもå
    2247 ˆã«ç™»éŒ²ã—た終了処理ルーチン)でト
    2248 ãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°è¨˜éŒ²ã®æ©Ÿèƒ½ã‚’利用するためには,trace_initializeとtrace_dumpを
    2249 é©åˆ‡ãªå ´æ‰€ã§å‘¼ã¶ã‚ˆã†ã«ä¿®æ­£ã™ã‚‹ã“とがå¿
    2250 è¦ã§ã‚る.
    2251 
    2252 11.7 システムの起動時の初期化処理
    2253 
    2254 ã‚·ã‚¹ãƒ†ãƒ ã®èµ·å‹•æ™‚にアプリケーションでå¿
    2255 è¦ã¨ãªã‚‹åˆæœŸåŒ–処理を行うための機
    2256 èƒ½ã¨ã—て初期化ルーチンが用意されているが,初期化ルーチンが実行されるよ
    2257 ã‚Šã‚‚早いタイミングで実行することがå¿
    2258 è¦ãªåˆæœŸåŒ–処理がある場合がある.
    2259 
    2260 ã“のような場合に用いるために,標準的なスタートアップモジュールから,ター
    2261 ã‚²ãƒƒãƒˆã‚·ã‚¹ãƒ†ãƒ ä¾å­˜ã®åˆæœŸåŒ–フック(hardware_init_hook)を呼び出すことと
    2262 ã—ている.hardware_init_hookは,カーネルのターゲット依存部で用意されて
    2263 ã„るのが標準であるが,これをアプリケーションで用意したものに置き換え,
    2264 ãã®ä¸­ã§ã‚¢ãƒ—リケーションでå¿
    2265 è¦ã¨ãªã‚‹åˆæœŸåŒ–処理を行うことができる.
    2266 
    2267 ãŸã ã—,hardware_init_hookの作成する場合には,bssセクションとdataセクショ
    2268 ãƒ³ãŒåˆæœŸåŒ–されていないことや,ライブラリが初期化されていないこと,C言語
    2269 ã§è¨˜è¿°ã§ãã‚‹ã¨ã¯é™ã‚‰ãªã„ことなどに注意がå¿
    2270 è¦ã§ã‚る.作成にあたっては,
    2271 ã€Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ ポーティングガイド」を参ç
    2272 §ã™ã‚‹ã“と.
    2273 
    2274 ã‚«ãƒ¼ãƒãƒ«ã®ã‚¹ã‚¿ãƒ¼ãƒˆã‚¢ãƒƒãƒ—モジュールがhardware_init_hookを呼び出すように
    2275 å®Ÿè£
    2276 ã•ã‚Œã¦ã„ない場合には,スタートアップモジュールをアプリケーションで
    2277 ç”¨æ„ã—たものに置き換える方法を推奨する.
    2278 
    2279 11.8 rodataセクションをRAMに置く場合
    2280 
    2281 ä½•ã‚‰ã‹ã®ç†ç”±ã§rodataセクションをRAMに置く場合,dataセクションと同様に,
    2282 ãã®åˆæœŸå€¤ã¯ROMに置き,スタートアップモジュールでRAMにコピーするのが素
    2283 ç›´ã§ã‚る.これを実現するには,dataセクションの取扱いを参考に,リンカス
    2284 ã‚¯ãƒªãƒ—トとスタートアップモジュールを修正するå¿
    2285 è¦ãŒã‚るが,それに加えて,
    2286 ä»¥ä¸‹ã®æŽªç½®ãŒå¿
    2287 è¦ã§ã‚る.
    2288 
    2289 ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã¯ï¼Œãƒ‘ス1とパス3において,ロードモジュールのシンボル
    2290 ãƒ•ã‚¡ã‚¤ãƒ«ã‚’用いて,ロードモジュールå†
    2291 ã®rodataセクションを読み込むことで,
    2292 å„種の定数値を取得する.そのため,rodataセクションをdataセクションと同
    2293 æ§˜ã«æ‰±ã†ã¨ï¼Œãã®ã‚¢ã‚¯ã‚»ã‚¹ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ˆRAMå†
    2294 ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ŒVMAと呼ぶ)とé
    2295 ç½®ã‚¢
    2296 ãƒ‰ãƒ¬ã‚¹ï¼ˆROMå†
    2297 ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ŒLMAと呼ぶ)が一致しなくなるために,定数値を取
    2298 å¾—することができず,エラーとなる.
    2299 
    2300 ãƒ‘ス1でのエラーを回避するためには,パス1のリンク時(cfg1_outをリンクす
    2301 ã‚‹æ™‚)には,rodataセクションのアクセスアドレスとé
    2302 ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’一致させ
    2303 ã‚‹ãƒªãƒ³ã‚«ã‚¹ã‚¯ãƒªãƒ—ト(標準のリンカスクリプトはこのようになっている)を用
    2304 ã„る.サンプルのMakefileでは,LDSCRIPTによりリンカスクリプトを指定する
    2305 ã®ã§ã¯ãªãï¼ŒLDFLAGSとCFG1_OUT_LDFLAGSに異なるリンカスクリプトを用いるオ
    2306 ãƒ—ションを設定すればよい.
    2307 
    2308 ãƒ‘ス3でのエラーを回避するためには,コンフィギュレータのパス3のテンプレー
    2309 ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã„て,rodataセクションのå†
    2310 å®¹ã‚’,é
    2311 ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹
    2312 ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚³ãƒ”ーする.そのためには,パス3のテンプレートファイルのターゲッ
    2313 ãƒˆä¾å­˜éƒ¨ã§ï¼ŒLMA.ORDER_LIST等のテンプレートファイル変数を設定すればよい.
    2314 å
    2315 ·ä½“的な方法は,「ターゲット依存部 ポーティングガイド」を参ç
    2316 §ã™ã‚‹ã“と.
    2317 
    2318 
    2319 ï¼‘2.参考æƒ
    2320 å ±
    2321 
    2322 12.1 利用条件と利用報告
    2323 
    2324 ASPカーネルの利用条件は,各ファイルのå
    2325 ˆé ­ã«è¡¨ç¤ºã•ã‚Œã¦ã„る.著作権は,各
    2326 ãƒ•ã‚¡ã‚¤ãƒ«ã®å
    2327 ˆé ­ã«è¡¨ç¤ºã•ã‚Œã¦ã„る著作権è€
    2328 ãŒä¿æœ‰ã—ている.
    2329 
    2330 åˆ©ç”¨æ¡ä»¶ã®(3)の(b)において,利用の形æ
    2331 ‹ã‚’TOPPERSプロジェクトに報告する方
    2332 æ³•ã¨ã—ては,ASPカーネルを利用した製品の名称と応用分野,製品化した会社名
    2333 ã¨æ¥­ç¨®ç­‰ã®æƒ
    2334 å ±ã‚’,以下のURLのページから報告するものとする.
     1912ここで,初期化ルーチン(trace_initialize)への引数は,初期化直後のトレー
     1913スログの動作モードを指定するものである.指定できる動作モードについては,
     1914arch/logtrace/trace_config.h中のコメントに説明がある.
     1915
     1916終了処理ルーチン(trace_dump)は,記録されたトレースログをターゲット依
     1917存の低レベル出力機能(target_fput_log)を利用してダンプするためのもので
     1918ある.トレースログを別の方法で取り出す場合には,終了処理ルーチンを登録
     1919する必要はない.
     1920
     1921以上の方法では,trace_initializeを初期化ルーチンで,trace_dumpを終了処
     1922理ルーチンで呼び出しているため,初期化ルーチンを呼び出す前や終了処理ルー
     1923チンを呼び出した後には,トレースログ記録の機能を利用できない.初期化ルー
     1924チンを呼び出す前や終了処理ルーチンを呼び出した後に実行される処理(例え
     1925ば,カーネルオブジェクトの初期化処理や,trace_initializeよりも先に登録
     1926した初期化ルーチン,trace_dumpよりも先に登録した終了処理ルーチン)でト
     1927レースログ記録の機能を利用するためには,trace_initializeとtrace_dumpを
     1928適切な場所で呼ぶように修正することが必要である.
     1929
     193011.7 システムの起動時の初期化処理
     1931
     1932システムの起動時にアプリケーションで必要となる初期化処理を行うための機
     1933能として初期化ルーチンが用意されているが,初期化ルーチンが実行されるよ
     1934りも早いタイミングで実行することが必要な初期化処理がある場合がある.
     1935
     1936このような場合に用いるために,標準的なスタートアップモジュールから,ター
     1937ゲットシステム依存の初期化フック(hardware_init_hook)を呼び出すことと
     1938している.hardware_init_hookは,カーネルのターゲット依存部で用意されて
     1939いるのが標準であるが,これをアプリケーションで用意したものに置き換え,
     1940その中でアプリケーションで必要となる初期化処理を行うことができる.
     1941
     1942ただし,hardware_init_hookの作成する場合には,bssセクションとdataセクショ
     1943ンが初期化されていないことや,ライブラリが初期化されていないこと,C言語
     1944で記述できるとは限らないことなどに注意が必要である.作成にあたっては,
     1945「ターゲット依存部 ポーティングガイド」を参照すること.
     1946
     1947カーネルのスタートアップモジュールがhardware_init_hookを呼び出すように
     1948実装されていない場合には,スタートアップモジュールをアプリケーションで
     1949用意したものに置き換える方法を推奨する.
     1950
     195111.8 rodataセクションをRAMに置く場合
     1952
     1953何らかの理由でrodataセクションをRAMに置く場合,dataセクションと同様に,
     1954その初期値はROMに置き,スタートアップモジュールでRAMにコピーするのが素
     1955直である.これを実現するには,dataセクションの取扱いを参考に,リンカス
     1956クリプトとスタートアップモジュールを修正する必要があるが,それに加えて,
     1957以下の措置が必要である.
     1958
     1959コンフィギュレータは,パス1とパス3において,ロードモジュールのシンボル
     1960ファイルを用いて,ロードモジュール内のrodataセクションを読み込むことで,
     1961各種の定数値を取得する.そのため,rodataセクションをdataセクションと同
     1962様に扱うと,そのアクセスアドレス(RAM内のアドレス,VMAと呼ぶ)と配置ア
     1963ドレス(ROM内のアドレス,LMAと呼ぶ)が一致しなくなるために,定数値を取
     1964得することができず,エラーとなる.
     1965
     1966パス1でのエラーを回避するためには,パス1のリンク時(cfg1_outをリンクす
     1967る時)には,rodataセクションのアクセスアドレスと配置アドレスを一致させ
     1968るリンカスクリプト(標準のリンカスクリプトはこのようになっている)を用
     1969いる.サンプルのMakefileでは,LDSCRIPTによりリンカスクリプトを指定する
     1970のではなく,LDFLAGSとCFG1_OUT_LDFLAGSに異なるリンカスクリプトを用いるオ
     1971プションを設定すればよい.
     1972
     1973パス3でのエラーを回避するためには,コンフィギュレータのパス3のテンプレー
     1974トファイルにおいて,rodataセクションの内容を,配置アドレスからアクセス
     1975アドレスにコピーする.そのためには,パス3のテンプレートファイルのターゲッ
     1976ト依存部で,LMA.ORDER_LIST等のテンプレートファイル変数を設定すればよい.
     1977具体的な方法は,「ターゲット依存部 ポーティングガイド」を参照すること.
     1978
     1979
     198012.参考情報
     1981
     198212.1 利用条件と利用報告
     1983
     1984ASPカーネルの利用条件は,各ファイルの先頭に表示されている.著作権は,各
     1985ファイルの先頭に表示されている著作権者が保有している.
     1986
     1987利用条件の(3)の(b)において,利用の形態をTOPPERSプロジェクトに報告する方
     1988法としては,ASPカーネルを利用した製品の名称と応用分野,製品化した会社名
     1989と業種等の情報を,以下のURLのページから報告するものとする.
    23351990
    23361991        http://www.toppers.jp/report.html
    23371992
    2338 ã¾ãŸãã®éš›ã«ï¼ŒASPカーネルを使用してのコメントやご意見もいただけると幸い
    2339 ã§ã‚る.
    2340 
    2341 12.2 保証・適用性・サポート
    2342 
    2343 ASPカーネルは無保証で提供されているものである.開発è€
    2344 ãŠã‚ˆã³TOPPERSプロ
    2345 ã‚¸ã‚§ã‚¯ãƒˆã¯ï¼ŒASPカーネルに関して,特定の使用目的に対する適合性も含めて,
    2346 ã„かなる保証も行わない.また,ASPカーネルの利用により直接的または間接的
    2347 ã«ç”Ÿã˜ãŸã„かなる損害に関しても,その責任を負わない.
    2348 
    2349 é–‹ç™ºè€
    2350 ãŠã‚ˆã³TOPPERSプロジェクトは,ASPカーネルに関するサポートの約束は
    2351 ã—ていない.ASPカーネルに関して質問がある場合は,後述のTOPPERSユーザー
    2352 ã‚ºãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã‚’利用していただけると幸いである.確実なサポートがå¿
    2353 
    2354 è¦ãªå ´åˆã«ã¯ï¼Œæœ‰å„Ÿã§ã‚µãƒãƒ¼ãƒˆã‚µãƒ¼ãƒ“スを提供している会社に相談されたい.
    2355 
    2356 12.3 バグレポート
    2357 
    2358 ASPカーネルにバグや問題点を発見された場合には,後述のTOPPERSユーザーズ
    2359 ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã«å ±å‘Šã—て欲しい.
    2360 
    2361 ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã«ãƒã‚°ã‚„問題点などを報告する場合には,å¿
    2362 è¦ã«å¿œã˜ã¦æ¬¡ã®
    2363 æƒ
    2364 å ±ã‚’知らせて欲しい.
    2365 
    2366         使用しているカーネルに関するæƒ
    2367 å ±
    2368                 ・ターゲット非依存部のバージョン
    2369                 ・使用しているターゲット依存部とそのバージョン
    2370                 ・TOPPERSプロジェクトからのリリースに対する改造箇所(あれば)
    2371 
    2372         ターゲットシステムに関するæƒ
    2373 å ±
    2374                 ・ターゲットプロセッサの種類
    2375                 ・ターゲットボード等の種類
    2376 
    2377         ホストに関するæƒ
    2378 å ±
    2379                 ・OSのバージョン(サービスパックの適用状況も)
    2380                 ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも)
    2381 
    2382 12.4 ウェブサイト
    2383 
    2384 TOPPERSプロジェクトのウェブサイトは,以下のURLにある.
     1993またその際に,ASPカーネルを使用してのコメントやご意見もいただけると幸い
     1994である.
     1995
     199612.2 保証・適用性・サポート
     1997
     1998ASPカーネルは無保証で提供されているものである.開発者およびTOPPERSプロ
     1999ジェクトは,ASPカーネルに関して,特定の使用目的に対する適合性も含めて,
     2000いかなる保証も行わない.また,ASPカーネルの利用により直接的または間接的
     2001に生じたいかなる損害に関しても,その責任を負わない.
     2002
     2003開発者およびTOPPERSプロジェクトは,ASPカーネルに関するサポートの約束は
     2004していない.ASPカーネルに関して質問がある場合は,後述のTOPPERSユーザー
     2005ズメーリングリストを利用していただけると幸いである.確実なサポートが必
     2006要な場合には,有償でサポートサービスを提供している会社に相談されたい.
     2007
     200812.3 バグレポート
     2009
     2010ASPカーネルにバグや問題点を発見された場合には,後述のTOPPERSユーザーズ
     2011メーリングリストに報告して欲しい.
     2012
     2013メーリングリストにバグや問題点などを報告する場合には,必要に応じて次の
     2014情報を知らせて欲しい.
     2015
     2016        使用しているカーネルに関する情報
     2017                ・ターゲット非依存部のバージョン
     2018                ・使用しているターゲット依存部とそのバージョン
     2019                ・TOPPERSプロジェクトからのリリースに対する改造箇所(あれば)
     2020
     2021        ターゲットシステムに関する情報
     2022                ・ターゲットプロセッサの種類
     2023                ・ターゲットボード等の種類
     2024
     2025        ホストに関する情報
     2026                ・OSのバージョン(サービスパックの適用状況も)
     2027                ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも)
     2028
     202912.4 ウェブサイト
     2030
     2031TOPPERSプロジェクトのウェブサイトは,以下のURLにある.
    23852032
    23862033        http://www.toppers.jp/
    23872034
    2388 TOPPERSプロジェクトやASPカーネルに関する最新æƒ
    2389 å ±ã¯ï¼Œã“のウェブサイトか
    2390 ã‚‰å¾—ることができる.また,ASPカーネルの最新版は,このウェブサイトからダ
    2391 ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“とができる.
    2392 
    2393 12.5 TOPPERSユーザーズメーリングリスト
    2394 
    2395 ASPカーネルを含むTOPPERSプロジェクトの開発成果物のユーザに対するæƒ
    2396 å ±æ
    2397 ä¾›ãŠã‚ˆã³ãƒ¦ãƒ¼ã‚¶ç›¸äº’間のæƒ
    2398 å ±äº¤æ›ã‚’容易にするために,TOPPERSユーザーズメー
    2399 ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆï¼ˆusers@toppers.jp)を用意している.
    2400 
    2401 ã“のメーリングリストには,誰でも自由に登録し,メールを送付することがで
    2402 ãã‚‹ï¼ˆç™»éŒ²è€
    2403 ä»¥å¤–はメールを送付できない).また,送付されたメールは,誰
    2404 ã§ã‚‚自由にウェブサイトで読むことができる.
    2405 
    2406 ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã¸ã®ç™»éŒ²æ–¹æ³•ã«ã¤ã„ては,以下のURLのページに説明がある.
     2035TOPPERSプロジェクトやASPカーネルに関する最新情報は,このウェブサイトか
     2036ら得ることができる.また,ASPカーネルの最新版は,このウェブサイトからダ
     2037ウンロードすることができる.
     2038
     203912.5 TOPPERSユーザーズメーリングリスト
     2040
     2041ASPカーネルを含むTOPPERSプロジェクトの開発成果物のユーザに対する情報提
     2042供およびユーザ相互間の情報交換を容易にするために,TOPPERSユーザーズメー
     2043リングリスト(users@toppers.jp)を用意している.
     2044
     2045このメーリングリストには,誰でも自由に登録し,メールを送付することがで
     2046きる(登録者以外はメールを送付できない).また,送付されたメールは,誰
     2047でも自由にウェブサイトで読むことができる.
     2048
     2049メーリングリストへの登録方法については,以下のURLのページに説明がある.
    24072050
    24082051        http://www.toppers.jp/community.html
    24092052
    2410 12.6 TOPPERSプロジェクトのメンバ向けのサービス
    2411 
    2412 TOPPERSプロジェクトのメンバに対しては,上記に加えて,ASPカーネルに関連
    2413 ã—て次のサービスを用意している.
    2414 
    2415 (1) TOPPERS開発è€
    2416 ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆ
    2417 
    2418 TOPPERSプロジェクトのメンバは,ASPカーネルに関する質問,バグや問題点な
    2419 ã©ã®å ±å‘Šã«ï¼ŒTOPPERS開発è€
    2420 ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆï¼ˆdev@toppers.jp)を利用するこ
    2421 ã¨ãŒã§ãã‚‹ï¼Ž
    2422 
    2423 (2) ASPカーネルの開発支援サイト
    2424 
    2425 ASPカーネルの開発支援のためのTRAC(バグトラッキングシステム)が,以下の
    2426 URLにある(TRACへのアクセスには,会員パスワードがå¿
    2427 è¦ã§ã‚る).
     205312.6 TOPPERSプロジェクトのメンバ向けのサービス
     2054
     2055TOPPERSプロジェクトのメンバに対しては,上記に加えて,ASPカーネルに関連
     2056して次のサービスを用意している.
     2057
     2058(1) TOPPERS開発者メーリングリスト
     2059
     2060TOPPERSプロジェクトのメンバは,ASPカーネルに関する質問,バグや問題点な
     2061どの報告に,TOPPERS開発者メーリングリスト(dev@toppers.jp)を利用するこ
     2062とができる.
     2063
     2064(2) ASPカーネルの開発支援サイト
     2065
     2066ASPカーネルの開発支援のためのTRAC(バグトラッキングシステム)が,以下の
     2067URLにある(TRACへのアクセスには,会員パスワードが必要である).
    24282068
    24292069        http://dev.toppers.jp/trac/asp/
    24302070
    2431 TOPPERSプロジェクトのメンバは,このサイトから,ウェブインタフェースおよ
    2432 ã³subversionサーバにより,ASPカーネルの開発中のバージョンを得ることがで
    2433 ãã‚‹ï¼Žã¾ãŸï¼Œãƒã‚°ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“とができ,過去
    2434 ã®ãƒã‚°å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„,バグの登録をすることができる.
    2435 
    2436 12.7 TOPPERSプロジェクトへの参加
    2437 
    2438 TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献していただける方,
    2439 ãƒ—ロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお
    2440 æŒã¡ã®æ–¹ã®å‚加を求めている.TOPPERSプロジェクトへの参加方法については,
    2441 ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã«èª¬æ˜ŽãŒã‚る.
     2071TOPPERSプロジェクトのメンバは,このサイトから,ウェブインタフェースおよ
     2072びsubversionサーバにより,ASPカーネルの開発中のバージョンを得ることがで
     2073きる.また,バグトラッキングデータベースにアクセスすることができ,過去
     2074のバグ履歴へのアクセスや,バグの登録をすることができる.
     2075
     207612.7 TOPPERSプロジェクトへの参加
     2077
     2078TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献していただける方,
     2079プロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお
     2080持ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については,
     2081以下のページに説明がある.
    24422082
    24432083        http://www.toppers.jp/joinus.html
    24442084
    24452085
    2446 ï¼‘3.リファレンス
    2447 
    2448 13.1 サービスコール一覧
    2449 
    2450 (1) タスク管理機能
     208613.リファレンス
     2087
     208813.1 サービスコール一覧
     2089
     2090(1) タスク管理機能
    24512091
    24522092        ER ercd = act_tsk(ID tskid)
     
    24602100        ER ercd = ref_tsk(ID tskid, T_RTSK *pk_rtsk)
    24612101
    2462 (2) タスク付属同期機能
     2102(2) タスク付属同期機能
    24632103
    24642104        ER ercd = slp_tsk(void)
     
    24732113        ER ercd = dly_tsk(RELTIM dlytim)
    24742114
    2475 (3) タスク例外処理機能
     2115(3) タスク例外処理機能
    24762116
    24772117        ER ercd = ras_tex(ID tskid, TEXPTN rasptn)
     
    24822122        ER ercd = ref_tex(ID tskid, T_RTEX *pk_rtex)
    24832123
    2484 (4) 同期・通信機能
     2124(4) 同期・通信機能
    24852125
    24862126        ER ercd = sig_sem(ID semid)
     
    25332173        ER ercd = ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
    25342174
    2535 (5) メモリプール管理機能
     2175(5) メモリプール管理機能
    25362176
    25372177        ER ercd = get_mpf(ID mpfid, void **p_blk)
     
    25422182        ER ercd = ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
    25432183
    2544 (6) 時間管理機能
     2184(6) 時間管理機能
    25452185
    25462186        ER ercd = get_tim(SYSTIM *p_systim)
     
    25572197        ER ercd = ref_alm(ID almid, T_RALM *pk_ralm)
    25582198
    2559 (7) システム状æ
    2560 ‹ç®¡ç†æ©Ÿèƒ½
     2199(7) システム状態管理機能
    25612200
    25622201        ER ercd = rot_rdq(PRI tskpri)
     
    25772216        ER ercd = ext_ker(void)
    25782217
    2579 (8) 割込み管理機能
     2218(8) 割込み管理機能
    25802219
    25812220        ER ercd = dis_int(INTNO intno)
     
    25842223        ER ercd = get_ipm(PRI *p_intpri)
    25852224
    2586 (9) CPU例外管理機能
     2225(9) CPU例外管理機能
    25872226
    25882227        bool_t stat = xsns_dpn(void *p_excinf)
    25892228        bool_t stat = xsns_xpn(void *p_excinf)
    25902229
    2591 13.2 静的API一覧
    2592 
    2593 (1) タスク管理機能
     223013.2 静的API一覧
     2231
     2232(1) タスク管理機能
    25942233
    25952234        CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
    25962235                                                                PRI itskpri, SIZE stksz, STK_T *stk })
    25972236
    2598 (3) タスク例外処理機能
     2237(3) タスク例外処理機能
    25992238
    26002239        DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })
    26012240
    2602 (4) 同期・通信機能
     2241(4) 同期・通信機能
    26032242
    26042243        CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
     
    26082247        CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })
    26092248
    2610 (5) メモリプール管理機能
     2249(5) メモリプール管理機能
    26112250
    26122251        CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
    26132252                                                                                MPF_T *mpf, void *mpfmb })
    26142253
    2615 (6) 時間管理機能
     2254(6) 時間管理機能
    26162255
    26172256        CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,
     
    26192258        CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })
    26202259
    2621 (8) 割込み管理機能
     2260(8) 割込み管理機能
    26222261
    26232262        CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
     
    26252264        DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
    26262265
    2627 (9) CPU例外管理機能
     2266(9) CPU例外管理機能
    26282267
    26292268        DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
    26302269
    2631 (10) システム構成管理機能
     2270(10) システム構成管理機能
    26322271
    26332272        DEF_ICS({ SIZE istksz, STK_T *istk })
     
    26352274        ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
    26362275
    2637 13.3 バージョン履歴
    2638 
    2639         2006å¹´10月29日       Release 1.A.0           æœ€åˆã®ãƒªãƒªãƒ¼ã‚¹
    2640         2007å¹´2月20日        Release 1.A.1
    2641         2007å¹´2月20日        Release 1.A.2
    2642         2007å¹´7月12日        Release 1.B.0           ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’新バージョンに
    2643         2007å¹´7月12日        Release 1.B.1           ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ã®å
    2644 ¥ã‚Œæ›ãˆ
    2645         2007å¹´7月16日        Release 1.B.2
    2646         2007å¹´7月21日        Release 1.B.3           ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹æˆã®å¤‰æ›´
    2647         2007å¹´8月20日        Release 1.B.4           æ‹¡å¼µãƒ‘ッケージの追加
    2648         2007å¹´10月16日       Release 1.B.5
    2649         2007å¹´11月15日       Release 1.0.0           æ­£å¼ç‰ˆã®ãƒªãƒªãƒ¼ã‚¹
    2650         2007å¹´12月23日       Release 1.1.0
    2651         2008å¹´3月19日        Release 1.2.0
    2652         2008å¹´3月21日        Release 1.2.1
    2653         2008å¹´4月12日        Release 1.3.0           ä¸€èˆ¬å
    2654 ¬é–‹ã«å‘けての最終修正
    2655         2008å¹´5月13日        Release 1.3.1           æœ€åˆã®ä¸€èˆ¬å
    2656 ¬é–‹ç‰ˆ
    2657         2008å¹´8月21日        Release 1.3.2
    2658         2009å¹´5月11日        Release 1.4.0
    2659         2010å¹´6月28日        Release 1.5.0           æ‹¡å¼µãƒ‘ッケージを一般å
    2660 ¬é–‹
    2661         2010å¹´8月1日 Release 1.6.0           cfg-1.6に対応
    2662         2011å¹´5月8日 Release 1.7.0           å‹•çš„生成機能拡張パッケージ等の追加
    2663         2012å¹´12月26日       Release 1.8.0
    2664         2014å¹´1月6日 Release 1.9.0           ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡æ©Ÿèƒ½æ‹¡å¼µã®è¿½åŠ 
    2665         2014å¹´11月17日       Release 1.9.1
    2666         2015å¹´5月30日        Release 1.9.2
    2667         2017å¹´4月29日        Release 1.9.3
    2668 
    2669 ä»¥ä¸Š
     227613.3 バージョン履歴
     2277
     2278        2006年10月29日     Release 1.A.0           最初のリリース
     2279        2007年2月20日      Release 1.A.1
     2280        2007年2月20日      Release 1.A.2
     2281        2007年7月12日      Release 1.B.0           コンフィギュレータを新バージョンに
     2282        2007年7月12日      Release 1.B.1           ライセンス条件の入れ換え
     2283        2007年7月16日      Release 1.B.2
     2284        2007年7月21日      Release 1.B.3           ディレクトリ構成の変更
     2285        2007年8月20日      Release 1.B.4           拡張パッケージの追加
     2286        2007年10月16日     Release 1.B.5
     2287        2007年11月15日     Release 1.0.0           正式版のリリース
     2288        2007年12月23日     Release 1.1.0
     2289        2008年3月19日      Release 1.2.0
     2290        2008年3月21日      Release 1.2.1
     2291        2008年4月12日      Release 1.3.0           一般公開に向けての最終修正
     2292        2008年5月13日      Release 1.3.1           最初の一般公開版
     2293        2008年8月21日      Release 1.3.2
     2294        2009年5月11日      Release 1.4.0
     2295        2010年6月28日      Release 1.5.0           拡張パッケージを一般公開
     2296        2010年8月1日       Release 1.6.0           cfg-1.6に対応
     2297        2011年5月8日       Release 1.7.0           動的生成機能拡張パッケージ等の追加
     2298        2012年12月26日     Release 1.8.0
     2299        2014年1月6日       Release 1.9.0           メッセージバッファ機能拡張の追加
     2300        2014年11月17日     Release 1.9.1
     2301        2015年5月30日      Release 1.9.2
     2302        2017年4月29日      Release 1.9.3
     2303
     2304以上
  • rubycfg_asp/trunk/asp_dcre/doc/version.txt

    • Property svn:mime-type changed from text/plain to text/plane; charset=UTF-8
    r313 r315  
    11
    2                 TOPPERS/ASPカーネル
    3                 変更履歴
    4 
    5                 対応バージョン: Release 1.9.3
    6                 最終更新: 2017å¹´4月29日
    7 
    8 ã“のドキュメントは,TOPPERS/ASPカーネルのRelease 1.0.0以降の変更履歴を,
    9 æ–°ã—い方から順に記述したものである.
     2                TOPPERS/ASPカーネル
     3                変更履歴
     4
     5                対応バージョン: Release 1.9.3
     6                最終更新: 2017年4月29日
     7
     8このドキュメントは,TOPPERS/ASPカーネルのRelease 1.0.0以降の変更履歴を,
     9新しい方から順に記述したものである.
    1010
    1111----------------------------------------------------------------------
     
    1717             Graduate School of Information Science, Nagoya Univ., JAPAN
    1818 
    19  ä¸Šè¨˜è‘—作権è€
    20 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    21  ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    22  å¤‰ãƒ»å†é
    23 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    24  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    25      æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    26      ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    27  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    28      ç”¨ã§ãã‚‹å½¢ã§å†é
    29 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    30 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    31      è€
    32 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    33      ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    34  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    35      ç”¨ã§ããªã„形で再é
    36 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    37      ã¨ï¼Ž
    38    (a) 再é
    39 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    40 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    41        ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    42    (b) 再é
    43 å¸ƒã®å½¢æ
    44 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    45        å ±å‘Šã™ã‚‹ã“と.
    46  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    47      å®³ã‹ã‚‰ã‚‚,上記著作権è€
    48 ãŠã‚ˆã³TOPPERSプロジェクトをå
    49 è²¬ã™ã‚‹ã“と.
    50      ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    51      ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    52 ãŠã‚ˆã³TOPPERSプロジェクトを
    53      å
    54 è²¬ã™ã‚‹ã“と.
     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     免責すること.
    5541 
    56  æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    57 ãŠ
    58  ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    59  ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    60  ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    61  ã®è²¬ä»»ã‚’負わない.
     42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     46 の責任を負わない.
    6247 
    6348 $Id$
    6449----------------------------------------------------------------------
    6550
    66                 TOPPERS/ASPカーネル
    67                 Release 1.9.2 から 1.9.3 への変更点
    68 
    69 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    70 
    71 ãƒ»å‹•çš„生成機能拡張パッケージのバグフィックス
    72         - acre_tskで,優å
    73 ˆåº¦ã®é«˜ã„タスクを生成・起動してもディスパッチが起
    74           こらない不å
    75 ·åˆã‚’修正.
    76         - fsnd_dtqとifsnd_dtqで,エラーコードにE_OKを上書きしている不å
    77 ·åˆ
    78           を修正.
    79         - acre_tskで,p_tinib->stkszに格納する値(stksz)を丸めた値とする
    80           ように修正.
    81 
    82 ãƒ»ãã®ä»–の修正
    83         - syslog_ref_logの出口のログ出力マクロ(LOG_SYSLOG_REF_LOG_LEAVE)
    84           のパラメータにエラーコードを追加.
    85         - extension/dcre/kernel/kernel.tfで,ISRに渡す拡張æƒ
    86 å ±ã‚’intptr_t型
    87           へのキャストするように修正.
    88         - sample/Makefile中のコンパイラに対する-Tオプションを,-Wl,-Tオプ
    89           ションに変更.
    90         - utils/genoffset.tfに,SIL_ENDIAN_BIT/LITTLEの誤定義の検出処理を
    91           追加.
    92         - コンフィギュレータのエラーメッセージの修正.
    93         - テンプレートファイルの記述スタイルの修正.
    94         - 拡張パッケージも,kernel.tf中で,スタック領域の確保にALLOC_STACK
    95           を使うように修正(過去の修正時の拡張パッケージの修正漏れ).
    96         - TLSFのinit_memory_poolが返すエラー値のチェック方法を修正〔Mac OS
    97           Xターゲット依存部〕.
    98 
    99 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£ï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    100 
    101 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    102         - カーネルのバージョン番号を更新.
    103 
    104 ----------------------------------------------------------------------
    105 
    106                 TOPPERS/ASPカーネル
    107                 Release 1.9.1 から 1.9.2 への変更点
    108 
    109 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    110 
    111 ãƒ»å‹•çš„生成機能拡張のバグフィックス
    112         - acre_cycで,周期ハンドラを開始する処理のバグを修正.
    113 
    114 ãƒ»ãã®ä»–のバグフィックス
    115         - test_cpuexc10.cのチェック値の誤りの修正.
    116 
    117 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£ï¼Ž
    118 
    119 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    120         - カーネルのバージョン番号を更新.
    121 
    122 ----------------------------------------------------------------------
    123 
    124                 TOPPERS/ASPカーネル
    125                 Release 1.9.0 から 1.9.1 への変更点
    126 
    127 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    128 
    129 ãƒ»ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ©Ÿèƒ½æ‹¡å¼µã®ä»•æ§˜å¤‰æ›´
    130         - 自タスクがロックしているミューテックスを再度ロックしようとした場
    131           合と,自タスクがロックしていないミューテックスをロック解除しよう
    132           とした場合のエラーコードをE_OBJに変更.
    133 
    134 ãƒ»ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ©Ÿèƒ½æ‹¡å¼µã®ãƒã‚°ãƒ•ã‚£ãƒƒã‚¯ã‚¹
    135         - タスク終了時のミューテックスの解放順序を逆順に.
    136 
    137 ãƒ»å‹•çš„生成機能拡張のバグフィックス
    138         - オブジェクト未登録エラーのチェックの抜けおよびバグを修正.
    139         - オブジェクト未登録の場合の他のエラーのチェック場所の修正.
    140 
    141 ãƒ»ã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©æ©Ÿèƒ½æ‹¡å¼µã®ãƒã‚°ãƒ•ã‚£ãƒƒã‚¯ã‚¹
    142         - オーバランタイマ割込みハンドラの起動と,オーバランタイマの再動作
    143           開始/停止との競合の問題を修正.
    144 
    145 ãƒ»ãƒ†ã‚¹ãƒˆãƒ—ログラム関係の修正
    146 
    147 ãƒ»ãã®ä»–の修正
    148         - xsns_dpnとxsns_xpnで,kerflgもチェックするように修正(安å
    149 ¨æ€§ã®å‘
    150           上のための修正).
    151         - kernel.tf中で,スタック領域の確保にALLOC_STACKを使うように修正.
    152 
    153 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    154 
    155 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    156 
    157 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    158         - カーネルのバージョン番号を更新.
    159 
    160 ----------------------------------------------------------------------
    161 
    162                 TOPPERS/ASPカーネル
    163                 Release 1.8.0 から 1.9.0 への変更点
    164 
    165 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    166 
    167 ãƒ»ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージの追加
    168 
    169 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ãƒ‘ス3のテンプレートファイルに,ターゲット依存部で
    170 ã€€è¨­å®šã—たセクションを,LMAからVMAにコピーする処理を追加
    171 
    172 ãƒ»ã‚µãƒ³ãƒ—ルのMakefileの修正
    173         - C言語の時に-lcを付けるように修正.
    174         - CFG_OBJSを,CFG_ASMOBJSとCFG_COBJSに分離.
    175 
    176 ãƒ»å
    177 ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ã‚³ãƒ¼ãƒ‰ã®ä¿®æ­£
    178         - å
    179 ˆé ­ç•ªåœ°ã®ã‚µã‚¤ã‚ºãŒå›ºå®šå€¤ã«ãªã£ã¦ã„たところを,sizeof_FPに修正.
    180         - オーバランハンドラ機能拡張において,オーバランハンドラのå
    181 ˆé ­ç•ªåœ°
    182           のチェックを追加.
    183 
    184 ãƒ»é™çš„APIにおけるエラーチェックの追加
    185         - 符号無しのパラメータに負の値を指定した場合のエラーチェックを追加.
    186         - イベントフラグの初期ビットパターンのエラーチェックを追加.
    187 
    188 ãƒ»ãƒ†ã‚¹ãƒˆãƒ—ログラム関係の修正
    189         - テストライブラリに,test_startを追加.
    190         - テストプログラムのå
    191 ˆé ­ã§ï¼Œãƒ—ログラム名を表示するように修正.
    192         - gentestを拡張.
    193 
    194 ãƒ»å‹•çš„生成機能拡張のバグフィックス
    195         - カーネルが割り付けるメモリ領域のサイズのチェックコードを修正.
    196         - DEF_KMMのkmmszが0以下の場合のエラーチェックを追加.
    197         - カーネルå†
    198 éƒ¨ã‚·ãƒ³ãƒœãƒ«ã®ãƒªãƒãƒ¼ãƒ è¡¨ã‚’修正.
    199 
    200 ãƒ»ãã®ä»–のバグフィックス
    201         - kernel_def.csvにTARGET_MIN_ISTKSZを追加.
    202         - オーバランハンドラ機能拡張で,オーバランハンドラをサポートしてい
    203           ないターゲットでDEF_OVRを使用した場合には,コンフィギュレータでエ
    204           ラーとするように修正.
    205 
    206 ãƒ»ãã®ä»–の修正
    207         - reqdspをdspreqに,p_reqdspをp_dspreqにリネーム.
    208         - スタック領域と固定長メモリプール領域のå
    209 ˆé ­ç•ªåœ°ã‚’ユーザが指定した
    210           場合には,kernel_cfg.c中で(void *)型にキャストするように修正.動
    211           的生成機能拡張のカーネルが割り付けるメモリ領域のå
    212 ˆé ­ç•ªåœ°ã‚‚同様.
    213         - TNUM_PORTが5以上の時は,serial.cでエラーを報告する.
    214         - makedepとmakereleaseを改善.
    215 
    216 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    217 
    218 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    219         - ユーザーズマニュアルに「1.6 Cygwin環境における注意事é 
    220 ã€ã‚’追加.
    221         - ユーザーズマニュアルに「11.8 rodataセクションをRAMに置く場合」を
    222           追加.
    223 
    224 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    225         - カーネルのバージョン番号を更新.
    226 
    227 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.8.0 → 1.9.0)
    228 
    229 (1) CFG_OBJSをCFG_COBJSにリネーム
    230         - Makefileのターゲット依存部でCFG_OBJSを定義している場合には,
    231           CFG_COBJSにリネームする.
    232 
    233 ----------------------------------------------------------------------
    234 
    235                 TOPPERS/ASPカーネル
    236                 Release 1.7.0 から 1.8.0 への変更点
    237 
    238 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    239 
    240 ãƒ»char_t型の廃止
    241 
    242 ãƒ»SILのメモリ空間読出し関数に渡すポインタの属性の変更
    243         - sil_r??_???に渡しポインタに,const属性を追加.
    244 
    245 ãƒ»éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®ã‚µã‚¤ã‚ºãƒã‚§ãƒƒã‚¯ã®è¿½åŠ 
    246         - DEF_ICSのistkszがターゲット定義の最小値(TARGET_MIN_ISTKSZ)より
    247           も小さい場合にE_PARエラーとする処理を追加.
    248 
    249 ãƒ»vasyslog.cをlibraryディレクトリに移動
    250 
    251 ãƒ»MISRA-C対応のためのコードの修正
    252         - 文をマクロ定義している箇所をdo{}while(false)で囲む.
    253         - コンマ演算子に使用を最小限に.
    254         - 多重代å
    255 ¥æ–‡ã‚’やめる.
    256         - 符号無し整数定数にUをつける.
    257         - 標準的な名前を変数名として使わないように修正.
    258         - 返値を使わない関数呼出しを(void)にキャストする.
    259 
    260 ãƒ»ãã®ä»–のバグフィックス
    261         - ミューテックス機能拡張で,ref_tskがTTW_MTXを返す処理を追加.
    262         - 動的生成機能拡張で,acre_isrのエラーコードを修正.
    263         - 動的生成機能拡張で,オブジェクトコントロールブロックがない時に
    264           acre_yyyを呼んだ場合の問題を修正.
    265         - kernel_check.tfでエラーメッセージの出力処理を修正.
    266         - 拡張モジュールの追従ミスの修正.
    267         - TOPPERS_SUPPORT_OVRTIMをTOPPERS_SUPPORT_OVRHDRに修正.
    268 
    269 ãƒ»ã‚µãƒ³ãƒ—ルのMakefileの修正
    270         - カーネルライブラリを別ディレクトリで作成する時に,カーネルライブ
    271           ラリが更新されたら,オブジェクトファイルを再構築するように修正.
    272         - CFG2_OUTをCFG2_OUT_SRCSにリネーム.
    273         - LDFLAGSは,cfg1_out.cのリンク時には適用されないように修正.
    274         - log_output.o,vasyslog.o,t_perror.o,strerror.oを,SYS_COBJSから
    275           APPL_COBJSに移動.
    276 
    277 ãƒ»ãã®ä»–の修正
    278         - semaphore.h等からwait.hをインクルードするように修正.
    279         - TOPPERS_EMPTY_LABELのデフォルトの定義をkernel_int.hに移動.
    280         - __STDC_VERSION__が定義されていない場合に対応.
    281         - test_lib.hに多重インクルードの防止コードを追加.
    282         - ユーティリティプログラムを新しいperlに対応するように修正.
    283         - gentestを拡張(CPU例外ハンドラの生成,GOTOに対応など).
    284         - configureにオプションを追加.
    285         - test_tex1にテストケース1件を追加.
    286 
    287 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    288 
    289 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    290 
    291 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    292         - カーネルのバージョン番号を更新.
    293 
    294 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.7.0 → 1.8.0)
    295 
    296 (1) char_t型をchar型に修正
    297 
    298 (2) TARGET_MIN_ISTKSZの定義を追加(オプション)
    299         - 非タスクコンテキストのスタックサイズの最小値をチェックする場合に
    300           は,最小値をTARGET_MIN_ISTKSZに定義する.
    301 
    302 (3) CFG2_OUTをCFG2_OUT_SRCSにリネーム
    303         - Makefileのターゲット依存部でCFG2_OUTを定義している場合には,
    304           CFG2_OUT_SRCSにリネームする.
    305 
    306 (4) CFG1_OUT_LDFLAGSの定義
    307         - Makefileのターゲット依存部で定義したLDFLAGSは,cfg1_out.cをリンク
    308           する際には適用されないように変更したため,LDFLAGSに定義したオプショ
    309           ンで,cfg1_out.cをリンクする際にもå¿
    310 è¦ãªã‚‚のは,CFG1_OUT_LDFLAGS
    311           にも定義するように修正する.
    312 
    313 ----------------------------------------------------------------------
    314 
    315                 TOPPERS/ASPカーネル
    316                 Release 1.6.0 から 1.7.0 への変更点
    317 
    318 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    319 
    320 ãƒ»å‹•çš„生成機能拡張パッケージ,制約タスク拡張パッケージの追加
    321 
    322 ãƒ»ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理ルーチンの実行開始条件の変更
    323         - タスク例外処理ルーチンの実行に関するコードの修正.
    324         - ipmflgを導å
    325 ¥ï¼Ž
    326         - exc_sense_unlockを廃止.
    327 
    328 ãƒ»ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®ã‚³ãƒ¼ãƒ‰ã®ä¿®æ­£
    329         - データ管理ブロックの導å
    330 ¥ï¼ˆä»–のオブジェクトの実è£
    331 ã¨æ•´åˆã•ã‚ŒãŸï¼‰ï¼Ž
    332 
    333 ãƒ»SILのメモリ空間アクセス関数に渡すポインタの型の変更
    334         - void *を渡していたところを,サイズにあわせて,uint8_t *などに変更.
    335 
    336 ãƒ»å‹•çš„生成機能拡張パッケージにあわせた修正
    337         - t_stddef.hにMB_T型の定義を追加.
    338         - コンフィギュレータのテンプレートファイル(パス2および3)で定義し
    339           ていたターゲット依存æƒ
    340 å ±ã‚’,ヘッダファイルに移動.
    341         - kernel_def.csvに,それらの値を取得するための記述を追加.
    342         - ポーティングガイドの修正.
    343 
    344 ãƒ»ã‚ªãƒ•ã‚»ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’コンフィギュレータで生成する方法を追加
    345         - genoffset.tfを追加.
    346         - kernel_def.csvに,SIL_ENDIAN_BIG/LITTLEを追加.
    347         - sample/Makefileを修正.
    348         - m68k依存部を,この方法に対応させる.
    349         - ポーティングガイドの修正.
    350 
    351 ãƒ»ãã®ä»–のバグフィックス
    352         - CHECK_INTPRI_CHGIPMの定義中のtypoを修正.
    353         - genoffsetのRelease 1.6.0におけるディグレードを修正.
    354         - オーバランハンドラ拡張機能で,ターゲット依存部がオーバランハンド
    355           ラをサポートしていない場合には,TCB中のleftotmを定義しないように
    356           修正.
    357 
    358 ãƒ»ãã®ä»–の修正
    359         - USE_TSKINICTXBをマクロ定義した場合のスタック領域のå
    360 ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒ
    361           クのために,GET_STK_TSKINICTXBを導å
    362 ¥ï¼Ž
    363         - kernel_cfg.c中で,タスクのå
    364 ˆé ­ç•ªåœ°ã‚’TASK型にキャストするように
    365           kernel.tfを修正.
    366         - ext_tskのE_SYSの返し方を修正.ext_kerもE_SYSを返すコードに修正.
    367         - CFG_INTは,有効なすべての割込み番号に対応する方針に従い,コンフィ
    368           ギュレータのエラー条件を修正.
    369         - makedepに-Sオプションを追加.
    370         - シリアルドライバでサポートするポート数を,最大4ポートに変更.
    371 
    372 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    373 
    374 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    375 
    376 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    377         - カーネルのバージョン番号を更新.
    378 
    379 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.6.0 → 1.7.0)
    380 
    381 (1) ターゲット依存部で,calltexを呼ぶ代わりにcalltexのå†
    382 å®¹ã‚’インライン
    383 å±•é–‹ã—ている場合に,call_texrtnを呼び出す条件に「ipmflgがtrue」を追加す
    384 ã‚‹ã‚ˆã†ã«ä¿®æ­£ï¼Ž
    385 
    386 (2) 割込み出å
    387 ¥å£å‡¦ç†ãŒæ­£ã—いかの確認.
    388         - ポーティングガイドの割込み出å
    389 ¥å£å‡¦ç†ã«è¿½åŠ ã—た「割込み優å
    390 ˆåº¦ãƒžã‚¹
    391           クを,å
    392 ¨è§£é™¤çŠ¶æ
    393 ‹ï¼ˆTIPM_ENAALL)の値に設定する … (*h)」の処理が実
    394           現されているかを確認.
    395         - ポーティングガイドの6.6.1節の記述を確認((*g)(*i)の注記を追加する
    396           など,記述を詳細化した).
    397 
    398 (3) exc_sense_unlockの定義を削除.
    399 
    400 (4) TARGET_TSKATR,TARGET_ISRATR,TARGET_INHATR,TARGET_INTATR,
    401 TARGET_EXCATR,TARGET_MIN_STKSZ,CHECK_STKSZ_ALIGNの定義を,ターゲット
    402 ä¾å­˜éƒ¨ã®ãƒ†ãƒ³ãƒ—レートファイル(パス2)からヘッダファイルに移動.
    403 
    404 (5) CHECK_FUNC_ALIGN,CHECK_FUNC_NONNULL,CHECK_STACK_ALIGN,
    405 CHECK_STACK_NONNULL,CHECK_MPF_ALIGN,CHECK_MPF_NONNULLの定義を,ターゲッ
    406 ãƒˆä¾å­˜éƒ¨ã®ãƒ†ãƒ³ãƒ—レートファイル(パス3)からヘッダファイルに移動.
    407 
    408 (6) 動的生成機能拡張パッケージに対応.
    409         - CHECK_MB_ALIGNの定義を追加.
    410         - TSZ_PDQMBの定義を追加(デフォルトで不都合な場合).
    411         - VALID_INTNO_CREINTの定義を追加.
    412         - 動的メモリ管理に関する定義を追加.
    413 
    414 (7) オフセットファイルをコンフィギュレータで生成する方法への対応(å¿
    415 é ˆ
    416 ã§ã¯ãªã„が,対応しておくことが望ましい).詳しくは,ポーティングガイド
    417 ã®2.5節を参ç
    418 §ã™ã‚‹ã“と.
    419 
    420 (8) USE_TSKINICTXBをマクロ定義し,CHECK_STACK_ALIGNとCHECK_STACK_NONNULL
    421 ã®ã„ずれかを定義している場合には,TINIBからスタック領域のå
    422 ˆé ­ç•ªåœ°ã‚’取り
    423 å‡ºã™ãŸã‚ã®ãƒ†ãƒ³ãƒ—レートファイル関数GET_STK_TSKINICTXBを定義.
    424 
    425 ----------------------------------------------------------------------
    426 
    427                 TOPPERS/ASPカーネル
    428                 Release 1.5.0 から 1.6.0 への変更点
    429 
    430 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    431 
    432 ãƒ»cfgの新しいバージョン(1.6)に対応
    433         - offsetof_TINIB_stkszとoffsetof_TINIB_stkの取得記述をターゲット非
    434           依存部に移動.
    435 
    436 ãƒ»ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã®ä¿®æ­£
    437         - genoffsetに,エンディアン指定をチェックする機能を追加.その際に,
    438           コードを整理.
    439 
    440 ãƒ»ãã®ä»–の修正
    441         - TCBのpriorityフィールドを,条件があえばuint_8で定義するように修正.
    442         - ターゲット依存部でSIL_ENDIAN_BIGもSIL_ENDIAN_LITTLEも定義されてい
    443           ない場合に,sil.hでエラーを検出するように修正.
    444         - システムログ機能のsysog_logmaskとsyslog_lowmask_notの初期値を修正.
    445         - makereleaseを,ファイルの重複をチェックするように修正.
    446         - test_utm1のエラーメッセージを修正.
    447 
    448 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    449 
    450 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    451 
    452 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    453         - カーネルのバージョン番号を更新.
    454 
    455 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.5.0 → 1.6.0)
    456 
    457 (1) makeoffset.cの修正
    458         - makeoffset.cに,sil_endian関数を追加する(これにより,genoffsetの
    459           エンディアン指定をチェックする機能が有効になる).
    460         - オーバランハンドラ拡張パッケージに対応する場合には,leftotmフィー
    461           ルドが含まれているかを確認する.
    462         - 生成されるoffset.hに変化がないことを確認する.
    463 
    464 (2) 値取得シンボルテーブルのターゲット依存部の修正
    465         - 以下の2行をtarget_def.csv(またはそれに代わるファイル)から削除する.
     51                TOPPERS/ASPカーネル
     52                Release 1.9.2 から 1.9.3 への変更点
     53
     54○変更点のリスト
     55
     56・動的生成機能拡張パッケージのバグフィックス
     57        - acre_tskで,優先度の高いタスクを生成・起動してもディスパッチが起
     58          こらない不具合を修正.
     59        - fsnd_dtqとifsnd_dtqで,エラーコードにE_OKを上書きしている不具合
     60          を修正.
     61        - acre_tskで,p_tinib->stkszに格納する値(stksz)を丸めた値とする
     62          ように修正.
     63
     64・その他の修正
     65        - syslog_ref_logの出口のログ出力マクロ(LOG_SYSLOG_REF_LOG_LEAVE)
     66          のパラメータにエラーコードを追加.
     67        - extension/dcre/kernel/kernel.tfで,ISRに渡す拡張情報をintptr_t型
     68          へのキャストするように修正.
     69        - sample/Makefile中のコンパイラに対する-Tオプションを,-Wl,-Tオプ
     70          ションに変更.
     71        - utils/genoffset.tfに,SIL_ENDIAN_BIT/LITTLEの誤定義の検出処理を
     72          追加.
     73        - コンフィギュレータのエラーメッセージの修正.
     74        - テンプレートファイルの記述スタイルの修正.
     75        - 拡張パッケージも,kernel.tf中で,スタック領域の確保にALLOC_STACK
     76          を使うように修正(過去の修正時の拡張パッケージの修正漏れ).
     77        - TLSFのinit_memory_poolが返すエラー値のチェック方法を修正〔Mac OS
     78          Xターゲット依存部〕.
     79
     80・ドキュメントの修正,コメントの修正
     81
     82・バージョン番号の更新
     83        - カーネルのバージョン番号を更新.
     84
     85----------------------------------------------------------------------
     86
     87                TOPPERS/ASPカーネル
     88                Release 1.9.1 から 1.9.2 への変更点
     89
     90○変更点のリスト
     91
     92・動的生成機能拡張のバグフィックス
     93        - acre_cycで,周期ハンドラを開始する処理のバグを修正.
     94
     95・その他のバグフィックス
     96        - test_cpuexc10.cのチェック値の誤りの修正.
     97
     98・ドキュメントの修正.
     99
     100・バージョン番号の更新
     101        - カーネルのバージョン番号を更新.
     102
     103----------------------------------------------------------------------
     104
     105                TOPPERS/ASPカーネル
     106                Release 1.9.0 から 1.9.1 への変更点
     107
     108○変更点のリスト
     109
     110・ミューテックス機能拡張の仕様変更
     111        - 自タスクがロックしているミューテックスを再度ロックしようとした場
     112          合と,自タスクがロックしていないミューテックスをロック解除しよう
     113          とした場合のエラーコードをE_OBJに変更.
     114
     115・ミューテックス機能拡張のバグフィックス
     116        - タスク終了時のミューテックスの解放順序を逆順に.
     117
     118・動的生成機能拡張のバグフィックス
     119        - オブジェクト未登録エラーのチェックの抜けおよびバグを修正.
     120        - オブジェクト未登録の場合の他のエラーのチェック場所の修正.
     121
     122・オーバランハンドラ機能拡張のバグフィックス
     123        - オーバランタイマ割込みハンドラの起動と,オーバランタイマの再動作
     124          開始/停止との競合の問題を修正.
     125
     126・テストプログラム関係の修正
     127
     128・その他の修正
     129        - xsns_dpnとxsns_xpnで,kerflgもチェックするように修正(安全性の向
     130          上のための修正).
     131        - kernel.tf中で,スタック領域の確保にALLOC_STACKを使うように修正.
     132
     133・ドキュメントの充実,コメントの修正
     134
     135・バージョン番号の更新
     136        - カーネルのバージョン番号を更新.
     137
     138----------------------------------------------------------------------
     139
     140                TOPPERS/ASPカーネル
     141                Release 1.8.0 から 1.9.0 への変更点
     142
     143○変更点のリスト
     144
     145・メッセージバッファ機能拡張パッケージの追加
     146
     147・コンフィギュレータのパス3のテンプレートファイルに,ターゲット依存部で
     148 設定したセクションを,LMAからVMAにコピーする処理を追加
     149
     150・サンプルのMakefileの修正
     151        - C言語の時に-lcを付けるように修正.
     152        - CFG_OBJSを,CFG_ASMOBJSとCFG_COBJSに分離.
     153
     154・先頭番地のチェックコードの修正
     155        - 先頭番地のサイズが固定値になっていたところを,sizeof_FPに修正.
     156        - オーバランハンドラ機能拡張において,オーバランハンドラの先頭番地
     157          のチェックを追加.
     158
     159・静的APIにおけるエラーチェックの追加
     160        - 符号無しのパラメータに負の値を指定した場合のエラーチェックを追加.
     161        - イベントフラグの初期ビットパターンのエラーチェックを追加.
     162
     163・テストプログラム関係の修正
     164        - テストライブラリに,test_startを追加.
     165        - テストプログラムの先頭で,プログラム名を表示するように修正.
     166        - gentestを拡張.
     167
     168・動的生成機能拡張のバグフィックス
     169        - カーネルが割り付けるメモリ領域のサイズのチェックコードを修正.
     170        - DEF_KMMのkmmszが0以下の場合のエラーチェックを追加.
     171        - カーネル内部シンボルのリネーム表を修正.
     172
     173・その他のバグフィックス
     174        - kernel_def.csvにTARGET_MIN_ISTKSZを追加.
     175        - オーバランハンドラ機能拡張で,オーバランハンドラをサポートしてい
     176          ないターゲットでDEF_OVRを使用した場合には,コンフィギュレータでエ
     177          ラーとするように修正.
     178
     179・その他の修正
     180        - reqdspをdspreqに,p_reqdspをp_dspreqにリネーム.
     181        - スタック領域と固定長メモリプール領域の先頭番地をユーザが指定した
     182          場合には,kernel_cfg.c中で(void *)型にキャストするように修正.動
     183          的生成機能拡張のカーネルが割り付けるメモリ領域の先頭番地も同様.
     184        - TNUM_PORTが5以上の時は,serial.cでエラーを報告する.
     185        - makedepとmakereleaseを改善.
     186
     187・ドキュメントの充実,コメントの修正
     188        - ユーザーズマニュアルに「1.6 Cygwin環境における注意事項」を追加.
     189        - ユーザーズマニュアルに「11.8 rodataセクションをRAMに置く場合」を
     190          追加.
     191
     192・バージョン番号の更新
     193        - カーネルのバージョン番号を更新.
     194
     195○ターゲット依存部の要修正箇所(1.8.0 → 1.9.0)
     196
     197(1) CFG_OBJSをCFG_COBJSにリネーム
     198        - Makefileのターゲット依存部でCFG_OBJSを定義している場合には,
     199          CFG_COBJSにリネームする.
     200
     201----------------------------------------------------------------------
     202
     203                TOPPERS/ASPカーネル
     204                Release 1.7.0 から 1.8.0 への変更点
     205
     206○変更点のリスト
     207
     208・char_t型の廃止
     209
     210・SILのメモリ空間読出し関数に渡すポインタの属性の変更
     211        - sil_r??_???に渡しポインタに,const属性を追加.
     212
     213・非タスクコンテキスト用のスタック領域のサイズチェックの追加
     214        - DEF_ICSのistkszがターゲット定義の最小値(TARGET_MIN_ISTKSZ)より
     215          も小さい場合にE_PARエラーとする処理を追加.
     216
     217・vasyslog.cをlibraryディレクトリに移動
     218
     219・MISRA-C対応のためのコードの修正
     220        - 文をマクロ定義している箇所をdo{}while(false)で囲む.
     221        - コンマ演算子に使用を最小限に.
     222        - 多重代入文をやめる.
     223        - 符号無し整数定数にUをつける.
     224        - 標準的な名前を変数名として使わないように修正.
     225        - 返値を使わない関数呼出しを(void)にキャストする.
     226
     227・その他のバグフィックス
     228        - ミューテックス機能拡張で,ref_tskがTTW_MTXを返す処理を追加.
     229        - 動的生成機能拡張で,acre_isrのエラーコードを修正.
     230        - 動的生成機能拡張で,オブジェクトコントロールブロックがない時に
     231          acre_yyyを呼んだ場合の問題を修正.
     232        - kernel_check.tfでエラーメッセージの出力処理を修正.
     233        - 拡張モジュールの追従ミスの修正.
     234        - TOPPERS_SUPPORT_OVRTIMをTOPPERS_SUPPORT_OVRHDRに修正.
     235
     236・サンプルのMakefileの修正
     237        - カーネルライブラリを別ディレクトリで作成する時に,カーネルライブ
     238          ラリが更新されたら,オブジェクトファイルを再構築するように修正.
     239        - CFG2_OUTをCFG2_OUT_SRCSにリネーム.
     240        - LDFLAGSは,cfg1_out.cのリンク時には適用されないように修正.
     241        - log_output.o,vasyslog.o,t_perror.o,strerror.oを,SYS_COBJSから
     242          APPL_COBJSに移動.
     243
     244・その他の修正
     245        - semaphore.h等からwait.hをインクルードするように修正.
     246        - TOPPERS_EMPTY_LABELのデフォルトの定義をkernel_int.hに移動.
     247        - __STDC_VERSION__が定義されていない場合に対応.
     248        - test_lib.hに多重インクルードの防止コードを追加.
     249        - ユーティリティプログラムを新しいperlに対応するように修正.
     250        - gentestを拡張(CPU例外ハンドラの生成,GOTOに対応など).
     251        - configureにオプションを追加.
     252        - test_tex1にテストケース1件を追加.
     253
     254・ドキュメントの充実,コメントの修正
     255
     256・バージョン番号の更新
     257        - カーネルのバージョン番号を更新.
     258
     259○ターゲット依存部の要修正箇所(1.7.0 → 1.8.0)
     260
     261(1) char_t型をchar型に修正
     262
     263(2) TARGET_MIN_ISTKSZの定義を追加(オプション)
     264        - 非タスクコンテキストのスタックサイズの最小値をチェックする場合に
     265          は,最小値をTARGET_MIN_ISTKSZに定義する.
     266
     267(3) CFG2_OUTをCFG2_OUT_SRCSにリネーム
     268        - Makefileのターゲット依存部でCFG2_OUTを定義している場合には,
     269          CFG2_OUT_SRCSにリネームする.
     270
     271(4) CFG1_OUT_LDFLAGSの定義
     272        - Makefileのターゲット依存部で定義したLDFLAGSは,cfg1_out.cをリンク
     273          する際には適用されないように変更したため,LDFLAGSに定義したオプショ
     274          ンで,cfg1_out.cをリンクする際にも必要なものは,CFG1_OUT_LDFLAGS
     275          にも定義するように修正する.
     276
     277----------------------------------------------------------------------
     278
     279                TOPPERS/ASPカーネル
     280                Release 1.6.0 から 1.7.0 への変更点
     281
     282○変更点のリスト
     283
     284・動的生成機能拡張パッケージ,制約タスク拡張パッケージの追加
     285
     286・タスク例外処理ルーチンの実行開始条件の変更
     287        - タスク例外処理ルーチンの実行に関するコードの修正.
     288        - ipmflgを導入.
     289        - exc_sense_unlockを廃止.
     290
     291・データキューのコードの修正
     292        - データ管理ブロックの導入(他のオブジェクトの実装と整合された).
     293
     294・SILのメモリ空間アクセス関数に渡すポインタの型の変更
     295        - void *を渡していたところを,サイズにあわせて,uint8_t *などに変更.
     296
     297・動的生成機能拡張パッケージにあわせた修正
     298        - t_stddef.hにMB_T型の定義を追加.
     299        - コンフィギュレータのテンプレートファイル(パス2および3)で定義し
     300          ていたターゲット依存情報を,ヘッダファイルに移動.
     301        - kernel_def.csvに,それらの値を取得するための記述を追加.
     302        - ポーティングガイドの修正.
     303
     304・オフセットファイルをコンフィギュレータで生成する方法を追加
     305        - genoffset.tfを追加.
     306        - kernel_def.csvに,SIL_ENDIAN_BIG/LITTLEを追加.
     307        - sample/Makefileを修正.
     308        - m68k依存部を,この方法に対応させる.
     309        - ポーティングガイドの修正.
     310
     311・その他のバグフィックス
     312        - CHECK_INTPRI_CHGIPMの定義中のtypoを修正.
     313        - genoffsetのRelease 1.6.0におけるディグレードを修正.
     314        - オーバランハンドラ拡張機能で,ターゲット依存部がオーバランハンド
     315          ラをサポートしていない場合には,TCB中のleftotmを定義しないように
     316          修正.
     317
     318・その他の修正
     319        - USE_TSKINICTXBをマクロ定義した場合のスタック領域の先頭番地のチェッ
     320          クのために,GET_STK_TSKINICTXBを導入.
     321        - kernel_cfg.c中で,タスクの先頭番地をTASK型にキャストするように
     322          kernel.tfを修正.
     323        - ext_tskのE_SYSの返し方を修正.ext_kerもE_SYSを返すコードに修正.
     324        - CFG_INTは,有効なすべての割込み番号に対応する方針に従い,コンフィ
     325          ギュレータのエラー条件を修正.
     326        - makedepに-Sオプションを追加.
     327        - シリアルドライバでサポートするポート数を,最大4ポートに変更.
     328
     329・ドキュメントの充実,コメントの修正
     330
     331・バージョン番号の更新
     332        - カーネルのバージョン番号を更新.
     333
     334○ターゲット依存部の要修正箇所(1.6.0 → 1.7.0)
     335
     336(1) ターゲット依存部で,calltexを呼ぶ代わりにcalltexの内容をインライン
     337展開している場合に,call_texrtnを呼び出す条件に「ipmflgがtrue」を追加す
     338るように修正.
     339
     340(2) 割込み出入口処理が正しいかの確認.
     341        - ポーティングガイドの割込み出入口処理に追加した「割込み優先度マス
     342          クを,全解除状態(TIPM_ENAALL)の値に設定する … (*h)」の処理が実
     343          現されているかを確認.
     344        - ポーティングガイドの6.6.1節の記述を確認((*g)(*i)の注記を追加する
     345          など,記述を詳細化した).
     346
     347(3) exc_sense_unlockの定義を削除.
     348
     349(4) TARGET_TSKATR,TARGET_ISRATR,TARGET_INHATR,TARGET_INTATR,
     350TARGET_EXCATR,TARGET_MIN_STKSZ,CHECK_STKSZ_ALIGNの定義を,ターゲット
     351依存部のテンプレートファイル(パス2)からヘッダファイルに移動.
     352
     353(5) CHECK_FUNC_ALIGN,CHECK_FUNC_NONNULL,CHECK_STACK_ALIGN,
     354CHECK_STACK_NONNULL,CHECK_MPF_ALIGN,CHECK_MPF_NONNULLの定義を,ターゲッ
     355ト依存部のテンプレートファイル(パス3)からヘッダファイルに移動.
     356
     357(6) 動的生成機能拡張パッケージに対応.
     358        - CHECK_MB_ALIGNの定義を追加.
     359        - TSZ_PDQMBの定義を追加(デフォルトで不都合な場合).
     360        - VALID_INTNO_CREINTの定義を追加.
     361        - 動的メモリ管理に関する定義を追加.
     362
     363(7) オフセットファイルをコンフィギュレータで生成する方法への対応(必須
     364ではないが,対応しておくことが望ましい).詳しくは,ポーティングガイド
     365の2.5節を参照すること.
     366
     367(8) USE_TSKINICTXBをマクロ定義し,CHECK_STACK_ALIGNとCHECK_STACK_NONNULL
     368のいずれかを定義している場合には,TINIBからスタック領域の先頭番地を取り
     369出すためのテンプレートファイル関数GET_STK_TSKINICTXBを定義.
     370
     371----------------------------------------------------------------------
     372
     373                TOPPERS/ASPカーネル
     374                Release 1.5.0 から 1.6.0 への変更点
     375
     376○変更点のリスト
     377
     378・cfgの新しいバージョン(1.6)に対応
     379        - offsetof_TINIB_stkszとoffsetof_TINIB_stkの取得記述をターゲット非
     380          依存部に移動.
     381
     382・ユーティリティの修正
     383        - genoffsetに,エンディアン指定をチェックする機能を追加.その際に,
     384          コードを整理.
     385
     386・その他の修正
     387        - TCBのpriorityフィールドを,条件があえばuint_8で定義するように修正.
     388        - ターゲット依存部でSIL_ENDIAN_BIGもSIL_ENDIAN_LITTLEも定義されてい
     389          ない場合に,sil.hでエラーを検出するように修正.
     390        - システムログ機能のsysog_logmaskとsyslog_lowmask_notの初期値を修正.
     391        - makereleaseを,ファイルの重複をチェックするように修正.
     392        - test_utm1のエラーメッセージを修正.
     393
     394・ドキュメントの充実,コメントの修正
     395
     396・バージョン番号の更新
     397        - カーネルのバージョン番号を更新.
     398
     399○ターゲット依存部の要修正箇所(1.5.0 → 1.6.0)
     400
     401(1) makeoffset.cの修正
     402        - makeoffset.cに,sil_endian関数を追加する(これにより,genoffsetの
     403          エンディアン指定をチェックする機能が有効になる).
     404        - オーバランハンドラ拡張パッケージに対応する場合には,leftotmフィー
     405          ルドが含まれているかを確認する.
     406        - 生成されるoffset.hに変化がないことを確認する.
     407
     408(2) 値取得シンボルテーブルのターゲット依存部の修正
     409        - 以下の2行をtarget_def.csv(またはそれに代わるファイル)から削除する.
    466410                offsetof_TINIB_stksz,"offsetof(TINIB,stksz)"
    467411                offsetof_TINIB_stk,"offsetof(TINIB,stk)"
    468         ※ Release 1.5.0における修正をå
    469 ƒã«æˆ»ã™ï¼Ž
    470 
    471 (3) target_fput_logの実è£
    472 åˆ¶é™ã®ç¢ºèªï¼ˆä»•æ§˜ãŒä¿®æ­£ã•ã‚ŒãŸã‚ã‘ではない)
    473         - target_fput_logå
    474 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    475 ‹ã§å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«ãªã£ã¦ã„るか確
    476           認する.
    477 
    478 ----------------------------------------------------------------------
    479 
    480                 TOPPERS/ASPカーネル
    481                 Release 1.4.0 から 1.5.0 への変更点
    482 
    483 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    484 
    485 ãƒ»ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みとCPU例外の扱いの見直し
    486         - カーネル管理外の割込みの設定方法を整理・拡張.
    487         - カーネル管理外の割込みハンドラは,カーネルå†
    488 ã®å‡ºå
    489 ¥å£å‡¦ç†ã‚’経由し
    490           ないことを基本とした(ターゲット依存).
    491         - CPU例外ハンドラの出å
    492 ¥å£å‡¦ç†ã«ãŠã‘るカーネル管理外のCPU例外の扱い
    493           を規定.
    494 
    495 ãƒ»chg_ipmとget_ipmの仕様変更
    496         - chg_ipmとget_ipmは,CPUロック状æ
    497 ‹ã§ã¯å‘¼ã¹ãªã„ものとした.
    498         - これに伴ってテストプログラムを修正.
    499 
    500 ãƒ»ã‚¿ã‚¤ãƒžå‰²è¾¼ã¿å‡¦ç†ã§å‘¼ã³å‡ºã—たialm_timの基準時間の変更
    501         - current_timeの更新後に,タイムイベントの処理を行うように変更.
    502         - 有効な最小のシステム時刻としてmin_timeを導å
    503 ¥ï¼Ž
    504         - pend_updateを廃止.
    505 
    506 ãƒ»ã‚¿ã‚¹ã‚¯ã®ã‚¹ã‚¿ãƒƒã‚¯ã‚µã‚¤ã‚ºã®æœ€å°å€¤ãƒã‚§ãƒƒã‚¯ã®è¿½åŠ 
    507         - スタックサイズが0の場合のエラーを,ターゲット非依存で検出.
    508         - ターゲット依存で,タスクのスタックサイズの最小値を設定できるよう
    509           にした.
    510 
    511 ãƒ»ã‚¿ã‚¹ã‚¯åˆæœŸåŒ–コンテキストブロックの追加
    512         - ターゲット依存で,タスク初期化コンテキストブロック(TSKINICTXB)
    513           を使用できるようにした.
    514 
    515 ãƒ»ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§å®šç¾©ã™ã‚‹åç§°ã®ãƒªãƒãƒ¼ãƒ æ–¹æ³•ã®å¤‰æ›´
    516         - ターゲット依存部で定義し,ターゲット非依存部から参ç
    517 §ã™ã‚‹åç§°ã®ãƒª
    518           ネーム記述を,ターゲット依存部に移動.
    519 
    520 ãƒ»æ‹¡å¼µãƒ‘ッケージの追加
    521         - ミューテックス機能拡張パッケージ,オーバランハンドラ機能拡張パッ
    522           ケージ,タスク優å
    523 ˆåº¦æ‹¡å¼µãƒ‘ッケージを,一般å
    524 ¬é–‹ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã«è¿½åŠ ï¼Ž
    525         - オーバランハンドラ機能拡張への対応方法を,ポーティングガイドに記載.
    526 
    527 ãƒ»ã‚µãƒãƒ¼ãƒˆã™ã‚‹æ©Ÿèƒ½ã‚’識別するマクロの定義方法の変更
    528         - ターゲット依存部でTOPPERS_TARGET_SUPPORT_XXXXXがマクロ定義されて
    529           いれば,kernel.hでTOPPERS_SUPPORT_XXXXXをマクロ定義する方法に変更.
    530 
    531 ãƒ»ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã®ä¿®æ­£
    532         - syslog_initializeが呼ばれる前のログæƒ
    533 å ±ã®å‡ºåŠ›ã«å¯¾å¿œï¼Ž
    534         - sysog_logmaskとsyslog_lowmask_notの初期値を修正.
    535 
    536 ãƒ»ãƒ†ã‚¹ãƒˆãƒ©ã‚¤ãƒ–ラリの修正
    537         - test_lib.hとtest_lib.cを,testディレクトリから,それぞれincludeと
    538           libraryディレクトリに移動.
    539         - syslog_flush関数を追加.logtask_flushの代わりに使用.
    540         - test_finish関数を追加.テストプログラム中でext_kerの代わりに使用.
    541         - 以上に伴ってテストプログラムを修正.
    542 
    543 ãƒ»configureの拡張
    544         - Makefileのテンプレートを指定するためのオプションを追加.
    545 
    546 ãƒ»ãã®ä»–のバグフィックス
    547         - kernel_impl.h中のマクロ名の修正.
    548         - kernel.tf中の文法ミスの修正.
    549 
    550 ãƒ»ãã®ä»–の修正
    551         - CTXB型をTSKCTXB型に名称変更.
    552         - ext_tskで,戻らないはずの処理から戻った場合には,E_SYSを返す.
    553         - call_texrtnからdispatchを呼び出す処理を改善.
    554         - make_non_waitを,wait.cからwait.hに移動.
    555         - xsns_xpn中の冗長な条件式を削除.
    556         - TA_DISINTとTA_LEVELをitron.hから削除.
    557         - LOG_TEX_LEAVEの第2パラメータを削除.
    558         - サンプルのMakefileに,OMIT_WARNING_ALLとOMIT_OPTIMIZATIONを追加.
    559         - get_utmに関するテスト(1)(test_utm1)を追加.
    560         - test_dlynse.cの表示を改善.
    561 
    562 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    563 
    564 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    565         - 機能拡張・チューニングガイドに関して,ユーザーズマニュアルに記載.
    566         - キュー操作ライブラリ関数に関して,ユーザーズマニュアルに記載.
    567         - システムの起動時の初期化処理に関して,ユーザーズマニュアルに記載.
    568         - 設計メモを拡å
    569 
    570 ï¼Ž
    571 
    572 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    573         - カーネル仕様のバージョン番号,カーネルのバージョン番号を更新.
    574 
    575 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.4.0 → 1.5.0)
    576 
    577 (1) カーネル管理外の割込みの扱いの変更
    578         - カーネル管理外の割込みハンドラの呼び出し方について,これまでの考
    579           え方を変更した.「ターゲット依存部 ポーティングガイド」の6.6.7節
    580           の記述通りに実è£
    581 ã•ã‚Œã¦ã„るかチェックする.
    582         - TA_NONKERNELを使用できるようにする場合には,target.tfで,
    583           TARGET_INHATRにTA_NONKERNELを設定する.
    584         - パス2のテンプレートファイルのターゲット非依存部に,
    585           INTNO_FIX_KERNEL,INHNO_FIX_KERNEL,INTNO_FIX_NONKERNEL,
    586           INHNO_FIX_NONKERNEL,USE_INHINIB_TABLE,USE_INTINIB_TABLEのサポー
    587           トが追加されたので,使用できる場合には使用するように修正する.
    588         - カーネル管理の割込みハンドラの出å
    589 ¥å£å‡¦ç†ã«ã¤ã„て,「ターゲット依
    590           存部 ポーティングガイド」の6.6.1節の記述通りに実è£
    591 ã•ã‚Œã¦ã„ること
    592           を確認する.
    593 
    594 (2) カーネル管理外のCPU例外の扱いの変更
    595         - カーネル管理外のCPU例外ハンドラの呼び出し方について,これまでの考
    596           え方を変更した.「ターゲット依存部 ポーティングガイド」の6.7.1節
    597           の記述を参ç
    598 §ã—て,実è£
    599 ã‚’修正する.
    600 
    601 (3) ターゲット依存部で定義する名称のリネームの追加
    602         - ターゲット依存部で定義し,ターゲット非依存部から参ç
    603 §ã™ã‚‹åç§°ã®ãƒª
    604           ネーム記述を,ターゲット依存部に追加する.ターゲット依存部とチッ
    605           プ依存部の間でも同様の変更を行うことが望ましい.ただし,
    606           arch/logtrace/trace_config.cで定義される名称については,ターゲッ
    607           ト依存部でリネームする.
    608 
    609 (4) ターゲット依存部でサポートする機能を示すマクロの変更
    610         - ターゲット依存部で定義しているTOPPERS_SUPPORT_DIS_INTを
    611           TOPPERS_TARGET_SUPPORT_DIS_INTに,TOPPERS_SUPPORT_ENA_INTを
    612           TOPPERS_TARGET_SUPPORT_ENA_INTに,TOPPERS_SUPPORT_GET_UTMを
    613           TOPPERS_TARGET_SUPPORT_GET_UTMに,それぞれ変更する.
    614 
    615 (5) タスクコンテキストブロックの型名の変更
    616         - CTXB型をTSKCTXB型に名称変更する.
    617 
    618 (6) 値取得シンボルテーブルのターゲット依存部の修正
    619         - 以下の2行をtarget_def.csv(またはそれに代わるファイル)に加える.
     412        ※ Release 1.5.0における修正を元に戻す.
     413
     414(3) target_fput_logの実装制限の確認(仕様が修正されたわけではない)
     415        - target_fput_log全割込みロック状態で呼び出せるようになっているか確
     416          認する.
     417
     418----------------------------------------------------------------------
     419
     420                TOPPERS/ASPカーネル
     421                Release 1.4.0 から 1.5.0 への変更点
     422
     423○変更点のリスト
     424
     425・カーネル管理外の割込みとCPU例外の扱いの見直し
     426        - カーネル管理外の割込みの設定方法を整理・拡張.
     427        - カーネル管理外の割込みハンドラは,カーネル内の出入口処理を経由し
     428          ないことを基本とした(ターゲット依存).
     429        - CPU例外ハンドラの出入口処理におけるカーネル管理外のCPU例外の扱い
     430          を規定.
     431
     432・chg_ipmとget_ipmの仕様変更
     433        - chg_ipmとget_ipmは,CPUロック状態では呼べないものとした.
     434        - これに伴ってテストプログラムを修正.
     435
     436・タイマ割込み処理で呼び出したialm_timの基準時間の変更
     437        - current_timeの更新後に,タイムイベントの処理を行うように変更.
     438        - 有効な最小のシステム時刻としてmin_timeを導入.
     439        - pend_updateを廃止.
     440
     441・タスクのスタックサイズの最小値チェックの追加
     442        - スタックサイズが0の場合のエラーを,ターゲット非依存で検出.
     443        - ターゲット依存で,タスクのスタックサイズの最小値を設定できるよう
     444          にした.
     445
     446・タスク初期化コンテキストブロックの追加
     447        - ターゲット依存で,タスク初期化コンテキストブロック(TSKINICTXB)
     448          を使用できるようにした.
     449
     450・ターゲット依存部で定義する名称のリネーム方法の変更
     451        - ターゲット依存部で定義し,ターゲット非依存部から参照する名称のリ
     452          ネーム記述を,ターゲット依存部に移動.
     453
     454・拡張パッケージの追加
     455        - ミューテックス機能拡張パッケージ,オーバランハンドラ機能拡張パッ
     456          ケージ,タスク優先度拡張パッケージを,一般公開するファイルに追加.
     457        - オーバランハンドラ機能拡張への対応方法を,ポーティングガイドに記載.
     458
     459・サポートする機能を識別するマクロの定義方法の変更
     460        - ターゲット依存部でTOPPERS_TARGET_SUPPORT_XXXXXがマクロ定義されて
     461          いれば,kernel.hでTOPPERS_SUPPORT_XXXXXをマクロ定義する方法に変更.
     462
     463・システムログ機能の修正
     464        - syslog_initializeが呼ばれる前のログ情報の出力に対応.
     465        - sysog_logmaskとsyslog_lowmask_notの初期値を修正.
     466
     467・テストライブラリの修正
     468        - test_lib.hとtest_lib.cを,testディレクトリから,それぞれincludeと
     469          libraryディレクトリに移動.
     470        - syslog_flush関数を追加.logtask_flushの代わりに使用.
     471        - test_finish関数を追加.テストプログラム中でext_kerの代わりに使用.
     472        - 以上に伴ってテストプログラムを修正.
     473
     474・configureの拡張
     475        - Makefileのテンプレートを指定するためのオプションを追加.
     476
     477・その他のバグフィックス
     478        - kernel_impl.h中のマクロ名の修正.
     479        - kernel.tf中の文法ミスの修正.
     480
     481・その他の修正
     482        - CTXB型をTSKCTXB型に名称変更.
     483        - ext_tskで,戻らないはずの処理から戻った場合には,E_SYSを返す.
     484        - call_texrtnからdispatchを呼び出す処理を改善.
     485        - make_non_waitを,wait.cからwait.hに移動.
     486        - xsns_xpn中の冗長な条件式を削除.
     487        - TA_DISINTとTA_LEVELをitron.hから削除.
     488        - LOG_TEX_LEAVEの第2パラメータを削除.
     489        - サンプルのMakefileに,OMIT_WARNING_ALLとOMIT_OPTIMIZATIONを追加.
     490        - get_utmに関するテスト(1)(test_utm1)を追加.
     491        - test_dlynse.cの表示を改善.
     492
     493・ドキュメントの充実,コメントの修正
     494        - 機能拡張・チューニングガイドに関して,ユーザーズマニュアルに記載.
     495        - キュー操作ライブラリ関数に関して,ユーザーズマニュアルに記載.
     496        - システムの起動時の初期化処理に関して,ユーザーズマニュアルに記載.
     497        - 設計メモを拡充.
     498
     499・バージョン番号の更新
     500        - カーネル仕様のバージョン番号,カーネルのバージョン番号を更新.
     501
     502○ターゲット依存部の要修正箇所(1.4.0 → 1.5.0)
     503
     504(1) カーネル管理外の割込みの扱いの変更
     505        - カーネル管理外の割込みハンドラの呼び出し方について,これまでの考
     506          え方を変更した.「ターゲット依存部 ポーティングガイド」の6.6.7節
     507          の記述通りに実装されているかチェックする.
     508        - TA_NONKERNELを使用できるようにする場合には,target.tfで,
     509          TARGET_INHATRにTA_NONKERNELを設定する.
     510        - パス2のテンプレートファイルのターゲット非依存部に,
     511          INTNO_FIX_KERNEL,INHNO_FIX_KERNEL,INTNO_FIX_NONKERNEL,
     512          INHNO_FIX_NONKERNEL,USE_INHINIB_TABLE,USE_INTINIB_TABLEのサポー
     513          トが追加されたので,使用できる場合には使用するように修正する.
     514        - カーネル管理の割込みハンドラの出入口処理について,「ターゲット依
     515          存部 ポーティングガイド」の6.6.1節の記述通りに実装されていること
     516          を確認する.
     517
     518(2) カーネル管理外のCPU例外の扱いの変更
     519        - カーネル管理外のCPU例外ハンドラの呼び出し方について,これまでの考
     520          え方を変更した.「ターゲット依存部 ポーティングガイド」の6.7.1節
     521          の記述を参照して,実装を修正する.
     522
     523(3) ターゲット依存部で定義する名称のリネームの追加
     524        - ターゲット依存部で定義し,ターゲット非依存部から参照する名称のリ
     525          ネーム記述を,ターゲット依存部に追加する.ターゲット依存部とチッ
     526          プ依存部の間でも同様の変更を行うことが望ましい.ただし,
     527          arch/logtrace/trace_config.cで定義される名称については,ターゲッ
     528          ト依存部でリネームする.
     529
     530(4) ターゲット依存部でサポートする機能を示すマクロの変更
     531        - ターゲット依存部で定義しているTOPPERS_SUPPORT_DIS_INTを
     532          TOPPERS_TARGET_SUPPORT_DIS_INTに,TOPPERS_SUPPORT_ENA_INTを
     533          TOPPERS_TARGET_SUPPORT_ENA_INTに,TOPPERS_SUPPORT_GET_UTMを
     534          TOPPERS_TARGET_SUPPORT_GET_UTMに,それぞれ変更する.
     535
     536(5) タスクコンテキストブロックの型名の変更
     537        - CTXB型をTSKCTXB型に名称変更する.
     538
     539(6) 値取得シンボルテーブルのターゲット依存部の修正
     540        - 以下の2行をtarget_def.csv(またはそれに代わるファイル)に加える.
    620541                offsetof_TINIB_stksz,"offsetof(TINIB,stksz)"
    621542                offsetof_TINIB_stk,"offsetof(TINIB,stk)"
    622         ※ 新設されたUSE_TSKINICTXBを使う場合にはå¿
    623 è¦ãªã„.
    624         ※ Release 1.6以降を用いる場合には,この修正はå¿
    625 è¦ã¯ãªã„.
    626 
    627 (7) ログマクロの修正
    628         - LOG_TEX_LEAVEの第2パラメータが削除されたので,LOG_TEX_LEAVEを定義
    629           している場合には,その定義を変更する.
    630 
    631 (8) スタートアップモジュールの修正(bssセクションのクリアを省略している
    632         場合のみ)
    633         - システムログ機能を使用する場合には,スタートアップモジュールに,
    634           syslog_logmaskとsyslog_lowmask_notを0に初期化するコードを追加する.
    635         - トレースログ記録のサンプルコードを組み込んでいる場合には,スター
    636       トアップモジュールに,trace_modeを0に初期化するコードを追加する.
    637 
    638 (9) タスクのスタックサイズの最小値チェックの設定(オプション)
    639         - ターゲット依存に,タスクのスタックサイズの最小値をチェックする場
    640           合には,最小値をTARGET_MIN_STKSZに定義する.
    641 
    642 (10) オーバランハンドラ機能拡張への対応(オプション)
    643         - オーバランハンドラ機能拡張パッケージに対応する.対応方法について
    644           は,「ターゲット依存部 ポーティングガイド」中の「#ifdef
    645           TOPPERS_SUPPORT_OVRHDR」がある箇所と,5.7節と6.14節を参ç
    646 §ã™ã‚‹ã“と.
    647 
    648 ----------------------------------------------------------------------
    649 
    650                 TOPPERS/ASPカーネル
    651                 Release 1.3.2 から 1.4.0 への変更点
    652 
    653 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    654 
    655 ãƒ»å‘¨æœŸãƒãƒ³ãƒ‰ãƒ©ã®ä»•æ§˜å¤‰æ›´
    656         - sta_cycを呼び出した後,最初に周期ハンドラが起動される時刻を,起動
    657           周期後から,起動位相後に変更.
    658 
    659 ãƒ»TSZ_MPFの定義を削除
    660 
    661 ãƒ»call_atexitの廃止
    662         - ターゲット非依存部からcall_atexitを呼び出すのをやめる.
    663           call_atexitで行っていた処理(標準的にはsoftware_term_hookを呼び出
    664           す処理)は,å¿
    665 è¦ã§ã‚ればtarget_exitのå
    666 ˆé ­ã§è¡Œã†ã“ととする.
    667 
    668 ãƒ»get_utmの問題の修正
    669         - 周期ハンドラ,アラームハンドラの中でget_utmを呼ぶと,正しい時刻が
    670           返らない問題を修正.
    671 
    672 ãƒ»ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«æ€§å‘上
    673         - タスク状æ
    674 ‹ï¼ˆtstat)の変更を,make_runnableではなく,それを呼ぶ側
    675           の関数で行うように修正.
    676 
    677 ãƒ»ãƒ†ãƒ³ãƒ—レート変数の値の自動取得
    678         - OMIT_INITIALIZE_INTERRUPTとOMIT_INITIALIZE_EXCEPTIONの2つのテンプ
    679           レート変数の値を,ヘッダファイルの定義から自動取得するように修正.
    680 
    681 ãƒ»ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°æ©Ÿèƒ½ã®æ”¹å–„
    682         - LOG_TEX_ENTER,LOG_TEX_LEAVEのパラメータに,p_runtskを追加.
    683 
    684 ãƒ»å®Ÿè¡Œæ™‚間分布集計モジュールの修正
    685         - 時刻取得の方法をターゲット依存で変更できるように修正.
    686         - TNUM_HISTの定義を,histgram.hからhistgram.cに移動.
    687 
    688 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®åˆ†é›¢
    689         - cfgは,ASPカーネルとは独立したパッケージとしてé
    690 å¸ƒã™ã‚‹ã“とにする.
    691 
    692 ãƒ»ãƒžã‚¤ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚¬ã‚¤ãƒ‰ã®åˆ†é›¢
    693         - doc/migration.txtは,別途PDFファイルでé
    694 å¸ƒã™ã‚‹ã“とにする.
    695 
    696 ãƒ»ãƒ†ã‚¹ãƒˆãƒ—ログラム,性能評価プログラムの追加
    697         - セマフォ機能のテスト(2)(test_sem2)を追加.
    698         - act_tsk,iact_tskの処理時間の評価プログラム(perf4)を追加.
    699 
    700 ãƒ»clean時に削除するファイル
    701         - clean時に削除するファイルを,ターゲット依存部で定義するための変数
    702           (CLEAN_FILES)を導å
    703 ¥ï¼Ž
    704 
    705 ãƒ»ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã®ä¿®æ­£
    706         - makereleaseが使うディレクトリ名(asp)を,カレントディレクトリか
    707           ら決定するように修正.
    708         - makedepに,Cygwin環境におけるルートディレクトリ名を指定するため
    709           の-Rオプションを追加.MakefileにMAKEDEP_OPTS変数を追加.
    710         - gentestをアラームハンドラの複数回起動に対応できるように拡張.
    711 
    712 ãƒ»ãã®ä»–のバグフィックス
    713         - リネームするシンボルを修正.
    714         - 割込みサービスルーチン,初期化ルーチン,終了処理ルーチンのå
    715 ˆé ­ç•ª
    716           地に関数名以外を記述した場合にも動作するように修正.
    717         - Makefile.dependがない場合の問題を修正.
    718 
    719 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    720 
    721 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    722         - 各ドキュメントにTOPPERSライセンスと目次を追加.
    723 
    724 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    725         - カーネル仕様のバージョン番号,カーネルのバージョン番号を更新.
    726 
    727 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.3.2 → 1.4.0)
    728 
    729 (1) call_atexitの廃止
    730         - call_atexitを廃止したため,ターゲット依存部から定義を削除する.
    731           call_atexitで行っていた処理(標準的にはsoftware_term_hookを呼び出
    732           す処理)は,å¿
    733 è¦ã§ã‚ればtarget_exitのå
    734 ˆé ­ã§è¡Œã†ï¼Ž
    735 
    736 (2) テンプレート変数の値の設定の削除
    737         - OMIT_INITIALIZE_INTERRUPTとOMIT_INITIALIZE_EXCEPTIONの2つのテンプ
    738           レート変数の値を,ヘッダファイルの定義から自動取得するように修正
    739           したため,ターゲット依存部(target.tfまたはそこからインクルードさ
    740           れるファイル)で値を定義していれば,その定義を削除する.
    741 
    742 (3) makedepを呼ぶ際のオプションの追加
    743         - Makefileのターゲット依存部(Makefile.target等)でmakedepを呼んで
    744           いる場合には,$(MAKEDEP_OPTS)を追加する.
    745 
    746         例)@$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
     543        ※ 新設されたUSE_TSKINICTXBを使う場合には必要ない.
     544        ※ Release 1.6以降を用いる場合には,この修正は必要はない.
     545
     546(7) ログマクロの修正
     547        - LOG_TEX_LEAVEの第2パラメータが削除されたので,LOG_TEX_LEAVEを定義
     548          している場合には,その定義を変更する.
     549
     550(8) スタートアップモジュールの修正(bssセクションのクリアを省略している
     551        場合のみ)
     552        - システムログ機能を使用する場合には,スタートアップモジュールに,
     553          syslog_logmaskとsyslog_lowmask_notを0に初期化するコードを追加する.
     554        - トレースログ記録のサンプルコードを組み込んでいる場合には,スター
     555      トアップモジュールに,trace_modeを0に初期化するコードを追加する.
     556
     557(9) タスクのスタックサイズの最小値チェックの設定(オプション)
     558        - ターゲット依存に,タスクのスタックサイズの最小値をチェックする場
     559          合には,最小値をTARGET_MIN_STKSZに定義する.
     560
     561(10) オーバランハンドラ機能拡張への対応(オプション)
     562        - オーバランハンドラ機能拡張パッケージに対応する.対応方法について
     563          は,「ターゲット依存部 ポーティングガイド」中の「#ifdef
     564          TOPPERS_SUPPORT_OVRHDR」がある箇所と,5.7節と6.14節を参照すること.
     565
     566----------------------------------------------------------------------
     567
     568                TOPPERS/ASPカーネル
     569                Release 1.3.2 から 1.4.0 への変更点
     570
     571○変更点のリスト
     572
     573・周期ハンドラの仕様変更
     574        - sta_cycを呼び出した後,最初に周期ハンドラが起動される時刻を,起動
     575          周期後から,起動位相後に変更.
     576
     577・TSZ_MPFの定義を削除
     578
     579・call_atexitの廃止
     580        - ターゲット非依存部からcall_atexitを呼び出すのをやめる.
     581          call_atexitで行っていた処理(標準的にはsoftware_term_hookを呼び出
     582          す処理)は,必要であればtarget_exitの先頭で行うこととする.
     583
     584・get_utmの問題の修正
     585        - 周期ハンドラ,アラームハンドラの中でget_utmを呼ぶと,正しい時刻が
     586          返らない問題を修正.
     587
     588・スケジューラのモジュール性向上
     589        - タスク状態(tstat)の変更を,make_runnableではなく,それを呼ぶ側
     590          の関数で行うように修正.
     591
     592・テンプレート変数の値の自動取得
     593        - OMIT_INITIALIZE_INTERRUPTとOMIT_INITIALIZE_EXCEPTIONの2つのテンプ
     594          レート変数の値を,ヘッダファイルの定義から自動取得するように修正.
     595
     596・トレースログ機能の改善
     597        - LOG_TEX_ENTER,LOG_TEX_LEAVEのパラメータに,p_runtskを追加.
     598
     599・実行時間分布集計モジュールの修正
     600        - 時刻取得の方法をターゲット依存で変更できるように修正.
     601        - TNUM_HISTの定義を,histgram.hからhistgram.cに移動.
     602
     603・コンフィギュレータの分離
     604        - cfgは,ASPカーネルとは独立したパッケージとして配布することにする.
     605
     606・マイグレーションガイドの分離
     607        - doc/migration.txtは,別途PDFファイルで配布することにする.
     608
     609・テストプログラム,性能評価プログラムの追加
     610        - セマフォ機能のテスト(2)(test_sem2)を追加.
     611        - act_tsk,iact_tskの処理時間の評価プログラム(perf4)を追加.
     612
     613・clean時に削除するファイル
     614        - clean時に削除するファイルを,ターゲット依存部で定義するための変数
     615          (CLEAN_FILES)を導入.
     616
     617・ユーティリティの修正
     618        - makereleaseが使うディレクトリ名(asp)を,カレントディレクトリか
     619          ら決定するように修正.
     620        - makedepに,Cygwin環境におけるルートディレクトリ名を指定するため
     621          の-Rオプションを追加.MakefileにMAKEDEP_OPTS変数を追加.
     622        - gentestをアラームハンドラの複数回起動に対応できるように拡張.
     623
     624・その他のバグフィックス
     625        - リネームするシンボルを修正.
     626        - 割込みサービスルーチン,初期化ルーチン,終了処理ルーチンの先頭番
     627          地に関数名以外を記述した場合にも動作するように修正.
     628        - Makefile.dependがない場合の問題を修正.
     629
     630・ドキュメントの充実,コメントの修正
     631        - 各ドキュメントにTOPPERSライセンスと目次を追加.
     632
     633・バージョン番号の更新
     634        - カーネル仕様のバージョン番号,カーネルのバージョン番号を更新.
     635
     636○ターゲット依存部の要修正箇所(1.3.2 → 1.4.0)
     637
     638(1) call_atexitの廃止
     639        - call_atexitを廃止したため,ターゲット依存部から定義を削除する.
     640          call_atexitで行っていた処理(標準的にはsoftware_term_hookを呼び出
     641          す処理)は,必要であればtarget_exitの先頭で行う.
     642
     643(2) テンプレート変数の値の設定の削除
     644        - OMIT_INITIALIZE_INTERRUPTとOMIT_INITIALIZE_EXCEPTIONの2つのテンプ
     645          レート変数の値を,ヘッダファイルの定義から自動取得するように修正
     646          したため,ターゲット依存部(target.tfまたはそこからインクルードさ
     647          れるファイル)で値を定義していれば,その定義を削除する.
     648
     649(3) makedepを呼ぶ際のオプションの追加
     650        - Makefileのターゲット依存部(Makefile.target等)でmakedepを呼んで
     651          いる場合には,$(MAKEDEP_OPTS)を追加する.
     652
     653        例)@$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
    747654                        -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
    748655
    749 (4) 簡易パッケージへのコンフィギュレータの追加
    750         - コンフィギュレータ(cfg)がターゲット非依存部から分離されたため,
    751           簡易パッケージにå
    752 ¥ã‚Œã‚‹å ´åˆã«ã¯ï¼ŒE_PACKAGEにcfgを含めるための記述
    753           を追加する.
    754 
    755         例)INCLUDE ../../cfg/MANIFEST
    756 
    757 ----------------------------------------------------------------------
    758 
    759                 TOPPERS/ASPカーネル
    760                 Release 1.3.1 から 1.3.2 への変更点
    761 
    762 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    763 
    764 ãƒ»TMAX_RELTIMをユーザから参ç
    765 §ã§ãã‚‹ãƒžã‚¯ãƒ­ã«
    766         - TMAX_RELTIMの定義を,kernel/time_event.hからinclude/t_stddef.hに
    767           移動.
    768 
    769 ãƒ»const指定の追加
    770         - syslog_printf,syslog_print,syslog_wri_log,serial_wri_datのパラ
    771           メータにconst指定を追加.
    772 
    773 ãƒ»TMIN_ISRPRI,TMAX_ISRPRIの導å
    774 ¥
    775 
    776 ãƒ»å®Ÿè¡Œæ™‚間分布集計モジュールで時間の逆転が疑われるケースの扱い
    777         - 実行時間分布集計モジュールで時間の逆転が疑われる度数を計測するよ
    778           うに修正.
    779 
    780 ãƒ»ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°ã‚¿ã‚¹ã‚¯ã®çµ‚了処理の修正
    781         - ログバッファに残ったログæƒ
    782 å ±ã§ã‚ることを示す文字列を出力するように
    783           修正.
    784 
    785 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ä¿®æ­£
    786         - 順序付きリストの要素に式を使えるように変更.
    787         - 静的APIのパラメータに型キャストが含まれるとパースできないバグの修正.
    788         - #pragma onceを用いると行番号がずれるバグの修正.
    789         - cfgファイルを指定しなかった場合のエラーメッセージの修正.
    790 
    791 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ãŒç”Ÿæˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«
    792         - コンフィギュレータがkernel_cfg.c以外のファイルを生成する場合に対
    793           応するための変数(CFG_OBJS,CFG2_OUT)を導å
    794 ¥ï¼Ž
    795 
    796 ãƒ»realclean時に削除するファイル
    797         - realclean時に削除するファイルを,ターゲット依存部で定義するための
    798           変数(REALCLEAN_FILES)を導å
    799 ¥ï¼Ž
    800 
    801 ãƒ»ãƒ†ã‚¹ãƒˆãƒ—ログラムの追加・拡å
    802 
    803 
    804         - セマフォ機能のテスト(1)を追加.
    805         - カーネルの整合性検査にセマフォ毎の検査を追加.
    806 
    807 ãƒ»ãƒã‚°ãƒ•ã‚£ãƒƒã‚¯ã‚¹
    808         - 非タスクコンテキスト用スタックの確保時のサイズの誤り.
    809         - kernel.tf中のエラーメッセージの誤り.
    810         - 実行時間分布集計モジュールにおける最大値の扱いのバグ.
    811         - Makefile中のAPPLDIRに複数のディレクトリが定義されている時の扱い.
    812         - test/perf.cで,計測回数を10000回になるように修正.
    813         - DVE68Kターゲット依存部のtarget.tf中のエラーメッセージの誤り.
    814 
    815 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    816 
    817 å®Ÿï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    818         - 各ドキュメントにTOPPERSライセンスと目次を追加.
    819 
    820 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    821 
    822 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.3.1 → 1.3.2)
    823 
    824 ç‰¹ã«ãªã—
    825 
    826 ----------------------------------------------------------------------
    827 
    828                 TOPPERS/ASPカーネル
    829                 Release 1.3.0 から 1.3.1 への変更点
    830 
    831 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    832 
    833 ãƒ»ã‚¹ã‚¿ãƒƒã‚¯ã‚µã‚¤ã‚ºã®ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯ã‚’追加
    834         - CRE_TSKのstk(タスクのスタック領域のå
    835 ˆé ­ç•ªåœ°ï¼‰ãŒNULLでない場合に,
    836           stkszを適切な値(ターゲット依存の値の倍数)に丸める処理をやめ,適
    837           切な値でない場合にエラーとするように修正.
    838         - DEF_ICSのistk(非タスクコンテキスト用のスタック領域のå
    839 ˆé ­ç•ªåœ°ï¼‰ãŒ
    840           NULLでない場合に,istkszが適切な値(ターゲット依存の値の倍数)で
    841           ない場合のエラーのチェックを追加.
    842 
    843 ãƒ»å¼·åˆ¶å¾
    844 ã¡è¦æ±‚ネストの廃止に伴う追加修正
    845         - TMAX_SUSCNTの定義を,kernel.hからitron.hに移動.
    846         - ref_tskで参ç
    847 §ã§ãã‚‹æƒ
    848 å ±ï¼ˆT_RTSKのフィールド)からsuscntを削除.
    849 
    850 ãƒ»kernel_api.csvの修正
    851         - 各オブジェクトの属性のパラメータを,符号無しに修正.
    852 
    853 ãƒ»kernel_def.csvの修正
    854         - 符号付きのシンボルの定義に",signed"を付加.
    855 
    856 ãƒ»itron.hの修正
    857         - frsm_tskのタイプミスの修正.
    858 
    859 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ä¿®æ­£
    860         - 組込み関数DUMP, TRACE, NOOPを追加.
    861         - $FOREACH$や$IF$等の中身が何もないときに,internal errorになる不å
    862 ·
    863           合を修正(エラーメッセージの適切化).
    864         - $INCLUDE$命令でインクルードしたtfの行番号がずれる不å
    865 ·åˆã‚’修正.
    866         - 64ビット整数が定義されていないと,CSVファイルでsをつけたレコード
    867           が符号付きと扱われない不å
    868 ·åˆã®ä¿®æ­£ï¼Ž
    869         - 型キャストのパース処理に関する不å
    870 ·åˆã®ä¿®æ­£ï¼Ž
    871         - エラーの起こった行番号が正しくない不å
    872 ·åˆã®ä¿®æ­£ï¼Ž
    873         - 同じtskidに対してDEF_TEXが複数あるエラーのチェックを行うように修正.
    874         - DEF_TEXを使用した時に,TSK.TSKID[tskid]が0になる不å
    875 ·åˆã®ä¿®æ­£ï¼Ž
    876         - DEF_INH,CFG_INT,DEF_EXCで同じオブジェクト番号に対する登録が重複し
    877           た場合のエラーチェックを二重に行っている問題の修正.
    878 
    879 ãƒ»é
    880 å¸ƒã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿®æ­£
    881         - doc/api_spec.txt, ngki_spec.txt, sysstat.txtを除外.
    882         - extensionディレクトリを除外.
    883 
    884 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£ï¼Œã‚³ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    885 
    886 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°
    887 
    888 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.3.0 → 1.3.1)
    889 
    890 (1) スタックサイズのエラーチェックに関する修正箇所
    891         - target.tfでkernel.tfをインクルードする前に,CHECK_STKSZ_ALIGNを,
    892           スタックサイズがどの値の倍数になっていなければならないかを設定す
    893           る.
    894                 例)$CHECK_STKSZ_ALIGN = 4$
    895 
    896 (2) ターゲット依存部のユーザーズマニュアルについて
    897         - ターゲット依存部のユーザーズマニュアルのファイル名と,そのファイ
    898           ルに記述すべきå†
    899 å®¹ã‚’規定した.「ターゲット依存部 ポーティングガイ
    900           ド」の「9.1 ドキュメント」の節を参ç
    901 §ã™ã‚‹ã“と.
    902 
    903 ----------------------------------------------------------------------
    904 
    905                 TOPPERS/ASPカーネル
    906                 Release 1.2.1 から 1.3.0 への変更点
    907 
    908 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    909 
    910 ãƒ»set_tim(システム時刻の設定)の廃止
    911 
    912 ãƒ»å±žæ€§ã®å¤‰æ›´
    913         - TA_DISINTを廃止して,TA_ENAINTを復活.
    914 
    915 ãƒ»æ‹¡å¼µæ©Ÿèƒ½ãƒ»ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå®šç¾©æ©Ÿèƒ½ã®æœ‰ç„¡ã‚’判別するマクロ名の変更
    916         - TOPPERS_EXTENSION_MUTEXをTOPPERS_SUPPORT_MUTEXに.
    917         - TOPPERS_EXTENSION_PRI_LEVELをTOPPERS_SUPPORT_PRI_LEVELに.
    918         - SUPPORT_???_???をTOPPERS_SUPPORT_???_???に変更し,ターゲット依存
    919           部での定義をtarget_kernel.hに移動する.
    920 
    921 ãƒ»åž‹åãƒ»å¤‰æ•°åãƒ»å®šæ•°åã®å¤‰æ›´
    922         - SYSUTIM → SYSUTM,sysutim → sysutm,p_sysutim → p_sysutm
    923         - SIO_ERDY_SND → SIO_RDY_SND,SIO_ERDY_RCV → SIO_RDY_RCV
    924         - sio_ierdy_snd → sio_irdy_snd,sio_ierdy_rcv → sio_irdy_rcv
    925 
    926 ãƒ»cfg1_out.cのコンパイル/リンク方法の変更
    927         - cfg1_out.cからtarget_cfg1_out.hをインクルードするように,コンフィ
    928           ギュレータを変更.
    929         - ターゲット依存部でtarget_cfg1_out.hを用意する.
    930         - cfg1_out.cのリンクは,カーネルと同じ方法をとるように変更.
    931 
    932 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®ä¿®æ­£
    933         - cfg1_out.cに生成するå†
    934 å®¹ã®å¤‰æ›´ï¼ˆå‰è¨˜ã¨é–¢é€£ï¼‰ï¼Ž
    935         - boost 1.35.0に対応.
    936 
    937 ãƒ»ã‚µãƒ³ãƒ—ルプログラムの修正
    938         - タスクå†
    939 ã§ã®ãƒ«ãƒ¼ãƒ—回数を固定する機能(TASK_LOOP)を導å
    940 ¥ï¼Ž
    941 
    942 ãƒ»ãƒã‚°ãƒ•ã‚£ãƒƒã‚¯ã‚¹
    943         - 固定長メモリプール領域の確保方法.
    944         - DEF_TEXのエラーで,問題になったDEF_TEXの行番号を表示する.
    945 
    946 ãƒ»ç”¨èªžã®å¤‰æ›´
    947         -「割込みロック」→「å
    948 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã€
    949 
    950 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®ä¿®æ­£
    951 
    952 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°ï¼Ž
    953 
    954 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.2.1 → 1.3.0)
    955 
    956 (1) TA_DISINTの廃止・TA_ENAINTの復活に伴う修正箇所
    957         - TA_DISINTを使った判定をTA_ENAINTを使った判定に変更する.
    958                 例)((intatr & TA_DISINT) == 0U) → ((intatr & TA_ENAINT) != 0U)
    959         - CFG_INTの割込み属性にTA_DISINTが設定されていれば,それを消す.
    960                 例)CFG_INT(INTNO_SIO, { TA_DISINT | INTATR_SIO, INTPRI_SIO });
    961                 → CFG_INT(INTNO_SIO, { INTATR_SIO, INTPRI_SIO });
    962         - CFG_INTの割込み属性にTA_DISINTが設定されていなければ,TA_ENAINTを
    963           加える.
    964                 例)CFG_INT(INTNO_TIMER, { INTATR_TIMER, INTPRI_TIMER });
    965                 → CFG_INT(INTNO_TIMER, { TA_ENAINT | INTATR_TIMER, INTPRI_TIMER });
    966 
    967 (2) 拡張機能・ターゲット定義機能の有無を判別するマクロ名の変更に伴う修正箇所
    968         - SUPPORT_???_???をTOPPERS_SUPPORT_???_???に変更し,ターゲット依存
    969           部での定義をtarget_kernel.hに移動する.
    970                 TOPPERS_SUPPORT_DIS_INT                 dis_intをサポートする
    971                 TOPPERS_SUPPORT_ENA_INT                 ena_intをサポートする
    972                 TOPPERS_SUPPORT_GET_UTM                 get_utmをサポートする
    973    - makeoffset.cで,TOPPERS_EXTENSION_MUTEXを参ç
    974 §ã—ている場合には,
    975      TOPPERS_SUPPORT_MUTEXに変更する.
    976 
    977 (3) 型名・変数名・定数名の変更に伴う修正箇所
    978         - SYSUTIM → SYSUTM,sysutim → sysutm,p_sysutim → p_sysutm
    979         - SIO_ERDY_SND → SIO_RDY_SND,SIO_ERDY_RCV → SIO_RDY_RCV
    980         - sio_ierdy_snd → sio_irdy_snd,sio_ierdy_rcv → sio_irdy_rcv
    981         â˜
    982 sysutimとerdyを大文字小文字を区別せずにサーチするとよい.
    983 
    984 (4) cfg1_out.cのコンパイル/リンク方法の変更に伴う修正箇所
    985         - ターゲット依存部で,target_cfg1_out.hを用意する.詳しくは,「ター
    986           ゲット依存部 ポーティングガイド」の7.4節を参ç
    987 §ï¼Ž
    988         - 新たに用意したファイルをMANIFESTに追加する.
    989 
    990 (5) 警告メッセージへの対処
    991         - Makefile.targetに,「COPTS := $(COPTS) -Werror」を追加することを
    992           検討する.カーネルå†
    993 ã§åŽ³å¯†ãªåˆ¥åè¦å‰‡ã«ã‚ˆã‚‹è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå‡ºã‚‹å ´
    994           合には,「KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing」
    995           を追加してもよい.
    996 
    997 (6) コメントの修正
    998         -「割込みロック」→「å
    999 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã€
    1000 
    1001 ----------------------------------------------------------------------
    1002 
    1003                 TOPPERS/ASPカーネル
    1004                 Release 1.2.0 から 1.2.1 への変更点
    1005 
    1006 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    1007 
    1008 ãƒ»ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°è¨˜éŒ²ã®ã‚µãƒ³ãƒ—ルコードを組み込む方法の変更
    1009         - configureに-rオプションを追加.
    1010         - sample/Makefileの修正.
    1011 
    1012 ãƒ»Makefileのコンフィギュレータ関連部分の変更
    1013         - コンフィギュレータに対するターゲット依存のオプションを,Makefile
    1014           のターゲット依存部で記述するように変更.
    1015         - コンフィギュレータの各パスのターゲット依存のファイルへの依存関係
    1016           を,Makefileのターゲット依存部で記述するように変更.
    1017 
    1018 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°ï¼Ž
    1019 
    1020 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.1.0 → 1.2.1)
    1021 
    1022 (1) 新しいコンフィギュレータへの対応
    1023 
    1024 ãƒ»target.tf中で,ヘッダファイルと重複した定数値の定義を行っている場合に
    1025 ã€€ã¯ï¼Œtarget_def.cvsに変数記述を行い,重複した定義を削除する.
    1026 
    1027 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹ã‚ªãƒ—ションに,target_def.cvsを読み込ませる
    1028 ã€€æŒ‡å®šã‚’追加する.「ターゲット依存部 ポーティングガイド」2.4節の
    1029 ã€€(2-4-15) é 
    1030 ã‚’参ç
    1031 §ï¼Ž
    1032 
    1033 ãƒ»target_check.tfを作成する.「ターゲット依存部 ポーティングガイド」
    1034 ã€€7.3節参ç
    1035 §ï¼Ž
    1036 
    1037 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã®å„パスに対して,ターゲット依存のファイルへの依存
    1038 ã€€é–¢ä¿‚を定義する.「ターゲット依存部 ポーティングガイド」2.7節参ç
    1039 §ï¼Ž
    1040 
    1041 (2) データ型と定数の変更・追加
    1042 
    1043 ãƒ»BOOLをbool_tに,TRUEとFALSEをそれぞれtrueとfalseに変更する.ER_BOOLな
    1044 ã€€ã©ã‚’変更しないように注意すること.コメント中に記述されたこれらのデー
    1045 ã€€ã‚¿åž‹ã¨å®šæ•°ã‚‚変更すること.
    1046 
    1047 ãƒ»charをchar_tに変更する.ただし,文字列定数が記述されることが多い引数
    1048 ã€€ç­‰ã¯ï¼Œã‚³ãƒ³ãƒ‘イラの警告を避けるために,char *のままとする.ターゲット
    1049 ã€€ä¾å­˜éƒ¨ã§æœ€ä½Žé™å¤‰æ›´ã—なければならないのは,以下の2箇所.
    1050 
    1051         - target_fput_logの引数
    1052         - sio_snd_chrの第2引数
    1053 
    1054 ãƒ»target_stddef.h(またはそこからインクルードされるファイル)に,サイズ
    1055 ã€€ã®æŒ‡å®šã•ã‚ŒãŸæµ®å‹•å°æ•°ç‚¹åž‹ï¼ˆfloat32_tとdouble64_t),その最大値・最小値
    1056 ã€€ã®ãƒžã‚¯ãƒ­ã®å®šç¾©ã‚’追加する.「ターゲット依存部 ポーティングガイド」3.4
    1057 ã€€ç¯€å‚ç
    1058 §ï¼Žé–‹ç™ºç’°å¢ƒãŒGCCでarch/gcc/tool_stddef.hを用いており,float型と
    1059 ã€€double型がそれぞれIEEE754準拠の単精度浮動小数点数と倍精度浮動小数点数
    1060 ã€€ã§ã‚る場合には,arch/gcc/tool_stddef.hをインクルードする前に,
    1061 ã€€TOPPERS_STDFLOAT_TYPE1をマクロ定義すればよい.
    1062 
    1063 (3) トレースログ記録のサンプルコードの組込み(オプション)
    1064 
    1065 ãƒ»ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‚’,トレースログ記録のサンプルコードを使用するように
    1066 ã€€ä¿®æ­£ã™ã‚‹ï¼Žã€Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ ポーティングガイド」6.11.2節参ç
    1067 §ï¼Ž
    1068 
    1069 (4) TARGETDIR変数の使用
    1070 
    1071 ãƒ»Makefileのターゲット依存部で,ターゲット依存部ディレクトリを参ç
    1072 §ã—て
    1073 ã€€ã„る箇所で,$(SRCDIR)/target/$(TARGET)を,$(TARGETDIR)に変更する.
    1074 
    1075 ----------------------------------------------------------------------
    1076 
    1077                 TOPPERS/ASPカーネル
    1078                 Release 1.1.0 から 1.2.0 への変更点
    1079 
    1080 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    1081 
    1082 ãƒ»ã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’新しいバージョンに差し換え
    1083         - パス1とパス3にもターゲット依存機能を追加.
    1084         - FMPカーネルのクラス記述に対応.
    1085         - 追加ファイル(ターゲット非依存部,cfg以下を除く)
     656(4) 簡易パッケージへのコンフィギュレータの追加
     657        - コンフィギュレータ(cfg)がターゲット非依存部から分離されたため,
     658          簡易パッケージに入れる場合には,E_PACKAGEにcfgを含めるための記述
     659          を追加する.
     660
     661        例)INCLUDE ../../cfg/MANIFEST
     662
     663----------------------------------------------------------------------
     664
     665                TOPPERS/ASPカーネル
     666                Release 1.3.1 から 1.3.2 への変更点
     667
     668○変更点のリスト
     669
     670・TMAX_RELTIMをユーザから参照できるマクロに
     671        - TMAX_RELTIMの定義を,kernel/time_event.hからinclude/t_stddef.hに
     672          移動.
     673
     674・const指定の追加
     675        - syslog_printf,syslog_print,syslog_wri_log,serial_wri_datのパラ
     676          メータにconst指定を追加.
     677
     678・TMIN_ISRPRI,TMAX_ISRPRIの導入
     679
     680・実行時間分布集計モジュールで時間の逆転が疑われるケースの扱い
     681        - 実行時間分布集計モジュールで時間の逆転が疑われる度数を計測するよ
     682          うに修正.
     683
     684・システムログタスクの終了処理の修正
     685        - ログバッファに残ったログ情報であることを示す文字列を出力するように
     686          修正.
     687
     688・コンフィギュレータの修正
     689        - 順序付きリストの要素に式を使えるように変更.
     690        - 静的APIのパラメータに型キャストが含まれるとパースできないバグの修正.
     691        - #pragma onceを用いると行番号がずれるバグの修正.
     692        - cfgファイルを指定しなかった場合のエラーメッセージの修正.
     693
     694・コンフィギュレータが生成するファイル
     695        - コンフィギュレータがkernel_cfg.c以外のファイルを生成する場合に対
     696          応するための変数(CFG_OBJS,CFG2_OUT)を導入.
     697
     698・realclean時に削除するファイル
     699        - realclean時に削除するファイルを,ターゲット依存部で定義するための
     700          変数(REALCLEAN_FILES)を導入.
     701
     702・テストプログラムの追加・拡充
     703        - セマフォ機能のテスト(1)を追加.
     704        - カーネルの整合性検査にセマフォ毎の検査を追加.
     705
     706・バグフィックス
     707        - 非タスクコンテキスト用スタックの確保時のサイズの誤り.
     708        - kernel.tf中のエラーメッセージの誤り.
     709        - 実行時間分布集計モジュールにおける最大値の扱いのバグ.
     710        - Makefile中のAPPLDIRに複数のディレクトリが定義されている時の扱い.
     711        - test/perf.cで,計測回数を10000回になるように修正.
     712        - DVE68Kターゲット依存部のtarget.tf中のエラーメッセージの誤り.
     713
     714・ドキュメントの充実,コメントの修正
     715        - 各ドキュメントにTOPPERSライセンスと目次を追加.
     716
     717・バージョン番号の更新
     718
     719○ターゲット依存部の要修正箇所(1.3.1 → 1.3.2)
     720
     721特になし
     722
     723----------------------------------------------------------------------
     724
     725                TOPPERS/ASPカーネル
     726                Release 1.3.0 から 1.3.1 への変更点
     727
     728○変更点のリスト
     729
     730・スタックサイズのエラーチェックを追加
     731        - CRE_TSKのstk(タスクのスタック領域の先頭番地)がNULLでない場合に,
     732          stkszを適切な値(ターゲット依存の値の倍数)に丸める処理をやめ,適
     733          切な値でない場合にエラーとするように修正.
     734        - DEF_ICSのistk(非タスクコンテキスト用のスタック領域の先頭番地)が
     735          NULLでない場合に,istkszが適切な値(ターゲット依存の値の倍数)で
     736          ない場合のエラーのチェックを追加.
     737
     738・強制待ち要求ネストの廃止に伴う追加修正
     739        - TMAX_SUSCNTの定義を,kernel.hからitron.hに移動.
     740        - ref_tskで参照できる情報(T_RTSKのフィールド)からsuscntを削除.
     741
     742・kernel_api.csvの修正
     743        - 各オブジェクトの属性のパラメータを,符号無しに修正.
     744
     745・kernel_def.csvの修正
     746        - 符号付きのシンボルの定義に",signed"を付加.
     747
     748・itron.hの修正
     749        - frsm_tskのタイプミスの修正.
     750
     751・コンフィギュレータの修正
     752        - 組込み関数DUMP, TRACE, NOOPを追加.
     753        - $FOREACH$や$IF$等の中身が何もないときに,internal errorになる不具
     754          合を修正(エラーメッセージの適切化).
     755        - $INCLUDE$命令でインクルードしたtfの行番号がずれる不具合を修正.
     756        - 64ビット整数が定義されていないと,CSVファイルでsをつけたレコード
     757          が符号付きと扱われない不具合の修正.
     758        - 型キャストのパース処理に関する不具合の修正.
     759        - エラーの起こった行番号が正しくない不具合の修正.
     760        - 同じtskidに対してDEF_TEXが複数あるエラーのチェックを行うように修正.
     761        - DEF_TEXを使用した時に,TSK.TSKID[tskid]が0になる不具合の修正.
     762        - DEF_INH,CFG_INT,DEF_EXCで同じオブジェクト番号に対する登録が重複し
     763          た場合のエラーチェックを二重に行っている問題の修正.
     764
     765・配布するファイルの修正
     766        - doc/api_spec.txt, ngki_spec.txt, sysstat.txtを除外.
     767        - extensionディレクトリを除外.
     768
     769・ドキュメントの修正,コメントの修正
     770
     771・バージョン番号の更新
     772
     773○ターゲット依存部の要修正箇所(1.3.0 → 1.3.1)
     774
     775(1) スタックサイズのエラーチェックに関する修正箇所
     776        - target.tfでkernel.tfをインクルードする前に,CHECK_STKSZ_ALIGNを,
     777          スタックサイズがどの値の倍数になっていなければならないかを設定す
     778          る.
     779                例)$CHECK_STKSZ_ALIGN = 4$
     780
     781(2) ターゲット依存部のユーザーズマニュアルについて
     782        - ターゲット依存部のユーザーズマニュアルのファイル名と,そのファイ
     783          ルに記述すべき内容を規定した.「ターゲット依存部 ポーティングガイ
     784          ド」の「9.1 ドキュメント」の節を参照すること.
     785
     786----------------------------------------------------------------------
     787
     788                TOPPERS/ASPカーネル
     789                Release 1.2.1 から 1.3.0 への変更点
     790
     791○変更点のリスト
     792
     793・set_tim(システム時刻の設定)の廃止
     794
     795・属性の変更
     796        - TA_DISINTを廃止して,TA_ENAINTを復活.
     797
     798・拡張機能・ターゲット定義機能の有無を判別するマクロ名の変更
     799        - TOPPERS_EXTENSION_MUTEXをTOPPERS_SUPPORT_MUTEXに.
     800        - TOPPERS_EXTENSION_PRI_LEVELをTOPPERS_SUPPORT_PRI_LEVELに.
     801        - SUPPORT_???_???をTOPPERS_SUPPORT_???_???に変更し,ターゲット依存
     802          部での定義をtarget_kernel.hに移動する.
     803
     804・型名・変数名・定数名の変更
     805        - SYSUTIM → SYSUTM,sysutim → sysutm,p_sysutim → p_sysutm
     806        - SIO_ERDY_SND → SIO_RDY_SND,SIO_ERDY_RCV → SIO_RDY_RCV
     807        - sio_ierdy_snd → sio_irdy_snd,sio_ierdy_rcv → sio_irdy_rcv
     808
     809・cfg1_out.cのコンパイル/リンク方法の変更
     810        - cfg1_out.cからtarget_cfg1_out.hをインクルードするように,コンフィ
     811          ギュレータを変更.
     812        - ターゲット依存部でtarget_cfg1_out.hを用意する.
     813        - cfg1_out.cのリンクは,カーネルと同じ方法をとるように変更.
     814
     815・コンフィギュレータの修正
     816        - cfg1_out.cに生成する内容の変更(前記と関連).
     817        - boost 1.35.0に対応.
     818
     819・サンプルプログラムの修正
     820        - タスク内でのループ回数を固定する機能(TASK_LOOP)を導入.
     821
     822・バグフィックス
     823        - 固定長メモリプール領域の確保方法.
     824        - DEF_TEXのエラーで,問題になったDEF_TEXの行番号を表示する.
     825
     826・用語の変更
     827        -「割込みロック」→「全割込みロック」
     828
     829・ドキュメントの修正
     830
     831・バージョン番号の更新.
     832
     833○ターゲット依存部の要修正箇所(1.2.1 → 1.3.0)
     834
     835(1) TA_DISINTの廃止・TA_ENAINTの復活に伴う修正箇所
     836        - TA_DISINTを使った判定をTA_ENAINTを使った判定に変更する.
     837                例)((intatr & TA_DISINT) == 0U) → ((intatr & TA_ENAINT) != 0U)
     838        - CFG_INTの割込み属性にTA_DISINTが設定されていれば,それを消す.
     839                例)CFG_INT(INTNO_SIO, { TA_DISINT | INTATR_SIO, INTPRI_SIO });
     840                → CFG_INT(INTNO_SIO, { INTATR_SIO, INTPRI_SIO });
     841        - CFG_INTの割込み属性にTA_DISINTが設定されていなければ,TA_ENAINTを
     842          加える.
     843                例)CFG_INT(INTNO_TIMER, { INTATR_TIMER, INTPRI_TIMER });
     844                → CFG_INT(INTNO_TIMER, { TA_ENAINT | INTATR_TIMER, INTPRI_TIMER });
     845
     846(2) 拡張機能・ターゲット定義機能の有無を判別するマクロ名の変更に伴う修正箇所
     847        - SUPPORT_???_???をTOPPERS_SUPPORT_???_???に変更し,ターゲット依存
     848          部での定義をtarget_kernel.hに移動する.
     849                TOPPERS_SUPPORT_DIS_INT                 dis_intをサポートする
     850                TOPPERS_SUPPORT_ENA_INT                 ena_intをサポートする
     851                TOPPERS_SUPPORT_GET_UTM                 get_utmをサポートする
     852   - makeoffset.cで,TOPPERS_EXTENSION_MUTEXを参照している場合には,
     853     TOPPERS_SUPPORT_MUTEXに変更する.
     854
     855(3) 型名・変数名・定数名の変更に伴う修正箇所
     856        - SYSUTIM → SYSUTM,sysutim → sysutm,p_sysutim → p_sysutm
     857        - SIO_ERDY_SND → SIO_RDY_SND,SIO_ERDY_RCV → SIO_RDY_RCV
     858        - sio_ierdy_snd → sio_irdy_snd,sio_ierdy_rcv → sio_irdy_rcv
     859        ★sysutimとerdyを大文字小文字を区別せずにサーチするとよい.
     860
     861(4) cfg1_out.cのコンパイル/リンク方法の変更に伴う修正箇所
     862        - ターゲット依存部で,target_cfg1_out.hを用意する.詳しくは,「ター
     863          ゲット依存部 ポーティングガイド」の7.4節を参照.
     864        - 新たに用意したファイルをMANIFESTに追加する.
     865
     866(5) 警告メッセージへの対処
     867        - Makefile.targetに,「COPTS := $(COPTS) -Werror」を追加することを
     868          検討する.カーネル内で厳密な別名規則による警告メッセージが出る場
     869          合には,「KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing」
     870          を追加してもよい.
     871
     872(6) コメントの修正
     873        -「割込みロック」→「全割込みロック」
     874
     875----------------------------------------------------------------------
     876
     877                TOPPERS/ASPカーネル
     878                Release 1.2.0 から 1.2.1 への変更点
     879
     880○変更点のリスト
     881
     882・トレースログ記録のサンプルコードを組み込む方法の変更
     883        - configureに-rオプションを追加.
     884        - sample/Makefileの修正.
     885
     886・Makefileのコンフィギュレータ関連部分の変更
     887        - コンフィギュレータに対するターゲット依存のオプションを,Makefile
     888          のターゲット依存部で記述するように変更.
     889        - コンフィギュレータの各パスのターゲット依存のファイルへの依存関係
     890          を,Makefileのターゲット依存部で記述するように変更.
     891
     892・バージョン番号の更新.
     893
     894○ターゲット依存部の要修正箇所(1.1.0 → 1.2.1)
     895
     896(1) 新しいコンフィギュレータへの対応
     897
     898・target.tf中で,ヘッダファイルと重複した定数値の定義を行っている場合に
     899 は,target_def.cvsに変数記述を行い,重複した定義を削除する.
     900
     901・コンフィギュレータに対するオプションに,target_def.cvsを読み込ませる
     902 指定を追加する.「ターゲット依存部 ポーティングガイド」2.4節の
     903 (2-4-15) 項を参照.
     904
     905・target_check.tfを作成する.「ターゲット依存部 ポーティングガイド」
     906 7.3節参照.
     907
     908・コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存
     909 関係を定義する.「ターゲット依存部 ポーティングガイド」2.7節参照.
     910
     911(2) データ型と定数の変更・追加
     912
     913・BOOLをbool_tに,TRUEとFALSEをそれぞれtrueとfalseに変更する.ER_BOOLな
     914 どを変更しないように注意すること.コメント中に記述されたこれらのデー
     915 タ型と定数も変更すること.
     916
     917・charをchar_tに変更する.ただし,文字列定数が記述されることが多い引数
     918 等は,コンパイラの警告を避けるために,char *のままとする.ターゲット
     919 依存部で最低限変更しなければならないのは,以下の2箇所.
     920
     921        - target_fput_logの引数
     922        - sio_snd_chrの第2引数
     923
     924・target_stddef.h(またはそこからインクルードされるファイル)に,サイズ
     925 の指定された浮動小数点型(float32_tとdouble64_t),その最大値・最小値
     926 のマクロの定義を追加する.「ターゲット依存部 ポーティングガイド」3.4
     927 節参照.開発環境がGCCでarch/gcc/tool_stddef.hを用いており,float型と
     928 double型がそれぞれIEEE754準拠の単精度浮動小数点数と倍精度浮動小数点数
     929 である場合には,arch/gcc/tool_stddef.hをインクルードする前に,
     930 TOPPERS_STDFLOAT_TYPE1をマクロ定義すればよい.
     931
     932(3) トレースログ記録のサンプルコードの組込み(オプション)
     933
     934・ターゲット依存部を,トレースログ記録のサンプルコードを使用するように
     935 修正する.「ターゲット依存部 ポーティングガイド」6.11.2節参照.
     936
     937(4) TARGETDIR変数の使用
     938
     939・Makefileのターゲット依存部で,ターゲット依存部ディレクトリを参照して
     940 いる箇所で,$(SRCDIR)/target/$(TARGET)を,$(TARGETDIR)に変更する.
     941
     942----------------------------------------------------------------------
     943
     944                TOPPERS/ASPカーネル
     945                Release 1.1.0 から 1.2.0 への変更点
     946
     947○変更点のリスト
     948
     949・コンフィギュレータを新しいバージョンに差し換え
     950        - パス1とパス3にもターゲット依存機能を追加.
     951        - FMPカーネルのクラス記述に対応.
     952        - 追加ファイル(ターゲット非依存部,cfg以下を除く)
    1086953                kernel/kernel_api.csv, kernel_def.csv, kernel_check.tf
    1087         - 追加ファイル(ターゲット依存部)
     954        - 追加ファイル(ターゲット依存部)
    1088955                target_def.csv, target_check.tf
    1089         - sample/Makefileを新しいコンフィギュレータに対応させる.
    1090         - ミューテックス機能拡張でコンフィギュレータのmakeを不要に.
    1091 
    1092 ãƒ»ãƒ‡ãƒ¼ã‚¿åž‹ã¨å®šæ•°ã®å¤‰æ›´ãƒ»è¿½åŠ 
    1093         - BOOL型をbool_t型に変更.
    1094                 BOOL → bool_t,TRUE → true,FALSE → false
    1095                 従来の定義をitron.hに追加.
    1096         - char型をchar_t型に変更.
    1097                 ただし,文字列定数が記述されることが多い引数等は,コンパイラの
    1098                 警告を避けるために,char *のままとする.
    1099         - float32_t, double64_tの追加.
    1100 
    1101 ãƒ»ãƒ†ã‚¹ãƒˆãƒ—ログラムの追加・修正
    1102         - システムコンフィギュレーションファイルからインクルードするコンフィ
    1103           ギュレーションファイルの整理(ボトムアップ順序に).
    1104         - テストプログラムの生成スクリプト(utils/gentest)を作成.
    1105         - ミューテックス機能のテストプログラムを生成スクリプト対応に.
    1106         - ミューテックス機能拡張にtest_mutex7を追加.
    1107 
    1108 ãƒ»ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スのヘッダファイルのインクルード記述の整理
    1109         - syssvcの下のヘッダファイルは,#include "syssvc/??????.h"でインク
    1110       ルードする(??????.cからインクルードする場合を除く).
    1111         - Makefileから,-I$(SRCDIR)/syssvcを削除.
    1112 
    1113 ãƒ»ã‚«ãƒ¼ãƒãƒ«èµ·å‹•ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‡ºåŠ›ï¼ˆbanner)機能の独立
    1114         - syssvc/banner.cfg, banner.hを作成.
    1115         - syslog.cfgから関連する記述を削除.
    1116 
    1117 ãƒ»t_syslog.hとsyslog.hの役割の変更
    1118         - t_syslog.hは,システムログ出力を行うための定義を含むヘッダファイ
    1119           ルとし,システムログ機能を操作するための定義は,syslog.hに移す.
    1120 
    1121 ãƒ»ã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥æ–¹æ³•ã®å¤‰æ›´
    1122         - シリアルインタフェースドライバの強制フラッシュ機能は廃止し,未送
    1123           信文字の取出し機能を新設.これを用いた強制フラッシュ処理は,シス
    1124           テムログタスクの終了処理ルーチン側で実施.
    1125 
    1126 ãƒ»ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチの要否の判定方法の変更
    1127         - タスクディスパッチのå¿
    1128 è¦ãªçŠ¶æ
    1129 ‹ã«ã™ã‚‹é–¢æ•°ã‚’,すべて,タスクディス
    1130           パッチの要否を返すようにし,p_runtskとp_schedtskの比較による判定
    1131           をなるべく使わないように修正.
    1132 
    1133 ãƒ»ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°è¨˜éŒ²ã®ã‚µãƒ³ãƒ—ルコードの使用方法を規定
    1134         - ポーティングガイドの6.11.2節に,ターゲット依存部でトレースログ記
    1135           録のサンプルコードを使用する方法を規定.
    1136         - DVE68Kターゲット依存部をそれに従うように修正.
    1137 
    1138 ãƒ»TARGETDIR変数の導å
    1139 ¥
    1140         - sample/Makefileで,ターゲット依存部ディレクトリを示す変数
    1141           TARGETDIRを定義.
    1142         - これを使うように,ターゲット依存部を修正.
    1143 
    1144 ãƒ»ãã®ä»–のバグフィックス
    1145         - kernel_rename.def:log_???_entry → log_???_enter
    1146 
    1147 ãƒ»ãã®ä»–の修正
    1148         - T_RLOG → T_SYSLOG_RLOG
    1149         - syssvcの下のヘッダファイルにもthrow()をå
    1150 ¥ã‚Œã‚‹ï¼Ž
    1151         - makerelease:RELEAEディレクトリがなければ作る.
    1152 
    1153 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    1154 
    1155 å®Ÿï¼Žã‚³ãƒ¡ãƒ³ãƒˆã®è¿½åŠ ãƒ»ä¿®æ­£ï¼Ž
    1156         - doc/migration.txtを作成(現時点では未完成).
    1157 
    1158 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°ï¼Ž
    1159 
    1160 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®è¦ä¿®æ­£ç®‡æ‰€ï¼ˆ1.1.0 → 1.2.0)
    1161 
    1162 (1) 新しいコンフィギュレータへの対応
    1163 
    1164 ãƒ»target.tf中で,ヘッダファイルと重複した定数値の定義を行っている場合に
    1165 ã€€ã¯ï¼Œtarget_def.cvsに変数記述を行い,重複した定義を削除する.
    1166 
    1167 ãƒ»target_check.tfを作成する.「ターゲット依存部 ポーティングガイド」
    1168 ã€€7.3節参ç
    1169 §ï¼Ž
    1170 
    1171 (2) データ型と定数の変更・追加
    1172 
    1173 ãƒ»BOOLをbool_tに,TRUEとFALSEをそれぞれtrueとfalseに変更する.ER_BOOLな
    1174 ã€€ã©ã‚’変更しないように注意すること.コメント中に記述されたこれらのデー
    1175 ã€€ã‚¿åž‹ã¨å®šæ•°ã‚‚変更すること.
    1176 
    1177 ãƒ»charをchar_tに変更する.ただし,文字列定数が記述されることが多い引数
    1178 ã€€ç­‰ã¯ï¼Œã‚³ãƒ³ãƒ‘イラの警告を避けるために,char *のままとする.ターゲット
    1179 ã€€ä¾å­˜éƒ¨ã§æœ€ä½Žé™å¤‰æ›´ã—なければならないのは,以下の2箇所.
    1180 
    1181         - target_fput_logの引数
    1182         - sio_snd_chrの第2引数
    1183 
    1184 ãƒ»target_stddef.h(またはそこからインクルードされるファイル)に,サイズ
    1185 ã€€ã®æŒ‡å®šã•ã‚ŒãŸæµ®å‹•å°æ•°ç‚¹åž‹ï¼ˆfloat32_tとdouble64_t),その最大値・最小値
    1186 ã€€ã®ãƒžã‚¯ãƒ­ã®å®šç¾©ã‚’追加する.「ターゲット依存部 ポーティングガイド」3.4
    1187 ã€€ç¯€å‚ç
    1188 §ï¼Žé–‹ç™ºç’°å¢ƒãŒGCCでarch/gcc/tool_stddef.hを用いており,float型と
    1189 ã€€double型がそれぞれIEEE754準拠の単精度浮動小数点数と倍精度浮動小数点数
    1190 ã€€ã§ã‚る場合には,arch/gcc/tool_stddef.hをインクルードする前に,
    1191 ã€€TOPPERS_STDFLOAT_TYPE1をマクロ定義すればよい.
    1192 
    1193 (3) トレースログ記録のサンプルコードの使用方法に従った修正(オプション)
    1194 
    1195 ãƒ»ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã‚’,トレースログ記録のサンプルコードを使用するように
    1196 ã€€ä¿®æ­£ã™ã‚‹ï¼Žã€Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ ポーティングガイド」6.11.2節参ç
    1197 §ï¼Ž
    1198 
    1199 (4) TARGETDIR変数の使用
    1200 
    1201 ãƒ»Makefileのターゲット依存部で,ターゲット依存部ディレクトリを参ç
    1202 §ã—て
    1203 ã€€ã„る箇所で,$(SRCDIR)/target/$(TARGET)を,$(TARGETDIR)に変更する.
    1204 
    1205 ----------------------------------------------------------------------
    1206 
    1207                 TOPPERS/ASPカーネル
    1208                 Release 1.0.0 から 1.1.0 への変更点
    1209 
    1210 â—‹å¤‰æ›´ç‚¹ã®ãƒªã‚¹ãƒˆ
    1211 
    1212 ãƒ»frsm_tskをカーネルから削除.itron.hにマクロ定義として残す
    1213 
    1214 ãƒ»ã‚«ãƒ¼ãƒãƒ«ã®ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°æ©Ÿèƒ½ã®æ”¹ä¿®
    1215         - トレースログマクロを使う側のファイルで,デフォルト定義を与える.
    1216         - nulltraceを廃止.logtraceを修正.
    1217         - ターゲット依存部でのトレースログ取得方法を標準化.
    1218         - INTHDR_ENTRYとEXCHDR_ENTRYにパラメータを追加.
    1219         - target_putcを,target_fput_logにリネーム.
    1220 
    1221 ãƒ»ã‚·ã‚¹ãƒ†ãƒ ãƒ­ã‚°æ©Ÿèƒ½ã‚’カーネルから外して,システムサービスの位置付けに
    1222         - syslog.c,syslog.h,banner.cを,kernelからsyssvcに移動.
    1223         - システムログ機能のサービスコールの名称にsyslog_を付加.
    1224 
    1225 ãƒ»ã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スのディレクトリの位置付けの明確化
    1226         - logtask.hとserial.hを,includeからsyssvcに移動.
    1227         - vasyslog.cを,libraryからsyssvcに移動.
    1228 
    1229 ãƒ»ãƒªãƒªãƒ¼ã‚¹ãƒ‘ッケージの形æ
    1230 ‹ã‚’æ•´å‚™
    1231         - utils/makereleaseを作成.utils/genmanifestを削除.
    1232         - MANIFESTファイルに,パッケージ名とバージョン番号を記述.
    1233         - MANIFESTファイルのINCLUDE記述を変更.
    1234 
    1235 ãƒ»å‡ºå
    1236 ¥å£å‡¦ç†ã®ç•ªåœ°ã®å¤‰æ•°ï¼ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åã®å¤‰æ›´
    1237         - 割込みハンドラ/CPU例外ハンドラの出å
    1238 ¥å£å‡¦ç†ã®ç•ªåœ°ï¼ˆFP型)の変数/
    1239           フィールド名をint_entry/exc_entryに変更.コメントも修正.
    1240 
    1241 ãƒ»DVE68K/M68K依存部の修正.
    1242         - target.tf中のエラーメッセージの修正.
    1243         - logtraceを使うように修正.
    1244 
    1245 ãƒ»ãã®ä»–の修正.
    1246         - 固定長メモリプール初期化ブロックの生成に関するバグを修正.
    1247         - configureで,cfgが生成されているかのチェックを厳密化.
    1248         - sample/Makefileにおいて,ライブラリに関する依存記述の修正.
    1249         - sample/sample1.cfgにおいて,システムサービスの定義順を変更.
    1250         - extension/MANIFESTに,MANIFESTを追加.
    1251 
    1252 ãƒ»ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å
    1253 
    1254 å®Ÿï¼Žã‚³ãƒ¡ãƒ³ãƒˆã®è¿½åŠ ãƒ»ä¿®æ­£ï¼Ž
    1255 
    1256 ãƒ»ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã®æ›´æ–°ï¼Ž
    1257 
    1258 â—‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ä¿®æ­£ç®‡æ‰€ï¼ˆ1.0.0 → 1.1.0)
    1259 
    1260 ãƒ»ã‚«ãƒ¼ãƒãƒ«ã®ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°æ©Ÿèƒ½ã®ä¸­ã§ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã§å®Ÿè£
    1261 ã™ã‚‹å¿
    1262 è¦ãŒã‚
    1263 ã€€ã‚‹ã‚‚のを実è£
    1264 ã™ã‚‹ï¼Žè©³ã—くは,porting.txtの6.1.2節,6.5.2節,6.6.1節,
    1265 ã€€6.7.1節を参ç
    1266 §ã™ã‚‹ã“と.
    1267 
    1268 ãƒ»INTHDR_ENTRYとEXCHDR_ENTRYに2番目のパラメータが追加されたのに対応する.
    1269 
    1270 ãƒ»TARGET_NAMEとCOPYRIGHT_TARGETを,target_config.hからtarget_syssvc.hに
    1271 ã€€ç§»å‹•ã™ã‚‹ï¼ŽCOPYRIGHT_TARGETはTARGET_COPYRIGHTにリネームする.
    1272 
    1273 ãƒ»target_putcをtarget_fput_logにリネームし,その宣言をtarget_config.hか
    1274 ã€€ã‚‰target_syssvc.hに移動する.関数定義は,target_config.cに置いたまま
    1275 ã€€ã§ã‚ˆã„.関数宣言・定義の上のコメントを修正する.
    1276 
    1277 ãƒ»å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã®å‡ºå
    1278 ¥å£å‡¦ç†ã®ç•ªåœ°ï¼ˆFP型)の変数/フィールド名をinthdr
    1279 ã€€ã‹ã‚‰int_entryに,CPU例外ハンドラの出å
    1280 ¥å£å‡¦ç†ã®ç•ªåœ°ï¼ˆFP型)の変数/
    1281 ã€€ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åã‚’exchdrからexct_entryに,それぞれ変更する.これに関連す
    1282 ã€€ã‚‹x_define_inhとx_define_excのコメントを修正する.
    1283 
    1284 ãƒ»ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ã‚’記録しない場合には,target_config.hから「#include
    1285 ã€€"nulltrace/trace_config.h"」を削除する.
    1286 
    1287 ãƒ»ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°ã‚’記録する場合には,target_syssvc.hに「#include
    1288 ã€€"logtrace/trace_config.h"」を追加する.また,target_config.h中の
    1289 ã€€ã€Œ#include "logtrace/trace_config.h"」の位置を前の方に移動する.
    1290 
    1291 ãƒ»MANIFESTとE_PACKAGEを作成/修正する.MANIFEST中に,å¿
    1292 è¦ã«å¿œã˜ã¦ï¼Œ
    1293 ã€€PACKAGEディレクティブとVERSIONディレクティブを追加する.また,
    1294 ã€€INCLUDEディレクティブのパラメータを,ディレクトリ名からファイル名に変
    1295 ã€€æ›´ã™ã‚‹ï¼Žã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚·ã‚¹ãƒ†ãƒ æ¯Žã«ï¼ŒE_PACKAGEを作成する.詳しくは,
    1296 ã€€user.txtの2章とporting.txtの9.1節を参ç
    1297 §ã™ã‚‹ã“と.
    1298 
    1299 ----------------------------------------------------------------------
     956        - sample/Makefileを新しいコンフィギュレータに対応させる.
     957        - ミューテックス機能拡張でコンフィギュレータのmakeを不要に.
     958
     959・データ型と定数の変更・追加
     960        - BOOL型をbool_t型に変更.
     961                BOOL → bool_t,TRUE → true,FALSE → false
     962                従来の定義をitron.hに追加.
     963        - char型をchar_t型に変更.
     964                ただし,文字列定数が記述されることが多い引数等は,コンパイラの
     965                警告を避けるために,char *のままとする.
     966        - float32_t, double64_tの追加.
     967
     968・テストプログラムの追加・修正
     969        - システムコンフィギュレーションファイルからインクルードするコンフィ
     970          ギュレーションファイルの整理(ボトムアップ順序に).
     971        - テストプログラムの生成スクリプト(utils/gentest)を作成.
     972        - ミューテックス機能のテストプログラムを生成スクリプト対応に.
     973        - ミューテックス機能拡張にtest_mutex7を追加.
     974
     975・システムサービスのヘッダファイルのインクルード記述の整理
     976        - syssvcの下のヘッダファイルは,#include "syssvc/??????.h"でインク
     977      ルードする(??????.cからインクルードする場合を除く).
     978        - Makefileから,-I$(SRCDIR)/syssvcを削除.
     979
     980・カーネル起動メッセージの出力(banner)機能の独立
     981        - syssvc/banner.cfg, banner.hを作成.
     982        - syslog.cfgから関連する記述を削除.
     983
     984・t_syslog.hとsyslog.hの役割の変更
     985        - t_syslog.hは,システムログ出力を行うための定義を含むヘッダファイ
     986          ルとし,システムログ機能を操作するための定義は,syslog.hに移す.
     987
     988・シリアルインタフェースドライバのフラッシュ方法の変更
     989        - シリアルインタフェースドライバの強制フラッシュ機能は廃止し,未送
     990          信文字の取出し機能を新設.これを用いた強制フラッシュ処理は,シス
     991          テムログタスクの終了処理ルーチン側で実施.
     992
     993・タスクディスパッチの要否の判定方法の変更
     994        - タスクディスパッチの必要な状態にする関数を,すべて,タスクディス
     995          パッチの要否を返すようにし,p_runtskとp_schedtskの比較による判定
     996          をなるべく使わないように修正.
     997
     998・トレースログ記録のサンプルコードの使用方法を規定
     999        - ポーティングガイドの6.11.2節に,ターゲット依存部でトレースログ記
     1000          録のサンプルコードを使用する方法を規定.
     1001        - DVE68Kターゲット依存部をそれに従うように修正.
     1002
     1003・TARGETDIR変数の導入
     1004        - sample/Makefileで,ターゲット依存部ディレクトリを示す変数
     1005          TARGETDIRを定義.
     1006        - これを使うように,ターゲット依存部を修正.
     1007
     1008・その他のバグフィックス
     1009        - kernel_rename.def:log_???_entry → log_???_enter
     1010
     1011・その他の修正
     1012        - T_RLOG → T_SYSLOG_RLOG
     1013        - syssvcの下のヘッダファイルにもthrow()を入れる.
     1014        - makerelease:RELEAEディレクトリがなければ作る.
     1015
     1016・ドキュメントの充実.コメントの追加・修正.
     1017        - doc/migration.txtを作成(現時点では未完成).
     1018
     1019・バージョン番号の更新.
     1020
     1021○ターゲット依存部の要修正箇所(1.1.0 → 1.2.0)
     1022
     1023(1) 新しいコンフィギュレータへの対応
     1024
     1025・target.tf中で,ヘッダファイルと重複した定数値の定義を行っている場合に
     1026 は,target_def.cvsに変数記述を行い,重複した定義を削除する.
     1027
     1028・target_check.tfを作成する.「ターゲット依存部 ポーティングガイド」
     1029 7.3節参照.
     1030
     1031(2) データ型と定数の変更・追加
     1032
     1033・BOOLをbool_tに,TRUEとFALSEをそれぞれtrueとfalseに変更する.ER_BOOLな
     1034 どを変更しないように注意すること.コメント中に記述されたこれらのデー
     1035 タ型と定数も変更すること.
     1036
     1037・charをchar_tに変更する.ただし,文字列定数が記述されることが多い引数
     1038 等は,コンパイラの警告を避けるために,char *のままとする.ターゲット
     1039 依存部で最低限変更しなければならないのは,以下の2箇所.
     1040
     1041        - target_fput_logの引数
     1042        - sio_snd_chrの第2引数
     1043
     1044・target_stddef.h(またはそこからインクルードされるファイル)に,サイズ
     1045 の指定された浮動小数点型(float32_tとdouble64_t),その最大値・最小値
     1046 のマクロの定義を追加する.「ターゲット依存部 ポーティングガイド」3.4
     1047 節参照.開発環境がGCCでarch/gcc/tool_stddef.hを用いており,float型と
     1048 double型がそれぞれIEEE754準拠の単精度浮動小数点数と倍精度浮動小数点数
     1049 である場合には,arch/gcc/tool_stddef.hをインクルードする前に,
     1050 TOPPERS_STDFLOAT_TYPE1をマクロ定義すればよい.
     1051
     1052(3) トレースログ記録のサンプルコードの使用方法に従った修正(オプション)
     1053
     1054・ターゲット依存部を,トレースログ記録のサンプルコードを使用するように
     1055 修正する.「ターゲット依存部 ポーティングガイド」6.11.2節参照.
     1056
     1057(4) TARGETDIR変数の使用
     1058
     1059・Makefileのターゲット依存部で,ターゲット依存部ディレクトリを参照して
     1060 いる箇所で,$(SRCDIR)/target/$(TARGET)を,$(TARGETDIR)に変更する.
     1061
     1062----------------------------------------------------------------------
     1063
     1064                TOPPERS/ASPカーネル
     1065                Release 1.0.0 から 1.1.0 への変更点
     1066
     1067○変更点のリスト
     1068
     1069・frsm_tskをカーネルから削除.itron.hにマクロ定義として残す
     1070
     1071・カーネルのトレースログ機能の改修
     1072        - トレースログマクロを使う側のファイルで,デフォルト定義を与える.
     1073        - nulltraceを廃止.logtraceを修正.
     1074        - ターゲット依存部でのトレースログ取得方法を標準化.
     1075        - INTHDR_ENTRYとEXCHDR_ENTRYにパラメータを追加.
     1076        - target_putcを,target_fput_logにリネーム.
     1077
     1078・システムログ機能をカーネルから外して,システムサービスの位置付けに
     1079        - syslog.c,syslog.h,banner.cを,kernelからsyssvcに移動.
     1080        - システムログ機能のサービスコールの名称にsyslog_を付加.
     1081
     1082・システムサービスのディレクトリの位置付けの明確化
     1083        - logtask.hとserial.hを,includeからsyssvcに移動.
     1084        - vasyslog.cを,libraryからsyssvcに移動.
     1085
     1086・リリースパッケージの形態を整備
     1087        - utils/makereleaseを作成.utils/genmanifestを削除.
     1088        - MANIFESTファイルに,パッケージ名とバージョン番号を記述.
     1089        - MANIFESTファイルのINCLUDE記述を変更.
     1090
     1091・出入口処理の番地の変数/フィールド名の変更
     1092        - 割込みハンドラ/CPU例外ハンドラの出入口処理の番地(FP型)の変数/
     1093          フィールド名をint_entry/exc_entryに変更.コメントも修正.
     1094
     1095・DVE68K/M68K依存部の修正.
     1096        - target.tf中のエラーメッセージの修正.
     1097        - logtraceを使うように修正.
     1098
     1099・その他の修正.
     1100        - 固定長メモリプール初期化ブロックの生成に関するバグを修正.
     1101        - configureで,cfgが生成されているかのチェックを厳密化.
     1102        - sample/Makefileにおいて,ライブラリに関する依存記述の修正.
     1103        - sample/sample1.cfgにおいて,システムサービスの定義順を変更.
     1104        - extension/MANIFESTに,MANIFESTを追加.
     1105
     1106・ドキュメントの充実.コメントの追加・修正.
     1107
     1108・バージョン番号の更新.
     1109
     1110○ターゲット依存部の修正箇所(1.0.0 → 1.1.0)
     1111
     1112・カーネルのトレースログ機能の中で,ターゲット依存部で実装する必要があ
     1113 るものを実装する.詳しくは,porting.txtの6.1.2節,6.5.2節,6.6.1節,
     1114 6.7.1節を参照すること.
     1115
     1116・INTHDR_ENTRYとEXCHDR_ENTRYに2番目のパラメータが追加されたのに対応する.
     1117
     1118・TARGET_NAMEとCOPYRIGHT_TARGETを,target_config.hからtarget_syssvc.hに
     1119 移動する.COPYRIGHT_TARGETはTARGET_COPYRIGHTにリネームする.
     1120
     1121・target_putcをtarget_fput_logにリネームし,その宣言をtarget_config.hか
     1122 らtarget_syssvc.hに移動する.関数定義は,target_config.cに置いたまま
     1123 でよい.関数宣言・定義の上のコメントを修正する.
     1124
     1125・割込みハンドラの出入口処理の番地(FP型)の変数/フィールド名をinthdr
     1126 からint_entryに,CPU例外ハンドラの出入口処理の番地(FP型)の変数/
     1127 フィールド名をexchdrからexct_entryに,それぞれ変更する.これに関連す
     1128 るx_define_inhとx_define_excのコメントを修正する.
     1129
     1130・トレースログを記録しない場合には,target_config.hから「#include
     1131 "nulltrace/trace_config.h"」を削除する.
     1132
     1133・トレースログを記録する場合には,target_syssvc.hに「#include
     1134 "logtrace/trace_config.h"」を追加する.また,target_config.h中の
     1135 「#include "logtrace/trace_config.h"」の位置を前の方に移動する.
     1136
     1137・MANIFESTとE_PACKAGEを作成/修正する.MANIFEST中に,必要に応じて,
     1138 PACKAGEディレクティブとVERSIONディレクティブを追加する.また,
     1139 INCLUDEディレクティブのパラメータを,ディレクトリ名からファイル名に変
     1140 更する.ターゲットシステム毎に,E_PACKAGEを作成する.詳しくは,
     1141 user.txtの2章とporting.txtの9.1節を参照すること.
     1142
     1143----------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.