Changeset 95 for ssp_qb_r5f100le_cs/trunk/doc/porting.txt
- Timestamp:
- Jun 2, 2015, 3:39:53 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ssp_qb_r5f100le_cs/trunk/doc/porting.txt
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 1 1 2 TOPPERS/SSPJ[l 3 ^[Qbg˶ |[eBOKCh 4 5 Îo[W: Release 1.3.0 6 ÅIXV: 2015N511ú 7 8 ±ÌhL 9 gÍCTOPPERS/SSPJ[lðC¢T|[gÌ^[QbgVXe 10 É|[eBO·é½ßÉKvÆÈé^[Qbg˶ÌÀû@ðྷ 11 éàÌÅ éD 2 TOPPERS/SSPカーネル 3 ターゲット依存部 ポーティングガイド 4 5 対応バージョン: Release 1.3.0 6 最終更新: 2015年5月11日 7 8 このドキュメントは,TOPPERS/SSPカーネルを,未サポートのターゲットシステ 9 ムにポーティングするために必要となるターゲット依存部の実装方法を説明す 10 るものである. 12 11 13 12 ---------------------------------------------------------------------- … … 19 18 Nagoya Municipal Industrial Research Institute, JAPAN 20 19 21 ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 22 Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 23 ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 24 (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 25 \¦C±Ìpð¨æѺL̳ÛØKèªC»ÌÜÜÌ`Å\[ 26 XR[hÉÜÜêÄ¢é±ÆD 27 (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 28 pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 29 gip 30 Ò}j 31 AÈÇjÉCãLÌì \¦C±Ìpð¨æѺL 32 ̳ÛØKèðfÚ·é±ÆD 33 (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 34 pÅ«È¢`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 35 ÆD 36 (a) Äzzɺ¤hL 37 gipÒ}j 38 AÈÇjÉCãLÌ 39 ì \¦C±Ìpð¨æѺL̳ÛØKèðfÚ·é±ÆD 40 (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 41 ñ·é±ÆD 42 (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 43 Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 44 ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 45 RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 46 ÆÓ·é±ÆD 20 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 21 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 22 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 23 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 24 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 25 スコード中に含まれていること. 26 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 27 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 28 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 29 の無保証規定を掲載すること. 30 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 31 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 32 と. 33 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 34 作権表示,この利用条件および下記の無保証規定を掲載すること. 35 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 36 報告すること. 37 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 38 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 39 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 40 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 41 免責すること. 47 42 48 {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨49 æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI50 ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF51 AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»52 ÌÓCðíÈ¢D43 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 44 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 45 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 46 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 47 の責任を負わない. 53 48 54 49 ---------------------------------------------------------------------- 55 50 56 Ú 57 58 1. ¤Ê 59 1.1 ^[Qbg˶Ì\¬ 60 1.2 ¼OÌÕËÌh~ 61 1.3 ½dCN[hÌh~ 62 1.4 AZu¾êÆÌwb_t@C̤p 63 1.5 CN[hLqÌû@ 64 1.6 NeBJZNVÌoüÌÀ»ÉÖ·é§ñ 65 2. VXe\z«Ì^[Qbg˶ 66 2.1 ^[QbgªÌÆ^[Qbg˶ÌfBNg 67 2.2 MakefileÌ^[Qbg˶ 68 2.3 J«¼ÆR}h¼ÌÝè 69 2.4 RpCIvVÆIuWFNgt@CÌÝè 70 2.5 Nû@ÌÝè 71 2.6 ˶ÖWÌè` 72 2.7 »Ì¼ÌÝè 73 3. TOPPERS¤Êè`Ì^[Qbg˶ 74 3.1 ^[Qbg¯Ê}N 75 3.2 ®^ÌÅålEŬlErbg 76 3.3 TCYÌwè³ê½®^C»ÌÅålEŬlC®èðìé}N 77 3.4 TCYÌwè³ê½®¬_^C»ÌÅålEŬlÌ}N 78 3.5 RpCÌg£@\̽ßÌ}Nè` 79 3.6 WIÈè`Ìã« 80 3.7 AT[V̽ßÌè` 81 4. VXeC^tF[XCiSILjÌ^[Qbg˶ 82 4.1 SÝbNóÔÌÇ 83 4.2 ÷ÔÒ¿ 84 4.3 vZbTÌGfBA 85 4.4 óÔANZXÖ 86 4.5 I/OóÔANZXÖ 87 5. J[lAPIÌ^[Qbg˶ 88 5.1 ^[Qbgè`ÅT|[g·é@\ 89 5.2 ÝDæxÌÍÍ 90 5.3 ^CeBbNÌè` 91 5.4 ÌæmÛ̽ßÌ^è` 92 5.5 ÌæmÛ̽ßÌ}N 93 5.6 I[onh@\g£Ì½ßÌè`iIvVj 94 6. J[lÀÌ^[Qbg˶ 95 6.1 J[lÀÌ^[QbgË¶Ì¤Ê 96 6.1.1 J[lÀÌ^[Qbg˶Ì\¬vf 97 6.1.2 ^[Qbg˶ÌÖ̽¼K¥ 98 6.2 g[XO@\ÖÌÎ 99 6.3 VXeóÔÌÇ 100 6.3.1 SÝbNóÔÌÇ 101 6.3.2 ReLXgÌÇ 102 6.3.3 CPUbNóÔÌÇ 103 6.4 ÝÉÖA·éVXeóÔÌÇ 104 6.4.1 ÝDæx}XNÌÇ 105 6.4.2 ÝvÖ~tOÌÇ 106 6.4.3 ÝvÌNA 107 6.4.4 ÝvÌv[u 108 6.4.5 ÝnhÌæªÆö 109 6.5 ^XNfBXpb` 110 6.5.1 ^XNReLXgubNÆ^XNú»ReLXgubN 111 6.5.2 fBXpb`{Ì 112 6.5.3 ^XNReLXg©çÌfBXpb` 113 6.5.4 fBXpb`Ì®ìJn 114 6.5.5 »ÝÌReLXgðÌÄÄfBXpb` 115 6.5.6 ^XNÌN® 116 6.6 Ýnh 117 6.6.1 ÝnhÌoüû 118 6.6.2 ÝnhÌoüû̶¬ 119 6.6.3 ÝnhÌÝè 120 6.6.4 ÝvCÌ®«ÌÝè 121 6.6.5 ÝÇ@\Ìú»ÌÏX 122 6.6.6 ftHgÌÝnh 123 6.6.7 J[lÇOÌÝ 124 6.7 CPUáOnhÆCPUáO¶ÌVXeóÔÌQÆ 125 6.7.1 CPUáOnhÌoüû 126 6.7.2 CPUáOnhÌoüû̶¬ 127 6.7.3 CPUáOnhÌÝè 128 6.7.4 CPUáOÇ@\Ìú»ÌÏX 129 6.7.5 ftHgÌCPUáOnh 130 6.7.6 CPUáO¶ÌVXeóÔÌQÆ 131 6.8 J[lÌN®EI¹ÆX^bNÌæÈÇ 132 6.9 J[làÌ` 133 [jO 134 6.9.1 rbg}bvT[` 135 6.9.2 rbgtB[h 136 6.10 J[lÀÉÖ·é»Ì¼Ìè` 137 6.10.1 ñ^XNReLXgpÌX^bNÌæ 138 6.10.2 óxÌè` 139 6.11 J[lÀÌ^[Qbg˶̽ßÌl[Lq 140 6.12 ^C}hCo 141 6.12.1 ^C}hCoÌt@C\¬ 142 6.12.2 ^C}Ìú»EI¹EÝ 143 6.12.3 «\]¿pVXeÌQÆ̽ßÌ@\ 144 7. RtBM 145 [^Ýèt@CÌ^[Qbg˶ 146 7.1 Ýèt@CÆ^[Qbg˶ÌÊut¯ 147 7.2 pX2Ìev[gt@CÌ^[Qbg˶ 148 7.2.1 ^[Qbgñ˶ðCN[h·éOÉè`·×«Ï 149 7.2.2 ^[Qbgñ˶Åè`³êéÏ 150 7.3 pX3Ìev[gt@CÌ^[Qbg˶ 151 7.4 cfg1_out.cÌNÉKvÈX^uÌè`t@C 152 8. VXeT[rXÌ^[Qbg˶ 153 8.1 VXeT[rXÌ^[Qbg˶ 154 8.2 VAC^tF[XhCoÌ^[Qbg˶ 155 8.2.1 ÏCf[^^CÇÖ 156 8.2.2 foCXT[rX[` 157 8.2.3 R[obN[` 158 8.3 J[lN®bZ[WÌoÍÌ^[Qbg˶è` 159 8.4 TvvOÆeXgvOÌ^[Qbg˶è` 160 9. »Ì¼ 161 9.1 hL 162 g 163 9.2 pbP[WLqt@C 164 10. t@X 165 10.1 ^[Qbg˶Ìt@Cê 166 167 168 1. ¤Ê 169 170 1.1 ^[Qbg˶Ì\¬ 171 172 ^[Qbg˶ÍCtargetfBNg̺ÉC^[Qbgn[hEFAÆ 173 J«ÌgÝí¹ÉpÓ·éD½¾µC^[Qbg˶ÌÄp«ð 174 l¶µCvZbTC`bvCJ«ÌÝÉ˶·éªðCvZbTË 175 ¶C`bv˶CJ«˶Ƣ¤`ÅØ誯Äàæ¢DØ誯 176 ûÍC^[Qbg˶ÌÀÉC³êÄ¢éDvZbT˶C`bvË 177 ¶CJ«˶ÍCarchfBNg̺ÉuD 178 179 SSPJ[lÌ^[Qbg˶ÍCVXe\z«iMakefilejÌ^[Qb 180 g˶CTOPPERS¤Êè`it_stddef.hjÌ^[Qbg˶CVXeC 181 ^tF[XCiSILCsil.hjÌ^[Qbg˶CJ[lAPIikernel.hj 182 Ì^[Qbg˶CJ[lÀÌ^[Qbg˶iRtBM 183 [^ 184 Ýèt@CÌ^[Qbg˶ðÜÞjCVXeT[rXÌ^[QbgË 185 ¶C^[Qbg˶ÉÖ·éhL 186 gÅ\¬³êéD 187 188 1.2 ¼OÌÕËÌh~ 189 190 TOPPERSvWFNgªñ·é\tgEFA̽ßÉCTOPPERS_ÅnÜéV 191 {ð\ñµÄ¢éDwb_t@CÉLq³êCAvP[V©çQ 192 ÆÅ«éàV{ÍCTOPPERS_ÅnÜé¼OÆ·éD 193 194 ܽC_kernel_ÅnÜéV{ÍCJ[làÌÏâÖ̽ßÉ\ñ 195 µÄ¢éDJ[làÌÏâÖ̼OÅCNÉAvP[V 196 ̼OÆÕË·éÂ\«ª éàÌÍCl[LqÉXgAbv·é±Æ 197 ÅCRpCÉ_kernel_ÅnÜé¼OÉu«·¦é±ÆƵĢéD 198 199 1.3 ½dCN[hÌh~ 200 201 ·×ÄÌwb_t@CÍC½dÉCN[h³êéÌðh~·é½ßÌð 202 RpCLqðüêé±ÆÆ·éDá¦ÎCtarget_config.hÅ êÎCt@ 203 CÌæªÉ 51 ○目次 52 53 1. 共通事項 54 1.1 ターゲット依存部の構成 55 1.2 名前の衝突の防止 56 1.3 多重インクルードの防止 57 1.4 アセンブリ言語とのヘッダファイルの共用 58 1.5 インクルード記述の方法 59 1.6 クリティカルセクションの出入処理の実現に関する制約 60 2. システム構築環境のターゲット依存部 61 2.1 ターゲット略称とターゲット依存部のディレクトリ 62 2.2 Makefileのターゲット依存部 63 2.3 開発環境名とコマンド名の設定 64 2.4 コンパイルオプションとオブジェクトファイルの設定 65 2.5 リンク方法の設定 66 2.6 依存関係の定義 67 2.7 その他の設定 68 3. TOPPERS共通定義のターゲット依存部 69 3.1 ターゲット識別マクロ 70 3.2 整数型の最大値・最小値・ビット数 71 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ 72 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ 73 3.5 コンパイラの拡張機能のためのマクロ定義 74 3.6 標準的な定義の上書き 75 3.7 アサーションのための定義 76 4. システムインタフェースレイヤ(SIL)のターゲット依存部 77 4.1 全割込みロック状態の管理 78 4.2 微少時間待ち 79 4.3 プロセッサのエンディアン 80 4.4 メモリ空間アクセス関数 81 4.5 I/O空間アクセス関数 82 5. カーネルAPIのターゲット依存部 83 5.1 ターゲット定義でサポートする機能 84 5.2 割込み優先度の範囲 85 5.3 タイムティックの定義 86 5.4 メモリ領域確保のための型定義 87 5.5 メモリ領域確保のためのマクロ 88 5.6 オーバランハンドラ機能拡張のための定義(オプション) 89 6. カーネル実装のターゲット依存部 90 6.1 カーネル実装のターゲット依存部の共通事項 91 6.1.1 カーネル実装のターゲット依存部の構成要素 92 6.1.2 ターゲット依存部の関数の命名規則 93 6.2 トレースログ機能への対応 94 6.3 システム状態の管理 95 6.3.1 全割込みロック状態の管理 96 6.3.2 コンテキストの管理 97 6.3.3 CPUロック状態の管理 98 6.4 割込みに関連するシステム状態の管理 99 6.4.1 割込み優先度マスクの管理 100 6.4.2 割込み要求禁止フラグの管理 101 6.4.3 割込み要求のクリア 102 6.4.4 割込み要求のプローブ 103 6.4.5 割込みハンドラの先頭処理と末尾処理 104 6.5 タスクディスパッチャ 105 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック 106 6.5.2 ディスパッチャ本体 107 6.5.3 タスクコンテキストからのディスパッチ 108 6.5.4 ディスパッチャの動作開始 109 6.5.5 現在のコンテキストを捨ててディスパッチ 110 6.5.6 タスクの起動処理 111 6.6 割込みハンドラ 112 6.6.1 割込みハンドラの出入口処理 113 6.6.2 割込みハンドラ毎の出入口処理の生成 114 6.6.3 割込みハンドラの設定 115 6.6.4 割込み要求ラインの属性の設定 116 6.6.5 割込み管理機能の初期化処理の変更 117 6.6.6 デフォルトの割込みハンドラ 118 6.6.7 カーネル管理外の割込み 119 6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照 120 6.7.1 CPU例外ハンドラの出入口処理 121 6.7.2 CPU例外ハンドラの出入口処理の生成 122 6.7.3 CPU例外ハンドラの設定 123 6.7.4 CPU例外管理機能の初期化処理の変更 124 6.7.5 デフォルトのCPU例外ハンドラ 125 6.7.6 CPU例外発生時のシステム状態の参照 126 6.8 カーネルの起動・終了とスタック領域など 127 6.9 カーネル内部のチューニング 128 6.9.1 ビットマップサーチ 129 6.9.2 ビットフィールド 130 6.10 カーネル実装に関するその他の定義 131 6.10.1 非タスクコンテキスト用のスタック領域 132 6.10.2 空ラベルの定義 133 6.11 カーネル実装のターゲット依存部のためのリネーム記述 134 6.12 タイマドライバ 135 6.12.1 タイマドライバのファイル構成 136 6.12.2 タイマの初期化・終了処理・割込み処理 137 6.12.3 性能評価用システム時刻の参照のための機能 138 7. コンフィギュレータ設定ファイルのターゲット依存部 139 7.1 設定ファイルとターゲット依存部の位置付け 140 7.2 パス2のテンプレートファイルのターゲット依存部 141 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数 142 7.2.2 ターゲット非依存部で定義される変数 143 7.3 パス3のテンプレートファイルのターゲット依存部 144 7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル 145 8. システムサービス等のターゲット依存部 146 8.1 システムサービスのターゲット依存部 147 8.2 シリアルインタフェースドライバのターゲット依存部 148 8.2.1 変数,データ型,管理関数 149 8.2.2 デバイスサービスルーチン 150 8.2.3 コールバックルーチン 151 8.3 カーネル起動メッセージの出力のターゲット依存定義 152 8.4 サンプルプログラムとテストプログラムのターゲット依存定義 153 9. その他 154 9.1 ドキュメント 155 9.2 パッケージ記述ファイル 156 10. リファレンス 157 10.1 ターゲット依存部のファイル一覧 158 159 160 1. 共通事項 161 162 1.1 ターゲット依存部の構成 163 164 ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと 165 開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を 166 考慮し,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依 167 存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け 168 方は,ターゲット依存部の実装に任されている.プロセッサ依存部,チップ依 169 存部,開発環境依存部は,archディレクトリの下に置く. 170 171 SSPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ 172 ト依存部,TOPPERS共通定義(t_stddef.h)のターゲット依存部,システムイン 173 タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h) 174 のターゲット依存部,カーネル実装のターゲット依存部(コンフィギュレータ 175 設定ファイルのターゲット依存部を含む),システムサービスのターゲット依 176 存部,ターゲット依存部に関するドキュメント等で構成される. 177 178 1.2 名前の衝突の防止 179 180 TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン 181 ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参 182 照できる内部シンボルは,TOPPERS_で始まる名前とする. 183 184 また,_kernel_で始まるシンボルは,カーネル内部の変数や関数のために予約 185 している.カーネル内部の変数や関数の名前で,リンク時にアプリケーション 186 の名前と衝突する可能性があるものは,リネーム記述にリストアップすること 187 で,コンパイル時に_kernel_で始まる名前に置き換えることとしている. 188 189 1.3 多重インクルードの防止 190 191 すべてのヘッダファイルは,多重にインクルードされるのを防止するための条 192 件コンパイル記述を入れることとする.例えば,target_config.hであれば,ファ 193 イルの先頭に 204 194 205 195 #ifndef TOPPERS_TARGET_CONFIG_H 206 196 #define TOPPERS_TARGET_CONFIG_H 207 197 208 ðCt@CÌöÉ 198 を,ファイルの末尾に 209 199 210 200 #endif /* TOPPERS_TARGET_CONFIG_H */ 211 201 212 ðLq·éD 213 214 1.4 AZu¾êÆÌwb_t@C̤p 215 216 SSPJ[lÌwb_t@C̽ÍCAZu¾êÌ\[Xt@C©ç 217 àCN[hÅ«éæ¤É·é½ßÉCÌ[É]ÁÄLq·éàÌÆ 218 ·éD 219 220 ETOPPERS_MACRO_ONLYª}Nè`³êÄ¢éêÉÍCAZu¾êÅÍ 221 @ðßÅ«È¢Lqi}Nè`ÈOÌLqjðæ¤ÉLq·éD 222 223 E³µ®^ÌèlÍCUINT_CâULONG_CÈÇÌ®èðìé½ßÌ} 224 @Nðp¢ÄLq·éD½¾µCAZu¾êÌ\[Xt@C©çàC 225 @N[hÅ«ét@CÅ ÁÄàCC¾êÌÝÅp¢éèð±êçÌ 226 @}NðgÁÄLq·éKvÍÈ¢D 227 228 ܽCJ[lÀɨ¢ÄÍCÌ[É]¤àÌÆ·éD 229 230 EAZu¾ê©çàp¢éèÌè`É^LXgðp¢éêÉÍC 231 @CAST}Nðp¢ÄLq·éD 232 233 AZu¾ê©çwb_t@CðCN[h·éÛÉÍCKvɶÄC 234 TOPPERS_MACRO_ONLYCUINC_CCULONG_CCCASTð}Nè`µÄ©çCCN[ 235 hµÈ¯êÎÈçÈ¢D 236 237 1.5 CN[hLqÌû@ 238 239 J«ÅpÓ³êÄ¢éWwb_t@C¨æÑincludefBNgºÌ 240 Wwb_t@CÍCu#include <...>vÉæèCN[h·éD 241 242 »Ì¼Ìwb_t@CÍCu#include "..."vÉæèCN[h·éDwb 243 _t@CªCJgfBNgâCN[h·ét@CƯ¶fB 244 NgÈOÌfBNgÉu©êÄ¢éêÉÍCÌæ¤ÉpXwèð 245 s¤D 246 247 E^[Qbg˶itarget/<^[Qbg¼>jÌfBNgÉu©êÄ¢é 248 @êÍCpXwèðsí¸Ct@C¼ÌÝðLq·éD 249 áj#include "target_config.h" 250 251 EarchfBNgºÌfBNgÉu©êÄ¢éêÉÍCarchfBN 252 @g©çÌÎpXÅLq·éD 253 áj#include "m68k_gcc/prc_config.h" 254 255 E»Ì¼ÌêÉÍC\[XvOÌ[gfBNgiconfigureªu 256 @©êÄ¢éfBNgj©çÌÎpXÅLq·éD 257 áj#include "pdic/upd72001/upd72001.h" 258 259 EJ[lð\¬·ét@C©çCkernelfBNgºÌwb_t@C 260 @ðCN[h·éêÍCpXwèðsí¸Ct@C¼ÌÝðLq·éD 261 áj#include "kernel_impl.h" 262 263 1.6 NeBJZNVÌoüÌÀ»ÉÖ·é§ñ 264 265 J[làÅp¢éNeBJZNVÌoüðÀ»·éêÉÍC 266 Ì2ÂÌðð½·æ¤ÉÀµÈ¯êÎÈçÈ¢D 267 268 (1-6-1) oü©ç²¯½_ÅÍCÝÌÖ~^ª®¹µÄ¢È¯ 269 êÎÈçÈ¢Dá¦ÎCÝÖ~^½ßðÀsµÄ©çÀÛÉݪ 270 Ö~^³êéÜŽ½ß©x·évZbTÌêÉÍCoüÌ 271 ÉNOP½ßðüêéÈÇÌû@ÅCoü𲯽_ÅÍCݪÖ~^ 272 ³ê½óÔÉÈÁÄ¢é±ÆðÛصȯêÎÈçÈ¢D 273 274 (1-6-2) ãÌf[^\¢ª«ÏíéÂ\«ª é±ÆðC½ç©Ìû 275 @ÅRpCÉmç¹È¯êÎÈçÈ¢DGNUJ«ÅÍCÌ¢¸ê©Ì 276 û@ű̧ñ𽷱ƪūéD 277 278 (a) NeBJZNVÌoüÌSÌܽÍoüÌ{¿IȪ 279 iïÌIÉÍCÝÖ~^·éjðiCCÅÈ¢jÊí 280 ÌÖÉæèÀ»·éD 281 282 (b) NeBJZNVÌoüÌ{¿IȪðCCAZu 283 ÉæÁÄÀ»µÄ¢éêÉÍC»ÌCCAZuÌclobberÏ 284 XgÉ"memory"ðÇÁ·éD 285 286 (c) NeBJZNVÌoüÌ{¿IȪªC}NâCC 287 ÖÄoµÅÀ»µÄ¢éêÉÍCNeBJZNVÉüé 288 ÌÅãÆoéÌæªÉCAsm("":::"memory")Æ¢¤LqðüêéD 289 290 ±Ìæ¤È§ñðݯéRÉ¢ÄÍCuTOPPERS/ASPJ[l Ývv 291 ÌuJ[lÌf[^\¢Éηévolatileé¾É¢ÄvÌßðQÆ·é± 292 ÆD 293 294 2. VXe\z«Ì^[Qbg˶ 295 296 ±ÌÍÌà¾ÍCGNUJ«iGCCCGASCBINUTILSCGNU Makejðp¢é±Æ 297 ðzèµÄLqµÄ éD»êÈOÌJ«ðp¢éêÉÍCJÂ«É 298 í¹ÄC³·éKvª éD 299 300 2.1 ^[QbgªÌÆ^[Qbg˶ÌfBNg 301 302 Vµ¢^[Qbg˶ð쬷éÍCܸC^[QbgªÌðèßéD^[ 303 QbgªÌÍCVXeªÌÆJ«ªÌð"_"ÅAµ½àÌÆ·éDVX 304 eªÌÉp¢é¶Íp¬¶ÆÆ"_"ÉCJ«ªÌÉp¢é¶Í 305 p¬¶ÆÉÀè·éDGNUJ«ÌJ«ªÌÍC"gcc"Æ·éDá 306 ¦ÎCVXeªÌª"dve68k"ÅCGNUJ«ðp¢éêÉÍC^[Qbg 307 ªÌÍ"dve68k_gcc"ÆÈéD 308 309 ^[Qbg˶Ìt@Cðu½ßÉCtargetfBNg̺ÉC^[ 310 QbgªÌð¼ÌÆ·éfBNgð쬷éD±êð^[Qbg˶fB 311 NgÆÄÔD 312 313 ^[Qbg˶©çvZbT˶â`bv˶ðØ誯éêÉÍC 314 ˶ªÌðèßéD˶ªÌÍCvZbTâ`bv̪ÌÆJ«ª 315 Ìð"_"ÅAµ½àÌÆ·éDvZbTâ`bv̪ÌÉp¢é¶ÍCp 316 ¬¶ÆÆ"_"ÉÀè·éDá¦ÎCvZbTªÌª"m68k"ÅCGNUJ 317 «ðp¢éêÉÍC˶ªÌÍ"m68k_gcc"ÆÈéD 318 319 ܽC^[Qbg˶©çJ«˶ðØ誯éêÉÍCJ« 320 ªÌð˶ªÌÆ·éDá¦ÎCGNUJ«˶Ì˶ªÌÍC"gcc" 321 ÆÈéD 322 323 ±êçÌ˶Ìt@Cðu½ßÉCarchfBNg̺ÉC˶ª 324 Ìð¼ÌÆ·éfBNgð쬷éD 325 326 ȨCGNUJ«ÈOÌJ«ðp¢éêÉÍCRtBM 327 [V 328 XNvgiconfigurejCTvÌMakefileisample/MakefilejCêÌ 329 [eBeBvOiutils/genoffsetCutils/makedepjðC»ÌJ 330 «pÉpÓ·éKvª éêª éD»ÌêÉÍC±êçÌt@CðC 331 ^[Qbg˶fBNg©J«˶fBNgÉuàÌÆ· 332 éDܽCJ«pÌvWFNgt@CªKvÈêÉÍC^[Qbg 333 ˶fBNgÉuàÌÆ·éD 334 335 2.2 MakefileÌ^[Qbg˶ 336 337 MakefileÌ^[Qbg˶ÍC^[Qbg˶fBNgÉu¢½ 338 Makefile.targetܽͻ±©çCN[h³êét@CivZbTE`b 339 vEJ«˶ÅpÓ³êét@CÈÇjÉÜßéD 340 341 2.3 J«¼ÆR}h¼ÌÝè 342 343 J«¼ÆR}h¼ðÝè·é½ßÉCMakefileÌ^[Qbg˶Š344 ÌÏðè`·éD 345 346 (2-3-1) TOOL J«¼ 347 348 J«¼Éè`·éDGNUJ«ðp¢éêÉÍCgccÉè`·éD 349 350 (2-3-2) GCC_TARGET GNUJ«Ì^[Qbg¼ 351 352 GNUJ«ðp¢éêÉCGNUJ«ðconfigure·éêÉwè·é^[ 353 Qbg¼Éè`·éD±±Åwèµ½^[Qbg¼ÍCJ«ÌR}h¼ 354 ÌæªÉt^³êé¶ñÆÈéDá¦ÎCGCC_TARGETðm68k-unknown-elfÉ 355 è`µ½êÉÍCRpCƵÄm68k-unknown-elf-gccªgíêéD±Ì 356 Ϫè`³êÈ¢êÉÍCPÈégccªgíêéD 357 358 (2-3-3) CC CRpChCoÌ¼Ì 359 (2-3-4) CXX C++RpChCoÌ¼Ì 360 (2-3-5) AS AZuÌ¼Ì 361 (2-3-6) LD JÌ¼Ì 362 (2-3-7) AR A[JCoÌ¼Ì 363 (2-3-8) NM nmvOÌ¼Ì 364 (2-3-9) RANLIB ranlibvOÌ¼Ì 365 (2-3-10) OBJCOPY objcopyvOÌ¼Ì 366 (2-3-11) OBJDUMP objdumpvOÌ¼Ì 367 368 GNUJ«ÈOÌJ«ðp¢éêÉC»ê¼êÌR}h̼ÌÉè` 369 ·éDηéR}hªÈ¢êâCR}hp[^ªÙÈéêÉÍC 370 MakefileÅ»ÌR}hðÄÑoµÄ¢éªðÏX·éKvª éD 371 372 GNUJ«ÅÍC±êçÍGCC_TARGETðp¢Äè`³êéÌÅCè`·éKv 373 ÍÈ¢D 374 375 2.4 RpCIvVÆIuWFNgt@CÌÝè 376 377 MakefileÌ^[Qbg˶ÅȺÅྷéÏðè`·éÉÍC":="ð 378 p¢ÄC»êÜÅÌè`ÉÇÁ·é`Ås¤Dá¦ÎCRpCÉÎ·é» 379 ̼ÌIvVƵÄu-Wall -g -O2vðÇÁµ½¢êÉÍCuCOPTS := 380 $(COPTS) -Wall -g -O2vÆ¢¤LqðMakefileÌ^[Qbg˶ÉÜßéD 381 382 (2-4-1) COPTS RpCÉηé»Ì¼ÌIvV 383 (2-4-2) CDEFS }Nè`IvVi-DIvVj 384 (2-4-3) INCLUDES wb_t@CÌu©ê½fBNgwèI 385 vVi-IIvVj 386 (2-4-4) LDFLAGS JÉηé»Ì¼ÌIvV 387 (2-4-5) LIBS CuNwè̽ßÌIvV 388 389 ^[QbgÉ˶µÄC·×ÄÌ\[Xt@CɤʷéRpCIvV 390 ÌÇÁªKvÈêÉÍCIvVÌíÞÉãɦµ½ÏÉè`·éD 391 392 ÙÆñÇÌêÉC^[Qbg˶fBNgÌMakefile.targetÉÍCÈ 393 ºÌLqðÜßéKvª éD 202 を記述する. 203 204 1.4 アセンブリ言語とのヘッダファイルの共用 205 206 SSPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから 207 もインクルードできるようにするために,次のルールに従って記述するものと 208 する. 209 210 ・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では 211 解釈できない記述(マクロ定義以外の記述)を除くように記述する. 212 213 ・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ 214 クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ 215 ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの 216 マクロを使って記述する必要はない. 217 218 また,カーネル実装においては,次のルールに従うものとする. 219 220 ・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には, 221 CASTマクロを用いて記述する. 222 223 アセンブリ言語からヘッダファイルをインクルードする際には,必要に応じて, 224 TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー 225 ドしなければならない. 226 227 1.5 インクルード記述の方法 228 229 開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の 230 標準ヘッダファイルは,「#include <...>」によりインクルードする. 231 232 その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ 233 ダファイルが,カレントディレクトリやインクルードするファイルと同じディ 234 レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を 235 行う. 236 237 ・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている 238 場合は,パス指定を行わず,ファイル名のみを記述する. 239 例)#include "target_config.h" 240 241 ・archディレクトリ下のディレクトリに置かれている場合には,archディレク 242 トリからの相対パスで記述する. 243 例)#include "m68k_gcc/prc_config.h" 244 245 ・その他の場合には,ソースプログラムのルートディレクトリ(configureが置 246 かれているディレクトリ)からの相対パスで記述する. 247 例)#include "pdic/upd72001/upd72001.h" 248 249 ・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル 250 をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する. 251 例)#include "kernel_impl.h" 252 253 1.6 クリティカルセクションの出入処理の実現に関する制約 254 255 カーネル内で用いるクリティカルセクションの出入処理を実現する場合には, 256 次の2つの条件を満たすように実装しなければならない. 257 258 (1-6-1) 出入処理から抜けた時点では,割込みの禁止/許可が完了していなけ 259 ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが 260 禁止/許可されるまで何命令か遅延するプロセッサの場合には,出入処理の中 261 にNOP命令を入れるなどの方法で,出入処理を抜けた時点では,割込みが禁止/ 262 許可された状態になっていることを保証しなければならない. 263 264 (1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方 265 法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの 266 方法でこの制約を満たすことができる. 267 268 (a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分 269 (具体的には,割込み禁止/許可する処理)を(インラインでない)通常 270 の関数により実現する. 271 272 (b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ 273 ラによって実現している場合には,そのインラインアセンブラのclobber変 274 数リストに"memory"を追加する. 275 276 (c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ 277 ン関数呼出しで実現している場合には,クリティカルセクションに入る処 278 理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる. 279 280 このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」 281 の「カーネルのデータ構造に対するvolatile宣言について」の節を参照するこ 282 と. 283 284 2. システム構築環境のターゲット依存部 285 286 この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること 287 を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に 288 あわせて修正する必要がある. 289 290 2.1 ターゲット略称とターゲット依存部のディレクトリ 291 292 新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター 293 ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス 294 テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は 295 英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例 296 えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット 297 略称は"dve68k_gcc"となる. 298 299 ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター 300 ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ 301 レクトリと呼ぶ. 302 303 ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には, 304 依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略 305 称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英 306 小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発 307 環境を用いる場合には,依存部略称は"m68k_gcc"となる. 308 309 また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境 310 略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc" 311 となる. 312 313 これらの依存部のファイルを置くために,archディレクトリの下に,依存部略 314 称を名称とするディレクトリを作成する. 315 316 なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション 317 スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の 318 ユーティリティプログラム(utils/genoffset,utils/makedep)を,その開発 319 環境用に用意する必要がある場合がある.その場合には,これらのファイルを, 320 ターゲット依存部ディレクトリか開発環境依存部ディレクトリに置くものとす 321 る.また,開発環境用のプロジェクトファイルが必要な場合には,ターゲット 322 依存部ディレクトリに置くものとする. 323 324 2.2 Makefileのターゲット依存部 325 326 Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた 327 Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ 328 プ・開発環境依存部で用意されるファイルなど)に含める. 329 330 2.3 開発環境名とコマンド名の設定 331 332 開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次 333 の変数を定義する. 334 335 (2-3-1) TOOL 開発環境名 336 337 開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する. 338 339 (2-3-2) GCC_TARGET GNU開発環境のターゲット名 340 341 GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター 342 ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名 343 の先頭に付与される文字列となる.例えば,GCC_TARGETをm68k-unknown-elfに 344 定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この 345 変数が定義されない場合には,単なるgccが使われる. 346 347 (2-3-3) CC Cコンパイラドライバの名称 348 (2-3-4) CXX C++コンパイラドライバの名称 349 (2-3-5) AS アセンブラの名称 350 (2-3-6) LD リンカの名称 351 (2-3-7) AR アーカイバの名称 352 (2-3-8) NM nmプログラムの名称 353 (2-3-9) RANLIB ranlibプログラムの名称 354 (2-3-10) OBJCOPY objcopyプログラムの名称 355 (2-3-11) OBJDUMP objdumpプログラムの名称 356 357 GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義 358 する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には, 359 Makefile中でそのコマンドを呼び出している部分を変更する必要がある. 360 361 GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必要 362 はない. 363 364 2.4 コンパイルオプションとオブジェクトファイルの設定 365 366 Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を 367 用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ 368 の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS := 369 $(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める. 370 371 (2-4-1) COPTS コンパイラに対するその他のオプション 372 (2-4-2) CDEFS マクロ定義オプション(-Dオプション) 373 (2-4-3) INCLUDES ヘッダファイルの置かれたディレクトリ指定オ 374 プション(-Iオプション) 375 (2-4-4) LDFLAGS リンカに対するその他のオプション 376 (2-4-5) LIBS ライブラリリンク指定のためのオプション 377 378 ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ 379 ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する. 380 381 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 382 下の記述を含める必要がある. 394 383 395 384 ---------------------------------------- … … 397 386 ---------------------------------------- 398 387 399 ±±ÅTARGETDIRÍC^[Qbg˶fBNgÉè`³êÄ¢éDܽ 400 SRCDIR ÍCMakefileɨ¢ÄC\[XvOÌ[gfBNg401 iconfigureªu©êÄ¢éfBNgjÉè`³êÄ¢éD 402 403 RpCÌâèÅCxbZ[Wªoé±Æðh°È¢óµÈOÅÍC 404 COPTS É-WerrorðÇÁ·é±Æð§·éD388 ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また 389 SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ 390 (configureが置かれているディレクトリ)に定義されている. 391 392 コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では, 393 COPTSに-Werrorを追加することを推奨する. 405 394 406 395 ---------------------------------------- … … 408 397 ---------------------------------------- 409 398 410 J[lÌRpCÉCdereferencing type-punned pointer will break411 strict-aliasing rules Æ¢¤xªoéêÉÍCȺðÇÁ·éÆæ¢D±412 ÌxbZ[WÉÖ·éÚ×ÍCuTOPPERS/ASPJ[l ÝvvÌu^ 413 LXgɺ¤xbZ[WvÌßðQÆ·é±ÆD 399 カーネルのコンパイル時に,dereferencing type-punned pointer will break 400 strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ 401 の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型 402 キャストに伴う警告メッセージ」の節を参照すること. 414 403 415 404 ---------------------------------------- … … 417 406 ---------------------------------------- 418 407 419 ܽCAZu¾êx̯ʼªCC¾êx̯ʼÌæªÉ"_"ª 420 t¢½àÌÉÈéêÉÍCCDEFSÉ-DTOPPERS_LABEL_ASMðÇÁ·éD 421 422 (2-4-6) SYSSVC_DIR VXeT[rXÌ\[Xªu©ê½fBNg423 (2-4-7) SYSSVC_ASMOBJS AZu¾êÅLq³ê½VXeT[rXÌ424 IuWFNg425 (2-4-8) SYSSVC_COBJS C ¾êÅLq³ê½VXeT[rXÌIuWFNg426 (2-4-9) SYSSVC_CFLAGS VXeT[rXÉηéRpCIvV427 (2-4-10) SYSSVC_LIBS VXeT[rXÉηéCuNwè428 429 ^[QbgÉ˶µÄCVXeT[rXiVXeO^XNâfoCXh 430 CoÈÇjÌ\[Xªu©ê½fBNgCVXeT[rXð\¬·é 431 IuWFNgt@CÌXgC»êçðRpC·éÛÉKp·éRp 432 CIvVC»Ì\¬ÉKvÈCuNwèðÇÁ·éêÉÍC 433 ãɦµ½ÏÉè`·éD 434 435 (2-4-11) KERNEL_DIR J[lÌ\[Xªu©ê½fBNg436 (2-4-12) KERNEL_ASMOBJS AZu¾êÅLq³ê½J[lÌIuWFNg437 (2-4-13) KERNEL_COBJS C ¾êÅLq³ê½J[lÌIuWFNg438 (2-4-14) KERNEL_CFLAGS J[lÉηéRpCIvV439 440 ^[QbgÉ˶µÄCJ[lÌ\[Xªu©ê½fBNgCJ[l 441 ð\¬·éIuWFNgt@CÌXgC»êçðRpC·éÛÉKp 442 ·éRpCIvVðÇÁ·éêÉÍCãɦµ½ÏÉè`·éD 443 444 ÙÆñÇÌêÉC^[Qbg˶fBNgÌMakefile.targetÉÍCÈ 445 ºÌLqðÜßéKvª éD 408 また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に"_"が 409 付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する. 410 411 (2-4-6) SYSSVC_DIR システムサービスのソースが置かれたディレクトリ 412 (2-4-7) SYSSVC_ASMOBJS アセンブリ言語で記述されたシステムサービスの 413 オブジェクト 414 (2-4-8) SYSSVC_COBJS C言語で記述されたシステムサービスのオブジェクト 415 (2-4-9) SYSSVC_CFLAGS システムサービスに対するコンパイルオプション 416 (2-4-10) SYSSVC_LIBS システムサービスに対するライブラリリンク指定 417 418 ターゲットに依存して,システムサービス(システムログタスクやデバイスド 419 ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する 420 オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ 421 イルオプション,その構成に必要なライブラリリンク指定を追加する場合には, 422 上に示した変数に定義する. 423 424 (2-4-11) KERNEL_DIR カーネルのソースが置かれたディレクトリ 425 (2-4-12) KERNEL_ASMOBJS アセンブリ言語で記述されたカーネルのオブジェクト 426 (2-4-13) KERNEL_COBJS C言語で記述されたカーネルのオブジェクト 427 (2-4-14) KERNEL_CFLAGS カーネルに対するコンパイルオプション 428 429 ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル 430 を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用 431 するコンパイルオプションを追加する場合には,上に示した変数に定義する. 432 433 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 434 下の記述を含める必要がある. 446 435 447 436 ---------------------------------------- … … 451 440 ---------------------------------------- 452 441 453 (2-4-15) CFG_TABS RtBM 454 [^ÉηéIvV 455 456 ^[QbgÉ˶µÄCRtBM 457 [^ÉηéIvVðÇÁ·éê 458 ÉÍCãɦµ½ÏÉè`·éDïÌIÉÍCRtBM 459 [^Ìlæ 460 ¾V{e[uÌ^[Qbg˶itarget_def.csvjª éêÉÍC 461 »êðwè·éIvVðÇÁ·éKvª éD 462 463 ÙÆñÇÌêÉC^[Qbg˶fBNgÌMakefile.targetÉÍCÈ 464 ºÌLqðÜßéKvª éD 442 (2-4-15) CFG_TABS コンフィギュレータに対するオプション 443 444 ターゲットに依存して,コンフィギュレータに対するオプションを追加する場 445 合には,上に示した変数に定義する.具体的には,コンフィギュレータの値取 446 得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には, 447 それを指定するオプションを追加する必要がある. 448 449 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 450 下の記述を含める必要がある. 465 451 466 452 ---------------------------------------- … … 468 454 ---------------------------------------- 469 455 470 (2-4-16) CFG1_OUT_LDFLAGS cfg1_out.cÉηéNIvV 471 472 ^[QbgÉ˶µÄCcfg1_out.cðN·éÛÉKp·éIvVðÇ 473 Á·éêÉÍCãɦµ½ÏÉè`·éD 474 475 (2-4-17) CFG_OBJS VXeRtBM 476 [V̽ßÌIu 477 WFNg 478 479 ^[QbgÉ˶µÄCVXeRtBM 480 [V̽ßÌIuWFN 481 gt@Cðikernel_cfg.oÈOÉjÇÁ·éêÉÍCãɦµ½ÏÉè 482 `·éD±ÌêCÇÁµ½IuWFNgt@CÌì¬[iRpC^ 483 AZu[Æ˶ÖWì¬[jðCMakefileÌ^[Qbg覃 484 Lq·éKvª éD 456 (2-4-16) CFG1_OUT_LDFLAGS cfg1_out.cに対するリンクオプション 457 458 ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追 459 加する場合には,上に示した変数に定義する. 460 461 (2-4-17) CFG_OBJS システムコンフィギュレーションのためのオブ 462 ジェクト 463 464 ターゲットに依存して,システムコンフィギュレーションのためのオブジェク 465 トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定 466 義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/ 467 アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に 468 記述する必要がある. 485 469 486 470 (2-4-18) CFG2_OUT 487 471 488 ^[QbgÉ˶µÄCRtBM 489 [^ÌpX2Åkernel_cfg.cÆ 490 kernel_cfg.hÈOÌt@C𶬷éêÉÍCãɦµ½ÏÉè`·éD 472 ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと 473 kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する. 491 474 492 475 (2-4-19) OMIT_WARINIG_ALL 493 476 (2-4-20) OMIT_OPTIMIZATION 494 477 495 TvÌMakefileÅÍCRpCÉηéIvVÉu-Wall -g -O2v 496 ðÇÁ·éD-WallðÇÁµ½È¢êÉÍCMakefileÌ^[Qbg˶Š497 OMIT_WARNING_ALLð"true"Éè`·éD-O2ðÇÁµ½È¢êÉÍC 498 MakefileÌ^[Qbg˶ÅOMIT_OPTIMIZATIONð"true"Éè`·éD 499 500 2.5 Nû@ÌÝè 501 502 (2-5-1) LDSCRIPT JXNvgÌt@C¼ 503 504 J«ÉWÌJXNvgªgpÅ«È¢êÉÍC^[Qbg˶ 505 ÅJXNvgðpÓµC»Ìt@C¼ð±ÌÏÉè`·éD 506 507 (2-5-2) TEXT_START_ADDRESS eLXgZNVÌæªÔn 508 (2-5-3) DATA_START_ADDRESS f[^ZNVÌæªÔn 509 510 eZNVÌæªÔnÌwèªKvÈêÉÍC±êçÌÏÉæªÔnð 511 è`·éD 512 513 (2-5-4) START_OBJS æªÉN·×«W 514 [¼ 515 (2-5-5) END_OBJS ÅãÉN·×«W 516 [¼ 517 518 ^[QbgÉæÁÄÍC[hW 519 [ÌæªÆÅãÉN·×«W 520 [ 521 ðC^[Qbg˶ÅpÓ·éKvª éD½ÌêCX^[gAbv 522 W 523 [ð[hW 524 [ÌæªÉN·éKvª éD 525 526 [hW 527 [ÌæªÉN·×«vOª éêÉÍCMakefile 528 Ì^[Qbg˶ɨ¢ÄC»ÌIuWFNgt@C¼ðSTART_OBJSÉè 529 `µC»êÉηéRpC[Æ˶ÖWì¬[ðè`·éD[ 530 hW 531 [ÌÅãÉN·×«W 532 [ª éêÉÍC»ÌIuWF 533 Ngt@C¼ðEND_OBJSÉè`µC»êÉηéRpC[Æ覅 534 Wì¬[ðè`·éDܽCWÌX^[gAbvW 535 [icrt0.oj 536 ðNµÈ¢æ¤ÉCLDFLAGSÉ-nostdlibðÇÁ·éKvª éD³ç 537 ÉC-nostdlibð¯é±ÆÅWCuªN³êÈÈé½ßC 538 LIBSÉ-lgccðÇÁµÈ¯êÎÈçÈ¢D 539 540 á¦ÎCX^[gAbvW 541 [Ì\[Xt@Cªstart.SÌêÉÍC 542 MakefileÌ^[Qbg˶ÉÌæ¤ÈLqðüêéÆæ¢D 478 サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」 479 を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で 480 OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には, 481 Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する. 482 483 2.5 リンク方法の設定 484 485 (2-5-1) LDSCRIPT リンカスクリプトのファイル名 486 487 開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存 488 部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する. 489 490 (2-5-2) TEXT_START_ADDRESS テキストセクションの先頭番地 491 (2-5-3) DATA_START_ADDRESS データセクションの先頭番地 492 493 各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を 494 定義する. 495 496 (2-5-4) START_OBJS 先頭にリンクすべきモジュール名 497 (2-5-5) END_OBJS 最後にリンクすべきモジュール名 498 499 ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきモジュー 500 ルを,ターゲット依存部で用意する必要がある.多くの場合,スタートアップ 501 モジュールをロードモジュールの先頭にリンクする必要がある. 502 503 ロードモジュールの先頭にリンクすべきプログラムがある場合には,Makefile 504 のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定 505 義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー 506 ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ 507 クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関 508 係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o) 509 をリンクしないように,LDFLAGSに-nostdlibを追加する必要がある.さら 510 に,-nostdlibをつけることで標準ライブラリがリンクされなくなるため, 511 LIBSに-lgccを追加しなければならない. 512 513 例えば,スタートアップモジュールのソースファイルがstart.Sの場合には, 514 Makefileのターゲット依存部に次のような記述を入れるとよい. 543 515 544 516 ---------------------------------------- 545 # X^[gAbvW 546 [ÌIuWFNgt@C¼ 517 # スタートアップモジュールのオブジェクトファイル名 547 518 START_OBJS = start.o 548 519 549 # X^[gAbvW 550 [ÌRpC[ 520 # スタートアップモジュールのコンパイルルール 551 521 $(START_OBJS): %.o: %.S 552 522 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< 553 523 554 # X^[gAbvW 555 [Ì˶ÖWì¬[ 524 # スタートアップモジュールの依存関係作成ルール 556 525 $(START_OBJS:.o=.d): %.d: %.S 557 526 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \ 558 527 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend 559 528 560 # JÉηéIvV529 # リンカに対するオプション 561 530 LDFLAGS := -nostdlib $(LDFLAGS) 562 531 LIBS := $(LIBS) -lgcc 563 532 ---------------------------------------- 564 533 565 ܽCGNUJ«ÅCRpCÉWÌcrtbegin.oÆcrtend.oðp¢éê 566 ÉÍCMakefile Ì^[Qbg˶ÉÌæ¤ÈLqðüêéÆæ¢D 534 また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合 535 には,Makefile のターゲット依存部に次のような記述を入れるとよい. 567 536 568 537 ---------------------------------------- 569 # IuWFNgt@C¼538 # オブジェクトファイル名 570 539 START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o) 571 540 END_OBJS = $(shell $(CC) -print-file-name=crtend.o) 572 541 573 # ˶ÖWì¬[542 # 依存関係作成ルール 574 543 $(START_OBJS:.o=.d): %.d: 575 544 $(END_OBJS:.o=.d): %.d: 576 545 577 # JÉηéIvV546 # リンカに対するオプション 578 547 LDFLAGS := -nostdlib $(LDFLAGS) 579 548 LIBS := $(LIBS) -lgcc 580 549 ---------------------------------------- 581 550 582 ±ÌêC±êçÌt@CðRpC·é±ÆÍÈ¢½ßCRpC[ 583 ÍsvÅ éDܽC˶ÖWì¬[Í_~[Åæ¢i˶ÖWì¬[ 584 ªÈ¢ÆG[ÉÈéjD 585 586 (2-5-6) HIDDEN_OBJS wèµÈÄàN³êéW 587 [¼ 588 589 [hW 590 [ÉN·×«W 591 [ðCJÉηép[^Å 592 ÍÈCJXNvgÉiá¦ÎCGNUJ«ÌJXNvgÌ 593 STARTUPðgÁÄjLq·éêÉÍC»ÌIuWFNgt@C¼ðC 594 iSTART_OBJSܽÍEND_OBJSÅÍÈjHIDDEN_OBJSÉè`µC»êÉηéR 595 pC[Æ˶ÖWì¬[ðè`·éDHIDDEN_OBJSÉè`µ½ 596 W 597 [ÍCJÉηép[^©çÍO³êéDLIBSÆLDFLAGSÉ 598 ¢ÄÍCSTART_OBJSܽÍEND_OBJSðp¢éêƯlÅ éD 599 600 á¦ÎCX^[gAbvW 601 [Ì\[Xt@Cªstart.SÅCstart.oð 602 N·é±ÆðJXNvgÉLq·éêÉÍCMakefileÌ^[Qb 603 g˶ÉÌæ¤ÈLqðüêéÆæ¢D 551 この場合,これらのファイルをコンパイルすることはないため,コンパイルルー 552 ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー 553 ルがないとエラーになる). 554 555 (2-5-6) HIDDEN_OBJS 指定しなくてもリンクされるモジュール名 556 557 ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで 558 はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの 559 STARTUPを使って)記述する場合には,そのオブジェクトファイル名を, 560 (START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ 561 ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ 562 ジュールは,リンカに対するパラメータからは除外される.LIBSとLDFLAGSにつ 563 いては,START_OBJSまたはEND_OBJSを用いる場合と同様である. 564 565 例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを 566 リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ 567 ト依存部に次のような記述を入れるとよい. 604 568 605 569 ---------------------------------------- 606 # X^[gAbvW 607 [ÌIuWFNgt@C¼ 570 # スタートアップモジュールのオブジェクトファイル名 608 571 HIDDEN_OBJS = start.o 609 572 610 # X^[gAbvW 611 [ÌRpC[ 573 # スタートアップモジュールのコンパイルルール 612 574 $(HIDDEN_OBJS): %.o: %.S 613 575 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< 614 576 615 # X^[gAbvW 616 [Ì˶ÖWì¬[ 577 # スタートアップモジュールの依存関係作成ルール 617 578 $(HIDDEN_OBJS:.o=.d): %.d: %.S 618 579 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \ 619 580 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend 620 581 621 # JÉηéIvV582 # リンカに対するオプション 622 583 LDFLAGS := -nostdlib $(LDFLAGS) 623 584 LIBS := $(LIBS) -lgcc 624 585 ---------------------------------------- 625 586 626 2.6 ˶ÖWÌè` 627 628 RtBM 629 [^ÌepXÉεÄC^[Qbg˶Ìt@CÖÌ覅 630 Wðè`·éDïÌIÉÍCpX1CpX2CpX3ªË¶·ét@CðC»ê 631 ¼êcfg1_out.cCkernel_cfg.timestampC$(OBJFILE)Éηé˶ÖWÌ`Å 632 Lq·éD 633 634 ÙÆñÇÌêÉC^[Qbg˶fBNgÌMakefile.targetÉÍCÈ 635 ºÌLqðÜßéKvª éD 587 2.6 依存関係の定義 588 589 コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関 590 係を定義する.具体的には,パス1,パス2,パス3が依存するファイルを,それ 591 ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で 592 記述する. 593 594 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 595 下の記述を含める必要がある. 636 596 637 597 ---------------------------------------- … … 641 601 ---------------------------------------- 642 602 643 2.7 »Ì¼ÌÝè644 645 (2-7-1) CLEAN_FILES clean Éæèí·ét@C¼646 647 clean Éæèí·ét@Cð^[Qbg˶ÅÇÁµ½¢êÉÍCt@648 C¼ð±ÌÏÉÇÁè`·éD 649 650 (2-7-2) REALCLEAN_FILES realclean Éæèí·ét@C¼651 652 realclean Éæèí·ét@Cð^[Qbg˶ÅÇÁµ½¢êÉÍC653 t@C¼ð±ÌÏÉÇÁè`·éD 654 655 656 3. TOPPERS ¤Êè`Ì^[Qbg˶657 658 TOPPERS ¤Êè`it_stddef.hjÌ^[Qbg˶ÍCtarget_stddef.hܽ659 Í»±©çCN[h³êét@CivZbTE`bvEJ«˶ 660 ÅpÓ³êéwb_t@CÈÇjÉÜßéD 661 662 3.1 ^[Qbg¯Ê}N663 664 AvP[VâVXeT[rXÅ^[Qbgð¯Ê·é½ßÉC 665 "TOPPERS_" ÉVXeªÌðå¶Éµ½¶ñðAµ½àÌiá¦ÎC666 "TOPPERS_DVE68K" jð}Nè`·éD667 668 ܽC^[Qbg˶©çvZbT˶â`bv˶ðØ誯½ê 669 ÉÍC"TOPPERS_"É˶ªÌðå¶Éµ½¶ñðAµ½àÌiᦠ670 ÎC"TOPPERS_M68K"jð}Nè`·éD 671 672 3.2 ®^ÌÅålEŬlErbg673 674 (3-2-1) INT_MAX int Éi[Å«éÅåliC90j675 (3-2-2) INT_MIN int Éi[Å«éŬliC90j676 (3-2-3) UINT_MAX unsigned int Éi[Å«éÅåliC90j677 (3-2-4) LONG_MAX long Éi[Å«éÅåliC90j678 (3-2-5) LONG_MIN long Éi[Å«éŬliC90j679 (3-2-6) ULONG_MAX unsigned long Éi[Å«éÅåliC90j680 (3-2-7) CHAR_BIT char ^ÌrbgiC90j681 682 ®^ÌÅålEŬlErbgðC±êçÌV{É}NÉè`·éD 683 684 ±êçÌ}NÍCC90ɵ½àÌÅ éDJ«ÉC90ɵ½ 685 limits.h ªpÓ³êÄ¢éêÉÍC±êçÌ}Nðè`·é±ÆÉã¦ÄC686 limits.h ðCN[h·êÎæ¢D687 688 3.3 TCYÌwè³ê½®^C»ÌÅålEŬlC®èðìé}N689 690 (3-3-1) int8_t t«8rbg®iIvVCC99j691 (3-3-2) uint8_t ³µ8rbg®iIvVCC99j692 (3-3-3) int16_t t«16rbg®iC99j693 (3-3-4) uint16_t ³µ16rbg®iC99j694 (3-3-5) int32_t t«32rbg®iC99j695 (3-3-6) uint32_t ³µ32rbg®iC99j696 (3-3-7) int64_t t«64rbg®iIvVCC99j697 (3-3-8) uint64_t ³µ64rbg®iIvVCC99j698 (3-3-9) int128_t t«128rbg®iIvVCC99j699 (3-3-10) uint128_t ³µ128rbg®iIvVCC99j700 (3-3-11) int_least8_t 8 rbgÈãÌt«®iC99j701 (3-3-12) uint_least8_t 8 rbgÈã̳µ®iC99j702 (3-3-13) intptr_t |C^ði[Å«éTCYÌt«®iC99j703 (3-3-14) uintptr_t |C^ði[Å«éTCY̳µ®iC99j704 (3-3-15) INT8_MAX int8_t Éi[Å«éÅåliIvVCC99j705 (3-3-16) INT8_MIN int8_t Éi[Å«éŬliIvVCC99j706 (3-3-17) UINT8_MAX uint8_t Éi[Å«éÅåliIvVCC99j707 (3-3-18) INT16_MAX int16_t Éi[Å«éÅåliC99j708 (3-3-19) INT16_MIN int16_t Éi[Å«éŬliC99j709 (3-3-20) UINT16_MAX uint16_t Éi[Å«éÅåliC99j710 (3-3-21) INT32_MAX int32_t Éi[Å«éÅåliC99j711 (3-3-22) INT32_MIN int32_t Éi[Å«éŬliC99j712 (3-3-23) UINT32_MAX uint32_t Éi[Å«éÅåliC99j713 (3-3-24) INT64_MAX int64_t Éi[Å«éÅåliIvVCC99j714 (3-3-25) INT64_MIN int64_t Éi[Å«éŬliIvVCC99j715 (3-3-26) UINT64_MAX uint64_t Éi[Å«éÅåliIvVCC99j716 (3-3-27) INT128_MAX int128_t Éi[Å«éÅåliIvVCC99j717 (3-3-28) INT128_MIN int128_t Éi[Å«éŬliIvVCC99j718 (3-3-29) UINT128_MAX uint128_t Éi[Å«éÅåliIvVCC99j719 (3-3-30) INT_LEAST8_MAX int_least8_t Éi[Å«éÅåliC99j720 (3-3-31) INT_LEAST8_MIN int_least8_t Éi[Å«éŬliC99j721 (3-3-32) UINT_LEAST8_MAX uint_least8_t Éi[Å«éÅåliC99j722 (3-3-33) INT8_C(val) int_least8_t ^Ìèðìé}NiC99j723 (3-3-34) UINT8_C(val) uint_least8_t ^Ìèðìé}NiC99j724 (3-3-35) INT16_C(val) int16_t ^Ìèðìé}NiC99j725 (3-3-36) UINT16_C(val) uint16_t ^Ìèðìé}NiC99j726 (3-3-37) INT32_C(val) int32_t ^Ìèðìé}NiC99j727 (3-3-38) UINT32_C(val) uint32_t ^Ìèðìé}NiC99j728 (3-3-39) INT64_C(val) int64_t ^Ìèðìé}NiIvVCC99j729 (3-3-40) UINT64_C(val) uint64_t ^Ìèðìé}NiIvVCC99j730 (3-3-41) INT128_C(val) int128_t ^Ìèðìé}NiIvVCC99j731 (3-3-42) UINT128_C(val) uint128_t ^Ìèðìé}NiIvVCC99j732 733 wè³ê½TCYÌ®^ðC±êçÌV{É^è`·éDܽCf[^ 734 ^Éi[Å«éÅålEŬlÆC®èðìé}NðC±êçÌV{ 735 É}Nè`·éD 736 737 ±êçÌf[^^¨æÑ}NÍCC99ɵ½àÌÅ éDJ«ÉC99738 ɵ½stdint.hªpÓ³êÄ¢éêÉÍC±êçÌf[^^¨æÑ}N 739 ðè`·é±ÆÉã¦ÄCstdint.hðCN[h·êÎæ¢D 740 741 ãÅIvVÆLqµ½àÌÍCY·éf[^^ªRpCÅT|[g 742 ³êÄ¢éêÉÌÝè`·é±Æð¦·D 743 744 3.4 TCYÌwè³ê½®¬_^C»ÌÅålEŬlÌ}N745 746 (3-4-1) float32_t IEEE754 Ì32rbgP¸x®¬_iIv747 Vj748 (3-4-2) double64_t IEEE754 Ì64rbg{¸x®¬_iIv749 Vj750 (3-4-3) FLOAT32_MIN float32_t Éi[Å«éŬ̳K»³ê½³Ì751 ®¬_iIvVj752 (3-4-4) FLOAT32_MAX float32_t Éi[Å«é\»Â\ÈÅåÌLÀ®753 ¬_iIvVj754 (3-4-5) DOUBLE64_MIN double64_t Éi[Å«éŬ̳K»³ê½³Ì755 ®¬_iIvVj756 (3-4-6) DOUBLE64_MAX double64_t Éi[Å«é\»Â\ÈÅåÌLÀ®757 ¬_iIvVj758 759 wè³ê½TCYE\»`®Ì®¬_^ðC±êçÌV{É^è`· 760 éDܽCf[^^Éi[Å«éÅålEŬlðC±êçÌV{É}N 761 è`·éD 762 763 ¢¸êàCY·éf[^^ªRpCÅT|[g³êÄ¢éêÉÌÝè 764 `·éD 765 766 3.5 RpCÌg£@\̽ßÌ}Nè`767 768 RpCÌg£@\ðp¢é½ßÌ}NƵÄCKvɶÄCȺÌ} 769 NÌè`ðÜßéD 770 771 (3-5-1) inline iIvVCftHgÍ¢è`j772 (3-5-2) Inline iIvVCftHgÍstatic inlinej773 774 CCÖÅ é±Æð¦·wèDInlineÍCRpCPÊÉ[J 775 ÈCCÖÅ é±Æð¦·D 776 777 (3-5-3) asm iIvVCftHgÍ¢è`j778 (3-5-4) Asm iIvVCftHgÍ¢è`j779 780 CCAZuðLq·é½ßÌwèDAsmÍCÅK»ÉæèíµÄÍ 781 ÈçÈ¢±Æð¦·D±êçÍC^[Qbg˶ÅÌÝg¤}NÅ é½ 782 ßC^[Qbg˶ÅgíÈ¢Èçè`·éKvÍÈ¢D 783 784 (3-5-5) offsetof(structure, field) iIvVCftHgÌè` èj785 786 \¢ÌstructureÌÅÌCtB[hfieldÌItZbgðßé}ND 787 788 (3-5-6) alignof(type) iIvVCftHgÌè` èj789 790 f[^^typeÌACgPÊðßé}ND 791 792 (3-5-7) NoReturn iIvVCftHgÍ¢è`j793 794 ^[·é±ÆÌÈ¢ÖÅ é±Æð¦·wèD±êÍC^[Qbg˶ 795 ÌÝg¤}NÅ é½ßC^[Qbg˶ÅgíÈ¢Èçè`·éKv 796 ÍÈ¢D 797 798 3.6 WIÈè`Ìã«799 800 t_stddef.h ÉÜÜêéTOPPERS¤Êè`ÌWIÈè`ðã«·éêÉÍC801 ȺÌ}Nðè`·éD 802 803 (3-6-1) TOPPERS_bool iIvVCftHgÍintj804 (3-6-2) TOPPERS_size iIvVCftHgÍuintptr_tj805 (3-6-3) TOPPERS_fp iIvVCftHgͼÆÝ·«ÌÈ¢Ö|C^j806 807 »ê¼êCbool_tCSIZECFPÉ^è`·×«f[^^D 808 809 (3-6-4) UINT_C(val) iIvVCftHgÍUðtÁj810 (3-6-5) ULONG_C(val) iIvVCftHgÍULðtÁj811 812 »ê¼êCunsigned uint^Cunsigned long^Ìèðìé½ßÌ}ND 813 814 (3-6-6) NULL iIvVCftHgÍ0j815 816 C90 ÌC¾ê«ÅÍCNULLÌè`Ístddef.hÉÜÜêÄ¢é½ßC±êð817 CN[hµÄàæ¢D 818 819 (3-6-7) ERCD(mercd, sercd) iIvVj820 (3-6-8) MERCD(ercd) iIvVj821 (3-6-9) SERCD(ercd) iIvVj822 823 ERCD CMERCDCSERCDÌWÌè`ÍCt«®ª2ÌâÅ\»³êĨèC824 EVtgZqi>>jªZpVtg³êé±Æð¼èµÄ¢éD½ÌRp 825 Cű̼説è§ÂªC»¤ÅÈ¢êÉÍC^[Qbg˶űê 826 çÌè`ðã«·éKvª éD 827 828 (3-6-10) ALIGN_TYPE(addr, type) iIvVj829 830 AhXaddrªCf[^^typeÌACgPÊÉACµÄ¢é© 831 `FbN·é}ND 832 833 3.7 AT[V̽ßÌè`834 835 t_stddef.h ÉÍCassertÌè`ªÜÜêéDassertª¸sµ½êiassertÌ836 p[^ªfalseÉÈÁ½êjÌðC^[Qbg˶ÉpÓ·éKvª 837 éD±êçÌè`ÍCassert}Nðgp·éOÅ êÎCt_stddef.hÈ~ 838 ÉCN[h³êét@CÉÜÜêÄ¢Äàæ¢DȨCassertð³øÉ 839 ·éiNDEBUGð}Nè`µÄRpC·éjêÉÍC±êçðpÓ·é 840 KvÍÈ¢D 603 2.7 その他の設定 604 605 (2-7-1) CLEAN_FILES cleanにより削除するファイル名 606 607 cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ 608 イル名をこの変数に追加定義する. 609 610 (2-7-2) REALCLEAN_FILES realcleanにより削除するファイル名 611 612 realcleanにより削除するファイルをターゲット依存部で追加したい場合には, 613 ファイル名をこの変数に追加定義する. 614 615 616 3. TOPPERS共通定義のターゲット依存部 617 618 TOPPERS共通定義(t_stddef.h)のターゲット依存部は,target_stddef.hまた 619 はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存 620 部で用意されるヘッダファイルなど)に含める. 621 622 3.1 ターゲット識別マクロ 623 624 アプリケーションやシステムサービスでターゲットを識別するために, 625 "TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば, 626 "TOPPERS_DVE68K")をマクロ定義する. 627 628 また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場 629 合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え 630 ば,"TOPPERS_M68K")をマクロ定義する. 631 632 3.2 整数型の最大値・最小値・ビット数 633 634 (3-2-1) INT_MAX intに格納できる最大値(C90準拠) 635 (3-2-2) INT_MIN intに格納できる最小値(C90準拠) 636 (3-2-3) UINT_MAX unsigned intに格納できる最大値(C90準拠) 637 (3-2-4) LONG_MAX longに格納できる最大値(C90準拠) 638 (3-2-5) LONG_MIN longに格納できる最小値(C90準拠) 639 (3-2-6) ULONG_MAX unsigned longに格納できる最大値(C90準拠) 640 (3-2-7) CHAR_BIT char型のビット数(C90準拠) 641 642 整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する. 643 644 これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した 645 limits.hが用意されている場合には,これらのマクロを定義することに代えて, 646 limits.hをインクルードすればよい. 647 648 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ 649 650 (3-3-1) int8_t 符号付き8ビット整数(オプション,C99準拠) 651 (3-3-2) uint8_t 符号無し8ビット整数(オプション,C99準拠) 652 (3-3-3) int16_t 符号付き16ビット整数(C99準拠) 653 (3-3-4) uint16_t 符号無し16ビット整数(C99準拠) 654 (3-3-5) int32_t 符号付き32ビット整数(C99準拠) 655 (3-3-6) uint32_t 符号無し32ビット整数(C99準拠) 656 (3-3-7) int64_t 符号付き64ビット整数(オプション,C99準拠) 657 (3-3-8) uint64_t 符号無し64ビット整数(オプション,C99準拠) 658 (3-3-9) int128_t 符号付き128ビット整数(オプション,C99準拠) 659 (3-3-10) uint128_t 符号無し128ビット整数(オプション,C99準拠) 660 (3-3-11) int_least8_t 8ビット以上の符号付き整数(C99準拠) 661 (3-3-12) uint_least8_t 8ビット以上の符号無し整数(C99準拠) 662 (3-3-13) intptr_t ポインタを格納できるサイズの符号付き整数(C99準拠) 663 (3-3-14) uintptr_t ポインタを格納できるサイズの符号無し整数(C99準拠) 664 (3-3-15) INT8_MAX int8_tに格納できる最大値(オプション,C99準拠) 665 (3-3-16) INT8_MIN int8_tに格納できる最小値(オプション,C99準拠) 666 (3-3-17) UINT8_MAX uint8_tに格納できる最大値(オプション,C99準拠) 667 (3-3-18) INT16_MAX int16_tに格納できる最大値(C99準拠) 668 (3-3-19) INT16_MIN int16_tに格納できる最小値(C99準拠) 669 (3-3-20) UINT16_MAX uint16_tに格納できる最大値(C99準拠) 670 (3-3-21) INT32_MAX int32_tに格納できる最大値(C99準拠) 671 (3-3-22) INT32_MIN int32_tに格納できる最小値(C99準拠) 672 (3-3-23) UINT32_MAX uint32_tに格納できる最大値(C99準拠) 673 (3-3-24) INT64_MAX int64_tに格納できる最大値(オプション,C99準拠) 674 (3-3-25) INT64_MIN int64_tに格納できる最小値(オプション,C99準拠) 675 (3-3-26) UINT64_MAX uint64_tに格納できる最大値(オプション,C99準拠) 676 (3-3-27) INT128_MAX int128_tに格納できる最大値(オプション,C99準拠) 677 (3-3-28) INT128_MIN int128_tに格納できる最小値(オプション,C99準拠) 678 (3-3-29) UINT128_MAX uint128_tに格納できる最大値(オプション,C99準拠) 679 (3-3-30) INT_LEAST8_MAX int_least8_tに格納できる最大値(C99準拠) 680 (3-3-31) INT_LEAST8_MIN int_least8_tに格納できる最小値(C99準拠) 681 (3-3-32) UINT_LEAST8_MAX uint_least8_tに格納できる最大値(C99準拠) 682 (3-3-33) INT8_C(val) int_least8_t型の定数を作るマクロ(C99準拠) 683 (3-3-34) UINT8_C(val) uint_least8_t型の定数を作るマクロ(C99準拠) 684 (3-3-35) INT16_C(val) int16_t型の定数を作るマクロ(C99準拠) 685 (3-3-36) UINT16_C(val) uint16_t型の定数を作るマクロ(C99準拠) 686 (3-3-37) INT32_C(val) int32_t型の定数を作るマクロ(C99準拠) 687 (3-3-38) UINT32_C(val) uint32_t型の定数を作るマクロ(C99準拠) 688 (3-3-39) INT64_C(val) int64_t型の定数を作るマクロ(オプション,C99準拠) 689 (3-3-40) UINT64_C(val) uint64_t型の定数を作るマクロ(オプション,C99準拠) 690 (3-3-41) INT128_C(val) int128_t型の定数を作るマクロ(オプション,C99準拠) 691 (3-3-42) UINT128_C(val) uint128_t型の定数を作るマクロ(オプション,C99準拠) 692 693 指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ 694 型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ 695 ルにマクロ定義する. 696 697 これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99 698 に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク 699 ロを定義することに代えて,stdint.hをインクルードすればよい. 700 701 上でオプションと記述したものは,該当するデータ型がコンパイラでサポート 702 されている場合にのみ定義することを示す. 703 704 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ 705 706 (3-4-1) float32_t IEEE754準拠の32ビット単精度浮動小数点数(オプ 707 ション) 708 (3-4-2) double64_t IEEE754準拠の64ビット倍精度浮動小数点数(オプ 709 ション) 710 (3-4-3) FLOAT32_MIN float32_tに格納できる最小の正規化された正の浮 711 動小数点数(オプション) 712 (3-4-4) FLOAT32_MAX float32_tに格納できる表現可能な最大の有限浮動 713 小数点数(オプション) 714 (3-4-5) DOUBLE64_MIN double64_tに格納できる最小の正規化された正の浮 715 動小数点数(オプション) 716 (3-4-6) DOUBLE64_MAX double64_tに格納できる表現可能な最大の有限浮動 717 小数点数(オプション) 718 719 指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す 720 る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク 721 ロ定義する. 722 723 いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定 724 義する. 725 726 3.5 コンパイラの拡張機能のためのマクロ定義 727 728 コンパイラの拡張機能を用いるためのマクロとして,必要に応じて,以下のマ 729 クロの定義を含める. 730 731 (3-5-1) inline(オプション,デフォルトは未定義) 732 (3-5-2) Inline(オプション,デフォルトはstatic inline) 733 734 インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル 735 なインライン関数であることを示す. 736 737 (3-5-3) asm(オプション,デフォルトは未定義) 738 (3-5-4) Asm(オプション,デフォルトは未定義) 739 740 インラインアセンブラを記述するための指定.Asmは,最適化により削除しては 741 ならないことを示す.これらは,ターゲット依存部でのみ使うマクロであるた 742 め,ターゲット依存部で使わないなら定義する必要はない. 743 744 (3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり) 745 746 構造体structureの中での,フィールドfieldのオフセットを求めるマクロ. 747 748 (3-5-6) alignof(type)(オプション,デフォルトの定義あり) 749 750 データ型typeのアラインメント単位を求めるマクロ. 751 752 (3-5-7) NoReturn(オプション,デフォルトは未定義) 753 754 リターンすることのない関数であることを示す指定.これは,ターゲット依存 755 部のみ使うマクロであるため,ターゲット依存部で使わないなら定義する必要 756 はない. 757 758 3.6 標準的な定義の上書き 759 760 t_stddef.hに含まれるTOPPERS共通定義の標準的な定義を上書きする場合には, 761 以下のマクロを定義する. 762 763 (3-6-1) TOPPERS_bool(オプション,デフォルトはint) 764 (3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t) 765 (3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ) 766 767 それぞれ,bool_t,SIZE,FPに型定義すべきデータ型. 768 769 (3-6-4) UINT_C(val)(オプション,デフォルトはUを付加) 770 (3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加) 771 772 それぞれ,unsigned uint型,unsigned long型の定数を作るためのマクロ. 773 774 (3-6-6) NULL(オプション,デフォルトは0) 775 776 C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを 777 インクルードしてもよい. 778 779 (3-6-7) ERCD(mercd, sercd)(オプション) 780 (3-6-8) MERCD(ercd)(オプション) 781 (3-6-9) SERCD(ercd)(オプション) 782 783 ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており, 784 右シフト演算子(>>)が算術シフトされることを仮定している.多くのコンパ 785 イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ 786 らの定義を上書きする必要がある. 787 788 (3-6-10) ALIGN_TYPE(addr, type)(オプション) 789 790 アドレスaddrが,データ型typeのアラインメント単位にアラインしているか 791 チェックするマクロ. 792 793 3.7 アサーションのための定義 794 795 t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの 796 パラメータがfalseになった場合)の処理を,ターゲット依存に用意する必要が 797 ある.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降 798 にインクルードされるファイルに含まれていてもよい.なお,assertを無効に 799 する(NDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する 800 必要はない. 841 801 842 802 (3-7-1) TOPPERS_assert_abort(void) 843 803 844 assert ª¸sµ½êÉCvOðâ~³¹éÖDVXeJÍf845 obKÉƷ̪zIÅ éDVXeÒÉÍáOðsí¹é± 846 ÆÉÈéD 847 848 {Öð³À[vÅÀ·éÛÍCȺÌ`®Æ·é±Æ(TECSÌp[TÌ 849 §ÀÉí¹é½ßjD 804 assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ 805 バッガに落とすのが理想的である.システム稼働時には例外処理を行わせるこ 806 とになる. 807 808 本関数を無限ループで実装する際は,以下の形式とすること(TECSのパーサの 809 制限に合わせるため). 850 810 851 811 Inline void … … 859 819 (3-7-2) TOPPERS_assert_fail(exp, file, line) 860 820 861 assert ª¸sµ½Ìîñð\¦/L^·é½ßÌ}NDVXeO@\ð862 p¢éêÉÍCt_syslog.hÉVXeO@\ÉL^·é½ßÌè`ªÜÜ 863 êÄ¢éÌÅC^[Qbg˶ÅpÓ·éKvÍÈ¢D 864 865 866 4. VXeC^tF[XCiSILjÌ^[Qbg˶867 868 VXeC^tF[XCiSILCsil.hjÌ^[Qbg˶Ìè`ÍC 869 target_sil.h ܽͻ±©çCN[h³êét@CivZbTE`b870 vEJ«˶ÅpÓ³êéwb_t@CÈÇjÉÜßéD 871 872 SIL ÌT[rXR[ÍCCÓÌVXeóÔÅÄÑo·±ÆªÅ«éD»Ì½873 ßCSILÌ^[Qbg˶ÌÖÍCCÓÌVXeóÔÅÄÑo¹éæ¤É 874 ÀµÈ¯êÎÈçÈ¢D 875 876 4.1 SÝbNóÔÌÇ877 878 SIL Ì^[Qbg˶ÅÍCSÝbNóÔÖJÚ·é@\ÆC³ÌóÔ879 Öß·@\i³ÌóÔðL¯·é½ßÉÏðg¤jðñ·éDSÝb 880 NóÔÅ é©ð»Ê·é@\Íñ·éKvªÈ¢D 881 882 SIL Ì@\ÍCJ[lðgpµÈ¢êÉàgpÅ«éKvª éD»Ì½ßC883 SÝbNóÔÖÌJÚƳÌóÔÖÌAÍCJ[lðp¢¸Cv 884 ZbTÌ\[Xð¼Úì·é±ÆÉæÁÄÀ»·éDܽCSÝb 885 NóÔÖÌJÚƳÌóÔÖÌAÍCSÝbNóÔâCPUbNóÔÅ 886 às¦éKvª éD 887 888 Ûì@\ðÁ½J[lÅÍC[U^XN©çvZbTÌ\[Xð¼ 889 Úì·é±ÆªÅ«È¢½ßC[U^XN©çͱêçÌ@\ðp¢é± 890 ƪūȢDp¢½êÌU¢Í^[QbgvZbTÉ˶·éªCT 891 ^IÉÍCÁ ½ßá½ÈÇÌCPUáOª¶·é±ÆÉÈéD 821 assertが失敗した時の情報を表示/記録するためのマクロ.システムログ機能を 822 用いる場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま 823 れているので,ターゲット依存部で用意する必要はない. 824 825 826 4. システムインタフェースレイヤ(SIL)のターゲット依存部 827 828 システムインタフェースレイヤ(SIL,sil.h)のターゲット依存部の定義は, 829 target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ 830 プ・開発環境依存部で用意されるヘッダファイルなど)に含める. 831 832 SILのサービスコールは,任意のシステム状態で呼び出すことができる.そのた 833 め,SILのターゲット依存部の関数は,任意のシステム状態で呼び出せるように 834 実装しなければならない. 835 836 4.1 全割込みロック状態の管理 837 838 SILのターゲット依存部では,全割込みロック状態へ遷移する機能と,元の状態 839 へ戻す機能(元の状態を記憶するために変数を使う)を提供する.全割込みロッ 840 ク状態であるかを判別する機能は提供する必要がない. 841 842 SILの機能は,カーネルを使用しない場合にも使用できる必要がある.そのため, 843 全割込みロック状態への遷移と元の状態への復帰は,カーネルを用いず,プロ 844 セッサのリソースを直接操作することによって実現する.また,全割込みロッ 845 ク状態への遷移と元の状態への復帰は,全割込みロック状態やCPUロック状態で 846 も行える必要がある. 847 848 保護機能を持ったカーネルでは,ユーザタスクからプロセッサのリソースを直 849 接操作することができないため,ユーザタスクからはこれらの機能を用いるこ 850 とができない.用いた場合の振舞いはターゲットプロセッサに依存するが,典 851 型的には,特権命令違反などのCPU例外が発生することになる. 892 852 893 853 (4-1-1) SIL_PRE_LOC 894 854 895 SÝbNtOÌóÔðÛ¶·é½ßÌÏðè`·é}ND^¼Ì 896 ãÉCϼ𱯽àÌÉè`·éDϼÍC¼Ì¼OÆÕËµÈ¢æ¤ 897 ÉC"TOPPERS_"ÅnÜé¼OÉ·éD 855 全割込みロックフラグの状態を保存するための変数を定義するマクロ.型名の 856 後に,変数名を続けたものに定義する.変数名は,他の名前と衝突しないよう 857 に,"TOPPERS_"で始まる名前にする. 898 858 899 859 (4-1-2) SIL_LOC_INT() 900 860 901 »ÝÌSÝbNtOÌóÔðSIL_PRE_LOCÅè`µ½ÏÉÛ¶µCS 902 ÝbNóÔÉJÚ³¹é}ND±Ì}NðÀ»·éÛÉÍCu1.6903 NeBJZNVÌoüÌÀ»ÉÖ·é§ñvÌßÉLq³êÄ¢ 904 é§ñÉ]íȯêÎÈçÈ¢D 861 現在の全割込みロックフラグの状態をSIL_PRE_LOCで定義した変数に保存し,全 862 割込みロック状態に遷移させるマクロ.このマクロを実現する際には,「1.6 863 クリティカルセクションの出入処理の実現に関する制約」の節に記述されてい 864 る制約に従わなければならない. 905 865 906 866 (4-1-3) SIL_UNL_INT() 907 867 908 SIL_LOC_INT() ÉæÁÄÏÉÛ¶µ½óÔÉß·}ND±Ì}NðÀ»·909 éÛÉÍCu1.6 NeBJZNVÌoüÌÀ»ÉÖ·é§ñvÌ 910 ßÉLq³êÄ¢é§ñÉ]íȯêÎÈçÈ¢D 911 912 4.2 ÷ÔÒ¿868 SIL_LOC_INT()によって変数に保存した状態に戻すマクロ.このマクロを実現す 869 る際には,「1.6 クリティカルセクションの出入処理の実現に関する制約」の 870 節に記述されている制約に従わなければならない. 871 872 4.2 微少時間待ち 913 873 914 874 (4-2-1) void sil_dly_nse(ulong_t dlytim) 915 875 916 dlytimÅwè³ê½ÈãÌÔiPÊÍimbjC[vÈÇÉæÁÄÒÂÖ 917 D 918 919 ȺÌÖÆ¿ÈðCAZu¾êÅLq·éû@ðCWIÈÀ 920 û@Æ·éDAZu¾êÅLq·éÌÍCRpCÌÅK»É˶µÈ 921 ¢æ¤É·é½ßÅ éDܽ±ÌÖÍCLbV 922 Ìe¿ðó¯È¢æ 923 ¤ÉCÅ«éÀèANZXðsíÈ¢æ¤ÉÀ·×«Å éD 876 dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ関 877 数. 878 879 以下の関数と等価な処理を,アセンブリ言語で記述する方法を,標準的な実装 880 方法とする.アセンブリ言語で記述するのは,コンパイラの最適化に依存しな 881 いようにするためである.またこの関数は,キャッシュ等の影響を受けないよ 882 うに,できる限りメモリアクセスを行わないように実装すべきである. 924 883 925 884 void sil_dly_nse(ulong_t dlytim) 926 885 { 927 886 dlytim -= SIL_DLY_TIM1; 928 if ( ʪ0æèå«¢) {887 if (結果が0より大きい) { 929 888 do { 930 889 dlytim -= SIL_DLY_TIM2; 931 } while ( ʪ0æèå«¢);890 } while (結果が0より大きい); 932 891 } 933 892 } 934 893 935 ±ÌÖÌ®ìÍÌÊèÅ éDdlytimªSIL_DLY_TIM1ȺÌêÉÍCÅ 936 Ìif¶Ì𪬧¹¸C·®É֩粯éDdlytimªSIL_DLY_TIM1æ 937 èå«C(SIL_DLY_TIM1+SIL_DLY_TIM2)ȺÌêÉÍCÅÌif¶ÌðÍ 938 ¬§·éªCdo[vÍ1ñàñç¸É֩粯éDdlytimª 939 (SIL_DLY_TIM1+SIL_DLY_TIM2)æèå«C(SIL_DLY_TIM1+SIL_DLY_TIM2*2)È 940 ºÌêÉÍCdo[vð1ñ¾¯ñÁÄ֩粯éD»ÌãCdlytimª 941 SIL_DLY_TIM2å«ÈéxÉCwhile[vðñéñª1ñ¸Â¦éD 942 943 ȨC±ÌÖðAZu¾êiܽÍCC¾êjÅLq·éêCÇÌt@ 944 CÉLq·é©ªâèÉÈéDSILÌ^[Qbg˶ÉÍCWÅÍCAZ 945 u¾êiܽÍCC¾êjÌÖè`ðLq·é½ßÌt@Cðp 946 ¢È¢D^[Qbg˶ÅpÓµÄà梪CáOIÉCJ[lÀÌ^[ 947 Qbg˶W 948 [itarget_support.SܽÍtarget_config.cjÉLqµÄ 949 à梱ÆÉ·éD 950 951 (4-2-2) SIL_DLY_TIM1iIvVj 952 (4-2-3) SIL_DLY_TIM2iIvVj 953 954 sil_dly_nseðãLÌWIÈû@ÅÀ»µ½êC±Ì2ÂÌèð^[Qb 955 g˶Å}Nè`·éD 956 957 SIL_DLY_TIM2ÍCãLÌÖɨ¢ÄCdo[v1ñÌÀsÔiPÊÍimbj 958 ÉÝè·éD^[QbgvZbT̽ßZbgÉàæéªC¨¨æ»C¸Z 959 ½ßÆðªò½ße1ñÌÀsÔÉÈéDSIL_DLY_TIM2ªÜêÎCÖÄ 960 oµàÜß½SÌÌÔªdlytimÅwè³ê½ÈãÌÔÉÈéæ¤ÉC 961 SIL_DLY_TIM1ðßéD 962 963 ¦ºLÌàeÍC»_ÅSSPJ[lÅÍ¢T|[gÅ éD 964 965 ±Ì2ÂÌèlÌèðx·évOƵÄCtestfBNgÉC 966 test_dlynseðpӵĢéDtest_dlynseðÀs·éÆCÌæ¤Èoͪ¾ 967 çêéD 894 この関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最 895 初のif文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ 896 り大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は 897 成立するが,doループは1回も回らずに関数から抜ける.dlytimが 898 (SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以 899 下の場合には,doループを1回だけ回って関数から抜ける.その後,dlytimが 900 SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える. 901 902 なお,この関数をアセンブリ言語(または,C言語)で記述する場合,どのファ 903 イルに記述するかが問題になる.SILのターゲット依存部には,標準では,アセ 904 ンブリ言語(または,C言語)の関数定義を記述するためのファイルを用意して 905 いない.ターゲット依存で用意してもよいが,例外的に,カーネル実装のター 906 ゲット依存モジュール(target_support.Sまたはtarget_config.c)に記述して 907 もよいことにする. 908 909 (4-2-2) SIL_DLY_TIM1(オプション) 910 (4-2-3) SIL_DLY_TIM2(オプション) 911 912 sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ 913 ト依存部でマクロ定義する. 914 915 SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒) 916 に設定する.ターゲットプロセッサの命令セットにもよるが,おおよそ,減算 917 命令と条件分岐命令各1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼 918 出しも含めた全体の時間がdlytimで指定された以上の時間になるように, 919 SIL_DLY_TIM1を決める. 920 921 ※下記の内容は,現時点でSSPカーネルでは未サポートである. 922 923 この2つの定数値の決定を支援するプログラムとして,testディレクトリに, 924 test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得 925 られる. 968 926 969 927 -- for fitting parameters -- … … 972 930 sil_dly_nse(510): 520 OK 973 931 sil_dly_nse(600): 610 OK 974 < ª>932 <中略> 975 933 -- for checking boundary conditions -- 976 934 sil_dly_nse(421): 520 OK … … 978 936 sil_dly_nse(601): 700 OK 979 937 980 "for fitting parameters" ɱoÍÍCsil_dly_nse(dlytim)ðÄÑoµ½ê981 ÌÒ¿Ôðªèµ½ÊÅ éD±ÌvOðp¢ÄC":"ÌE¤Ì 982 lªCdlytimæèàå«¢ÍÍÅÈé×ߢlÉÈéæ¤ÉC2ÂÌèlð 983 ²®·éD"for checking boundary conditions"ɱoÍÍCvOÌ 984 ëð`FbN·é½ßÌàÌÅC":"ÌE¤ÌlªCdlytimæèàå«¢ 985 ±ÆðmF·éiߢlÉÈéKvÍÈ¢jD 986 987 4.3 vZbTÌGfBA938 "for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場 939 合の待ち時間を測定した結果である.このプログラムを用いて,":"の右側の数 940 値が,dlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を 941 調整する."for checking boundary conditions"に続く出力は,プログラムの 942 妥当性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい 943 ことを確認する(近い値になる必要はない). 944 945 4.3 プロセッサのエンディアン 988 946 989 947 (4-3-1) SIL_ENDIAN_BIG 990 948 (4-3-2) SIL_ENDIAN_LITTLE 991 949 992 vZbTÌGfBAÉæèC¢¸ê©ÐûÌV{ð}Nè`·éD 993 994 (4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16 iIvVj995 (4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32 iIvVj996 997 »ê¼êC16rbgC32rbg̳µ®ÌGfBAð½]³¹é} 998 NDvZbTªGfBA½]̽ß̽ßðÂêÉÍC»Ì½ß 999 ðp¢ÄÀ»·éD±êçÌV{ð}Nè`µÈ¢êÉÍCftH 1000 gÌè`ªgíêéD 1001 1002 4.4 óÔANZXÖ950 プロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する. 951 952 (4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション) 953 (4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション) 954 955 それぞれ,16ビット,32ビットの符号無し整数のエンディアンを反転させるマ 956 クロ.プロセッサがエンディアン反転のための命令を持つ場合には,その命令 957 を用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル 958 トの定義が使われる. 959 960 4.4 メモリ空間アクセス関数 1003 961 1004 962 (4-4-1) TOPPERS_OMIT_SIL_ACCESS 1005 963 1006 WÌóÔANZXÖðgp¹¸C^[Qbg˶ÅpÓ·éê 1007 ÉÍC±ÌV{ð}Nè`·éD 964 標準のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合 965 には,このシンボルをマクロ定義する. 1008 966 1009 967 (4-4-2) TOPPERS_OMIT_SIL_REH_LEM … … 1016 974 (4-4-9) TOPPERS_OMIT_SIL_WRW_BEM 1017 975 1018 »ê¼êCWÌsil_reh_lemCsil_wrh_lemCsil_reh_bemCsil_wrh_bemC 1019 sil_rew_lemCsil_wrw_lemCsil_rew_bemCsil_wrw_bemðgp¹¸C^[Qb 1020 g˶ÅpÓ·éêÉÍC±êçÌV{ð}Nè`·éD 1021 1022 4.5 I/OóÔANZXÖ 1023 1024 óÔÆÍÊÉI/OóÔðÂvZbTÅÍCI/OóÔÉ éfoCX 1025 WX^ðANZX·é½ßÌÖƵÄCsil_reb_iopCsil_wrb_iopC 1026 sil_reh_iopCsil_wrh_iopCsil_reh_lepCsil_wrh_lepCsil_reh_bepC 1027 sil_wrh_bepCsil_rew_iopCsil_wrw_iopCsil_rew_lepCsil_wrw_lepC 1028 sil_rew_bepCsil_wrw_bepÌÅKvÈàÌðC^[Qbg˶ÅpÓ·éD 1029 1030 1031 5. J[lAPIÌ^[Qbg˶ 1032 1033 J[lAPIikernel.hjÌ^[Qbg˶Ìè`ÍCtarget_kernel.hܽ 1034 Í»±©çCN[h³êét@CivZbTE`bvEJ«˶ 1035 ÅpÓ³êéwb_t@CÈÇjÉÜßéD 1036 1037 5.1 ^[Qbgè`ÅT|[g·é@\ 1038 1039 (5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT dis_intðT|[g·é 1040 (5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT ena_intðT|[g·é 1041 1042 dis_intCena_intCT|[g·éêÉC»ê¼êÌV{ð}N 1043 è`·éD 1044 1045 5.2 ÝDæxÌÍÍ 1046 1047 (5-2-1) TMIN_INTPRI ÝDæxÌŬliÅlj 1048 (5-2-2) TMAX_INTPRI ÝDæxÌÅåliÅálj 1049 1050 »ê¼êCJ[lÇÌÝDæxÌŬliDæxªÅjCJ[l 1051 ÇÌÝDæxÌÅåliDæxªÅájÉè`·éDTMAX_INTPRIÍ-1 1052 ÉÅè³êÄ¢éªCÎ̫̽ßÉC^[Qbg˶Åè`·é±Æɵ 1053 Ä¢éD 1054 1055 5.3 ^CeBbNÌè` 1056 1057 (5-3-1) TIC_NUME ^CeBbNÌüú̪q 1058 (5-3-2) TIC_DENO ^CeBbNÌüú̪ê 1059 1060 ^CeBbNÌüúisignal_timeðÄÑo·üújðC~bPÊÅC 1061 TIC_NUME/TIC_DENOÉè`·éDá¦ÎC^CeBbNÌüúª1/30bÌê 1062 ÉÍCTIC_NUMEð100ÉCTIC_DENOð3Éè`·êÎæ¢D 1063 1064 ^CeBbNÌüúÍC1~bÆ·éiÂÜèCTIC_NUMECTIC_DENOÆà1 1065 Éè`·éj±Æð§·éªCV~ 1066 [V«â«\Ìá¢vZb 1067 TÅ»êªKØÅÈ¢êÉÍC»êÈOÌlƵÄàæ¢D»ÌêÅàC 1068 Â\ÈÀèC1~bÌ{Å éiÂÜèCTIC_DENOð1Éè`·éj±Æª 1069 ]ܵ¢D 1070 1071 TIC_NUMEÆTIC_DENOÌè`ðÏX·é±ÆÅC^CeBbNÌüúðÏXÅ 1072 «éæ¤É^C}hCoðÀ·éêÉÍC±Ì2ÂÌèÌè`ÍftH 1073 glð^¦Ä¢é±ÆÉÈéD»±ÅC±êçÌè`ðu#ifndef TIC_NUMEv 1074 u#endifvÅÍñÅLq·éD 1075 1076 5.4 ÌæmÛ̽ßÌ^è` 1077 1078 (5-4-1) TOPPERS_STK_T X^bNÌæðmÛ·é½ßÌ^iIvVj 1079 1080 X^bNÌæÍCWÅÍCintptr_t^ÌzñƵÄmÛ·éªCæèå«¢PÊÅ 1081 AC³¹½¢ÈÇÌRÅC»êÈOÌ^ÌzñƵÄmÛ·éêÉÍC 1082 »ê¼êTOPPERS_STK_TÆðCzñÌx[XÆÈéf[^^É}Nè`·éD 1083 1084 5.5 ÌæmÛ̽ßÌ}N 1085 1086 (5-5-1) TOPPERS_ROUND_SZiIvVj 1087 (5-5-2) TOPPERS_COUNT_SZiIvVj 1088 1089 TOPPERS_COUNT_SZ(sz, unit)ÍCsz/unitðØèã°½lðßé}NÅCT 1090 CYªszÌÌæðTCYªunitÌf[^^ÌzñÅmÛ·éêÌvf 1091 ðßé½ßÉp¢éDTOPPERS_ROUND_SZ(sz, unit)ÍCsz/unitðØèã° 1092 ½àÌÉunit𩯽lðßé}NÅCTCYªszÌÌæðTCY 1093 ªunitÌf[^^ÌzñÅmÛ·éêÌg[^TCYðßé½ßÉp¢ 1094 éD 1095 1096 »ê¼êCWÌTOPPERS_ROUND_SZCTOPPERS_COUNT_SZªKØÅÈC^[Qb 1097 g˶ÅpÓ·éêÉÍC±êçÌV{ðKØÈlÉ}Nè`·éD 1098 1099 6. J[lÀÌ^[Qbg˶ 1100 1101 6.1 J[lÀÌ^[QbgË¶Ì¤Ê 1102 1103 6.1.1 J[lÀÌ^[Qbg˶Ì\¬vf 1104 1105 J[lÀÌ^[Qbg˶ÍCȺÌvfÅ\¬³êéD 1106 1107 (a) J[lÀÌ^[Qbg˶Ìè` 1108 1109 J[lÀÌ^[Qbgñ˶©çQƳêé^[Qbg˶Ìè`ÍC 1110 target_config.hܽͻ±©çCN[h³êét@CivZbTE`b 1111 vEJ«˶ÅpÓ³êéwb_t@CÈÇjÉÜßéD 1112 1113 ^[QbgÌn[hEFA¹iÝnhÔâCPUáOnhÔC 1114 foCXWX^ÌÔnÈÇjÌè`ÍCVXeT[rXâAvP[V 1115 ÉàLpÅ é½ßCJ[lÀÌÝÉLpÈè`ðÜÞt@CÆÍØ 1116 誯ÄCƧµ½wb_t@CÉÜßéD±Ìwb_t@CÌWIÈ 1117 ¼ÌðCVXeªÌ.hiܽÍC`bvªÌ.hCvZbTªÌ.hjÆ·éD 1118 1119 (b) J[lÀÌ^[Qbg˶W 1120 [ 1121 1122 J[lÀÌ^[Qbg˶ÌÏè`âÖðÜÞW 1123 [DC¾êÅL 1124 q³êéªðtarget_config.cCAZu¾êÅLq³êéªð 1125 target_support.SÉÜßéDvZbTE`bvEJ«˶ðØ誯 1126 é±ÆâCt@Cªå«ÈéêÉ¡Ìt@Cɪ·é±ÆàÂ\ 1127 Å éD 1128 1129 (c) J[lÀÌ^[Qbg˶̽ßÌl[Lq 1130 1131 J[lÀÌ^[Qbg˶ÌϼâÖ¼ðCæªÉ_kernel_ðt^ 1132 µ½¼OÉl[·é½ßÌW 1133 [Dtarget_rename.defðpÓµCc[ 1134 iutils/genrenamejÉæèCtarget_rename.hÆtarget_unrename.h𶬷 1135 éDvZbTE`bvEJ«˶ðØ誯éêÉÍCl[L 1136 qàØ誯éD 1137 1138 ¦ 1139 (d) ^C}hCo 1140 1141 J[lÉ^CeBbNðÊm·éisignal_timeðüúIÉÄÑo·j½ß 1142 Ì^C}hCoÌwb_t@CCÀt@CCVXeRtBM 1143 [ 1144 Vt@CðC»ê¼êCtarget_timer.hCtarget_timer.cC 1145 target_timer.cfgÉÜßéDvZbTE`bvEJ«˶ðØ誯 1146 é±ÆàÂ\Å éD 1147 1148 (e) RtBM 1149 [^Ýèt@C 1150 1151 RtBM 1152 [^ÌÝèt@CÌ^[Qbg˶ðCtarget_def.csvC 1153 target.tfCtarget_check.tfÉpÓ·éDRtBM 1154 [^Ýèt@CÌ 1155 Lqû@É¢ÄÍCVÍÅྷéD 1156 1157 6.1.2 ^[Qbg˶ÌÖ̽¼K¥ 1158 1159 J[lÀÌ^[Qbg˶ð\¬·éÖÌÅCt_ÅnÜéàÌÍ^ 1160 XNReLXgêpCi_ÅnÜéàÌÍñ^XNReLXgêpCx_Ån 1161 ÜéàÌÍ¢¸êÌReLXg©çÅàÄÑo·±ÆªÅ«éÖÅ éD 1162 1163 6.2 g[XO@\ÖÌÎ 1164 1165 J[lÌg[XO@\ÌÅCÝnhCCPUáOnhÌJn 1166 EI¹Ìg[XOæ¾ÍC^[Qbg˶ÅÀ·éKvª éDÙÆñ 1167 ÇÌ^[QbgVXeɨ¢ÄC»êçÌÍAZu¾êÅLq³êÄ 1168 ¨èC^[Qbgñ˶ü¯Ìg[XO}NƯ¶û@ig[XO 1169 }NðCg[XOæ¾ÌC¾êLqÉ}Nè`·éû@jÍCp¢ 1170 é±ÆªÅ«È¢D 1171 1172 »±ÅCAZu¾êÅLq³êÄ¢éÉg[XOæ¾ðß 1173 ÞêÉÍCg[XO}Nªè`³êÄ¢êÎC»êª½Éè`³êÄ 1174 ¢é©Í³µÄCWIÈg[XOÖªC¾êÅLq³êÄ¢éÆzè 1175 µÄC»êðÄÑo·æ¤ÉR[fBO·éD 1176 1177 ïÌIÉÍCºÌ\̶¤É¦µ½g[XO}Nªè`³êÄ¢êÎC 1178 \ÌE¤É¦µ½C¾êLqƯÌðs¤æ¤ÉR[fBO·éD 1179 1180 g[XO}N g[XOæ¾ 976 それぞれ,標準のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem, 977 sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ 978 ト依存部で用意する場合には,これらのシンボルをマクロ定義する. 979 980 4.5 I/O空間アクセス関数 981 982 メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ 983 ジスタをアクセスするための関数として,sil_reb_iop,sil_wrb_iop, 984 sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep, 985 sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep, 986 sil_rew_bep,sil_wrw_bepの中で必要なものを,ターゲット依存部で用意する. 987 988 989 5. カーネルAPIのターゲット依存部 990 991 カーネルAPI(kernel.h)のターゲット依存部の定義は,target_kernel.hまた 992 はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存 993 部で用意されるヘッダファイルなど)に含める. 994 995 5.1 ターゲット定義でサポートする機能 996 997 (5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT dis_intをサポートする 998 (5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT ena_intをサポートする 999 1000 dis_int,ena_int,サポートする場合に,それぞれのシンボルをマク 1001 ロ定義する. 1002 1003 5.2 割込み優先度の範囲 1004 1005 (5-2-1) TMIN_INTPRI 割込み優先度の最小値(最高値) 1006 (5-2-2) TMAX_INTPRI 割込み優先度の最大値(最低値) 1007 1008 それぞれ,カーネル管理の割込み優先度の最小値(=優先度が最高),カーネ 1009 ル管理の割込み優先度の最大値(優先度が最低)に定義する.TMAX_INTPRIは-1 1010 に固定されているが,対称性のために,ターゲット依存部で定義することにし 1011 ている. 1012 1013 5.3 タイムティックの定義 1014 1015 (5-3-1) TIC_NUME タイムティックの周期の分子 1016 (5-3-2) TIC_DENO タイムティックの周期の分母 1017 1018 タイムティックの周期(signal_timeを呼び出す周期)を,ミリ秒単位で, 1019 TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合 1020 には,TIC_NUMEを100に,TIC_DENOを3に定義すればよい. 1021 1022 タイムティックの周期は,1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1 1023 に定義する)ことを推奨するが,シミュレーション環境や性能の低いプロセッ 1024 サでそれが適切でない場合には,それ以外の値としてもよい.その場合でも, 1025 可能な限り,1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが 1026 望ましい. 1027 1028 TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で 1029 きるようにタイマドライバを実装する場合には,この2つの定数の定義はデフォ 1030 ルト値を与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」 1031 「#endif」で囲んで記述する. 1032 1033 5.4 メモリ領域確保のための型定義 1034 1035 (5-4-1) TOPPERS_STK_T スタック領域を確保するための型(オプション) 1036 1037 スタック領域は,標準では,intptr_t型の配列として確保するが,より大きい単位で 1038 アラインさせたいなどの理由で,それ以外の型の配列として確保する場合には, 1039 それぞれTOPPERS_STK_Tとを,配列のベースとなるデータ型にマクロ定義する. 1040 1041 5.5 メモリ領域確保のためのマクロ 1042 1043 (5-5-1) TOPPERS_ROUND_SZ(オプション) 1044 (5-5-2) TOPPERS_COUNT_SZ(オプション) 1045 1046 TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ 1047 イズがszのメモリ領域をサイズがunitのデータ型の配列で確保する場合の要素 1048 数を求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ 1049 たものにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ 1050 がunitのデータ型の配列で確保する場合のトータルサイズを求めるために用い 1051 る. 1052 1053 それぞれ,標準のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ 1054 ト依存部で用意する場合には,これらのシンボルを適切な値にマクロ定義する. 1055 1056 6. カーネル実装のターゲット依存部 1057 1058 6.1 カーネル実装のターゲット依存部の共通事項 1059 1060 6.1.1 カーネル実装のターゲット依存部の構成要素 1061 1062 カーネル実装のターゲット依存部は,以下の要素で構成される. 1063 1064 (a) カーネル実装のターゲット依存の定義 1065 1066 カーネル実装のターゲット非依存部から参照されるターゲット依存の定義は, 1067 target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ 1068 プ・開発環境依存部で用意されるヘッダファイルなど)に含める. 1069 1070 ターゲットのハードウェア資源(割込みハンドラ番号やCPU例外ハンドラ番号, 1071 デバイスレジスタの番地など)の定義は,システムサービスやアプリケーショ 1072 ンにも有用であるため,カーネル実装のみに有用な定義を含むファイルとは切 1073 り分けて,独立したヘッダファイルに含める.このヘッダファイルの標準的な 1074 名称を,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする. 1075 1076 (b) カーネル実装のターゲット依存モジュール 1077 1078 カーネル実装のターゲット依存の変数定義や関数を含むモジュール.C言語で記 1079 述される部分をtarget_config.c,アセンブリ言語で記述される部分を 1080 target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け 1081 ることや,ファイルが大きくなる場合に複数のファイルに分割することも可能 1082 である. 1083 1084 (c) カーネル実装のターゲット依存部のためのリネーム記述 1085 1086 カーネル実装のターゲット依存部の変数名や関数名を,先頭に_kernel_を付与 1087 した名前にリネームするためのモジュール.target_rename.defを用意し,ツー 1088 ル(utils/genrename)により,target_rename.hとtarget_unrename.hを生成す 1089 る.プロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記 1090 述も切り分ける. 1091 1092 ※ 1093 (d) タイマドライバ 1094 1095 カーネルにタイムティックを通知する(signal_timeを周期的に呼び出す)ため 1096 のタイマドライバのヘッダファイル,実装ファイル,システムコンフィギュレー 1097 ションファイルを,それぞれ,target_timer.h,target_timer.c, 1098 target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け 1099 ることも可能である. 1100 1101 (e) コンフィギュレータ設定ファイル 1102 1103 コンフィギュレータの設定ファイルのターゲット依存部を,target_def.csv, 1104 target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの 1105 記述方法については,7章で説明する. 1106 1107 6.1.2 ターゲット依存部の関数の命名規則 1108 1109 カーネル実装のターゲット依存部を構成する関数の中で,t_で始まるものはタ 1110 スクコンテキスト専用,i_で始まるものは非タスクコンテキスト専用,x_で始 1111 まるものはいずれのコンテキストからでも呼び出すことができる関数である. 1112 1113 6.2 トレースログ機能への対応 1114 1115 カーネルのトレースログ機能の中で,割込みハンドラ,CPU例外ハンドラの開始 1116 ・終了のトレースログ取得は,ターゲット依存部で実装する必要がある.ほとん 1117 どのターゲットシステムにおいて,それらの処理はアセンブリ言語で記述されて 1118 おり,ターゲット非依存部向けのトレースログマクロと同じ方法(トレースログ 1119 マクロを,トレースログ取得処理のC言語記述にマクロ定義する方法)は,用い 1120 ることができない. 1121 1122 そこで,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込 1123 む場合には,トレースログマクロが定義されていれば,それが何に定義されて 1124 いるかは無視して,標準的なトレースログ関数がC言語で記述されていると想定 1125 して,それを呼び出すようにコーディングする. 1126 1127 具体的には,下の表の左側に示したトレースログマクロが定義されていれば, 1128 表の右側に示したC言語記述と同等の処理を行うようにコーディングする. 1129 1130 トレースログマクロ トレースログ取得処理 1181 1131 ----------------------------------------------- 1182 1132 LOG_INH_ENTER log_inh_enter(inhno) … … 1185 1135 LOG_EXC_LEAVE log_exc_leave(excno) 1186 1136 1187 6.3 VXeóÔÌÇ1188 1189 SSP J[lðV½È^[QbgVXeÉ|[eBO·éÛÉCÅàdvÈ1190 ìÆÍCJ[lªè`·éVXeóÔðCn[hEFAivZbTjã 1191 ÅÇÌæ¤ÉÀ»·é©Å éDȺÌà¾ÍCTOPPERSV¢ãJ[lɨ¯ 1192 éVXeóÔÌè`EÓ¡ðmÁÄ¢é±ÆðOñÉLqµÄ¢éD 1193 1194 6.3.1 SÝbNóÔÌÇ1195 1196 SÝbNóÔÍCNMIð·×ÄÌÝð}XNµ½óÔÅ éDS 1197 ÝbNóÔðÇ·é@\ÍCVXeC^tF[XCiSILjÉ 1198 æÁÄñ³êCJ[lÍSÝbNóÔðǵȢD 1199 1200 SÝbNóÔÅÍCsns_kerÆext_kerÈOÌJ[lÌT[rXR[ 1201 ðÄÔ±ÆÍÅ«È¢àÌƵĨèCÄñ¾êÉͽªN±é©ÛØµÄ 1202 ¢È¢Dsns_kerÆext_ker©çÄÑo·ÍCg[XOæ¾ÆSILÌ 1203 T[rXR[ðÆCcall_exit_kernelÌÝÅ éD»Ì½ßC 1204 call_exit_kernel ©çÄÑo·àÌð¢ÄCJ[lÌ^[Qbg˶Ì1205 ÖªCSÝbNóÔÅÄÑo³êéóµÍl¦éKvªÈ¢D 1206 1207 6.3.2 ReLXgÌÇ1208 1209 PʪÀs³êéReLXgÍC^XNReLXgÆñ^XNRe 1210 LXgɪ޳êéD 1211 1212 ^[Qbg˶ÍCÀsÌPʪC^XNReLXgÅÀs³êÄ 1213 ¢é©ñ^XNReLXgÅÀs³êÄ¢é©ð»Ê·é@\ðñ·éD 1214 ܽCCPUáOª¶µ½ReLXgÉ¢Ļʷé@\ðñ·éD 1215 1216 ^[Qbg˶ÅÍCÝnhÆCPUáOnhÌüûÅñ^X 1217 NReLXgÉØè·¦C»êçÌoûųÌReLXgÉß·DÜ 1218 ½CfBXpb`ÌàÅêIÉñ^XNReLXgÉØè·¦éD 1137 6.3 システム状態の管理 1138 1139 SSPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な 1140 作業は,カーネルが定義するシステム状態を,ハードウェア(プロセッサ)上 1141 でどのように実現するかである.以下の説明は,TOPPERS新世代カーネルにおけ 1142 るシステム状態の定義・意味を知っていることを前提に記述している. 1143 1144 6.3.1 全割込みロック状態の管理 1145 1146 全割込みロック状態は,NMIを除くすべての割込みをマスクした状態である.全 1147 割込みロック状態を管理する機能は,システムインタフェースレイヤ(SIL)に 1148 よって提供され,カーネルは全割込みロック状態を管理しない. 1149 1150 全割込みロック状態では,sns_kerとext_ker以外のカーネルのサービスコール 1151 を呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して 1152 いない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの 1153 サービスコールを除くと,call_exit_kernelのみである.そのため, 1154 call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の 1155 関数が,全割込みロック状態で呼び出される状況は考える必要がない. 1156 1157 6.3.2 コンテキストの管理 1158 1159 処理単位が実行されるコンテキストは,タスクコンテキストと非タスクコンテ 1160 キストに分類される. 1161 1162 ターゲット依存部は,実行中の処理単位が,タスクコンテキストで実行されて 1163 いるか非タスクコンテキストで実行されているかを判別する機能を提供する. 1164 また,CPU例外が発生したコンテキストについて判別する機能を提供する. 1165 1166 ターゲット依存部では,割込みハンドラとCPU例外ハンドラの入口処理で非タス 1167 クコンテキストに切り換え,それらの出口処理で元のコンテキストに戻す.ま 1168 た,ディスパッチャの内部で一時的に非タスクコンテキストに切り換える. 1219 1169 1220 1170 (6-3-2-1) bool_t sense_context(void) 1221 1171 1222 ÀsÌPʪC^XNReLXgÅÀs³êÄ¢éêÉÍfalseCñ 1223 ^XNReLXgÅÀs³êÄ¢éêÉÍtrueðÔ·ÖD±ÌÖÍC 1224 CPU bNóÔÅàCPUbNðóÔÅàÄÑo¹éæ¤ÉÀµÈ¯êÎÈ1225 çÈ¢D 1226 1227 6.3.3 CPU bNóÔÌÇ1228 1229 ^[Qbg˶ÍCCPUbNóÔÖJÚ·é@\CCPUbNðóÔÖJ 1230 Ú·é@\CCPUbNóÔÅ é©ð»Ê·é@\ðñ·éD 1172 実行中の処理単位が,タスクコンテキストで実行されている場合にはfalse,非 1173 タスクコンテキストで実行されている場合にはtrueを返す関数.この関数は, 1174 CPUロック状態でもCPUロック解除状態でも呼び出せるように実装しなければな 1175 らない. 1176 1177 6.3.3 CPUロック状態の管理 1178 1179 ターゲット依存部は,CPUロック状態へ遷移する機能,CPUロック解除状態へ遷 1180 移する機能,CPUロック状態であるかを判別する機能を提供する. 1231 1181 1232 1182 (6-3-3-1) void t_lock_cpu(void) … … 1234 1184 (6-3-3-3) void x_lock_cpu(void) 1235 1185 1236 CPU bNðóÔ©çCCPUbNóÔÖJÚ³¹éÖD±êçÌÖÍC1237 CPU bNóÔÅÄÑo³êé±ÆÍÈCÄÑo³ê½êÌ®ìÍÛØ·é1238 KvªÈ¢D 1239 1240 ±êçÌÖðÀ»·éÛÉÍCu1.6 NeBJZNVÌoüÌ 1241 À»ÉÖ·é§ñvÌßÉLq³êÄ¢é§ñÉ]íȯêÎÈçÈ¢D 1186 CPUロック解除状態から,CPUロック状態へ遷移させる関数.これらの関数は, 1187 CPUロック状態で呼び出されることはなく,呼び出された場合の動作は保証する 1188 必要がない. 1189 1190 これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の 1191 実現に関する制約」の節に記述されている制約に従わなければならない. 1242 1192 1243 1193 (6-3-3-4) void t_unlock_cpu(void) … … 1245 1195 (6-3-3-6) void x_unlock_cpu(void) 1246 1196 1247 CPU bNóÔ©çCCPUbNðóÔÖJÚ³¹éÖD±êçÌÖÍC1248 CPU bNðóÔÅÄÑo³êé±ÆÍÈCÄÑo³ê½êÌ®ìÍÛØ1249 ·éKvªÈ¢D 1250 1251 ^XNReLXgÅCPUbNóÔÉJÚµ½êÉÍCCPUbNðóÔ 1252 ÉßéÌÍ^XNReLXgÉÀçêCñ^XNReLXgÅCPUbNð 1253 óÔÉßé±ÆÍÈ¢D¾¢·¦éÆCt_unlock_cpuªÄÑo³êéÌÍC 1254 t_lock_cpu ÉæÁÄCPUbNóÔÉÈÁÄ¢éÅ éDi_lock_cpuÉæÁÄ1255 CPU bNóÔÉÈÁÄ¢éÉÍCt_unlock_cpuªÄÑo³êé±ÆÍÈ¢D1256 1257 ¯lÉCñ^XNReLXgÅCPUbNóÔÉJÚµ½êÉÍCCPUb 1258 NðóÔÉßéÌÍñ^XNReLXgÉÀçêC^XNReLXgÅ 1259 CPU bNðóÔÉßé±ÆÍÈ¢D¾¢·¦éÆCi_unlock_cpuªÄÑo³1260 êéÌÍCi_lock_cpuÉæÁÄCPUbNóÔÉÈÁÄ¢éÅ éD 1261 t_lock_cpu ÉæÁÄCPUbNóÔÉÈÁÄ¢éÉÍCi_unlock_cpuªÄÑo1262 ³êé±ÆÍÈ¢D 1263 1264 ±êçÌÖðÀ»·éÛÉÍCu1.6 NeBJZNVÌoüÌ 1265 À»ÉÖ·é§ñvÌßÉLq³êÄ¢é§ñÉ]íȯêÎÈçÈ¢D 1197 CPUロック状態から,CPUロック解除状態へ遷移させる関数.これらの関数は, 1198 CPUロック解除状態で呼び出されることはなく,呼び出された場合の動作は保証 1199 する必要がない. 1200 1201 タスクコンテキストでCPUロック状態に遷移した場合には,CPUロック解除状態 1202 に戻るのはタスクコンテキストに限られ,非タスクコンテキストでCPUロック解 1203 除状態に戻ることはない.言い換えると,t_unlock_cpuが呼び出されるのは, 1204 t_lock_cpuによってCPUロック状態になっている時である.i_lock_cpuによって 1205 CPUロック状態になっている時には,t_unlock_cpuが呼び出されることはない. 1206 1207 同様に,非タスクコンテキストでCPUロック状態に遷移した場合には,CPUロッ 1208 ク解除状態に戻るのは非タスクコンテキストに限られ,タスクコンテキストで 1209 CPUロック解除状態に戻ることはない.言い換えると,i_unlock_cpuが呼び出さ 1210 れるのは,i_lock_cpuによってCPUロック状態になっている時である. 1211 t_lock_cpuによってCPUロック状態になっている時には,i_unlock_cpuが呼び出 1212 されることはない. 1213 1214 これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の 1215 実現に関する制約」の節に記述されている制約に従わなければならない. 1266 1216 1267 1217 (6-3-3-7) bool_t t_sense_lock(void) … … 1269 1219 (6-3-3-9) bool_t x_sense_lock(void) 1270 1220 1271 »ÝÌVXeóÔªCCPUbNóÔÌêÍtrueCCPUbNðóÔÌê 1272 ÉÍfalseðÔ·ÖD 1273 1274 ±êçÌÖªSÝbNóÔÅÄÑo³êéóµÍl¦éKvªÈ¢± 1275 Æ©çCSÝbNóÔÆCPUbNóÔðæÊÅ«éKvÍÈ¢DNMIÈ 1276 OÉJ[lÌÇOÌÝðݯȢêÉÍCSÝbNóÔÆ 1277 CPU bNóÔªS¯êÌóÔÅà©ÜíÈ¢D1278 1279 6.4 ÝÉÖA·éVXeóÔÌÇ1280 1281 6.4.1 ÝDæx}XNÌÇ1282 1283 ^[Qbg˶ÍCÝDæx}XNðÝè·é@\ÆCÝDæx} 1284 XNðQÆ·é@\ðñ·éD 1221 現在のシステム状態が,CPUロック状態の場合はtrue,CPUロック解除状態の場 1222 合にはfalseを返す関数. 1223 1224 これらの関数が全割込みロック状態で呼び出される状況は考える必要がないこ 1225 とから,全割込みロック状態とCPUロック状態を区別できる必要はない.NMI以 1226 外にカーネルの管理外の割込みを設けない場合には,全割込みロック状態と 1227 CPUロック状態が全く同一の状態でもかまわない. 1228 1229 6.4 割込みに関連するシステム状態の管理 1230 1231 6.4.1 割込み優先度マスクの管理 1232 1233 ターゲット依存部は,割込み優先度マスクを設定する機能と,割込み優先度マ 1234 スクを参照する機能を提供する. 1285 1235 1286 1236 (6-4-1-1) void x_set_ipm(PRI intpri) … … 1288 1238 (6-4-1-3) void i_set_ipm(PRI intpri) 1289 1239 1290 ÝDæx}XNÌlðintpriÉÝè·éÖD 1291 1292 ±êçÌÖÍCCPUbNóÔÅàCPUbNðóÔÅàÄÑo¹éæ¤É 1293 À·é̪]ܵ¢D½¾µCx_set_ipmÆt_set_ipmÍC^[Qbgñ˶ 1294 ªCPUbNðóÔÅÄÑo·±ÆÍÈ¢½ßCCPUbNðóÔÅÄÑ 1295 o³ê½êÌ®ìÍÛØ·éKvªÈ¢Di_set_ipmÍCCPUbNóÔÅà 1296 CPU bNðóÔÅàÄÑo¹éæ¤ÉÀµÈ¯êÎÈçÈ¢D1297 1298 ܽC±êçÌÖÍCVALID_INTPRI_CHGIPM(intpri)ªtrueðÔ·intpriÉÎ 1299 µÄÌÝÄÎêéDintpriÉ»¤ÅÈ¢lªn³ê½êÌ®ìÍÛØ·éK 1300 vªÈ¢D 1240 割込み優先度マスクの値をintpriに設定する関数. 1241 1242 これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように 1243 実装するのが望ましい.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存 1244 部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び 1245 出された場合の動作は保証する必要がない.i_set_ipmは,CPUロック状態でも 1246 CPUロック解除状態でも呼び出せるように実装しなければならない. 1247 1248 また,これらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対 1249 してのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証する必 1250 要がない. 1301 1251 1302 1252 (6-4-1-4) PRI x_get_ipm(void) … … 1304 1254 (6-4-1-6) PRI i_get_ipm(void) 1305 1255 1306 ÝDæx}XNÌlðQƵÄÔ·ÖD 1307 1308 ±êçÌÖÍCCPUbNóÔÅàCPUbNðóÔÅàÄÑo¹éæ¤É 1309 À·é̪]ܵ¢D½¾µCx_get_ipmÆt_get_ipmÍC^[Qbgñ˶ 1310 ªCPUbNðóÔÅÄÑo·±ÆÍÈ¢½ßCCPUbNðóÔÅÄÑ 1311 o³ê½êÌ®ìÍÛØ·éKvªÈ¢Di_get_ipmÍCCPUbNóÔÅà 1312 CPU bNðóÔÅàÄÑo¹éæ¤ÉÀµÈ¯êÎÈçÈ¢D1313 1314 ÝDæx}XNðp¢ÄJ[lÇÌÝð·×Ä}XNµ½óÔÍC 1315 CPU bNóÔÆæÊÅ«é±ÆªKvÅ éDïÌIÉÍCCPUbNðó1316 Ôɨ¢ÄCx_set_ipmðp¢ÄJ[lÇÌÝð·×Ä}XNµ½ê 1317 ÅàCx_sense_lockÍfalseðÔ·D 1318 1319 »êÉεÄCÝDæx}XNðp¢ÄNMIð·×ÄÌÝð}XN 1320 Å«éêC»ÌóÔÆSÝbNóÔðæÊÅ«éKvÍÈCS¯ 1321 êÌóÔÅà©ÜíÈ¢D 1322 1323 6.4.2 ÝvÖ~tOÌÇ1324 1325 ^[Qbg˶ÍCÝvÖ~tOðZbg·é@\ÆNA·é@ 1326 \ðñ·éD 1256 割込み優先度マスクの値を参照して返す関数. 1257 1258 これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように 1259 実装するのが望ましい.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存 1260 部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び 1261 出された場合の動作は保証する必要がない.i_get_ipmは,CPUロック状態でも 1262 CPUロック解除状態でも呼び出せるように実装しなければならない. 1263 1264 割込み優先度マスクを用いてカーネル管理の割込みをすべてマスクした状態は, 1265 CPUロック状態と区別できることが必要である.具体的には,CPUロック解除状 1266 態において,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合 1267 でも,x_sense_lockはfalseを返す. 1268 1269 それに対して,割込み優先度マスクを用いてNMIを除くすべての割込みをマスク 1270 できる場合,その状態と全割込みロック状態を区別できる必要はなく,全く同 1271 一の状態でもかまわない. 1272 1273 6.4.2 割込み要求禁止フラグの管理 1274 1275 ターゲット依存部は,割込み要求禁止フラグをセットする機能とクリアする機 1276 能を提供する. 1327 1277 1328 1278 (6-4-2-1) bool_t VALID_INTNO_DISINT(INTNO intno) 1329 1279 1330 intno ªCdis_int^ena_intÉηéÝÔƵÄLøÈlÅ éêÉ1331 true C»¤ÅÈ¢êÉfalseðÔ·}NDÝvÖ~tOªZbg^1332 NAÅ«È¢intnoÉεÄÍC±Ì}NªfalseðÔ·æ¤É·éD 1280 intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に 1281 true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/ 1282 クリアできないintnoに対しては,このマクロがfalseを返すようにする. 1333 1283 1334 1284 (6-4-2-2) bool_t x_disable_int(INTNO intno) … … 1336 1286 (6-4-2-4) bool_t i_disable_int(INTNO intno) 1337 1287 1338 intno Åwè³ê½ÝvCÉηéÝvÖ~tOðZbgµC1339 true ðÔ·ÖDwè³ê½ÝvCÉεÄCÝ®«ªÝè³1340 êĢȢêÉÍCfalseðÔ·D 1341 1342 ±êçÌÖÍC^[Qbgñ˶ªCPUbNðóÔÅÄÑo·±ÆÍÈ 1343 ¢½ßCCPUbNðóÔÅÄÑo³ê½êÌ®ìÍÛØ·éKvªÈ¢D 1344 ½¾µC^[Qbg˶©çCPUbNðóÔÅÄÑo·êÉÍCÛØ· 1345 éKvª éD 1346 1347 ܽC±êçÌÖÍCVALID_INTNO_DISINT(intno)ªtrueÆÈéintnoÉε 1348 ÄÌÝÄÎêéDintnoÉ»¤ÅÈ¢lªn³ê½êÌ®ìÍÛØ·éKvª 1349 È¢D 1350 1351 dis_int T[rXR[ðT|[g·éêiTOPPERS_SUPPORT_DIS_INTð}N1352 è`·éêjÉÍCt_disable_intªpÓ³êĢȯêÎÈçÈ¢D 1288 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし, 1289 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ 1290 れていない場合には,falseを返す. 1291 1292 これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな 1293 いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない. 1294 ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す 1295 る必要がある. 1296 1297 また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し 1298 てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が 1299 ない. 1300 1301 dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク 1302 ロ定義する場合)には,t_disable_intが用意されていなければならない. 1353 1303 1354 1304 (6-4-2-5) bool_t x_enable_int(INTNO intno) … … 1356 1306 (6-4-2-7) bool_t i_enable_int(INTNO intno) 1357 1307 1358 intno Åwè³ê½ÝvCÉηéÝvÖ~tOðNAµC1359 true ðÔ·ÖDwè³ê½ÝvCÉεÄCÝ®«ªÝè³1360 êĢȢêÉÍCfalseðÔ·D 1361 1362 ±êçÌÖÍC^[Qbgñ˶ªCPUbNðóÔÅÄÑo·±ÆÍÈ 1363 ¢½ßCCPUbNðóÔÅÄÑo³ê½êÌ®ìÍÛØ·éKvªÈ¢D 1364 ½¾µC^[Qbg˶©çCPUbNðóÔÅÄÑo·êÉÍCÛØ· 1365 éKvª éD 1366 1367 ܽC±êçÌÖÍCVALID_INTNO_DISINT(intno)ªtrueÆÈéintnoÉε 1368 ÄÌÝÄÎêéDintnoÉ»¤ÅÈ¢lªn³ê½êÌ®ìÍÛØ·éKvª 1369 È¢D 1370 1371 ena_int T[rXR[ðT|[g·éêiTOPPERS_SUPPORT_ENA_INTð}N1372 è`·éêjÉÍCt_enable_intªpÓ³êĢȯêÎÈçÈ¢D 1373 1374 6.4.3 ÝvÌNA1308 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし, 1309 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ 1310 れていない場合には,falseを返す. 1311 1312 これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな 1313 いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない. 1314 ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す 1315 る必要がある. 1316 1317 また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し 1318 てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が 1319 ない. 1320 1321 ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク 1322 ロ定義する場合)には,t_enable_intが用意されていなければならない. 1323 1324 6.4.3 割込み要求のクリア 1375 1325 1376 1326 (6-4-3-1) void x_clear_int(INTNO intno) … … 1378 1328 (6-4-3-3) void i_clear_int(INTNO intno) 1379 1329 1380 intno Åwè³ê½ÝvCªGbWgKÅ éêÉCgK³ê1381 ½ÝvðNA·éÖDintnoÅwè³ê½ÝvCªx 1382 gKÅ éêÉͽàµÈ¢D 1383 1384 SSP J[lÌ^[Qbgñ˶ÅÍC±êçÌÖðÄÑoµÄ¢È¢ªC1385 ^[Qbg˶âVXeT[rXÅÄÑo·Â\«ª¢½ßCpÓ·é 1386 ±ÆƵĢéD»Ì½ßC±êçÌÖªÇÌæ¤ÈVXeóÔÅÄÑo 1387 ¹é©ÍC^[Qbg˶àÅêѵĢêÎæ¢D 1388 1389 6.4.4 ÝvÌv[u1330 intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ 1331 た割込み要求をクリアする関数.intnoで指定された割込み要求ラインがレベル 1332 トリガである場合には何もしない. 1333 1334 SSPカーネルのターゲット非依存部では,これらの関数を呼び出していないが, 1335 ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する 1336 こととしている.そのため,これらの関数がどのようなシステム状態で呼び出 1337 せるかは,ターゲット依存部内で一貫していればよい. 1338 1339 6.4.4 割込み要求のプローブ 1390 1340 1391 1341 (6-4-4-1) bool_t x_probe_int(INTNO intno) … … 1393 1343 (6-4-4-3) bool_t i_probe_int(INTNO intno) 1394 1344 1395 intno Åwè³ê½ÝvCÉεÄCݪv³êÄ¢éêÉ1396 true C»¤ÅÈ¢êÉfalseðÔ·ÖD1397 1398 SSP J[lÌ^[Qbgñ˶ÅÍC±êçÌÖðÄÑoµÄ¢È¢ªC1399 ^[Qbg˶âVXeT[rXÅÄÑo·Â\«ª¢½ßCpÓ·é 1400 ±ÆƵĢéD»Ì½ßC±êçÌÖªÇÌæ¤ÈVXeóÔÅÄÑo 1401 ¹é©ÍC^[Qbg˶àÅêѵĢêÎæ¢D 1402 1403 6.4.5 ÝnhÌæªÆö1345 intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に 1346 true,そうでない場合にfalseを返す関数. 1347 1348 SSPカーネルのターゲット非依存部では,これらの関数を呼び出していないが, 1349 ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する 1350 こととしている.そのため,これらの関数がどのようなシステム状態で呼び出 1351 せるかは,ターゲット依存部内で一貫していればよい. 1352 1353 6.4.5 割込みハンドラの先頭処理と末尾処理 1404 1354 1405 1355 (6-4-5-1) void i_begin_int(INTNO intno) 1406 1356 1407 intno Åwè³ê½ÝvCÉηéÝnhÌæªÅs¤×«1408 ðs¤ÖD±±Ås¤×«ÆµÄÍCÝvCªGbWg 1409 KÅ éêÌgK³ê½ÝvÌNAª°çêéD 1410 1411 intno ÉεÄo^³ê½ÝT[rX[`ðÄÑo·ÝnhÌ1412 æªÅÄÑo³êéD»Ì½ß±ÌÖÍCÝnhÌæªiÊíÍ 1413 CPU bNðóÔjÅÄÑo¹éæ¤ÉÀµÈ¯êÎÈçÈ¢D1357 intnoで指定された割込み要求ラインに対する割込みハンドラの先頭で行うべき 1358 処理を行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト 1359 リガである場合のトリガされた割込み要求のクリアが挙げられる. 1360 1361 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの 1362 先頭で呼び出される.そのためこの関数は,割込みハンドラの先頭(通常は 1363 CPUロック解除状態)で呼び出せるように実装しなければならない. 1414 1364 1415 1365 (6-4-5-2) void i_end_int(INTNO intno) 1416 1366 1417 intno Åwè³ê½ÝvCÉηéÝnhÌöÅs¤×«1418 ðs¤ÖD±±Ås¤×«ÆµÄÍCÝRg[iIRCjÉ 1419 ηéÝÌI¹ðÊmª°çêéD 1420 1421 intno ÉεÄo^³ê½ÝT[rX[`ðÄÑo·ÝnhÌ1422 öÅÄÑo³êéD»Ì½ß±ÌÖÍCÝnhÌöiÊíÍ 1423 CPU bNðóÔjÅÄÑo¹éæ¤ÉÀµÈ¯êÎÈçÈ¢D1424 1425 6.5 ^XNfBXpb`1426 1427 1428 6.5.1 fBXpb`Ì®ìJn1367 intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき 1368 処理を行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に 1369 対する割込み処理の終了を通知が挙げられる. 1370 1371 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの 1372 末尾で呼び出される.そのためこの関数は,割込みハンドラの末尾(通常は 1373 CPUロック解除状態)で呼び出せるように実装しなければならない. 1374 1375 6.5 タスクディスパッチャ 1376 1377 1378 6.5.1 ディスパッチャの動作開始 1429 1379 1430 1380 (6-5-1-1) void start_dispatch(void) 1431 1381 1432 fBXpb`Ì®ìJnistart_dispatchjÍCJ[lN®ÉCJ[l 1433 Ìú»©çÄÑo³êéDstart_dispatchÍC^[·é±ÆÌÈ 1434 ¢ÖÅ éD 1435 1436 start_dispatch ÍCñ^XNReLXgÅCNMIð·×ÄÌÝð}X1437 Nµ½óÔiSÝbNóÔƯÌóÔjÅÄÑo³êéDstart_dispatch1438 àÅC^XNReLXgÉØè·¦CCPUbNóÔEÝDæx}XNS 1439 ðóÔɵȯêÎÈçÈ¢D 1440 1441 ReLXgðØèÖ¦½ãÍ^[Qbgñ˶ÖdispatcherðÄÑo·D 1442 1443 start_dispatch ÌàeÍÌÊèDdispatcher©çªÔé±ÆÍlÊ·éKvÍ1444 È¢D 1382 ディスパッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ 1383 ルの初期化処理から呼び出される.start_dispatchは,リターンすることのな 1384 い関数である. 1385 1386 start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス 1387 クした状態(全割込みロック状態と同等の状態)で呼び出される.start_dispatch 1388 内で,タスクコンテキストに切り換え,CPUロック状態・割込み優先度マスク全 1389 解除状態にしなければならない. 1390 1391 コンテキストを切り替えた後はターゲット非依存部関数dispatcherを呼び出す. 1392 1393 start_dispatchの処理内容は次の通り.dispatcherから処理が返ることは考量する必要は 1394 ない. 1445 1395 1446 1396 ---------------------------------------- … … 1448 1398 start_dispatch(void) 1449 1399 { 1450 ^XNReLXgÉØè·¦é1451 CPU bNóÔEÝDæx}XNSðóÔÉ·é1452 dispatcher ɪò·é1400 タスクコンテキストに切り換える 1401 CPUロック状態・割込み優先度マスク全解除状態にする 1402 dispatcherに分岐する 1453 1403 } 1454 1404 ---------------------------------------- 1455 1405 1456 6.6 Ýnh1457 1458 6.6.1 ÝnhÌoüû1459 1460 J[lÇÌÝÌoüûÌû@ÍCvZbTÉæÁÄå«ÙÈ 1461 éªC¨¨æ»ÌàeÍÌÊèD 1406 6.6 割込みハンドラ 1407 1408 6.6.1 割込みハンドラの出入口処理 1409 1410 カーネル管理の割込みの出入口処理の方法は,プロセッサによって大きく異な 1411 るが,おおよその処理内容は次の通り. 1462 1412 1463 1413 ---------------------------------------- 1464 1414 void 1465 < ÝÌoüû>(void)1415 <割込みの出入口処理>(void) 1466 1416 { 1467 ÈÆàJ[lÇÌÝðÖ~µ½óÔÉ·é c(*f)1468 XNb`WX^ðX^bNÉÛ¶·é1469 if ( ^XNReLXgÅݶ) {1470 ñ^XNReLXgÉØè·¦é1417 少なくともカーネル管理の割込みを禁止した状態にする … (*f) 1418 スクラッチレジスタをスタックに保存する 1419 if (タスクコンテキストで割込み発生) { 1420 非タスクコンテキストに切り換える 1471 1421 } 1472 1422 1473 ±ÌÝæèàDæxÌ¢ÝÌÝðó¯t¯çêéæ¤ÉµÄC1474 CPU bNðóÔÉ·é1423 この割込みよりも優先度の高い割込みのみを受け付けられるようにして, 1424 CPUロック解除状態にする 1475 1425 #ifdef LOG_INH_ENTER 1476 log_inh_enter( ÝnhÔ);1426 log_inh_enter(割込みハンドラ番号); 1477 1427 #endif /* LOG_INH_ENTER */ 1478 ÝnhðÄÑo·1428 割込みハンドラを呼び出す 1479 1429 #ifdef LOG_INH_LEAVE 1480 log_inh_leave( ÝnhÔ);1430 log_inh_leave(割込みハンドラ番号); 1481 1431 #endif /* LOG_INH_LEAVE */ 1482 1432 1483 1433 ret_int: 1484 if ( ^XNReLXgÅݶ) {1485 iÈÆàjJ[lÇÌÝðÖ~µ½óÔÉ·é c(*d)1434 if (タスクコンテキストで割込み発生) { 1435 (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d) 1486 1436 if (reqflg) { 1487 1437 reqflg = false; 1488 CPU bNóÔÉ·é c(*e)1489 search_schedtsk ðÄÑoµCÅDæÊ^XNðßé1490 ÅDæÊÌ^XNIDðøɵÄrun_taskɪò·é1438 CPUロック状態にする … (*e) 1439 search_schedtskを呼び出し,最高優先順位タスクを求める 1440 最高優先順位のタスクIDを引数にしてrun_taskに分岐する 1491 1441 } 1492 1442 } 1493 Ý©çÌ^[ãÉCCPUbNðóÔÉßéæ¤Éõ·é1494 XNb`WX^ðX^bN©çA·é1495 Ý©çÌ^[1443 割込み処理からのリターン後に,CPUロック解除状態に戻るように準備する 1444 スクラッチレジスタをスタックから復帰する 1445 割込み処理からのリターン 1496 1446 } 1497 1447 ---------------------------------------- 1498 1448 1499 ÝÌót¯Éæè·×ÄÌݪÖ~³êÈ¢vZbTÅÍC(*f)É 1500 ¨¢ÄCÈÆàJ[lÇÌÝðÖ~·éD±ÌRÍÌÊèÅ 1501 éD 1502 1503 ÝÌüûɨ¢ÄCX^bNðñ^XNReLXgpÌX^bNÉ 1504 Øè·¦éOɽdݪ¶·éÆC^XNÌX^bNÌæªgp³êéD 1505 ãLÌæ¤ÈvZbTÅÍCX^bNÌØ·¦OÉCÅåÅÝDæxÌ 1506 iªÌ½dݪ¶·é±Æðh®±ÆÍÅ«¸Ce^XNÌX^bN 1507 ÌæðmÛ·éÛÉC»Ìªð©ñÅm۵ȯêÎÈçÈ¢De^XNÌ 1508 X^bNÌæðÈé׬³·é½ßÉÍCX^bNðÈé×gpµÈ¢ 1509 àÉC½dÝðÖ~·é̪]ܵ¢D»Ì½ßCXNb`WX^ð 1510 X^bNÉÛ¶·éOÉCÝðÖ~·éD½¾µCÝÌÖ~ÉK 1511 vÈÅáÀÌWX^É¢ÄÍCÝÌÖ~Éæ§ÁÄX^bNÉÛ¶· 1512 éKvª éD 1513 1514 ¯ḻÆÍCJ[lÇOÌÝÉàÄÍÜéD·Èí¿CJ[l 1515 ÇOÌÝÉ¢ÄàCX^bNðÈé×gpµÈ¢àÉÖ~·é̪ 1516 ]ܵ¢D±Ì±Æ©çCJ[lÇOÌÝðgp·éêÉÍC(*f)1517 ɨ¢ÄC·×ÄÌÝðÖ~µ½óÔÉ·é̪]ܵ¢±ÆÉÈéDÜ 1518 ½CJ[lÇOÌÝɨ¢ÄàCñ^XNReLXgpÌX^b 1519 NÉØè·¦é±Æª]ܵ¢ªC±êÍJ[lÌÇOÅ éD 1520 1521 (*d) ɨ¢ÄÍCJ[lÇÌÝðÖ~·é¾¯ÅCCPUbNóÔÉ·1522 éKvÍÈ¢Dá¦ÎCCPUbNóÔÅ é±Æð¦·ÏðpӵĢéê 1523 ÉÍC(*d)Ì_ÅÍ»ÌÏðCPUbNóÔð¦·lÉÏX·éKvÍÈ 1524 C(*e)ɨ¢ÄÏX·êÎæ¢D 1525 1526 ÝÌoüûðAZu¾êÅLq·éêÉÍCg[XOæ¾ 1527 ÍCu6.2 g[XO@\ÖÌÎvÌßÅLqµ½û@ÅR[fB 1528 O·é±ÆD 1529 1530 6.6.2 ÝnhÌoüû̶¬1531 1532 ÝxNgðn[hEFAÅÀ»µÄ¢éêÈÇCÝnhÉ 1533 oüûðpÓµ½ûªø¦ªÇ¢^[Qbg̽ßÉCÝnh 1534 Éoüû𶬷é@\ðpӵĢéD 1535 1536 ȺÌ}NÍCWÌÝÇ@\Ìú»ðp¢½êÌÝC^[ 1537 Qbgñ˶ÅgíêéDÝÇ@\Ìú»ð^[Qbg˶ 1538 ÅpÓµC»ÌűêçÌ}NðgíÈ¢êÉÍC±êçÌ}Nðp 1539 Ó·éKvÍÈ¢D 1449 割込みの受付けによりすべての割込みが禁止されないプロセッサでは,(*f)に 1450 おいて,少なくともカーネル管理の割込みを禁止する.この理由は次の通りで 1451 ある. 1452 1453 割込みの入口処理において,スタックを非タスクコンテキスト用のスタックに 1454 切り換える前に多重割込みが発生すると,タスクのスタック領域が使用される. 1455 上記のようなプロセッサでは,スタックの切換え前に,最大で割込み優先度の 1456 段数分の多重割込みが発生することを防ぐことはできず,各タスクのスタック 1457 領域を確保する際に,その分を見込んで確保しなければならない.各タスクの 1458 スタック領域をなるべく小さくするためには,スタックをなるべく使用しない 1459 内に,多重割込みを禁止するのが望ましい.そのため,スクラッチレジスタを 1460 スタックに保存する前に,割込みを禁止する.ただし,割込みの禁止処理に必 1461 要な最低限のレジスタについては,割込みの禁止に先立ってスタックに保存す 1462 る必要がある. 1463 1464 同様のことは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル 1465 管理外の割込みについても,スタックをなるべく使用しない内に禁止するのが 1466 望ましい.このことから,カーネル管理外の割込みを使用する場合には,(*f) 1467 において,すべての割込みを禁止した状態にするのが望ましいことになる.ま 1468 た,カーネル管理外の割込み処理においても,非タスクコンテキスト用のスタッ 1469 クに切り換えることが望ましいが,これはカーネルの管轄外である. 1470 1471 (*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状態にす 1472 る必要はない.例えば,CPUロック状態であることを示す変数を用意している場 1473 合には,(*d)の時点ではその変数をCPUロック状態を示す値に変更する必要はな 1474 く,(*e)において変更すればよい. 1475 1476 割込みの出入口処理をアセンブリ言語で記述する場合には,トレースログ取得 1477 処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン 1478 グすること. 1479 1480 6.6.2 割込みハンドラ毎の出入口処理の生成 1481 1482 割込みベクトルをハードウェアで実現している場合など,割込みハンドラ毎に 1483 出入口処理を用意した方が効率が良いターゲットのために,割込みハンドラ毎 1484 に出入口処理を生成する機構を用意している. 1485 1486 以下のマクロは,標準の割込み管理機能の初期化処理を用いた場合のみ,ター 1487 ゲット非依存部で使われる.割込み管理機能の初期化処理をターゲット依存部 1488 で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用 1489 意する必要はない. 1540 1490 1541 1491 (6-6-2-1) INT_ENTRY(inhno, inthdr) 1542 1492 1543 ÝnhÔªinhnoCÝnhÌÖ¼ªinthdrÅ éÝn 1544 hÌoüûÌxðìé}NDINTHDR_ENTRYðp¢ÄÝn 1545 hÉoüû𶬷éêÉÍCÌæ¤Éè`·éD 1493 割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ 1494 ンドラの出入口処理のラベルを作るマクロ.INTHDR_ENTRYを用いて割込みハン 1495 ドラ毎に出入口処理を生成する場合には,次のように定義する. 1546 1496 1547 1497 #define INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno 1548 1498 1549 ÝnhÉoüûðìéKvªÈ¢êÉÍCÌæ¤Éè`µ 1550 ÄCÝnhÌÖ¼ð»ÌÜÜÔ·D 1499 割込みハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し 1500 て,割込みハンドラの関数名をそのまま返す. 1551 1501 1552 1502 #define INT_ENTRY(inhno, inthdr) inthdr … … 1554 1504 (6-6-2-2) INTHDR_ENTRY(inhno, inhno_num, inthdr) 1555 1505 1556 ÝnhÔªinhnoCÝnhÌÖ¼ªinthdrÅ éÝn 1557 hÌoüû𶬷é}NDinhno_numÉÍCAZu¾êLqp 1558 ÉCÝnhÔªlÅn³êéDÝnhÉoüûð 1559 ìéKvªÈ¢êÉÍCóÉè`·éD 1560 1561 6.6.3 ÝnhÌÝè1562 1563 (6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno) iIvVj1564 1565 inhno ªCDEF_INHÉηéÝnhÔƵÄLøÈlÅ éêÉ1566 true C»¤ÅÈ¢êÉfalseðÔ·}ND1567 1568 SSP J[lÌ^[Qbgñ˶ÅÍC±Ì}NÍgíêĢȢ½ßC^[1569 Qbg˶ÅgíÈ¢ÈçCpÓ·éKvªÈ¢D 1506 割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ 1507 ンドラの出入口処理を生成するマクロ.inhno_numには,アセンブリ言語記述用 1508 に,割込みハンドラ番号が数値で渡される.割込みハンドラ毎に出入口処理を 1509 作る必要がない場合には,空に定義する. 1510 1511 6.6.3 割込みハンドラの設定 1512 1513 (6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション) 1514 1515 inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に 1516 true,そうでない場合にfalseを返すマクロ. 1517 1518 SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター 1519 ゲット依存部で使わないなら,用意する必要がない. 1570 1520 1571 1521 (6-6-3-2) void x_define_inh(INHNO inhno, FP int_entry) 1572 1522 1573 inhnoÅwè³ê½ÝnhÌoüûÌÔnðint_entryÉÝè·éD 1574 1575 ±ÌÖÍCWÌÝÇ@\Ìú»ðp¢½êÌÝC^[Qb 1576 gñ˶©çÄÑo³êéDÝÇ@\Ìú»ð^[Qbg˶ 1577 ÅpÓµC»ÌűÌÖðÄÑo³È¢êÉÍC±ÌÖðpÓ·é 1578 KvÍÈ¢D 1579 1580 ±ÌÖÍC^[Qbgñ˶ÌJ[lú»©çÄÑo³êé½ßC 1581 J[lÌú»iNMIð·×ÄÌݪ}XN³êÄ¢éj©çÄ 1582 Ño¹éæ¤ÉÀ·êÎæ¢D 1583 1584 wè³ê½ÝnhÔªDEF_INHÉηéàÌƵÄLøÈlÅÈ¢ê 1585 Ì®ìÍÛØ·éKvªÈ¢iassertÅG[Æ·é̪]ܵ¢jD±ê 1586 ÍCRtBM 1587 [^ªCpX2Ìev[gt@CÌ^[Qbg˶ 1588 Åè`·éINHNO_DEFINH_VALIDðp¢ÄG[ðo·é½ßÅ éD 1589 1590 6.6.4 ÝvCÌ®«ÌÝè 1591 1592 (6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)iIvVj 1593 1594 intnoªCCFG_INTÉηéÝÔƵÄLøÈlÅ éêÉtrueC»¤ 1595 ÅÈ¢êÉfalseðÔ·}NDÝvCÌ®«ðÝèÅ«È¢ 1596 intnoÉεÄÍC±Ì}NªfalseðÔ·æ¤É·éD 1597 1598 SSPJ[lÌ^[Qbgñ˶ÅÍC±Ì}NÍgíêĢȢ½ßC^[ 1599 Qbg˶ÅgíÈ¢ÈçCpÓ·éKvªÈ¢D 1523 inhnoで指定された割込みハンドラの出入口処理の番地をint_entryに設定する. 1524 1525 この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ 1526 ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存 1527 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する 1528 必要はない. 1529 1530 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため, 1531 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼 1532 び出せるように実装すればよい. 1533 1534 指定された割込みハンドラ番号がDEF_INHに対するものとして有効な値でない場 1535 合の動作は保証する必要がない(assertでエラーとするのが望ましい).これ 1536 は,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存部 1537 で定義するINHNO_DEFINH_VALIDを用いてエラーを検出するためである. 1538 1539 6.6.4 割込み要求ラインの属性の設定 1540 1541 (6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション) 1542 1543 intnoが,CFG_INTに対する割込み番号として有効な値である場合にtrue,そう 1544 でない場合にfalseを返すマクロ.割込み要求ラインの属性を設定できない 1545 intnoに対しては,このマクロがfalseを返すようにする. 1546 1547 SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター 1548 ゲット依存部で使わないなら,用意する必要がない. 1600 1549 1601 1550 (6-6-4-2) void x_config_int(INTNO intno, ATR intatr, PRI intpri) 1602 1551 1603 intnoÅwè³ê½ÝvCÌÝ®«ðCintatrÅwè³ê½Êè 1604 ÉÝè·éDܽCÝDæxðCintpriÅwè³ê½lÉÝè·éD 1605 1606 ±ÌÖÍCWÌÝÇ@\Ìú»ðp¢½êÌÝC^[Qb 1607 gñ˶©çÄÑo³êéDÝÇ@\Ìú»ð^[Qbg˶ 1608 ÅpÓµC»ÌűÌÖðÄÑo³È¢êÉÍC±ÌÖðpÓ·é 1609 KvÍÈ¢D 1610 1611 ±ÌÖÍC^[Qbgñ˶ÌJ[lú»©çÄÑo³êé½ßC 1612 J[lÌú»iNMIð·×ÄÌݪ}XN³êÄ¢éj©çÄ 1613 Ño¹éæ¤ÉÀ·êÎæ¢D 1614 1615 intatrƵÄÝèÅ«éÝ®«ÍÌÊèD 1616 1617 TA_ENAINT 0x01 ÝvÖ~tOðNA 1618 TA_EDGE 0x02 GbWgK 1619 1620 ±Ì¼ÉC^[Qbgè`ÅÝ®«ðÇÁµÄàæ¢D^[Qbgè`Å 1621 ÇÁ·é½ßÉCȺ̮«¼ª\ñ³êÄ¢éD 1622 1623 TA_POSEDGE |WeBuGbWgK 1624 TA_NEGEDGE lKeBuGbWgK 1625 TA_BOTHEDGE ¼GbWgK 1626 TA_LOWLEVEL [xgK 1627 TA_HIGHLEVEL nCxgK 1628 1629 ±êçÌ®«¼ð^[Qbgè`ÅÇÁ·éêÉÍC»Ì®«lðèµC 1630 è`ðtarget_kernel.hiܽÍC»±©çCN[h³êét@CjÉÜ 1631 ßéDܽCRtBM 1632 [^ev[gt@C©çQÆÅ«éæ¤ÉC 1633 target_def.csviܽÍC»±©çCN[h³êét@CjÉÜßCR 1634 tBM 1635 [^ev[gt@CÌ^[Qbgñ˶ÅG[ÆÈç 1636 È¢æ¤ÉCtarget.tfiܽÍC»±©çCN[h³êét@CjÅ 1637 TARGET_INTATRÉÝè·éD 1638 1639 wè³ê½ÝÔªCFG_INTÉηéàÌƵÄLøÈlÅÈ¢êâC» 1640 ÌÝvCÉεÄÝèÅ«È¢®«ðwèµ½êCÝèÅ«È¢ 1641 ÝDæxðwèµ½êÌ®ìÍÛØ·éKvªÈ¢iassertÅG[Æ 1642 ·é̪]ܵ¢jD±Ìæ¤ÈP[XÍCRtBM 1643 [^ÅG[ð 1644 o·×«Å éDRtBM 1645 [^ev[gt@CÌ^[QbgñË 1646 ¶ÍCpX2Ìev[gt@CÌ^[Qbg˶Åè`·é 1647 INTNO_CFGINT_VALIDCTARGET_INTATRCINTPRI_CFGINT_VALIDðp¢ÄG[ð 1648 o·éªCWÌÝ®«iTA_ENAINTCTA_EDGEjªÝèÅ«È¢êâC 1649 ÝèÅ«È¢®«âÝDæxªÝvCÉæÁÄÙÈéêÉÍC 1650 RtBM 1651 [^ev[gt@CÌ^[Qbg˶ÅoµÈ¯ê 1652 ÎÈçÈ¢D 1653 1654 6.6.5 ÝÇ@\Ìú»ÌÏX 1655 1656 (6-6-5-1) OMIT_INITIALIZE_INTERRUPTiIvVj 1657 1658 ÝÇ@\Ìú»ð^[Qbg˶ÅpÓµC^[Qbgñ˶ 1659 ÉÜÜêéWÌÝÇ@\Ìú»ðp¢È¢êÉÍC±ÌV 1660 {ð}Nè`·éD 1661 1662 ±ÌV{ð}Nè`·éÆCINHINIBCINTINIBCinitialize_interrupt 1663 Ìè`ªCJ[lÌ^[Qbgñ˶©çæè©êéDܽC 1664 TNUM_INHNOCtnum_inhnoCinhinib_tableCTNUM_INTNOCtnum_intnoC 1665 intinib_tableÌè`ÆCÝnhÌoüû𶬷é½ßÌLq 1666 iINTHDR_ENTRY}NÌXgjªCRtBM 1667 [^ÌpX2Ìev[ 1668 gt@CÌ^[Qbgñ˶ÉæÁÄkernel_cfg.cɶ¬³êÈÈéD 1669 ½¾µCRtBM 1670 [^ÌpX2Ìev[gt@CÌ^[Qbg˶ 1671 ÅCUSE_INHINIB_TABLEÆUSE_INTINIB_TABLEðÝè·é±ÆÅC»Ìê 1672 ªðkernel_cfg.cɶ¬·é±ÆªÂ\Å éD 1673 1674 (6-6-5-2) void initialize_interrupt(void)iIvVj 1675 1676 OMIT_INITIALIZE_INTERRUPTð}Nè`µ½êÉÍC±ÌÖð^[Qbg 1677 ˶ÅpÓ·éDOMIT_INITIALIZE_INTERRUPTð}Nè`·é±ÆÉæèæ 1678 è©êé»Ì¼Ìf[^^CÏC}NÍC±ÌÖÅgp·éêÉÌ 1679 ÝpÓ·êÎæ¢D 1680 1681 6.6.6 ftHgÌÝnh 1682 1683 (6-6-6-1) default_int_handler(void)iIvVj 1684 1685 RtBM 1686 [^ÉæèÝnhÌe[u𶬷éêÈÇÉÍC 1687 Ýnhðo^µÈ©Á½ÝnhÔÉεÄCftHgÌ 1688 ÝnhƵÄCdefault_int_handlerðo^·éD 1689 1690 default_int_handlerÍCWÌàÌð^[Qbg˶ÅpÓ·éªC[U 1691 ªpÓµ½àÌÅu«·¦çêéæ¤ÉCOMIT_DEFAULT_INT_HANDLERð}N 1692 è`µ½êÉÍC^[Qbg˶Åè`µÈ¢æ¤É·éDȨC[U 1693 ªpÓ·éê̼ÌÍC_kernel_default_int_handlerÆÈéD 1694 1695 6.6.7 J[lÇOÌÝ 1696 1697 J[lÇOÌÝnhÍCJ[làÌÝoüûðoR¹ 1698 ¸ÉÀs·é̪î{Å éD 1699 1700 ½¾µC·×ÄÌÝů¶AhXɪò·évZbTÅÍCJ[l 1701 àÌÝoüûðSoR¹¸ÉJ[lÇOÌÝnhðÀ 1702 s·é±ÆªÅ«È¢½ßCÝoüûÌÈé×¢^C~OÅC 1703 J[lÇOÌÝÅ é©ð»ÊµCàeðª¯éKvª éDï 1704 ÌIÉÍCJ[lÇOÌÝÌoüûÅÍCI[onhÌ 1705 â~Æ®ìJnðsÁÄÍÈçÈ¢DܽCreqflgð`FbNµC^XNØ· 1706 ¦â^XNáO[`ÌÄoµðs¤KvªÈ¢D³çÉCNMIÌoüû 1707 ÅÍCg[XOæ¾ilog_inh_enter¨æÑlog_inh_leavejðÄ 1708 ÑoµÄÍÈçÈ¢D 1709 1710 J[lÇOÌÝnhðÀs·éÛÉCJ[làÌÝoüû 1711 ÌêªðoR·éêÉÍCCPUáOªN±éÂ\«ðÉ͸ç·ÆÆà 1712 ÉCCPUáOðN±·Â\«ª éêÉÍC»ÌÂ\«ð^[QbgË¶Ì 1713 [U[Y}j 1714 AÉLڵȯêÎÈçÈ¢D 1715 1716 ÉCJ[lÇOÌÝÌÝèû@ÉÖµÄCuTOPPERSV¢ãJ[l 1717 dlvÌu6.6.8 J[lÇOÌÝÌÝèû@vÌßÌ3ÂÌû@ 1718 Ì¢¸êðÌp·é©ðè·éD 1719 1720 (a-1)ܽÍ(a-2)ðÌpµCJ[lÇOƵ½ÝÉεÄCJ[l 1721 ÌAPIÉæéÝnhÌo^ÆÝvCÌ®«ÌÝèðT|[g 1722 µÈ¢êÉÍC»êÉãíéû@ð^[Qbg˶Ì[U[Y}j 1723 A 1724 ÉLq·éD 1725 1726 (a-1)ܽÍ(a-2)ðÌpµÄJ[lÌAPIÉæéÝnhÌo^â 1727 ÝvCÌ®«ÌÝèðT|[g·éêâC(b)ðÌpµ½êÉÍC^[ 1728 Qbg˶ɨ¢Ä»êðÀ»·éKvª éD 1729 1730 J[lÇOÌÝÉεÄCDEF_INHÉæéÝnhÌo^ðT|[ 1731 g·éÉÍCÌÝèªKvÉÈéD 1732 1733 ETARGET_INHATRÉCTA_NONKERNELðÝè·éD 1734 1735 E(a-1)ܽÍ(a-2)ðÌpµ½êÉÍCINHNO_DEFINH_VALIDÉCJ[lÇ 1736 @OƵ½ÝÉηéÝnhÔðÜßéDܽC 1737 @VALID_INHNO_DEFINHðCJ[lÇOƵ½ÝnhÔðLøÈ 1738 @lÆ»è·éæ¤É·éD 1739 1740 E(a-1)ܽÍ(a-2)ðÌpµ½êÉÍCINHNO_FIX_KERNELÉJ[lÇÆ 1741 @µ½ÝnhÔÌXgðCINHNO_FIX_NONKERNELÉJ[lÇO 1742 @Ƶ½ÝnhÔÌXgÝè·éD 1743 1744 EDEF_INHªJ[lÇOÌÝÉÎÅ«éæ¤É·éDWÌÝÇ 1745 @@\Ìú»ðp¢éêÉÍCx_define_inhðJ[lÇOÌ 1746 @ÝÉγ¹éD 1747 1748 EKvÈêÉÍCTA_NONKERNEL®«ªÝè³ê½ÝnhðJ[l 1749 @ÇOƵ¤æ¤ÉCJ[làÌÝoüûðC³·éDWÌ 1750 @ÝÇ@\Ìú»ðp¢éêCJ[lÇOÌÝÉ뵀 1751 @ÍCJ[làÌÝoüû𶬹¸CAvP[Vªo^µ 1752 @½Ýnhð¼ÚÄÑo·æ¤ÉC^[Qbgñ˶ÉæèÝè³ 1753 @êé½ßC^[Qbg˶ÅÍηéKvªÈ¢D 1754 1755 J[lÇOÌÝÉεÄCCFG_INTÉæéÝvCÌ®«ÌÝ 1756 èðT|[g·éÉÍCÌÝèªKvÉÈéD 1757 1758 E(a-1)ܽÍ(a-2)ðÌpµ½êÉÍCINTNO_CFGINT_VALIDÉCJ[lÇ 1759 @OƵ½ÝÉηéÝÔðÜßéDܽCVALID_INTNO_CFGINT 1760 @ðCJ[lÇOƵ½ÝÔðLøÈlÆ»è·éæ¤É·éD 1761 1762 E(a-1)ܽÍ(a-2)ðÌpµ½êÉÍCINTNO_FIX_KERNELÉJ[lÇÆ 1763 @µ½ÝÔÌXgðCINTNO_FIX_NONKERNELÉJ[lÇOƵ½ 1764 @ÝÔÌXgÝè·éD 1765 1766 EINTPRI_CFGINT_VALIDÉCJ[lÇOÌÝÆÈéDæxðÜßéD 1767 1768 ECFG_INTªJ[lÇOÌÝÉÎÅ«éæ¤É·éDWÌÝÇ 1769 @@\Ìú»ðp¢éêÉÍCx_config_intðJ[lÇOÌ 1770 @ÝÉγ¹éD 1771 1772 chg_ipmÉæèCiNMIÈOÌjJ[lÇOÌÝð}XNÅ«éæ¤É 1773 ·éêÉÍCÌÝèªKvÉÈéD 1774 1775 EVALID_INTPRI_CHGIPMðCJ[lÇOÌÝÆÈéDæxðLøÈlÆ 1776 @»è·éæ¤É·éD 1777 1778 Et_set_ipmðCJ[lÇOÌÝÆÈéDæxðµ¦éæ¤É·éD 1779 1780 6.7 CPUáOnhÆCPUáO¶ÌVXeóÔÌQÆ 1781 1782 6.7.1 CPUáOnhÌoüû 1783 1784 CPUáOÌoüûÌû@ÍvZbTÉæÁÄå«ÙÈéªC¨¨æ»Ì 1785 àeÍÌÊèD 1552 intnoで指定された割込み要求ラインの割込み属性を,intatrで指定された通り 1553 に設定する.また,割込み優先度を,intpriで指定された値に設定する. 1554 1555 この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ 1556 ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存 1557 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する 1558 必要はない. 1559 1560 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため, 1561 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼 1562 び出せるように実装すればよい. 1563 1564 intatrとして設定できる割込み属性は次の通り. 1565 1566 TA_ENAINT 0x01 割込み要求禁止フラグをクリア 1567 TA_EDGE 0x02 エッジトリガ 1568 1569 この他に,ターゲット定義で割込み属性を追加してもよい.ターゲット定義で 1570 追加するために,以下の属性名が予約されている. 1571 1572 TA_POSEDGE ポジティブエッジトリガ 1573 TA_NEGEDGE ネガティブエッジトリガ 1574 TA_BOTHEDGE 両エッジトリガ 1575 TA_LOWLEVEL ローレベルトリガ 1576 TA_HIGHLEVEL ハイレベルトリガ 1577 1578 これらの属性名をターゲット定義で追加する場合には,その属性値を決定し, 1579 定義をtarget_kernel.h(または,そこからインクルードされるファイル)に含 1580 める.また,コンフィギュレータテンプレートファイルから参照できるように, 1581 target_def.csv(または,そこからインクルードされるファイル)に含め,コ 1582 ンフィギュレータテンプレートファイルのターゲット非依存部でエラーとなら 1583 ないように,target.tf(または,そこからインクルードされるファイル)で 1584 TARGET_INTATRに設定する. 1585 1586 指定された割込み番号がCFG_INTに対するものとして有効な値でない場合や,そ 1587 の割込み要求ラインに対して設定できない属性を指定した場合,設定できない 1588 割込み優先度を指定した場合の動作は保証する必要がない(assertでエラーと 1589 するのが望ましい).このようなケースは,コンフィギュレータでエラーを検 1590 出すべきである.コンフィギュレータテンプレートファイルのターゲット非依 1591 存部は,パス2のテンプレートファイルのターゲット依存部で定義する 1592 INTNO_CFGINT_VALID,TARGET_INTATR,INTPRI_CFGINT_VALIDを用いてエラーを 1593 検出するが,標準の割込み属性(TA_ENAINT,TA_EDGE)が設定できない場合や, 1594 設定できない属性や割込み優先度が割込み要求ラインによって異なる場合には, 1595 コンフィギュレータテンプレートファイルのターゲット依存部で検出しなけれ 1596 ばならない. 1597 1598 6.6.5 割込み管理機能の初期化処理の変更 1599 1600 (6-6-5-1) OMIT_INITIALIZE_INTERRUPT(オプション) 1601 1602 割込み管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存 1603 部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ 1604 ンボルをマクロ定義する. 1605 1606 このシンボルをマクロ定義すると,INHINIB,INTINIB,initialize_interrupt 1607 の定義が,カーネルのターゲット非依存部から取り除かれる.また, 1608 TNUM_INHNO,tnum_inhno,inhinib_table,TNUM_INTNO,tnum_intno, 1609 intinib_tableの定義と,割込みハンドラ毎の出入口処理を生成するための記述 1610 (INTHDR_ENTRYマクロのリスト)が,コンフィギュレータのパス2のテンプレー 1611 トファイルのターゲット非依存部によってkernel_cfg.cに生成されなくなる. 1612 ただし,コンフィギュレータのパス2のテンプレートファイルのターゲット依存 1613 部で,USE_INHINIB_TABLEとUSE_INTINIB_TABLEを設定することで,その一部 1614 分をkernel_cfg.cに生成することが可能である. 1615 1616 (6-6-5-2) void initialize_interrupt(void)(オプション) 1617 1618 OMIT_INITIALIZE_INTERRUPTをマクロ定義した場合には,この関数をターゲット 1619 依存部で用意する.OMIT_INITIALIZE_INTERRUPTをマクロ定義することにより取 1620 り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの 1621 み用意すればよい. 1622 1623 6.6.6 デフォルトの割込みハンドラ 1624 1625 (6-6-6-1) default_int_handler(void)(オプション) 1626 1627 コンフィギュレータにより割込みハンドラのテーブルを生成する場合などには, 1628 割込みハンドラを登録しなかった割込みハンドラ番号に対して,デフォルトの 1629 割込みハンドラとして,default_int_handlerを登録する. 1630 1631 default_int_handlerは,標準のものをターゲット依存部で用意するが,ユーザ 1632 が用意したもので置き換えられるように,OMIT_DEFAULT_INT_HANDLERをマクロ 1633 定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ 1634 が用意する場合の名称は,_kernel_default_int_handlerとなる. 1635 1636 6.6.7 カーネル管理外の割込み 1637 1638 カーネル管理外の割込みハンドラは,カーネル内の割込み出入口処理を経由せ 1639 ずに実行するのが基本である. 1640 1641 ただし,すべての割込みで同じアドレスに分岐するプロセッサでは,カーネル 1642 内の割込み出入口処理を全く経由せずにカーネル管理外の割込みハンドラを実 1643 行することができないため,割込み出入口処理のなるべく早いタイミングで, 1644 カーネル管理外の割込みであるかを判別し,処理内容を分ける必要がある.具 1645 体的には,カーネル管理外の割込みの出入口処理では,オーバランハンドラの 1646 停止と動作開始を行ってはならない.また,reqflgをチェックし,タスク切換 1647 えやタスク例外処理ルーチンの呼出しを行う必要がない.さらに,NMIの出入口 1648 処理では,トレースログ取得処理(log_inh_enterおよびlog_inh_leave)を呼 1649 び出してはならない. 1650 1651 カーネル管理外の割込みハンドラを実行する際に,カーネル内の割込み出入口 1652 処理の一部分を経由する場合には,CPU例外が起こる可能性を極力減らすととも 1653 に,CPU例外を起こす可能性がある場合には,その可能性をターゲット依存部の 1654 ユーザーズマニュアルに記載しなければならない. 1655 1656 次に,カーネル管理外の割込みの設定方法に関して,「TOPPERS新世代カーネル 1657 統合仕様書」の「6.6.8 カーネル管理外の割込みの設定方法」の節の3つの方法 1658 のいずれを採用するかを決定する. 1659 1660 (a-1)または(a-2)を採用し,カーネル管理外とした割込みに対して,カーネル 1661 のAPIによる割込みハンドラの登録と割込み要求ラインの属性の設定をサポート 1662 しない場合には,それに代わる方法をターゲット依存部のユーザーズマニュア 1663 ルに記述する. 1664 1665 (a-1)または(a-2)を採用してカーネルのAPIによる割込みハンドラの登録や割込 1666 み要求ラインの属性の設定をサポートする場合や,(b)を採用した場合には,ター 1667 ゲット依存部においてそれを実現する必要がある. 1668 1669 カーネル管理外の割込みに対して,DEF_INHによる割込みハンドラの登録をサポー 1670 トするには,次の設定が必要になる. 1671 1672 ・TARGET_INHATRに,TA_NONKERNELを設定する. 1673 1674 ・(a-1)または(a-2)を採用した場合には,INHNO_DEFINH_VALIDに,カーネル管 1675 理外とした割込みに対応する割込みハンドラ番号を含める.また, 1676 VALID_INHNO_DEFINHを,カーネル管理外とした割込みハンドラ番号を有効な 1677 値と判定するようにする. 1678 1679 ・(a-1)または(a-2)を採用した場合には,INHNO_FIX_KERNELにカーネル管理と 1680 した割込みハンドラ番号のリストを,INHNO_FIX_NONKERNELにカーネル管理外 1681 とした割込みハンドラ番号のリスト設定する. 1682 1683 ・DEF_INHがカーネル管理外の割込みに対応できるようにする.標準の割込み管 1684 理機能の初期化処理を用いる場合には,x_define_inhをカーネル管理外の割 1685 込みに対応させる. 1686 1687 ・必要な場合には,TA_NONKERNEL属性が設定された割込みハンドラをカーネル 1688 管理外と扱うように,カーネル内の割込み出入口処理を修正する.標準の割 1689 込み管理機能の初期化処理を用いる場合,カーネル管理外の割込みに対して 1690 は,カーネル内の割込み出入口処理を生成せず,アプリケーションが登録し 1691 た割込みハンドラを直接呼び出すように,ターゲット非依存部により設定さ 1692 れるため,ターゲット依存部では対応する必要がない. 1693 1694 カーネル管理外の割込みに対して,CFG_INTによる割込み要求ラインの属性の設 1695 定をサポートするには,次の設定が必要になる. 1696 1697 ・(a-1)または(a-2)を採用した場合には,INTNO_CFGINT_VALIDに,カーネル管 1698 理外とした割込みに対応する割込み番号を含める.また,VALID_INTNO_CFGINT 1699 を,カーネル管理外とした割込み番号を有効な値と判定するようにする. 1700 1701 ・(a-1)または(a-2)を採用した場合には,INTNO_FIX_KERNELにカーネル管理と 1702 した割込み番号のリストを,INTNO_FIX_NONKERNELにカーネル管理外とした割 1703 込み番号のリスト設定する. 1704 1705 ・INTPRI_CFGINT_VALIDに,カーネル管理外の割込みとなる優先度を含める. 1706 1707 ・CFG_INTがカーネル管理外の割込みに対応できるようにする.標準の割込み管 1708 理機能の初期化処理を用いる場合には,x_config_intをカーネル管理外の割 1709 込みに対応させる. 1710 1711 chg_ipmにより,(NMI以外の)カーネル管理外の割込みをマスクできるように 1712 する場合には,次の設定が必要になる. 1713 1714 ・VALID_INTPRI_CHGIPMを,カーネル管理外の割込みとなる優先度を有効な値と 1715 判定するようにする. 1716 1717 ・t_set_ipmを,カーネル管理外の割込みとなる優先度を扱えるようにする. 1718 1719 6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照 1720 1721 6.7.1 CPU例外ハンドラの出入口処理 1722 1723 CPU例外の出入口処理の方法はプロセッサによって大きく異なるが,おおよその 1724 処理内容は次の通り. 1786 1725 1787 1726 ---------------------------------------- 1788 1727 void 1789 <CPU áOÌoüû>(void)1728 <CPU例外の出入口処理>(void) 1790 1729 { 1791 XNb`WX^ðX^bNÉÛ¶·é1792 if ( J[lÇOÌCPUáO) {1793 if ( ^XNReLXgÅCPUáO¶) {1794 ñ^XNReLXgÉØè·¦é1730 スクラッチレジスタをスタックに保存する 1731 if (カーネル管理外のCPU例外) { 1732 if (タスクコンテキストでCPU例外発生) { 1733 非タスクコンテキストに切り換える 1795 1734 } 1796 VXeóÔiReLXgÍjðCCPUáO¶ÌóÔÉ·é1797 CPU áOnhðCCPUáOÌîñðL¯µÄ¢éÌæÌæªÔnð1798 p[^ip_excinfjƵÄÄÑo·1799 if ( ^XNReLXgÅCPUáO¶) {1800 ^XNReLXgÉØè·¦é1735 システム状態(コンテキストは除く)を,CPU例外発生時の状態にする 1736 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を 1737 パラメータ(p_excinf)として呼び出す 1738 if (タスクコンテキストでCPU例外発生) { 1739 タスクコンテキストに切り換える 1801 1740 } 1802 CPU áO©çÌ^[ãÉCCPUáO¶ÌVXeóÔÉ1803 ßéæ¤Éõ·é1741 CPU例外処理からのリターン後に,CPU例外発生時のシステム状態に 1742 戻るように準備する 1804 1743 } 1805 1744 else { 1806 if ( ^XNReLXgÅCPUáO¶) {1807 ñ^XNReLXgÉØè·¦é1745 if (タスクコンテキストでCPU例外発生) { 1746 非タスクコンテキストに切り換える 1808 1747 } 1809 VXeóÔiReLXgÍjðCCPUáO¶ÌóÔÉ·é1810 @iCPUáO¶ÌÝDæx}XNæèàDæxÌ¢Ý1811 ÌÝðó¯t¯çêéæ¤ÉµÄCCPUbNðóÔÉ·éj1748 システム状態(コンテキストは除く)を,CPU例外発生時の状態にする 1749 (CPU例外発生時の割込み優先度マスクよりも優先度の高い割込み 1750 のみを受け付けられるようにして,CPUロック解除状態にする) 1812 1751 1813 1752 #ifdef LOG_EXC_ENTER 1814 log_exc_enter(CPU áOnhÔ);1753 log_exc_enter(CPU例外ハンドラ番号); 1815 1754 #endif /* LOG_EXC_ENTER */ 1816 CPU áOnhðCCPUáOÌîñðL¯µÄ¢éÌæÌæªÔnð1817 p[^ip_excinfjƵÄÄÑo·1755 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を 1756 パラメータ(p_excinf)として呼び出す 1818 1757 #ifdef LOG_EXC_LEAVE 1819 log_exc_leave(CPU áOnhÔ);1758 log_exc_leave(CPU例外ハンドラ番号); 1820 1759 #endif /* LOG_EXC_LEAVE */ 1821 1760 1822 1761 ret_exc: 1823 if ( ^XNReLXgÅCPUáO¶) {1824 iÈÆàjJ[lÇÌÝðÖ~µ½óÔÉ·é c(*d)1825 ^XNReLXgÉØè·¦é1762 if (タスクコンテキストでCPU例外発生) { 1763 (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d) 1764 タスクコンテキストに切り換える 1826 1765 if (reqflg) { 1827 1766 reqflg = false; 1828 CPU bNóÔÉ·é c(*e)1829 search_schedtsk ðÄÑoµCÅDæÊ^XNðßé1830 ÅDæÊÌ^XNIDðøɵÄrun_taskɪò·é1767 CPUロック状態にする … (*e) 1768 search_schedtskを呼び出し,最高優先順位タスクを求める 1769 最高優先順位のタスクIDを引数にしてrun_taskに分岐する 1831 1770 } 1832 1771 } 1833 CPU áO©çÌ^[ãÉCCPUbNðóÔÉßéæ¤Éõ·é1772 CPU例外処理からのリターン後に,CPUロック解除状態に戻るように準備する 1834 1773 } 1835 XNb`WX^ðX^bN©çA·é1836 CPU áO©çÌ^[1774 スクラッチレジスタをスタックから復帰する 1775 CPU例外処理からのリターン 1837 1776 } 1838 1777 ---------------------------------------- 1839 1778 1840 CPUáOnhÍCñReLXgÉØè·¦é±Æð¢ÄÍCCPUáO 1841 ¶Æ¯¶VXeóÔÅÄÑo³È¯êÎÈçÈ¢Dá¦ÎCCPUáOªCPU 1842 bNóÔŶµ½êÉÍCPUbNóÔCCPUbNðóÔŶµ½ 1843 êÉÍCPUbNðóÔÅCCPUáOnhðÄÑo³È¯êÎÈçÈ¢D 1844 CPUbNóÔŶµ½CPUáOÍCJ[lÇOÌCPUáOÆÈé½ßCJ[ 1845 lÇÌCPUáOnhÉ¢ÄÍCCPUbNðóÔÅÄÑo·±ÆÉ 1846 ÈéD 1847 1848 J[lÇOÌCPUáOÅ é±ÆÍCexc_sense_unlockªfalseðÔ·ð 1849 ÆC^XNReLXgÅ é±Æð²×È¢¾¯Ìá¢Å èCÙÚ¯¶R[ 1850 hÅ»è·é±ÆªÅ«éD 1851 1852 ãÌR[hÅÍCJ[lÇOÌCPUáOÉεÄCg[XOæ¾ 1853 ilog_exc_enter¨æÑlog_exc_leavejðÄÑoµÄ¢È¢ªCSÝb 1854 NóÔ©NMIÌÉCPUáOª¶µ½êðO·êÎCÄÑoµÄà© 1855 ÜíÈ¢DSÝbNóÔ©NMIÌɶµ½CPUáOÌêÉÍC 1856 g[XOæ¾ðÄÑoµÄÍÈçÈ¢D 1857 1858 CPUáOnhðÀs·éÛÉoR·éªÅÍCCPUáOªN±éÂ\«ð 1859 É͸ç·ÆÆàÉCCPUáOðN±·Â\«ª éêiá¦ÎCXNb` 1860 WX^ðX^bNÉÛ¶·éÉCoXG[ÈÇÌCPUáOª¶·éÂ\ 1861 «ªl¦çêéjÉÍC»ÌÂ\«ð^[Qbg˶Ì[U[Y}j 1862 A 1863 ÉLڵȯêÎÈçÈ¢D 1864 1865 ret_excÈ~ÌÍCÝÌoüûÌret_intÈ~ÌƯ¶Å é 1866 ½ßC^[QbgÉæÁÄÍC¤ÊÌ[`ðp¢é±ÆªÅ«éÂ\«ª 1867 éD 1868 1869 CPUáOÌoüûðAZu¾êÅLq·éêÉÍCg[XOæ¾ 1870 ÍCu6.2 g[XO@\ÖÌÎvÌßÅLqµ½û@ÅR[fB 1871 O·é±ÆD 1872 1873 6.7.2 CPUáOnhÌoüû̶¬ 1874 1875 CPUáOxNgðn[hEFAÅÀ»µÄ¢éêÈÇCCPUáOnh 1876 ÉoüûðpÓµ½ûªø¦ªÇ¢^[Qbg̽ßÉCCPUáOnh 1877 Éoüû𶬷é@\ðpӵĢéD 1878 1879 ȺÌ}NÍCWÌCPUáOÇ@\Ìú»ðp¢½êÌÝC^[ 1880 Qbgñ˶ÅgíêéDCPUáOÇ@\Ìú»ð^[Qbg˶ 1881 ÅpÓµC»ÌűêçÌ}NðgíÈ¢êÉÍC±êçÌ}Nðp 1882 Ó·éKvÍÈ¢D 1779 CPU例外ハンドラは,非コンテキストに切り換えることを除いては,CPU例外発 1780 生時と同じシステム状態で呼び出さなければならない.例えば,CPU例外がCPU 1781 ロック状態で発生した場合にはCPUロック状態,CPUロック解除状態で発生した 1782 場合にはCPUロック解除状態で,CPU例外ハンドラを呼び出さなければならない. 1783 CPUロック状態で発生したCPU例外は,カーネル管理外のCPU例外となるため,カー 1784 ネル管理のCPU例外ハンドラについては,CPUロック解除状態で呼び出すことに 1785 なる. 1786 1787 カーネル管理外のCPU例外であることは,exc_sense_unlockがfalseを返す条件 1788 と,タスクコンテキストであることを調べないだけの違いであり,ほぼ同じコー 1789 ドで判定することができる. 1790 1791 上のコードでは,カーネル管理外のCPU例外に対して,トレースログ取得処理 1792 (log_exc_enterおよびlog_exc_leave)を呼び出していないが,全割込みロッ 1793 ク状態かNMIの処理中にCPU例外が発生した場合を除外すれば,呼び出してもか 1794 まわない.全割込みロック状態かNMIの処理中に発生したCPU例外の場合には, 1795 トレースログ取得処理を呼び出してはならない. 1796 1797 CPU例外ハンドラを実行する際に経由する部分では,CPU例外が起こる可能性を 1798 極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,スクラッチ 1799 レジスタをスタックに保存する時に,バスエラーなどのCPU例外が発生する可能 1800 性が考えられる)には,その可能性をターゲット依存部のユーザーズマニュア 1801 ルに記載しなければならない. 1802 1803 ret_exc以降の処理は,割込みの出入口処理のret_int以降の処理と同じである 1804 ため,ターゲットによっては,共通のルーチンを用いることができる可能性が 1805 ある. 1806 1807 CPU例外の出入口処理をアセンブリ言語で記述する場合には,トレースログ取得 1808 処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン 1809 グすること. 1810 1811 6.7.2 CPU例外ハンドラの出入口処理の生成 1812 1813 CPU例外ベクトルをハードウェアで実現している場合など,CPU例外ハンドラ毎 1814 に出入口処理を用意した方が効率が良いターゲットのために,CPU例外ハンドラ 1815 毎に出入口処理を生成する機構を用意している. 1816 1817 以下のマクロは,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ター 1818 ゲット非依存部で使われる.CPU例外管理機能の初期化処理をターゲット依存部 1819 で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用 1820 意する必要はない. 1883 1821 1884 1822 (6-7-2-1) EXC_ENTRY(excno, exchdr) 1885 1823 1886 CPU áOnhÔªexcnoCCPUáOnhÌÖ¼ªexchdrÅ éCPUá1887 OnhÌoüûÌxðìé}NDEXCHDR_ENTRYðp¢ÄCPUáO 1888 nhÉoüû𶬷éêÉÍCÌæ¤Éè`·éD 1824 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例 1825 外ハンドラの出入口処理のラベルを作るマクロ.EXCHDR_ENTRYを用いてCPU例外 1826 ハンドラ毎に出入口処理を生成する場合には,次のように定義する. 1889 1827 1890 1828 #define EXC_ENTRY(excno, exchdr) _kernel_##exchdr##_##excno 1891 1829 1892 CPU áOnhÉoüûðìéKvªÈ¢êÉÍCÌæ¤Éè`µ1893 ÄCCPUáOnhÌÖ¼ð»ÌÜÜÔ·D 1830 CPU例外ハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し 1831 て,CPU例外ハンドラの関数名をそのまま返す. 1894 1832 1895 1833 #define EXC_ENTRY(excno, exchdr) exchdr … … 1897 1835 (6-7-2-2) EXCHDR_ENTRY(excno, excno_num, exchdr) 1898 1836 1899 CPU áOnhÔªexcnoCCPUáOnhÌÖ¼ªexchdrÅ éCPUá1900 OnhÌoüû𶬷é}NDexcno_numÉÍCAZu¾êL 1901 qpÉCCPUáOnhÔªlÅn³êéDCPUáOnhÉoüû 1902 ðìéKvªÈ¢êÉÍCóÉè`·éD 1903 1904 6.7.3 CPU áOnhÌÝè1905 1906 (6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno) iIvVj1907 1908 excno ªCDEF_EXCÉηéCPUáOnhÔƵÄLøÈlÅ éêÉ1909 true C»¤ÅÈ¢êÉfalseðÔ·}ND1910 1911 SSP J[lÌ^[Qbgñ˶ÅÍC±Ì}NÍgíêĢȢ½ßC^[1912 Qbg˶ÅgíÈ¢ÈçCpÓ·éKvªÈ¢D 1837 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例 1838 外ハンドラの出入口処理を生成するマクロ.excno_numには,アセンブリ言語記 1839 述用に,CPU例外ハンドラ番号が数値で渡される.CPU例外ハンドラ毎に出入口 1840 処理を作る必要がない場合には,空に定義する. 1841 1842 6.7.3 CPU例外ハンドラの設定 1843 1844 (6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)(オプション) 1845 1846 excnoが,DEF_EXCに対するCPU例外ハンドラ番号として有効な値である場合に 1847 true,そうでない場合にfalseを返すマクロ. 1848 1849 SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター 1850 ゲット依存部で使わないなら,用意する必要がない. 1913 1851 1914 1852 (6-7-3-2) void x_define_exc(EXCNO excno, FP exc_entry) 1915 1853 1916 excnoÅwè³ê½CPUáOnhÌoüûÌÔnðexc_entryÉÝè·éD 1917 1918 ±ÌÖÍCWÌCPUáOÇ@\Ìú»ðp¢½êÌÝC^[Qb 1919 gñ˶©çÄÑo³êéDCPUáOÇ@\Ìú»ð^[Qbg˶ 1920 ÅpÓµC»ÌűÌÖðÄÑo³È¢êÉÍC±ÌÖðpÓ·é 1921 KvÍÈ¢D 1922 1923 ±ÌÖÍC^[Qbgñ˶ÌJ[lú»©çÄÑo³êé½ßC 1924 J[lÌú»iNMIð·×ÄÌݪ}XN³êÄ¢éj©çÄ 1925 Ño¹éæ¤ÉÀ·êÎæ¢D 1926 1927 wè³ê½CPUáOnhÔªDEF_EXCÉηéàÌƵÄLøÈlÅÈ¢ 1928 êÌ®ìÍÛØ·éKvªÈ¢iassertÅG[Æ·é̪]ܵ¢jD± 1929 êÍCRtBM 1930 [^ªCpX2Ìev[gt@CÌ^[Qbg˶ 1931 Åè`·éEXCNO_DEFEXC_VALIDðp¢ÄG[ðo·é½ßÅ éD 1932 1933 6.7.4 CPUáOÇ@\Ìú»ÌÏX 1934 1935 (6-7-4-1) OMIT_INITIALIZE_EXCEPTIONiIvVj 1936 1937 CPUáOÇ@\Ìú»ð^[Qbg˶ÅpÓµC^[Qbgñ˶ 1938 ÉÜÜêéWÌÝÇ@\Ìú»ðp¢È¢êÉÍC±ÌV 1939 {ð}Nè`·éD 1940 1941 ±ÌV{ð}Nè`·éÆCEXCINIBÆinitialize_exceptionÌè`ªC 1942 J[lÌ^[Qbgñ˶©çæè©êéDܽCTNUM_EXCNOC 1943 tnum_excnoCexcinib_tableÌè`ÆCCPUáOnhÌoüû𶬠1944 ·é½ßÌLqiEXCHDR_ENTRY}NÌXgjðCRtBM 1945 [^Ìp 1946 X2Ìev[gt@CÌ^[Qbgñ˶ÉæÁÄkernel_cfg.cɶ¬ 1947 ³êÈÈéD 1948 1949 (6-7-4-2) void initialize_exception(void)iIvVj 1950 1951 OMIT_INITIALIZE_EXCEPTIONð}Nè`µ½êÉÍC±ÌÖð^[Qbg 1952 ˶ÅpÓ·éDOMIT_INITIALIZE_EXCEPTIONð}Nè`·é±ÆÉæèæ 1953 è©êé»Ì¼Ìf[^^CÏC}NÍC±ÌÖÅgp·éêÉÌ 1954 ÝpÓ·êÎæ¢D 1955 1956 6.7.5 ftHgÌCPUáOnh 1957 1958 (6-7-5-1) default_exc_handler(void)iIvVj 1959 1960 RtBM 1961 [^ÉæèCPUáOnhÌe[u𶬷éêÈÇÉÍC 1962 CPUáOnhðo^µÈ©Á½CPUáOnhÔÉεÄCftHg 1963 ÌCPUáOnhƵÄCdefault_exc_handlerðo^·éD 1964 1965 default_exc_handlerÍCWÌàÌð^[Qbg˶ÅpÓ·éªC[U 1966 ªpÓµ½àÌÅu«·¦çêéæ¤ÉCOMIT_DEFAULT_EXC_HANDLERð}N 1967 è`µ½êÉÍC^[Qbg˶Åè`µÈ¢æ¤É·éDȨC[U 1968 ªpÓ·éê̼ÌÍC_kernel_default_exc_handlerÆÈéD 1969 1970 6.8 J[lÌN®EI¹ÆX^bNÌæÈÇ 1971 1972 (6-8-1) X^[gAbvW 1973 [ 1974 1975 J[lÌX^[gAbvW 1976 [ÍCVXeÌZbgãÉÅÉÀs 1977 ³êévOÅ éDX^[gAbvW 1978 [ÍCWIÉÍCvZb 1979 T˶ܽÍ`bv˶ÅpӵȺÌðs¤ªC»êɱ¾íéK 1980 vÍÈ¢DïÌIÉÍCJ«ÉpÓ³êÄ¢éX^[gAbvW 1981 [ 1982 ðp¢éû@i±ÌêC^[Qbg˶ÅmainÖðpÓ·éKvª éj 1983 âCAvP[VÅpÓ·éêªl¦çêéD 1984 1985 (a) vZbTóÔÌú» 1986 1987 vZbT[hCX^bN|C^Ct[|C^CvZbTÌó 1988 Ôðú»·éDܽCNMIð·×ÄÌÝð}XNµ½óÔiSÝ 1989 bNóÔƯÌóÔjÆ·éDDRAMRg[Ìú»ÈÇCð 1990 ANZX·é½ßÉKvÈú»ð±±ÅsÁÄàæ¢iÌ 1991 hardware_init_hookÅsÁÄàæ¢jD 1992 1993 (b) hardware_init_hookðÄÑo· 1994 1995 VXeÌZbgã·®És¤KvÌ é^[QbgVXe˶Ìú» 1996 ðs¤½ßÉChardware_init_hookðÄÑo·Dhardware_init_hookªp 1997 Ó³êĢȢêÍC½àµÈ¢DGNUJ«ÅÍCJXNvgÌ 1998 weak definitionÉæèChardware_init_hookªpÓ³êĢȢêÌlð0 1999 Æ·é±ÆÅC±êðÀ»Å«éDweak definitionÌ@\ð½È¢J« 2000 ÅÍChardware_init_hookðK¸ÄÑo·±ÆÉ·éD 2001 2002 hardware_init_hookÍC^[Qbg˶ÅpÓ·é̪WÅ éªCVX 2003 eÌZbgã·®És¤KvÌ éú»ðÇÁ·é½ßÉCAv 2004 P[VÅpÓµ½àÌðp¢éêà éD 2005 2006 ANZXÉKvÈú»ðhardware_init_hookÅs¤êÉÍC± 2007 êðÄÑo·_ÅÉANZX·é±ÆªÅ«È¢½ßCÖiTu[ 2008 `jðÄÑo·½ßÉX^bNðgp·évZbTÅÍCßèÔnðÄp 2009 WX^ÉüêÄÄÑo·Æ¢Á½HvªKvÅ éD±ÌêC 2010 hardware_init_hookðC¾êÅLq·é±ÆÍÅ«ÈÈéªCâÞð¦È¢D 2011 2012 (c) bssZNVÆdataZNVÌú» 2013 2014 bssZNVðNAµCdataZNVÉúlðÝè·éD 2015 2016 ½¾µCJ[l{ÌÍCkerflgªfalsei0jÉú»³êé±ÆÈOÉC 2017 ±êçÌZNVªú»³êé±ÆÉ˶µÄ¢È¢½ßCX^[gAb 2018 vW 2019 [ðAvP[VÅpÓ·éêÅCVXeT[rXâAv 2020 P[Vª±êçÌZNVªú»³êé±ÆÉ˶µÄ¢È¢ê 2021 ÉÍCVXeÌN®ÔðZk·é½ßÉCkerflgðfalseÉú»·é¾¯ 2022 Å\ªÅ éD 2023 2024 (d) software_init_hookðÄÑo· 2025 2026 J«iÁÉCujÉ˶µÄKvÈú»ðs¤½ßÉC 2027 software_init_hookðÄÑo·Dsoftware_init_hookªpÓ³êĢȢê 2028 ÍC½àµÈ¢DGNUJ«ÅÍCJXNvgÌweak definitionÉ 2029 æèCsoftware_init_hookªpÓ³êĢȢêÌlð0Æ·é±ÆÅC±ê 2030 ðÀ»Å«éDweak definitionÌ@\ð½È¢J«ÅÍC 2031 software_init_hookðK¸ÄÑo·±ÆÉ·éD 2032 2033 software_init_hookÍC^[Qbg˶ÅpÓ·é̪WÅ éD 2034 2035 (e) sta_kerÖªò 2036 2037 sta_kerðÄÑo·Dsta_kerÍCNMIð·×ÄÌÝð}XNµ½óÔ 2038 iSÝbNóÔƯÌóÔjÅÄÑo³È¯êÎÈçÈ¢Dsta_ker© 2039 çÍ^[·é±ÆªÈ¢½ßCX^[gAbvW 2040 [ÉßÁÄé± 2041 ÆÍl¦éKvªÈ¢D 1854 excnoで指定されたCPU例外ハンドラの出入口処理の番地をexc_entryに設定する. 1855 1856 この関数は,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ターゲッ 1857 ト非依存部から呼び出される.CPU例外管理機能の初期化処理をターゲット依存 1858 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する 1859 必要はない. 1860 1861 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため, 1862 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼 1863 び出せるように実装すればよい. 1864 1865 指定されたCPU例外ハンドラ番号がDEF_EXCに対するものとして有効な値でない 1866 場合の動作は保証する必要がない(assertでエラーとするのが望ましい).こ 1867 れは,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存 1868 部で定義するEXCNO_DEFEXC_VALIDを用いてエラーを検出するためである. 1869 1870 6.7.4 CPU例外管理機能の初期化処理の変更 1871 1872 (6-7-4-1) OMIT_INITIALIZE_EXCEPTION(オプション) 1873 1874 CPU例外管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存 1875 部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ 1876 ンボルをマクロ定義する. 1877 1878 このシンボルをマクロ定義すると,EXCINIBとinitialize_exceptionの定義が, 1879 カーネルのターゲット非依存部から取り除かれる.また,TNUM_EXCNO, 1880 tnum_excno,excinib_tableの定義と,CPU例外ハンドラ毎の出入口処理を生成 1881 するための記述(EXCHDR_ENTRYマクロのリスト)を,コンフィギュレータのパ 1882 ス2のテンプレートファイルのターゲット非依存部によってkernel_cfg.cに生成 1883 されなくなる. 1884 1885 (6-7-4-2) void initialize_exception(void)(オプション) 1886 1887 OMIT_INITIALIZE_EXCEPTIONをマクロ定義した場合には,この関数をターゲット 1888 依存部で用意する.OMIT_INITIALIZE_EXCEPTIONをマクロ定義することにより取 1889 り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの 1890 み用意すればよい. 1891 1892 6.7.5 デフォルトのCPU例外ハンドラ 1893 1894 (6-7-5-1) default_exc_handler(void)(オプション) 1895 1896 コンフィギュレータによりCPU例外ハンドラのテーブルを生成する場合などには, 1897 CPU例外ハンドラを登録しなかったCPU例外ハンドラ番号に対して,デフォルト 1898 のCPU例外ハンドラとして,default_exc_handlerを登録する. 1899 1900 default_exc_handlerは,標準のものをターゲット依存部で用意するが,ユーザ 1901 が用意したもので置き換えられるように,OMIT_DEFAULT_EXC_HANDLERをマクロ 1902 定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ 1903 が用意する場合の名称は,_kernel_default_exc_handlerとなる. 1904 1905 6.8 カーネルの起動・終了とスタック領域など 1906 1907 (6-8-1) スタートアップモジュール 1908 1909 カーネルのスタートアップモジュールは,システムのリセット後に最初に実行 1910 されるプログラムである.スタートアップモジュールは,標準的には,プロセッ 1911 サ依存部またはチップ依存部で用意し以下の処理を行うが,それにこだわる必 1912 要はない.具体的には,開発環境に用意されているスタートアップモジュール 1913 を用いる方法(この場合,ターゲット依存部でmain関数を用意する必要がある) 1914 や,アプリケーションで用意する場合が考えられる. 1915 1916 (a) プロセッサ状態の初期化 1917 1918 プロセッサモード,スタックポインタ,フレームポインタ等,プロセッサの状 1919 態を初期化する.また,NMIを除くすべての割込みをマスクした状態(全割込み 1920 ロック状態と同等の状態)とする.DRAMコントローラの初期化など,メモリを 1921 アクセスするために必要な初期化処理をここで行ってもよい(次の 1922 hardware_init_hookで行ってもよい). 1923 1924 (b) hardware_init_hookを呼び出す 1925 1926 システムのリセット後すぐに行う必要のあるターゲットシステム依存の初期化 1927 処理を行うために,hardware_init_hookを呼び出す.hardware_init_hookが用 1928 意されていない場合は,何もしない.GNU開発環境では,リンカスクリプト中の 1929 weak definitionにより,hardware_init_hookが用意されていない場合の値を0 1930 とすることで,これを実現できる.weak definitionの機能を持たない開発環境 1931 では,hardware_init_hookを必ず呼び出すことにする. 1932 1933 hardware_init_hookは,ターゲット依存部で用意するのが標準であるが,シス 1934 テムのリセット後すぐに行う必要のある初期化処理を追加するために,アプリ 1935 ケーションで用意したものを用いる場合もある. 1936 1937 メモリアクセスに必要な初期化処理をhardware_init_hookで行う場合には,こ 1938 れを呼び出す時点でメモリにアクセスすることができないため,関数(サブルー 1939 チン)を呼び出すためにスタックを使用するプロセッサでは,戻り番地を汎用 1940 レジスタに入れて呼び出すといった工夫が必要である.この場合, 1941 hardware_init_hookをC言語で記述することはできなくなるが,やむをえない. 1942 1943 (c) bssセクションとdataセクションの初期化 1944 1945 bssセクションをクリアし,dataセクションに初期値を設定する. 1946 1947 ただし,カーネル本体は,kerflgがfalse(=0)に初期化されること以外に, 1948 これらのセクションが初期化されることに依存していないため,スタートアッ 1949 プモジュールをアプリケーションで用意する場合で,システムサービスやアプ 1950 リケーションがこれらのセクションが初期化されることに依存していない場合 1951 には,システムの起動時間を短縮するために,kerflgをfalseに初期化するだけ 1952 で十分である. 1953 1954 (d) software_init_hookを呼び出す 1955 1956 開発環境(特にライブラリ)に依存して必要な初期化処理を行うために, 1957 software_init_hookを呼び出す.software_init_hookが用意されていない場合 1958 は,何もしない.GNU開発環境では,リンカスクリプト中のweak definitionに 1959 より,software_init_hookが用意されていない場合の値を0とすることで,これ 1960 を実現できる.weak definitionの機能を持たない開発環境では, 1961 software_init_hookを必ず呼び出すことにする. 1962 1963 software_init_hookは,ターゲット依存部で用意するのが標準である. 1964 1965 (e) sta_kerへ分岐 1966 1967 sta_kerを呼び出す.sta_kerは,NMIを除くすべての割込みをマスクした状態 1968 (全割込みロック状態と同等の状態)で呼び出さなければならない.sta_kerか 1969 らはリターンすることがないため,スタートアップモジュールに戻ってくるこ 1970 とは考える必要がない. 2042 1971 2043 1972 (6-8-2) void target_initialize(void) 2044 1973 2045 ^[Qbg˶Ìú»ðs¤ÖDsta_kerÌÅÅÄÑo³êéDvZb 2046 TE`bvEJ«˶Ìú»ðC»êçÌ˶ÉØ誯é±Æ 2047 àÂ\Å éD 2048 2049 ±ÌÖÍC ÜÅàJ[lÌ^[Qbg˶Ìú»ðs¤½ß 2050 ÌàÌÅ éDAvP[VÉKvÈú»ÍCú»[`Ås 2051 ¤Ìªî{Å éªCVXeÌZbgã·®És¤Kvª éêÉÍC 2052 hardware_init_hook ðp¢éD1974 ターゲット依存部の初期化を行う関数.sta_kerの最初で呼び出される.プロセッ 1975 サ・チップ・開発環境依存の初期化処理を,それらの依存部に切り分けること 1976 も可能である. 1977 1978 この関数は,あくまでもカーネルのターゲット依存部の初期化処理を行うため 1979 のものである.アプリケーションに必要な初期化処理は,初期化ルーチンで行 1980 うのが基本であるが,システムのリセット後すぐに行う必要がある場合には, 1981 hardware_init_hookを用いる. 2053 1982 2054 1983 (6-8-3) void call_exit_kernel(void) 2055 1984 2056 ñ^XNReLXgÉØè·¦ÄCexit_kernelÖªò·éÖDext_ker© 2057 çÄÑo³êéDexit_kernel©çÍ^[·é±ÆªÈ¢½ßC±ÌÖÉ 2058 ßÁÄé±ÆÍl¦éKvªÈ¢D 2059 2060 ñ^XNReLXgÉØè·¦éÌÍCI¹[`ðCñ^XNR 2061 eLXgpÌX^bNÅÀs·é½ßÅ éDI¹[`ð^XNpÌ 2062 X^bNÅÀs·éÆCe^XNÌX^bNÌæÌTCYðè·éÛÉCI 2063 ¹[`ªgp·éX^bNÌæðl¶µÈ¯êÎÈçÈ¢D±êÉÍC 2064 I¹[`ªgp·éX^bNÌæªå«¢êÉe^XNÌX^bN 2065 Ìæð³ÊÉ嫵ȯêÎÈçÈ¢±ÆÉÁ¦ÄCÓ}µÈ¢X^bNI[ 2066 o[t[ª¶·éÂ\«ðßéÆ¢¤âèª éD 2067 2068 ±ÌÖÍCSÝbNóÔÅÄÎêé½ßCSÝbNóÔ©çÄ 2069 Ño·±ÆªÅ«È¢ÖðÄÎÈ¢æ¤ÉÀµÈ¯êÎÈçÈ¢D 1985 非タスクコンテキストに切り換えて,exit_kernelへ分岐する関数.ext_kerか 1986 ら呼び出される.exit_kernelからはリターンすることがないため,この関数に 1987 戻ってくることは考える必要がない. 1988 1989 非タスクコンテキストに切り換えるのは,終了処理ルーチンを,非タスクコン 1990 テキスト用のスタックで実行するためである.終了処理ルーチンをタスク用の 1991 スタックで実行すると,各タスクのスタック領域のサイズを決定する際に,終 1992 了処理ルーチンが使用するスタック領域を考慮しなければならない.これには, 1993 終了処理ルーチンが使用するスタック領域が大きい場合に各タスクのスタック 1994 領域を無駄に大きくしなければならないことに加えて,意図しないスタックオー 1995 バーフローが発生する可能性を高めるという問題がある. 1996 1997 この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼 1998 び出すことができない関数を呼ばないように実装しなければならない. 2070 1999 2071 2000 (6-8-4) void target_exit(void) 2072 2001 2073 ^[Qbg˶ÌI¹ðs¤ÖD±ÌÖÍCJ[lI¹ÌÅ 2074 ãÉÄÑo³êC^[µÄÍÈçÈ¢DvZbTE`bvEJÂ«Ë 2075 ¶ÌI¹ðC»êçÌ˶ÉØ誯é±ÆàÂ\Å éD 2076 2077 ±ÌÖÅÍCÅÉCatexitÉæÁÄo^³ê½ÖÆfXgN^ðÄÑ 2078 o·±ÆðÓ}µÄ¨èCWIÉÍCsoftware_term_hookðÄÑo·D 2079 software_term_hook ªpÓ³êĢȢêÍC½àµÈ¢DGNUJ«ÅÍC2080 JXNvgÌweak definitionÉæèCsoftware_term_hookªpÓ³ê 2081 ĢȢêÌlð0Æ·é±ÆÅC±êðÀ»Å«éDweak definitionÌ@ 2082 \ð½È¢J«ÅÍCsoftware_term_hookðK¸ÄÑo·±ÆÉ·éD 2083 2084 ±ÌÖÍCSÝbNóÔÅÄÎêé½ßCSÝbNóÔ©çÄ 2085 Ño·±ÆªÅ«È¢ÖðÄÎÈ¢æ¤ÉÀµÈ¯êÎÈçÈ¢D 2086 2087 {Öð³À[vÅÀ·éÛÍCȺÌ`®Æ·é±Æ(TECSÌp[TÌ 2088 §ÀÉí¹é½ßjD 2002 ターゲット依存部の終了処理を行う関数.この関数は,カーネル終了処理の最 2003 後に呼び出され,リターンしてはならない.プロセッサ・チップ・開発環境依 2004 存の終了処理を,それらの依存部に切り分けることも可能である. 2005 2006 この関数では,最初に,atexitによって登録された関数とデストラクタを呼び 2007 出すことを意図しており,標準的には,software_term_hookを呼び出す. 2008 software_term_hookが用意されていない場合は,何もしない.GNU開発環境では, 2009 リンカスクリプト中のweak definitionにより,software_term_hookが用意され 2010 ていない場合の値を0とすることで,これを実現できる.weak definitionの機 2011 能を持たない開発環境では,software_term_hookを必ず呼び出すことにする. 2012 2013 この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼 2014 び出すことができない関数を呼ばないように実装しなければならない. 2015 2016 本関数を無限ループで実装する際は,以下の形式とすること(TECSのパーサの 2017 制限に合わせるため). 2089 2018 2090 2019 void … … 2093 2022 2094 2023 /* 2095 * ^[Qbg˶Ì2024 * ターゲット依存の処理 2096 2025 */ 2097 2026 … … 2103 2032 2104 2033 2105 6.9 J[làÌ` 2106 [jO 2107 2108 6.9.1 rbg}bvT[` 2109 2110 (6-9-1-1) OMIT_BITMAP_SEARCHiIvVj 2111 (6-9-1-2) uint_t bitmap_search(uint16_t bitmap)iIvVj 2112 2113 ^[Qbgñ˶ÅCuint16_t^Ì®libitmapjÌ1ÌrbgÌàCÅ 2114 àºÊiEjÌàÌðT[`µC»ÌrbgÔðÔ·Öbitmap_searchðp 2115 ӵĢéD±±ÅCrbgÔÍźÊrbgð0ƵCbitmapÉ0ðwèµ 2116 ÄÍÈçÈ¢àÌƵĢéD 2117 2118 rbgT[`½ßðÂvZbTÅÍCbitmap_searchðCrbgT[`½ß 2119 ðg¤æ¤É«¼µ½ûªø¦ªÇ¢êª éD±Ìæ¤ÈêÉÍC^[ 2120 Qbg˶ÅrbgT[`½ßðgÁ½bitmap_searchðè`µC 2121 OMIT_BITMAP_SEARCHð}Nè`·éD 2122 2123 WCuÉrbgT[`½ßðp¢½ffsª éêCbitmap_searchð 2124 (ffs(bitmap) - 1)Éè`·éÆæ¢D 2125 2126 (6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)iIvVj 2127 2128 rbgT[`½ßÌT[`ûüªtÈÇÌRÅCDæxÆrbgÆÌÎð 2129 ÏXµ½¢êÉÍCPRIMAP_BITð}Nè`·éD 2130 2131 6.10 J[lÀÉÖ·é»Ì¼Ìè` 2132 2133 6.10.1 ñ^XNReLXgpÌX^bNÌæ 2034 6.9 カーネル内部のチューニング 2035 2036 6.9.1 ビットマップサーチ 2037 2038 (6-9-1-1) OMIT_BITMAP_SEARCH(オプション) 2039 (6-9-1-2) uint_t bitmap_search(uint16_t bitmap)(オプション) 2040 2041 ターゲット非依存部で,uint16_t型の整数値(bitmap)中の1のビットの内,最 2042 も下位(右)のものをサーチし,そのビット番号を返す関数bitmap_searchを用 2043 意している.ここで,ビット番号は最下位ビットを0とし,bitmapに0を指定し 2044 てはならないものとしている. 2045 2046 ビットサーチ命令を持つプロセッサでは,bitmap_searchを,ビットサーチ命令 2047 を使うように書き直した方が効率が良い場合がある.このような場合には,ター 2048 ゲット依存部でビットサーチ命令を使ったbitmap_searchを定義し, 2049 OMIT_BITMAP_SEARCHをマクロ定義する. 2050 2051 標準ライブラリにビットサーチ命令を用いたffsがある場合,bitmap_searchを 2052 (ffs(bitmap) - 1)に定義するとよい. 2053 2054 (6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)(オプション) 2055 2056 ビットサーチ命令のサーチ方向が逆などの理由で,優先度とビットとの対応を 2057 変更したい場合には,PRIMAP_BITをマクロ定義する. 2058 2059 6.10 カーネル実装に関するその他の定義 2060 2061 6.10.1 非タスクコンテキスト用のスタック領域 2134 2062 2135 2063 (6-10-1-1) DEFAULT_ISTKSZ 2136 2064 2137 DEF_ICS Éæèñ^XNReLXgpÌX^bNÌæªwè³êÈ¢êÌC2138 ftHgÌX^bNÌæÌTCYD 2139 2140 ¦ 2141 (6-10-1-2) DEFAULT_ISTK iIvVj2142 2143 DEF_ICS Éæèñ^XNReLXgpÌX^bNÌæªwè³êÈ¢êÌC2144 ftHgÌX^bNÌæÌæªÔnD±Ì}Nªè`³êÈ¢êÉÍC 2145 TCYªDEFAULT_ISTKSZÌX^bNÌæªCzñÉæèmÛ³êéD 2146 2147 (6-10-1-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz) iIvVj2148 2149 ñ^XNReLXgpÌX^bN|C^ÌúlðÛ·éÏiistkptj 2150 ðp¢éêÉC±ÌV{ÉCX^bNÌæÌæªÔniistkjÆX^b 2151 NÌæÌTCYiistkszj©çCX^bN|C^Ìúlðßé}Nð 2152 è`·éD 2153 2154 6.10.2 óxÌè`2155 2156 (6-10-2-1) TOPPERS_EMPTY_LABEL(type, symbol) iIvVj2157 2158 NG[ðh®½ßÉCf[^^typeÌzñÅ éÏsymbolÉè`ð^ 2159 ¦é½ßÌ}ND^¦½è`ªQƳêé±ÆÍÈ¢½ßCÇÌæ¤Èè` 2160 ð^¦Äàæ¢D 2161 2162 ftHgÅÍCsymbolðCvf^ªtypeÅTCYª0ÌzñÉè`µÄ¢éD 2163 TCYª0ÌzñªG[ÆÈçÈ¢RpCiGCCͱêÉYjðp¢é 2164 êÉÍC^[Qbg˶Åè`·éKvÍÈ¢D 2165 2166 6.11 g[XO@\ÉÖ·éÝè2167 2168 SSP J[lÌ\[XR[hÉÍCJ[lÌÀsg[XOðæ¾·é½ß2169 Ì}NªßñÅ éDftHgÅÍC±êçÌ}NÍóÉè`³ 2170 êÄg[XOÌæ¾ÍsíÈ¢ªC±êçÌ}NðKØÉè`·é±Æ 2171 Åg[XOÌæ¾ðs¤±ÆªÅ«éD 2172 2173 6.11.1 æ¾Å«ég[XOÌíÞÆ}N2174 2175 æ¾Å«ég[XOÌíÞÆC»êðæ¾·é½ßÉè`·é}NÍ 2176 ÌÊèÅ éD 2177 2178 (a) J[lÌ®ìJnÆI¹2179 2180 Ì}Nðè`·é±ÆÅCJ[lÌ®ìJnÆI¹Ìg[XO 2181 ðæ¾·é±ÆªÅ«éD 2182 2183 LOG_KER_ENTER J[lª®ìðJn·é¼Oiú»Ì®¹ãj2184 LOG_KER_LEAVE J[lÌI¹iext_kerjªÄÎê½¼ãiI¹2185 ÌÀsOj2186 2187 (b) PÊÌÀsJnÆI¹2188 2189 Ì}Nðè`·é±ÆÅCÝnhiINHjCÝT[rX[` 2190 iISRjCüúnhiCYCjCA[nhiALMjCCPUáOnh 2191 iEXCjC^XNáO[`iTEXjÌÀsJnOÆI¹ãÌg[X 2192 Oðæ¾·é±ÆªÅ«éD 2193 2194 LOG_< Pʪ>_ENTER PÊÌÀsJn¼O2195 LOG_< Pʪ>_LEAVE PÊÌI¹¼ã2196 2197 ÝnhÍCAvP[Vªo^µ½àÌÌÝðÎÛƵCÝ 2198 T[rX[`ðÄÑo·½ßÉJ[làɶ¬³êéàÌÍÎÛÆµÈ 2199 ¢D^XNÌÀsJnÆI¹ÍC¼Ìû@Åæ¾Å«é½ßC±Ìû@ÍpÓ 2200 µÄ¢È¢D 2201 2202 ȨCÝnhÆCPUáOnhÌÀsJnÆI¹Ìg[XOæ¾ 2203 ÍC^[Qbg˶ÅÀ·éKvª éDÚµÍCu6.2 g[XO 2204 @\ÖÌÎvu6.6.1 ÝnhÌoüûvu6.7.2 CPUáOnh 2205 ÌoüûvÌßðQÆ·é±ÆD 2206 2207 (c) ^XNóÔÌÏ»2208 2209 Ì}Nðè`·é±ÆÅC^XNóԪϻµ½Ìg[XOðæ¾ 2210 ·é±ÆªÅ«éD½¾µCÀsóÔÆÀsÂ\óÔÌÔÌJÚÍC¼Ìû@ 2211 Åæ¾Å«é½ßC±Ì}NÅÍæ¾Å«È¢D 2212 2213 LOG_TSKSTAT ^XNóÔÌÏ»2214 2215 (d) fBXpb`ÌÀsJnÆI¹2216 2217 Ì}Nðè`·é±ÆÅCfBXpb`ªÀsJn·éÆCI¹·é 2218 Ìg[XOðæ¾·é±ÆªÅ«éD 2219 2220 LOG_DSP_ENTER fBXpb`ÌÀsJn2221 LOG_DSP_LEAVE fBXpb`ÌI¹2222 2223 fBXpb`ÌÀsJnÍC^XNªÀsóÔ©çÀsÂ\óÔÉJÚ·é 2224 ^C~OÅ é½ßCÀsÂ\óÔÖJÚ·é^XNÌTCBÖÌ|C^ðp 2225 [^Æ·éDtÉCfBXpb`ÌI¹ÍC^XNªÀsÂ\óÔ©ç 2226 ÀsóÔÉJÚ·é^C~OÅ é½ßCÀsóÔÖJÚ·é^XNÌTCBÖ 2227 Ì|C^ðp[^Æ·éD 2228 2229 SSP J[lÅÍCÀsÅ«é^XNªÈCJ[lªAChóÔÉÈéê2230 ÉÍCfBXpb`ÌɯÜéD»Ì½ßCAChóÔÖÌJÚÆA 2231 ChóÔ©ç¼ÌóÔÖÌJÚÍC±Ì}NÅÍæ¾Å«È¢D 2232 2233 ȨCfBXpb`ÌÀsJnÆI¹Ìg[XOæ¾ÍC^[QbgË 2234 ¶ÅÀ·éKvª éDÚµÍCÆu6.5.2 fBXpb`{ÌvÌßð 2235 QÆ·é±ÆD 2236 2237 (e) T[rXR[ÌüûÆoû2238 2239 Ì}Nðè`·é±ÆÅCeT[rXR[ÌüûÆoûÌg[XO 2240 ðæ¾·é±ÆªÅ«éD 2241 2242 LOG_< T[rXR[Ìå¶\L>_ENTER T[rXR[¼Ìüû2243 LOG_< T[rXR[Ìå¶\L>_LEAVE T[rXR[¼Ìoû2244 2245 »ê¼êÌ}N̼Ìâp[^ÌÚ×É¢ÄÍCJ[lÌ\[XR[ 2246 hðQÆ·é±ÆD 2247 2248 6.12 J[lÀÌ^[Qbg˶̽ßÌl[Lq2249 2250 J[làɶÄgíêéÖâÏÈÇ̼ÌÅCIuWFNgt@C 2251 ÌV{\Éo^³êÄO©çQÆÅ«é¼ÌÍCC¾êxÅCæª 2252 ª"_kernel_"ܽÍ"_KERNEL_"Å é¼ÌƵȯêÎÈçÈ¢ªCSSPJ[l 2253 ÅÍC\[XR[hðRpNgÉۿ±êðÀ»·é½ßÉCl[ 2254 Lqt@Cð±üµÄ¢éD 2255 2256 ïÌIÉÍCl[·×«¼ÌðXgAbvµ½xxx_rename.defðpÓµC 2257 ±Ìt@C©çc[iutils/genrenamejÉæèC¼Ìðl[·é½ß 2258 Ì}Nè`ðÜÞxxx_rename.hÆC»êçÌ}Nè`ðð·é½ßÌ 2259 xxx_unrename.h 𶬷éDc[ÌN®û@ÍÌÊèÅ éD2065 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の, 2066 デフォルトのスタック領域のサイズ. 2067 2068 ※ 2069 (6-10-1-2) DEFAULT_ISTK(オプション) 2070 2071 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の, 2072 デフォルトのスタック領域の先頭番地.このマクロが定義されない場合には, 2073 サイズがDEFAULT_ISTKSZのスタック領域が,配列により確保される. 2074 2075 (6-10-1-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)(オプション) 2076 2077 非タスクコンテキスト用のスタックポインタの初期値を保持する変数(istkpt) 2078 を用いる場合に,このシンボルに,スタック領域の先頭番地(istk)とスタッ 2079 ク領域のサイズ(istksz)から,スタックポインタの初期値を求めるマクロを 2080 定義する. 2081 2082 6.10.2 空ラベルの定義 2083 2084 (6-10-2-1) TOPPERS_EMPTY_LABEL(type, symbol)(オプション) 2085 2086 リンクエラーを防ぐために,データ型typeの配列である変数symbolに定義を与 2087 えるためのマクロ.与えた定義が参照されることはないため,どのような定義 2088 を与えてもよい. 2089 2090 デフォルトでは,symbolを,要素型がtypeでサイズが0の配列に定義している. 2091 サイズが0の配列がエラーとならないコンパイラ(GCCはこれに該当)を用いる 2092 場合には,ターゲット依存部で定義する必要はない. 2093 2094 6.11 トレースログ機能に関する設定 2095 2096 SSPカーネルのソースコードには,カーネルの実行トレースログを取得するため 2097 のマクロ等が埋め込んである.デフォルトでは,これらのマクロは空に定義さ 2098 れてトレースログの取得は行わないが,これらのマクロを適切に定義すること 2099 でトレースログの取得を行うことができる. 2100 2101 6.11.1 取得できるトレースログの種類とマクロ 2102 2103 取得できるトレースログの種類と,それを取得するために定義するマクロは次 2104 の通りである. 2105 2106 (a) カーネルの動作開始と終了 2107 2108 次のマクロを定義することで,カーネルの動作開始時と終了時のトレースログ 2109 を取得することができる. 2110 2111 LOG_KER_ENTER カーネルが動作を開始する直前(初期化の完了後) 2112 LOG_KER_LEAVE カーネルの終了(ext_ker)が呼ばれた直後(終了処 2113 理の実行前) 2114 2115 (b) 処理単位の実行開始と終了 2116 2117 次のマクロを定義することで,割込みハンドラ(INH),割込みサービスルーチ 2118 ン(ISR),周期ハンドラ(CYC),アラームハンドラ(ALM),CPU例外ハンド 2119 ラ(EXC),タスク例外処理ルーチン(TEX)の実行開始前と終了後のトレース 2120 ログを取得することができる. 2121 2122 LOG_<処理単位略号>_ENTER 処理単位の実行開始直前 2123 LOG_<処理単位略号>_LEAVE 処理単位の終了直後 2124 2125 割込みハンドラは,アプリケーションが登録したもののみを対象とし,割込み 2126 サービスルーチンを呼び出すためにカーネル内に生成されるものは対象としな 2127 い.タスクの実行開始と終了は,他の方法で取得できるため,この方法は用意 2128 していない. 2129 2130 なお,割込みハンドラとCPU例外ハンドラの実行開始と終了のトレースログ取得 2131 は,ターゲット依存部で実装する必要がある.詳しくは,「6.2 トレースログ 2132 機能への対応」「6.6.1 割込みハンドラの出入口処理」「6.7.2 CPU例外ハンド 2133 ラの出入口処理」の節を参照すること. 2134 2135 (c) タスク状態の変化 2136 2137 次のマクロを定義することで,タスク状態が変化した時のトレースログを取得 2138 することができる.ただし,実行状態と実行可能状態の間の遷移は,他の方法 2139 で取得できるため,このマクロでは取得できない. 2140 2141 LOG_TSKSTAT タスク状態の変化 2142 2143 (d) ディスパッチャの実行開始と終了 2144 2145 次のマクロを定義することで,ディスパッチャが実行開始する時と,終了する 2146 時のトレースログを取得することができる. 2147 2148 LOG_DSP_ENTER ディスパッチャの実行開始 2149 LOG_DSP_LEAVE ディスパッチャの終了 2150 2151 ディスパッチャの実行開始は,タスクが実行状態から実行可能状態に遷移する 2152 タイミングであるため,実行可能状態へ遷移するタスクのTCBへのポインタをパ 2153 ラメータとする.逆に,ディスパッチャの終了は,タスクが実行可能状態から 2154 実行状態に遷移するタイミングであるため,実行状態へ遷移するタスクのTCBへ 2155 のポインタをパラメータとする. 2156 2157 SSPカーネルでは,実行できるタスクがなく,カーネルがアイドル状態になる場 2158 合には,ディスパッチャの中に留まる.そのため,アイドル状態への遷移とア 2159 イドル状態から他の状態への遷移は,このマクロでは取得できない. 2160 2161 なお,ディスパッチャの実行開始と終了のトレースログ取得は,ターゲット依 2162 存部で実装する必要がある.詳しくは,と「6.5.2 ディスパッチャ本体」の節を 2163 参照すること. 2164 2165 (e) サービスコールの入口と出口 2166 2167 次のマクロを定義することで,各サービスコールの入口と出口のトレースログ 2168 を取得することができる. 2169 2170 LOG_<サービスコールの大文字表記>_ENTER サービスコール名の入口 2171 LOG_<サービスコールの大文字表記>_LEAVE サービスコール名の出口 2172 2173 それぞれのマクロの名称やパラメータの詳細については,カーネルのソースコー 2174 ドを参照すること. 2175 2176 6.12 カーネル実装のターゲット依存部のためのリネーム記述 2177 2178 カーネル内部に閉じて使われる関数や変数などの名称で,オブジェクトファイ 2179 ルのシンボル表に登録されて外部から参照できる名称は,C言語レベルで,先頭 2180 が"_kernel_"または"_KERNEL_"である名称としなければならないが,SSPカーネ 2181 ルでは,ソースコードをコンパクトに保ちつつこれを実現するために,リネー 2182 ム記述ファイルを導入している. 2183 2184 具体的には,リネームすべき名称をリストアップしたxxx_rename.defを用意し, 2185 このファイルからツール(utils/genrename)により,名称をリネームするため 2186 のマクロ定義を含むxxx_rename.hと,それらのマクロ定義を解除するための 2187 xxx_unrename.hを生成する.ツールの起動方法は次の通りである. 2260 2188 2261 2189 % genrename xxx 2262 2190 2263 xxx_rename.def ÉÍCl[·×«¼Ìð1sÉ1ÂLq·éDxxxxÆ¢¤¼2264 ̪Lq³êÄ¢éêCxxx_rename.hÉÍÌæ¤ÈLqª¶¬³êéD 2191 xxx_rename.defには,リネームすべき名称を1行に1つ記述する.xxxxという名 2192 称が記述されている場合,xxx_rename.hには次のような記述が生成される. 2265 2193 2266 2194 #define xxxx _kernel_xxxx … … 2269 2197 #endif /* TOPPERS_LABEL_ASM */ 2270 2198 2271 ܽCxxx_unrename.hÉÍÌæ¤ÈLqª¶¬³êéD 2199 また,xxx_unrename.hには次のような記述が生成される. 2272 2200 2273 2201 #undef xxxx … … 2276 2204 #endif /* TOPPERS_LABEL_ASM */ 2277 2205 2278 xxx_rename.defÌÉÍC¼Ìl[LqðæèÞ½ßÉCuINCLUDE 2279 "yyy"vܽÍuINCLUDE <yyy>vÆ¢¤LqðÜßé±ÆªÅ«éD±ÌLq 2280 ª³êÄ¢éêCxxx_rename.hÉÍu#include "yyy_rename.h"vÜ½Í 2281 u#include <yyy_rename.h>vÆ¢¤LqªCxxx_unrename.hÉÍu#include 2282 "yyy_unrename.h"vܽÍu#include <yyy_unrename.h>vÆ¢¤Lqª¶¬³ 2283 êéD 2284 2285 xxx_rename.defÌÌ"#"ÅnÜésÍRgƵÄÇÝòγêéDܽC 2286 ósà³³êéD 2287 2288 J[lÌ^[Qbgñ˶Ågíêé¼Ìðl[·é½ßÉCkernel 2289 fBNgÉCkernel_rename.defÆC»±©ç¶¬µ½kernel_rename.h¨ 2290 æÑkernel_unrename.hªpÓ³êÄ¢éDkernel_rename.defÉÍC 2291 uINCLUDE "target"vÆ¢¤LqªÜÜêĨèC^[Qbg˶Ìl[ 2292 LqðæèÞæ¤ÉÈÁÄ¢éD^[Qbg˶Åè`µC^[Qbg 2293 ñ˶ÅQƳêé¼ÌÍC^[Qbg˶Ìl[LqÉÜßéD 2294 2295 ^[Qbg˶ÅÍC^[Qbg˶Ågíêé¼Ìðl[·é½ß 2296 ÉCtarget_rename.defÆC»±©ç¶¬µ½target_rename.h¨æÑ 2297 target_unrename.hðpÓ·éD^[Qbg˶©çvZbTE`bvEJ 2298 «˶ðØ誯éêÉÍCtarget_rename.defÉINCLUDELqðüêC 2299 vZbTE`bvEJ«˶Ìl[LqðæèÞæ¤É·éD 2300 2301 6.13 ^C}hCo 2302 2303 ^C}hCoÍCJ[lÉ^CeBbNðÊm·é½ßÌ^C}hC 2304 oÅ éD 2305 2306 6.13.1 ^C}hCoÌt@C\¬ 2307 2308 ^C}hCoðgÝÞ½ßÌÃIAPIðLqµ½VXeRtBM 2309 [ 2310 Vt@CðCtarget_timer.cfgÉpÓ·éD±Ìt@CÉÍC^C} 2311 hCoðú»·é½ßÌú»[`ÌÇÁC^C}hCoðI¹³ 2312 ¹é½ßÌI¹[`ÌÇÁC^C}Ý̽ßÌÝnhÌ 2313 è`iܽÍCÝT[rX[`ÌÇÁjC^C}Ý̽ßÌ 2314 ÝvCÌ®«ÌÝèÌÃIAPIÈÇðÜÞ±ÆÉÈéD 2315 2316 ^C}hCoðÄÑo·½ßÉKvÈè`ðÜÞwb_t@CðC 2317 target_timer.hÉpÓ·éDܽC^C}hCoÌÀt@Cð 2318 target_timer.cÉpÓ·éD 2319 2320 ^CeBbNÌÊmÉæès¤Ì½ÍC^XNÌN®âÒ¿ððs 2321 ¤àÌÅ é½ßC^C}ÝÌÝDæxÍCÝÌÅÅáÌDæ 2322 xÅ\ªÅ éD½¾µCüúnhâA[nhÌÀsJnxêª 2323 âèÉÈéêÉÍC^C}ÝÌÝDæxðæè¢lÉÝèµ½¢D 2324 »±ÅC^C}ÝÌÝDæxðÏX·éû@ðC^[QbgË¶Ì 2325 [U[Y}j 2326 AÉLڷ׫ŠéD 2327 2328 6.13.2 ^C}Ìú»EI¹EÝ 2206 xxx_rename.defの中には,他のリネーム記述を取り込むために,「INCLUDE 2207 "yyy"」または「INCLUDE <yyy>」という記述を含めることができる.この記述 2208 がされている場合,xxx_rename.hには「#include "yyy_rename.h"」または 2209 「#include <yyy_rename.h>」という記述が,xxx_unrename.hには「#include 2210 "yyy_unrename.h"」または「#include <yyy_unrename.h>」という記述が生成さ 2211 れる. 2212 2213 xxx_rename.defの中の"#"で始まる行はコメントとして読み飛ばされる.また, 2214 空行も無視される. 2215 2216 カーネルのターゲット非依存部で使われる名称をリネームするために,kernel 2217 ディレクトリに,kernel_rename.defと,そこから生成したkernel_rename.hお 2218 よびkernel_unrename.hが用意されている.kernel_rename.defには, 2219 「INCLUDE "target"」という記述が含まれており,ターゲット依存部のリネー 2220 ム記述を取り込むようになっている.ターゲット依存部で定義し,ターゲット 2221 非依存部で参照される名称は,ターゲット依存部のリネーム記述に含める. 2222 2223 ターゲット依存部では,ターゲット依存部で使われる名称をリネームするため 2224 に,target_rename.defと,そこから生成したtarget_rename.hおよび 2225 target_unrename.hを用意する.ターゲット依存部からプロセッサ・チップ・開 2226 発環境依存部を切り分ける場合には,target_rename.defにINCLUDE記述を入れ, 2227 プロセッサ・チップ・開発環境依存部のリネーム記述を取り込むようにする. 2228 2229 6.13 タイマドライバ 2230 2231 タイマドライバは,カーネルにタイムティックを通知するためのタイマドライ 2232 バである. 2233 2234 6.13.1 タイマドライバのファイル構成 2235 2236 タイマドライバを組み込むための静的APIを記述したシステムコンフィギュレー 2237 ションファイルを,target_timer.cfgに用意する.このファイルには,タイマ 2238 ドライバを初期化するための初期化ルーチンの追加,タイマドライバを終了さ 2239 せるための終了処理ルーチンの追加,タイマ割込みのための割込みハンドラの 2240 定義(または,割込みサービスルーチンの追加),タイマ割込みのための割込 2241 み要求ラインの属性の設定の静的APIなどを含むことになる. 2242 2243 タイマドライバを呼び出すために必要な定義を含むヘッダファイルを, 2244 target_timer.hに用意する.また,タイマドライバの実装ファイルを 2245 target_timer.cに用意する. 2246 2247 タイムティックの通知により行う処理の多くは,タスクの起動や待ち解除を行 2248 うものであるため,タイマ割込みの割込み優先度は,割込みの中で最低の優先 2249 度で十分である.ただし,周期ハンドラやアラームハンドラの実行開始遅れが 2250 問題になる場合には,タイマ割込みの割込み優先度をより高い値に設定したい. 2251 そこで,タイマ割込みの割込み優先度を変更する方法を,ターゲット依存部の 2252 ユーザーズマニュアルに記載すべきである. 2253 2254 6.13.2 タイマの初期化・終了処理・割込み処理 2329 2255 2330 2256 (6-13-2-1) void target_timer_initialize(intptr_t exinf) 2331 2257 2332 ^C}ðú»µC^C}ÝðüúIɶ³¹éÖD^C}ÝÌ 2333 üúÍCTIC_NUMEÆTIC_DENOÅwè³ê½ÔÆêv³¹éiu5.3 ^C 2334 eBbNÌè`vÌßðQÆjD 2335 2336 ±ÌÖÍCtarget_timer.cfgÉLq·éÃIAPIÉæèCú»[`Æ 2337 µÄJ[lÉo^·é±ÆðzèµÄ¢éD 2258 タイマを初期化し,タイマ割込みを周期的に発生させる関数.タイマ割込みの 2259 周期は,TIC_NUMEとTIC_DENOで指定された時間と一致させる(「5.3 タイム 2260 ティックの定義」の節を参照). 2261 2262 この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと 2263 してカーネルに登録することを想定している. 2338 2264 2339 2265 (6-13-2-2) void target_timer_terminate(intptr_t exinf) 2340 2266 2341 ^C}Ì®ìðâ~³¹C^C}Ýð¶µÈ¢æ¤É·éÖD 2342 2343 ±ÌÖÍCtarget_timer.cfgÉLq·éÃIAPIÉæèCI¹[` 2344 ƵÄJ[lÉo^·é±ÆðzèµÄ¢éD 2267 タイマの動作を停止させ,タイマ割込みを発生しないようにする関数. 2268 2269 この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン 2270 としてカーネルに登録することを想定している. 2345 2271 2346 2272 (6-13-2-3) void target_timer_handler(void) 2347 ܽÍvoid target_timer_isr(intptr_t exinf)2348 2349 ^C}ÝÉæèN®³êéÝvODÝnhÆµÄ 2350 À»·éêÉÍtarget_timer_handlerCÝT[rX[`ƵÄÀ» 2351 ·éêÉÍtarget_timer_isr̼ÌÆ·éD^[QbgñË¶Ì 2352 signal_time ðÄÑo·D2353 2354 target_timer_handler ÍCWIÉÍÌæ¤Éè`·éD2273 または void target_timer_isr(intptr_t exinf) 2274 2275 タイマ割込みにより起動される割込み処理プログラム.割込みハンドラとして 2276 実現する場合にはtarget_timer_handler,割込みサービスルーチンとして実現 2277 する場合にはtarget_timer_isrの名称とする.ターゲット非依存部の 2278 signal_timeを呼び出す. 2279 2280 target_timer_handlerは,標準的には次のように定義する. 2355 2281 2356 2282 ---------------------------------------- … … 2358 2284 target_timer_handler(void) 2359 2285 { 2360 i_begin_int(< ^C}ÝÌÝÔ>);2286 i_begin_int(<タイマ割込みの割込み番号>); 2361 2287 signal_time(); 2362 i_end_int(< ^C}ÝÌÝÔ>);2288 i_end_int(<タイマ割込みの割込み番号>); 2363 2289 } 2364 2290 ---------------------------------------- 2365 2291 2366 ±ÌÖÍCtarget_timer.cfgÉLq·éÃIAPIÉæèCÝnhÜ 2367 ½ÍÝT[rX[`ƵÄJ[lÉo^·é±ÆðzèµÄ¢éD 2368 2369 6.13.3 «\]¿pVXeÌQÆ̽ßÌ@\2370 2371 «\]¿pVXeÌQÆ@\iget_utmjðT|[g·éêÉÍC^C 2372 }hCoÅCȺÌf[^^âÖÈÇðpÓ·éD 2292 この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま 2293 たは割込みサービスルーチンとしてカーネルに登録することを想定している. 2294 2295 6.13.3 性能評価用システム時刻の参照のための機能 2296 2297 性能評価用システム時刻の参照機能(get_utm)をサポートする場合には,タイ 2298 マドライバで,以下のデータ型や関数などを用意する. 2373 2299 2374 2300 (6-13-3-1) CLOCK 2375 2301 2376 ^C}lÌà\»Ì½ßÌf[^^D 2302 タイマ値の内部表現のためのデータ型. 2377 2303 2378 2304 (6-13-3-2) CLOCK target_timer_get_current(void) 2379 2305 2380 ^C}Ì»ÝlðÇÝoµCà\»ÅÔ·ÖD^C}lÍCÔÌoßÆ 2381 ÆàÉÁ·é±ÆðzèµÄ¢éDn[hEFAÌ^C}ªC^C}lª¸ 2382 ·éàÌÅ éêÉÍC±ÌÖàÅÁ·élÆÈéæ¤ÉÏ··éD 2306 タイマの現在値を読み出し,内部表現で返す関数.タイマ値は,時間の経過と 2307 ともに増加することを想定している.ハードウェアのタイマが,タイマ値が減 2308 少するものである場合には,この関数内で増加する値となるように変換する. 2383 2309 2384 2310 (6-13-3-3) bool_t target_timer_probe_int(void) 2385 2311 2386 ^C}Ývð`FbN·éÖD^C}ݪv³êÄ¢éêÉ 2387 true Cv³êĢȢêÉfalseðÔ·D2312 タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に 2313 true,要求されていない場合にfalseを返す. 2388 2314 2389 2315 (6-13-3-4) TO_USEC(clock) 2390 2316 2391 ^C}lÌà\»ðC1ÊbPÊÉÏ··é½ßÌ}NiܽÍÖjD 2392 targettimer_get_currentÅÇÝoµ½lðC^C}ݶ©çÌoßÔ 2393 iPÊ: 1ÊbjÉÏ··é½ßÉp¢éD 2394 2395 7. RtBM 2396 [^Ýèt@CÌ^[Qbg˶ 2397 2398 7.1 Ýèt@CÆ^[Qbg˶ÌÊut¯ 2399 2400 SSPJ[lÌRtBM 2401 [^ÍCÝèt@CÌLqÉ]ÁÄt@CÌ 2402 ¶¬¨æÑG[`FbNðs¤DRtBM 2403 [^ÌÝèt@CÉÍC 2404 ȺÌ4ª éD 2405 2406 (a) ÃIAPIe[u 2407 2408 ÃIAPIÌêÆCeÃIAPIÌp[^É¢ÄLqµ½t@CDÃI 2409 APIðg£·éêÈOÍÏX·éKvªÈ¢½ßC^[Qbgñ˶ÅpÓ 2410 µÄ¢éikernel/kernel_api.csvjD 2411 2412 (b) læ¾V{e[u 2413 2414 RtBM 2415 [^ÌpX1ɨ¢ÄCp[^vZpC¾êt@CÉoÍ 2416 µClðß½¢V{iêÊÉÍ®jðLq·é½ßÌt@CD^[Qb 2417 gñ˶ÅÍC^[QbgÉ˶¹¸ÉKvÆÈéV{ðLqµ½t@ 2418 CðpӵĢéikernel/kernel_def.csvjD 2419 2420 ^[QbgÉ˶µÄKvÆÈéV{ª éêÉÍCtargetfBNg 2421 Éu©ê½target_def.csvÉLq·éDtarget_def.csvÉLqµÄlð 2422 ßé±ÆªÅ«éV{ÍCkernel/kernel_int.h¨æÑ»±©çCN[ 2423 h³êét@CÅè`³êĢȯêÎÈçÈ¢Dkernel_int.h©çÍC 2424 target_stddef.hCtarget_kernel.hCtarget_config.hðiÔÚIÉjCN[ 2425 hµÄ¢é½ßC±êçÌt@C¨æÑ»±©çCN[h³êét@C 2426 Åè`³êé^[Qbg˶ÌV{ÍCtarget_def.csvÉLq·é± 2427 ƪūéD 2428 2429 ±±Ålðß½V{ÌlÍCRtBM 2430 [^ÌpX2¨æÑpX3Ì 2431 ev[gt@CÅQÆ·é±ÆªÅ«éD 2432 2433 (c) pX2Ìev[gt@C 2434 2435 RtBM 2436 [^ÌpX2ÍCev[gt@CÉ]ÁÄCJ[lÌ\ 2437 ¬Eú»t@Cikernel_cfg.cjC\¬Eú»wb_t@C 2438 ikernel_cfg.hjÈÇ𶬷éD±Ìev[gt@CÍC^[Qbg 2439 ñ˶Æ^[Qbg˶ÉØèª¯Ä éªC¼Ìt@CÌ^[Qbg 2440 ˶ÆÍtÉC^[Qbg˶©ç^[Qbgñ˶ðCN[h· 2441 é`ÉÈÁÄ¢éD 2442 2443 ïÌIÉÍCtargetfBNgÉu©ê½target.tfÅCKvÈÏðè`µ 2444 ½ãCev[gt@CÌ^[Qbgñ˶ikernel/kernel.tfjðC 2445 N[h·éDkernel.tfÅÍCJ[lÌ^[Qbgñ˶Ågp·éÏ 2446 è`𶬷éDkernel.tfðCN[hµ½ãCtarget.tfÅÍCJ[ 2447 lÌ^[Qbg˶Ågp·éÏè`𶬷éDtarget.tf©çCv 2448 ZbT˶C`bv˶ðCJ«˶ðØ誯Äàæ¢D 2449 2450 (d) pX3Ìev[gt@C 2451 2452 RtBM 2453 [^ÌpX3ÍCev[gt@CÉ]ÁÄCÃIAPIÌê 2454 Êè®p[^Ì`FbNðs¤D±Ìev[gt@CàC^[Qb 2455 gñ˶Æ^[Qbg˶ÉØèª¯Ä èC^[Qbg˶©ç^[ 2456 Qbgñ˶ðCN[h·é`ÉÈÁÄ¢éD 2457 2458 ïÌIÉÍCtargetfBNgÉu©ê½target_check.tfÅCKvÈÏð 2459 è`µ½ãCev[gt@CÌ^[Qbgñ˶ 2460 ikernel/kernel_check.tfjðCN[h·éDkernel_check.tfÅÍCJ[ 2461 lÌ^[Qbgñ˶Åú»ubNÉo͵½êÊè®p[^ 2462 Ì`FbNðs¤Dkernel_check.tfðCN[hµ½ãCtarget_check.tf 2463 ÅÍC^[QbgÉ˶·é`FbNðs¤Dtarget_check.tf©çCvZb 2464 T˶C`bv˶ðCJ«˶ðØ誯Äàæ¢D 2465 2466 ȨCRtBM 2467 [^ÌÚ×dlÆÝèt@CÌLqû@É¢ÄÍC 2468 ÊrPDFt@CÌ`ÅzzµÄ¢éuTOPPERSV¢ãJ[lpRtBM 2469 2470 [^dlv¨æÑuTOPPERSV¢ãJ[lpRtBM 2471 [^à }N 2472 vZbTdlvðQÆ·é±ÆD 2473 2474 7.2 pX2Ìev[gt@CÌ^[Qbg˶ 2475 2476 ȺÅÍCpX2Ìev[gt@CÌ^[Qbg˶ðLq·éãÅK 2477 vÈÉ¢ÄྷéD 2478 2479 7.2.1 ^[Qbgñ˶ðCN[h·éOÉè`·×«Ï 2480 2481 target.tf©çkernel.tfðCN[h·éOÉCÌÏðè`µÄ¨©È 2482 ¯êÎÈçÈ¢D 2483 2484 (7-2-1) INTNO_ATTISR_VALID ATT_ISRÅgpÅ«éÝÔ 2485 (7-2-2) INHNO_ATTISR_VALID INTNO_ATTISR_VALIDÉηénhÔ 2486 (7-2-3) INHNO_DEFINH_VALID DEF_INTÅgpÅ«éÝnhÔ 2487 (7-2-4) EXCNO_DEFEXC_VALID DEF_EXCÅgpÅ«éCPUáOnhÔ 2488 (7-2-5) INTNO_CFGINT_VALID CFG_INTÅgpÅ«éÝÔ 2489 (7-2-6) INTPRI_CFGINT_VALID CFG_INTÅgpÅ«éÝDæx 2490 2491 APIÅgpÅ«éÝÔ^ÝnhÔ^CPUáOnhÔ^ 2492 ÝDæxÌXgðCeÏÉè`·éDINHNO_ATTISR_VALIDÉÍC 2493 INTNO_ATTISR_VALIDÉXgAbvµ½ÝÔÉηéÝnh 2494 ÔÌXgðè`·éD 2495 2496 (7-2-7) TARGET_TSKATRiIvVj ^[Qbgè`Ì^XN®« 2497 (7-2-8) TARGET_ISRATRiIvVj ^[Qbgè`ÌISR®« 2498 (7-2-9) TARGET_INHATRiIvVj ^[Qbgè`ÌÝnh®« 2499 (7-2-10) TARGET_INTATRiIvVj ^[Qbgè`ÌÝ®« 2500 (7-2-11) TARGET_EXCATRiIvVj ^[Qbgè`ÌCPUáOnh®« 2501 2502 eIuWFNgÌ®«ðC^[Qbgè`Ég£·éêÉCY·éIuWF 2503 Ng®«ð¦·ÏÉCg£Égp·érbgÌ_aðè`·éD±êÉæ 2504 èCg£Égp·érbgªÝè³êÄ¢éêÉCG[ÉÈéÌðh®D 2505 2506 (7-2-12) INTNO_FIX_KERNELiIvVj J[lÇÉÅè³êÄ¢é 2507 ÝÔ 2508 (7-2-13) INHNO_FIX_KERNELiIvVj J[lÇÉÅè³êÄ¢é 2509 ÝnhÔ 2510 (7-2-14) INHNO_FIX_NONKERNELiIvVj J[lÇOÉÅè³êÄ¢é 2511 ÝÔ 2512 (7-2-15) INHNO_FIX_NONKERNELiIvVj J[lÇOÉÅè³êÄ¢é 2513 ÝnhÔ 2514 2515 J[lÇܽÍJ[lÇOÉÅè³êÄ¢éݪ éêÉÍC 2516 »êçÌÝÔÆÝnhÔÌXgðCeÏÉè`·éD 2517 2518 (7-2-16) USE_INHINIB_TABLEiIvVj 2519 2520 OMIT_INITIALIZE_INTERRUPTðè`µ½ªCÝnhÌú»ÉKvÈî 2521 ñðkernel_cfg.cɶ¬µ½¢êÉÍC±ÌÏð1ÉÝè·éDïÌIÉÍC 2522 TNUM_INHNOCtnum_inhnoCinhinib_tableÌè`ÆCÝnhÌoüû 2523 𶬷é½ßÌLqiINTHDR_ENTRY}NÌXgjªC^[Qbgñ 2524 ˶ÉæÁĶ¬³êéD 2525 2526 (7-2-17) USE_INTINIB_TABLEiIvVj 2527 2528 OMIT_INITIALIZE_INTERRUPTðè`µ½ªCÝvCÌú»ÉKvÈ 2529 îñðkernel_cfg.cɶ¬µ½¢êÉÍC±ÌÏð1ÉÝè·éDïÌIÉ 2530 ÍCTNUM_INTNOCtnum_intnoCintinib_tableÌè`ªC^[Qbgñ覃 2531 æÁĶ¬³êéD 2532 2533 (7-2-18) TARGET_MIN_STKSZiIvVj 2534 2535 ^[Qbgè`ÅC^XNÌX^bNTCYÌŬlðÝè·éêÉÍC± 2536 ÌÏðX^bNTCYÌŬlÉè`·éD 2537 2538 (7-2-19) CHECK_STKSZ_ALIGNiIvVj 2539 2540 X^bNÌæÌTCYª élÌ{ÅȯêÎÈçÈ¢êÉC±ÌÏð 2541 »ÌlÉè`·éD±ÌÏðè`·é±ÆÅCkernel.tfɨ¢ÄCX^bN 2542 ÌæÌTCYª³µÈ¢i±ÌÏÉè`µ½lÌ{ÅÈ¢jêÌG[ 2543 ð`FbN·éæ¤ÉÈéD`FbNªKvÈ¢êÉÍC±ÌÏðè`µ 2544 È¢D 2545 2546 7.2.2 ^[Qbgñ˶Åè`³êéÏ 2547 2548 kernel.tfÌÅÍÌϪè`³êé½ßCkernel.tfðCN[hµ½ 2549 ãCtarget.tfÌűêçðQÆ·é±ÆªÅ«éD 2550 2551 (7-2-1) INTNO[inhno] inhnoðηéintnoÉÏ··é½ßÌAzzñ 2552 (7-2-2) INHNO[intno] intnoðηéinhnoÉÏ··é½ßÌAzzñ 2553 2554 7.3 pX3Ìev[gt@CÌ^[Qbg˶ 2555 2556 ȺÅÍCpX3Ìev[gt@CÌ^[Qbg˶ðLq·éãÅK 2557 vÈÉ¢ÄྷéD 2558 2559 target_check.tf©çkernel_check.tfðCN[h·éOÉCKvɶÄC 2560 ÌÏðè`µÄ¨©È¯êÎÈçÈ¢D 2561 2562 (7-3-1) CHECK_FUNC_ALIGNiIvVj@ÖÌACPÊ 2563 (7-3-2) CHECK_FUNC_NONNULLiIvVjÖÌñNULL`FbN 2564 (7-3-3) CHECK_STACK_ALIGNiIvVj X^bNÌæÌACPÊ 2565 (7-3-4) CHECK_STACK_NONNULLiIvVjX^bNÌæÌñNULL`FbN 2566 (7-3-5) CHECK_MPF_ALIGNiIvVj Åè·v[ÌæÌACPÊ 2567 (7-3-6) CHECK_MPF_NONNULLiIvVj Åè·v[ÌæÌñNULL`FbN 2568 2569 Ö^X^bNÌæ^Åè·v[ÌæÌæªÔnÌACgÌ 2570 `FbNðs¤êÉÍC»ê¼êCCHECK_FUNC_ALIGN^CHECK_STACK_ALIGN^ 2571 CHECK_MPF_ALIGNðACPÊÉè`·éDÖ^X^bNÌæ^Åè· 2572 v[ÌæÌæªÔnªNULLÅÈ¢©Ì`FbNðs¤êÉÍC»ê¼ê 2573 CHECK_FUNC_NONNULL^CHECK_STACK_NONNULL^CHECK_MPF_NONNULLð1Éè`·éD 2574 `FbNªKvÈ¢êÉÍCY·éÏðè`µÈ¢D 2575 2576 7.4 cfg1_out.cÌNÉKvÈX^uÌè`t@C 2577 2578 RtBM 2579 [^ÉÖµÄ^[Qbg˶ÉpÓ·éKvª ét@CÆ 2580 µÄCÝèt@CÈOÉCcfg1_out.cðN·é½ßÉKvÈX^uÌè 2581 `t@Cª éD 2582 2583 RtBM 2584 [^ÌpX1ÅÍCÃIAPIÌ®è®p[^ÌlðCR 2585 pCðp¢Äßé½ßÉCcfg1_out.c𶬷éD±êðRpCC 2586 NµÄIuWFNgt@C𶬷éÛÉCX^[gAbvW 2587 [© 2588 çQƳêéV{Ìè`ð^¦éKvª éD 2589 2590 ±Ìè`ð^¦é½ßÉCcfg1_out.c©çC^[QbgË¶Ì 2591 target_cfg1_out.hðCN[hµÄ¢éDtarget_cfg1_out.hiܽÍC» 2592 ±©çCN[h³êét@CjÉÍCX^[gAbvW 2593 [©çQ 2594 ƳêéV{ÌX^uÌè`ðÜßéDT^IÉÍCȺÌæ¤Èè`ð 2595 ÜßéKvª éD 2317 タイマ値の内部表現を,1μ秒単位に変換するためのマクロ(または関数). 2318 targettimer_get_currentで読み出した値を,タイマ割込み発生からの経過時間 2319 (単位: 1μ秒)に変換するために用いる. 2320 2321 7. コンフィギュレータ設定ファイルのターゲット依存部 2322 2323 7.1 設定ファイルとターゲット依存部の位置付け 2324 2325 SSPカーネルのコンフィギュレータは,設定ファイルの記述に従ってファイルの 2326 生成およびエラーチェックを行う.コンフィギュレータの設定ファイルには, 2327 以下の4つがある. 2328 2329 (a) 静的APIテーブル 2330 2331 静的APIの一覧と,各静的APIのパラメータについて記述したファイル.静的 2332 APIを拡張する場合以外は変更する必要がないため,ターゲット非依存部で用意 2333 している(kernel/kernel_api.csv). 2334 2335 (b) 値取得シンボルテーブル 2336 2337 コンフィギュレータのパス1において,パラメータ計算用C言語ファイルに出力 2338 し,値を求めたいシンボル(一般には式)を記述するためのファイル.ターゲッ 2339 ト非依存部では,ターゲットに依存せずに必要となるシンボルを記述したファ 2340 イルを用意している(kernel/kernel_def.csv). 2341 2342 ターゲットに依存して必要となるシンボルがある場合には,targetディレクト 2343 リに置かれたtarget_def.csv中に記述する.target_def.csv中に記述して値を 2344 求めることができるシンボルは,kernel/kernel_int.hおよびそこからインクルー 2345 ドされるファイルで定義されていなければならない.kernel_int.hからは, 2346 target_stddef.h,target_kernel.h,target_config.hを(間接的に)インクルー 2347 ドしているため,これらのファイルおよびそこからインクルードされるファイ 2348 ルで定義されるターゲット依存のシンボルは,target_def.csv中に記述するこ 2349 とができる. 2350 2351 ここで値を求めたシンボルの値は,コンフィギュレータのパス2およびパス3の 2352 テンプレートファイル中で参照することができる. 2353 2354 (c) パス2のテンプレートファイル 2355 2356 コンフィギュレータのパス2は,テンプレートファイルに従って,カーネルの構 2357 成・初期化ファイル(kernel_cfg.c),構成・初期化ヘッダファイル 2358 (kernel_cfg.h)などを生成する.このテンプレートファイルは,ターゲット 2359 非依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット 2360 依存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードす 2361 る形になっている. 2362 2363 具体的には,targetディレクトリに置かれたtarget.tfで,必要な変数を定義し 2364 た後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)をイ 2365 ンクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用する変 2366 数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,カー 2367 ネルのターゲット依存部で使用する変数定義等を生成する.target.tfから,プ 2368 ロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい. 2369 2370 (d) パス3のテンプレートファイル 2371 2372 コンフィギュレータのパス3は,テンプレートファイルに従って,静的APIの一 2373 般定数式パラメータのチェックを行う.このテンプレートファイルも,ターゲッ 2374 ト非依存部とターゲット依存部に切り分けてあり,ターゲット依存部からター 2375 ゲット非依存部をインクルードする形になっている. 2376 2377 具体的には,targetディレクトリに置かれたtarget_check.tfで,必要な変数を 2378 定義した後,テンプレートファイルのターゲット非依存部 2379 (kernel/kernel_check.tf)をインクルードする.kernel_check.tfでは,カー 2380 ネルのターゲット非依存部で初期化ブロックに出力した一般定数式パラメータ 2381 のチェックを行う.kernel_check.tfをインクルードした後,target_check.tf 2382 では,ターゲットに依存するチェックを行う.target_check.tfから,プロセッ 2383 サ依存部,チップ依存部を,開発環境依存部を切り分けてもよい. 2384 2385 なお,コンフィギュレータの詳細仕様と設定ファイルの記述方法については, 2386 別途PDFファイルの形で配布している「TOPPERS新世代カーネル用コンフィギュ 2387 レータ仕様」および「TOPPERS新世代カーネル用コンフィギュレータ内蔵マクロ 2388 プロセッサ仕様」を参照すること. 2389 2390 7.2 パス2のテンプレートファイルのターゲット依存部 2391 2392 以下では,パス2のテンプレートファイルのターゲット依存部を記述する上で必 2393 要な事項について説明する. 2394 2395 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数 2396 2397 target.tfからkernel.tfをインクルードする前に,次の変数を定義しておかな 2398 ければならない. 2399 2400 (7-2-1) INTNO_ATTISR_VALID ATT_ISRで使用できる割込み番号 2401 (7-2-2) INHNO_ATTISR_VALID INTNO_ATTISR_VALIDに対応する割込ハンドラ番号 2402 (7-2-3) INHNO_DEFINH_VALID DEF_INTで使用できる割込みハンドラ番号 2403 (7-2-4) EXCNO_DEFEXC_VALID DEF_EXCで使用できるCPU例外ハンドラ番号 2404 (7-2-5) INTNO_CFGINT_VALID CFG_INTで使用できる割込み番号 2405 (7-2-6) INTPRI_CFGINT_VALID CFG_INTで使用できる割込み優先度 2406 2407 APIで使用できる割込み番号/割込みハンドラ番号/CPU例外ハンドラ番号/割 2408 込み優先度のリストを,各変数に定義する.INHNO_ATTISR_VALIDには, 2409 INTNO_ATTISR_VALIDにリストアップした割込み番号に対応する割込みハンドラ 2410 番号のリストを定義する. 2411 2412 (7-2-7) TARGET_TSKATR(オプション) ターゲット定義のタスク属性 2413 (7-2-8) TARGET_ISRATR(オプション) ターゲット定義のISR属性 2414 (7-2-9) TARGET_INHATR(オプション) ターゲット定義の割込みハンドラ属性 2415 (7-2-10) TARGET_INTATR(オプション) ターゲット定義の割込み属性 2416 (7-2-11) TARGET_EXCATR(オプション) ターゲット定義のCPU例外ハンドラ属性 2417 2418 各オブジェクトの属性を,ターゲット定義に拡張する場合に,該当するオブジェ 2419 クト属性を示す変数に,拡張に使用するビットの論理和を定義する.これによ 2420 り,拡張に使用するビットが設定されている場合に,エラーになるのを防ぐ. 2421 2422 (7-2-12) INTNO_FIX_KERNEL(オプション) カーネル管理に固定されている 2423 割込み番号 2424 (7-2-13) INHNO_FIX_KERNEL(オプション) カーネル管理に固定されている 2425 割込みハンドラ番号 2426 (7-2-14) INHNO_FIX_NONKERNEL(オプション) カーネル管理外に固定されている 2427 割込み番号 2428 (7-2-15) INHNO_FIX_NONKERNEL(オプション) カーネル管理外に固定されている 2429 割込みハンドラ番号 2430 2431 カーネル管理またはカーネル管理外に固定されている割込みがある場合には, 2432 それらの割込み番号と割込みハンドラ番号のリストを,各変数に定義する. 2433 2434 (7-2-16) USE_INHINIB_TABLE(オプション) 2435 2436 OMIT_INITIALIZE_INTERRUPTを定義したが,割込みハンドラの初期化に必要な情 2437 報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的には, 2438 TNUM_INHNO,tnum_inhno,inhinib_tableの定義と,割込みハンドラ毎の出入口 2439 処理を生成するための記述(INTHDR_ENTRYマクロのリスト)が,ターゲット非 2440 依存部によって生成される. 2441 2442 (7-2-17) USE_INTINIB_TABLE(オプション) 2443 2444 OMIT_INITIALIZE_INTERRUPTを定義したが,割込み要求ラインの初期化に必要な 2445 情報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的に 2446 は,TNUM_INTNO,tnum_intno,intinib_tableの定義が,ターゲット非依存部に 2447 よって生成される. 2448 2449 (7-2-18) TARGET_MIN_STKSZ(オプション) 2450 2451 ターゲット定義で,タスクのスタックサイズの最小値を設定する場合には,こ 2452 の変数をスタックサイズの最小値に定義する. 2453 2454 (7-2-19) CHECK_STKSZ_ALIGN(オプション) 2455 2456 スタック領域のサイズがある値の倍数でなければならない場合に,この変数を 2457 その値に定義する.この変数を定義することで,kernel.tfにおいて,スタック 2458 領域のサイズが正しくない(この変数に定義した値の倍数でない)場合のエラー 2459 をチェックするようになる.チェックが必要ない場合には,この変数を定義し 2460 ない. 2461 2462 7.2.2 ターゲット非依存部で定義される変数 2463 2464 kernel.tfの中では次の変数が定義されるため,kernel.tfをインクルードした 2465 後,target.tfの中でこれらを参照することができる. 2466 2467 (7-2-1) INTNO[inhno] inhnoを対応するintnoに変換するための連想配列 2468 (7-2-2) INHNO[intno] intnoを対応するinhnoに変換するための連想配列 2469 2470 7.3 パス3のテンプレートファイルのターゲット依存部 2471 2472 以下では,パス3のテンプレートファイルのターゲット依存部を記述する上で必 2473 要な事項について説明する. 2474 2475 target_check.tfからkernel_check.tfをインクルードする前に,必要に応じて, 2476 次の変数を定義しておかなければならない. 2477 2478 (7-3-1) CHECK_FUNC_ALIGN(オプション) 関数のアライン単位 2479 (7-3-2) CHECK_FUNC_NONNULL(オプション)関数の非NULLチェック 2480 (7-3-3) CHECK_STACK_ALIGN(オプション) スタック領域のアライン単位 2481 (7-3-4) CHECK_STACK_NONNULL(オプション)スタック領域の非NULLチェック 2482 (7-3-5) CHECK_MPF_ALIGN(オプション) 固定長メモリプール領域のアライン単位 2483 (7-3-6) CHECK_MPF_NONNULL(オプション) 固定長メモリプール領域の非NULLチェック 2484 2485 関数/スタック領域/固定長メモリプール領域の先頭番地のアラインメントの 2486 チェックを行う場合には,それぞれ,CHECK_FUNC_ALIGN/CHECK_STACK_ALIGN/ 2487 CHECK_MPF_ALIGNをアライン単位に定義する.関数/スタック領域/固定長メモ 2488 リプール領域の先頭番地がNULLでないかのチェックを行う場合には,それぞれ 2489 CHECK_FUNC_NONNULL/CHECK_STACK_NONNULL/CHECK_MPF_NONNULLを1に定義する. 2490 チェックが必要ない場合には,該当する変数を定義しない. 2491 2492 7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル 2493 2494 コンフィギュレータに関してターゲット依存に用意する必要があるファイルと 2495 して,設定ファイル以外に,cfg1_out.cをリンクするために必要なスタブの定 2496 義ファイルがある. 2497 2498 コンフィギュレータのパス1では,静的APIの整数定数式パラメータの値をCコン 2499 パイラを用いて求めるために,cfg1_out.cを生成する.これをコンパイル,リ 2500 ンクしてオブジェクトファイルを生成する際に,スタートアップモジュールか 2501 ら参照されるシンボルの定義を与える必要がある. 2502 2503 この定義を与えるために,cfg1_out.cから,ターゲット依存部の 2504 target_cfg1_out.hをインクルードしている.target_cfg1_out.h(または,そ 2505 こからインクルードされるファイル)には,スタートアップモジュールから参 2506 照されるシンボルのスタブの定義を含める.典型的には,以下のような定義を 2507 含める必要がある. 2596 2508 2597 2509 ---------------------------------------- … … 2614 2526 2615 2527 2616 8. VXeT[rXÌ^[Qbg˶ 2617 2618 8.1 VXeT[rXÌ^[Qbg˶ 2619 2620 VA|[gâVXeO^XNÖAÌèÈÇCVXeT[rXÌ 2621 \¬ðè·é½ßÌè`ðtarget_syssvc.hܽͻ±©çCN[h³ê 2622 ét@CivZbTE`bvEJ«˶ÅpÓ³êéwb_t@C 2623 ÈÇjÉÜßéD 2624 2625 ȨCTOPPERSgÝR|[lgVXeª±ü³êéÆC±Ìt@CÌ 2626 àeÍR|[lgLqt@CÉLq³êé±ÆÉÈèC±Ìt@CÍ 2627 ³ÈéiܽÍCåÉk¬³êéj©ÝÅ éD 2628 2629 8.2 VXeO@\Ì^[Qbg˶è` 2630 2631 VXeO@\ðgp·éêÅCX^[gAbvW 2632 [ÅbssZNV 2633 ÌNAðȪµÄ¢éêÉÍCsyslog_logmaskÆsyslog_lowmask_notð 2634 0Éú»·éR[hðÇÁ·éD±êÍCVXeO@\ªú»³êéO 2635 Éoͳê½OîñðCáxoÍ@\ðp¢ÄoÍ·é½ßÅ éD 2636 2637 ^[Qbg˶Åñ·×«VXeO@\̽ßÌè`ÍÌÊèÅ 2638 éD 2528 8. システムサービス等のターゲット依存部 2529 2530 8.1 システムサービスのターゲット依存部 2531 2532 シリアルポート数やシステムログタスク関連の定数など,システムサービスの 2533 構成を決定するための定義をtarget_syssvc.hまたはそこからインクルードされ 2534 るファイル(プロセッサ・チップ・開発環境依存部で用意されるヘッダファイ 2535 ルなど)に含める. 2536 2537 なお,TOPPERS組込みコンポーネントシステムが導入されると,このファイルの 2538 内容はコンポーネント記述ファイルに記述されることになり,このファイルは 2539 無くなる(または,大幅に縮小される)見込みである. 2540 2541 8.2 システムログ機能のターゲット依存定義 2542 2543 システムログ機能を使用する場合で,スタートアップモジュールでbssセクショ 2544 ンのクリアを省略している場合には,syslog_logmaskとsyslog_lowmask_notを 2545 0に初期化するコードを追加する.これは,システムログ機能が初期化される前 2546 に出力されたログ情報を,低レベル出力機能を用いて出力するためである. 2547 2548 ターゲット依存部で提供すべきシステムログ機能のための定義は次の通りであ 2549 る. 2639 2550 2640 2551 (8-2-1) TCNT_SYSLOG_BUFFER 2641 2552 2642 VXeO@\ÌOobt@ÌTCYðè`·é}NDè`µÈ¢ê 2643 ÌftHglÍ32D 2553 システムログ機能のログバッファのサイズを定義するマクロ.定義しない場合 2554 のデフォルト値は32. 2644 2555 2645 2556 (8-2-2) void target_fput_log(char c) 2646 2557 2647 VXeOÌáxoÍ̽ß̶oÍÖD^[Qbg˶Ìû@ÅC 2648 ¶cð\¦/oÍ/Û¶·éD 2649 2650 ±ÌÖÍCGggÉÀµÈ¯êÎÈçÈ¢D±ÌÖàÅr¼§ 2651 äªKvÈêÉÍCSILðp¢ÄSÝbNóÔÉ·é±ÆDܽCS 2652 ÝbNóÔÅÄÎêéêª é½ßCSÝbNóÔ©çÄÑo· 2653 ±ÆªÅ«È¢ÖðÄÎÈ¢æ¤ÉÀµÈ¯êÎÈçÈ¢D 2654 2655 áxoÍðVA|[goRÅs¤êÅCVAC^tF[Xh 2656 CoÆ|[gð¤pµÈ¢±Æª]ܵ¢ªC|[gª«èÈ¢½ßÉâ 2657 Þ𦸤p·éêÉÍC¼Òª£µÈ¢æ¤ÉÓªKvÅ éDïÌ 2658 IÉÍC¼Òª¯¶ÝèÅVAI/OfoCXðg¤æ¤ÉµCVAC 2659 ^tF[XhCoÌ®ìÉáxoͪsíêÄà·µx¦È¢æ¤É 2660 Ýv·éDܽCáxoͪ®ìJnãÉVAC^tF[XhC 2661 oªVAI/OfoCXðú»·éÆC¶»¯ªN±éÂ\«ª é½ßC 2662 ¤p·é|[gÍCáxoÍ@\¤Åú»µCVAC^tF[X 2663 hCoÅÍú»µÈ¢æ¤É·éÆæ¢D 2664 2665 ȨC±ÌÖÌ{ÌðCÇÌt@CÉLq·é©ªâèÉÈéDVXe 2666 T[rXÌ^[Qbg˶ÉÍCWÅÍCÖè`ðLq·é½ßÌt@ 2667 CðpӵĢȢD^[Qbg˶ÅpÓµÄà梪CáOIÉCJ[ 2668 lÀÌ^[Qbg˶W 2669 [itarget_config.cjÉLqµÄàæ¢D 2670 ±ÌêCtarget_fput_logðCl[Lqitarget_rename.defÈÇjÉÜ 2671 ßÄÍÈçÈ¢D 2672 2673 8.3 O^XNÌ^[Qbg˶è` 2674 2675 ^[Qbg˶Åñ·×«O^XN̽ßÌè`ÍÌÊèÅ éD± 2676 êçÌè`ÍCtarget_syssvc.hܽͻ±©çCN[h³êét@CÉ 2677 ÜßéD 2678 2679 (8-3-1) LOGTASK_PRIORITYiIvVj 2680 2681 O^XNÌDæxðè`·é}NDè`µÈ¢êÌftHglÍ3D 2682 2683 (8-3-2) LOGTASK_STACK_SIZEiIvVj 2684 2685 O^XNÌX^bNTCYðè`·é}NDè`µÈ¢êÌftHg 2686 lÍ1024D 2687 2688 (8-3-3) LOGTASK_PORTIDiIvVj 2689 2690 O^XNÌoÍæÌVA|[gÔDè`µÈ¢êÌftHglÍ1D 2691 2692 (8-3-4) LOGTASK_INTERVALiIvVj 2693 2694 O^XNÌ®ìÔuiPÊÍ~bjDè`µÈ¢êÌftHglÍ10D 2695 2696 (8-3-5) LOGTASK_FLUSH_WAITiIvVj 2697 2698 OoÍðÒ¿í¹éɨ¢ÄC^XNðÒ½¹éPÊÆÈéÔiP 2699 ÊÍ~bjDè`µÈ¢êÌftHglÍ1D 2700 2701 8.4 VAC^tF[XhCoÌ^[Qbg˶ 2702 2703 ^[Qbg˶Åñ·×«VAC^tF[XhCo̽ßÌè` 2704 ÍÌÊèÅ éD±êçÌè`ÍCÊÉwèªÈ¢ÀèCtarget_serial.hÜ 2705 ½Í»±©çCN[h³êét@CÉÜßCKvÈRtBM 2706 [V 2707 îñðtarget_serial.cfgÉLq·éDÖÌÀ̪KvÈêÉÍC 2708 target_serial.cÌt@CðpÓ·éD 2709 2710 VAC^tF[XhCoÌÅC^[QbgÌVAI/OfoCXÉ 2711 ˶·éªðCVAI/OfoCXhCoÆÄÔDVAI/OfoCX 2712 hCoÍC¨¨æ»CITRONfoCXhCoÝvKChCÌPDICÉ 2713 ·éDPDICÉ·ét@CÅC¼ÌVXeÉà¤ÊÉg¦éÂ\«ª 2714 éêÉÍCpdicfBNgÉuD 2715 2716 8.4.1 ÏCf[^^CÇÖ 2558 システムログの低レベル出力のための文字出力関数.ターゲット依存の方法で, 2559 文字cを表示/出力/保存する. 2560 2561 この関数は,リエントラントに実装しなければならない.この関数内で排他制 2562 御が必要な場合には,SILを用いて全割込みロック状態にすること.また,全割 2563 込みロック状態で呼ばれる場合があるため,全割込みロック状態から呼び出す 2564 ことができない関数を呼ばないように実装しなければならない. 2565 2566 低レベル出力をシリアルポート経由で行う場合で,シリアルインタフェースド 2567 ライバとポートを共用しないことが望ましいが,ポート数が足りないためにや 2568 むをえず共用する場合には,両者が競合しないように注意が必要である.具体 2569 的には,両者が同じ設定でシリアルI/Oデバイスを使うようにし,シリアルイン 2570 タフェースドライバの動作中に低レベル出力が行われても差し支えないように 2571 設計する.また,低レベル出力が動作開始後にシリアルインタフェースドライ 2572 バがシリアルI/Oデバイスを初期化すると,文字化けが起こる可能性があるため, 2573 共用するポートは,低レベル出力機能側で初期化し,シリアルインタフェース 2574 ドライバでは初期化しないようにするとよい. 2575 2576 なお,この関数の本体を,どのファイルに記述するかが問題になる.システム 2577 サービスのターゲット依存部には,標準では,関数定義を記述するためのファ 2578 イルを用意していない.ターゲット依存で用意してもよいが,例外的に,カー 2579 ネル実装のターゲット依存モジュール(target_config.c)に記述してもよい. 2580 この場合,target_fput_logを,リネーム記述(target_rename.defなど)に含 2581 めてはならない. 2582 2583 8.3 ログタスクのターゲット依存定義 2584 2585 ターゲット依存部で提供すべきログタスクのための定義は次の通りである.こ 2586 れらの定義は,target_syssvc.hまたはそこからインクルードされるファイルに 2587 含める. 2588 2589 (8-3-1) LOGTASK_PRIORITY(オプション) 2590 2591 ログタスクの優先度を定義するマクロ.定義しない場合のデフォルト値は3. 2592 2593 (8-3-2) LOGTASK_STACK_SIZE(オプション) 2594 2595 ログタスクのスタックサイズを定義するマクロ.定義しない場合のデフォルト 2596 値は1024. 2597 2598 (8-3-3) LOGTASK_PORTID(オプション) 2599 2600 ログタスクの出力先のシリアルポート番号.定義しない場合のデフォルト値は1. 2601 2602 (8-3-4) LOGTASK_INTERVAL(オプション) 2603 2604 ログタスクの動作間隔(単位はミリ秒).定義しない場合のデフォルト値は10. 2605 2606 (8-3-5) LOGTASK_FLUSH_WAIT(オプション) 2607 2608 ログ出力を待ち合わせる処理において,タスクを待たせる単位となる時間(単 2609 位はミリ秒).定義しない場合のデフォルト値は1. 2610 2611 8.4 シリアルインタフェースドライバのターゲット依存部 2612 2613 ターゲット依存部で提供すべきシリアルインタフェースドライバのための定義 2614 は次の通りである.これらの定義は,別に指定がない限り,target_serial.hま 2615 たはそこからインクルードされるファイルに含め,必要なコンフィギュレーショ 2616 ン情報をtarget_serial.cfgに記述する.関数の実体が必要な場合には, 2617 target_serial.c等のファイルを用意する. 2618 2619 シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイスに 2620 依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイス 2621 ドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに相当 2622 する.PDICに相当するファイルで,他のシステムにも共通に使える可能性があ 2623 る場合には,pdicディレクトリに置く. 2624 2625 8.4.1 変数,データ型,管理関数 2717 2626 2718 2627 (8-4-1) TNUM_PORT 2719 2628 2720 VAC^tF[XhCoªT|[g·éVA|[gðè`·é 2721 }ND±Ì}NÌè`ÍCtarget_syssvc.hܽͻ±©çCN[h³ 2722 êét@CÉÜßéD 2723 2724 (8-4-2) void sio_initialize(intptr_t exinf) iIvVj2725 2726 VAI/OfoCXhCoÌú»Dtarget_serial.cfgÉC±ÌÖ 2727 ðú»[`ƵÄo^·éÃIAPIðÜßéD 2728 2729 (8-4-3) void sio_terminate(intptr_t exinf) iIvVj2730 2731 VAI/OfoCXhCoÌI¹Dtarget_serial.cfgÉC±ÌÖð 2732 I¹[`ƵÄo^·éÃIAPIðÜßéD 2629 シリアルインタフェースドライバがサポートするシリアルポート数を定義する 2630 マクロ.このマクロの定義は,target_syssvc.hまたはそこからインクルードさ 2631 れるファイルに含める. 2632 2633 (8-4-2) void sio_initialize(intptr_t exinf)(オプション) 2634 2635 シリアルI/Oデバイスドライバの初期化処理.target_serial.cfgに,この関数 2636 を初期化ルーチンとして登録する静的APIを含める. 2637 2638 (8-4-3) void sio_terminate(intptr_t exinf)(オプション) 2639 2640 シリアルI/Oデバイスドライバの終了処理.target_serial.cfgに,この関数を 2641 終了処理ルーチンとして登録する静的APIを含める. 2733 2642 2734 2643 (8-4-4) void sio_isr(intptr_t exinf) 2735 2644 2736 VAI/OfoCXÌÝT[rX[`Dtarget_serial.cfgÉC±Ì 2737 ÖðÝT[rX[`ƵÄo^·éÃIAPIðÜßéDܽC»Ìà 2738 IAPIÉKvÈVAI/OfoCXÌÝÔÈÇÍCtarget_serial.hÅ} 2739 Nè`·éDÝT[rX[`ÅÍÈCÝnhÆ·é±Æ 2740 àÅ«éD 2645 シリアルI/Oデバイスの割込みサービスルーチン.target_serial.cfgに,この 2646 関数を割込みサービスルーチンとして登録する静的APIを含める.また,その静 2647 的APIに必要なシリアルI/Oデバイスの割込み番号などは,target_serial.hでマ 2648 クロ定義する.割込みサービスルーチンではなく,割込みハンドラとすること 2649 もできる. 2741 2650 2742 2651 (8-4-5) SIOPCB 2743 2652 2744 VAI/O|[gÇubNÌf[^^itarget_serial.hÉÍCf[^^ 2745 Ìé¾¾¯ÜÜêÄ¢êÎæ¢jD 2746 2747 (8-4-6) SIO_RDY_SND ÆSIO_RDY_RCV2748 2749 MÂ\R[obN̯ÊÔðSIO_RDY_SNDÉCóMÊmR[obN̯ 2750 ÊÔðSIO_RDY_RCVÉ}Nè`·éDR[obNÌÖ~^ÂðsȤT[ 2751 rXR[isio_ena_cbrÆsio_dis_cbrjÅp¢éD 2752 2753 8.4.2 foCXT[rX[`2754 2755 ȺÌfoCXT[r[`ÍCiÈÆàjVAI/O|[g©çÌ 2756 ݪ}XN³ê½óÔÅÄÑo³êéDܽC^XNReLXgCñ^ 2757 XNReLXgÌ¢¸êÅÄÑo³êéêà éi¢¸êÅÄÑo³êÄ 2758 à®ì·éæ¤ÉµÈ¯êÎÈçÈ¢jD 2653 シリアルI/Oポート管理ブロックのデータ型(target_serial.hには,データ型 2654 の宣言だけ含まれていればよい). 2655 2656 (8-4-6) SIO_RDY_SNDとSIO_RDY_RCV 2657 2658 送信可能コールバックの識別番号をSIO_RDY_SNDに,受信通知コールバックの識 2659 別番号をSIO_RDY_RCVにマクロ定義する.コールバックの禁止/許可を行なうサー 2660 ビスコール(sio_ena_cbrとsio_dis_cbr)で用いる. 2661 2662 8.4.2 デバイスサービスルーチン 2663 2664 以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートからの 2665 割込みがマスクされた状態で呼び出される.また,タスクコンテキスト,非タ 2666 スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて 2667 も動作するようにしなければならない). 2759 2668 2760 2669 (8-4-2-1) SIOPCB *sio_opn_por(ID siopid, intptr_t exinf) 2761 2670 2762 siopid Åwè³êéVAI/O|[gðI[v·éÖDexinfÍVA2763 I/O |[gÉηég£îñÅCR[obNðÄÔÉ|[gðæÊ·é½2764 ßÉn·D 2671 siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル 2672 I/Oポートに対する拡張情報で,コールバックを呼ぶ時にポートを区別するた 2673 めに渡す. 2765 2674 2766 2675 (8-4-2-2) void sio_cls_por(SIOPCB *siopcb) 2767 2676 2768 siopcb Åwè³êéVAI/O|[gðN[Y·éÖD2677 siopcbで指定されるシリアルI/Oポートをクローズする関数. 2769 2678 2770 2679 (8-4-2-3) bool_t sio_snd_chr(SIOPCB *siopcb, char c) 2771 2680 2772 siopcb Åwè³êéVAI/O|[gÉCcŦ³êé¶ðM·éÖD2773 ¶ðMWX^Éüê½êÉÍtrueðCOÉMµ½¶ÌMªIíÁ 2774 ĢȢ½ßÉC¶ðMWX^ÉüêçêÈ©Á½êÉÍfalseðÔ·D 2681 siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数. 2682 文字を送信レジスタに入れた場合にはtrueを,前に送信した文字の送信が終わっ 2683 ていないために,文字を送信レジスタに入れられなかった場合にはfalseを返す. 2775 2684 2776 2685 (8-4-2-4) int_t sio_rcv_chr(SIOPCB *siopcb) 2777 2686 2778 siopcb Åwè³êéVAI/O|[g©ç¶ðÇÞÖD¶ðóMµÄ¢2779 ½êCÇñ¾¶ÌR[hͳÌlƵÄÔµC¶ðóMµÄ¢È¢ê 2780 ÉÍ-1ðÔ·D 2687 siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信してい 2688 た場合,読んだ文字のコードは正の値として返し,文字を受信していない場合 2689 には-1を返す. 2781 2690 2782 2691 (8-4-2-5) void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn) 2783 2692 2784 siopcb Åwè³êéVAI/O|[g©çÌCcbrtnÅwè³êéR[ob2785 Nð·éDcbrtnÉÍCSIO_RDY_SND©SIO_RDY_RCVðwèÅ«éD 2693 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ 2694 クを許可する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる. 2786 2695 2787 2696 (8-4-2-6) void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn) 2788 2697 2789 siopcb Åwè³êéVAI/O|[g©çÌCcbrtnÅwè³êéR[ob2790 NðÖ~·éDcbrtnÉÍCSIO_RDY_SND©SIO_RDY_RCVðwèÅ«éD 2791 2792 8.4.3 R[obN[`2793 2794 ^[Qbg˶ÍCKvÈ^C~OÅCVAC^tF[XhCo 2795 Ì^[Qbgñ˶ÉÜÜêéȺÌR[obN[`ðÄÑoѾ³ 2796 ȯêÎÈçÈ¢D½¾µC»ê¼êÌR[obNªÖ~³êÄ¢éÍC 2797 R[obN[`ðÄÑoµÄÍÈçÈ¢D 2798 2799 R[obN[`ÍCiÈÆàjVAI/O|[g©çÌÝªÖ 2800 ~³ê½óÔÅCñ^XNReLXgÅÄÑo·DexinfÉÍCVAI/O2801 |[gÌI[vÉwè³ê½g£îñðn·D 2698 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ 2699 クを禁止する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる. 2700 2701 8.4.3 コールバックルーチン 2702 2703 ターゲット依存部は,必要なタイミングで,シリアルインタフェースドライバ 2704 のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ 2705 なければならない.ただし,それぞれのコールバックが禁止されている時は, 2706 コールバックルーチンを呼び出してはならない. 2707 2708 コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが禁 2709 止された状態で,非タスクコンテキストで呼び出す.exinfには,シリアルI/O 2710 ポートのオープン時に指定された拡張情報を渡す. 2802 2711 2803 2712 (8-4-3-1) void sio_irdy_snd(intptr_t exinf) 2804 2713 2805 MÂ\R[obN[`DVAI/O|[gÉεĶªMÅ«é 2806 óÔÉÈÁ½êÉÄÑo·DVAC^tF[XhCoÍC±ÌR[ 2807 obN[`ÌÅCsio_snd_chrðÄÑoµÄ̶ðM·é©C 2808 M·×«¶ªÈ¢êÉÍMÂ\R[obNðÖ~·éD 2714 送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信できる 2715 状態になった場合に呼び出す.シリアルインタフェースドライバは,このコー 2716 ルバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか,送 2717 信すべき文字がない場合には送信可能コールバックを禁止する. 2809 2718 2810 2719 (8-4-3-2) void sio_irdy_rcv(intptr_t exinf) 2811 2720 2812 óMÊmR[obN[`DVAI/O|[g©ç¶ðóMµ½êÉ 2813 ÄÑo·DVAC^tF[XhCoÍC±ÌR[obN[`Ì 2814 ÅCK¸sio_rcv_chrðÄÑoµÄóMµ½¶ðæèo·D 2815 2816 8.5 J[lN®bZ[WÌoÍÌ^[Qbg˶è`2817 2818 ^[Qbg˶Åñ·×«J[lN®bZ[WÌoÍ̽ßÌè`Í 2819 ÌÊèÅ éD 2721 受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合に 2722 呼び出す.シリアルインタフェースドライバは,このコールバックルーチンの 2723 中で,必ずsio_rcv_chrを呼び出して受信した文字を取り出す. 2724 2725 8.5 カーネル起動メッセージの出力のターゲット依存定義 2726 2727 ターゲット依存部で提供すべきカーネル起動メッセージの出力のための定義は 2728 次の通りである. 2820 2729 2821 2730 (8-5-1) TARGET_NAME 2822 2731 2823 ^[Qbg̼ÌÉè`·éD 2824 2825 (8-5-2) TARGET_COPYRIGHTiIvVj 2826 2827 J[lN®bZ[WÉC^[Qbg˶Ìì \¦ðÇÁ·é½ßÌ 2828 }NDftHgÅÍC^[Qbg˶Ìì \¦ðÇÁµÈ¢D 2829 2830 8.6 TvvOÆeXgvOÌ^[Qbg˶è` 2831 2832 ^[Qbg˶Åñ·×«TvvO¨æÑeXgvOÌ 2833 ½ßÌè`ÍÌÊèÅ éD±êçÌè`ÍCtarget_test.hiܽͻêç 2834 ©çCN[h³êét@CjÉÜßéD 2835 2836 (8-6-1) STACK_SIZEiIvVj 2837 2838 TvvO¨æÑeXgvOÌ^XNÌX^bNTCYðè` 2839 ·é}NDè`µÈ¢êÌftHglÍ4096DftHgÝèÅÍ 2840 ªs«·éêâCV~ 2841 [V«ÈÇÅå«¢X^bNÌæªKv 2842 ÈêÉÍC^[Qbg˶űÌ}NðÝè·éX^bNTCYÉè` 2843 ·éD 2844 2845 (8-6-2) CPUEXC1iIvVj 2846 2847 TvvO¨æÑeXgvOÅp¢éCPUáOÌCPUáOnh 2848 Ôðè`·é}ND±Ì}Nðè`µÈ¢êCCPUáOnhðg 2849 ¤ªªTvvO©çO³êéDCPUáOnhÌeXgð·é 2850 eXgvOÍRpCÅ«È¢D 2851 2852 (8-6-3) RAISE_CPU_EXCEPTIONiIvVj 2853 2854 CPUEXC1Éè`µ½CPUáO𶳹éC¾êÌvOðè`·é}ND 2855 CPUEXC1ðè`µ½êÉÍK¸è`µÈ¯êÎÈçÈ¢D 2856 2857 (8-6-4) CANNOT_RETURN_CPUEXCiIvVj 2858 2859 ^[QbgVXȩñÉæèCCPUáOnh©ç^[µ½ãÉC^ 2860 XNÌÀsðp±Å«È¢êÉè`·é}ND±Ì}Nðè`·éÆC 2861 CPUáOnhÌeXgð·éeXgvO©çCCPUáOnh©ç 2862 ^[µ½ã̪O³êéDTvvOÌYªÍ³µ 2863 ®ìµÈ¢D 2864 2865 (8-6-5) TASK_PORTIDiIvVj 2866 2867 TvvOɨ¢ÄCR}h¶ðÇÝÞVA|[gÔð 2868 è`·é}NDè`µÈ¢êÌftHglÍ1D 2869 2870 (8-6-6) LOOP_REFiIvVj 2871 2872 TvvOɨ¢ÄCvZbT̬xðvª·é½ßÌ[vñ 2873 ðè`·é}NDè`µÈ¢êÌftHglÍ1000000DftHgÝè 2874 ÅÍClªå«ß¬ÄvªÉÔª©©è·¬éêâClª¬³ß¬Ävª 2875 ʪÀèµÈ¢êÉC^[Qbg˶űÌ}NðÝè·é[vñ 2876 Éè`·éD 2877 2878 (8-6-7) MEASURE_TWICEiIvVj 2879 2880 TvvOɨ¢ÄCvZbT̬xð2xvª·éêÉè`·é 2881 }NDV~ 2882 [V«ÈÇvZbT̬xªÏ®·é«ÅC1xÌ 2883 vªÅÍvªÊªÀèµÈ¢êÉè`·éD 2884 2885 (8-6-8) TASK_LOOPiIvVj 2886 2887 TvvOɨ¢ÄCvZbT̬xðvª¹¸ÉC^XNàÅÌ 2888 [vñðÅè·éêÉC[vñðè`·é}ND[vSÌÌÀ 2889 sÔª0.4böxÉÈéæ¤È[vñðC±Ì}NÉè`·éD 2890 2891 9. »Ì¼ 2892 2893 9.1 hL 2894 g 2895 2896 ^[Qbg˶Ì[U[Y}j 2897 AðCtarget_user.txtÉpÓ·éDv 2898 ZbTE`bvEJ«˶Ì[U[Y}j 2899 AðØ誯Äàæ 2900 ¢µCt@Cªå«ÈéêÉÍ¡Ìt@CɪµÄ梪C»Ì 2901 êÉÍCtarget_user.txtÉ»êçÌt@C¼ðLq·é±ÆD 2902 2903 ^[Qbg˶Ì[U[Y}j 2904 AÉÍCÈÆàÌæ¤Èàeð 2905 Lq·é±Æª]ܵ¢D 2906 2907 (1) εĢé^[QbgVXeÌíÞE\¬Co[WÔ 2908 E^[Qbgn[hEFAi{[hj̼ÌÆεĢé\¬ 2909 E^[QbgªÌ 2910 E^[Qbgñ˶Ìo[WÔ 2911 EvZbTC`bvCJ«˶Ì\¬Æo[WÔ 2912 Egp·éPDICÆo[WÔ 2913 2914 (2) gp·éJ«Ʈìص½ðio[WCIvVj 2915 E¾êniRpCCAZuCJj 2916 EfobO« 2917 2918 (3) ^[Qbgè`ÌKè 2919 2920 (3-1) f[^^ÉÖ·éKè 2921 Eint_t^Clong_t^ÌTCY 2922 Echar^Cint_least8_t^Cvoid *^Cintptr_t^ÌTCY 2923 Eint8_t^Cuint8_t^Cint64_t^Cuint64_t^Cint128_t^C 2924 @uint128_t^Cfloat32_t^Cdouble64_t^ÌT|[gÌL³ 2925 2926 (3-2) ÝÉÖ·éKè 2927 EÝnhÔÆÝÔÌÄC¼ÒÌÎ 2928 EÝDæxÌiKiTMIN_INTPRIÌlj 2929 Edis_intÆena_intÌT|[gÌL³C»Ì§À 2930 ECFG_INŢÀÆg£i^[Qbgè`ÅgpÅ«éÝ®«j 2931 ETOPPERSWÝf©ç̻̼ÌíE 2932 2933 (3-3) J[lÇOÌÝÉÖ·éKè 2934 ETMIN_INTPRIÍÅè©ÝèÅ«é©C»ÌÝèû@ 2935 ENMIÈOÉJ[lÇOÌÝðݯé©iݯçêéæ¤É·é©j 2936 EJ[lÇOÌÝÌÝèû@ 2937 EJ[lÇOÌÝÉεÄDEF_INHCCFG_INTðT|[g·é© 2938 EJ[lÇOÌÝnhªÀsJn³êéÌVXeóÔÆ 2939 @ReLXg 2940 EÝnhÌI¹Ésíêé 2941 EJ[lÇOÌÝnhÌLqû@ 2942 EJ[làÌÝoüûÅN±éÂ\«Ì éCPUáO 2943 2944 (3-4) CPUáOÉÖ·éKè 2945 ECPUáOnhÔÌÄ 2946 EÝDæx}XNðTMIN_INTPRIƯ¶©»êæèà¢lÉÝèµÄ 2947 @¢éóÔŶµ½CPUáOðCJ[lÇOÌCPUáOƵ¤© 2948 EJ[làÌCPUáOoüûÅN±éÂ\«Ì éCPUáO 2949 2950 (3-5) «\]¿pVXeÌQÆÉÖ·éKè 2951 Eget_utmÌT|[gÌL³C»Ì§À 2952 2953 (3-6) »Ì¼ 2954 E»Ì¼Ì§À 2955 E»Ì¼Ìg£@\ 2956 2957 (4) J[lÌN®^I¹ÉÖ·éîñ 2958 EpӵĢéX^[gAbvW 2959 [Ìàe 2960 EX^[gAbvW 2961 [©çhardware_init_hookðÄÑoµÄ¢éê 2962 @ÉÍChardware_init_hookðAvP[VÅpÓ·éêÌì¬ 2963 @û@â§ÀÈÇ 2964 EJ[lðI¹µ½ãÌU¢ 2965 2966 (5) }bv 2967 EftHgÌ}bvC»ÌÏXû@ 2968 2969 (6) ^C}hCoÖAÌîñ 2970 E^CeBbNÌüúC»ÌÏXû@ 2971 Egp·é\[Xi^C}j 2972 E^C}ÝÌÝDæxÌÏXû@ 2973 EI[o^C}ÝÌÝDæxÌÏXû@ 2974 2975 (7) VAC^tF[XhCoÌîñ 2976 Egp·é\[XiSIORg[j 2977 EÊMp[^i{[[gCrbgCpeBÌL³CXgbvrbgj 2978 2979 (8) VXe\zè 2980 2981 (9) ^[QbgVXeÅLÌÓ 2982 E^XNReLXgÉÜÜêéWX^CÜÜêÈ¢WX^ 2983 2984 (10) ÞÌ^[QbgÉ|[eBO·éJÒü¯ÌQlîñ 2985 2986 (11) fBNg\¬Et@C\¬ 2987 2988 (12) o[Wð 2989 2990 ܽCKvɶÄC^[Qbg˶ÌÝvðCtarget_design.txtÉp 2991 Ó·éDvZbTE`bvEJ«˶ÉÖ·éÝvðØèª¯Ä 2992 à梵Ct@Cªå«ÈéêÉÍ¡Ìt@CɪµÄà梪C 2993 »ÌêÉÍCtarget_design.txtÉ»êçÌt@C¼ðLq·é±ÆD 2994 2995 9.2 pbP[WLqt@C 2996 2997 [XpbP[WiÂÊpbP[W¨æÑÈÕpbP[Wjð쬷é½ß 2998 ÉCpbP[WÉÜßét@CðLqµ½pbP[WLqt@CðpÓ· 2999 éDpbP[WLqt@C̼ÌÍCÂÊpbP[WpðMANIFESTCÈÕpb 3000 P[WpðE_PACKAGEÆ·éD 3001 3002 á¦ÎCarch/arm_gccfBNgÉu©ê½MANIFESTt@Cðp¢ÄÂÊ 3003 pbP[Wð쬷éêÉÍCÌR}hðÀs·éD 2732 ターゲットの名称に定義する. 2733 2734 (8-5-2) TARGET_COPYRIGHT(オプション) 2735 2736 カーネル起動メッセージに,ターゲット依存部の著作権表示を追加するための 2737 マクロ.デフォルトでは,ターゲット依存部の著作権表示を追加しない. 2738 2739 8.6 サンプルプログラムとテストプログラムのターゲット依存定義 2740 2741 ターゲット依存部で提供すべきサンプルプログラムおよびテストプログラムの 2742 ための定義は次の通りである.これらの定義は,target_test.h(またはそれら 2743 からインクルードされるファイル)に含める. 2744 2745 (8-6-1) STACK_SIZE(オプション) 2746 2747 サンプルプログラムおよびテストプログラムのタスクのスタックサイズを定義 2748 するマクロ.定義しない場合のデフォルト値は4096.デフォルト設定ではメモ 2749 リが不足する場合や,シミュレーション環境などで大きいスタック領域が必要 2750 な場合には,ターゲット依存部でこのマクロを設定するスタックサイズに定義 2751 する. 2752 2753 (8-6-2) CPUEXC1(オプション) 2754 2755 サンプルプログラムおよびテストプログラムで用いるCPU例外のCPU例外ハンド 2756 ラ番号を定義するマクロ.このマクロを定義しない場合,CPU例外ハンドラを使 2757 う部分がサンプルプログラムから除外される.CPU例外ハンドラのテストをする 2758 テストプログラムはコンパイルできない. 2759 2760 (8-6-3) RAISE_CPU_EXCEPTION(オプション) 2761 2762 CPUEXC1に定義したCPU例外を発生させるC言語のプログラムを定義するマクロ. 2763 CPUEXC1を定義した場合には必ず定義しなければならない. 2764 2765 (8-6-4) CANNOT_RETURN_CPUEXC(オプション) 2766 2767 ターゲットシステムの制約により,CPU例外ハンドラからリターンした後に,タ 2768 スクの実行を継続できない場合に定義するマクロ.このマクロを定義すると, 2769 CPU例外ハンドラのテストをするテストプログラムから,CPU例外ハンドラから 2770 リターンした後の処理が除外される.サンプルプログラムの該当部分は正しく 2771 動作しない. 2772 2773 (8-6-5) TASK_PORTID(オプション) 2774 2775 サンプルプログラムにおいて,コマンド文字を読み込むシリアルポート番号を 2776 定義するマクロ.定義しない場合のデフォルト値は1. 2777 2778 (8-6-6) LOOP_REF(オプション) 2779 2780 サンプルプログラムにおいて,プロセッサの速度を計測するためのループ回数 2781 を定義するマクロ.定義しない場合のデフォルト値は1000000.デフォルト設定 2782 では,値が大き過ぎて計測に時間がかかりすぎる場合や,値が小さ過ぎて計測 2783 結果が安定しない場合に,ターゲット依存部でこのマクロを設定するループ回 2784 数に定義する. 2785 2786 (8-6-7) MEASURE_TWICE(オプション) 2787 2788 サンプルプログラムにおいて,プロセッサの速度を2度計測する場合に定義する 2789 マクロ.シミュレーション環境などプロセッサの速度が変動する環境で,1度の 2790 計測では計測結果が安定しない場合に定義する. 2791 2792 (8-6-8) TASK_LOOP(オプション) 2793 2794 サンプルプログラムにおいて,プロセッサの速度を計測せずに,タスク内での 2795 ループ回数を固定する場合に,ループ回数を定義するマクロ.ループ全体の実 2796 行時間が0.4秒程度になるようなループ回数を,このマクロに定義する. 2797 2798 9. その他 2799 2800 9.1 ドキュメント 2801 2802 ターゲット依存部のユーザーズマニュアルを,target_user.txtに用意する.プ 2803 ロセッサ・チップ・開発環境依存部のユーザーズマニュアルを切り分けてもよ 2804 いし,ファイルが大きくなる場合には複数のファイルに分割してよいが,その 2805 場合には,target_user.txt中にそれらのファイル名を記述すること. 2806 2807 ターゲット依存部のユーザーズマニュアルには,少なくとも次のような内容を 2808 記述することが望ましい. 2809 2810 (1) 対応しているターゲットシステムの種類・構成,バージョン番号 2811 ・ターゲットハードウェア(ボード等)の名称と対応している構成 2812 ・ターゲット略称 2813 ・ターゲット非依存部のバージョン番号 2814 ・プロセッサ,チップ,開発環境依存部の構成とバージョン番号 2815 ・使用するPDICとバージョン番号 2816 2817 (2) 使用する開発環境と動作検証した条件(バージョン,オプション等) 2818 ・言語処理系(コンパイラ,アセンブラ,リンカ等) 2819 ・デバッグ環境 2820 2821 (3) ターゲット定義事項の規定 2822 2823 (3-1) データ型に関する規定 2824 ・int_t型,long_t型のサイズ 2825 ・char型,int_least8_t型,void *型,intptr_t型のサイズ 2826 ・int8_t型,uint8_t型,int64_t型,uint64_t型,int128_t型, 2827 uint128_t型,float32_t型,double64_t型のサポートの有無 2828 2829 (3-2) 割込み処理に関する規定 2830 ・割込みハンドラ番号と割込み番号の割当て,両者の対応 2831 ・割込み優先度の段階数(TMIN_INTPRIの値) 2832 ・dis_intとena_intのサポートの有無,その制限事項 2833 ・CFG_INTの制限事項と拡張(ターゲット定義で使用できる割込み属性) 2834 ・TOPPERS標準割込み処理モデルからのその他の逸脱 2835 2836 (3-3) カーネル管理外の割込みに関する規定 2837 ・TMIN_INTPRIは固定か設定できるか,その設定方法 2838 ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか) 2839 ・カーネル管理外の割込みの設定方法 2840 ・カーネル管理外の割込みに対してDEF_INH,CFG_INTをサポートするか 2841 ・カーネル管理外の割込みハンドラが実行開始される時のシステム状態と 2842 コンテキスト 2843 ・割込みハンドラの終了時に行われる処理 2844 ・カーネル管理外の割込みハンドラの記述方法 2845 ・カーネル内の割込み出入口処理で起こる可能性のあるCPU例外 2846 2847 (3-4) CPU例外処理に関する規定 2848 ・CPU例外ハンドラ番号の割当て 2849 ・割込み優先度マスクをTMIN_INTPRIと同じかそれよりも高い値に設定して 2850 いる状態で発生したCPU例外を,カーネル管理外のCPU例外と扱うか 2851 ・カーネル内のCPU例外出入口処理で起こる可能性のあるCPU例外 2852 2853 (3-5) 性能評価用システム時刻の参照に関する規定 2854 ・get_utmのサポートの有無,その制限事項 2855 2856 (3-6) その他 2857 ・その他の制限事項 2858 ・その他の拡張機能 2859 2860 (4) カーネルの起動/終了処理に関する情報 2861 ・用意しているスタートアップモジュールの処理内容 2862 ・スタートアップモジュールからhardware_init_hookを呼び出している場 2863 合には,hardware_init_hookをアプリケーションで用意する場合の作成 2864 方法や制限事項など 2865 ・カーネルを終了した後の振舞い 2866 2867 (5) メモリマップ 2868 ・デフォルトのメモリマップ,その変更方法 2869 2870 (6) タイマドライバ関連の情報 2871 ・タイムティックの周期,その変更方法 2872 ・使用するリソース(タイマ) 2873 ・タイマ割込みの割込み優先度の変更方法 2874 ・オーバランタイマ割込みの割込み優先度の変更方法 2875 2876 (7) シリアルインタフェースドライバの情報 2877 ・使用するリソース(SIOコントローラ) 2878 ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット) 2879 2880 (8) システム構築手順 2881 2882 (9) ターゲットシステム固有の注意事項 2883 ・タスクコンテキストに含まれるレジスタ,含まれないレジスタ 2884 2885 (10) 類似のターゲットにポーティングする開発者向けの参考情報 2886 2887 (11) ディレクトリ構成・ファイル構成 2888 2889 (12) バージョン履歴 2890 2891 また,必要に応じて,ターゲット依存部の設計メモを,target_design.txtに用 2892 意する.プロセッサ・チップ・開発環境依存部に関する設計メモを切り分けて 2893 もよいし,ファイルが大きくなる場合には複数のファイルに分割してもよいが, 2894 その場合には,target_design.txt中にそれらのファイル名を記述すること. 2895 2896 9.2 パッケージ記述ファイル 2897 2898 リリースパッケージ(個別パッケージおよび簡易パッケージ)を作成するため 2899 に,パッケージに含めるファイルを記述したパッケージ記述ファイルを用意す 2900 る.パッケージ記述ファイルの名称は,個別パッケージ用をMANIFEST,簡易パッ 2901 ケージ用をE_PACKAGEとする. 2902 2903 例えば,arch/arm_gccディレクトリに置かれたMANIFESTファイルを用いて個別 2904 パッケージを作成する場合には,次のコマンドを実行する. 3004 2905 3005 2906 % utils/makerelease arch/arm_gcc/MANIFEST 3006 2907 3007 ±ÌR}hÉæèCRELEASE/ssp_arch_arm_gcc-<o[WÔ>.tar.gzª 3008 쬳êéDܽCtarget/at91skyeye_gccfBNgÉu©ê½E_PACKAGE3009 t@Cðp¢ÄÈÕpbP[Wð쬷éêÉÍCÌR}hðÀs· 3010 éD 2908 このコマンドにより,RELEASE/ssp_arch_arm_gcc-<バージョン番号>.tar.gzが 2909 作成される.また,target/at91skyeye_gccディレクトリに置かれたE_PACKAGE 2910 ファイルを用いて簡易パッケージを作成する場合には,次のコマンドを実行す 2911 る. 3011 2912 3012 2913 % utils/makerelease target/cq_starm_gcc/E_PACKAGE 3013 2914 3014 ±ÌR}hÉæèCRELEASE/ssp_cq_starm_gcc_gcc-<o[WÔ>.tar.gz 3015 ªì¬³êéiRELEASEfBNgªÈ¢êÉÍCfBNgªìçê 3016 éjD 3017 3018 ȨCmakerelease[eBeBÍCSSPJ[lÌ\[Xt@Cªu©ê 3019 ½fBNgªCsspÆ¢¤¼ÌÅ é±Æð¼èµÄ¢éiÙÈé¼ÌÌê 3020 ÅàpbP[WÍì¬Å«éªCpbP[WðWJµ½ÉWJ³êéfB 3021 NgªsspÅÈÈéjDܽCWÌtarR}hªGNU tarÅ é±Æ 3022 i³mÉÍCzIvVÉεĢé±ÆjðzèµÄ¢éD 3023 3024 pbP[WLqt@CÉÍCpbP[WÉÜßét@C¼ðCpbP[W 3025 Lqt@Cªu©ê½fBNg©çÌÎpX¼ÅC1sÉ1¸ÂLq 3026 ·éDܽCKvɶÄCȺÌfBNeBuðÜßéD 3027 3028 (a) E_PACKAGE <ÈÕpbP[W¼> 3029 3030 ÈÕpbP[W¼ðwè·éDÈÕpbP[WLqt@CiE_PACKAGEjÌæ 3031 ªÉLq·éDÈÕpbP[W¼ÍCssp_<^[QbgªÌ>Æ·éDá¦ÎC 3032 ^[QbgªÌªcq_starm_gccÌêÉÍCssp_cq_starm_gccÆÈéD 3033 ÊpbP[WÆæÊ·é½ßÉCÈÕpbP[WÌt@C¼ÉÍ"target"ð 3034 ÜßÈ¢D 3035 3036 (b) PACKAGE <ÂÊpbP[W¼> 3037 3038 ÂÊpbP[W¼ðwè·éDÂÊpbP[WLqt@CiMANIFESTjÌæ 3039 ªÉLq·éDܽC»±©çCN[h³êéet@CÌæªÉàLq 3040 µC»êðCN[hµÄ¢éÂÊpbP[W¼ðwè·éD^[QbgË 3041 ¶ÌÂÊpbP[W¼ÍCÂÊpbP[WLqt@Cªu©ê½fBN 3042 gÌÎpXÌ"/"ð"_"Éu«·¦½¶ñðC"ssp_"ÌãÉÂÈ°½à 3043 ÌÆ·éDá¦ÎCÂÊpbP[WLqt@Cªarch/arm_gcc/MANIFESTÌê 3044 ÉÍCssp_arch_arm_gccÆÈéD 3045 3046 (c) VERSION <o[WÔ> 3047 3048 pbP[WÌo[WÔðwè·éDÈÕpbP[WLqt@C¨æÑ 3049 ÂÊpbP[WLqt@CÌÉLq·éDÈÕpbP[Wɨ¢ÄCo[ 3050 WÔðpbP[W»µ½útÆ·éêÉÍCpbP[WÔÌãíè 3051 É%dateÆLq·éD 3052 3053 o[WÔÌt^û@É¢ÄÍCuTOPPERS/SSPJ[l [U[Y} 3054 j 3055 AvÌu2.2 ÈÕpbP[Wv¨æÑu2.3 ÂÊpbP[WvÌßðQ 3056 Æ·é±ÆD 3057 3058 (d) INCLUDE <t@C¼> 3059 3060 ÊÌpbP[WLqt@CðCN[h·éDÈÕpbP[WLqt@C 3061 ©çÍCÂÊpbP[WLqt@CÌÝðCN[h·éÌð´¥Æ· 3062 éDÂÊpbP[WLqt@C©çCN[h³êét@CÅwè³ 3063 êéÂÊpbP[W¼ÍC·×ÄêvµÄ¢È¯êÎÈçÈ¢D 3064 3065 3066 10. t@X 3067 3068 10.1 ^[Qbg˶Ìt@Cê 3069 3070 WIÈ^[Qbg˶Ìt@C\¬ÍÌÊèÅ éD 3071 3072 Makefile.target MakefileÌ^[Qbg˶iQÍjD 3073 3074 target_stddef.h TOPPERS¤Êè`it_stddef.hjÌ^[Qbg˶iR 3075 ÍjDAvP[VÆJ[l̼û©çCN[ 3076 h³êéD 3077 target_sil.h VXeC^tF[XCisil.hjÌ^[QbgË 3078 ¶iSÍjDAvP[VÆJ[l̼û©ç 3079 CN[h³êéD 3080 target_kernel.h J[lAPIikernel.hjÌ^[Qbg˶iTÍjD 3081 AvP[VÆJ[l̼û©çCN[h³ 3082 êéD 3083 3084 target_config.h J[lÀÌ^[Qbg˶Ìwb_t@CiU 3085 ÍjDJ[lÌÝ©çCN[h³êéD 3086 target_config.c J[lÀÌ^[Qbg˶ÌC¾êÅLq³êé 3087 ªiUÍCIvVjD 3088 target_support.S J[lÀÌ^[Qbg˶ÌAZu¾êÅL 3089 q³êéªiUÍCIvVjD 3090 target_rename.def J[lÀÌ^[Qbg˶̽ßÌl[Lq 3091 i6.12ßjD 3092 target_rename.h target_rename.def©ç¶¬³êét@Ci6.12ßjD 3093 target_unrename.h target_rename.def©ç¶¬³êét@Ci6.12ßjD 3094 target_timer.cfg ^C}hCoÌVXeRtBM 3095 [Vt@ 3096 Ci6.13ßjD 3097 target_timer.h ^C}hCoÌwb_t@Ci6.13ßjDJ[l 3098 ÌÝ©çCN[h³êéD 3099 target_timer.c ^C}hCoÌÀt@Ci6.13ßCIvVjD 3100 VXeªÌ.h ^[QbgÌn[hEFA¹iÝnhÔâ 3101 CPUáOnhÔCfoCXWX^ÌÔnÈÇjÌ 3102 è`ðÜÞwb_t@CDAvP[VÆJ[l 3103 ̼û©çCN[h³êéiUÍCIvVjD 3104 3105 target_def.csv RtBM 3106 [^Ìlæ¾V{e[uÌ^[Qb 3107 g˶iVÍCIvVjD 3108 target.tf RtBM 3109 [^ÌpX2Ìev[gt@CÌ 3110 ^[Qbg˶i7.2ßjD 3111 target_check.tf RtBM 3112 [^ÌpX3Ìev[gt@Ci7.3 3113 ßjD 3114 target_cfg1_out.h cfg1_out.cÌNÉKvÈX^uÌè`t@Ci7.4 3115 ßjD 3116 3117 target_syssvc.h VXeT[rXÌ^[Qbg˶è`i8.0ßjD 3118 target_serial.cfg VAhCoÌVXeRtBM 3119 [Vt@ 3120 Ci8.3ßjD 3121 target_serial.h VAhCoÌwb_t@Ci8.3ßjDVA 3122 hCoÌÝ©çCN[h³êéD 3123 target_serial.c VAhCoÌÀt@Ci8.3ßCIvVjD 3124 target_test.h eXgvOÌ^[Qbg˶è`i8.4ßjD 3125 3126 target_user.txt [U[Y}j 3127 Ai9.1ßj 3128 target_design.txt Ývi9.1ßCIvVj 3129 MANIFEST ÂÊpbP[WÉÜßét@CÌXgi9.2ßCIv 3130 Vj 3131 E_PACKAGE ÈÕpbP[WÉÜßét@CÌXgi9.2ßCIv 3132 Vj 3133 3134 Èã 2915 このコマンドにより,RELEASE/ssp_cq_starm_gcc_gcc-<バージョン番号>.tar.gz 2916 が作成される(RELEASEディレクトリがない場合には,ディレクトリが作られ 2917 る). 2918 2919 なお,makereleaseユーティリティは,SSPカーネルのソースファイルが置かれ 2920 たディレクトリが,sspという名称であることを仮定している(異なる名称の場 2921 合でもパッケージは作成できるが,パッケージを展開した時に展開されるディ 2922 レクトリがsspでなくなる).また,標準のtarコマンドがGNU tarであること 2923 (正確には,zオプションに対応していること)を想定している. 2924 2925 パッケージ記述ファイルには,パッケージに含めるファイル名を,パッケージ 2926 記述ファイルが置かれたディレクトリからの相対パス名で,1行に1つずつ記述 2927 する.また,必要に応じて,以下のディレクティブを含める. 2928 2929 (a) E_PACKAGE <簡易パッケージ名> 2930 2931 簡易パッケージ名を指定する.簡易パッケージ記述ファイル(E_PACKAGE)の先 2932 頭に記述する.簡易パッケージ名は,ssp_<ターゲット略称>とする.例えば, 2933 ターゲット略称がcq_starm_gccの場合には,ssp_cq_starm_gccとなる.個 2934 別パッケージと区別するために,簡易パッケージのファイル名には"target"を 2935 含めない. 2936 2937 (b) PACKAGE <個別パッケージ名> 2938 2939 個別パッケージ名を指定する.個別パッケージ記述ファイル(MANIFEST)の先 2940 頭に記述する.また,そこからインクルードされる各ファイルの先頭にも記述 2941 し,それをインクルードしている個別パッケージ名を指定する.ターゲット依 2942 存部の個別パッケージ名は,個別パッケージ記述ファイルが置かれたディレク 2943 トリの相対パス中の"/"を"_"に置き換えた文字列を,"ssp_"の後につなげたも 2944 のとする.例えば,個別パッケージ記述ファイルがarch/arm_gcc/MANIFESTの場 2945 合には,ssp_arch_arm_gccとなる. 2946 2947 (c) VERSION <バージョン番号> 2948 2949 パッケージのバージョン番号を指定する.簡易パッケージ記述ファイルおよび 2950 個別パッケージ記述ファイルの中に記述する.簡易パッケージにおいて,バー 2951 ジョン番号をパッケージ化した日付とする場合には,パッケージ番号の代わり 2952 に%dateと記述する. 2953 2954 バージョン番号の付与方法については,「TOPPERS/SSPカーネル ユーザーズマ 2955 ニュアル」の「2.2 簡易パッケージ」および「2.3 個別パッケージ」の節を参 2956 照すること. 2957 2958 (d) INCLUDE <ファイル名> 2959 2960 別のパッケージ記述ファイルをインクルードする.簡易パッケージ記述ファイ 2961 ルからは,個別パッケージ記述ファイルのみをインクルードするのを原則とす 2962 る.個別パッケージ記述ファイルからインクルードされるファイル中で指定さ 2963 れる個別パッケージ名は,すべて一致していなければならない. 2964 2965 2966 10. リファレンス 2967 2968 10.1 ターゲット依存部のファイル一覧 2969 2970 標準的なターゲット依存部のファイル構成は次の通りである. 2971 2972 Makefile.target Makefileのターゲット依存部(2章). 2973 2974 target_stddef.h TOPPERS共通定義(t_stddef.h)のターゲット依存部(3 2975 章).アプリケーションとカーネルの両方からインクルー 2976 ドされる. 2977 target_sil.h システムインタフェースレイヤ(sil.h)のターゲット依 2978 存部(4章).アプリケーションとカーネルの両方から 2979 インクルードされる. 2980 target_kernel.h カーネルAPI(kernel.h)のターゲット依存部(5章). 2981 アプリケーションとカーネルの両方からインクルードさ 2982 れる. 2983 2984 target_config.h カーネル実装のターゲット依存部のヘッダファイル(6 2985 章).カーネルのみからインクルードされる. 2986 target_config.c カーネル実装のターゲット依存部のC言語で記述される 2987 部分(6章,オプション). 2988 target_support.S カーネル実装のターゲット依存部のアセンブリ言語で記 2989 述される部分(6章,オプション). 2990 target_rename.def カーネル実装のターゲット依存部のためのリネーム記述 2991 (6.12節). 2992 target_rename.h target_rename.defから生成されるファイル(6.12節). 2993 target_unrename.h target_rename.defから生成されるファイル(6.12節). 2994 target_timer.cfg タイマドライバのシステムコンフィギュレーションファ 2995 イル(6.13節). 2996 target_timer.h タイマドライバのヘッダファイル(6.13節).カーネル 2997 のみからインクルードされる. 2998 target_timer.c タイマドライバの実装ファイル(6.13節,オプション). 2999 システム略称.h ターゲットのハードウェア資源(割込みハンドラ番号や 3000 CPU例外ハンドラ番号,デバイスレジスタの番地など)の 3001 定義を含むヘッダファイル.アプリケーションとカーネ 3002 ルの両方からインクルードされる(6章,オプション). 3003 3004 target_def.csv コンフィギュレータの値取得シンボルテーブルのターゲッ 3005 ト依存部(7章,オプション). 3006 target.tf コンフィギュレータのパス2のテンプレートファイルの 3007 ターゲット依存部(7.2節). 3008 target_check.tf コンフィギュレータのパス3のテンプレートファイル(7.3 3009 節). 3010 target_cfg1_out.h cfg1_out.cのリンクに必要なスタブの定義ファイル(7.4 3011 節). 3012 3013 target_syssvc.h システムサービスのターゲット依存定義(8.0節). 3014 target_serial.cfg シリアルドライバのシステムコンフィギュレーションファ 3015 イル(8.3節). 3016 target_serial.h シリアルドライバのヘッダファイル(8.3節).シリアル 3017 ドライバのみからインクルードされる. 3018 target_serial.c シリアルドライバの実装ファイル(8.3節,オプション). 3019 target_test.h テストプログラムのターゲット依存定義(8.4節). 3020 3021 target_user.txt ユーザーズマニュアル(9.1節) 3022 target_design.txt 設計メモ(9.1節,オプション) 3023 MANIFEST 個別パッケージに含めるファイルのリスト(9.2節,オプ 3024 ション) 3025 E_PACKAGE 簡易パッケージに含めるファイルのリスト(9.2節,オプ 3026 ション) 3027 3028 以上 -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.