Changeset 95 for ssp_qb_r5f100le_cs/trunk/doc
- Timestamp:
- Jun 2, 2015, 3:39:53 PM (9 years ago)
- Location:
- ssp_qb_r5f100le_cs/trunk/doc
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
ssp_qb_r5f100le_cs/trunk/doc/configurator.txt
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 1 1 2 TOPPERS/SSPJ[l 3 RtBM 4 [^dl 5 6 Îo[W: Release 1.3.0 7 ÅIXV: 2014N 5 19ú 8 9 ±ÌhL 10 gÍCTOPPERS/SSPJ[lÌRtBM 11 [^ªWIɶ 12 ¬·×«t@CÌàeÉ¢ÄðൽàÌÅ éD^[Qbg˶ɶ¬ 13 ·éàeÉ¢ÄÍC±ÌhL 14 gÌÍÍOÅ éD 2 TOPPERS/SSPカーネル 3 コンフィギュレータ仕様 4 5 対応バージョン: Release 1.3.0 6 最終更新: 2014年 5月 19日 7 8 このドキュメントは,TOPPERS/SSPカーネルのコンフィギュレータが標準的に生 9 成すべきファイルの内容について解説したものである.ターゲット依存に生成 10 する内容については,このドキュメントの範囲外である. 15 11 16 12 ---------------------------------------------------------------------- … … 24 20 Nagoya Municipal Industrial Research Institute, JAPAN 25 21 26 ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 27 Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 28 ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 29 (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 30 \¦C±Ìpð¨æѺL̳ÛØKèªC»ÌÜÜÌ`Å\[ 31 XR[hÉÜÜêÄ¢é±ÆD 32 (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 33 pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 34 gip 35 Ò}j 36 AÈÇjÉCãLÌì \¦C±Ìpð¨æѺL 37 ̳ÛØKèðfÚ·é±ÆD 38 (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 39 pÅ«È¢`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 40 ÆD 41 (a) Äzzɺ¤hL 42 gipÒ}j 43 AÈÇjÉCãLÌ 44 ì \¦C±Ìpð¨æѺL̳ÛØKèðfÚ·é±ÆD 45 (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 46 ñ·é±ÆD 47 (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 48 Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 49 ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 50 RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 51 ÆÓ·é±ÆD 22 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 23 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 24 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 25 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 26 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 27 スコード中に含まれていること. 28 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 29 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 30 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 31 の無保証規定を掲載すること. 32 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 33 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 34 と. 35 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 36 作権表示,この利用条件および下記の無保証規定を掲載すること. 37 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 38 報告すること. 39 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 40 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 41 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 42 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 43 免責すること. 52 44 53 {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨54 æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI55 ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF56 AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»57 ÌÓCðíÈ¢D45 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 46 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 47 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 48 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 49 の責任を負わない. 58 50 59 51 $Id: configurator.txt 659 2015-05-19 09:45:26Z nmir-saito $ 60 52 ---------------------------------------------------------------------- 61 53 62 Ú 63 64 E¶¬·ét@CÌíÞ 65 EÃIAPIê 66 EJ[l\¬Eú»wb_t@Cikernel_cfg.hj 67 (1) Å趬ª 68 (2) IuWFNgÌè` 69 (3) IuWFNgÌIDÔÌè` 70 EJ[l\¬Eú»t@Cikernel_cfg.cj 71 (1) Å趬ª 72 (2) CN[hfBNeBui#includejÌ 73 (3) IuWFNgÌIDÔðÛ·éÏÌè` 74 (4) g[XO}NÌftHgè` 75 (5) eJ[lIuWFNgÉÖ·éè` 76 (5-1) ^XNÉÖ·éè` 77 (5-2) CxgtOÉÖ·éè` 78 (5-3) f[^L 79 [ÉÖ·éè` 80 (5-4) üúnhÉÖ·éè` 81 (5-5) A[nhÉÖ·éè` 82 (6) ÝÉÖ·éè` 83 (6-1) ÝvCÉÖ·éè` 84 (6-2) ÝT[rX[`ÉÖ·éè` 85 (6-3) ÝnhÉÖ·éè` 86 (7) CPUáOÉÖ·éè` 87 (8) ¤LX^bNÌæÉÖ·éè` 88 (9) ^CCxgÇÉÖ·éè` 89 (10)eW 90 [Ìú»ÖÌè` 91 (11)ú»[`ÌÀsÖÌè` 92 (12)I¹[`ÌÀsÖÌè` 93 94 ¶¬·ét@CÌíÞ 95 96 SSPJ[lÌRtBM 97 [^ÍCVXeRtBM 98 [Vt@C 99 ðµÄCJ[l\¬Eú»t@Cikernel_cfg.cjÆ\¬Eú 100 »wb_t@Cikernel_cfg.hj𶬷éDܽCRtBM 101 [^Ì 102 ÌrÉCKvÈÔt@C𶬷éD 103 104 105 ÃIAPIê 106 107 SSPJ[lÌRtBM 108 [^ª·éÃIAPIÍÌÊèD 109 110 (1) ^XNÇ@\ 54 ○目次 55 56 ・生成するファイルの種類 57 ・静的API一覧 58 ・カーネル構成・初期化ヘッダファイル(kernel_cfg.h) 59 (1) 固定生成部分 60 (2) オブジェクト数の定義 61 (3) オブジェクトのID番号の定義 62 ・カーネル構成・初期化ファイル(kernel_cfg.c) 63 (1) 固定生成部分 64 (2) インクルードディレクティブ(#include)の処理 65 (3) オブジェクトのID番号を保持する変数の定義 66 (4) トレースログマクロのデフォルト定義 67 (5) 各カーネルオブジェクトに関する定義 68 (5-1) タスクに関する定義 69 (5-2) イベントフラグに関する定義 70 (5-3) データキューに関する定義 71 (5-4) 周期ハンドラに関する定義 72 (5-5) アラームハンドラに関する定義 73 (6) 割込みに関する定義 74 (6-1) 割込み要求ラインに関する定義 75 (6-2) 割込みサービスルーチンに関する定義 76 (6-3) 割込みハンドラに関する定義 77 (7) CPU例外に関する定義 78 (8) 共有スタック領域に関する定義 79 (9) タイムイベント管理に関する定義 80 (10)各モジュールの初期化関数の定義 81 (11)初期化ルーチンの実行関数の定義 82 (12)終了処理ルーチンの実行関数の定義 83 84 ○生成するファイルの種類 85 86 SSPカーネルのコンフィギュレータは,システムコンフィギュレーションファイ 87 ルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初期 88 化ヘッダファイル(kernel_cfg.h)を生成する.また,コンフィギュレータの 89 処理の途中に,必要な中間ファイルを生成する. 90 91 92 ○静的API一覧 93 94 SSPカーネルのコンフィギュレータが処理する静的APIは次の通り. 95 96 (1) タスク管理機能 111 97 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task, 112 98 PRI itskpri, SIZE stksz, STK_T *stk }) 113 99 DEF_EPR (ID tskid, { PRI exepri }) 114 100 115 (2) ¯úEÊM@\101 (2) 同期・通信機能 116 102 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn }) 117 103 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb }) 118 104 119 ¦ dtqmb ª NULL ÅÈ¢êÍT|[gµÈ¢D 120 121 (3) ÔÇ@\105 ※ dtqmb が NULL でない場合はサポートしない. 106 107 (3) 時間管理機能 122 108 CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr, 123 109 RELTIM cyctim, RELTIM cycphs }) 124 110 CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr }) 125 111 126 (4) ÝÇ@\112 (4) 割込み管理機能 127 113 CFG_INT(INTNO intno, { ATR intatr, PRI intpri }) 128 114 ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri }) 129 115 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr }) 130 116 131 (5) CPU áOÇ@\117 (5) CPU例外管理機能 132 118 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr }) 133 119 134 (6) VXe\¬Ç@\120 (6) システム構成管理機能 135 121 DEF_ICS({ SIZE istksz, STK_T *istk }) 136 122 DEF_STK({ SIZE stksz, STK_T *stk }) … … 138 124 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn }) 139 125 140 ±êçÌÃIAPIÌp[^ÌàCID^Ìp[^ÍIuWFNg¯Ê¼C 141 |C^^iTASKCCYCHDRCALMHDRCISRCINTHDRCEXCHDRCINIRTNCTERRTNC 142 STK_T * j¨æÑ intptr_t ^Ìp[^ÍêÊè®p[^Æ·éD143 »Ì¼Ìp[^ÍC®è®p[^Æ·éD 144 145 146 J[l\¬Eú»wb_t@Cikernel_cfg.hj 147 148 J[l\¬Eú»wb_t@Cikernel_cfg.hjÉÍCÌè`𶬷éD 149 150 (1) Å趬ª151 152 kernel_cfg.h ª¡ñCN[h³êéÌðh®½ßÌLq𶬷éDï153 ÌIÉÍCt@CÌæªÉÌs𶬷éD 126 これらの静的APIのパラメータの内,ID型のパラメータはオブジェクト識別名, 127 ポインタ型(TASK,CYCHDR,ALMHDR,ISR,INTHDR,EXCHDR,INIRTN,TERRTN, 128 STK_T *)および intptr_t 型のパラメータは一般定数式パラメータとする. 129 その他のパラメータは,整数定数式パラメータとする. 130 131 132 ○カーネル構成・初期化ヘッダファイル(kernel_cfg.h) 133 134 カーネル構成・初期化ヘッダファイル(kernel_cfg.h)には,次の定義を生成する. 135 136 (1) 固定生成部分 137 138 kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.具 139 体的には,ファイルの先頭に次の行を生成する. 154 140 155 141 #ifndef TOPPERS_KERNEL_CFG_H 156 142 #define TOPPERS_KERNEL_CFG_H 157 143 158 ܽCt@CÌöÉÌs𶬷éD 144 また,ファイルの末尾に次の行を生成する. 159 145 160 146 #endif /* TOPPERS_KERNEL_CFG_H */ 161 147 162 (2) IuWFNgÌè` 163 164 J[lªT|[g·éIuWFNgÌð}Nè`·évvZbTfB 165 NeBui#definej𶬷éDïÌIÉÍCÌæ¤ÈLq𶬷éD 166 167 #define TNUM_TSKID <^XNÌ> 168 #define TNUM_FLGID <CxgtOÌ> 169 #define TNUM_DTQID <f[^L 170 [Ì> 171 #define TNUM_CYCID <üúnhÌ> 172 #define TNUM_ALMID <A[nhÌ> 173 174 (3) IuWFNgÌIDÔÌè` 175 176 RtBM 177 [^ªIDÔðèt¯½IuWFNg̼OðCèt¯½ 178 IDÔÉ}Nè`·évvZbTfBNeBui#definej𶬷éD 179 á¦ÎCÌæ¤ÈLq𶬷éD 148 (2) オブジェクト数の定義 149 150 カーネルがサポートするオブジェクトの数をマクロ定義するプリプロセッサディ 151 レクティブ(#define)を生成する.具体的には,次のような記述を生成する. 152 153 #define TNUM_TSKID <タスクの数> 154 #define TNUM_FLGID <イベントフラグの数> 155 #define TNUM_DTQID <データキューの数> 156 #define TNUM_CYCID <周期ハンドラの数> 157 #define TNUM_ALMID <アラームハンドラの数> 158 159 (3) オブジェクトのID番号の定義 160 161 コンフィギュレータがID番号を割り付けたオブジェクトの名前を,割り付けた 162 ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する. 163 例えば,次のような記述を生成する. 180 164 181 165 #define TASK1 1 … … 184 168 185 169 ************************************************************************** 186 SSP J[lÌêCCRE_TSK ɨ¯éN®DæxÌ¢ilƵÄͬ³¢j187 ÔÉC1©çA±µ½lªIDÔƵĻê¼êÌ^XNÉèÄçêéD 170 SSPカーネルの場合,CRE_TSK における起動時優先度の高い(値としては小さい) 171 順番に,1から連続した値がID番号としてそれぞれのタスクに割り当てられる. 188 172 ************************************************************************** 189 173 190 174 191 J[l\¬Eú»t@Cikernel_cfg.cj 192 193 (1) Å趬ª194 195 kernel_cfg.c pÌwb_t@CÆID©®t¯Êt@CðCN[h196 ·évvZbTfBNeBui#includej𶬷éDïÌIÉÍC 197 Ìs𶬷éD 175 ○カーネル構成・初期化ファイル(kernel_cfg.c) 176 177 (1) 固定生成部分 178 179 kernel_cfg.c用のヘッダファイルとID自動割付け結果ファイルをインクルード 180 するプリプロセッサディレクティブ(#include)を生成する.具体的には,次 181 の行を生成する. 198 182 199 183 #include "kernel/kernel_int.h" 200 184 #include "kernel_cfg.h" 201 185 202 (2) CN[hfBNeBui#includejÌ 203 204 VXeRtBM 205 [Vt@CÉÜÜêéC¾êvvZbTÌC 206 N[hfBNeBui#includejƯêÌfBNeBui#includej 207 𶬷éDá¦ÎC 186 (2) インクルードディレクティブ(#include)の処理 187 188 システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイ 189 ンクルードディレクティブ(#include)と同一のディレクティブ(#include) 190 を生成する.例えば, 208 191 209 192 #include "sample1.h" 210 193 211 Æ¢¤CN[hfBNeBuÉεÄC 194 というインクルードディレクティブに対して, 212 195 213 196 #include "sample1.h" 214 197 215 Æ¢¤fBNeBu𶬷éD¶¬·éfBNeBuÌÍCVXe 216 RtBM 217 [Vt@CÅÌCN[hfBNeBuÌ 218 Éêv³¹éD 219 220 (3) IuWFNgÌIDÔðÛ·éÏÌè` 221 222 RtBM 223 [^ÉηéIvVwèi--external-idjÉæèCRtB 224 M 225 [^ÍÏ𶬷éDÏ¼Í ID Ôðèt¯½IuWFNg¼ 226 ÌöÉ "_id" ðtÁµ½¼ÌÆ·éDÏÌ^ÍCconst®«ðtÁµ½ID^ 227 ƵCÏÌlÍèt¯½IDÔÆ·éDá¦ÎCÌæ¤ÈLq𶬷éD 198 というディレクティブを生成する.生成するディレクティブの順序は,システ 199 ムコンフィギュレーションファイル中でのインクルードディレクティブの順序 200 に一致させる. 201 202 (3) オブジェクトのID番号を保持する変数の定義 203 204 コンフィギュレータに対するオプション指定(--external-id)により,コンフィ 205 ギュレータは変数を生成する.変数名は ID 番号を割り付けたオブジェクト名 206 の末尾に "_id" を付加した名称とする.変数の型は,const属性を付加したID型 207 とし,変数の値は割り付けたID番号とする.例えば,次のような記述を生成する. 228 208 229 209 const ID TASK1_id = 1; … … 231 211 const ID ALM1_id = 1; 232 212 233 (4) g[XO}NÌftHgè`234 235 kernel_cfg.c ÌÅgp·ég[XO}NÌftHgè`𶬷éD236 ïÌIÉÍCÌs𶬷éD 213 (4) トレースログマクロのデフォルト定義 214 215 kernel_cfg.cの中で使用するトレースログマクロのデフォルト定義を生成する. 216 具体的には,次の行を生成する. 237 217 238 218 #ifndef LOG_ISR_ENTER … … 245 225 246 226 247 (5) eJ[lIuWFNgÉÖ·éè` 248 249 VXeRtBM 250 [Vt@CÉCIuWFNg𶬷éÃI 251 APIuCRE_XXXvªÜÜêéeJ[lIuWFNgÉÖµÄCIuWFNg¶ 252 ¬Ì½ßÌè`𶬷éD 253 254 RtBM 255 [^ÍC¯¶íÞÌIuWFNg𶬷éÃIAPIðWßCe 256 IuWFNgÉIDÔðèt¯éDIDÔÍC¼ÌIuWFNgÌIDÔÆ 257 d¡ªÈCIDÔªA±·éæ¤Éèt¯éD 258 259 RtBM 260 [^ÍCIuWFNgÉèt¯éIDÔðwè·é½ßÌ 261 IvVi--id-input-filejÀÑÉ IDÔðèt¯½IuWFNg̼O 262 ¨æÑèt¯½IDÔÌgðt@CÉoÍ·é½ßÌIvV 263 i--id-output-filejðÂDµ©µCSSPJ[lÅͱêçÌIvVÌ 264 gpð´¥ÆµÄ ***Ö~*** ·éiRÍãqjD 227 (5) 各カーネルオブジェクトに関する定義 228 229 システムコンフィギュレーションファイル中に,オブジェクトを生成する静的 230 API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生 231 成のための定義を生成する. 232 233 コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,各 234 オブジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と 235 重複がなく,ID番号が連続するように割り付ける. 236 237 コンフィギュレータは,オブジェクトに割り付けるID番号を指定するための 238 オプション(--id-input-file)並びに ID番号を割り付けたオブジェクトの名前 239 および割り付けたID番号の組をファイルに出力するためのオプション 240 (--id-output-file)を持つ.しかし,SSPカーネルではこれらのオプションの 241 使用を原則として ***禁止*** する(理由は後述). 265 242 266 243 ************************************************************************** 267 yRz 268 SSPJ[lÌêCu^XNIDÌêÉÀèvRtBM 269 [^Í 270 --id-input-file Ìwèàeð³·éD»êÍCCRE_TSKÅwèµ½N®Dæ 271 xÌÝèlªDæ³êé½ßÅ éDܽC--id-output-file Åwèµ½t@C 272 ÖÌoÍàeà --id-input-file Åwèµ½^XNIDÌlª»ÌÜÜoͳê 273 éD»ÌoÍàeÍ kernel_cfg.h Öoͳêé^XNIDÌlÆͳÖWÅ éD 274 ]ÁÄC¬ª¶¶é°êª é±Æ©çCSSPJ[lÅÍ --id-input-file 275 ¨æÑ --id-output-file IvVðwèµÄÍÈçÈ¢D 276 277 {ÈçÎC--kernel=ssp ¨æÑ --id-input-file ð¯Éwèµ½êÉ 278 RtBM 279 [VG[Ʒ׫ƱëÅ éDµ©µC±êçÌIvV 280 ÉηéÍSÄRtBM 281 [^àÅÀ{³êCev[gt@C 282 (kernel.tf)ÅÍ·é±ÆªÅ«È¢D»_ÅÍRtBM 283 [^ÌÎ 284 É¢ĢèÅ é½ßbèIɱÌæ¤Èµ¢ÆµÄ¢éD 244 【理由】 245 SSPカーネルの場合,「タスクIDの場合に限り」コンフィギュレータは 246 --id-input-file の指定内容を無視する.それは,CRE_TSKで指定した起動時優先 247 度の設定値が優先されるためである.また,--id-output-file で指定したファイ 248 ルへの出力内容も --id-input-file で指定したタスクIDの値がそのまま出力され 249 る.その出力内容は kernel_cfg.h へ出力されるタスクIDの値とは無関係である. 250 従って,混乱が生じる恐れがあることから,SSPカーネルでは --id-input-file 251 および --id-output-file オプションを指定してはならない. 252 253 本来ならば,--kernel=ssp および --id-input-file を同時に指定した場合に 254 コンフィギュレーションエラーとすべきところである.しかし,これらのオプショ 255 ンに対する処理は全てコンフィギュレータ内部で実施され,テンプレートファイル 256 (kernel.tf)では処理することができない.現時点ではコンフィギュレータの対応 257 について未定であるため暫定的にこのような扱いとしている. 285 258 ************************************************************************** 286 259 287 eJ[lIuWFNgÉÖ·éè`ÌWIÈ\¬ÍCÌÊèÅ éDI 288 uWFNgÉæÁÄáOª éêÉÍCIuWFNgÌÅྷéD 289 290 (a) ÅåÌIuWFNgIDÌÏÌè`291 292 ÅåÌIuWFNgIDðÂÏÌè`𶬷éDïÌIÉÍCIuWFN 293 gÌȪLðuXXX^xxxvÆ·éÆCÌæ¤Ès𶬷éD 260 各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ 261 ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する. 262 263 (a) 最大のオブジェクトIDの変数の定義 264 265 最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク 266 トの省略記号を「XXX/xxx」とすると,次のような行を生成する. 294 267 295 268 const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1); 296 269 297 (b) IuWFNgÉKvÈÌæÌè`298 299 IuWFNgÉæÁÄÍCIuWFNgÉKvÈÌæÌè`𶬷éD 300 ïÌIÉÍCIuWFNgÌÅྷéD 301 302 (c) IuWFNgÌú»ubNÌè`303 304 IuWFNgÌú»ubNÌè`𶬷éDïÌIÉÍC 305 EIuWFNgÌȪLðuXXX^xxxv306 E®«ÚÌf[^^ðuYYYv307 E®«Ú̼Ìðuzzzv308 Æ·éÆCIuWFNgÌ®«ÚÉÌæ¤Ès𶬷éD 270 (b) オブジェクトに必要なメモリ領域の定義 271 272 オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する. 273 具体的には,オブジェクト毎の項で説明する. 274 275 (c) オブジェクトの初期化ブロックの定義 276 277 オブジェクトの初期化ブロックの定義を生成する.具体的には, 278 ・オブジェクトの省略記号を「XXX/xxx」 279 ・属性項目のデータ型を「YYY」 280 ・属性項目の名称を「zzz」 281 とすると,オブジェクトの属性項目毎に次のような行を生成する. 309 282 310 283 const YYY _kernel_xxxinib_zzz[TNUM_XXXID] = { 311 < IuWFNgIDª1ÌIuWFNgÉηé zzz Ìú»îñ>,312 < IuWFNgIDª2ÌIuWFNgÉηé zzz Ìú»îñ>,313 cc314 < IuWFNgIDªTNUM_XXXIDÌIuWFNgÉηé zzz Ìú»îñ>,284 <オブジェクトIDが1のオブジェクトに対する zzz の初期化情報>, 285 <オブジェクトIDが2のオブジェクトに対する zzz の初期化情報>, 286 …… 287 <オブジェクトIDがTNUM_XXXIDのオブジェクトに対する zzz の初期化情報>, 315 288 }; 316 289 317 IuWFNgÌú»îñÌ`®ÍCIuWFNg¨æÑ®«ÚÉÙÈéD 318 ïÌIÉÍIuWFNgÌÅྷéD 319 320 (d) IuWFNgÌRg[ubNÌè`321 322 IuWFNgÌRg[ubNÌè`𶬷éDïÌIÉÍC 323 EIuWFNgÌȪLðuXXX^xxxv324 E®«ÚÌf[^^ðuYYYv325 E®«Ú̼Ìðuzzzv326 Æ·éÆCIuWFNgÌ®«ÚÉÌæ¤Ès𶬷éD 290 オブジェクトの初期化情報の形式は,オブジェクトおよび属性項目毎に異なる. 291 具体的にはオブジェクト毎の項で説明する. 292 293 (d) オブジェクトのコントロールブロックの定義 294 295 オブジェクトのコントロールブロックの定義を生成する.具体的には, 296 ・オブジェクトの省略記号を「XXX/xxx」 297 ・属性項目のデータ型を「YYY」 298 ・属性項目の名称を「zzz」 299 とすると,オブジェクトの属性項目毎に次のような行を生成する. 327 300 328 301 YYY _kernel_xxxcb_zzz[TNUM_XXXID]; 329 302 330 IuWFNgÌRg[ubNÌ`®ÍCIuWFNg¨æÑ®«ÚÉÙÈéD 331 ïÌIÉÍIuWFNgÌÅྷéD 332 333 334 (5-1) ^XNÉÖ·éè` 335 336 SSPJ[lÍC^XNªêÂàÈ¢P[XÉεĢȢ½ßC^XNÉÖ·é 337 è`ÍK¸¶¬µÈ¯êÎÈçÈ¢D 338 339 ^XNÌȪLÍuTSKvutskvÅ éD 340 ½¾µC^XNú»ubNÌÏ¼Í _kernel_tinib_<®«Ú¼> Å éD 341 iuTSK^tskvÉã¦ÄuT^tvðp¢Ä¢éjD 342 ^XNRg[ubNͶݵȢD 343 344 ^XNú»ubNÉÍCuCRE_TSKvÃIAPIÅwè³êéîñÉÁ¦ÄC 345 uDEF_EPRvÃIAPIÅwè³êéîñðÜßéD 346 347 ȺÅÍCVXeRtBM 348 [Vt@CÉÌÃIAPIªÜÜêÄ 349 ¢éɶ¬·×«îñÉ¢Äq×éD 303 オブジェクトのコントロールブロックの形式は,オブジェクトおよび属性項目毎に異なる. 304 具体的にはオブジェクト毎の項で説明する. 305 306 307 (5-1) タスクに関する定義 308 309 SSPカーネルは,タスクが一つもないケースに対応していないため,タスクに関する 310 定義は必ず生成しなければならない. 311 312 タスクの省略記号は「TSK」「tsk」である. 313 ただし,タスク初期化ブロックの変数名は _kernel_tinib_<属性項目名> である. 314 (「TSK/tsk」に代えて「T/t」を用いている). 315 タスクコントロールブロックは存在しない. 316 317 タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて, 318 「DEF_EPR」静的APIで指定される情報を含める. 319 320 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて 321 いる時に生成すべき情報について述べる. 350 322 351 323 CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk }); 352 324 DEF_EPR(tskid, { exepri }); 353 325 354 ¦ È~Ìú»îñÌzñÉi[³êéÍCN®DæxÌ¢ÆÈéD 355 ¦ ȺÈçC^XNID ªN®DæxÌ¢ÔÅèÄçêé©çÅ éD 356 357 (5-1-1) ^XNÌú»îñi^XN®«j358 359 ^XN®«Ìú»îñÍCÌ`®Æ·éD 326 ※ 以降の初期化情報の配列に格納される順序は,起動時優先度の高い順となる. 327 ※ なぜなら,タスクID が起動時優先度の高い順番で割り当てられるからである. 328 329 (5-1-1) タスクの初期化情報(タスク属性) 330 331 タスク属性の初期化情報は,次の形式とする. 360 332 361 333 const ATR _kernel_tinib_tskatr[TNUM_TSKID] = {(tskatr)}; 362 334 363 (5-1-2) ^XNÌú»îñig£îñj364 365 ^XNÌg£îñÌú»îñÍCÌ`®Æ·éD 335 (5-1-2) タスクの初期化情報(拡張情報) 336 337 タスクの拡張情報の初期化情報は,次の形式とする. 366 338 367 339 const intptr_t _kernel_tinib_exinf[TNUM_TSKID] = {(intptr_t)(exinf)}; 368 340 369 (5-1-3) ^XNÌú»îñiN®Ônj370 371 ^XNÌN®ÔnÌú»îñÍCÌ`®Æ·éD 341 (5-1-3) タスクの初期化情報(起動番地) 342 343 タスクの起動番地の初期化情報は,次の形式とする. 372 344 373 345 const TASK _kernel_tinib_task[TNUM_TSKID] = {(task)}; 374 346 375 (5-1-4) ^XNÌú»îñiÀsDæxj376 377 ^XNÌÀsDæxÌú»îñÍCÌ`®Æ·éD 378 iÀÛÉÍüs³ê¸C1sÅoͳêéj 347 (5-1-4) タスクの初期化情報(実行時優先度) 348 349 タスクの実行時優先度の初期化情報は,次の形式とする. 350 (実際には改行されず,1行で出力される) 379 351 380 352 const TASK _kernel_tinib_epriority[TNUM_TSKID] = { 381 INT_PRIORITY(ÀsDæx)}; 382 383 ÀsDæxÌlÍ CRE_TSK ÌN®Dæx(itskpri) ¨æÑ 384 DEF_EPR ÌÀsDæx(exepri) ÌÝèlð³ÉZo³êéD 385 Zoû@É¢ÄÍ(5-1-6)Éãq·éD 386 387 (5-1-5) ready_primap ÌúlÌè` 388 389 ^XNÉεÄÍCrbg}bv ready_primap Ìúlîñ𶬷éD 390 ^XN®«ÌÝèl©çêÓÉèßé±ÆªÅ«é©çÅ éD 391 392 ïÌIÉÍȺÌæ¤Èè`𶬷éD 393 394 const uint_t _kernel_init_rdypri = <ready_primapÌúl>; 395 396 ±±Å ready_primap ÌúlÍC^XN®«(tskatr)Ìl©çZo³êéD 397 398 Ï _kernel_init_rdypri ÌerbgÍ»ê¼êÌ^XNÉηéD 399 ^XNIDª1Ì^XNÍźÊrbg(LSB)ÉÎïçêĨèC 400 ^XNIDÌlª1¦éÉ1ÂÊÌrbgª»ê¼êÎïçêéD 401 á¦ÎC^XNIDª4Ì^XNÍźʩç¦Ä4ÔÚÌrbgªÎ·éD 402 403 ^XN®«ÆµÄ TA_ACT ðÂ^XNÍC»Ì^XNÉηérbgª 404 1ÉÈéDTA_ACT ð½È¢êÍηérbgª0ÉÈéD 405 406 (5-1-6) DæxÌ\» 407 408 DæxÌlÍCRtBM 409 [Vt@CÌ CRE_TSK yÑ DEF_EPR ÉÄ 410 wèµ½lð³ÉCRtBM 411 [^ª©®IÉèÄéD 412 lÌÍÍÍ TMIN_TPRI(=1) ©ç TMAX_TPRI ÌÍÍÌlðÆéD 413 414 ܽCRtBM 415 [^ÉæèèÄçêéDæxÌlÆÍÊÉCø¦Ì 416 Ï_©çvOÅgp³êéDæxÌà\»ª éD 417 à\»ÌlÍ 0 ©ç (TMAX_TPRI-TMIN_TPRI) ÌÍÍÌlðÆéD 418 DæxÆ»Ìà\»ÆÌÔÉÍ (à\» = Dæx - TMIN_TPRI)ÌÖWª éD 419 420 ^XNÌN®DæxÍCCRE_TSK Åwèµ½N®DæxÌ¢ÉilƵÄÍ 421 ¬³¢ÉjCTMIN_TPRI(=1) ©çͶÜéA±µ½lªèÄçêéD 422 ÂÜèC^XNÌN®DæxÌlÍ^XNID ɵ¢D 423 424 ^XNÌÀsDæxÌlÍCȺÌû@ÅZo³êéD 425 426 iPjY^XNÉε DEF_EPR ÅÀsDæxðè`µÈ¢ê 427 428 Y^XNÉε DEF_EPR ÅÀsDæxðè`µÈ¢êC 429 N®DæxÌlƯ¶lðÀsDæxÌlÆ·éD 430 431 iQjY^XNÉε DEF_EPR ÅÀsDæxðè`·éê 432 433 Y^XNÉε DEF_EPR ÅÀsDæxðè`µ½êC 434 DEF_EPR Åwèµ½ÀsDæxÌÝèlCÀÑÉCSÄÌ^XNÉηé 435 N®DæxÌÝèl¨æÑRtBM 436 [VÊƵľçêéN®Dæx 437 ÌlðàÆÉCÀsDæxÌlðZo·éD 438 439 ÀsDæxÌlðZo·éû@ÍCuÀsÌ^XNªvGvg³êé/³êÈ¢v 440 Æ¢¤ÖWªÛ¶³êéÍÍÅKØÈlªZo³êé±ÆðÓ}µ½àÌÅC 441 ïÌIÈèÍÌæ¤ÉÈéD 442 443 yÀsDæxÌZoè ¦±êðSÄÌ^XNÉεÄs¤z 444 445 (1) é^XNðIÔ(T1Æ·é) 446 (2) T1 ÌÀsDæxÌÝèlƯ¶CܽÍC»êæèàá¢(lƵÄÍ 447 å«¢)N®DæxÌÝèlðÂ^XNÌWÌÅCN®DæxÌ 448 ÝèlªÅà¢ilƵÄÍÅଳ¢j^XNðT·(T2) 449 (3) T2 ÌN®DæxÌlð T1 ÌÀsDæxÌlÆ·éD 450 451 áj 353 INT_PRIORITY(実行時優先度)}; 354 355 実行時優先度の値は CRE_TSK の起動時優先度(itskpri) および 356 DEF_EPR の実行時優先度(exepri) の設定値を元に算出される. 357 算出方法については(5-1-6)に後述する. 358 359 (5-1-5) ready_primap の初期値の定義 360 361 タスクに対しては,ビットマップ ready_primap の初期値情報を生成する. 362 タスク属性の設定値から一意に定めることができるからである. 363 364 具体的には以下のような定義を生成する. 365 366 const uint_t _kernel_init_rdypri = <ready_primapの初期値>; 367 368 ここで ready_primap の初期値は,タスク属性(tskatr)の値から算出される. 369 370 変数 _kernel_init_rdypri の各ビットはそれぞれのタスクに対応する. 371 タスクIDが1のタスクは最下位ビット(LSB)に対応づけられており, 372 タスクIDの値が1つ増える毎に1つ高位のビットがそれぞれ対応づけられる. 373 例えば,タスクIDが4のタスクは最下位から数えて4番目のビットが対応する. 374 375 タスク属性として TA_ACT を持つタスクは,そのタスクに対応するビットが 376 1になる.TA_ACT を持たない場合は対応するビットが0になる. 377 378 (5-1-6) 優先度の表現 379 380 優先度の値は,コンフィギュレーションファイルの CRE_TSK 及び DEF_EPR にて 381 指定した値を元に,コンフィギュレータが自動的に割り当てる. 382 値の範囲は TMIN_TPRI(=1) から TMAX_TPRI の範囲の値をとる. 383 384 また,コンフィギュレータにより割り当てられる優先度の値とは別に,処理効率の 385 観点からプログラム中で使用される優先度の内部表現がある. 386 内部表現の値は 0 から (TMAX_TPRI-TMIN_TPRI) の範囲の値をとる. 387 優先度とその内部表現との間には (内部表現 = 優先度 - TMIN_TPRI)の関係がある. 388 389 タスクの起動時優先度は,CRE_TSK で指定した起動時優先度の高い順に(値としては 390 小さい順に),TMIN_TPRI(=1) からはじまる連続した値が割り当てられる. 391 つまり,タスクの起動時優先度の値はタスクID に等しい. 392 393 タスクの実行時優先度の値は,以下の方法で算出される. 394 395 (1)当該タスクに対し DEF_EPR で実行時優先度を定義しない場合 396 397 当該タスクに対し DEF_EPR で実行時優先度を定義しない場合, 398 起動時優先度の値と同じ値を実行時優先度の値とする. 399 400 (2)当該タスクに対し DEF_EPR で実行時優先度を定義する場合 401 402 当該タスクに対し DEF_EPR で実行時優先度を定義した場合, 403 DEF_EPR で指定した実行時優先度の設定値,並びに,全てのタスクに対する 404 起動時優先度の設定値およびコンフィギュレーション結果として得られる起動時優先度 405 の値をもとに,実行時優先度の値を算出する. 406 407 実行時優先度の値を算出する方法は,「実行中のタスクがプリエンプトされる/されない」 408 という関係が保存される範囲で適切な値が算出されることを意図したもので, 409 具体的な手順は次のようになる. 410 411 【実行時優先度の算出手順 ※これを全てのタスクに対して行う】 412 413 (1) あるタスクを選ぶ(T1とする) 414 (2) T1 の実行時優先度の設定値と同じ,または,それよりも低い(値としては 415 大きい)起動時優先度の設定値を持つタスクの集合の中で,起動時優先度の 416 設定値が最も高い(値としては最も小さい)タスクを探す(T2) 417 (3) T2 の起動時優先度の値を T1 の実行時優先度の値とする. 418 419 例) 452 420 CRE_TSK(TASK1, { TA_NULL, 1, task1, 2, 10, NULL }); 453 421 CRE_TSK(TASK2, { TA_NULL, 3, task2, 6, 30, NULL }); … … 460 428 DEF_IPR(TASK4, { 4 } ); 461 429 462 ÊÍÌæ¤ÉÈéF 463 464 yN®Dæxz 465 TASK1 FÝèl=2 ¨ (èÄçêé)N®Dæx=1466 TASK2 FÝèl=6 ¨ (èÄçêé)N®Dæx=3467 TASK3 FÝèl=4 ¨ (èÄçêé)N®Dæx=2468 TASK4 FÝèl=8 ¨ (èÄçêé)N®Dæx=4469 470 N®DæxÌ¢ÉÀÑÖ¦éÆ471 TASK1 FÝèl=2 ¨ N®Dæx=1472 TASK3 FÝèl=4 ¨ N®Dæx=2473 TASK2 FÝèl=6 ¨ N®Dæx=3474 TASK4 FÝèl=8 ¨ N®Dæx=4475 476 yÀsDæxz 477 TASK1 FÝèl=1478 TASK3 FÝèl=3479 TASK2 FÝèl=5480 TASK4 FÝèl=4481 482 E½ßµÉ TASK4 ÌêÌÀsDæxÌlðZoµÄÝéD 483 ETASK4 ÌÀsDæxÌÝèl(4)Ư¶Ü½Í»êæèàá¢N®484 @DæxÌÝèlðàÂ^XNÌW= {TASK2,TASK3,TASK4}485 EãL^XNÌWÌÅÅàN®DæxÌÝèlª¢àÌ= TASK3486 EãL^XNÌN®DæxÌl= 2487 E]ÁÄTASK4 ÌÀsDæxÌlÍ2488 489 E¯lÉCTASK3 ÌêÍD 490 ETASK3 ÌÀsDæxÌÝèl(3)Ư¶Ü½Í»êæèàá¢N®491 @DæxÌÝèlðàÂ^XNÌW= {TASK2,TASK3,TASK4}492 EãL^XNÌWÌÅÅàN®DæxÌÝèlª¢àÌ= TASK3493 EãL^XNÌN®DæxÌl= 2494 E]ÁÄTASK3 ÌÀsDæxÌlÍ2495 496 ÀsDæxÉηéú»îñÌ kernel_cfg.c ÖÌÊÍÌæ¤ÉÈéD 497 ÀÛÍ1sÅ\»³êéDܽCzñÖÌi[ÍTASK1, TASK3, TASK2,498 TASK4 ÌÅi[³êé±ÆÉÓ·éD499 ¿ÈÝÉCINT_PRIORITY }NÍDæxÌlð»Ìà\»ÉÏ··é}NÅ 500 èCtask.h Åè`³êÄ¢éD 430 結果は次のようになる: 431 432 【起動時優先度】 433 TASK1:設定値=2 → (割り当てられる)起動時優先度=1 434 TASK2:設定値=6 → (割り当てられる)起動時優先度=3 435 TASK3:設定値=4 → (割り当てられる)起動時優先度=2 436 TASK4:設定値=8 → (割り当てられる)起動時優先度=4 437 438 起動時優先度の高い順に並び替えると 439 TASK1:設定値=2 → 起動時優先度=1 440 TASK3:設定値=4 → 起動時優先度=2 441 TASK2:設定値=6 → 起動時優先度=3 442 TASK4:設定値=8 → 起動時優先度=4 443 444 【実行時優先度】 445 TASK1:設定値=1 446 TASK3:設定値=3 447 TASK2:設定値=5 448 TASK4:設定値=4 449 450 ・ためしに TASK4 の場合の実行時優先度の値を算出してみる. 451 ・TASK4 の実行時優先度の設定値(4)と同じまたはそれよりも低い起動時 452 優先度の設定値をもつタスクの集合 = {TASK2,TASK3,TASK4} 453 ・上記タスクの集合の中で最も起動時優先度の設定値が高いもの = TASK3 454 ・上記タスクの起動時優先度の値 = 2 455 ・従ってTASK4 の実行時優先度の値は 2 456 457 ・同様に,TASK3 の場合は. 458 ・TASK3 の実行時優先度の設定値(3)と同じまたはそれよりも低い起動時 459 優先度の設定値をもつタスクの集合 = {TASK2,TASK3,TASK4} 460 ・上記タスクの集合の中で最も起動時優先度の設定値が高いもの = TASK3 461 ・上記タスクの起動時優先度の値 = 2 462 ・従ってTASK3 の実行時優先度の値は 2 463 464 実行時優先度に対する初期化情報の kernel_cfg.c への結果は次のようになる. 465 実際は1行で表現される.また,配列への格納順序は TASK1, TASK3, TASK2, 466 TASK4 の順序で格納されることに注意する. 467 ちなみに,INT_PRIORITY マクロは優先度の値をその内部表現に変換するマクロで 468 あり,task.h で定義されている. 501 469 502 470 const uint_t _kernel_tinib_epriority[TNUM_TSKID] = 503 471 {INT_PRIORITY(1),INT_PRIORITY(2),INT_PRIORITY(3),INT_PRIORITY(2)}; 504 472 505 (5-1-7) X^bNÌæÝè 506 507 SSPJ[lÅÍC^XNðÜÞSÄÌPʪ¯¶X^bNÌæð¤p·é 508 æ¤ÉÝv³êÄ¢éD 509 ¤p³êéX^bNÌæ̱Æðu¤LX^bNÌævÆÄÔD 510 ¤LX^bNÌæÌè`Í DEF_STK ðp¢Äs¤DÚµÍ(9)ðQÆ̱ÆD 511 512 RtBM 513 [^ͤLX^bNÌæÌÝmÛµC^XNReLXgêpÌ 514 X^bNÌæÍm۵ȢD 515 ±Ì½ßCCRE_TSK ÅÍæªÔn stk ÆµÄ NULL ÌÝó¯t¯éD 516 NULL ÈOÌlðwèµ½êCG[ÆÈéD 517 518 ܽCCRE_TSK Åwè·é^XNÌX^bNTCY stksz ÌlÍC 519 DEF_STK ðp¢È¢êÉͤLX^bNÌæÌTCYðè·é½ßÉp¢çêC 520 DEF_STK ðp¢éêÉÍ DEF_STK Åwèµ½¤LX^bNÌæÌTCYð 521 `FbN·é½ßÉp¢çêéD¦ (9-4) àQÆ̱ÆD 522 523 S^XNÉæéX^bNgpÊiÌèljÍCCRE_TSK Åwè·é 524 X^bNTCY stksz, ¨æÑN®Dæx itskpriCÈçÑÉ DEF_EPR Å 525 wè·éÀsDæx exepri ©çZo³êéDZoèÉ¢ÄÍßÅྷéD 526 527 (5-1-8) S^XNÉæéX^bNgpÊÌZoû@ 528 529 S^XNÌX^bNgpÊÉηévZÌî{IÈl¦ûÍC»ê¼êÌDæx²ÆÉC 530 ¯¶DæxðàÂ^XNÌÅÅàX^bNgpʪ嫢àÌðIÑC»êçÌ 531 X^bNgpÊð·×ÄÁZµ½àÌÆl¦é±ÆÅ éDÀÛÉÍvOÉæè 532 »êæèÈÈéP[Xà¶Ýµ¾éªC»ÝÌÀÅÍl¦ûðP»µÄ¢éD 533 534 SSPJ[lÌdlÅÍCÐÆÂÌN®DæxÉ«o^Â\È^XNÍ 535 XêÂÅ éD»Ì½ßCDEF_EPR ÉæèÀsDæxðÝèµÈ¢êC 536 ·Èí¿CSÄÌ^XNÌÀsDæxª»ê¼êÌN®Dæxɵ¢ 537 êCe^XNÌX^bNgpÊðPÉÁZµ½à̪CS^XNÉæé 538 X^bNgpÊÆÈéD 539 540 »êÉεCDEF_EPR ðp¢ÄÁèÌ^XNÉηéÀsDæxðwèµC 541 Y^XNÀsÌDæxðø«ã°éæ¤ÉÝèµ½êC{ÈçÎv 542 Gvg³êé͸Ìà̪³êÈÈéP[Xª¶¶CÊƵÄS^XNÌ 543 X^bNgpÊðÈÅ«éêª éD 544 545 ÀsDæxðl¶µ½uS^XNÉæéX^bNgpÊvÌZoèÍ 546 Ìæ¤ÉÈéi¦j 547 (a) é^XN©çÀsJnµC¼ÌÇÌæ¤È^XNÉvGvg³êé©C 548 »µÄÊIÉǤ¢¤vOÌÀsoHª¶Ýµ¾é©ðSÄñ·éD 549 (b) »ê¼êÌêÌuS^XNÉæéX^bNgpÊvðßéD 550 (c) ß½lÌÌÅålðIÔD 551 552 ¦ ÀÅÍCsvÈÌȪàsÁÄ¢éªC±±ÅÍî{IÈl¦û 553 ÌÝð¦·D 554 555 ZoèðïÌIÈáðp¢ÄྷéD 556 áƵÄæÌ (5-1-6) Ìáðp¢éD 557 ºÌè (a), (b), (c) ÍãÉ°½eÚÉεĢéD 473 (5-1-7) スタック領域設定 474 475 SSPカーネルでは,タスクを含む全ての処理単位が同じスタック領域を共用する 476 ように設計されている. 477 共用されるスタック領域のことを「共有スタック領域」と呼ぶ. 478 共有スタック領域の定義は DEF_STK を用いて行う.詳しくは(9)を参照のこと. 479 480 コンフィギュレータは共有スタック領域のみ確保し,タスクコンテキスト専用の 481 スタック領域は確保しない. 482 このため,CRE_TSK では先頭番地 stk として NULL のみ受け付ける. 483 NULL 以外の値を指定した場合,エラーとなる. 484 485 また,CRE_TSK で指定するタスクのスタックサイズ stksz の値は, 486 DEF_STK を用いない場合には共有スタック領域のサイズを決定するために用いられ, 487 DEF_STK を用いる場合には DEF_STK で指定した共有スタック領域のサイズを 488 チェックするために用いられる.※ (9-4) も参照のこと. 489 490 全タスクによるスタック使用量(の推定値)は,CRE_TSK で指定する 491 スタックサイズ stksz, および起動時優先度 itskpri,ならびに DEF_EPR で 492 指定する実行時優先度 exepri から算出される.算出手順については次節で説明する. 493 494 (5-1-8) 全タスクによるスタック使用量の算出方法 495 496 全タスクのスタック使用量に対する計算の基本的な考え方は,それぞれの優先度ごとに, 497 同じ優先度をもつタスクの中で最もスタック使用量が大きいものを選び,それらの 498 スタック使用量をすべて加算したものと考えることである.実際にはプログラムにより 499 それより少なくなるケースも存在し得るが,現在の実装では考え方を単純化している. 500 501 SSPカーネルの仕様では,ひとつの起動時優先度につき登録可能なタスクは 502 高々一つである.そのため,DEF_EPR により実行時優先度を設定しない場合, 503 すなわち,全てのタスクの実行時優先度がそれぞれの起動時優先度に等しい 504 場合,各タスクのスタック使用量を単純に加算したものが,全タスクによる 505 スタック使用量となる. 506 507 それに対し,DEF_EPR を用いて特定のタスクに対する実行時優先度を指定し, 508 当該タスク実行中の優先度を引き上げるように設定した場合,本来ならばプリ 509 エンプトされるはずのものがされなくなるケースが生じ,結果として全タスクの 510 スタック使用量を少なくできる場合がある. 511 512 実行時優先度を考慮した「全タスクによるスタック使用量」の算出手順は 513 次のようになる(※) 514 (a) あるタスクから実行開始し,他のどのようなタスクにプリエンプトされるか, 515 そして結果的にどういうプログラムの実行経路が存在し得るかを全て列挙する. 516 (b) それぞれの場合の「全タスクによるスタック使用量」を求める. 517 (c) 求めた値の中の最大値を選ぶ. 518 519 ※ 実装では,不要な処理の省略等も行っているが,ここでは基本的な考え方 520 のみを示す. 521 522 算出手順を具体的な例を用いて説明する. 523 例として先の (5-1-6) の例を用いる. 524 下の手順 (a), (b), (c) は上に挙げた各項目に対応している. 558 525 559 526 CRE_TSK(TASK1, { TA_NULL, 1, task1, 2, 10, NULL }); … … 567 534 DEF_IPR(TASK4, { 4 } ); 568 535 569 (a) é^XN(TASKn, n = 1,2,3,4)ðIð·é. 570 TASKn ÌÀsDæxæèà¢N®Dæx(lƵÄͬ³¢)ðà 571 ^XNÌWðT·D 572 »µÄuvGvg³êé^XN¨vGvg·é^XNvÌgðñ·éD 573 574 ETASK1 É 575 Ú·éÆC±êðvGvgÂ\È^XNͶݵȢD 576 ETASK2 É 577 Ú·éÆCÀsÍDæx 5 ÉÈèC±êðvGvgÂ\È 578 @^XNÍ TASK1 ¨æÑ TASK3D 579 ETASK3 É 580 Ú·éÆCÀsÍDæx 3 ÉÈèC±êðvGvgÂ\È 581 @^XNÍ TASK1 ¾¯D 582 ETASK4 É 583 Ú·éÆCÀsÍDæx 4 ÉÈèC±êðvGvgÂ\È 584 @^XNÍ TASK1 ¾¯D 585 586 µ½ªÁı±ÅÍCÌgª¾çêéD 587 TASK2 ¨ TASK1 588 TASK2 ¨ TASK3 589 TASK3 ¨ TASK1 590 TASK4 ¨ TASK1 591 592 SvGvg³êÈ¢P[XC¨æÑCvGvgµ½^XNª³çÉ 593 ÊÌ^XNÉvGvg³êéP[XÜÅl¶·éÆCÊIÉvOÌ 594 ÀsoHÍÌæ¤ÉÈéÆl¦çêéD 595 596 ETASK1 ©çnÜéP[XF 597 TASK1 (vGvg³ê¸ÉI¹) 598 599 ETASK2 ©çnÜéP[XF 536 (a) あるタスク(TASKn, n = 1,2,3,4)を選択する. 537 TASKn の実行時優先度よりも高い起動時優先度(値としては小さい)をもつ 538 タスクの集合を探す. 539 そして「プリエンプトされるタスク→プリエンプトするタスク」の組を列挙する. 540 541 ・TASK1 に着目すると,これをプリエンプト可能なタスクは存在しない. 542 ・TASK2 に着目すると,実行中は優先度 5 になり,これをプリエンプト可能な 543 タスクは TASK1 および TASK3. 544 ・TASK3 に着目すると,実行中は優先度 3 になり,これをプリエンプト可能な 545 タスクは TASK1 だけ. 546 ・TASK4 に着目すると,実行中は優先度 4 になり,これをプリエンプト可能な 547 タスクは TASK1 だけ. 548 549 したがってここでは,次の組が得られる. 550 TASK2 → TASK1 551 TASK2 → TASK3 552 TASK3 → TASK1 553 TASK4 → TASK1 554 555 全くプリエンプトされないケース,および,プリエンプトしたタスクがさらに 556 別のタスクにプリエンプトされるケースまで考慮すると,結果的にプログラムの 557 実行経路は次のようになると考えられる. 558 559 ・TASK1 から始まるケース: 560 TASK1 (プリエンプトされずに終了) 561 562 ・TASK2 から始まるケース: 600 563 TASK2 601 TASK2 ¨ TASK1 (TASK2©çÀsJnµÄCTASK1ÉvGvg³ê½)602 TASK2 ¨TASK3603 TASK2 ¨ TASK3 ¨TASK1604 605 ETASK3 ©çnÜéP[XF 564 TASK2 → TASK1 (TASK2から実行開始して,TASK1にプリエンプトされた) 565 TASK2 → TASK3 566 TASK2 → TASK3 → TASK1 567 568 ・TASK3 から始まるケース: 606 569 TASK3 607 TASK3 ¨TASK1608 609 ETASK4 ©çnÜéP[XF 570 TASK3 → TASK1 571 572 ・TASK4 から始まるケース: 610 573 TASK4 611 TASK4 ¨ TASK1 612 613 (b) »ê¼êÌP[XÅX^bNgpÊðvZ·éD 614 615 ETASK1 ©çnÜéP[XF 616 TASK1F10 617 618 ETASK2 ©çnÜéP[XF 619 TASK2F30 620 TASK2 ¨ TASK1F30+10 621 TASK2 ¨ TASK3F30+50 622 TASK2 ¨ TASK3 ¨ TASK1F30+50+10 623 624 ETASK3 ©çnÜéP[XF 625 TASK3F50 626 TASK3 ¨ TASK1F50+10 627 628 ETASK4 ©çnÜéP[XF 629 TASK4F100 630 TASK4 ¨ TASK1F100+10 631 632 (c) Åàlªå«ÈéoHðIÔD 633 634 ±±ÅÍ TASK4 ¨ TASK1 ÌêªÅåÅC©ÏàèlÍ 110 635 636 637 (5-1-9) S^XNÉæéX^bNgpÊÌè` 638 639 RtBM 640 [^ÍCS^XNÉæéX^bNgpÊÌ©Ïàèßöð 641 kernel_cfg.c ÉRgƵÄoÍ·éD 574 TASK4 → TASK1 575 576 (b) それぞれのケースでスタック使用量を計算する. 577 578 ・TASK1 から始まるケース: 579 TASK1:10 580 581 ・TASK2 から始まるケース: 582 TASK2:30 583 TASK2 → TASK1:30+10 584 TASK2 → TASK3:30+50 585 TASK2 → TASK3 → TASK1:30+50+10 586 587 ・TASK3 から始まるケース: 588 TASK3:50 589 TASK3 → TASK1:50+10 590 591 ・TASK4 から始まるケース: 592 TASK4:100 593 TASK4 → TASK1:100+10 594 595 (c) 最も値が大きくなる経路を選ぶ. 596 597 ここでは TASK4 → TASK1 の場合が最大で,見積もり値は 110 598 599 600 (5-1-9) 全タスクによるスタック使用量の定義 601 602 コンフィギュレータは,全タスクによるスタック使用量の見積もり過程を 603 kernel_cfg.c にコメントとして出力する. 642 604 643 605 /* 644 606 * Task Stack Size Estimation: 645 607 * 646 i±±ÉZoÌßöªoͳêéj608 (ここに算出の過程が出力される) 647 609 */ 648 610 649 »µÄCÌæ¤Ès𶬷éD 650 651 #define TOPPERS_TSTKSZ <S^XNÉæéX^bNgpÊÌvZl> 652 653 654 (5-1-10) G[ð 655 656 ^XNÉÖ·éG[ðÍÌÊèÅ éD 657 658 RtBM 659 [^{̪o·éàÌ 660 E^XNªêÂà¶ÝµÈ¢êD 661 E¯¶tskidÉηéCRE_TSKª¡ éêiE_OBJj 662 EDEF_EPRÉηéCRE_TSKªÈ¢êiE_NOEXSj 663 E¯¶tskidÉηéDEF_EPRª¡ éêiE_OBJj 664 665 pX2Åo·éàÌ 666 Etskatrªi[[TA_ACT]|[TA_RSTR]jÅÈ¢êiE_RSATRj 667 ¦ ^[Qbg˶Å^XN®«ðÇÁÂiTARGET_TSKATRj 668 E(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)ÅÈ¢êiE_PARj 669 E¯¶ itskpri Éηé CRE_TSK ª¡ éê (E_PAR) 670 Estkszª0©C^[Qbgè`ÌŬliTARGET_MIN_STKSZjæèଳ¢ê 671 @iE_PARj 672 Estk ª NULL ÅÈ¢êiE_PARj 673 E(TMIN_TPRI <= exepri && exepri <= TMAX_TPRI) ÅÈ¢êFE_PAR G[ 674 E(itskpri < exepri && exepri <= TMAX_TPRI) Å éêFE_ILUSEG[ 675 676 pX3Åo·éàÌ 677 Etask ªvOÌJnÔnƵijµÈ¢êiE_PARj 678 - ^[Qbg˶ÌliCHECK_FUNC_ALIGNjÌ{ÅÈ¢ê 679 - NULLÌêi^[Qbg˶CCHECK_FUNC_NONNULLj 680 681 682 (5-2) CxgtOÉÖ·éè` 683 684 CxgtOÌȪLÍuFLG^flgvÅ éDȺÅÍCVXeRtB 685 M 686 [Vt@CÉÌÃIAPIªÜÜêÄ¢éɶ¬·×«îñÉ 687 ¢Äq×éD 611 そして,次のような行を生成する. 612 613 #define TOPPERS_TSTKSZ <全タスクによるスタック使用量の計算値> 614 615 616 (5-1-10) エラー条件 617 618 タスクに関するエラー条件は次の通りである. 619 620 *コンフィギュレータ本体が検出するもの 621 ・タスクが一つも存在しない場合. 622 ・同じtskidに対するCRE_TSKが複数ある場合(E_OBJ) 623 ・DEF_EPRに対応するCRE_TSKがない場合(E_NOEXS) 624 ・同じtskidに対するDEF_EPRが複数ある場合(E_OBJ) 625 626 *パス2で検出するもの 627 ・tskatrが([[TA_ACT]|[TA_RSTR])でない場合(E_RSATR) 628 ※ ターゲット依存部でタスク属性を追加可(TARGET_TSKATR) 629 ・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR) 630 ・同じ itskpri に対する CRE_TSK が複数ある場合 (E_PAR) 631 ・stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場 632 合(E_PAR) 633 ・stk が NULL でない場合(E_PAR) 634 ・(TMIN_TPRI <= exepri && exepri <= TMAX_TPRI) でない場合:E_PAR エラー 635 ・(itskpri < exepri && exepri <= TMAX_TPRI) である場合:E_ILUSEエラー 636 637 *パス3で検出するもの 638 ・task がプログラムの開始番地として正しくない場合(E_PAR) 639 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合 640 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL) 641 642 643 (5-2) イベントフラグに関する定義 644 645 イベントフラグの省略記号は「FLG/flg」である.以下では,システムコンフィ 646 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ 647 いて述べる. 688 648 689 649 CRE_FLG(flgid, { flgatr, iflgptn }); 690 650 691 (5-2-1) CxgtOÌú»îñiCxgtO®«j692 693 CxgtOÌ®«îñÌú»îñÍCÌ`®Æ·éD 651 (5-2-1) イベントフラグの初期化情報(イベントフラグ属性) 652 653 イベントフラグの属性情報の初期化情報は,次の形式とする. 694 654 695 655 const ATR _kernel_flginib_atr[TNUM_FLGID] = {(flgatr)}; 696 656 697 (5-2-2) CxgtOÌú»îñitOp^[úlj698 699 CxgtOÌtOp^[Ìú»îñÍCÌ`®Æ·éD 657 (5-2-2) イベントフラグの初期化情報(フラグパターン初期値) 658 659 イベントフラグのフラグパターンの初期化情報は,次の形式とする. 700 660 701 661 const FLGPTN _kernel_flginib_iflgptn[TNUM_FLGID] = {(iflgptn)}; 702 662 703 (5-2-3) CxgtOÌtOp^[704 705 CxgtOÌtOp^[ði[·ézñÍCȺÌ`®Æ·éD 663 (5-2-3) イベントフラグのフラグパターン 664 665 イベントフラグのフラグパターンを格納する配列は,以下の形式とする. 706 666 707 667 FLGPTN _kernel_flgcb_flgptn[TNUM_FLGID]; 708 668 709 (5-2-4) G[ð 710 711 CxgtOÉÖ·éG[ðÍÌÊèÅ éD 712 713 RtBM 714 [^{̪o·éàÌ 715 E¯¶flgidÉηéCRE_FLGª¡ éêiE_OBJj 716 717 pX2Åo·éàÌ 718 Etskatrªi[[TA_CLR]|[TA_NULL]jÅÈ¢êiE_RSATRj 719 ¦ TA_CLR Æ TA_NULL ð¯Éwèµ½êCTA_CLR ÌÝðwèµ½êƯlÉUé¤ 720 Eiflgptn ªFLGPTN Éi[Å«È¢(iflgptnÌlªFLGPTN^ÌÅålæèàå«¢)êiE_PARj 721 722 723 (5-3) f[^L 724 [ÉÖ·éè` 725 726 f[^L 727 [ÌȪLÍuDTQ^dtqvÅ éDȺÅÍCVXeRtBM 728 729 [Vt@CÉÌÃIAPIªÜÜêÄ¢éɶ¬·×«îñÉ墀 730 q×éD 669 (5-2-4) エラー条件 670 671 イベントフラグに関するエラー条件は次の通りである. 672 673 *コンフィギュレータ本体が検出するもの 674 ・同じflgidに対するCRE_FLGが複数ある場合(E_OBJ) 675 676 *パス2で検出するもの 677 ・tskatrが([[TA_CLR]|[TA_NULL])でない場合(E_RSATR) 678 ※ TA_CLR と TA_NULL を同時に指定した場合,TA_CLR のみを指定した場合と同様に振る舞う 679 ・iflgptn がFLGPTN に格納できない(iflgptnの値がFLGPTN型の最大値よりも大きい)場合(E_PAR) 680 681 682 (5-3) データキューに関する定義 683 684 データキューの省略記号は「DTQ/dtq」である.以下では,システムコンフィギュ 685 レーションファイルに次の静的APIが含まれている時に生成すべき情報について 686 述べる. 731 687 732 688 CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb }); 733 689 734 (5-3-1) f[^L 735 [ÉKvÈÌæÌè` 736 737 f[^L 738 [ÉKvÈÌæƵÄCf[^L 739 [ÇÌæª éD¶¬ 740 ·éf[^L 741 [ÉCKvÈTCYÌf[^L 742 [ÇÌæðè`·éDï 743 ÌIÉÍCãLÌÃIAPIÉεÄCÌè`𶬷éD 744 745 dtqcntª0ÅÈ¢êÌݶ¬ 746 static intptr_t _kernel_dtqmb_<f[^L 747 [¼>[dtqcnt]; 748 749 (5-3-2) f[^L 750 [Ìú»îñ(f[^L 751 [®«) 752 753 f[^L 754 [Ì®«îñÌú»îñÍCÌ`®Æ·éD 690 (5-3-1) データキューに必要なメモリ領域の定義 691 692 データキューに必要なメモリ領域として,データキュー管理領域がある.生成 693 するデータキュー毎に,必要なサイズのデータキュー管理領域を定義する.具 694 体的には,上記の静的APIに対して,次の定義を生成する. 695 696 *dtqcntが0でない場合のみ生成 697 static intptr_t _kernel_dtqmb_<データキュー名>[dtqcnt]; 698 699 (5-3-2) データキューの初期化情報(データキュー属性) 700 701 データキューの属性情報の初期化情報は,次の形式とする. 755 702 756 703 const ATR _kernel_dtqinib_atr[TNUM_DTQID] = {(dtqatr)}; 757 704 758 (5-3-3) f[^L 759 [Ìú»îñ(f[^L 760 [ÇÌæ) 761 762 f[^L 763 [Ìf[^L 764 [ÇÌæÌú»îñÍCÌ`®Æ·éD 765 766 intptr_t * const _kernel_dtqinib_data[TNUM_DTQID] = {(_kernel_dtqmb_<f[^L 767 [¼>)}; 768 769 ¦ SSPJ[lÅÍÒ¿óÔðT|[gµÈ¢½ßC¯úÄoµªÀ»Å«È¢D 770 @»Ì½ß dtqcnt ª 0 ÌêCRtBM 771 [VG[(E_PAR)ÆÈéD 772 773 (5-3-4) f[^L 774 [Ìú»îñ(f[^L 775 [ÌTCY) 776 777 f[^L 778 [ÌTCYÌú»îñÍCÌ`®Æ·éD 705 (5-3-3) データキューの初期化情報(データキュー管理領域) 706 707 データキューのデータキュー管理領域の初期化情報は,次の形式とする. 708 709 intptr_t * const _kernel_dtqinib_data[TNUM_DTQID] = {(_kernel_dtqmb_<データキュー名>)}; 710 711 ※ SSPカーネルでは待ち状態をサポートしないため,同期呼出しが実現できない. 712 そのため dtqcnt が 0 の場合,コンフィギュレーションエラー(E_PAR)となる. 713 714 (5-3-4) データキューの初期化情報(データキューのサイズ) 715 716 データキューのサイズの初期化情報は,次の形式とする. 779 717 780 718 const uint8_t _kernel_dtqinib_size[TNUM_DTQID] = {(dtqcnt)}; 781 719 782 (5-3-5) f[^L 783 [Éi[³êÄ¢évf 784 785 f[^L 786 [Éi[³êÄ¢évfÌzñÍCÌ`®Æ·éD 720 (5-3-5) データキューに格納されている要素数 721 722 データキューに格納されている要素数の配列は,次の形式とする. 787 723 788 724 uint8_t _kernel_dtqcb_count[TNUM_DTQID]; 789 725 790 (5-3-6) f[^L 791 [ÌæªEövf 792 793 f[^L 794 [Éi[³êÄ¢éæªvfEövfði[·ézñÍCÌ`®Æ·éD 726 (5-3-6) データキューの先頭・末尾要素 727 728 データキューに格納されている先頭要素・末尾要素を格納する配列は,次の形式とする. 795 729 796 730 uint8_t _kernel_dtqcb_head[TNUM_DTQID]; 797 731 uint8_t _kernel_dtqcb_tail[TNUM_DTQID]; 798 732 799 (5-3-7) G[ð 800 801 f[^L 802 [ÉÖ·éG[ðÍÌÊèÅ éD 803 804 RtBM 805 [^{̪o·éàÌ 806 E¯¶dtqidÉηéCRE_DTQª¡ éêiE_OBJj 807 808 pX2Åo·éàÌ 809 EdtqatrªimTA_NULLnjÅÈ¢êiE_RSATRj 810 Edtqcntª 0 Ìê (E_PAR) 811 Edtqmb ª NULL ÅÈ¢êiE_NOSPTj 812 813 814 (5-4) üúnhÉÖ·éè` 815 816 üúnhÌȪLÍuCYC^cycvÅ éDȺÅÍCVXeRtB 817 M 818 [Vt@CÉÌÃIAPIªÜÜêÄ¢éɶ¬·×«îñÉ 819 ¢Äq×éD 733 (5-3-7) エラー条件 734 735 データキューに関するエラー条件は次の通りである. 736 737 *コンフィギュレータ本体が検出するもの 738 ・同じdtqidに対するCRE_DTQが複数ある場合(E_OBJ) 739 740 *パス2で検出するもの 741 ・dtqatrが([TA_NULL])でない場合(E_RSATR) 742 ・dtqcntが 0 の場合 (E_PAR) 743 ・dtqmb が NULL でない場合(E_NOSPT) 744 745 746 (5-4) 周期ハンドラに関する定義 747 748 周期ハンドラの省略記号は「CYC/cyc」である.以下では,システムコンフィ 749 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ 750 いて述べる. 820 751 821 752 CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs }); 822 753 823 (5-4-1) üúnhÌú»îñig£îñj824 825 üúnhÌg£îñÌú»îñÍCÌ`®Æ·éD 754 (5-4-1) 周期ハンドラの初期化情報(拡張情報) 755 756 周期ハンドラの拡張情報の初期化情報は,次の形式とする. 826 757 827 758 const intptr_t _kernel_cycinib_exinf[TNUM_CYCID] = {(intptr_t)(exinf)}; 828 759 829 (5-4-2) üúnhÌú»îñiN®Ônj830 831 üúnhÌAhXÌú»îñÍCÌ`®Æ·éD 760 (5-4-2) 周期ハンドラの初期化情報(起動番地) 761 762 周期ハンドラのアドレスの初期化情報は,次の形式とする. 832 763 833 764 const CYCHDR _kernel_cycinib_cychdr[TNUM_CYCID] = {(cycdhr)}; 834 765 835 (5-4-3) üúnhÌú»îñiN®üúj836 837 üúnhÌN®üúÌú»îñÍCÌ`®Æ·éD 766 (5-4-3) 周期ハンドラの初期化情報(起動周期) 767 768 周期ハンドラの起動周期の初期化情報は,次の形式とする. 838 769 839 770 const RELTIM _kernel_cycinib_cyctim[TNUM_CYCID] = {(cyctim)}; 840 771 841 (5-4-4) üúnhÌú»îñiÊj842 843 üúnhÌÊÌú»îñÍCÌ`®Æ·éD 772 (5-4-4) 周期ハンドラの初期化情報(位相) 773 774 周期ハンドラの位相の初期化情報は,次の形式とする. 844 775 845 776 const RELTIM _kernel_cycinib_cycphs[TNUM_CYCID] = {(cycphs)}; 846 777 847 (5-4-5) üúnhÌ®ìóÔ848 849 üúnhÌ®ìóÔði[·éÏÍCÌ`®Æ·éD 778 (5-4-5) 周期ハンドラの動作状態 779 780 周期ハンドラの動作状態を格納する変数は,次の形式とする. 850 781 851 782 uint_t _kernel_cyccb_cycact; 852 783 853 Ï _kernel_cyccb_cycact ÌerbgÍ»ê¼êÌüúnhÉηéD 854 üúnhIDª1Ì^XNÍźÊrbg(LSB)ÉÎïçêĨèC 855 ID Ìlª1¦éÉ1ÂÊÌrbgª»ê¼êÎïçêéD856 á¦ÎCnhIDª4ÌüúnhÍźʩç¦Ä4ÔÚÌrbgª 857 ηéD 858 859 ®ìµÄ¢éóÔÌüúnhÍC»ÌüúnhÉηérbgª 860 1 ÆÈéD®ìµÄ¢È¢óÔÌüúnhÍηérbgª0ÉÈéD861 862 (5-4-6) üúnhÌñN®Ìè`863 864 üúnhÌñN®ði[·éÏÍCÌ`®Æ·éD 784 変数 _kernel_cyccb_cycact の各ビットはそれぞれの周期ハンドラに対応する. 785 周期ハンドラIDが1のタスクは最下位ビット(LSB)に対応づけられており, 786 IDの値が1つ増える毎に1つ高位のビットがそれぞれ対応づけられる. 787 例えば,ハンドラIDが4の周期ハンドラは最下位から数えて4番目のビットが 788 対応する. 789 790 動作している状態の周期ハンドラは,その周期ハンドラに対応するビットが 791 1となる.動作していない状態の周期ハンドラは対応するビットが0になる. 792 793 (5-4-6) 周期ハンドラの次回起動時刻の定義 794 795 周期ハンドラの次回起動時刻を格納する変数は,次の形式とする. 865 796 866 797 EVTTIM _kernel_cyccb_evttim[TNUM_CYCID]; 867 798 868 (5-4-7) ^CCxgL 869 [ÌÌItZbgîñÌè` 870 871 ^CCxgL 872 [ÌÅüúnhpÉèÄçê½ÌæÌæªÊuð 873 ¦·îñðÏÉÛ·éD^CCxgL 874 [ÍzñÅ\»³êĨèC 875 æªÊuÍzñÌ檩çÌItZbgiÂÜèzñÌCfbNXjÆµÄ 876 \»³êéDüúnhÉεÄÍ^CCxgL 877 [zñÌ檩çè 878 Äçêé½ßC±ÌlÍíÉ 0 ÆÈéD]ÁÄÏè`ÍCÌ`®ÆÈéD 799 (5-4-7) タイムイベントキューの中のオフセット情報の定義 800 801 タイムイベントキューの中で周期ハンドラ用に割り当てられた領域の先頭位置を 802 示す情報を変数に保持する.タイムイベントキューは配列で表現されており, 803 先頭位置は配列の先頭からのオフセット(つまり配列のインデックス)として 804 表現される.周期ハンドラに対してはタイムイベントキュー配列の先頭から割り 805 当てられるため,この値は常に 0 となる.従って変数定義は,次の形式となる. 879 806 880 807 const uint_t _kernel_cycevtid_offset = 0; 881 808 882 ^CCxgL 883 [É¢ÄÍ(9-3)ðQÆ̱ÆD 884 885 (5-4-8) G[ð 886 887 üúnhÉÖ·éG[ðÍÌÊèÅ éD 888 889 RtBM 890 [^{̪o·éàÌ 891 E¯¶cycidÉηéCRE_CYCª¡ éêiE_OBJj 892 893 pX2Åo·éàÌ 894 EcycatrªimTA_STAnjÅÈ¢êiE_RSATRj 895 E(0 < cyctim && cyctim <= TMAX_RELTIM)ÅÈ¢êiE_PARj 896 E(0 <= cycphs && cycphs <= TMAX_RELTIM)ÅÈ¢êiE_PARj 897 ExFcycatrÉTA_STAªÝè³êÄ¢ÄC(cycphs == 0)Ìê 898 ECRE_CYC ÌGgª16Âæè½¢ ¦SSPÀè` 899 900 pX3Åo·éàÌ 901 EcychdrªvOÌJnÔnƵijµÈ¢êiE_PARj 902 - ^[Qbg˶ÌliCHECK_FUNC_ALIGNjÌ{ÅÈ¢ê 903 - NULLÌêi^[Qbg˶CCHECK_FUNC_NONNULLj 904 905 (5-5) A[nhÉÖ·éè` 906 907 A[nhÌȪLÍuALM^almvÅ éDȺÅÍCVXeR 908 tBM 909 [Vt@CÉÌÃIAPIªÜÜêÄ¢éɶ¬·×«îñ 910 É¢Äq×éD 809 タイムイベントキューについては(9-3)を参照のこと. 810 811 (5-4-8) エラー条件 812 813 周期ハンドラに関するエラー条件は次の通りである. 814 815 *コンフィギュレータ本体が検出するもの 816 ・同じcycidに対するCRE_CYCが複数ある場合(E_OBJ) 817 818 *パス2で検出するもの 819 ・cycatrが([TA_STA])でない場合(E_RSATR) 820 ・(0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR) 821 ・(0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR) 822 ・警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合 823 ・CRE_CYC のエントリが16個より多い ※SSP実装定義事項 824 825 *パス3で検出するもの 826 ・cychdrがプログラムの開始番地として正しくない場合(E_PAR) 827 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合 828 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL) 829 830 (5-5) アラームハンドラに関する定義 831 832 アラームハンドラの省略記号は「ALM/alm」である.以下では,システムコン 833 フィギュレーションファイルに次の静的APIが含まれている時に生成すべき情報 834 について述べる. 911 835 912 836 CRE_ALM(ID almid, { almatr, (intptr_t)(exinf), almhdr }); 913 837 914 (5-5-1) A[nhÌú»îñig£îñj915 916 A[nhÌg£îñÌú»îñÍCÌ`®Æ·éD 838 (5-5-1) アラームハンドラの初期化情報(拡張情報) 839 840 アラームハンドラの拡張情報の初期化情報は,次の形式とする. 917 841 918 842 const intptr_t _kernel_alminib_exinf[TNUM_ALMID] = {(intptr_t)(exinf)}; 919 843 920 (5-5-2) A[nhÌú»îñiN®Ônj921 922 A[nhÌN®ÔnÌú»îñÍCÌ`®Æ·éD 844 (5-5-2) アラームハンドラの初期化情報(起動番地) 845 846 アラームハンドラの起動番地の初期化情報は,次の形式とする. 923 847 924 848 const ALMHDR _kernel_alminib_almhdr[TNUM_ALMID] = {(almhdr)}; 925 849 926 (5-5-3) A[nhÌ®ìóÔ927 928 A[nhÌ®ìóÔði[·éÏÍCÌ`®Æ·éD 850 (5-5-3) アラームハンドラの動作状態 851 852 アラームハンドラの動作状態を格納する変数は,次の形式とする. 929 853 930 854 uint_t _kernel_almcb_almact; 931 855 932 Ï _kernel_almcb_almact ÌerbgÍÂXÌA[nhÉηéD 933 A[nhIDª1Ì^XNÍźÊrbg(LSB)ÉÎïçêĨèC 934 IDÌlª1¦éÉ1ÂÊÌrbgª»ê¼êÎïçêéD 935 á¦ÎCnhIDª4ÌA[nhÍźʩç¦Ä4ÔÚÌrbgª 936 ηéD 937 938 ®ìµÄ¢éóÔÌA[nhÍC»ÌüúnhÉηérbgª 939 1ÆÈéD®ìµÄ¢È¢óÔÌüúnhÍηérbgª0ÉÈéD 940 941 (5-5-4) ^CCxgL 942 [ÌÌItZbgîñÌè` 943 944 ^CCxgL 945 [ÌÅA[nhpÉèÄçê½ÌæÌæª 946 Êuð¦·îñðÏÉÛ·éD^CCxgL 947 [ÍzñÅ\»³êĨèC 948 æªÊuÍzñÌ檩çÌItZbgiÂÜèzñÌCfbNXjÆµÄ 949 \»³êéDA[nhÉεÄÍüúnhpÌæÌÌvf©ç 950 èÄçêé½ßC±ÌlÍíÉüúnhÌÂɵ¢D 951 Ïè`ÍCÌ`®ÆÈéD 952 953 const uint_t _kernel_almevtid_offset = <üúnhÌÂ>; 954 955 ^CCxgL 956 [É¢ÄÍ(9-3)ðQÆ̱ÆD 957 958 (5-5-5) G[ð 959 960 A[nhÉÖ·éG[ðÍÌÊèÅ éD 961 962 RtBM 963 [^{̪o·éàÌ 964 E¯¶almidÉηéCRE_ALMª¡ éêiE_OBJj 965 966 pX2Åo·éàÌ 967 EalmatrªiTA_NULLjÅÈ¢êiE_RSATRj 968 ECRE_ALM ÌGgª16Âæè½¢ ¦SSPÀè` 969 970 pX3Åo·éàÌ 971 EalmhdrªvOÌJnÔnƵijµÈ¢êiE_PARj 972 - ^[Qbg˶ÌliCHECK_FUNC_ALIGNjÌ{ÅÈ¢ê 973 - NULLÌêi^[Qbg˶CCHECK_FUNC_NONNULLj 974 975 (6) ÝÉÖ·éè` 976 977 ÝÉֵĶ¬·éîñÍC^[QbgÉèßé±ÆªÅ«éD 978 ^[QbgÉèßÈ¢êÉÍCȺÅq×é^[QbgÉ˶µÈ¢WIÈ 979 îñ𶬷éD^[QbgÉèßéêÉÍC(6-1)Æ(6-3)Éq×éîñͶ 980 ¬µÈ¢i(6-2)Éq×éîñͶ¬·éjD 981 982 (6-1) ÝvCÉÖ·éè` 983 984 ÝvCÌ®«ðÝè·éÃIAPIuCFG_INTvÅÝèµ½Ýv 985 CÉÖ·éè`𶬷éDïÌIÉÍÌÊèD 986 987 ȺÅÍCVXeRtBM 988 [Vt@CÉÌÃIAPIªÜÜê 989 Ä¢éɶ¬·×«îñÉ¢Äq×éD 856 変数 _kernel_almcb_almact の各ビットは個々のアラームハンドラに対応する. 857 アラームハンドラIDが1のタスクは最下位ビット(LSB)に対応づけられており, 858 IDの値が1つ増える毎に1つ高位のビットがそれぞれ対応づけられる. 859 例えば,ハンドラIDが4のアラームハンドラは最下位から数えて4番目のビットが 860 対応する. 861 862 動作している状態のアラームハンドラは,その周期ハンドラに対応するビットが 863 1となる.動作していない状態の周期ハンドラは対応するビットが0になる. 864 865 (5-5-4) タイムイベントキューの中のオフセット情報の定義 866 867 タイムイベントキューの中でアラームハンドラ用に割り当てられた領域の先頭 868 位置を示す情報を変数に保持する.タイムイベントキューは配列で表現されており, 869 先頭位置は配列の先頭からのオフセット(つまり配列のインデックス)として 870 表現される.アラームハンドラに対しては周期ハンドラ用領域の次の要素から 871 割り当てられるため,この値は常に周期ハンドラの個数に等しい. 872 変数定義は,次の形式となる. 873 874 const uint_t _kernel_almevtid_offset = <周期ハンドラの個数>; 875 876 タイムイベントキューについては(9-3)を参照のこと. 877 878 (5-5-5) エラー条件 879 880 アラームハンドラに関するエラー条件は次の通りである. 881 882 *コンフィギュレータ本体が検出するもの 883 ・同じalmidに対するCRE_ALMが複数ある場合(E_OBJ) 884 885 *パス2で検出するもの 886 ・almatrが(TA_NULL)でない場合(E_RSATR) 887 ・CRE_ALM のエントリが16個より多い ※SSP実装定義事項 888 889 *パス3で検出するもの 890 ・almhdrがプログラムの開始番地として正しくない場合(E_PAR) 891 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合 892 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL) 893 894 (6) 割込みに関する定義 895 896 割込みに関して生成する情報は,ターゲット毎に定めることができる. 897 ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない標準的な 898 情報を生成する.ターゲット毎に定める場合には,(6-1)と(6-3)に述べる情報は生 899 成しない((6-2)に述べる情報は生成する). 900 901 (6-1) 割込み要求ラインに関する定義 902 903 割込み要求ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求 904 ラインに関する定義を生成する.具体的には次の通り. 905 906 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ 907 ている時に生成すべき情報について述べる. 990 908 991 909 CFG_INT(INTNO intno, { intatr, intpri }); 992 910 993 (6-1-1) Ýè·éÝvCÌ994 995 Ýè·éÝvCÌð}Nè`·évvZbTfBNeB 996 ui#definej𶬷éDܽC»ÌlðÂÏÌè`𶬷éDïÌI 997 ÉÍCÌæ¤Ès𶬷éD 998 999 #define TNUM_INTNO < Ýè·éÝvCÌ>911 (6-1-1) 設定する割込み要求ラインの数 912 913 設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ 914 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的 915 には,次のような行を生成する. 916 917 #define TNUM_INTNO <設定する割込み要求ラインの数> 1000 918 const uint_t _kernel_tnum_intno = TNUM_INTNO; 1001 919 1002 (6-1-2) ÝvCÌú»îñiÝÔj1003 1004 ÝÔÌú»îñÍCÌ`®Æ·éD 920 (6-1-2) 割込み要求ラインの初期化情報(割込み番号) 921 922 割込み番号の初期化情報は,次の形式とする. 1005 923 1006 924 const INTNO _kernel_intinib_intno[TNUM_INTNO] = {(intno)}; 1007 925 1008 (6-1-3) ÝvCÌú»îñiÝvC®«j1009 1010 ÝvC®«Ìú»îñÍCÌ`®Æ·éD 926 (6-1-3) 割込み要求ラインの初期化情報(割込み要求ライン属性) 927 928 割込み要求ライン属性の初期化情報は,次の形式とする. 1011 929 1012 930 const ATR _kernel_intinib_intatr[TNUM_INTNO] = {(intatr)}; 1013 931 1014 (6-1-4) ÝvCÌú»îñiÝvC®«j1015 1016 ÝDæxÌú»îñÍCÌ`®Æ·éD 932 (6-1-4) 割込み要求ラインの初期化情報(割込み要求ライン属性) 933 934 割込み優先度の初期化情報は,次の形式とする. 1017 935 1018 936 const PRI _kernel_intinib_intpri[TNUM_INTNO] = {(intpri)}; 1019 937 1020 (6-1-5) G[ð 1021 1022 ÝvCÉÖ·éG[ðÍÌÊèÅ éD 1023 1024 pX2Åo·éàÌ 1025 Eintno ª CFG_INTÉηéÝÔƵijµÈ¢êiE_PARj 1026 Eintno ª CFG_INTÉæÁÄÝèÏÝÌêiE_OBJj 1027 EintatrªimTA_ENAINTnbmTA_EDGEnjÅÈ¢êiE_RSATRj 1028 ¦ ^[Qbg˶ÅÝ®«ðÇÁÂiTARGET_INTATRj 1029 EJ[lÇÉÅè³êÄ¢é intno ÉεÄCintpriÉTMIN_INTPRI 1030 @æèଳ¢liÂÜèCDæxƵÄÍ¢ljªwè³ê½êiE_OBJj 1031 EJ[lÇOÉÅè³êÄ¢é intno ÉεÄCintpri É TMIN_INTPRI 1032 @Ư¶©Ü½Í»êæèàå«¢liÂÜèCDæxƵÄͯ¶©Ü½Í 1033 @»êæèá¢ljªwè³ê½êiE_OBJj 1034 Eintpri ª CFG_INT ÉηéÝDæxƵijµÈ¢êiE_PARj 1035 1036 KvɶÄ^[Qbg˶Åo·éàÌ 1037 Eintatr ªÝ®«ÆµÄÝèÅ«È¢lÌêiE_RSATRj 1038 Eintpri ªÝDæxƵÄÝèÅ«È¢lÌêiE_PARj 1039 E¯êÌÝDæxµ©ÝèÅ«È¢ÝvCÉεÄCÙÈé 1040 @ÝDæxðÝèµ½êiE_PARj 1041 1042 (6-2) ÝT[rX[`ÉÖ·éè` 1043 1044 (6-2-1) Ýnh̶¬ 1045 1046 VXeRtBM 1047 [Vt@CÉÜÜêéÝT[rX[` 1048 ðÇÁ·éÃIAPIuATT_ISRvÉîëC¯êÌÝÔÉεÄÇÁ³ 1049 ê½ÝT[rX[`ðÉÄÑo·Ö𶬷éD 1050 1051 ïÌIÉÍC¯êÌÝÔÉεÄÝT[rX[`ðÇÁ·é 938 (6-1-5) エラー条件 939 940 割込み要求ラインに関するエラー条件は次の通りである. 941 942 *パス2で検出するもの 943 ・intno が CFG_INTに対する割込み番号として正しくない場合(E_PAR) 944 ・intno が CFG_INTによって設定済みの場合(E_OBJ) 945 ・intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR) 946 ※ ターゲット依存部で割込み属性を追加可(TARGET_INTATR) 947 ・カーネル管理に固定されている intno に対して,intpriにTMIN_INTPRI 948 よりも小さい値(つまり,優先度としては高い値)が指定された場合(E_OBJ) 949 ・カーネル管理外に固定されている intno に対して,intpri に TMIN_INTPRI 950 と同じかまたはそれよりも大きい値(つまり,優先度としては同じかまたは 951 それより低い値)が指定された場合(E_OBJ) 952 ・intpri が CFG_INT に対する割込み優先度として正しくない場合(E_PAR) 953 954 *必要に応じてターゲット依存部で検出するもの 955 ・intatr が割込み属性として設定できない値の場合(E_RSATR) 956 ・intpri が割込み優先度として設定できない値の場合(E_PAR) 957 ・同一の割込み優先度しか設定できない割込み要求ラインに対して,異なる割 958 込み優先度を設定した場合(E_PAR) 959 960 (6-2) 割込みサービスルーチンに関する定義 961 962 (6-2-1) 割込みハンドラの生成 963 964 システムコンフィギュレーションファイル中に含まれる割込みサービスルーチ 965 ンを追加する静的API「ATT_ISR」に基づき,同一の割込み番号に対して追加さ 966 れた割込みサービスルーチンを順に呼び出す関数を生成する. 967 968 具体的には,同一の割込み番号に対して割込みサービスルーチンを追加する 1052 969 1053 970 ATT_ISR({ isratr_1, exinf_1, intno, isr_1, isrpri_1 }); 1054 971 ATT_ISR({ isratr_2, exinf_2, intno, isr_2, isrpri_2 }); 1055 cc972 …… 1056 973 ATT_ISR({ isratr_n, exinf_n, intno, isr_n, isrpri_n }); 1057 974 1058 Æ¢¤ÃIAPIÉεÄCÌæ¤ÈÖ𶬷éD±±ÅCisrpri_1C 1059 isrpri_2CccCisrpri_nÍCl̬³¢ÉÀ×Ö¦çêÄ¢éàÌÆ·éD 1060 lª¯¶àÌÌÔÅÍCVXeRtBM 1061 [Vt@CÅÌÃI 1062 APIÌÌÊèÉÀñÅ¢éàÌÆ·éD 975 という静的APIに対して,次のような関数を生成する.ここで,isrpri_1, 976 isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする. 977 値が同じものの間では,システムコンフィギュレーションファイル中での静的 978 APIの順序の通りに並んでいるものとする. 1063 979 1064 980 static void … … 1070 986 saved_ipm = i_get_ipm(); 1071 987 1072 LOG_ISR_ENTER(<intno>); /* ISR1 ÌÄoµ*/988 LOG_ISR_ENTER(<intno>); /* ISR1の呼出し */ 1073 989 isr_1((intptr_t)(exinf_1)); 1074 990 LOG_ISR_LEAVE(intno); 1075 991 1076 if (i_sense_lock()) { /* ISR ÌÄoµOÌóÔÉß·*/992 if (i_sense_lock()) { /* ISRの呼出し前の状態に戻す */ 1077 993 i_unlock_cpu(); 1078 994 } 1079 995 i_set_ipm(saved_ipm); 1080 996 1081 LOG_ISR_ENTER(<intno>); /* ISR2 ÌÄoµ*/997 LOG_ISR_ENTER(<intno>); /* ISR2の呼出し */ 1082 998 isr_2((intptr_t)(exinf_2)); 1083 999 LOG_ISR_LEAVE(intno); 1084 1000 1085 if (i_sense_lock()) { /* ISR ÌÄoµOÌóÔÉß·*/1001 if (i_sense_lock()) { /* ISRの呼出し前の状態に戻す */ 1086 1002 i_unlock_cpu(); 1087 1003 } 1088 1004 i_set_ipm(saved_ipm); 1089 1005 1090 cc1091 1092 LOG_ISR_ENTER(<intno>); /* ISRn ÌÄoµ*/1006 …… 1007 1008 LOG_ISR_ENTER(<intno>); /* ISRnの呼出し */ 1093 1009 isr_n((intptr_t)(exinf_n)); 1094 1010 LOG_ISR_LEAVE(intno); … … 1097 1013 } 1098 1014 1099 ±±ÅCISRnÌÄoµÌãÉÄoµOÌóÔÉ߳ȢÌÍCÝnh 1100 ©çÌ^[ÉæèCJ[lª³ÌóÔÉß·½ßÅ éD 1101 1102 ¯êÌÝÔÉεÄÇÁ³ê½ÝT[rX[`ª1ÂÌÝÌê 1103 ÉÍCÌæ¤ÈÖ𶬷éD 1015 ここで,ISRnの呼出しの後に呼出し前の状態に戻さないのは,割込みハンドラ 1016 からのリターンにより,カーネルが元の状態に戻すためである. 1017 1018 同一の割込み番号に対して追加された割込みサービスルーチンが1つのみの場合 1019 には,次のような関数を生成する. 1104 1020 1105 1021 static void … … 1113 1029 } 1114 1030 1115 yÛèz±±ÅCLOG_ISR_ENTERCLOG_ISR_LEAVEÌøðǤ·é©ªÛèÆ 1116 µÄcÁÄ¢éDATT_ISRÅo^³ê½ISRÉεÄÍISR IDªt^³êÈ¢½ 1117 ßCIDÅISRðæÊ·é±ÆªÅ«È¢DâÞÈÝÔðnµÄ¢éªC 1118 g£îñiexinfjàn·×«©àµêÈ¢D 1119 1120 (6-2-2) ÝnhÌè`É·é 1121 1122 ãÌæ¤ÉÝnh𶬵½êÉÍCÉྷéÝnh 1123 ÉÖ·éè`ɨ¢ÄCVXeRtBM 1124 [Vt@CÉÌà 1125 IAPIªÜÜêÄ¢éÌƯlÉ·éD 1031 【課題】ここで,LOG_ISR_ENTER,LOG_ISR_LEAVEの引数をどうするかが課題と 1032 して残っている.ATT_ISRで登録されたISRに対してはISR IDが付与されないた 1033 め,IDでISRを区別することができない.やむなく割込み番号を渡しているが, 1034 拡張情報(exinf)も渡すべきかもしれない. 1035 1036 (6-2-2) 割込みハンドラの定義に相当する処理 1037 1038 上のように割込みハンドラを生成した場合には,次に説明する割込みハンドラ 1039 に関する定義において,システムコンフィギュレーションファイル中に次の静 1040 的APIが含まれているのと同様に処理する. 1126 1041 1127 1042 DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> }); 1128 1043 1129 ±±ÅinhnoÍCintnoÉηéÝnhÔÅ éD 1130 1131 (6-2-3) G[ð 1132 1133 ÝT[rX[`ÉÖ·éG[ðÍÌÊèÅ éD 1134 1135 pX2Åo·éàÌ 1136 Eisratr ªiTA_NULLjÅÈ¢êiE_RSATRj 1137 ¦ ^[Qbg˶ÅÝT[rX[`®«ðÇÁÂiTARGET_ISRATRj 1138 Eintno ª ATT_ISR ÉηéÝÔƵijµÈ¢êiE_PARj 1139 ¦ intno Éηé inhno ªÈ¢êðÜÞ 1140 E(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)ÅÈ¢êiE_PARj 1141 Eintno Éηé inhno É뵀 DEF_INH ª éêiE_OBJj 1142 Eintno Éηé CFG_INT ªÈ¢êiE_OBJj 1143 Eintno É뵀 CFG_INT ª¶ÝµC©ÂCCFG_INT ÅÝè³ê½ÝDæxª 1144 @TMIN_INTPRI æèଳ¢iÂÜèCDæxƵÄÍ¢jêiE_OBJj 1145 ¦ J[lÇOÌISRÍT|[gµÈ¢½ß 1146 1147 KvɶÄ^[Qbg˶Åo·éàÌ 1148 EisrªvOÌJnÔnƵijµÈ¢êiE_PARj 1149 1150 (6-3) ÝnhÉÖ·éè` 1151 1152 Ýnhðè`·éÃIAPIuDEF_INHvÅè`µ½Ýnh 1153 iãqÌÝT[rX[`ÌÇÁÉæèRtBM 1154 [^ª¶¬µ½ 1155 ÝnhðÜÞjÉÖ·éè`𶬷éDïÌIÉÍÌÊèD 1156 1157 ȺÅÍCVXeRtBM 1158 [Vt@CÉÌÃIAPIªÜÜê 1159 Ä¢éɶ¬·×«îñÉ¢Äq×éD 1044 ここでinhnoは,intnoに対応する割込みハンドラ番号である. 1045 1046 (6-2-3) エラー条件 1047 1048 割込みサービスルーチンに関するエラー条件は次の通りである. 1049 1050 *パス2で検出するもの 1051 ・isratr が(TA_NULL)でない場合(E_RSATR) 1052 ※ ターゲット依存部で割込みサービスルーチン属性を追加可(TARGET_ISRATR) 1053 ・intno が ATT_ISR に対する割込み番号として正しくない場合(E_PAR) 1054 ※ intno に対応する inhno がない場合を含む 1055 ・(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR) 1056 ・intno に対応する inhno に対して DEF_INH がある場合(E_OBJ) 1057 ・intno に対する CFG_INT がない場合(E_OBJ) 1058 ・intno に対して CFG_INT が存在し,かつ,CFG_INT で設定された割込み優先度が 1059 TMIN_INTPRI よりも小さい(つまり,優先度としては高い)場合(E_OBJ) 1060 ※ カーネル管理外のISRはサポートしないため 1061 1062 *必要に応じてターゲット依存部で検出するもの 1063 ・isrがプログラムの開始番地として正しくない場合(E_PAR) 1064 1065 (6-3) 割込みハンドラに関する定義 1066 1067 割込みハンドラを定義する静的API「DEF_INH」で定義した割込みハンドラ 1068 (上述の割込みサービスルーチンの追加によりコンフィギュレータが生成した 1069 割込みハンドラを含む)に関する定義を生成する.具体的には次の通り. 1070 1071 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ 1072 ている時に生成すべき情報について述べる. 1160 1073 1161 1074 DEF_INH(inhno, { inhatr, inthdr }); 1162 1075 1163 (6-3-1) è`·éÝnhÌ1164 1165 è`·éÝnhÌð}Nè`·évvZbTfBNeBu 1166 i#definej𶬷éDܽC»ÌlðÂÏÌè`𶬷éDïÌI 1167 ÉÍCÌæ¤Ès𶬷éD 1168 1169 #define TNUM_INHNO < è`·éÝnhÌ>1076 (6-3-1) 定義する割込みハンドラの数 1077 1078 定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ 1079 (#define)を生成する.また,その値を持つ変数の定義を生成する.具体的 1080 には,次のような行を生成する. 1081 1082 #define TNUM_INHNO <定義する割込みハンドラの数> 1170 1083 const uint_t _kernel_tnum_inhno = TNUM_INHNO; 1171 1084 1172 (6-3-2) ÝnhÌoüû1173 1174 è`·éÝnhÉCÝnhÌoüû[`𶬷 1175 éDïÌIÉÍCÌæ¤Ès𶬷éD 1085 (6-3-2) 割込みハンドラの出入口処理 1086 1087 定義する割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成す 1088 る.具体的には,次のような行を生成する. 1176 1089 1177 1090 INTHDR_ENTRY(inhno, inhno_num, inthdr) 1178 1091 1179 ±±Åinhno_numÍCinhnoiÝnhÔjðlÅ\»µ½àÌÅC 1180 AZu¾êLqÉgp·é½ßÌàÌÅ éD 1181 1182 (6-3-3) ÝnhÌú»îñiÝnhÔj1183 1184 ÝnhÔÌú»îñÍCÌ`®Æ·éD 1092 ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので, 1093 アセンブリ言語記述に使用するためのものである. 1094 1095 (6-3-3) 割込みハンドラの初期化情報(割込みハンドラ番号) 1096 1097 割込みハンドラ番号の初期化情報は,次の形式とする. 1185 1098 1186 1099 const INHNO _kernel_inhinib_inhno[TNUM_INHNO] = {(inhno)}; 1187 1100 1188 (6-3-4) ÝnhÌú»îñiÝnh®«j1189 1190 Ýnh®«Ìú»îñÍCÌ`®Æ·éD 1101 (6-3-4) 割込みハンドラの初期化情報(割込みハンドラ属性) 1102 1103 割込みハンドラ属性の初期化情報は,次の形式とする. 1191 1104 1192 1105 const ATR _kernel_inhinib_inhatr[TNUM_INHNO] = {(inhatr)}; 1193 1106 1194 (6-3-5) ÝnhÌú»îñiÝnhAhXj1195 1196 ÝnhÌAhXÌú»îñÍCÌ`®Æ·éD 1107 (6-3-5) 割込みハンドラの初期化情報(割込みハンドラアドレス) 1108 1109 割込みハンドラのアドレスの初期化情報は,次の形式とする. 1197 1110 1198 1111 const FP _kernel_inhinib_entry[TNUM_INHNO] = {(inthdr)}; 1199 1112 1200 (6-3-6) G[ð 1201 1202 ÝnhÉÖ·éG[ðÍÌÊèÅ éD 1203 1204 pX2Åo·éàÌ 1205 Einhno ª DEF_INH ÉηéÝnhÔƵijµÈ¢êiE_PARj 1206 Einhno ª DEF_INH ÉæÁÄÝèÏÝÌêiE_OBJj 1207 #Einhno Éηé intno É뵀 ATT_ISR ª éêiE_OBJj 1208 # ¦ inhno Éηé intno ªÈ¢êÉÍC±Ì`FbNðsíÈ¢ 1209 # ¨ ±Ì`FbNÍCÝT[rX[`¤Ås¤ 1210 Einhatr ªiTA_NULLjÅÈ¢êiE_RSATRj 1211 ¦ ^[Qbg˶ÅÝnh®«ðÇÁÂiTARGET_INHATRj 1212 ¦ TA_NONKERNEL ðg¤êÉÍCTARGET_INHATR ÉÝè·é 1213 EJ[lÇÉÅè³êÄ¢é inhno ÉεÄCinhatr É TA_NONKERNEL ª 1214 @wè³êÄ¢éêiE_RSATRj 1215 EJ[lÇOÉÅè³êÄ¢é inhno ÉεÄCinhatr É TA_NONKERNEL ª 1216 @wè³êĢȢêiE_RSATRj 1217 Einhno Éηé intno Éηé CFG_INT ªÈ¢êiE_OBJj 1218 ¦ inhno Éηé intno ªÈ¢êÉÍC±Ì`FbNðsíÈ¢ 1219 Einhatr É TA_NONKERNEL ªwè³êĨç¸Cinhno Éηé intno É뵀 1220 @CFG_INT ÅÝè³ê½ÝDæxª TMIN_INTPRI æèଳ¢êiE_OBJj 1221 ¦ inhno Éηé intno ªÈ¢êÉÍC±Ì`FbNðsíÈ¢ 1222 Einhatr É TA_NONKERNEL ªwè³êĨèCinhno Éηé intno É뵀 1223 @CFG_INT ÅÝè³ê½ÝDæxª TMIN_INTPRI ÈãÅ éêiE_OBJj 1224 ¦ inhno Éηé intno ªÈ¢êÉÍC±Ì`FbNðsíÈ¢ 1225 1226 KvɶÄ^[Qbg˶Åo·éàÌ 1227 EinthdrªvOÌJnÔnƵijµÈ¢êiE_PARj 1228 1229 (7) CPUáOÉÖ·éè` 1230 1231 CPUáOÉֵĶ¬·éîñÍC^[QbgÉèßé±ÆªÅ«éD 1232 ^[QbgÉèßÈ¢êÉÍCȺÅq×é^[QbgÉ˶µÈ¢WIÈ 1233 îñ𶬷éD^[QbgÉèßéêÉÍC±êçÌîñͶ¬³êÈ¢D 1234 1235 VXeRtBM 1236 [Vt@CÉCCPUáOnhðè`·é 1237 ÃIAPIuDEF_EXCvªÜÜêÄ¢éêÉCCPUáOnhÉÖ·éè`ð 1238 ¶¬·éD 1239 1240 ȺÅÍCVXeRtBM 1241 [Vt@CÉÌÃIAPIªÜÜê 1242 Ä¢éɶ¬·×«îñÉ¢Äq×éD 1113 (6-3-6) エラー条件 1114 1115 割込みハンドラに関するエラー条件は次の通りである. 1116 1117 *パス2で検出するもの 1118 ・inhno が DEF_INH に対する割込みハンドラ番号として正しくない場合(E_PAR) 1119 ・inhno が DEF_INH によって設定済みの場合(E_OBJ) 1120 #・inhno に対応する intno に対して ATT_ISR がある場合(E_OBJ) 1121 # ※ inhno に対応する intno がない場合には,このチェックを行わない 1122 # → このチェックは,割込みサービスルーチン側で行う 1123 ・inhatr が(TA_NULL)でない場合(E_RSATR) 1124 ※ ターゲット依存部で割込みハンドラ属性を追加可(TARGET_INHATR) 1125 ※ TA_NONKERNEL を使う場合には,TARGET_INHATR に設定する 1126 ・カーネル管理に固定されている inhno に対して,inhatr に TA_NONKERNEL が 1127 指定されている場合(E_RSATR) 1128 ・カーネル管理外に固定されている inhno に対して,inhatr に TA_NONKERNEL が 1129 指定されていない場合(E_RSATR) 1130 ・inhno に対応する intno に対する CFG_INT がない場合(E_OBJ) 1131 ※ inhno に対応する intno がない場合には,このチェックを行わない 1132 ・inhatr に TA_NONKERNEL が指定されておらず,inhno に対応する intno に対して 1133 CFG_INT で設定された割込み優先度が TMIN_INTPRI よりも小さい場合(E_OBJ) 1134 ※ inhno に対応する intno がない場合には,このチェックを行わない 1135 ・inhatr に TA_NONKERNEL が指定されており,inhno に対応する intno に対して 1136 CFG_INT で設定された割込み優先度が TMIN_INTPRI 以上である場合(E_OBJ) 1137 ※ inhno に対応する intno がない場合には,このチェックを行わない 1138 1139 *必要に応じてターゲット依存部で検出するもの 1140 ・inthdrがプログラムの開始番地として正しくない場合(E_PAR) 1141 1142 (7) CPU例外に関する定義 1143 1144 CPU例外に関して生成する情報は,ターゲット毎に定めることができる. 1145 ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない標準的な 1146 情報を生成する.ターゲット毎に定める場合には,これらの情報は生成されない. 1147 1148 システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する 1149 静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を 1150 生成する. 1151 1152 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ 1153 ている時に生成すべき情報について述べる. 1243 1154 1244 1155 DEF_EXC(excno, { excatr, exchdr }); 1245 1156 1246 (7-1) è`·éCPUáOnhÌ1247 1248 è`·éCPUáOnhÌð}Nè`·évvZbTfBNeB 1249 ui#definej𶬷éDܽC»ÌlðÂÏÌè`𶬷éDïÌ 1250 IÉÍCÌæ¤Ès𶬷éD 1251 1252 #define TNUM_EXCNO < è`·éCPUáOnhÌ>1157 (7-1) 定義するCPU例外ハンドラの数 1158 1159 定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ 1160 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体 1161 的には,次のような行を生成する. 1162 1163 #define TNUM_EXCNO <定義するCPU例外ハンドラの数> 1253 1164 const uint_t _kernel_tnum_excno = TNUM_EXCNO; 1254 1165 1255 (7-2) CPU áOnhÌoüû1256 1257 è`·éCPUáOnhÉCCPUáOnhÌoüû[`𶬠1258 ·éDïÌIÉÍCÌæ¤Ès𶬷éD 1166 (7-2) CPU例外ハンドラの出入口処理 1167 1168 定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生成 1169 する.具体的には,次のような行を生成する. 1259 1170 1260 1171 EXCHDR_ENTRY(excno, excno_num, exchdr) 1261 1172 1262 ±±Åexcno_numÍCexcnoiCPUáOnhÔjðlÅ\»µ½àÌÅC 1263 AZu¾êLqÉgp·é½ßÌàÌÅ éD 1264 1265 (7-3) CPU áOnhÔÌú»îñiCPUáOÔj1266 1267 CPU áOnhÔÌú»îñÍCÌ`®Æ·éD1173 ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので, 1174 アセンブリ言語記述に使用するためのものである. 1175 1176 (7-3) CPU例外ハンドラ番号の初期化情報(CPU例外番号) 1177 1178 CPU例外ハンドラ番号の初期化情報は,次の形式とする. 1268 1179 1269 1180 const EXCNO _kernel_excinib_excno[TNUM_EXCNO] = {(excno)}; 1270 1181 1271 (7-4) CPU áOnhÔÌú»îñiCPUáOnh®«j1272 1273 CPU áOnh®«Ìú»îñÍCÌ`®Æ·éD1182 (7-4) CPU例外ハンドラ番号の初期化情報(CPU例外ハンドラ属性) 1183 1184 CPU例外ハンドラ属性の初期化情報は,次の形式とする. 1274 1185 1275 1186 const ATR _kernel_excinib_excatr[TNUM_EXCNO] = {(excatr)}; 1276 1187 1277 (7-5) CPU áOnhÔÌú»îñiCPUáOnhÌæªÔnj1278 1279 CPU áOnhÌæªÔnÌú»îñÍCÌ`®Æ·éD1188 (7-5) CPU例外ハンドラ番号の初期化情報(CPU例外ハンドラの先頭番地) 1189 1190 CPU例外ハンドラの先頭番地の初期化情報は,次の形式とする. 1280 1191 1281 1192 const FP _kernel_excinib_entry[TNUM_EXCNO] = {(FP)(EXC_ENTRY(excno, exchdr))}; 1282 1193 1283 ±±Å EXC_ENTRY ÍCPUáOnhÔÆCPUáOnhÌæªÔnð³É 1284 CPUáOnhÌüèû̼Ì𶬷é}NÅC^[Qbg˶Š1285 è`³êÄ¢éD 1286 1287 (7-6) G[ð 1288 1289 CPUáOnhÉÖ·éG[ðÍÌÊèÅ éD 1290 1291 pX2Åo·éàÌ 1292 Eexcno ª DEF_EXC Éηé CPU áOnhÔƵijµÈ¢êiE_PARj 1293 Eexcno ª DEF_EXC ÉæÁÄÝèÏÝÌêiE_OBJj 1294 Eexcatr ªiTA_NULLjÅÈ¢êiE_RSATRj 1295 ¦ ^[Qbg˶ÅCPUáOnh®«ðÇÁÂiTARGET_EXCATRj 1296 1297 KvɶÄ^[Qbg˶Åo·éàÌ 1298 EexchdrªvOÌJnÔnƵijµÈ¢êiE_PARj 1299 1300 (8) ñ^XNReLXgpÌX^bNÌæÉÖ·éè` 1301 1302 æÌ (5-1-7) Åàྵ½æ¤ÉCSSPJ[lÅÍCRtBM 1303 [^Í 1304 ¤LX^bNÌæÌÝmÛ·éDµ½ªÁÄCñ^XNReLXgêpÌX^bNÌæÍ 1305 m۵ȢD±Ì½ßCDEF_ICS ÌðÍCñ^XNReLXgªp¢éX^bNÌæÌ 1306 TCYðwè·é±ÆÌÝÆÈéDܽCDEF_ICS ÅÍæªÔn istk ÆµÄ NULL ÌÝ 1307 ó¯t¯éDNULL ÈOÌlðwèµ½êÍG[ÆÈéD 1308 1309 ¦ ¤LX^bNÌæÉÖ·éè`Í (9) ðQÆ·é±ÆD 1310 1311 ȨCñ^XNReLXgpÌX^bNTCYÉÖ·éè`ÍCȺÌæ¤É 1312 DEF_ICS ÌL³É©©íç¸íɶ¬³êéD 1313 1314 (8-1) DEF_ICS ªÈ¢ê 1315 1316 VXeRtBM 1317 [Vt@CÉCÃIAPIuDEF_ICSvªÜÜêÄ 1318 ¢È¢êÉÍCÌs𶬷éD 1194 ここで EXC_ENTRY はCPU例外ハンドラ番号とCPU例外ハンドラの先頭番地を元に 1195 CPU例外ハンドラの入り口処理の名称を生成するマクロで,ターゲット依存部で 1196 定義されている. 1197 1198 (7-6) エラー条件 1199 1200 CPU例外ハンドラに関するエラー条件は次の通りである. 1201 1202 *パス2で検出するもの 1203 ・excno が DEF_EXC に対する CPU 例外ハンドラ番号として正しくない場合(E_PAR) 1204 ・excno が DEF_EXC によって設定済みの場合(E_OBJ) 1205 ・excatr が(TA_NULL)でない場合(E_RSATR) 1206 ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR) 1207 1208 *必要に応じてターゲット依存部で検出するもの 1209 ・exchdrがプログラムの開始番地として正しくない場合(E_PAR) 1210 1211 (8) 非タスクコンテキスト用のスタック領域に関する定義 1212 1213 先の (5-1-7) でも説明したように,SSPカーネルでは,コンフィギュレータは 1214 共有スタック領域のみ確保する.したがって,非タスクコンテキスト専用のスタック領域は 1215 確保しない.このため,DEF_ICS の役割は,非タスクコンテキストが用いるスタック領域の 1216 サイズを指定することのみとなる.また,DEF_ICS では先頭番地 istk として NULL のみ 1217 受け付ける.NULL 以外の値を指定した場合はエラーとなる. 1218 1219 ※ 共有スタック領域に関する定義は (9) を参照すること. 1220 1221 なお,非タスクコンテキスト用のスタックサイズに関する定義は,以下のように 1222 DEF_ICS の有無にかかわらず常に生成される. 1223 1224 (8-1) DEF_ICS がない場合 1225 1226 システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて 1227 いない場合には,次の行を生成する. 1319 1228 1320 1229 #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ 1321 1230 1322 (8-2) DEF_ICS ª éê 1323 1324 ȺÅÍCVXeRtBM 1325 [Vt@CÉÌÃIAPIªÜÜêÄ 1326 ¢éɶ¬·×«îñÉ¢Äq×éD 1231 (8-2) DEF_ICS がある場合 1232 1233 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて 1234 いる時に生成すべき情報について述べる. 1327 1235 1328 1236 DEF_ICS({ istksz, istk }); 1329 1237 1330 DEF_ICS ÅÍ istk ƵÄNULLÌÝwèÂ\Å èCoÍÉÍe¿µÈ¢D1331 ñ^XNReLXgpX^bNÌæÌTCY istksz ÉæèÌs𶬷éD 1238 DEF_ICS では istk としてNULLのみ指定可能であり,出力には影響しない. 1239 非タスクコンテキスト用スタック領域のサイズ istksz により次の行を生成する. 1332 1240 1333 1241 #define TOPPERS_ISTKSZ (istksz) 1334 1242 1335 ¦¤LX^bNÌæÌè`É¢ÄÍ (9) ðQÆ̱ÆD 1336 1337 (8-3) G[ð 1338 1339 ñ^XNReLXgpÌX^bNÌæÉÖ·éG[ðÍÌÊèÅ éD 1340 1341 pX2Åo·éàÌ 1342 EÃIAPIuDEF_ICSvª¡ éiE_OBJj 1343 EistkszªX^bNÌæÌTCYƵijµÈ¢êiE_PARj 1344 - istksz ª 0 Ìê 1345 EistkªX^bNÌæÌæªÔnƵijµÈ¢êiE_PARj 1346 - NULLÈOÌlÌê 1347 1348 KvɶÄ^[Qbg˶Åo·éàÌ 1349 Eistkszª¬³·¬éêiE_PARj 1350 1351 1352 (9) ¤LX^bNÌæÉÖ·éè` 1353 1354 æÌ (5-1-7) ÉÄྵ½æ¤ÉCSSPJ[lÅÍ^XNðÜÞSÄÌPʪ 1355 ¯¶X^bNÌæð¤p·éæ¤ÉÝv³êÄ¢éD»µÄ¤p³êéX^bNÌæÌ 1356 ±Æðu¤LX^bNÌævÆÄÔD 1357 1358 ¤LX^bNÌæÌè`Í DEF_STK ðp¢Äs¤D»µÄCRtBM 1359 [VÅÍ 1360 ¤LX^bNÌæÉÖ·éè`ÍCDEF_STK ÌL³ÉÖíç¸íɶ¬³êéD 1361 1362 ȺÅÍCDEF_STK ÌL³¨æÑ^¦çêéøÌàeÉæèC 1363 ÇÌæ¤É¤LX^bNÌæÌè`ª¶¬³êé©É¢ÄྷéD 1364 1365 (9-1) DEF_STK ªÈ¢êɶ¬³êéè` 1366 1367 VXeRtBM 1368 [Vt@CÉCÃIAPIuDEF_STKvªÜÜêÄ 1369 ¢È¢êÉÍCÌs𶬷éD 1243 ※共有スタック領域の定義については (9) を参照のこと. 1244 1245 (8-3) エラー条件 1246 1247 非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである. 1248 1249 *パス2で検出するもの 1250 ・静的API「DEF_ICS」が複数ある(E_OBJ) 1251 ・istkszがスタック領域のサイズとして正しくない場合(E_PAR) 1252 - istksz が 0 の場合 1253 ・istkがスタック領域の先頭番地として正しくない場合(E_PAR) 1254 - NULL以外の値の場合 1255 1256 *必要に応じてターゲット依存部で検出するもの 1257 ・istkszが小さすぎる場合(E_PAR) 1258 1259 1260 (9) 共有スタック領域に関する定義 1261 1262 先の (5-1-7) にて説明したように,SSPカーネルではタスクを含む全ての処理単位が 1263 同じスタック領域を共用するように設計されている.そして共用されるスタック領域の 1264 ことを「共有スタック領域」と呼ぶ. 1265 1266 共有スタック領域の定義は DEF_STK を用いて行う.そして,コンフィギュレーションでは 1267 共有スタック領域に関する定義は,DEF_STK の有無に関わらず常に生成される. 1268 1269 以下では,DEF_STK の有無および与えられる引数の内容により, 1270 どのように共有スタック領域の定義が生成されるかについて説明する. 1271 1272 (9-1) DEF_STK がない場合に生成される定義 1273 1274 システムコンフィギュレーションファイルに,静的API「DEF_STK」が含まれて 1275 いない場合には,次の行を生成する. 1370 1276 1371 1277 static STK_T _kernel_stack[COUNT_STK_T(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ)]; … … 1373 1279 #define TOPPERS_STKSZ ROUND_STK_T(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ) 1374 1280 1375 (9-2) DEF_STKª éêÉÌݶ¬³êéè` 1376 1377 ȺÅÍCVXeRtBM 1378 [Vt@CÉÌÃIAPIªÜÜêÄ 1379 ¢éɶ¬·×«îñÉ¢Äq×éD 1281 (9-2) DEF_STKがある場合にのみ生成される定義 1282 1283 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて 1284 いる時に生成すべき情報について述べる. 1380 1285 1381 1286 DEF_STK({ stksz, stk }); 1382 1287 1383 (9-2-1) stk ª NULL Ìê1384 1385 stk ª NULL ÌêÉÍCwè³ê½TCY̤LX^bNÌæðmÛµC1386 ¤LX^bNÌæÌú»îñ𶬷éD 1387 ïÌIÉÍCãLÌÃIAPIÉεÄCÌs𶬷éD 1288 (9-2-1) stk が NULL の場合 1289 1290 stk が NULL の場合には,指定されたサイズの共有スタック領域を確保し, 1291 共有スタック領域の初期化情報を生成する. 1292 具体的には,上記の静的APIに対して,次の行を生成する. 1388 1293 1389 1294 static STK_T _kernel_stack[COUNT_STK_T(stksz)]; … … 1391 1296 #define TOPPERS_STKSZ ROUND_STK_T(stksz) 1392 1297 1393 (9-2-2) stk ª NULL ÈOÌê1394 1395 stk ª NULL ÅÈ¢êÉÍC¤LX^bNÌæÌú»îñðCÌ`®Å¶¬·éD1298 (9-2-2) stk が NULL 以外の場合 1299 1300 stk が NULL でない場合には,共有スタック領域の初期化情報を,次の形式で生成する. 1396 1301 1397 1302 #define TOPPERS_STK (stk) 1398 1303 #define TOPPERS_STKSZ (stksz) 1399 1304 1400 (9-3) DEF_STK ÌL³ÉÖWÈCíɶ¬³êéè`1401 1402 DEF_STK ÌL³Éæç¸CÌè`𶬷éD1305 (9-3) DEF_STK の有無に関係なく,常に生成される定義 1306 1307 DEF_STKの有無によらず,次の定義を生成する. 1403 1308 1404 1309 const SIZE _kernel_stksz = TOPPERS_STKSZ; … … 1409 1314 #endif /* TOPPERS_ISTKPT */ 1410 1315 1411 (9-4) G[ð 1412 1413 ¤LX^bNÌæÉÖ·éG[ðÍÌÊèÅ éD 1414 1415 pX2Åo·éàÌ 1416 EÃIAPIuDEF_STKvª¡ éiE_OBJj 1417 EstkszªX^bNÌæÌTCYƵijµÈ¢êiE_PARj 1418 - stksz ÆµÄ 0 ðwèµ½ê 1419 - ^[Qbg˶ÌliCHECK_STKSZ_ALIGNjÌ{ÅÈ¢ê 1420 ¦ ±ÌG[`FbNÍCstk ª NULL ÅÈ¢êÉÌÝs¤ 1421 ExFstksz ªC(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ) æèଳ¢ê 1422 ¦ DEF_STK ª¶ÝµCstk ªñNULLÌêD 1423 ¦ }NÌlÉ¢ÄÍ (5-1-9), (8-1), (8-2) ðQÆÌ±Æ 1424 1425 pX3Åo·éàÌ 1426 EstkªX^bNÌæÌæªÔnƵijµÈ¢êiE_PARj 1427 - ^[Qbg˶ÌliCHECK_STACK_ALIGNjÌ{ÅÈ¢ê 1428 - NULLÌêi^[Qbg˶CCHECK_STACK_NONNULLj 1429 1430 (10) ^CCxgÇÉÖ·éè` 1431 1432 ^CCxgÇÉÖAµÄCÌè`𶬷éD 1433 1434 (10-1) ^CCxgnhÌ 1435 1436 ¶¬³ê½^CCxgnhÌð}Nè`·évvZbT 1437 fBNeCu(#define) 𶬷éD 1438 1439 SSPJ[lÅÍ^CCxgnhƵÄüúnh¨æÑA[ 1440 nhÌÝðT|[g·éD»Ì½ßCCRE_CYC ¨æÑ CRE_ALM Ìvª 1441 ^CCxgnhÆÈéD 1442 1443 ïÌIÉÍCÌæ¤ÈLq𶬷éD 1444 1445 #define TNUM_TMEVT <^CCxgnhÌÂ> 1446 1447 (10-2) ^CCxgubNÌTCYÌè` 1448 1449 ^CCxgubNÌvfðè`·éÏ𶬷éD 1450 ^CCxgubNÌvfÍ^CCxgnhÌɵ¢D 1451 1452 ïÌIÉÍCÌæ¤ÈLq𶬷éD 1453 1454 const uint_t _kernel_tmevt_queue = <^CCxgnhÌÂ>; 1455 1456 (10-3) ^CCxgL 1457 [Ìè` 1458 1459 ^CCxgÇ̽ßÌL 1460 [𶬷éDL 1461 [ÍzñƵÄÀ³êÄ 1462 ¢éDL 1463 [Ìæªð\»·é½ßÌzñvfðmÛ·é½ßCzñÌvfÍ 1464 u^CCxgnhÌÂ{1vÆÈéD 1465 1466 ïÌIÉÍCÌæ¤ÈLq𶬷éD 1316 (9-4) エラー条件 1317 1318 共有スタック領域に関するエラー条件は次の通りである. 1319 1320 *パス2で検出するもの 1321 ・静的API「DEF_STK」が複数ある(E_OBJ) 1322 ・stkszがスタック領域のサイズとして正しくない場合(E_PAR) 1323 - stksz として 0 を指定した場合 1324 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合 1325 ※ このエラーチェックは,stk が NULL でない場合にのみ行う 1326 ・警告:stksz が,(TOPPERS_TSTKSZ+TOPPERS_ISTKSZ) よりも小さい場合 1327 ※ DEF_STK が存在し,stk が非NULLの場合. 1328 ※ マクロの値については (5-1-9), (8-1), (8-2) を参照のこと 1329 1330 *パス3で検出するもの 1331 ・stkがスタック領域の先頭番地として正しくない場合(E_PAR) 1332 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合 1333 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL) 1334 1335 (10) タイムイベント管理に関する定義 1336 1337 タイムイベント管理に関連して,次の定義を生成する. 1338 1339 (10-1) タイムイベントハンドラの数 1340 1341 生成されたタイムイベントハンドラの数をマクロ定義するプリプロセッサ 1342 ディレクテイブ(#define) を生成する. 1343 1344 SSPカーネルではタイムイベントハンドラとして周期ハンドラおよびアラーム 1345 ハンドラのみをサポートする.そのため,CRE_CYC および CRE_ALM の合計が 1346 タイムイベントハンドラ数となる. 1347 1348 具体的には,次のような記述を生成する. 1349 1350 #define TNUM_TMEVT <タイムイベントハンドラの個数> 1351 1352 (10-2) タイムイベントブロックのサイズの定義 1353 1354 タイムイベントブロックの要素数を定義する変数を生成する. 1355 タイムイベントブロックの要素数はタイムイベントハンドラの数に等しい. 1356 1357 具体的には,次のような記述を生成する. 1358 1359 const uint_t _kernel_tmevt_queue = <タイムイベントハンドラの個数>; 1360 1361 (10-3) タイムイベントキューの定義 1362 1363 タイムイベント管理のためのキューを生成する.キューは配列として実装されて 1364 いる.キューの先頭を表現するための配列要素を確保するため,配列の要素数は 1365 「タイムイベントハンドラの個数+1」となる. 1366 1367 具体的には,次のような記述を生成する. 1467 1368 1468 1369 extern QUEUE tmevt_queue[TNUM_TMEVT+1]; 1469 1370 1470 (10-4) ^CCxgÔÌè`1471 1472 ^CCxgnhÌN®ði[·éÏÍCÌ`®Æ·éD 1371 (10-4) タイムイベント時間の定義 1372 1373 タイムイベントハンドラの起動時刻を格納する変数は,次の形式とする. 1473 1374 1474 1375 extern EVTTIM tmevt_time[TNUM_TMEVT]; 1475 1376 1476 (10-5) ^CCxgÌR[obNÌè`1477 1478 ^CCxgnhÌR[obNÖði[·éÏÍC 1479 Ì`®Æ·éD 1377 (10-5) タイムイベントのコールバックの定義 1378 1379 タイムイベントハンドラのコールバック関数を格納する変数は, 1380 次の形式とする. 1480 1381 1481 1382 extern CBACK tmevt_callback[TNUM_TMEVT]; 1482 1383 1483 (10-6) ^CCxgR[obNÌøÌè`1484 1485 ^CCxgnhÌR[obNÖÌøði[·éÏÍC 1486 Ì`®Æ·éD 1384 (10-6) タイムイベントコールバックの引数の定義 1385 1386 タイムイベントハンドラのコールバック関数の引数を格納する変数は, 1387 次の形式とする. 1487 1388 1488 1389 extern uintptr_t tmevt_arg[TNUM_TMEVT]; 1489 1390 1490 (11) eW 1491 [Ìú»ÖÌè` 1492 1493 eJ[lIuWFNgÌÇCÝÇCCPUáOnhÇÌe@\ð 1494 ú»ÖðÉÄÑo·Öi_kernel_initialize_objectj𶬷éD 1495 Ì3ÂÌú»Öð¢ÄÍCgpµÈ¢@\Ìú»ÖÍÄÑo³È¢D 1391 (11) 各モジュールの初期化関数の定義 1392 1393 各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を 1394 初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次 1395 の3つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない. 1496 1396 1497 1397 _kernel_initialize_task(); … … 1499 1399 _kernel_initialize_exception 1500 1400 1501 ܽÌú»ÖÉ¢ÄÍCüúnhܽÍA[nhðgp·é 1502 êÉÌÝÄÑo³êéD 1401 また次の初期化関数については,周期ハンドラまたはアラームハンドラを使用する 1402 場合にのみ呼び出される. 1503 1403 _kernel_initialize_time_event(); 1504 1404 1505 ·×ÄÌ@\ðgÁ½êɶ¬³êéÖÍÌÊèÅ éD 1405 すべての機能を使った場合に生成される関数は次の通りである. 1506 1406 1507 1407 void … … 1518 1418 1519 1419 1520 (12) ú»[`ÌÀsÖÌè` 1521 1522 VXeRtBM 1523 [Vt@CÉÜÜêéú»[`ðÇÁ 1524 ·éÃIAPIuATT_INIvÉεÄCÇÁµ½ú»[`ðÉÄÑo·Ö 1525 𶬷éDïÌIÉÍC 1420 (12) 初期化ルーチンの実行関数の定義 1421 1422 システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加 1423 する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関 1424 数を生成する.具体的には, 1526 1425 1527 1426 ATT_INI({ iniatr, exinf, inirtn }); 1528 1427 1529 Æ¢¤ÃIAPIÉεÄC 1428 という静的APIに対して, 1530 1429 1531 1430 (inirtn)((intptr_t)(exinf)); 1532 1431 1533 ðÄÑo·ÖðC_kernel_call_inirtnÆ¢¤¼OŶ¬·éDú»[` 1534 ðÄÑo·ÍCVXeRtBM 1535 [Vt@CÅÌÃI 1536 APIÌÉêv³¹éD 1537 1538 á¦ÎC 1432 を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ 1433 ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的 1434 APIの順序に一致させる. 1435 1436 例えば, 1539 1437 1540 1438 ATT_INI({ TA_NULL, 0, timer_initialize }); 1541 1439 ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize }); 1542 1440 1543 Æ¢¤2ÂÌÃIAPIª±ÌÅLq³ê½É¶¬·éÖÍÌÊèÅ 1544 éD 1441 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ 1442 る. 1545 1443 1546 1444 void … … 1551 1449 } 1552 1450 1553 (12-1) G[ð 1554 1555 ú»[`ÉÖ·éG[ðÍÌÊèÅ éD 1556 1557 pX2Åo·éàÌ 1558 EiniatrªiTA_NULLjÅÈ¢êiE_RSATRj 1559 1560 KvɶÄ^[Qbg˶Åo·éàÌ 1561 EinirtnªvOÌJnÔnƵijµÈ¢êiE_PARj 1562 1563 (13) I¹[`ÌÀsÖÌè` 1564 1565 VXeRtBM 1566 [Vt@CÉÜÜêéI¹[`ðÇ 1567 Á·éÃIAPIuATT_TERvÉεÄCÇÁµ½I¹[`ðÉÄÑo 1568 ·Ö𶬷éDïÌIÉÍC 1451 (12-1) エラー条件 1452 1453 初期化ルーチンに関するエラー条件は次の通りである. 1454 1455 *パス2で検出するもの 1456 ・iniatrが(TA_NULL)でない場合(E_RSATR) 1457 1458 *必要に応じてターゲット依存部で検出するもの 1459 ・inirtnがプログラムの開始番地として正しくない場合(E_PAR) 1460 1461 (13) 終了処理ルーチンの実行関数の定義 1462 1463 システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追 1464 加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出 1465 す関数を生成する.具体的には, 1569 1466 1570 1467 ATT_TER({ teratr, exinf, terrtn }); 1571 1468 1572 Æ¢¤ÃIAPIÉεÄC 1469 という静的APIに対して, 1573 1470 1574 1471 (terrtn)((intptr_t)(exinf)); 1575 1472 1576 ðÄÑo·ÖðC_kernel_call_terrtnÆ¢¤¼OŶ¬·éDI¹[ 1577 `ðÄÑo·ÍCVXeRtBM 1578 [Vt@CÅÌÃI 1579 APIÌtÉêv³¹éD 1580 1581 á¦ÎC 1473 を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー 1474 チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的 1475 APIの逆順に一致させる. 1476 1477 例えば, 1582 1478 1583 1479 ATT_TER({ TA_NULL, 0, timer_terminate }); 1584 1480 ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate }); 1585 1481 1586 Æ¢¤2ÂÌÃIAPIª±ÌÅLq³ê½É¶¬·éÖÍÌÊèÅ 1587 éD 1482 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ 1483 る. 1588 1484 1589 1485 void … … 1594 1490 } 1595 1491 1596 (13-1) G[ð1597 1598 I¹[`ÉÖ·éG[ðÍÌÊèÅ éD 1599 1600 pX2Åo·éàÌ 1601 EteratrªiTA_NULLjÅÈ¢êiE_RSATRj 1602 1603 KvɶÄ^[Qbg˶Åo·éàÌ 1604 EterrtnªvOÌJnÔnƵijµÈ¢êiE_PARj 1605 1606 Èã 1492 (13-1) エラー条件 1493 1494 終了処理ルーチンに関するエラー条件は次の通りである. 1495 1496 *パス2で検出するもの 1497 ・teratrが(TA_NULL)でない場合(E_RSATR) 1498 1499 *必要に応じてターゲット依存部で検出するもの 1500 ・terrtnがプログラムの開始番地として正しくない場合(E_PAR) 1501 1502 以上 -
Property svn:mime-type
set to
-
ssp_qb_r5f100le_cs/trunk/doc/extension.txt
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 1 1 2 TOPPERS/SSP J[l3 g£pbP[Wdl2 TOPPERS/SSPカーネル 3 拡張パッケージ仕様 4 4 5 Îo[W: Release 1.3.06 ÅIXV: 2015N 512ú5 対応バージョン: Release 1.3.0 6 最終更新: 2015年 5月12日 7 7 8 ±ÌhL 9 gÍCTOPPERS/SSPJ[lÌ@\ðg£·é½ßÌg£ 10 pbP[WÉt¢ÄLqµ½àÌÅ éD 8 このドキュメントは,TOPPERS/SSPカーネルの機能を拡張するための拡張 9 パッケージに付いて記述したものである. 11 10 12 11 ---------------------------------------------------------------------- … … 18 17 Nagoya Municipal Industrial Research Institute, JAPAN 19 18 20 ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 21 Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 22 ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 23 (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 24 \¦C±Ìpð¨æѺL̳ÛØKèªC»ÌÜÜÌ`Å\[ 25 XR[hÉÜÜêÄ¢é±ÆD 26 (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 27 pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 28 gip 29 Ò}j 30 AÈÇjÉCãLÌì \¦C±Ìpð¨æѺL 31 ̳ÛØKèðfÚ·é±ÆD 32 (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 33 pÅ«È¢`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 34 ÆD 35 (a) Äzzɺ¤hL 36 gipÒ}j 37 AÈÇjÉCãLÌ 38 ì \¦C±Ìpð¨æѺL̳ÛØKèðfÚ·é±ÆD 39 (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 40 ñ·é±ÆD 41 (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 42 Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 43 ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 44 RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 45 ÆÓ·é±ÆD 19 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 20 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 21 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 22 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 23 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 24 スコード中に含まれていること. 25 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 26 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 27 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 28 の無保証規定を掲載すること. 29 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 30 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 31 と. 32 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 33 作権表示,この利用条件および下記の無保証規定を掲載すること. 34 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 35 報告すること. 36 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 37 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 38 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 39 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 40 免責すること. 46 41 47 {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨48 æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI49 ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF50 AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»51 ÌÓCðíÈ¢D42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 46 の責任を負わない. 52 47 53 48 ---------------------------------------------------------------------- 54 49 55 g£pbP[WÌTv 50 ○拡張パッケージの概要 56 51 57 Eüúnh@\ 58 EA[nh@\ 59 EVXeÇ@\ 60 ECxgtO@\ 61 Ef[^L 62 [@\ 52 ・周期ハンドラ機能 53 ・アラームハンドラ機能 54 ・システム時刻管理機能 55 ・イベントフラグ機能 56 ・データキュー機能 63 57 64 ÔÇ@\ðÀ»·é½ßÌ^CCxgÇ@\àg£pbP[WÉ 65 ÜñÅ¢éD 58 時間管理機能を実現するためのタイムイベント管理機能も拡張パッケージ中に 59 含んでいる. 66 60 67 üúnh@\ 61 ○周期ハンドラ機能 68 62 69 üúnh@\ÍCȺÌT[rXR[ðT|[gµÄ¢éD 63 周期ハンドラ機能は,以下のサービスコールをサポートしている. 70 64 71 ECRE_CYC72 Esta_cyc73 Estp_cyc65 ・CRE_CYC 66 ・sta_cyc 67 ・stp_cyc 74 68 75 ½¾µCSSPJ[lÅÍ16ÂÜŵ©üúnhð¶¬Å«È¢Æ¢¤ 76 §Àª éD 69 ただし,SSPカーネルでは16個までしか周期ハンドラを生成できないという 70 制限がある. 77 71 78 A[nh@\ 72 ○アラームハンドラ機能 79 73 80 A[nh@\ÍCȺÌT[rXR[ðT|[gµÄ¢éD 74 アラームハンドラ機能は,以下のサービスコールをサポートしている. 81 75 82 ECRE_ALM83 Esta_alm84 Eista_alm85 Estp_alm86 Eistp_alm76 ・CRE_ALM 77 ・sta_alm 78 ・ista_alm 79 ・stp_alm 80 ・istp_alm 87 81 88 ½¾µCSSPJ[lÅÍ16ÂÜŵ©A[nhð¶¬Å«È¢Æ¢¤ 89 §Àª éD 82 ただし,SSPカーネルでは16個までしかアラームハンドラを生成できないという 83 制限がある. 90 84 91 VXeÇ@\ 85 ○システム時刻管理機能 92 86 93 VXeÇ@\ÍCȺÌT[rXR[ðT|[gµÄ¢éD 87 システム時刻管理機能は,以下のサービスコールをサポートしている. 94 88 95 Eget_tim89 ・get_tim 96 90 97 CxgtO@\ 91 ○イベントフラグ機能 98 92 99 CxgtO@\ÍCȺÌT[rXR[ðT|[gµÄ¢éD 93 イベントフラグ機能は,以下のサービスコールをサポートしている. 100 94 101 ECRE_FLG102 Eset_flg103 Eiset_flg104 Eclr_flg105 Epol_flg95 ・CRE_FLG 96 ・set_flg 97 ・iset_flg 98 ・clr_flg 99 ・pol_flg 106 100 107 f[^L 108 [@\ 101 ○データキュー機能 109 102 110 f[^L 111 [@\ÍCȺÌT[rXR[ðT|[gµÄ¢éD 103 データキュー機能は,以下のサービスコールをサポートしている. 112 104 113 ECRE_DTQ114 Epsnd_dtq115 Eipsnd_dtq116 Eprcv_dtq105 ・CRE_DTQ 106 ・psnd_dtq 107 ・ipsnd_dtq 108 ・prcv_dtq 117 109 118 t@X 110 ○リファレンス 119 111 120 (1) üúnh@\112 (1) 周期ハンドラ機能 121 113 122 114 ER ercd = sta_cyc(ID cycid) 123 115 ER ercd = stp_cyc(ID cycid) 124 116 125 (2) A[nh@\117 (2) アラームハンドラ機能 126 118 127 119 ER ercd = sta_alm(ID almid, RELTIM almtim) … … 130 122 ER ercd = istp_alm(ID almid) 131 123 132 (3) ÔÇ@\124 (3) 時間管理機能 133 125 134 126 ER ercd = get_tim(SYSTIM *p_systim) 135 127 136 (4) CxgtO@\128 (4) イベントフラグ機能 137 129 138 130 ER set_flg(ID flgid, FLGPTN setptn); … … 141 133 ER pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn); 142 134 143 (5) f[^L 144 [@\ 135 (5) データキュー機能 145 136 146 137 ER psnd_dtq(ID dtqid, intptr_t data); … … 149 140 150 141 151 ÃIAPIê 142 ○ 静的API一覧 152 143 153 (1) üúnh@\144 (1) 周期ハンドラ機能 154 145 155 146 CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, 156 147 CYCHDR cychdr, RELTIM cyctim, RELTIM cycphs }) 157 148 158 (2) A[nh@\149 (2) アラームハンドラ機能 159 150 160 151 CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr }) 161 152 162 (3) CxgtO@\153 (3) イベントフラグ機能 163 154 164 155 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn }) 165 156 166 (4) f[^L 167 [@\ 157 (4) データキュー機能 168 158 169 159 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb }) 170 160 171 ÈãD 161 以上. -
Property svn:mime-type
set to
-
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
-
ssp_qb_r5f100le_cs/trunk/doc/ssp_spec.txt
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 1 1 2 TOPPERS/SSP J[lÌdlTv2 TOPPERS/SSPカーネルの仕様概要 3 3 4 Îo[W: Release1.3.05 ÅIXV: 2014N 3 6ú4 対応バージョン: Release1.3.0 5 最終更新: 2014年 3月 6日 6 6 7 ±ÌhL 8 gÍCTOPPERS/SSPJ[lÌdlTvÉ¢Äྵ½àÌÅ 9 éDTOPPERS/ASPJ[l©çÌ·ª¨æÑÏXÓÆÊITRON4.0dlÌŬ 10 Zbgvt@C©çÌ·ªðSÉྷéD 7 このドキュメントは,TOPPERS/SSPカーネルの仕様概要について説明したもので 8 ある.TOPPERS/ASPカーネルからの差分および変更箇所とμITRON4.0仕様の最小 9 セットプロファイルからの差分を中心に説明する. 11 10 12 11 ---------------------------------------------------------------------- … … 21 20 Nagoya Municipal Industrial Research Institute, JAPAN 22 21 23 ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 24 Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 25 ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 26 (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 27 \¦C±Ìpð¨æѺL̳ÛØKèªC»ÌÜÜÌ`Å\[ 28 XR[hÉÜÜêÄ¢é±ÆD 29 (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 30 pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 31 gip 32 Ò}j 33 AÈÇjÉCãLÌì \¦C±Ìpð¨æѺL 34 ̳ÛØKèðfÚ·é±ÆD 35 (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 36 pÅ«È¢`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 37 ÆD 38 (a) Äzzɺ¤hL 39 gipÒ}j 40 AÈÇjÉCãLÌ 41 ì \¦C±Ìpð¨æѺL̳ÛØKèðfÚ·é±ÆD 42 (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 43 ñ·é±ÆD 44 (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 45 Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 46 ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 47 RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 48 ÆÓ·é±ÆD 22 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 23 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 24 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 25 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 26 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 27 スコード中に含まれていること. 28 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 29 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 30 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 31 の無保証規定を掲載すること. 32 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 33 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 34 と. 35 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 36 作権表示,この利用条件および下記の無保証規定を掲載すること. 37 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 38 報告すること. 39 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 40 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 41 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 42 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 43 免責すること. 49 44 50 {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨51 æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI52 ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF53 AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»54 ÌÓCðíÈ¢D45 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 46 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 47 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 48 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 49 の責任を負わない. 55 50 56 51 ---------------------------------------------------------------------- 57 52 58 OñÆÈé¶ 53 ○前提となる文書 59 54 60 [1] g¦ï: ÊITRON4.0dl, Ver.4.02.00, 2004N.55 [1] トロン協会: μITRON4.0仕様, Ver.4.02.00, 2004年. 61 56 62 [2] TOPPERS vWFNg: TOPPERSV¢ãJ[ldlRelease 1.5.057 [2] TOPPERSプロジェクト: TOPPERS新世代カーネル仕様書 Release 1.5.0 63 58 64 [3] TOPPERS vWFNg: TOPPERSWÝf, ÅIXV: 2008N65 4 11ú.59 [3] TOPPERSプロジェクト: TOPPERS標準割込み処理モデル, 最終更新: 2008年 60 4月11日. 66 61 67 dlÌTª 62 ○仕様の概略 68 63 69 TOPPERS/SSP J[lÌdlÍCTOPPERS/ASPJ[lÌdlÉεÄC70 ¬KÍAvP[Vü¯ÉdlðiÁ½àÌÅ éDŬZbgÉ 71 ¨¯é"Ŭ"ÆÍCJ[lªgp·éROM/RAMgpÊ𬳷é½ßÉ 72 dlðÅK»·é±ÆðÓ¡·éD 64 TOPPERS/SSPカーネルの仕様は,TOPPERS/ASPカーネルの仕様に対して, 65 小規模アプリケーション向けに仕様を絞ったものである.最小セットに 66 おける"最小"とは,カーネルが使用するROM/RAM使用量を小さくするために 67 仕様を最適化することを意味する. 73 68 74 ñ·é@\ÍÊITRON4.0dlÌÅá@\ðx[XƵÄCê 75 ©®Ô§äpvt@CÌ@\ðæèÞD 69 提供する機能はμITRON4.0仕様準拠の最低機能をベースとして,一部 70 自動車制御用プロファイルの機能を取り込む. 76 71 77 Eñ·éVXeT[rXð§À·é 78 E§ñ^XNÌÝðT|[g·é 79 E1ÂÌ^XNDæxÉεÄo^Å«é^XNÍ1ÂÉÀè·é 80 EROM/RAMgpÊðÈ·é½ßÌÝv/Àðs¤ 72 ・提供するシステムサービスを制限する 73 ・制約タスクのみをサポートする 74 ・1つのタスク優先度に対して登録できるタスクは1つに限定する 75 ・ROM/RAM使用量を少なくするための設計/実装を行う 81 76 82 ³çÉCSSPJ[lÆ©ÌdlƵÄȺÌ@\ð±ü·éD 77 さらに,SSPカーネル独自の仕様として以下の機能を導入する. 83 78 84 E^XNÌÀsDæx 85 E¤LX^bNÌæ 79 ・タスクの実行時優先度 80 ・共有スタック領域 86 81 87 ±Ì½ßCSSPJ[lÍASPJ[l̺ÊÝ·ÅàãÊÝ·ÅàÈ¢D 82 このため,SSPカーネルはASPカーネルの下位互換でも上位互換でもない. 88 83 89 ñ·éVXeT[rXð§À·é 84 ○提供するシステムサービスを制限する 90 85 91 TOPPERS/ASP ªñ·éVXeT[rX̤¿CÊITRON4.0dl92 5.1.2 ßÅKè³ê½VXeT[rXÆCTOPPERSV¢ãJ[l93 dlÅÇÁ³ê½êÌVXeT[rXÌÝðT|[g·éD 86 TOPPERS/ASPが提供するシステムサービスのうち,μITRON4.0仕様書 87 5.1.2節で規定されたシステムサービスと,TOPPERS新世代カーネル 88 仕様で追加された一部のシステムサービスのみをサポートする. 94 89 95 T|[g·éVXeT[rXÍȺÌÊèÅ éD 90 サポートするシステムサービスは以下の通りである. 96 91 97 ECRE_TSK98 EDEF_EPR99 Eact_tsk,iact_tsk100 Eloc_cpu,iloc_cpu101 Eunl_cpu,iunl_cpu102 Esns_ctx103 Esns_loc104 Esns_dsp105 Esns_dpn106 Esns_ker107 Eena_dsp108 Edis_dsp109 EDEF_INH110 EATT_ISR111 ECFG_INT112 Eena_int113 Edis_int114 EATT_INI115 EATT_TER116 Eext_ker117 EDEF_ICS118 EDEF_STK92 ・CRE_TSK 93 ・DEF_EPR 94 ・act_tsk,iact_tsk 95 ・loc_cpu,iloc_cpu 96 ・unl_cpu,iunl_cpu 97 ・sns_ctx 98 ・sns_loc 99 ・sns_dsp 100 ・sns_dpn 101 ・sns_ker 102 ・ena_dsp 103 ・dis_dsp 104 ・DEF_INH 105 ・ATT_ISR 106 ・CFG_INT 107 ・ena_int 108 ・dis_int 109 ・ATT_INI 110 ・ATT_TER 111 ・ext_ker 112 ・DEF_ICS 113 ・DEF_STK 119 114 120 ½¾µCg£pbP[WðKp·é±ÆÅ@\ðÇÁ·é±ÆªÅ«éD 115 ただし,拡張パッケージを適用することで機能を追加することができる. 121 116 122 §ñ^XNÌÝðT|[g·é 117 ○制約タスクのみをサポートする 123 118 124 ^XNÔÌX^bN¤LðOñÆ·é½ßC©®Ô§äpvt@CÉ 125 Kè³êÄ¢é§ñ^XNð±üµCÊíÌ^XNÍp~·éD±êÍC 126 L`ÌÒ¿óÔðT|[gµÈ¢±ÆðÓ¡·éD 119 タスク間のスタック共有を前提とするため,自動車制御用プロファイルに 120 規定されている制約タスクを導入し,通常のタスクは廃止する.これは, 121 広義の待ち状態をサポートしないことを意味する. 127 122 128 1ÂÌ^XNDæxÉεÄo^Å«é^XNÍ1ÂÉÀè·é 123 ○1つのタスク優先度に対して登録できるタスクは1つに限定する 129 124 130 1ÂÌ^XNDæxÉεÄo^Å«é^XNÍêÂÆ·éD^XNDæxÍ 131 16Å é½ßCÅåÅo^Å«é^XNÍ16Å éD±Ì§ÀÍfBL 132 [ 133 ðsvƵCXPW 134 [ÌȪ»ÆRAMgpÊÌí¸ð}é½ßÅ éD 125 1つのタスク優先度に対して登録できるタスクは一つとする.タスク優先度は 126 16であるため,最大で登録できるタスク数は16である.この制限はレディキュー 127 を不要とし,スケジューラの簡略化とRAM使用量の削減を図るためである. 135 128 136 ROM/RAMgpÊðÈ·é½ßÌÝv/Àðs¤ 129 ○ROM/RAM使用量を少なくするための設計/実装を行う 137 130 138 È¢ROM/RAMŮ쳹é½ßÉTCYðDæµ½Ýv/Àð 139 s¤DÝvÅÍf[^\¢Ìzñ»ðåƵ½ÅK»CÀÅÍ 140 æèÚA«ð¹ÈíÈ¢ÍÍÅ̬³¢f[^^ÌgpâÂÇ«ð 141 µáº³¹È¢ÍÍÅÌR[h` 142 [jOðs¤DܽC 143 RpCÉæéÅK»àp·é(½¾µRpCÅÌÅK»Í 144 «Éæé·Ùªå«¢½ßC^[Qbg˶Šé)D 131 少ないROM/RAMで動作させるためにサイズを優先した設計/実装を 132 行う.設計ではデータ構造の配列化を主とした最適化,実装では 133 より移植性を損なわない範囲での小さいデータ型の使用や可読性を 134 著しく低下させない範囲でのコードチューニングを行う.また, 135 コンパイラによる最適化も活用する(ただしコンパイラでの最適化は 136 環境による差異が大きいため,ターゲット依存である). 145 137 146 ^XNÌÀsDæx 138 ○タスクの実行時優先度 147 139 148 ÀsDæxÍ^XNªN®³ê½ãCÅÉÀsóÔÉÈé 149 É^XNÌx[XDæxªÉÝè³êé^XNDæxÅ éDÀs 150 DæxÌ@\ÍCN®Dæxæèà¢DæxÅ^XNðÀs·é±ÆÅC 151 ¯úɤLX^bNÌæðgpµÄ¢éóÔÉÈé^XNÌgÝí¹ðÀ 152 èµCX^bNÌæðßñ·é½ßÌ@\Å éD 140 実行時優先度はタスクが起動された後,最初に実行状態になる 141 時にタスクのベース優先度がに設定されるタスク優先度である.実行時 142 優先度の機能は,起動時優先度よりも高い優先度でタスクを実行することで, 143 同時期に共有スタック領域を使用している状態になるタスクの組み合わせを限 144 定し,スタック領域を節約するための機能である. 153 145 154 ¤LX^bNÌæ 146 ○共有スタック領域 155 147 156 SSP J[lÅÍSÄÌ^XNÆÝnhÅA±µ½X^bNÌæðgp·éD157 ±êð¤LX^bNÌæÆÄÔD¤LX^bNÌæð±ü·é±ÆÅ^XNÌ 158 ÀsDæxÉæé^XNX^bNÌæðßñ·é±ÆªÅ«éD 148 SSPカーネルでは全てのタスクと割込みハンドラで連続したスタック領域を使用する. 149 これを共有スタック領域と呼ぶ.共有スタック領域を導入することでタスクの 150 実行時優先度によるタスクスタック領域を節約することができる. 159 151 160 pӵĢég£pbP[W 152 ○用意している拡張パッケージ 161 153 162 ÔÇg£pbP[WƯúEÊM@\g£pbP[WðpӵĢéD 154 時間管理拡張パッケージと同期・通信機能拡張パッケージを用意している. 163 155 164 ÔÇg£pbP[WÉÍȺÌ@\ªÜÜêéD 156 時間管理拡張パッケージには以下の機能が含まれる. 165 157 166 Eüúnh@\ 167 EA[nh@\ 168 EVXeÇ@\ 158 ・周期ハンドラ機能 159 ・アラームハンドラ機能 160 ・システム時刻管理機能 169 161 170 ¯úEÊM@\g£pbP[WÉÍȺÌ@\ªÜÜêéD 162 同期・通信機能拡張パッケージには以下の機能が含まれる. 171 163 172 Ef[^L 173 [@\ 174 ECxgtO@\ 164 ・データキュー機能 165 ・イベントフラグ機能 175 166 176 Èã 167 以上 -
Property svn:mime-type
set to
-
ssp_qb_r5f100le_cs/trunk/doc/user.txt
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 1 1 2 TOPPERS/SSPJ[l 3 [U[Y}j 4 A 5 6 Îo[W: Release 1.3.0 7 ÅIXV: 2015N519ú 8 9 ±ÌhL 10 gÍCTOPPERS/SSPJ[lðgp·é½ßÉKvÈðྠ11 ·éàÌÅ éD 2 TOPPERS/SSPカーネル 3 ユーザーズマニュアル 4 5 対応バージョン: Release 1.3.0 6 最終更新: 2015年5月19日 7 8 このドキュメントは,TOPPERS/SSPカーネルを使用するために必要な事項を説明 9 するものである. 12 10 13 11 ---------------------------------------------------------------------- … … 19 17 Nagoya Municipal Industrial Research Institute, JAPAN 20 18 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 19 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 20 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 21 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 22 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 23 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 24 スコード中に含まれていること. 25 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 26 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 27 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 28 の無保証規定を掲載すること. 29 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 30 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 31 と. 32 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 33 作権表示,この利用条件および下記の無保証規定を掲載すること. 34 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 35 報告すること. 36 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 37 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 38 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 39 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 40 免責すること. 47 41 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ðíÈ¢D42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 46 の責任を負わない. 53 47 54 48 ---------------------------------------------------------------------- 55 49 56 Ú 57 58 PDTOPPERS/SSPJ[lÌTv 59 1.1 TOPPERS/SSPJ[lÌÊut¯ 60 1.2 TOPPERS/SSPJ[lÌdl 61 1.3 ùmÌâè 62 QD^[Qbg˶ 63 2.1 ^[Qbg˶ÌTv 64 2.2 ÈÕpbP[W 65 2.3 ÂÊpbP[W 66 RDNCbNX^[gKCh 67 3.1 J«Ìõ 68 3.2 RtBM 69 [^Ì\z 70 3.3 TvvOÌ\zÆÀs 71 3.4 J[lðÖPÊÅCu»·éû@ 72 3.5 AvP[VÆJ[lðÊXÉ\z·éû@ 73 SDfBNg\¬Et@C\¬ 74 4.1 zzpbP[WÌfBNg\¬ 75 4.2 ^[Qbgñ˶Ìt@C\¬ 76 TDRtBM 77 [VXNvgÌg¢û 78 UDMakefileÌC³û@ 79 6.1 MakefileÌÏè` 80 6.2 RpCIvV 81 VDRtBM 82 [^Ìg¢û 83 WDVXeT[rX 84 8.1 VAC^tF[XhCo 85 8.1.1 VAC^tF[XhCoÌT[rXR[ 86 8.1.2 VAC^tF[XhCo̻̼ÌT[rX 87 8.2 J[lN®bZ[WÌoÍ 88 XDT|[gCu 89 9.1 L 90 [ìCuÖ 91 PODgpãÌÓÆqg 92 10.1 ^C}hCoÌgÝ 93 10.2 assert}NÌ 94 10.3 IuWFNgIDÌÇ 95 10.4 J[lÌàV{Ìl[ 96 10.5 VXeÌN®Ìú» 97 PPDQlîñ 98 11.1 pðÆpñ 99 11.2 ÛØEKp«ET|[g 100 11.3 oO|[g 101 11.4 EFuTCg 102 11.5 TOPPERS[U[Y[OXg 103 11.6 TOPPERSvWFNgÌoü¯ÌT[rX 104 11.7 TOPPERSvWFNgÖÌQÁ 105 PQD 106 12.1 T[rXR[ê 107 12.2 ÃIAPIê 108 12.3 o[Wð 109 110 111 PDTOPPERS/SSPJ[lÌTv 112 113 1.1. TOPPERS/SSPJ[lÌÊut¯ 114 115 TOPPERS/SSPJ[lÍCTOPPERS/ASPJ[lÌdlÉεÄC 116 ¬KÍAvP[Vü¯ÉdlðiÁ½àÌÅ éDŬZbgÉ 117 ¨¯é"Ŭ"ÆÍCJ[lªgp·éROM/RAMgpÊ𬳷é½ßÉ 118 dlðÅK»·é±ÆðÓ¡·éD 119 120 ñ·é@\ÍÊITRON4.0dlÌÅá@\ðx[XƵÄCê 121 ©®Ô§äpvt@CÌ@\ðæèÞD 122 123 ±Ì½ßCSSPJ[lÍASPJ[l̺ÊÝ·ÅàãÊÝ·ÅàÈ¢D 124 ½¾µC§ñ^XNg£pbP[WðKpµ½êCSSPJ[lÍ 125 SSPJ[lÌãÊÝ·ÆÈéD 126 127 1.2. TOPPERS/SSPJ[lÌdl 128 129 SSPJ[lÌdlÌTvÉ¢ÄÍCuTOPPERSV¢ãJ[ldlvð 130 QÆ̱ÆD 131 132 1.3. ùmÌâè 133 134 kernel_cfg.ci¨æÑcfg1_out.cjÍCJ[lCVXeT[rXCAv 135 P[VÌ¢¸êÌCN[ht@CàCN[hµC¢¸êÌV 136 {àQÆ·éÂ\«ª éD»Ì½ßCJ[lCVXeT[rXCAv 137 P[VÅV{ªÕ˵ĢéêâCRpCIvVªH 138 ¢áÁÄ¢éêÉCkernel_cfg.ci¨æÑcfg1_out.cjª³µRpC 139 Å«ÈÈéêªl¦çêéDJ[lÌV{ðl[·éÈÇÌû 140 @Åy¸³êÄÍ¢éªCâèªÈÈÁÄ¢éí¯ÅÍÈ¢D 141 142 VXeRtBM 143 [Vt@C©çCRtBM 144 [^Éηé 145 INCLUDEfBNeBuÉæè¼ÌRtBM 146 [Vt@CðCN[ 147 hµÄ¢éêÉC»ÌÉÜÜêéC¾êvvZbTÌCN[hfB 148 NeBui#includejÅCRtBM 149 [Vt@CÌu©êÄ¢é 150 fBNgªCt@Cðõ·épXÉÍ¢çȢƢ¤âèª éDá 151 ¦ÎCsyssvc/syslog.cfgÉu#include "syslog.h"vÆLqÅ«È¢ÌÍC± 152 Ìâèª é½ßÅ éD 153 154 »_ÅÍCAhXª64rbgÌ«ÉÍεĢȢD64rbgAh 155 X«ðT|[g·é½ßÌÅåÌÛèÍCg[SR[htH[}bg 156 ª64rbgAhXÉεĢȢ±ÆÅ éD 157 158 QD^[Qbg˶ 159 160 2.1. ^[Qbg˶ÌTv 161 162 SSPJ[lÌ^[Qbgñ˶ÆCeíÌ^[QbgVXeÉÎ·é½ 163 ßÌ^[Qbg˶ÍCÊXÉJ³êÄ¢éD»Ì½ßCSSPJ[lªÎ 164 µÄ¢é·×ÄÌ^[Qbg˶ðCo[W𮳹ÄpbP[W 165 »·é±ÆÍ¢ïÅ éD»±ÅCåÉÌ[UðÎÛɵ½ÈÕpbP[ 166 WÆCãÌ[UâJ[lJÒðÎÛɵ½ÂÊpbP[Wðp 167 ¢éD 168 169 SSPJ[lð¢T|[gÌ^[QbgVXeÖ|[eBO·é½ßÉKv 170 ÈìÆÍCJ«Ì\zÆWÌJ«ÆÌ·ÙÌzûCJ[l©gÌ 171 |[eBOCVXeT[rXÌ|[eBOÈÇ©çÈéDÚµÍC 172 u^[Qbg˶ |[eBOKChvðQÆ·é±ÆD 173 174 ¦ ^[Qbg˶ |[eBOKChÍ»ÝÍ¢®Å é 175 176 2.2. ÈÕpbP[W 177 178 ÈÕpbP[WÍCSSPJ[lªÎµÄ¢é^[QbgVXeÉpÓ³ 179 êC»Ì^[QbgVXeãÅSSPJ[lð®ì³¹é½ßÉKvÈt@C 180 ê®ðpbP[W»µ½àÌÅ éDÈÕpbP[WÉÜÜêét@CÍC 181 o[Wª®µÄ¢é±ÆªmF³êÄ¢éD 182 183 ÈÕpbP[WÌo[WÔÍCpbP[W»µ½útÆ·é±Æð´¥ 184 Æ·éªC^[QbgVXeÌîÉæè±Ì´¥É]íÈ¢êª éD 185 186 ÈÕpbP[WÍCî{IÉÍCÉྷéÂÊpbP[Wð¡ÜÆß½ 187 àÌÅ éD»Ì½ßCÎÛ^[QbgVXeÉKvÌÈ¢t@CàÜÜ 188 êÄ¢éDܽCÈÕpbP[WÉÜÜêÄ¢éÂÊpbP[WÌo[W 189 ÍCÂÊpbP[WÌMANIFESTt@CðQÆ·é±ÆÅmé±ÆªÅ«éD 190 191 2.3. ÂÊpbP[W 192 193 ÂÊpbP[WÍCSSPJ[lÌJPÊÉC»ÌJPÊÅJðSµ 194 Ä¢ét@Cê®ðpbP[W»µ½àÌÅ éDSSPJ[lÌ^[Qbg 195 ñ˶àCêÂÌÂÊpbP[WƵÄzz³êéD éÂÊpbP[Wð 196 gp·é½ßÉÍCêÊÉÍC¼ÌÂÊpbP[WªKvÆÈéD^[Qbg 197 ˶ÌÂÊpbP[Wðgp·é½ßÉKvÆÈéÂÊpbP[WÆ»Ìo[ 198 WÉ¢ÄÍC^[Qbg˶Ì[U[Y}j 199 AðQÆ·é±ÆD 200 gp·éÂÊpbP[WÌo[W𮳹é±ÆÍC[UÌÓCÅ 201 éD 202 203 ÂÊpbP[WÌo[WÔÍCX.Y.ZÌ`Å\»³êéD^[QbgñË 204 ¶Ìo[WÔðCSSPJ[lSÌÌ[XÔÆ·éD^[Qbg 205 ˶Ìo[WÔÍCXÆYªC»êªË¶·é^[Qbgñ˶Æê 206 vµÄ¢éD»êÉεÄCZÍêvµÄ¢éÆÍÀçÈ¢Dá¦ÎC^[Qb 207 gñ˶Ìo[W1.1.0Éηé^[Qbg˶ÍCo[W 208 1.1.ZÌ`ÆÈéD^[Qbg˶Ìݪo[WAbvµ½êÉÍCZ 209 ªÏX³êéD 210 211 gp·éÂÊpbP[WÍCÌáÌæ¤ÉC^[Qbgñ˶ÌÂÊpb 212 P[WðWJµ½ÌƯ¶fBNgÅWJ·éD 50 ○目次 51 52 1.TOPPERS/SSPカーネルの概要 53 1.1 TOPPERS/SSPカーネルの位置付け 54 1.2 TOPPERS/SSPカーネルの仕様 55 1.3 既知の問題 56 2.ターゲット依存部 57 2.1 ターゲット依存部の概要 58 2.2 簡易パッケージ 59 2.3 個別パッケージ 60 3.クイックスタートガイド 61 3.1 開発環境の準備 62 3.2 コンフィギュレータの構築 63 3.3 サンプルプログラムの構築と実行 64 3.4 カーネルを関数単位でライブラリ化する方法 65 3.5 アプリケーションとカーネルを別々に構築する方法 66 4.ディレクトリ構成・ファイル構成 67 4.1 配布パッケージのディレクトリ構成 68 4.2 ターゲット非依存部のファイル構成 69 5.コンフィギュレーションスクリプトの使い方 70 6.Makefileの修正方法 71 6.1 Makefileの変数定義 72 6.2 コンパイルオプション 73 7.コンフィギュレータの使い方 74 8.システムサービス 75 8.1 シリアルインタフェースドライバ 76 8.1.1 シリアルインタフェースドライバのサービスコール 77 8.1.2 シリアルインタフェースドライバのその他のサービス 78 8.2 カーネル起動メッセージの出力 79 9.サポートライブラリ 80 9.1 キュー操作ライブラリ関数 81 10.使用上の注意とヒント 82 10.1 タイマドライバの組込み 83 10.2 assertマクロの処理 84 10.3 オブジェクトIDの管理 85 10.4 カーネルの内部シンボルのリネーム 86 10.5 システムの起動時の初期化処理 87 11.参考情報 88 11.1 利用条件と利用報告 89 11.2 保証・適用性・サポート 90 11.3 バグレポート 91 11.4 ウェブサイト 92 11.5 TOPPERSユーザーズメーリングリスト 93 11.6 TOPPERSプロジェクトのメンバ向けのサービス 94 11.7 TOPPERSプロジェクトへの参加 95 12. 96 12.1 サービスコール一覧 97 12.2 静的API一覧 98 12.3 バージョン履歴 99 100 101 1.TOPPERS/SSPカーネルの概要 102 103 1.1. TOPPERS/SSPカーネルの位置付け 104 105 TOPPERS/SSPカーネルは,TOPPERS/ASPカーネルの仕様に対して, 106 小規模アプリケーション向けに仕様を絞ったものである.最小セットに 107 おける"最小"とは,カーネルが使用するROM/RAM使用量を小さくするために 108 仕様を最適化することを意味する. 109 110 提供する機能はμITRON4.0仕様準拠の最低機能をベースとして,一部 111 自動車制御用プロファイルの機能を取り込む. 112 113 このため,SSPカーネルはASPカーネルの下位互換でも上位互換でもない. 114 ただし,制約タスク拡張パッケージを適用した場合,SSPカーネルは 115 SSPカーネルの上位互換となる. 116 117 1.2. TOPPERS/SSPカーネルの仕様 118 119 SSPカーネルの仕様の概要については,「TOPPERS新世代カーネル統合仕様書」を 120 参照のこと. 121 122 1.3. 既知の問題 123 124 kernel_cfg.c(およびcfg1_out.c)は,カーネル,システムサービス,アプリ 125 ケーションのいずれのインクルードファイルもインクルードし,いずれのシン 126 ボルも参照する可能性がある.そのため,カーネル,システムサービス,アプ 127 リケーションでシンボル等が衝突している場合や,コンパイルオプションが食 128 い違っている場合に,kernel_cfg.c(およびcfg1_out.c)が正しくコンパイル 129 できなくなる場合が考えられる.カーネルのシンボルをリネームするなどの方 130 法で軽減されてはいるが,問題がなくなっているわけではない. 131 132 システムコンフィギュレーションファイルから,コンフィギュレータに対する 133 INCLUDEディレクティブにより他のコンフィギュレーションファイルをインクルー 134 ドしている場合に,その中に含まれるC言語プリプロセッサのインクルードディ 135 レクティブ(#include)で,コンフィギュレーションファイルの置かれている 136 ディレクトリが,ファイルを検索するパスにはいらないという問題がある.例 137 えば,syssvc/syslog.cfgに「#include "syslog.h"」と記述できないのは,こ 138 の問題があるためである. 139 140 現時点では,アドレスが64ビットの環境には対応していない.64ビットアドレ 141 ス環境をサポートするための最大の課題は,モトローラSレコードフォーマット 142 が64ビットアドレスに対応していないことである. 143 144 2.ターゲット依存部 145 146 2.1. ターゲット依存部の概要 147 148 SSPカーネルのターゲット非依存部と,各種のターゲットシステムに対応するた 149 めのターゲット依存部は,別々に開発されている.そのため,SSPカーネルが対 150 応しているすべてのターゲット依存部を,バージョンを整合させてパッケージ 151 化することは困難である.そこで,主に初級のユーザを対象にした簡易パッケー 152 ジと,上級のユーザやカーネル開発者を対象にした個別パッケージを用意して 153 いる. 154 155 SSPカーネルを未サポートのターゲットシステムへポーティングするために必要 156 な作業は,開発環境の構築と標準の開発環境との差異の吸収,カーネル自身の 157 ポーティング,システムサービスのポーティングなどからなる.詳しくは, 158 「ターゲット依存部 ポーティングガイド」を参照すること. 159 160 ※ ターゲット依存部 ポーティングガイドは現在は未完である 161 162 2.2. 簡易パッケージ 163 164 簡易パッケージは,SSPカーネルが対応しているターゲットシステム毎に用意さ 165 れ,そのターゲットシステム上でSSPカーネルを動作させるために必要なファイ 166 ル一式をパッケージ化したものである.簡易パッケージに含まれるファイルは, 167 バージョンが整合していることが確認されている. 168 169 簡易パッケージのバージョン番号は,パッケージ化した日付とすることを原則 170 とするが,ターゲットシステム毎の事情によりこの原則に従わない場合がある. 171 172 簡易パッケージは,基本的には,次に説明する個別パッケージを複数まとめた 173 ものである.そのため,対象ターゲットシステムに必要のないファイルも含ま 174 れている.また,簡易パッケージに含まれている個別パッケージのバージョン 175 は,個別パッケージのMANIFESTファイルを参照することで知ることができる. 176 177 2.3. 個別パッケージ 178 179 個別パッケージは,SSPカーネルの開発単位毎に,その開発単位で開発を担当し 180 ているファイル一式をパッケージ化したものである.SSPカーネルのターゲット 181 非依存部も,一つの個別パッケージとして配布される.ある個別パッケージを 182 使用するためには,一般には,他の個別パッケージが必要となる.ターゲット 183 依存部の個別パッケージを使用するために必要となる個別パッケージとそのバー 184 ジョンについては,ターゲット依存部のユーザーズマニュアルを参照すること. 185 使用する個別パッケージのバージョンを整合させることは,ユーザの責任であ 186 る. 187 188 個別パッケージのバージョン番号は,X.Y.Zの形で表現される.ターゲット非依 189 存部のバージョン番号を,SSPカーネル全体のリリース番号とする.ターゲット 190 依存部のバージョン番号は,XとYが,それが依存するターゲット非依存部と一 191 致している.それに対して,Zは一致しているとは限らない.例えば,ターゲッ 192 ト非依存部のバージョン1.1.0に対応するターゲット依存部は,バージョン 193 1.1.Zの形となる.ターゲット依存部のみがバージョンアップした場合には,Z 194 が変更される. 195 196 使用する個別パッケージは,次の例のように,ターゲット非依存部の個別パッ 197 ケージを展開したのと同じディレクトリで展開する. 213 198 214 199 % tar xvfz ssp-1.3.0.tar.gz 215 200 % tar xvfz ssp_arch_rx_rxc-1.3.0.tar.gz 216 201 217 ^[Qbgñ˶ÌÂÊpbP[WÉÍCȺÌ^[Qbg˶ªÜÜê 218 Ä¢éD 219 220 target/cq_frk_fm3_gcc Interfacet®Cortex-M3î 221 iGNUJ«jp^[Qbg˶ 222 arch/arm_m_gcc Cortex-M3iGNUJ«jpvZbT˶ 223 224 225 RDNCbNX^[gKCh 226 227 ±±ÅÍC^[Qbg˶ªpÓ³êÄ¢é^[QbgVXeãÅCSSPJ[ 228 lãÅ®ì·éTvvOð\zE®ì³¹éÜÅÌèð¦·D 229 230 3.1. J«Ìõ 231 232 SSPJ[lðp¢½VXe\zÉÍCȺÌc[ªKvÅ éD 233 234 zXgVXepÌc[ 235 perl ®ìmFF5.16.2 236 GNU Make ®ìmFF3.81 237 238 TOPPERSV¢ãJ[lpRtBM 239 [^ 240 cfg ®ìmFF1.8.0 241 ¦ 1.6.0ÈOÌo[WÅÍ®ìµÈ¢D 242 243 ^[QbgVXepÌc[iNXJ«j 244 WKiɵ½CRpC 245 AZuCJCCuA 246 V{t@CoÍc[CwLTt@CoÍc[ 247 WCCuiK{ÅÍÈ¢j 248 249 ^[QbgVXepÌc[ÉGNUJ«ðp¢éêÉÍCȺÌc[ 250 ªKvÅ éD 251 252 ^[QbgVXepÌGNUJ«c[ 253 BINUTILSiasCldCarCnmCranlibCobjcopyCobjdumpj 254 GCCܽÍGCC-COREigcc¨æÑ»±©çÄÑo³êéc[j 255 NEWLIBiWCCuCK{ÅÍÈ¢j 256 257 ®ìmF³êÄ¢é^[QbgVXepÌc[É¢ÄÍC^[QbgË 258 ¶Ì[U[Y}j 259 AðQÆ·é±ÆD 260 261 ^[QbgVXepÌWCCuÍCAvP[VªWCCu 262 ðgpµÈ¢êÉÍCKvÈ¢D½¾µCRpCªWCCu 263 ÖimemcpyCmemsetÈÇjðÄÑo·R[h𶬷éêª èC»Ìê 264 ÉÍWCCuªKvÅ éDWCCuðpÓ·éãíèÉC 265 ¶¬µ½R[hªÄÑo·ÖÌÝð©ªÅpÓµÄàæ¢D 266 267 ȨCperlXNvgÍ}`oCg¶ðµ¤¶R[hªEUCCüsR[hª 268 LFÅ é±Æð¼èµÄ¢éD»êÈO̶R[hCüsR[hŮ쳹é 269 ½ßÉÍperlXNvgÌC³ªKvÆÈé±Æª éD 270 271 ȺÅÍC±êçÌc[ªpÓÅ«Ä¢é±ÆðOñÉCUNIX}VãÅÌ 272 \zèðྷéDܽȺÌà¾ÅÍCmakeR}hªGNU MakeÅ éà 273 ÌÆ·éiSSPJ[lÌTvÌMakefileÍCGNU MakeÌg£@\ðp¢Ä 274 ¢éjD 275 276 3.2. RtBM 277 [^Ì\z 278 279 J[lð\z·éOÉCܸCTOPPERSV¢ãJ[lpRtBM 280 [^ 281 ð\z·éKvª éDÈÕpbP[WÉÜÜêÄ¢½êÈÇCRtBM 282 283 [^ðÀst@C`®Åüèµ½êÉÍC±ÌXebvÍKvÈ¢D 284 285 RtBM 286 [^Ì\zÉÍCȺÌc[ªKvÅ éD 287 288 zXgVXepÌc[iZtJ«j 289 C++RpCCC++Cu 290 ®ìmFiMac OS X«jFApple LLVM version 5.0 (clang-500.2.79) 291 Boost ®ìmFF1.55.0 292 Visual Studio (WindowsÌê) 293 294 ÅÉCpbP[WÉRtBM 295 [^Ì\[Xt@CªÜÜêĢȢ 296 êÉÍCRtBM 297 [^ÌpbP[WðCSSPJ[lÌ\[Xt@C 298 ðWJµ½fBNg̺ÉWJ·éD 202 ターゲット非依存部の個別パッケージには,以下のターゲット依存部が含まれ 203 ている. 204 205 target/cq_frk_fm3_gcc Interface誌付属Cortex-M3基板 206 (GNU開発環境)用ターゲット依存部 207 arch/arm_m_gcc Cortex-M3(GNU開発環境)用プロセッサ依存部 208 209 210 3.クイックスタートガイド 211 212 ここでは,ターゲット依存部が用意されているターゲットシステム上で,SSPカー 213 ネル上で動作するサンプルプログラムを構築・動作させるまでの手順を示す. 214 215 3.1. 開発環境の準備 216 217 SSPカーネルを用いたシステム構築には,以下のツールが必要である. 218 219 ホストシステム用のツール 220 perl 動作確認:5.16.2 221 GNU Make 動作確認:3.81 222 223 TOPPERS新世代カーネル用コンフィギュレータ 224 cfg 動作確認:1.8.0 225 ※ 1.6.0以前のバージョンでは動作しない. 226 227 ターゲットシステム用のツール(クロス開発環境) 228 標準規格に準拠したCコンパイラ 229 アセンブラ,リンカ,ライブラリアン 230 シンボルファイル出力ツール,ヘキサファイル出力ツール 231 標準Cライブラリ(必須ではない) 232 233 ターゲットシステム用のツールにGNU開発環境を用いる場合には,以下のツール 234 が必要である. 235 236 ターゲットシステム用のGNU開発環境ツール 237 BINUTILS(as,ld,ar,nm,ranlib,objcopy,objdump) 238 GCCまたはGCC-CORE(gccおよびそこから呼び出されるツール) 239 NEWLIB(標準Cライブラリ,必須ではない) 240 241 動作確認されているターゲットシステム用のツールについては,ターゲット依 242 存部のユーザーズマニュアルを参照すること. 243 244 ターゲットシステム用の標準Cライブラリは,アプリケーションが標準Cライブ 245 ラリを使用しない場合には,必要ない.ただし,コンパイラが標準Cライブラリ 246 関数(memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場 247 合には標準Cライブラリが必要である.標準Cライブラリを用意する代わりに, 248 生成したコードが呼び出す関数のみを自分で用意してもよい. 249 250 なお,perlスクリプトはマルチバイト文字を扱う文字コードがEUC,改行コードが 251 LFであることを仮定している.それ以外の文字コード,改行コードで動作させる 252 ためにはperlスクリプトの修正が必要となることがある. 253 254 以下では,これらのツールが用意できていることを前提に,UNIXマシン上での 255 構築手順を説明する.また以下の説明では,makeコマンドがGNU Makeであるも 256 のとする(SSPカーネルのサンプルのMakefileは,GNU Makeの拡張機能を用いて 257 いる). 258 259 3.2. コンフィギュレータの構築 260 261 カーネルを構築する前に,まず,TOPPERS新世代カーネル用コンフィギュレータ 262 を構築する必要がある.簡易パッケージに含まれていた場合など,コンフィギュ 263 レータを実行ファイル形式で入手した場合には,このステップは必要ない. 264 265 コンフィギュレータの構築には,以下のツールが必要である. 266 267 ホストシステム用のツール(セルフ開発環境) 268 C++コンパイラ,C++ライブラリ 269 動作確認(Mac OS X環境):Apple LLVM version 5.0 (clang-500.2.79) 270 Boost 動作確認:1.55.0 271 Visual Studio (Windowsの場合) 272 273 最初に,パッケージにコンフィギュレータのソースファイルが含まれていない 274 場合には,コンフィギュレータのパッケージを,SSPカーネルのソースファイル 275 を展開したディレクトリの下に展開する. 299 276 300 277 % cd ssp 301 278 % tar xvfz cfg-1.8.0.tar.gz 302 279 303 ܽÍCRtBM 304 [^ÌpbP[Wð¼ÌfBNgÉWJµCSSPJ[ 305 lÌ\[Xt@CðWJµ½fBNg©çV{bNNðÍÁ 306 Äàæ¢D 307 308 \[Xt@CªWJÅ«éÆCcfgfBNgÉÚ®µCRtBM 309 [ 310 VXNvgiconfigurejÅMakefileÌ«˶iMakefile.configj 311 𶬵½ãCmakeR}hÉæèRtBM 312 [^icfgvOjª\ 313 zÅ«éD 280 または,コンフィギュレータのパッケージを他のディレクトリに展開し,SSPカー 281 ネルのソースファイルを展開したディレクトリからシンボリックリンクをはっ 282 てもよい. 283 284 ソースファイルが展開できると,cfgディレクトリに移動し,コンフィギュレー 285 ションスクリプト(configure)でMakefileの環境依存部(Makefile.config) 286 を生成した後,makeコマンドによりコンフィギュレータ(cfgプログラム)が構 287 築できる. 314 288 315 289 % cd cfg … … 317 291 % make 318 292 319 ½¾µCBoostðCXg[µ½fBNg¨æѼ̪WÅzèµÄ¢ 320 éàÌÆÍá¤êÉÍCconfigureÌ--with-headers¨æÑ--with-libraries 321 IvVÉæèCwb_t@C¨æÑCuÌu©ê½fBNg 322 ðwè·éKvª éD 323 324 ܽCzXgVXeÉæÁÄÍCÅK»xðã°éƳµRpC 325 Å«È¢±ÆªmçêÄ¢éD»Ìæ¤ÈêÉÍCÅK»xðº°é©C 326 ÅK»ð}~·éæ¤ÉCMakefileðC³·éKvª éD 327 328 ȨCRtBM 329 [^Ìgpû@É¢ÄÍCuVDRtBM 330 [^ 331 Ìg¢ûvÌÍÅྷéD 332 333 3.3. TvvOÌ\zÆÀs 334 335 ÉCSSPJ[lãÅ®ì·éTvvOð\z·éû@ðྷéD 336 337 ܸCTvvOÌIuWFNgt@CðufBNgðì¬ 338 µCRtBM 339 [VXNvgðÀs·éDá¦ÎCIuWFNgt@ 340 CðufBNgðCSSPJ[lÌ\[Xt@CðWJµ½fB 341 Ng̺ÌOBJÆ¢¤¼ÌÌfBNgÉ·éêÉÍCÌR}hð 342 Às·éifBNgÌêƼÌÍCÓÉßÄæ¢jD 293 ただし,Boostをインストールしたディレクトリおよび名称が標準で想定してい 294 るものとは違う場合には,configureの--with-headersおよび--with-libraries 295 オプションにより,ヘッダファイルおよびライブラリの置かれたディレクトリ 296 を指定する必要がある. 297 298 また,ホストシステムによっては,最適化レベルを上げると正しくコンパイル 299 できないことが知られている.そのような場合には,最適化レベルを下げるか, 300 最適化を抑止するように,Makefileを修正する必要がある. 301 302 なお,コンフィギュレータの使用方法については,「7.コンフィギュレータ 303 の使い方」の章で説明する. 304 305 3.3. サンプルプログラムの構築と実行 306 307 次に,SSPカーネル上で動作するサンプルプログラムを構築する方法を説明する. 308 309 まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成 310 し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ 311 イルを置くディレクトリを,SSPカーネルのソースファイルを展開したディレ 312 クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを 313 実行する(ディレクトリの場所と名称は任意に決めてよい). 343 314 344 315 % cd ssp 345 316 % mkdir OBJ 346 317 % cd OBJ 347 % perl ../configure -T <^[QbgªÌ> 348 349 ±±ÅC<^[QbgªÌ>ÍCtargetfBNg̺Éu©êÄ¢é^[Qb 350 g˶fBNg̼ÌÅ éDRtBM 351 [VXNvgÌI 352 vVÉ¢ÄÍCuTDRtBM 353 [VXNvgÌg¢ûvÌ 354 ÍÅྷéD 355 356 RtBM 357 [VXNvgÌÀsÉæèCJgfBNgÉÍC 358 TvvOð\z·é½ßÌMakefileCTvvOpÌR 359 tBM 360 [Vt@Cisample1.cfgjCTvvO{Ì 361 isample1.h¨æÑsample1.cjª¶¬³êéD 362 363 RtBM 364 [VXNvgÌÀsãCKvÅ êÎMakefileðC³· 365 éDMakefileÌC³û@É¢ÄÍCuUDMakefileÌC³û@vÌÍÅྠ366 ·éD 367 368 »ÌãCmake dependÅ˶ÖWt@CiMakefile.dependj𶬵½ãC 369 makeR}hÉæèTvvOÌ[hW 370 [iSSPÜ½Í 371 SSP.exejª¶¬Å«éD˶ÖWt@C̶¬ÉÍá±Ôª©©éD 318 % perl ../configure -T <ターゲット略称> 319 320 ここで,<ターゲット略称>は,targetディレクトリの下に置かれているターゲッ 321 ト依存部ディレクトリの名称である.コンフィギュレーションスクリプトのオ 322 プションについては,「5.コンフィギュレーションスクリプトの使い方」の 323 章で説明する. 324 325 コンフィギュレーションスクリプトの実行により,カレントディレクトリには, 326 サンプルプログラムを構築するためのMakefile,サンプルプログラム用のコン 327 フィギュレーションファイル(sample1.cfg),サンプルプログラム本体 328 (sample1.hおよびsample1.c)が生成される. 329 330 コンフィギュレーションスクリプトの実行後,必要であればMakefileを修正す 331 る.Makefileの修正方法については,「6.Makefileの修正方法」の章で説明 332 する. 333 334 その後,make dependで依存関係ファイル(Makefile.depend)を生成した後, 335 makeコマンドによりサンプルプログラムのロードモジュール(SSPまたは 336 SSP.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる. 372 337 373 338 % make depend 374 339 % make 375 340 376 ±±Å\zµ½TvvOisample1.hCsample1.cCsample1.cfgj 377 ÍCSSPJ[lÌî{IÈ®ìðmF·é½ßÌàÌÅ éD±ÌvO 378 ÌTvà¾ÍCsample1.cÌæªÌRgÉ éD 379 380 3.4. J[lðÖPÊÅCu»·éû@ 381 382 OßÌèÅÍCJ[lðt@CPÊÅRpCµCCu»µÄ 383 ¢½ªCJ[lÌR[hTCYðk¬·é½ßÉÍCgpµÈ¢T[rXR[ 384 ÍNµÈ¢ûª]ܵ¢D»±ÅSSPJ[lÅÍCJ[lðÖPÊ 385 ÅRpCµCCu»·éû@ðpӵĢéD 386 387 ±Ìû@ÅTvvOð\z·éÉÍCRtBM 388 [VXN 389 vgÉC»êðw¦·éIvVi-fjðtÁ·é¾¯Åæ¢D 341 ここで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg) 342 は,SSPカーネルの基本的な動作を確認するためのものである.このプログラ 343 ムの概要説明は,sample1.cの先頭のコメントにある. 344 345 3.4. カーネルを関数単位でライブラリ化する方法 346 347 前節の手順では,カーネルをファイル単位でコンパイルし,ライブラリ化して 348 いたが,カーネルのコードサイズを縮小するためには,使用しないサービスコー 349 ルはリンクしない方が望ましい.そこでSSPカーネルでは,カーネルを関数単位 350 でコンパイルし,ライブラリ化する方法を用意している. 351 352 この方法でサンプルプログラムを構築するには,コンフィギュレーションスク 353 リプトに,それを指示するオプション(-f)を付加するだけでよい. 390 354 391 355 % mkdir OBJ_LIB 392 356 % cd OBJ_LIB 393 % perl ../configure -T <^[QbgªÌ> -f 394 395 ±±ÅCOBJ_LIBÆ¢¤fBNgÌêƼÌÍCCÓÉßÄæ¢D±ê 396 È~ÌèÍCOßƯ¶Å éD 397 398 3.5. AvP[VÆJ[lðÊXÉ\z·éû@ 399 400 OßÅྵ½û@ÅÍCAvP[VÆJ[lð¯É¶¬·é½ßC 401 IuWFNgt@CðufBNgÉñíɽÌt@Cªì¬³ê 402 ÄCµ¢ÉÈéD»±ÅCJ[lðC³·épxªá¢êÉÍCJ[ 403 lÍOÉ\zµÄ¨«CãÅAvP[V¾¯ð\z·éû@ðpÓ 404 µÄ¢éDȺÅÍCTvvOð\zðáÉC»ÌèÉ¢Äà 405 ¾·éD 406 407 ܸCJ[lð\z·éfBNgð쬵CRtBM 408 [VX 409 NvgðÀs·éDá¦ÎCJ[lð\z·éfBNgðCSSPJ[ 410 lÌ\[Xt@CðWJµ½fBNg̺ÌKERNEL_LIBÆ¢¤¼ÌÌ 411 fBNgÉ·éêÉÍCÌR}hðÀs·éifBNgÌê 412 ƼÌÍCÓÉßÄæ¢jD 357 % perl ../configure -T <ターゲット略称> -f 358 359 ここで,OBJ_LIBというディレクトリの場所と名称は,任意に決めてよい.これ 360 以降の手順は,前節と同じである. 361 362 3.5. アプリケーションとカーネルを別々に構築する方法 363 364 前節で説明した方法では,アプリケーションとカーネルを同時に生成するため, 365 オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され 366 て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー 367 ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意 368 している.以下では,サンプルプログラムを構築を例に,その手順について説 369 明する. 370 371 まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス 372 クリプトを実行する.例えば,カーネルを構築するディレクトリを,SSPカー 373 ネルのソースファイルを展開したディレクトリの下のKERNEL_LIBという名称の 374 ディレクトリにする場合には,次のコマンドを実行する(ディレクトリの場所 375 と名称は任意に決めてよい). 413 376 414 377 % mkdir KERNEL_LIB 415 378 % cd KERNEL_LIB 416 % perl ../configure -T < ^[QbgªÌ> -f417 418 ±êÉæèCJ[lð\z·éfBNgÉCMakefileCsample1.cfgC 419 sample1.h Csample1.cª¶¬³êéªCMakefileÈOÍÀ¿IÉÍgpµÈ¢D420 421 make depend Å˶ÖWt@CiMakefile.dependj𶬵½ãCmake422 libkernel.a ÉæèJ[lCuilibkernel.ajª¶¬Å«éD379 % perl ../configure -T <ターゲット略称> -f 380 381 これにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg, 382 sample1.h,sample1.cが生成されるが,Makefile以外は実質的には使用しない. 383 384 make dependで依存関係ファイル(Makefile.depend)を生成した後,make 385 libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる. 423 386 424 387 % make depend 425 388 % make libkernel.a 426 389 427 ÉCAvP[Vð\z·éfBNgð쬵CRtBM 428 [ 429 VXNvgðÀs·éDá¦ÎCAvP[Vð\z·éfBN 430 gðCSSPJ[lÌ\[Xt@CðWJµ½fBNg̺ÌAPLÆ¢ 431 ¤¼ÌÌfBNgÉ·éêÉÍCÌR}hðÀs·éifBNg 432 ÌêƼÌÍCÓÉßÄæ¢jD 390 次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー 391 ションスクリプトを実行する.例えば,アプリケーションを構築するディレク 392 トリを,SSPカーネルのソースファイルを展開したディレクトリの下のAPLとい 393 う名称のディレクトリにする場合には,次のコマンドを実行する(ディレクト 394 リの場所と名称は任意に決めてよい). 433 395 434 396 % cd .. 435 397 % mkdir APL 436 398 % cd APL 437 % perl ../configure -T <^[QbgªÌ> -L ../KERNEL_LIB 438 439 ±±Å-LIvVÉÍCJ[lð\zµ½fBNgÌpXðwè·éD 440 441 ÅãÉCmake dependÅ˶ÖWt@CiMakefile.dependj𶬵½ãC 442 makeR}hÉæèTvvOÌ[hW 443 [iSSPÜ½Í 444 SSP.exejª¶¬Å«éD 399 % perl ../configure -T <ターゲット略称> -L ../KERNEL_LIB 400 401 ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する. 402 403 最後に,make dependで依存関係ファイル(Makefile.depend)を生成した後, 404 makeコマンドによりサンプルプログラムのロードモジュール(SSPまたは 405 SSP.exe)が生成できる. 445 406 446 407 % make depend 447 408 % make 448 409 449 ±ÌèÅÍCAvP[V\zÉÍJ[lÌÄ\zªKv©`Fb 450 NµÈ¢½ßCJ[lÌ\[XR[hðC³µ½êÉÍCJ[lð\z 451 µ½fBNgÅmake libkernel.aðÄÀs·éKvª éD 452 453 ÈãÅÍCJ[lÆAvP[VðÊXÌfBNgÅ\zµ½ªC 454 -L IvVÉJgfBNgi½¾µC"."Æ¢¤LqÅÍsÂjðw455 è·é±ÆÅCJ[lÆAvP[Vð¯¶fBNgÅÊXÉ\z 456 ·é±ÆàÅ«éDïÌIÉÍCÌèÆÈéD 410 この手順では,アプリケーション構築時にはカーネルの再構築が必要かチェッ 411 クしないため,カーネルのソースコードを修正した場合には,カーネルを構築 412 したディレクトリでmake libkernel.aを再実行する必要がある. 413 414 以上では,カーネルとアプリケーションを別々のディレクトリで構築したが, 415 -Lオプションにカレントディレクトリ(ただし,"."という記述では不可)を指 416 定することで,カーネルとアプリケーションを同じディレクトリで別々に構築 417 することもできる.具体的には,次の手順となる. 457 418 458 419 % mkdir OBJ 459 420 % cd OBJ 460 % perl ../configure -T < ^[QbgªÌ> -L ../OBJ421 % perl ../configure -T <ターゲット略称> -L ../OBJ 461 422 % make depend 462 423 % make libkernel.a … … 464 425 % make 465 426 466 ±±ÅCmake cleankernelÍCJ[lCu𶬷é½ßÌÔt@ 467 Cðí·éàÌÅ éD±ÌèÅÍCmake dependÉæèJ[lC 468 uÉÖ·é˶ÖW𶬵Ȣ½ßCJ[lÌ\[XR[hðC³µ 469 ½êÉÍCK¸make cleankerneliܽÍCmake cleanjµÄ©çCmake 470 libkernel.a·éKvª éÌÅÓ·é±ÆD 471 472 ȨCmake realclean·éÆCmake dependÆmakeÉæ趬µ½t@Cð· 473 ×Äí·éD»êÉεÄCmake cleanÅÍCmake dependÉæ趬µ½Ë 474 ¶ÖWt@CÍíµÈ¢D 475 476 477 SDfBNg\¬Et@C\¬ 478 479 4.1. zzpbP[WÌfBNg\¬ 480 481 include/ AvP[Vü¯wb_t@C 482 kernel/ J[l\[Xt@C 483 syssvc/ VXeT[rXwb_t@CC\[Xt@C 484 target/ ^[Qbg˶ 485 arch/ ^[Qbg˶̤ʪ 486 gcc/ GCCJ«˶ 487 pdic/ PDICifoCXhCoÌOSñ˶ªj 488 utils/ [eBeBvO 489 sample/ TvvOÆMakefile 490 doc/ hL 491 g 492 extension/ g£pbP[W 493 494 4.2. ^[Qbgñ˶Ìt@C\¬ 495 496 ^[Qbgñ˶ieXgvOÆg£pbP[WÍjÌet@C 497 ÌTvÍÌÊèD 498 499 README.txt TOPPERS/SSPJ[lÌÈPÈÐî 500 configure RtBM 501 [VXNvgiGNUJ«pj 502 MANIFEST ÂÊpbP[WÌt@CXg 427 ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ 428 イルを削除するものである.この手順では,make dependによりカーネルライ 429 ブラリに関する依存関係を生成しないため,カーネルのソースコードを修正し 430 た場合には,必ずmake cleankernel(または,make clean)してから,make 431 libkernel.aする必要があるので注意すること. 432 433 なお,make realcleanすると,make dependとmakeにより生成したファイルをす 434 べて削除する.それに対して,make cleanでは,make dependにより生成した依 435 存関係ファイルは削除しない. 436 437 438 4.ディレクトリ構成・ファイル構成 439 440 4.1. 配布パッケージのディレクトリ構成 441 442 include/ アプリケーション向けヘッダファイル 443 kernel/ カーネルソースファイル 444 syssvc/ システムサービスヘッダファイル,ソースファイル 445 target/ ターゲット依存部 446 arch/ ターゲット依存部の共通部分 447 gcc/ GCC開発環境依存部 448 pdic/ PDIC(デバイスドライバのOS非依存部分) 449 utils/ ユーティリティプログラム 450 sample/ サンプルプログラムとMakefile 451 doc/ ドキュメント 452 extension/ 拡張パッケージ 453 454 4.2. ターゲット非依存部のファイル構成 455 456 ターゲット非依存部(テストプログラムと拡張パッケージは除く)の各ファイ 457 ルの概要は次の通り. 458 459 README.txt TOPPERS/SSPカーネルの簡単な紹介 460 configure コンフィギュレーションスクリプト(GNU開発環境用) 461 MANIFEST 個別パッケージのファイルリスト 503 462 504 463 include/ 505 kernel.h SSP J[lðgp·é½ßÌè`506 sil.h VXeC^tF[XCðgp·é½ßÌè`507 t_stddef.h TOPPERS ¤Êwb_t@C508 itron.h ITRON dl¤ÊKèÌf[^^EèE}N464 kernel.h SSPカーネルを使用するための定義 465 sil.h システムインタフェースレイヤを使用するための定義 466 t_stddef.h TOPPERS共通ヘッダファイル 467 itron.h ITRON仕様共通規定のデータ型・定数・マクロ 509 468 510 469 kernel/ 511 Makefile.kernel J[lÌt@C\¬Ìè` 512 kernel_impl.h J[lÀpWwb_t@C 513 kernel_int.h kernel_cfg.cpÌwb_t@C 514 kernel_rename.def J[lÌà¯Ê¼Ìl[è` 515 kernel_rename.h J[lÌà¯Ê¼Ìl[ 516 kernel_unrename.h J[lÌà¯Ê¼Ìl[ð 517 kernel_api.csv RtBM 518 [^ÌÃIAPIe[u 519 kernel_def.csv RtBM 520 [^Ìlæ¾V{e[u 521 kernel.tf RtBM 522 [^ÌpX2Ìev[gt@C 523 kernel_check.tf RtBM 524 [^ÌpX3Ìev[gt@C 525 allfunc.h ·×ÄÌÖðRpC·é½ßÌè` 526 check.h G[`FbNp}N 527 startup.c J[lÌú»ÆI¹ 528 task.h ^XNì[`ÖAÌè` 529 task.c ^XNì[` 530 task_manage.c ^XNÇ@\ 531 sys_manage.c VXeóÔÇ@\ 532 interrupt.h ÝÇ@\ÖAÌè` 533 interrupt.c ÝÇ@\ 534 exception.h CPUáOÇ@\ÖAÌè` 535 exception.c CPUáOÇ@\ 536 queue.h L 537 [ìCuðgp·é½ßÌè` 470 Makefile.kernel カーネルのファイル構成の定義 471 kernel_impl.h カーネル実装用標準ヘッダファイル 472 kernel_int.h kernel_cfg.c用のヘッダファイル 473 kernel_rename.def カーネルの内部識別名のリネーム定義 474 kernel_rename.h カーネルの内部識別名のリネーム 475 kernel_unrename.h カーネルの内部識別名のリネーム解除 476 kernel_api.csv コンフィギュレータの静的APIテーブル 477 kernel_def.csv コンフィギュレータの値取得シンボルテーブル 478 kernel.tf コンフィギュレータのパス2のテンプレートファイル 479 kernel_check.tf コンフィギュレータのパス3のテンプレートファイル 480 allfunc.h すべての関数をコンパイルするための定義 481 check.h エラーチェック用マクロ 482 startup.c カーネルの初期化と終了処理 483 task.h タスク操作ルーチン関連の定義 484 task.c タスク操作ルーチン 485 task_manage.c タスク管理機能 486 sys_manage.c システム状態管理機能 487 interrupt.h 割込み管理機能関連の定義 488 interrupt.c 割込み管理機能 489 exception.h CPU例外管理機能関連の定義 490 exception.c CPU例外管理機能 491 queue.h キュー操作ライブラリを使用するための定義 538 492 539 493 syssvc/ 540 banner.h J[lN®bZ[WÌoÍ̽ßÌè` 541 banner.c J[lN®bZ[WÌoÍ 542 banner.cfg J[lN®bZ[WÌoÍÌRtBM 543 [ 544 Vt@C 545 serial.h VAC^tF[XhCoðgp·é½ßÌè` 546 serial.c VAC^tF[XhCo 547 serial.cfg VAhCoÌRtBM 548 [Vt@C 549 syssvc_def.csv VXeT[rXÌRtBM 550 [VÌÛÉKvÈ 551 RtBM 552 [^Ìlæ¾V{e[u 494 banner.h カーネル起動メッセージの出力のための定義 495 banner.c カーネル起動メッセージの出力 496 banner.cfg カーネル起動メッセージの出力のコンフィギュレー 497 ションファイル 498 serial.h シリアルインタフェースドライバを使用するための定義 499 serial.c シリアルインタフェースドライバ 500 serial.cfg シリアルドライバのコンフィギュレーションファイル 501 syssvc_def.csv システムサービスのコンフィギュレーションの際に必要な 502 コンフィギュレータの値取得シンボルテーブル 553 503 554 504 arch/gcc/ 555 MANIFEST ÂÊpbP[WÌt@CXg556 tool_stddef.h t_stddef.h ÌJ«˶iGCCpj505 MANIFEST 個別パッケージのファイルリスト 506 tool_stddef.h t_stddef.hの開発環境依存部(GCC用) 557 507 558 508 utils/ 559 applyrename t@CÉl[ðKp560 genrename l[wb_t@C̶¬561 makedep ˶ÖWXg̶¬iGNUJ«pj562 makerelease [XpbP[W̶¬509 applyrename ファイルにリネームを適用 510 genrename リネームヘッダファイルの生成 511 makedep 依存関係リストの生成(GNU開発環境用) 512 makerelease リリースパッケージの生成 563 513 564 514 sample/ 565 Makefile TvÌMakefileiGNUJ«pj 566 sample1.h TvvO(1)ÉÖ·éè` 567 sample1.c TvvO(1) 568 sample1.cfg TvvO(1)ÌRtBM 569 [Vt@C 515 Makefile サンプルのMakefile(GNU開発環境用) 516 sample1.h サンプルプログラム(1)に関する定義 517 sample1.c サンプルプログラム(1) 518 sample1.cfg サンプルプログラム(1)のコンフィギュレーションファイル 570 519 571 520 extension/ 572 alarm.h A[nh@\ÖAÌè` 573 alarm.c A[nh@\ 574 cyclic.h üúnh@\ÖAÌè` 575 cyclic.c üúnh@\ 576 dataqueue.h f[^L 577 [@\ÖAÌè` 578 dataqueue.c f[^L 579 [@\ 580 time_event.h ^CCxgÇÖAÌè` 581 eventflag.h CxgtOÖAÌè` 582 eventflag.c CxgtO@\ 583 time_event.c ^CCxgÇ 584 time_manage.c VXeÇ@\ 585 MANIFEST g£pbP[WÌt@CXg 521 alarm.h アラームハンドラ機能関連の定義 522 alarm.c アラームハンドラ機能 523 cyclic.h 周期ハンドラ機能関連の定義 524 cyclic.c 周期ハンドラ機能 525 dataqueue.h データキュー機能関連の定義 526 dataqueue.c データキュー機能 527 time_event.h タイムイベント管理関連の定義 528 eventflag.h イベントフラグ関連の定義 529 eventflag.c イベントフラグ機能 530 time_event.c タイムイベント管理 531 time_manage.c システム時刻管理機能 532 MANIFEST 拡張パッケージのファイルリスト 586 533 587 534 doc/ 588 user.txt [U[Y}j 589 A 590 ssp_spec.txt TOPPERS/SSPJ[lÌdlTv 591 extension.txt @\g£E` 592 [jOKCh 593 porting.txt ^[Qbg˶ |[eBOKCh 594 configurator.txt RtBM 595 [^dl 596 version.txt ÏXð 597 598 599 TDRtBM 600 [VXNvgÌg¢û 601 602 RtBM 603 [VXNvgiconfigurejÍCSSPJ[l¨æÑAv 604 P[VvOð\z·é½ßÉKvÈî{IÈRtBM 605 [V 606 ðs¤½ßÌvOÅ éD 607 608 SSPJ[lðp¢ÄAvP[Vð쬷éêÉÍCܸIuWFNg 609 t@CðufBNgð쬵C»ÌfBNgÅRtBM 610 [ 611 VXNvgðÀs·éDIuWFNgt@CðufBNgÌê 612 ƼÌÍCCÓÉßÄæ¢D 613 614 RtBM 615 [VXNvgÉηéIvVÍÌÊèD 616 617 -T <^[QbgªÌ> 618 ^[QbgVXe̼ÌðCtargetfBNg̺Éu©êÄ¢ 619 é^[Qbg˶fBNg̼ÌÅwè·éiK{jD 620 621 -A <AvP[VvO¼> 622 AvP[VvO̼Ìðwè·éDȪµ½êÉÍC 623 TvvOisample1jÆÈéD 624 625 -a <AvP[VÌfBNg¼> 626 AvP[VvOÌ\[Xt@CiVXeRtBM 627 628 [Vt@Cðjðu¢½fBNg¼ðwè·éDÈ 629 ªµ½êÉÍCIuWFNgt@CðufBNgÉu©ê 630 Ä¢é±Æð¼è·éDVXeRtBM 631 [Vt@CÍC 632 IuWFNgt@CðufBNgÉu±ÆD 633 634 -U <IuWFNgt@C¼> 635 AvP[VvOÌCÌIuWFNgt@Ci-A 636 Åwèµ½AvP[VvO¼É".o"ðtÁµ½àÌjÈ 637 OÉCN·×«IuWFNgt@C̼ÌðC".o"ðtÁµ½ 638 `Åwè·éD""ÅÍÞ±ÆÉæÁÄC¡Ìt@Cðwè·é± 639 ÆàÂ\Å éi-UIvVð¡gÁÄÍÈçÈ¢jD 640 641 -L <J[lCuÌfBNg¼> 642 OÉ\zµ½J[lCuilibkernel.ajðp¢ÄCAv 643 P[VÌÝð\z·éêÉÍC±ÌIvVÉJ[lC 644 uÌu©ê½fBNg¼ðwè·éD±ÌIvVÌgp 645 áÉ¢ÄÍCu3.5 AvP[VÆJ[lðÊXÉ\z·é 646 û@vÌßðQÆ·é±ÆD 535 user.txt ユーザーズマニュアル 536 ssp_spec.txt TOPPERS/SSPカーネルの仕様概要 537 extension.txt 機能拡張・チューニングガイド 538 porting.txt ターゲット依存部 ポーティングガイド 539 configurator.txt コンフィギュレータ仕様 540 version.txt 変更履歴 541 542 543 5.コンフィギュレーションスクリプトの使い方 544 545 コンフィギュレーションスクリプト(configure)は,SSPカーネルおよびアプ 546 リケーションプログラムを構築するために必要な基本的なコンフィギュレーショ 547 ンを行うためのプログラムである. 548 549 SSPカーネルを用いてアプリケーションを作成する場合には,まずオブジェクト 550 ファイルを置くディレクトリを作成し,そのディレクトリでコンフィギュレー 551 ションスクリプトを実行する.オブジェクトファイルを置くディレクトリの場 552 所と名称は,任意に決めてよい. 553 554 コンフィギュレーションスクリプトに対するオプションは次の通り. 555 556 -T <ターゲット略称> 557 ターゲットシステムの名称を,targetディレクトリの下に置かれてい 558 るターゲット依存部ディレクトリの名称で指定する(必須). 559 560 -A <アプリケーションプログラム名> 561 アプリケーションプログラムの名称を指定する.省略した場合には, 562 サンプルプログラム(sample1)となる. 563 564 -a <アプリケーションのディレクトリ名> 565 アプリケーションプログラムのソースファイル(システムコンフィギュ 566 レーションファイルを除く)を置いたディレクトリ名を指定する.省 567 略した場合には,オブジェクトファイルを置くディレクトリに置かれ 568 ていることを仮定する.システムコンフィギュレーションファイルは, 569 オブジェクトファイルを置くディレクトリに置くこと. 570 571 -U <オブジェクトファイル名> 572 アプリケーションプログラムのメインのオブジェクトファイル(-A 573 で指定したアプリケーションプログラム名に".o"を付加したもの)以 574 外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した 575 形で指定する.""で囲むことによって,複数のファイルを指定するこ 576 とも可能である(-Uオプションを複数使ってはならない). 577 578 -L <カーネルライブラリのディレクトリ名> 579 事前に構築したカーネルライブラリ(libkernel.a)を用いて,アプリ 580 ケーションのみを構築する場合には,このオプションにカーネルライ 581 ブラリの置かれたディレクトリ名を指定する.このオプションの使用 582 例については,「3.5 アプリケーションとカーネルを別々に構築する 583 方法」の節を参照すること. 647 584 648 585 -f 649 J[lðÖPÊÅRpCµCu»·éêÉC±ÌI650 vVðwè·éD±ÌIvVÌgpáÉ¢ÄÍCu3.4 J[651 lðÖPÊÅCu»·éû@vÌßðQÆ·é±ÆD652 653 -D <SSP J[lÌ\[XfBNg¼>654 SSP J[lÌ\[Xt@Cðu¢½fBNg¼ðwè·éDÈ655 ªµ½êÉÍCconfigureÌu©êÄ¢éfBNgÆÈéD656 657 -l < vO~O¾ê>658 AvP[VvOÌvO~O¾êðwè·éD»659 _ÅÍCcÆc++ÌÝðT|[gµÄ¢éD660 661 -t < ev[gfBNg¼>662 Makefile âTvvOÌev[gÌu©ê½fBNg663 ¼ðwè·éDȪµ½êÉÍCSSPJ[lÌ\[Xt@Cð664 u¢½fBNg̺ÌsamplefBNgÆÈéD665 666 -m < ev[gMakefile¼>667 Makefile Ìev[gÆ·ét@C¼ðwè·éDȪµ½ê668 ÉÍCMakefileÆÈéD669 670 -d < Às«¼>671 ^[QbgVXeãÅÌvOÌÀs«iÈ¢µÍCfob672 O«j̼Ìðwè·éD±ÌIvVðwè·éÆCÀs«673 ðwè·éV{iTOPPERS_<fobO«¼>jª}Nè`³ê674 éDȪµ½êÉÍCÀs«ðwè·éV{Í}Nè`³675 êÈ¢D586 カーネルを関数単位でコンパイルしライブラリ化する場合に,このオ 587 プションを指定する.このオプションの使用例については,「3.4 カー 588 ネルを関数単位でライブラリ化する方法」の節を参照すること. 589 590 -D <SSPカーネルのソースディレクトリ名> 591 SSPカーネルのソースファイルを置いたディレクトリ名を指定する.省 592 略した場合には,configureの置かれているディレクトリとなる. 593 594 -l <プログラミング言語> 595 アプリケーションプログラムのプログラミング言語を指定する.現時 596 点では,cとc++のみをサポートしている. 597 598 -t <テンプレートディレクトリ名> 599 Makefileやサンプルプログラムのテンプレートの置かれたディレクト 600 リ名を指定する.省略した場合には,SSPカーネルのソースファイルを 601 置いたディレクトリの下のsampleディレクトリとなる. 602 603 -m <テンプレートMakefile名> 604 Makefileのテンプレートとするファイル名を指定する.省略した場合 605 には,Makefileとなる. 606 607 -d <実行環境名> 608 ターゲットシステム上でのプログラムの実行環境(ないしは,デバッ 609 グ環境)の名称を指定する.このオプションを指定すると,実行環境 610 を指定するシンボル(TOPPERS_<デバッグ環境名>)がマクロ定義され 611 る.省略した場合には,実行環境を指定するシンボルはマクロ定義さ 612 れない. 676 613 677 614 -r 678 g[XOL^ÌTvR[hðLøÉ·éêÉC±ÌIvV 679 ðwè·éD±ÌIvVÌgpáÉ¢ÄÍCu11.5 g[X 680 OL^ÌTvR[hÌgpû@vÌßðQÆ·é±ÆD 681 682 -p <perlÌpX¼> 683 perlÌpX¼ðwè·éDȪµ½êÉÍC/usr/local/binÆ 684 /usr/binðTõµCperlÌpX¼ðè·éD 685 686 -g <RtBM 687 [^ÌpX¼> 688 RtBM 689 [^icfgjÌpX¼ðwè·éDȪµ½êÉÍC 690 ftHgÌpX¼iSSPJ[lÌ\[XfBNgÌºÌ 691 cfg/cfg/cfgjÆÈéD 692 693 RtBM 694 [VXNvgªs¤ÍÌÊèÅ éD 695 696 (1) Makefile̶¬ 697 698 ev[gfBNgiftHgÅÍCsamplej©çKØÈMakefileð 699 IðµCKvÈÓð«·¦ÄCMakefile𶬷éD 700 701 (2) TvvO̶¬ 702 703 wèµ½AvP[VvOªev[gfBNgÉ éêC 704 KØÈAvP[VvOÌ\[Xt@CðIðµCKvÈÓð 705 «·¦ÄCAvP[VvOÌ\[Xt@Ciá¦ÎC 706 sample1.hCsample1.cCsample1.cfgj𶬷éD 707 708 (3) RtBM 709 [^ªpÓÅ«Ä¢é©Ì`FbN 710 711 RtBM 712 [^icfgjÌÀst@Cª é©`FbNµCt@CªÈ 713 ¢êÉÍC»Ì|ðoÍ·éD 714 715 716 UDMakefileÌC³û@ 717 718 OÌÍÅྵ½æ¤ÉCRtBM 719 [VXNvgÉ^¦éIvV 720 ©çMakefileª¶¬³êéªCRtBM 721 [VXNvgÅÎ 722 Å«È¢êÉÍCMakefileð¼ÚC³·éKvª éD±±ÅÍCMakefile 723 ÌÅCC³ªKvÆÈéÂ\«Ì¢ÓÉ¢ÄྷéD 724 725 ȨCMakefileðC³µ½ãÉRtBM 726 [VXNvgðÄÀs· 727 éÆCC³µ½Makefileªã«³êĵܤÌÅÓ·é±Æiâà̪ 728 Makefile.bakÉÛ¶³êéjD 729 730 6.1. MakefileÌÏè` 731 732 (A) ^[QbgªÌ 733 734 TARGETÉÍC^[QbgVXe̼ÌðCtargetfBNg̺Éu©ê 735 Ä¢é^[Qbg˶fBNg̼ÌÅwè·éD±Ìè`ÍCÊíÍC 736 RtBM 737 [VXNvgÉηé-TIvVÉæès¤D 738 739 (B) IuWFNgt@CÌg£q 740 741 Cygwin«ÅRpC·éÉÍCOBJEXTð"exe"Éè`·éKvª éD± 742 êÍCCygwin«ÅÍC[hW 743 [Ìt@C¼Ég£q".exe"ªtÁ 744 ³êéÌÉηé½ßÌàÌÅ éDCygwin«Šé±Æð»èÅ«êÎC 745 RtBM 746 [VXNvgª±Ìè`ðs¤D 747 748 (C) Às«i^[Qbg˶j 749 750 ^[QbgÉæÁÄÍCÀs«ÉεÄ^[Qbg˶ÌR[hð·µ 751 ·¦éêª éD±êðÂ\É·é½ßÉCÀs«̼ÌðDBGENVÉè` 752 µÄ¢éD±Ìè`ÍCÊíÍCRtBM 753 [VXNvgÉη 754 é-DIvVÉæès¤DÇÌ^[QbgªÇÌÀs«ÉÎµÄ¢é© 755 ÍC^[Qbg˶Ì[U[Y}j 756 AðQÆ·é±ÆD 757 758 (D) J[lCuÌfBNg¼ 759 760 KERNEL_LIBÉÍCJ[lCuÌu©ê½fBNg¼ðè`·éD 761 ±Ìè`ÍCÊíÍCRtBM 762 [VXNvgÉηé-LIvV 763 Éæès¤D 764 765 (E) J[lðÖPÊÅRpC·é©Ç¤© 766 767 KERNEL_FUNCOBJSÍCJ[lðÖPÊÅRpC·éêÉÍtrueÉè` 768 µCt@CPÊÅRpC·éêÉÍ¢è`Æ·éD±Ìè`ÍCÊí 769 ÍCRtBM 770 [VXNvgÉηé-fIvVÉæès¤D 771 772 (F) ¤ÊRpCIvV 773 774 ·×ÄÌvOɤʷéRpCIvVÌÇÁªKvÈêÉÍC 775 ºÌÏÌè`ðÏX·éD»ÌRpCIvVªCÁèÌ^[Qbg 776 ÅíÉKvÈêÉÍC^[Qbg˶Ìè`ðüê½Makefile.targetðC 777 ³·×«Å éD 778 779 CDEFS RpCÉηé-DIvVðLq·éD 780 INCLUDES RpCÉηé-IIvVðLq·éD 781 COPTS RpCÉηé»Ì¼ÌIvVðLq·éD 782 LDFLAGS JÉηéIvVðLq·éD 783 LIBS CuN̽ßÌIvVðLq·éD 784 785 ÇÁÌÂ\«Ì éRpCIvVÉ¢ÄÍCu6.2 RpCIv 786 VvÌßðQÆ̱ÆD 787 788 (G) AvP[VvO¼ 789 790 APPLNAMEÉÍCAvP[VvO¼ðè`·éDVXeRtB 791 M 792 [Vt@C¼ÍCAPPLNAMEÉè`µ½¼OÉg£q".cfg"ðtÁ 793 µ½¼OÆ·éDܽCAvP[VÌCt@CÍCAPPLNAMEÉè 794 `µ½¼OÉg£q".c"ðtÁµ½¼OÆ·éD±Ìè`ÍCÊíÍCRtB 795 M 796 [VXNvgÉηé-AIvVÉæès¤D 797 798 (H) AvP[VÌfBNg¼ 799 800 AvP[VÌ\[Xt@CðCIuWFNgt@CðuÌÆÍÊ 801 ÌfBNgÉuêÉÍCAPPLDIRÉ»ÌfBNg¼ðè`·éD± 802 Ìè`ÍCÊíÍCRtBM 803 [VXNvgÉηé-aIvV 804 Éæès¤DAvP[VÌ\[Xt@CðufBNgª¡ 805 éêÉÍCAPPL_DIRÌè`ðÏX·é±ÆÅηéD 806 807 (I) AvP[VÌvOt@C¼ 808 809 AvP[Vª¡Ì\[Xt@CÅ\¬³êéêÉÍC»ÌIuWF 810 Ngt@C¼ðCAPPL_ASMOBJSCAPPL_COBJSCAPPL_CXXOBJSÉñ·éD 811 812 (J) AvP[VÌRpCIvV 813 814 AvP[VÌRpCÉKvÈRpCIvVâCAvP[ 815 VªCuðKvÆ·éêÉÍCAPPL_CFLAGS¨æÑAPPL_LIBSÉè 816 `·éD 817 818 (K) [hW 819 [Ìt@C¼ 820 821 WÌ[hW 822 [Ìt@C¼ðOBJNAMEÉè`·éDftHgÍSSP 823 Å éD 824 825 (L) ^[Qbgt@CÌè` 826 827 ^[Qbg"all"Ì˶t@CƵÄC[hW 828 [Ì`®ðwè·éD 829 ïÌIÉÍCELF`®ÌÍ$(OBJFILE)CoCi`®ÌÍ$(OBJNAME).binC 830 g[ S`®ÌÍ$(OBJNAME).srecðwè·éD$(OBJFILE)ÍCCygwin 831 «ÅOBJEXTð"exe"Éè`µ½ÉÍ$(OBJNAME).exeC»¤ÅÈ¢êÉÍ 832 $(OBJNAME)ÆÈéD 833 834 (M) makedepÌIvVÌè` 835 836 Cygwin«Å[gfBNgª"cygdrive"ÅÈ¢êÉÍCmakedepÌ-RI 837 vVÅ[gfBNg¼ð^¦éKvª éDmakedepÌIvVÍC 838 ÌáÌæ¤ÉCMAKEDEP_OPTSÉè`·éD 615 トレースログ記録のサンプルコードを有効にする場合に,このオプショ 616 ンを指定する.このオプションの使用例については,「11.5 トレース 617 ログ記録のサンプルコードの使用方法」の節を参照すること. 618 619 -p <perlのパス名> 620 perlのパス名を指定する.省略した場合には,/usr/local/binと 621 /usr/binを探索し,perlのパス名を決定する. 622 623 -g <コンフィギュレータのパス名> 624 コンフィギュレータ(cfg)のパス名を指定する.省略した場合には, 625 デフォルトのパス名(SSPカーネルのソースディレクトリの下の 626 cfg/cfg/cfg)となる. 627 628 コンフィギュレーションスクリプトが行う処理は次の通りである. 629 630 (1) Makefileの生成 631 632 テンプレートディレクトリ(デフォルトでは,sample)から適切なMakefileを 633 選択し,必要な箇所を書き換えて,Makefileを生成する. 634 635 (2) サンプルプログラムの生成 636 637 指定したアプリケーションプログラムがテンプレートディレクトリにある場合, 638 適切なアプリケーションプログラムのソースファイルを選択し,必要な箇所を 639 書き換えて,アプリケーションプログラムのソースファイル(例えば, 640 sample1.h,sample1.c,sample1.cfg)を生成する. 641 642 (3) コンフィギュレータが用意できているかのチェック 643 644 コンフィギュレータ(cfg)の実行ファイルがあるかチェックし,ファイルがな 645 い場合には,その旨を出力する. 646 647 648 6.Makefileの修正方法 649 650 前の章で説明したように,コンフィギュレーションスクリプトに与えるオプショ 651 ン等からMakefileが生成されるが,コンフィギュレーションスクリプトで対応 652 できない場合には,Makefileを直接修正する必要がある.ここでは,Makefile 653 の中で,修正が必要となる可能性の高い箇所について説明する. 654 655 なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す 656 ると,修正したMakefileが上書きされてしまうので注意すること(古いものが 657 Makefile.bakに保存される). 658 659 6.1. Makefileの変数定義 660 661 (A) ターゲット略称 662 663 TARGETには,ターゲットシステムの名称を,targetディレクトリの下に置かれ 664 ているターゲット依存部ディレクトリの名称で指定する.この定義は,通常は, 665 コンフィギュレーションスクリプトに対する-Tオプションにより行う. 666 667 (B) オブジェクトファイルの拡張子 668 669 Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義する必要がある.こ 670 れは,Cygwin環境では,ロードモジュールのファイル名に拡張子".exe"が付加 671 されるのに対応するためのものである.Cygwin環境であることを判定できれば, 672 コンフィギュレーションスクリプトがこの定義を行う. 673 674 (C) 実行環境(ターゲット依存) 675 676 ターゲットによっては,実行環境に対応してターゲット依存部のコードを差し 677 換える場合がある.これを可能にするために,実行環境の名称をDBGENVに定義 678 している.この定義は,通常は,コンフィギュレーションスクリプトに対す 679 る-Dオプションにより行う.どのターゲットがどの実行環境に対応しているか 680 は,ターゲット依存部のユーザーズマニュアルを参照すること. 681 682 (D) カーネルライブラリのディレクトリ名 683 684 KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する. 685 この定義は,通常は,コンフィギュレーションスクリプトに対する-Lオプショ 686 ンにより行う. 687 688 (E) カーネルを関数単位でコンパイルするかどうか 689 690 KERNEL_FUNCOBJSは,カーネルを関数単位でコンパイルする場合にはtrueに定義 691 し,ファイル単位でコンパイルする場合には未定義とする.この定義は,通常 692 は,コンフィギュレーションスクリプトに対する-fオプションにより行う. 693 694 (F) 共通コンパイルオプション 695 696 すべてのプログラムに共通するコンパイルオプションの追加が必要な場合には, 697 下の変数の定義を変更する.そのコンパイルオプションが,特定のターゲット 698 で常に必要な場合には,ターゲット依存の定義を入れたMakefile.target等を修 699 正すべきである. 700 701 CDEFS コンパイラに対する-Dオプションを記述する. 702 INCLUDES コンパイラに対する-Iオプションを記述する. 703 COPTS コンパイラに対するその他のオプションを記述する. 704 LDFLAGS リンカに対するオプションを記述する. 705 LIBS ライブラリリンクのためのオプションを記述する. 706 707 追加の可能性のあるコンパイルオプションについては,「6.2 コンパイルオプ 708 ション」の節を参照のこと. 709 710 (G) アプリケーションプログラム名 711 712 APPLNAMEには,アプリケーションプログラム名を定義する.システムコンフィ 713 ギュレーションファイル名は,APPLNAMEに定義した名前に拡張子".cfg"を付加 714 した名前とする.また,アプリケーションのメインファイルは,APPLNAMEに定 715 義した名前に拡張子".c"を付加した名前とする.この定義は,通常は,コンフィ 716 ギュレーションスクリプトに対する-Aオプションにより行う. 717 718 (H) アプリケーションのディレクトリ名 719 720 アプリケーションのソースファイルを,オブジェクトファイルを置くのとは別 721 のディレクトリに置く場合には,APPLDIRにそのディレクトリ名を定義する.こ 722 の定義は,通常は,コンフィギュレーションスクリプトに対する-aオプション 723 により行う.アプリケーションのソースファイルを置くディレクトリが複数あ 724 る場合には,APPL_DIRの定義を変更することで対応する. 725 726 (I) アプリケーションのプログラムファイル名 727 728 アプリケーションが複数のソースファイルで構成される場合には,そのオブジェ 729 クトファイル名を,APPL_ASMOBJS,APPL_COBJS,APPL_CXXOBJSに列挙する. 730 731 (J) アプリケーションのコンパイルオプション 732 733 アプリケーションのコンパイルに必要なコンパイルオプションや,アプリケー 734 ションがライブラリを必要とする場合には,APPL_CFLAGSおよびAPPL_LIBSに定 735 義する. 736 737 (K) ロードモジュールのファイル名 738 739 標準のロードモジュールのファイル名をOBJNAMEに定義する.デフォルトはSSP 740 である. 741 742 (L) ターゲットファイルの定義 743 744 ターゲット"all"の依存ファイルとして,ロードモジュールの形式を指定する. 745 具体的には,ELF形式の時は$(OBJFILE),バイナリ形式の時は$(OBJNAME).bin, 746 モトローラ S形式の時は$(OBJNAME).srecを指定する.$(OBJFILE)は,Cygwin 747 環境でOBJEXTを"exe"に定義した時には$(OBJNAME).exe,そうでない場合には 748 $(OBJNAME)となる. 749 750 (M) makedepのオプションの定義 751 752 Cygwin環境でルートディレクトリが"cygdrive"でない場合には,makedepの-Rオ 753 プションでルートディレクトリ名を与える必要がある.makedepのオプションは, 754 次の例のように,MAKEDEP_OPTSに定義する. 839 755 840 756 MAKEDEP_OPTS = -R cygdrive 841 757 842 6.2. RpCIvV 843 844 SSPJ[lÌR[hÉÍCassert}NªgíêÄ¢éDassert}NÍC 845 NDEBUGðè`·é±ÆÅCIuWFNgR[h©çÁ·±ÆªÅ«éDJ[ 846 lÌfobOªI¹·êÎC-DNDEBUGðwèµÄRpCµ½ûªø¦ª 847 æÈéD 848 849 ^[Qbg˶ɨ¢ÄCRpCIvVÉ-WerrorixðG[µ 850 ¢·éjðwèµÄ¢éêª éD»Ìæ¤È^[Qbgɨ¢ÄCAv 851 P[VÅxªð¯çêÈ¢êÉÍC^[Qbg˶ðC³µÄR 852 pCIvVðí·éKvª éD 853 854 855 VDRtBM 856 [^Ìg¢û 857 858 RtBM 859 [^icfgjÍCTOPPERSV¢ãJ[ldlÌ2.12.5ß 860 ÌLqÌÊèC3ÂÌpXÅ\¬³êéD 861 862 RtBM 863 [^ÍCVXeRtBM 864 [Vt@C¼ðp[ 865 ^ÉæèCȺÌIvVðÂidvÈàÌÌÝjD 758 6.2. コンパイルオプション 759 760 SSPカーネルのコード中には,assertマクロが使われている.assertマクロは, 761 NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー 762 ネルのデバッグが終了すれば,-DNDEBUGを指定してコンパイルした方が効率が 763 よくなる. 764 765 ターゲット依存部において,コンパイルオプションに-Werror(警告をエラー扱 766 いする)を指定している場合がある.そのようなターゲットにおいて,アプリ 767 ケーションで警告が避けられない場合には,ターゲット依存部を修正してコン 768 パイルオプションを削除する必要がある. 769 770 771 7.コンフィギュレータの使い方 772 773 コンフィギュレータ(cfg)は,TOPPERS新世代カーネル統合仕様書の2.12.5節 774 の記述の通り,3つのパスで構成される. 775 776 コンフィギュレータは,システムコンフィギュレーションファイル名をパラメー 777 タに取り,以下のオプションを持つ(重要なもののみ). 866 778 867 779 --help 868 IvVÌXgÆà¾ð\¦·éD 869 870 -vm--versionn 871 RtBM 872 [^Ìo[Wð\¦·éD 873 874 -km--kerneln<J[l¼> 875 J[l̼Ìðwè·éDftHgÍSSPD 876 877 -pm--passn<pXÔ> 878 pXÔðwè·éD1`3Ì¢¸ê©D 879 880 -Im--include-pathn<CN[hpX¼> 881 INCLUDEfBNeBuɨ¢ÄCCN[h·éRtBM 882 [ 883 Vt@CðT·pX¼ðwè·éD 884 885 -Tm--template-filen<ev[gt@C¼> 886 ev[gt@C̼Ìðwè·éDpX2ÆpX3ÅLøD 887 888 --api-table <ÃIAPIe[ut@C¼> 889 ÃIAPIe[uÌt@C¼ðwè·éD 890 891 --cfg1-def-table <læ¾V{e[ut@C¼> 892 læ¾V{e[uÌt@C¼ðwè·éD 893 894 -rm--rom-imagen<[hW 895 [¼> 896 [hW 897 [ðSR[htH[}bgÌ`ÉÏ·µ½t@CÌ 898 ¼Ìðwè·éDpX3ÅÌÝLøD 899 900 -s [--symbol-table] <V{t@C¼> 901 [hW 902 [ÌeV{ÆAhXÌÎ\ðÜÞV{ 903 t@C̼Ìðwè·éDpX3ÅÌÝLøD 904 905 --id-output-file <IDÔoÍt@C¼> 906 SSPJ[lÅÍgpµÄÍÈçÈ¢BÚ×Íconfigurator.txtÌ 907 uJ[l\¬Eú»t@Cikernel_cfg.cjvÌ(5)ðQÆ̱ÆB 908 909 --id-input-file <IDÔüÍt@C¼> 910 SSPJ[lÅÍgpµÄÍÈçÈ¢BÚ×Íconfigurator.txtÌ 911 uJ[l\¬Eú»t@Cikernel_cfg.cjvÌ(5)ðQÆ̱ÆB 780 オプションのリストと説明を表示する. 781 782 -v[--version] 783 コンフィギュレータのバージョンを表示する. 784 785 -k[--kernel]<カーネル名> 786 カーネルの名称を指定する.デフォルトはSSP. 787 788 -p[--pass]<パス番号> 789 パス番号を指定する.1〜3のいずれか. 790 791 -I[--include-path]<インクルードパス名> 792 INCLUDEディレクティブにおいて,インクルードするコンフィギュレー 793 ションファイルを探すパス名を指定する. 794 795 -T[--template-file]<テンプレートファイル名> 796 テンプレートファイルの名称を指定する.パス2とパス3で有効. 797 798 --api-table <静的APIテーブルファイル名> 799 静的APIテーブルのファイル名を指定する. 800 801 --cfg1-def-table <値取得シンボルテーブルファイル名> 802 値取得シンボルテーブルのファイル名を指定する. 803 804 -r[--rom-image]<ロードモジュール名> 805 ロードモジュールをSレコードフォーマットの形に変換したファイルの 806 名称を指定する.パス3でのみ有効. 807 808 -s [--symbol-table] <シンボルファイル名> 809 ロードモジュール中の各シンボルとアドレスの対応表を含むシンボル 810 ファイルの名称を指定する.パス3でのみ有効. 811 812 --id-output-file <ID番号出力ファイル名> 813 SSPカーネルでは使用してはならない。詳細はconfigurator.txtの 814 「○カーネル構成・初期化ファイル(kernel_cfg.c)」の(5)を参照のこと。 815 816 --id-input-file <ID番号入力ファイル名> 817 SSPカーネルでは使用してはならない。詳細はconfigurator.txtの 818 「○カーネル構成・初期化ファイル(kernel_cfg.c)」の(5)を参照のこと。 912 819 913 820 --external-id 914 IuWFNgÌIDÔðÛ·éÏÌè`𶬷éDpX2ÅÌÝ 915 LøD 916 917 -Mm--print-dependenciesn<^[QbgV{> 918 VXeRtBM 919 [Vt@CÌ˶ÖWðoÍ·éD 920 MakefileÌ˶ÖW𶬷éÛÉp¢éD 921 922 RtBM 923 [^ÌÚ×dlÉ¢ÄÍCÊrPDFt@CÌ`ÅzzµÄ¢ 924 éuTOPPERSV¢ãJ[lpRtBM 925 [^dlvðQÆ·é±ÆD 926 927 928 WDVXeT[rX 929 930 931 8.1. VAC^tF[XhCo 932 933 VAC^tF[XhCoÍCVA|[g𵤽ßÌhCoÅ 934 éD 935 936 VAC^tF[XhCoÍCVXeRtBM 937 [Vt@C 938 Åserial.cfgðCN[h·é±ÆÅCVXeÉgÝޱƪūéD 939 VAC^tF[XhCoðÄÑo·\[Xt@CÅÍCserial.hð 940 CN[h·éD 941 942 8.1.1. VAC^tF[XhCoÌT[rXR[ 943 944 VAC^tF[XhCoðÄÑo·T[rXR[ÌdlÍÌÊè 945 Å éD±ÌÅCVA|[gÌIDÔiportidjÌðßÍ^[QbgË 946 ¶ÆÈéD 947 948 ±êçÌT[rXR[ÍCñ^XNReLXg©çÄÑo·±ÆÍÅ«È 949 ¢DܽCserial_rea_datÆserial_wri_datÍCfBXpb`Û¯óÔÅÄÑ 950 o·±ÆÍÅ«È¢D¢¸êàCÄÑoµ½êÉÍE_CTXG[ÆÈéD 821 オブジェクトのID番号を保持する変数の定義を生成する.パス2でのみ 822 有効. 823 824 -M[--print-dependencies]<ターゲットシンボル> 825 システムコンフィギュレーションファイルの依存関係を出力する. 826 Makefile中の依存関係を生成する際に用いる. 827 828 コンフィギュレータの詳細仕様については,別途PDFファイルの形で配布してい 829 る「TOPPERS新世代カーネル用コンフィギュレータ仕様」を参照すること. 830 831 832 8.システムサービス 833 834 835 8.1. シリアルインタフェースドライバ 836 837 シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで 838 ある. 839 840 シリアルインタフェースドライバは,システムコンフィギュレーションファイ 841 ルでserial.cfgをインクルードすることで,システムに組み込むことができる. 842 シリアルインタフェースドライバを呼び出すソースファイルでは,serial.hを 843 インクルードする. 844 845 8.1.1. シリアルインタフェースドライバのサービスコール 846 847 シリアルインタフェースドライバを呼び出すサービスコールの仕様は次の通り 848 である.この中で,シリアルポートのID番号(portid)の解釈はターゲット依 849 存となる. 850 851 これらのサービスコールは,非タスクコンテキストから呼び出すことはできな 852 い.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状態で呼び 853 出すことはできない.いずれも,呼び出した場合にはE_CTXエラーとなる. 951 854 952 855 (1) ER serial_opn_por(ID portid) 953 856 954 portid Åwè³ê½VA|[gðI[vµCóM^MªÂ\ÈóÔÉ955 ·éD 857 portidで指定されたシリアルポートをオープンし,受信/送信が可能な状態に 858 する. 956 859 957 860 (2) ER serial_cls_por(ID portid) 958 861 959 portid Åwè³ê½VA|[gðN[Y·éD862 portidで指定されたシリアルポートをクローズする. 960 863 961 864 (3) ER_UINT serial_rea_dat(ID portid, char *buf, uint_t len) 962 865 963 portid Åwè³ê½VA|[g©çClenoCg̶ñðóMµCbuf©964 çÌÌæÉüêéDVA|[gÌóMobt@Éi[³êÄ¢éoCgª 965 len oCgæèÈ¢êCæ¾Â\Èf[^ðbufÉi[µ½ç¦ÀÉ^[966 ·éDóMµ½¶Ü½ÍG[R[hðÔ·D 866 portidで指定されたシリアルポートから,lenバイトの文字列を受信し,bufか 867 らの領域に入れる.シリアルポートの受信バッファに格納されているバイト数が 868 len バイトより少ない場合,取得可能なデータをbufに格納したら即座にリターン 869 する.受信した文字数またはエラーコードを返す. 967 870 968 871 (4) ER_UINT serial_wri_dat(ID portid, const char *buf, uint_t len) 969 872 970 portid Åwè³ê½VA|[gÉCbuf©çÌlenoCg̶ñðM·971 éDMÉVA|[gÌMobt@ªtÉÈÁ½êC»Ì_Å 972 ¦ÀÉ^[·éDMµ½¶Ü½ÍG[R[hðÔ·D 873 portidで指定されたシリアルポートに,bufからのlenバイトの文字列を送信す 874 る.送信中にシリアルポートの送信バッファがフルになった場合,その時点で 875 即座にリターンする.送信した文字数またはエラーコードを返す. 973 876 974 877 (5) ER serial_ctl_por(ID portid, uint_t ioctl) 975 878 976 portid Åwè³ê½VA|[ģäîñðCioctlŦ³êélÉÝè·977 éD 978 979 ioctl ÉÍCȺ̧äîñð\·èðCrbgÉ_aðÆÁ½àÌð980 wè·éD 981 982 IOCTL_ECHO iGR[obN[hj983 ±ÌrbgðÝè·éÆCVAC^tF[XhCoªGR[984 obNðs¤DïÌIÉÍCobt@©ç¶ðæèo·xÉC»Ì985 ¶ð«o·D986 987 IOCTL_CRLF iüs[hj988 LF iline feedjð«o·ÆCCRicarriage returnj{LFÉÏ·µ989 Ä«o·D990 991 992 ȨCI[v¼ãÌftHgÌÝèlÍ(IOCTL_ECHO | IOCTL_CRLF)Å éD 993 994 995 8.1.2. VAC^tF[XhCo̻̼ÌT[rX996 997 VAC^tF[XhCoÍCOLÌT[rXR[ÉÁ¦ÄCú» 998 Æ¢M¶ÌæoµðÂDú»ÍCJ[lÉú»[ 999 `ƵÄo^·éDܽC^[Qbg˶ÅCú»CI¹C 1000 ÝT[rX[`ðÂD±êçÌo^Íserial.cfgÉÜÜêéD 879 portidで指定されたシリアルポートの制御情報を,ioctlで示される値に設定す 880 る. 881 882 ioctlには,以下の制御情報を表す定数を,ビット毎に論理和をとったものを 883 指定する. 884 885 IOCTL_ECHO(エコーバックモード) 886 このビットを設定すると,シリアルインタフェースドライバがエコー 887 バックを行う.具体的には,バッファから文字を取り出す度に,その 888 文字を書き出す. 889 890 IOCTL_CRLF(改行モード) 891 LF(line feed)を書き出すと,CR(carriage return)+LFに変換し 892 て書き出す. 893 894 895 なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF)である. 896 897 898 8.1.2. シリアルインタフェースドライバのその他のサービス 899 900 シリアルインタフェースドライバは,前記のサービスコールに加えて,初期化 901 処理と未送信文字の取出し処理を持つ.初期化処理は,カーネルに初期化ルー 902 チンとして登録する.また,ターゲット依存で,初期化処理,終了処理,割込 903 みサービスルーチンを持つ.これらの登録処理はserial.cfgに含まれる. 1001 904 1002 905 (1) void serial_initialize(intptr_t exinf) 1003 906 1004 VAC^tF[XhCoðú»·éDJ[lÉú»[`Æ 1005 µÄo^·éDexinfͳ·éD 907 シリアルインタフェースドライバを初期化する.カーネルに初期化ルーチンと 908 して登録する.exinfは無視する. 1006 909 1007 910 (2) bool_t serial_get_chr(ID portid, char *p_c) 1008 911 1009 portidÅwè³ê½VA|[gÌMobt@̶ðCp_cÌw·Ôn 1010 ÉæèoµCtrueðÔ·ÖD¶ªÈ©Á½ÉÍCfalseðÔ·DI¹ 1011 [`ÅÄÑo·±ÆðzèµÄ¢éD 1012 1013 1014 8.2. J[lN®bZ[WÌoÍ 1015 1016 J[lN®bZ[WÌoÍÍCJ[lÌN®ÉCJ[l̼Ìâo[ 1017 WÔCì \¦ÈÇðoÍ·é½ßÌ@\Å éD 1018 1019 J[lN®bZ[WÌoÍÍCVXeRtBM 1020 [Vt@C 1021 Åbanner.cfgðCN[h·é±ÆÅCVXeÉgÝޱƪūéD 1022 1023 J[lN®bZ[WÌoÍÍCÌÖÅ\¬³êéD 912 portidで指定されたシリアルポートの送信バッファ中の文字を,p_cの指す番地 913 に取り出し,trueを返す関数.文字がなかった時には,falseを返す.終了処理 914 ルーチン中で呼び出すことを想定している. 915 916 917 8.2. カーネル起動メッセージの出力 918 919 カーネル起動メッセージの出力は,カーネルの起動時に,カーネルの名称やバー 920 ジョン番号,著作権表示などを出力するための機能である. 921 922 カーネル起動メッセージの出力は,システムコンフィギュレーションファイル 923 でbanner.cfgをインクルードすることで,システムに組み込むことができる. 924 925 カーネル起動メッセージの出力は,次の関数で構成される. 1024 926 1025 927 (1) void print_banner(intptr_t exinf) 1026 928 1027 VXeO@\ðp¢ÄCJ[lN®bZ[WðoÍ·éDbanner.cfg 1028 ÉæÁÄCJ[lÉú»[`ƵÄo^³êéDexinfͳ³êéD 1029 1030 1031 XDT|[gCu 1032 1033 T|[gCuÍCAvP[VâVXeT[rXð쬷é½ß 1034 ÉpÅ«éCuÖQÅ éD 1035 1036 1037 9.1. L 1038 [ìCuÖ 1039 1040 L 1041 [ìCuÍCL 1042 [wb_ðÜÞO\¢Ì_uNL 1043 [ 1044 ðµ¤CuÅ éDL 1045 [wb_ÌGgÍL 1046 [ÌæªÌGg 1047 COGgÍL 1048 [ÌöÌGgÆ·éDܽCL 1049 [ÌæªÌG 1050 gÌOGgÆCL 1051 [ÌöÌGgÌGgÍCL 1052 [wb_ 1053 Æ·éDóÌL 1054 [ÍCGgCOGgÆ੪©gðw·L 1055 [wb 1056 _Å çí·D 1057 1058 L 1059 [ìCuÖðp¢éêÉÍCqueue.hðCN[h·éD 1060 1061 L 1062 [wb_ÆGg̽ßÌf[^\¢ÆµÄCQUEUE\¢Ìðp¢éD 1063 QUEUE\¢ÌÌè`ÍÌÊèDQUEUE^ÌÏÍzñƵÄè`·é±ÆðOñÆ 1064 µÄ¢éD 929 システムログ機能を用いて,カーネル起動メッセージを出力する.banner.cfg 930 によって,カーネルに初期化ルーチンとして登録される.exinfは無視される. 931 932 933 9.サポートライブラリ 934 935 サポートライブラリは,アプリケーションやシステムサービスを作成するため 936 に利用できるライブラリ関数群である. 937 938 939 9.1. キュー操作ライブラリ関数 940 941 キュー操作ライブラリは,キューヘッダを含むリング構造のダブルリンクキュー 942 を扱うライブラリである.キューヘッダの次エントリはキューの先頭のエント 943 リ,前エントリはキューの末尾のエントリとする.また,キューの先頭のエン 944 トリの前エントリと,キューの末尾のエントリの次エントリは,キューヘッダ 945 とする.空のキューは,次エントリ,前エントリとも自分自身を指すキューヘッ 946 ダであらわす. 947 948 キュー操作ライブラリ関数を用いる場合には,queue.hをインクルードする. 949 950 キューヘッダとエントリのためのデータ構造として,QUEUE構造体を用いる. 951 QUEUE構造体の定義は次の通り.QUEUE型の変数は配列として定義することを前提と 952 している. 1065 953 1066 954 typedef struct … … 1070 958 } QUEUE; 1071 959 1072 QUEIDX ÍQUEUE^ÌzñÌCfbNXlð\·f[^^Å éD960 QUEIDXはQUEUE型の配列のインデックス値を表すデータ型である. 1073 961 1074 962 typedef uint8_t QUEIDX; 1075 963 1076 964 1077 L 1078 [ì̽ßÉpӵĢéÖÍÌÊèD 965 キュー操作のために用意している関数は次の通り. 1079 966 1080 967 (1) queue_initialize(QUEUE *queue , QUEIDX queue_null) 1081 968 1082 L 1083 [ðú»·éDqueueÉÍL 1084 [wb_ðCqueue_nullÉÍ 1085 ³øÈL 1086 [wb_ð¦·CfbNXlðwè·éD 969 キューを初期化する.queueにはキューヘッダを,queue_nullには 970 無効なキューヘッダを示すインデックス値を指定する. 1087 971 1088 972 (2) queue_insert_prev(QUEUE *top , QUEIDX queue , QUEIDX entry) 1089 973 1090 queueÅwè·éGgÌOÉCentryÅwè·éGgð}ü·éD 1091 topÍqueueCentryðÜÞQUEUE^zñÌæªAhXÅ éD 1092 queueÉL 1093 [wb_ðwèµ½êÉÍCL 1094 [ÌöÉp_entryÅwè· 1095 éGgð}ü·é±ÆÉÈéD 974 queueで指定するエントリの前に,entryで指定するエントリを挿入する. 975 topはqueue,entryを含むQUEUE型配列の先頭アドレスである. 976 queueにキューヘッダを指定した場合には,キューの末尾にp_entryで指定す 977 るエントリを挿入することになる. 1096 978 1097 979 (3) queue_delete_next(QUEUE *top , QUEIDX queue) 1098 980 1099 queueÅwè·éGgÌÌGgðíµCíµ½GgÌ 1100 L 1101 [zñÌCfbNXðÔ·D 1102 topÍqueueCentryðÜÞQUEUE^zñÌæªAhXÅ éD 981 queueで指定するエントリの次のエントリを削除し,削除したエントリの 982 キュー配列中のインデックスを返す. 983 topはqueue,entryを含むQUEUE型配列の先頭アドレスである. 1103 984 1104 985 (6) queue_empty(QUEUE *queue , QUEIDX queue_null) 1105 986 1106 L 1107 [ªóÌêÉÍtrueC»¤ÅÈ¢êÉÍfalseðÔ·DqueueÉÍ 1108 L 1109 [wb_ðCqueue_nullÉͳøÈL 1110 [wb_ð¦·CfbNXlð 1111 wè·éD 1112 1113 1114 PODgpãÌÓÆqg 1115 1116 10.1. ^C}hCoÌgÝ 1117 1118 ^C}hCoðVXeÉgÝÞ½ßÉCVXeRtBM 1119 [V 1120 t@CÌæªÅtarget_timer.cfgðCN[h·éKvª éD 1121 1122 10.2. assert}NÌ 1123 1124 SSPJ[lÌR[hÉÍCassert}NªgíêÄ¢éDassert}NÌè 1125 `Ít_stddef.hÉÜÜêCassertª¸sµ½êÌÅãÌiÊíÍCv 1126 Oðâ~³¹éjÍC^[Qbg˶ÌTOPPERS_assert_abortÅ 1127 è³êéD 1128 1129 assertª¸sµ½êCVXeJÍfobKÉƷ̪]ܵ¢ªC 1130 VXeÒÌÎ@ÍCVXeÉηévÉ˶·éD»±ÅC^[ 1131 Qbg˶ÌTOPPERS_assert_abortðCVXevÉvµ½KØÈ 1132 Éu«·¦éKvª éDVXevÉæÁÄÍCNDEBUGðè`µÄassert 1133 }NÌðIuWFNgR[h©çÁ·iu6.2 RpCIvVv 1134 ÌßðQÆjû@àl¦çêéD 1135 1136 1137 10.3. IuWFNgIDÌÇ 1138 1139 TOPPERS/SSPJ[lÅÍCIuWFNgÌIDÔðCRtBM 1140 [^ª 1141 èt¯éû@ªî{ÆÈÁÄ¢éD 1142 1143 AvP[VvOÅIuWFNgÌIDÔðQÆ·éêÉÍC 1144 Ì2ÂÌû@ªl¦çêéD 1145 1146 (1) IuWFNg¯Ê¼ðp¢é 1147 1148 IuWFNg¶¬Ì½ßÌÃIAPIiCRE_YYYjÌæ1p[^ÉLqµ½Iu 1149 WFNg¯Ê¼ðCAvP[VvOÅàp¢éû@D 1150 1151 RtBM 1152 [^ÍCIuWFNg¯Ê¼ðCèt¯½IDÔÉ}Nè 1153 `·éC¾êvvZbTÌfBNeBui#definejðkernel_cfg.hɶ 1154 ¬·é½ßCAvP[VvO©çkernel_cfg.hðCN[h· 1155 éKvª éD 1156 1157 ±Ìû@ÍCIuWFNgR[hÉIDÔª¼ÚßÜêé½ßÉÀsø 1158 ¦ªÇ¢êûÅCRtBM 1159 [^ªÀs³êÄkernel_cfg.hª«·íé 1160 xÉCAvP[VvOÌÄRpCªKvÉÈéÆ¢¤_ª 1161 éD»Ì½ßCAvP[VvOð\¬·ét@CÌÅCê 1162 Ìt@CÌÝÅIuWFNg¯Ê¼ðQÆ·é\¬É·éÆ¢Á½Hvð 1163 ·é±Æª]ܵ¢D 1164 1165 (2) IuWFNgÌIDÔðÛ·éÏðp¢é 1166 1167 IuWFNgÌIDÔðÛ·éconst®«ðtÁµ½ÏðpÓµCAvP[ 1168 VvOÅÍC»ÌÏðp¢éû@D 1169 1170 á¦ÎCTASK1Æ¢¤IuWFNg¯Ê¼Ì^XNÉεÄCÌæ¤ÈÏð 1171 pÓ·éD 987 キューが空の場合にはtrue,そうでない場合にはfalseを返す.queueには 988 キューヘッダを,queue_nullには無効なキューヘッダを示すインデックス値を 989 指定する. 990 991 992 10.使用上の注意とヒント 993 994 10.1. タイマドライバの組込み 995 996 タイマドライバをシステムに組み込むために,システムコンフィギュレーショ 997 ンファイルの先頭でtarget_timer.cfgをインクルードする必要がある. 998 999 10.2. assertマクロの処理 1000 1001 SSPカーネルのコード中には,assertマクロが使われている.assertマクロの定 1002 義はt_stddef.hに含まれ,assertが失敗した場合の最後の処理(通常は,プロ 1003 グラムを停止させる処理)は,ターゲット依存部のTOPPERS_assert_abortで決 1004 定される. 1005 1006 assertが失敗した場合,システム開発中はデバッガに落とすのが望ましいが, 1007 システム稼働時の対処法は,システムに対する要件に依存する.そこで,ター 1008 ゲット依存部のTOPPERS_assert_abortを,システム要件に合致した適切な処理 1009 に置き換える必要がある.システム要件によっては,NDEBUGを定義してassert 1010 マクロの処理をオブジェクトコード中から消す(「6.2 コンパイルオプション」 1011 の節を参照)方法も考えられる. 1012 1013 1014 10.3. オブジェクトIDの管理 1015 1016 TOPPERS/SSPカーネルでは,オブジェクトのID番号を,コンフィギュレータが割 1017 り付ける方法が基本となっている. 1018 1019 アプリケーションプログラム中でオブジェクトのID番号を参照する場合には, 1020 次の2つの方法が考えられる. 1021 1022 (1) オブジェクト識別名を用いる 1023 1024 オブジェクト生成のための静的API(CRE_YYY)の第1パラメータに記述したオブ 1025 ジェクト識別名を,アプリケーションプログラム中でも用いる方法. 1026 1027 コンフィギュレータは,オブジェクト識別名を,割り付けたID番号にマクロ定 1028 義するC言語プリプロセッサのディレクティブ(#define)をkernel_cfg.hに生 1029 成するため,アプリケーションプログラムからkernel_cfg.hをインクルードす 1030 る必要がある. 1031 1032 この方法は,オブジェクトコード中にID番号が直接埋め込まれるために実行効 1033 率が良い一方で,コンフィギュレータが実行されてkernel_cfg.hが書き換わる 1034 度に,アプリケーションプログラムの再コンパイルが必要になるという欠点が 1035 ある.そのため,アプリケーションプログラムを構成するファイルの中で,一 1036 部のファイルのみでオブジェクト識別名を参照する構成にするといった工夫を 1037 することが望ましい. 1038 1039 (2) オブジェクトのID番号を保持する変数を用いる 1040 1041 オブジェクトのID番号を保持するconst属性を付加した変数を用意し,アプリケー 1042 ションプログラム中では,その変数を用いる方法. 1043 1044 例えば,TASK1というオブジェクト識別名のタスクに対して,次のような変数を 1045 用意する. 1172 1046 1173 1047 const ID TASK1_id = TASK1; 1174 1048 1175 AvP[VvOÅÍC±ÌÏiTASK1_idjðp¢é±ÆÅC 1176 RtBM 1177 [^ªÀs³êÄkernel_cfg.hª«·íéxÉCãLÌÏ 1178 è`ðÜñ¾t@CÌÝðÄRpC·êÎ梱ÆÉÈéD 1179 1180 ±Ìû@ÍCAvP[VvOÌÄRpCðŬÀÉÅ«é 1181 _ª éêûÅCÏ̽ßÌÌæªKvÉÈé±ÆÉÁ¦ÄCiv 1182 ZbTÉæÁÄÍjÏANZX̽ßÌI[owbhª¶¶éÆ¢¤_ª 1183 éDܽCèÅÍÈÏÅ é±Æ©çC¼ÌÏÌú»ÉÍg¦È 1184 ¢Æ¢¤§Àª éD 1185 1186 ȨCTOPPERS/SSPJ[lÌRtBM 1187 [^ÍC--external-idIvV 1188 ðtÁ·é±ÆÉæèCãLÌÏè`ðkernel_cfg.cɶ¬·é@\ð 1189 ÁÄ¢éÌÅC·×ÄÌIuWFNgIDð±Ìû@ÅQÆ·éêÉÍC± 1190 Ì@\ðp¢é±Æð§·éD 1191 1192 RtBM 1193 [^ÉæéIDÔt¯Ìà¤1ÂÌÛèƵÄCRtBM 1194 1195 [Vt@CÌC³ÉæèCIuWFNgIDÌt¯ªÏíÁĵܤ 1196 ±Æª°çêéD±êÍCAvP[V\tgEFAÌÝvdlÉID 1197 ÔªLÚ³êÄ¢éêâCfobOìÆɨ¢ÄIDÔð¦lƵÄ\¦ 1198 âmFªÅ«È¢êÉCìÆø¦ðẳ¹éÂ\«ªl¦çêéD 1199 1200 ±ÌâèÉηé½ßÉCTOPPERSV¢ãJ[lpRtBM 1201 [^ÉÍC 1202 IDÔÌt¯Êðt@CÉ«o·@\i--id-output-fileIvVj 1203 ÆCIDÔÌt¯ðt@C©çæèÞ@\i--id-input-fileIvVj 1204 ƪpÓ³êÄ¢éD½¾µSSPJ[lÌêC»_ÅÍ®ìãÌâèª è 1205 gp·é±ÆªÅ«È¢DÚ×Í configurator.txt ÌuJ[l\¬Eú 1206 »t@Cikernel_cfg.cjvÌ (5) ðQÆ̱ÆD 1207 1208 10.4. J[lÌàV{Ìl[ 1209 1210 SSPJ[lÅÍCW 1211 [à̼̪¼ÌW 1212 [à̼ÌÆÕË· 1213 é±Æðð¯é½ßÉCJ[lÌàV{ÍCC¾êxÅC檪 1214 "_kernel_"ܽÍ"_KERNEL_"Å é¼ÌƵĢéD 1215 1216 ±êð\[XR[hÌÂǫƼ§³¹é½ßÉCSSPJ[lÅÍC\[XR[ 1217 hÍ©RȼOðp¢ÄLqµCC¾êvvZbTÌ}Nè`i#definej 1218 ðp¢ÄC»êð"_kernel_"ܽÍ"_KERNEL_"ÅnÜé¼Oi©RȼOª 1219 yyyyyÌêÉÍC_kernel_yyyyyjÉl[·édgÝðp¢Ä¢éD 1220 1221 ïÌIÉÍCÖA·éfBNgÉxxx_rename.defðu«C»±©çl[ 1222 ̽ßÌwb_t@Cixxx_rename.h¨æÑxxx_unrename.hj𶬷é 1223 c[iutils/genrenamejðpӵĢéD 1224 1225 ±ÌdgÝÍC\[XR[hÌÂÇ«üãÉð§ÂêûÅC¾Qà éDᦠ1226 ÎC½ÌfobKÅC\[XR[h̼ÌÆIuWFNgR[hÌ¼Ì 1227 ªÙÈé½ßÉC\[XR[hÌϼðwèµÄlðÇñ¾èCÖ¼ð 1228 wèµÄu[N|CgðuÆ¢Á½±ÆªÅ«È¢D 1229 1230 ±ÌóµÉηé½ßÉCSSPJ[lÅÍC\[XR[hÌY·é¼Ì 1231 ðl[·é½ßÌ[eBeBiutils/applyrenamejðpӵĢéD 1232 applyrename[eBeBÉCl[è`t@Cixxx_rename.defjÌv 1233 tBbNXixxx̪jÆCl[µ½¢t@CXgð^¦éÆC 1234 l[ðsȤDá¦ÎCkernelfBNgÌ·×ÄÌt@CÉε 1235 ÄCJ[lÌàV{ðl[·éÉÍCÌR}hðÀs·êÎ 1236 æ¢D 1049 アプリケーションプログラム中では,この変数(TASK1_id)を用いることで, 1050 コンフィギュレータが実行されてkernel_cfg.hが書き換わる度に,上記の変数 1051 定義を含んだファイルのみを再コンパイルすればよいことになる. 1052 1053 この方法は,アプリケーションプログラムの再コンパイルを最小限にできる利 1054 点がある一方で,変数のためのメモリ領域が必要になることに加えて,(プロ 1055 セッサによっては)変数アクセスのためのオーバヘッドが生じるという欠点が 1056 ある.また,定数ではなく変数であることから,他の変数の初期化には使えな 1057 いという制限がある. 1058 1059 なお,TOPPERS/SSPカーネルのコンフィギュレータは,--external-idオプショ 1060 ンを付加することにより,上記の変数定義をkernel_cfg.c中に生成する機能を 1061 持っているので,すべてのオブジェクトIDをこの方法で参照する場合には,こ 1062 の機能を用いることを推奨する. 1063 1064 コンフィギュレータによるID番号割付けのもう1つの課題として,コンフィギュ 1065 レーションファイルの修正により,オブジェクトIDの割付けが変わってしまう 1066 ことが挙げられる.これは,アプリケーションソフトウェアの設計仕様書にID 1067 番号が記載されている場合や,デバッグ作業においてID番号を即値として表示 1068 や確認ができない場合に,作業効率を低下させる可能性が考えられる. 1069 1070 この問題に対応するために,TOPPERS新世代カーネル用コンフィギュレータには, 1071 ID番号の割付け結果をファイルに書き出す機能(--id-output-fileオプション) 1072 と,ID番号の割付けをファイルから取り込む機能(--id-input-fileオプション) 1073 とが用意されている.ただしSSPカーネルの場合,現時点では動作上の問題があり 1074 使用することができない.詳細は configurator.txt の「○カーネル構成・初期 1075 化ファイル(kernel_cfg.c)」の (5) を参照のこと. 1076 1077 10.4. カーネルの内部シンボルのリネーム 1078 1079 SSPカーネルでは,モジュール内部の名称が他のモジュール内部の名称と衝突す 1080 ることを避けるために,カーネルの内部シンボルは,C言語レベルで,先頭が 1081 "_kernel_"または"_KERNEL_"である名称としている. 1082 1083 これをソースコードの可読性と両立させるために,SSPカーネルでは,ソースコー 1084 ドは自然な名前を用いて記述し,C言語プリプロセッサのマクロ定義(#define) 1085 を用いて,それを"_kernel_"または"_KERNEL_"で始まる名前(自然な名前が 1086 yyyyyの場合には,_kernel_yyyyy)にリネームする仕組みを用いている. 1087 1088 具体的には,関連するディレクトリにxxx_rename.defを置き,そこからリネー 1089 ムのためのヘッダファイル(xxx_rename.hおよびxxx_unrename.h)を生成する 1090 ツール(utils/genrename)を用意している. 1091 1092 この仕組みは,ソースコードの可読性向上に役立つ一方で,弊害もある.例え 1093 ば,多くのデバッガで,ソースコード中の名称とオブジェクトコード中の名称 1094 が異なるために,ソースコード中の変数名を指定して値を読んだり,関数名を 1095 指定してブレークポイントを置くといったことができない. 1096 1097 この状況に対応するために,SSPカーネルでは,ソースコード中の該当する名称 1098 をリネームするためのユーティリティ(utils/applyrename)を用意している. 1099 applyrenameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプ 1100 リフィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ 1101 ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し 1102 て,カーネルの内部シンボルをリネームするには,次のコマンドを実行すれば 1103 よい. 1237 1104 1238 1105 % cd kernel 1239 1106 % ../utils/applyrename kernel * 1240 1107 1241 ܽC^[Qbg˶ÌfBNgÌ·×ÄÌt@CÉεÄCJ[l 1242 ÌàV{ðl[·éÉÍCÌæ¤ÈR}hðÀs·êÎæ¢D 1108 また,ターゲット依存部のディレクトリのすべてのファイルに対して,カーネ 1109 ルの内部シンボルをリネームするには,次のようなコマンドを実行すればよい. 1243 1110 1244 1111 % cd target/cq_starm_gcc/ … … 1246 1113 % ../../utils/applyrename ../../kernel/kernel * 1247 1114 1248 10.5. VXeÌN®Ìú» 1249 1250 VXeÌN®ÉAvP[VÅKvÆÈéú»ðs¤½ßÌ@ 1251 \ƵÄú»[`ªpÓ³êÄ¢éªCú»[`ªÀs³êéæ 1252 èà¢^C~OÅÀs·é±ÆªKvÈú»ª éêª éD 1253 1254 ±Ìæ¤ÈêÉp¢é½ßÉCWIÈX^[gAbvW 1255 [©çC^[ 1256 QbgVXe˶Ìú»tbNihardware_init_hookjðÄÑo·±ÆÆ 1257 µÄ¢éDhardware_init_hookÍCJ[lÌ^[Qbg˶ÅpÓ³êÄ 1258 ¢é̪WÅ éªC±êðAvP[VÅpÓµ½àÌÉu«·¦C 1259 »ÌÅAvP[VÅKvÆÈéú»ðs¤±ÆªÅ«éD 1260 1261 ½¾µChardware_init_hookÌ쬷éêÉÍCbssZNVÆdataZNV 1262 ªú»³êĢȢ±ÆâCCuªú»³êĢȢ±ÆCC¾ê 1263 ÅLqÅ«éÆÍÀçÈ¢±ÆÈÇÉÓªKvÅ éDì¬É ½ÁÄÍC 1264 u^[Qbg˶ |[eBOKChvðQÆ·é±ÆD 1265 1266 J[lÌX^[gAbvW 1267 [ªhardware_init_hookðÄÑo·æ¤É 1268 À³êĢȢêÉÍCX^[gAbvW 1269 [ðAvP[VÅ 1270 pÓµ½àÌÉu«·¦éû@ð§·éD 1271 1272 PPDQlîñ 1273 1274 11.1. pðÆpñ 1275 1276 SSPJ[lÌpðÍCet@CÌæªÉ\¦³êÄ¢éDì ÍCe 1277 t@CÌæªÉ\¦³êÄ¢éì ÒªÛLµÄ¢éD 1278 1279 pðÌ(3)Ì(b)ɨ¢ÄCpÌ`ÔðTOPPERSvWFNgÉñ·éû 1280 @ƵÄÍCSSPJ[lðpµ½»i̼ÌÆpªìC»i»µ½ïм 1281 ÆÆíÌîñðCȺÌURLÌy[W©çñ·éàÌÆ·éD 1115 10.5. システムの起動時の初期化処理 1116 1117 システムの起動時にアプリケーションで必要となる初期化処理を行うための機 1118 能として初期化ルーチンが用意されているが,初期化ルーチンが実行されるよ 1119 りも早いタイミングで実行することが必要な初期化処理がある場合がある. 1120 1121 このような場合に用いるために,標準的なスタートアップモジュールから,ター 1122 ゲットシステム依存の初期化フック(hardware_init_hook)を呼び出すことと 1123 している.hardware_init_hookは,カーネルのターゲット依存部で用意されて 1124 いるのが標準であるが,これをアプリケーションで用意したものに置き換え, 1125 その中でアプリケーションで必要となる初期化処理を行うことができる. 1126 1127 ただし,hardware_init_hookの作成する場合には,bssセクションとdataセクショ 1128 ンが初期化されていないことや,ライブラリが初期化されていないこと,C言語 1129 で記述できるとは限らないことなどに注意が必要である.作成にあたっては, 1130 「ターゲット依存部 ポーティングガイド」を参照すること. 1131 1132 カーネルのスタートアップモジュールがhardware_init_hookを呼び出すように 1133 実装されていない場合には,スタートアップモジュールをアプリケーションで 1134 用意したものに置き換える方法を推奨する. 1135 1136 11.参考情報 1137 1138 11.1. 利用条件と利用報告 1139 1140 SSPカーネルの利用条件は,各ファイルの先頭に表示されている.著作権は,各 1141 ファイルの先頭に表示されている著作権者が保有している. 1142 1143 利用条件の(3)の(b)において,利用の形態をTOPPERSプロジェクトに報告する方 1144 法としては,SSPカーネルを利用した製品の名称と応用分野,製品化した会社名 1145 と業種等の情報を,以下のURLのページから報告するものとする. 1282 1146 1283 1147 http://www.toppers.jp/report.html 1284 1148 1285 ܽ»ÌÛÉCSSPJ[lðgpµÄÌRgâ²Ó©à¢½¾¯éÆK¢ 1286 Å éD 1287 1288 11.2. ÛØEKp«ET|[g1289 1290 SSP J[lͳÛØÅñ³êÄ¢éàÌÅ éDJÒ¨æÑTOPPERSv1291 WFNgÍCSSPJ[lÉÖµÄCÁèÌgpÚIÉηéK«àÜßÄC 1292 ¢©ÈéÛØàsíÈ¢DܽCSSPJ[lÌpÉæè¼ÚIܽÍÔÚI 1293 ɶ¶½¢©Èé¹QÉÖµÄàC»ÌÓCðíÈ¢D 1294 1295 JÒ¨æÑTOPPERSvWFNgÍCSSPJ[lÉÖ·éT|[gÌñ©Í 1296 µÄ¢È¢DSSPJ[lÉֵĿ⪠éêÍCãqÌTOPPERS[U[ 1297 Y[OXgðpµÄ¢½¾¯éÆK¢Å éDmÀÈT|[gªK 1298 vÈêÉÍCLÅT|[gT[rXðñµÄ¢éïÐÉk³ê½¢D 1299 1300 11.3. oO|[g1301 1302 SSP J[lÉoOââè_ð©³ê½êÉÍCãqÌTOPPERS[U[Y1303 [OXgÉñµÄ~µ¢D 1304 1305 [OXgÉoOââè_ÈÇðñ·éêÉÍCKvɶÄÌ 1306 îñðmç¹Ä~µ¢D 1307 1308 gpµÄ¢éJ[lÉÖ·éîñ1309 E^[Qbgñ˶Ìo[W1310 EgpµÄ¢é^[Qbg˶ƻÌo[W1311 ETOPPERSvWFNg©çÌ[XÉηéü¢Ói êÎj1312 1313 ^[QbgVXeÉÖ·éîñ1314 E^[QbgvZbTÌíÞ1315 E^[Qbg{[hÌíÞ1316 1317 zXgÉÖ·éîñ1318 EOSÌo[WiT[rXpbNÌKpóµàj1319 ERpCÈÇÌJ«Ìo[WiCygwinÌo[Wàj1320 1321 11.4. EFuTCg1322 1323 TOPPERS vWFNgÌEFuTCgÍCȺÌURLÉ éD1149 またその際に,SSPカーネルを使用してのコメントやご意見もいただけると幸い 1150 である. 1151 1152 11.2. 保証・適用性・サポート 1153 1154 SSPカーネルは無保証で提供されているものである.開発者およびTOPPERSプロ 1155 ジェクトは,SSPカーネルに関して,特定の使用目的に対する適合性も含めて, 1156 いかなる保証も行わない.また,SSPカーネルの利用により直接的または間接的 1157 に生じたいかなる損害に関しても,その責任を負わない. 1158 1159 開発者およびTOPPERSプロジェクトは,SSPカーネルに関するサポートの約束は 1160 していない.SSPカーネルに関して質問がある場合は,後述のTOPPERSユーザー 1161 ズメーリングリストを利用していただけると幸いである.確実なサポートが必 1162 要な場合には,有償でサポートサービスを提供している会社に相談されたい. 1163 1164 11.3. バグレポート 1165 1166 SSPカーネルにバグや問題点を発見された場合には,後述のTOPPERSユーザーズ 1167 メーリングリストに報告して欲しい. 1168 1169 メーリングリストにバグや問題点などを報告する場合には,必要に応じて次の 1170 情報を知らせて欲しい. 1171 1172 使用しているカーネルに関する情報 1173 ・ターゲット非依存部のバージョン 1174 ・使用しているターゲット依存部とそのバージョン 1175 ・TOPPERSプロジェクトからのリリースに対する改造箇所(あれば) 1176 1177 ターゲットシステムに関する情報 1178 ・ターゲットプロセッサの種類 1179 ・ターゲットボード等の種類 1180 1181 ホストに関する情報 1182 ・OSのバージョン(サービスパックの適用状況も) 1183 ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも) 1184 1185 11.4. ウェブサイト 1186 1187 TOPPERSプロジェクトのウェブサイトは,以下のURLにある. 1324 1188 1325 1189 http://www.toppers.jp/ 1326 1190 1327 TOPPERS vWFNgâSSPJ[lÉÖ·éÅVîñÍC±ÌEFuTCg©1328 ç¾é±ÆªÅ«éDܽCSSPJ[lÌÅVÅÍC±ÌEFuTCg©ç_ 1329 E[h·é±ÆªÅ«éD 1330 1331 11.5. TOPPERS [U[Y[OXg1332 1333 SSP J[lðÜÞTOPPERSvWFNgÌJ¬Ê¨Ì[UÉηéîññ1334 ¨æÑ[UÝÔÌîñð·ðeÕÉ·é½ßÉCTOPPERS[U[Y[ 1335 OXgiusers@toppers.jpjðpӵĢéD 1336 1337 ±Ì[OXgÉÍCNÅà©RÉo^µC[ðt·é±ÆªÅ 1338 «éio^ÒÈOÍ[ðtÅ«È¢jDܽCt³ê½[ÍCN 1339 Åà©RÉEFuTCgÅÇޱƪūéD 1340 1341 [OXgÖÌo^û@É¢ÄÍCȺÌURLÌy[WÉྪ éD 1191 TOPPERSプロジェクトやSSPカーネルに関する最新情報は,このウェブサイトか 1192 ら得ることができる.また,SSPカーネルの最新版は,このウェブサイトからダ 1193 ウンロードすることができる. 1194 1195 11.5. TOPPERSユーザーズメーリングリスト 1196 1197 SSPカーネルを含むTOPPERSプロジェクトの開発成果物のユーザに対する情報提 1198 供およびユーザ相互間の情報交換を容易にするために,TOPPERSユーザーズメー 1199 リングリスト(users@toppers.jp)を用意している. 1200 1201 このメーリングリストには,誰でも自由に登録し,メールを送付することがで 1202 きる(登録者以外はメールを送付できない).また,送付されたメールは,誰 1203 でも自由にウェブサイトで読むことができる. 1204 1205 メーリングリストへの登録方法については,以下のURLのページに説明がある. 1342 1206 1343 1207 http://www.toppers.jp/community.html 1344 1208 1345 11.6. TOPPERS vWFNgÌoü¯ÌT[rX1346 1347 TOPPERS vWFNgÌoÉεÄÍCãLÉÁ¦ÄCSSPJ[lÉÖA1348 µÄÌT[rXðpӵĢéD 1349 1350 (1) TOPPERS JÒ[OXg1351 1352 TOPPERS vWFNgÌoÍCSSPJ[lÉÖ·é¿âCoOââè_È1353 ÇÌñÉCTOPPERSJÒ[OXgidev@toppers.jpjðp·é± 1354 ƪūéD 1355 1356 (2) SSP J[lÌJxTCg1357 1358 SSP J[lÌJx̽ßÌTRACioOgbLOVXejªCȺÌ1359 URL É éiTRACÖÌANZXÉÍCïõpX[hªKvÅ éjD1209 11.6. TOPPERSプロジェクトのメンバ向けのサービス 1210 1211 TOPPERSプロジェクトのメンバに対しては,上記に加えて,SSPカーネルに関連 1212 して次のサービスを用意している. 1213 1214 (1) TOPPERS開発者メーリングリスト 1215 1216 TOPPERSプロジェクトのメンバは,SSPカーネルに関する質問,バグや問題点な 1217 どの報告に,TOPPERS開発者メーリングリスト(dev@toppers.jp)を利用するこ 1218 とができる. 1219 1220 (2) SSPカーネルの開発支援サイト 1221 1222 SSPカーネルの開発支援のためのTRAC(バグトラッキングシステム)が,以下の 1223 URLにある(TRACへのアクセスには,会員パスワードが必要である). 1360 1224 1361 1225 http://dev.toppers.jp/trac/ssp_core 1362 1226 1363 TOPPERS vWFNgÌoÍC±ÌTCg©çCEFuC^tF[X¨æ1364 ÑsubversionT[oÉæèCSSPJ[lÌJÌo[Wð¾é±ÆªÅ 1365 «éDܽCoOgbLOf[^x[XÉANZX·é±ÆªÅ«Cß 1366 ÌoOðÖÌANZXâCoOÌo^ð·é±ÆªÅ«éD 1367 1368 11.7. TOPPERS vWFNgÖÌQÁ1369 1370 TOPPERS vWFNgÅÍC½©çÌ`ÅvWFNgÉv£µÄ¢½¾¯éûC1371 vWFNgÅJµ½\tgEFAð¨g¢ÌûCvWFNgÉ»¡ð¨ 1372 ¿ÌûÌQÁðßÄ¢éDTOPPERSvWFNgÖÌQÁû@É¢ÄÍC 1373 ȺÌy[WÉྪ éD 1227 TOPPERSプロジェクトのメンバは,このサイトから,ウェブインタフェースおよ 1228 びsubversionサーバにより,SSPカーネルの開発中のバージョンを得ることがで 1229 きる.また,バグトラッキングデータベースにアクセスすることができ,過去 1230 のバグ履歴へのアクセスや,バグの登録をすることができる. 1231 1232 11.7. TOPPERSプロジェクトへの参加 1233 1234 TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献していただける方, 1235 プロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお 1236 持ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については, 1237 以下のページに説明がある. 1374 1238 1375 1239 http://www.toppers.jp/joinus.html 1376 1240 1377 1241 1378 PQDt@X 1379 1380 12.1. T[rXR[ê1381 1382 (1) ^XNÇ@\1242 12.リファレンス 1243 1244 12.1. サービスコール一覧 1245 1246 (1) タスク管理機能 1383 1247 1384 1248 ER ercd = act_tsk(ID tskid) 1385 1249 ER ercd = iact_tsk(ID tskid) 1386 1250 1387 (2) VXeóÔÇ@\1251 (2) システム状態管理機能 1388 1252 1389 1253 ER ercd = loc_cpu(void) … … 1400 1264 ER ercd = ext_ker(void) 1401 1265 1402 (3) ÝÇ@\1266 (3) 割込み管理機能 1403 1267 1404 1268 ER ercd = dis_int(INTNO intno) 1405 1269 ER ercd = ena_int(INTNO intno) 1406 1270 1407 12.2. ÃIAPIê1408 1409 (1) ^XNÇ@\1271 12.2. 静的API一覧 1272 1273 (1) タスク管理機能 1410 1274 1411 1275 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task, … … 1413 1277 DEF_EPR(ID tskid,{ PRI etskpri }) 1414 1278 1415 (2) ÝÇ@\1279 (2) 割込み管理機能 1416 1280 1417 1281 ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri }) … … 1419 1283 CFG_INT(INTNO intno, { ATR intatr, PRI intpri }) 1420 1284 1421 (3) CPU áOÇ@\1285 (3) CPU例外管理機能 1422 1286 1423 1287 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr }) 1424 1288 1425 (4) VXe\¬Ç@\1289 (4) システム構成管理機能 1426 1290 1427 1291 DEF_ICS({ SIZE istksz, STK_T *istk }) … … 1430 1294 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn }) 1431 1295 1432 12.3. o[Wð 1433 1434 2011N 331ú Release 1.0.0 ú[X 1435 2011N1116ú Release 1.1.0 ÅÌêÊ[X 1436 2011N 323ú Release 1.1.1 y÷ÈC³ÆoOtBbNX 1437 2013N 423ú Release 1.2.0 ^XNÌN®vL 1438 [CO@\ÌÇÁ 1439 DEF_ICSÌdlÏX 1440 DEF_STKÌÇÁ 1441 ¯úEÊM@\g£pbP[WÌÇÁ 1442 2014N 3 6ú Release 1.2.1 oOtBbNX 1443 2015N 519ú Release 1.3.0 1444 1445 Èã 1296 12.3. バージョン履歴 1297 1298 2011年 3月31日 Release 1.0.0 早期リリース 1299 2011年11月16日 Release 1.1.0 最初の一般リリース 1300 2011年 3月23日 Release 1.1.1 軽微な修正とバグフィックス 1301 2013年 4月23日 Release 1.2.0 タスクの起動要求キューイング機能の追加 1302 DEF_ICSの仕様変更 1303 DEF_STKの追加 1304 同期・通信機能拡張パッケージの追加 1305 2014年 3月 6日 Release 1.2.1 バグフィックス 1306 2015年 5月19日 Release 1.3.0 1307 1308 以上 -
Property svn:mime-type
set to
-
ssp_qb_r5f100le_cs/trunk/doc/version.txt
-
Property svn:mime-type
set to
text/plain; charset=shift_jis
r93 r95 1 1 2 TOPPERS/SSP J[l3 ÏXð2 TOPPERS/SSPカーネル 3 変更履歴 4 4 5 Îo[W: Release 1.3.06 ÅIXV: 2015N 519ú5 対応バージョン: Release 1.3.0 6 最終更新: 2015年 5月19日 7 7 8 ±ÌhL 9 gÍCTOPPERS/SSPJ[lÌRelease 1.0.0È~ÌÏXððC 10 Vµ¢û©çÉLqµ½àÌÅ éD 8 このドキュメントは,TOPPERS/SSPカーネルのRelease 1.0.0以降の変更履歴を, 9 新しい方から順に記述したものである. 11 10 12 11 ---------------------------------------------------------------------- … … 18 17 Nagoya Municipal Industrial Research Institute, JAPAN 19 18 20 ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 21 Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 22 ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 23 (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 24 \¦C±Ìpð¨æѺL̳ÛØKèªC»ÌÜÜÌ`Å\[ 25 XR[hÉÜÜêÄ¢é±ÆD 26 (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 27 pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 28 gip 29 Ò}j 30 AÈÇjÉCãLÌì \¦C±Ìpð¨æѺL 31 ̳ÛØKèðfÚ·é±ÆD 32 (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 33 pÅ«È¢`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 34 ÆD 35 (a) Äzzɺ¤hL 36 gipÒ}j 37 AÈÇjÉCãLÌ 38 ì \¦C±Ìpð¨æѺL̳ÛØKèðfÚ·é±ÆD 39 (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 40 ñ·é±ÆD 41 (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 42 Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 43 ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 44 RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 45 ÆÓ·é±ÆD 19 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 20 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 21 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 22 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 23 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 24 スコード中に含まれていること. 25 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 26 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 27 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 28 の無保証規定を掲載すること. 29 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 30 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 31 と. 32 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 33 作権表示,この利用条件および下記の無保証規定を掲載すること. 34 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 35 報告すること. 36 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 37 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 38 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 39 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 40 免責すること. 46 41 47 {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨48 æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI49 ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF50 AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»51 ÌÓCðíÈ¢D42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 46 の責任を負わない. 52 47 53 48 ---------------------------------------------------------------------- 54 49 55 TOPPERS/SSP J[l56 Release 1.2.1 ©ç 1.3.0 ÖÌÏX_50 TOPPERS/SSPカーネル 51 Release 1.2.1 から 1.3.0 への変更点 57 52 58 ET[rXR[ ista_alm, istp_alm ðÇÁ 59 Echar_t ^Ìp~ 60 EVAhCoÌÏX 61 Eserial_wri_dat, serial_rea_dat Ìr¼§äæÔÆr¼§äû@ÉÖ·éC³62 Eserial_wri_dat Ìobt@tÌ®ÉÖ·éC³63 Eserial_rea_dat Åobt@GveBÌ®ÉÖ·éC³64 EOMIT_INITIALIZE_EXCEPTION è`ÏÝÌêÉNG[ÆÈéâèÌC³ 53 ・サービスコール ista_alm, istp_alm を追加 54 ・char_t 型の廃止 55 ・シリアルドライバの変更 56 ・serial_wri_dat, serial_rea_dat の排他制御区間と排他制御方法に関する修正 57 ・serial_wri_dat のバッファフル時の挙動に関する修正 58 ・serial_rea_dat でバッファエンプティ時の挙動に関する修正 59 ・OMIT_INITIALIZE_EXCEPTION 定義済みの場合にリンクエラーとなる問題の修正 65 60 66 E(toppers-users 4235) ÌwEÖÌÎ(kernel.tf Ìsª$¼ãÌó²¯)67 E(toppers-users 4245)ÌwEÖÌÎ(ARMü¯gccIvVÌÇÁ)68 EüúnhCA[nhÌÅåÂð¦·\¬}NÌè` 69 Edoc/configurator.txt ̤LX^bNÉÖ·éLq~XÌC³D 70 Etask.c Ìd¡·évg^Cvé¾Ìí 71 El[t@CÌd¡GgÌí 72 Ecall_almhdr (alarm.c) ÌøÌ^ð uintptr_t ÖÏX 61 ・(toppers-users 4235) の指摘事項への対応(kernel.tf の行頭$直後の空白抜け) 62 ・(toppers-users 4245)の指摘事項への対応(ARM向けgccオプションの追加) 63 ・周期ハンドラ,アラームハンドラの最大個数を示す構成マクロの定義 64 ・doc/configurator.txt の共有スタックに関する記述ミスの修正. 65 ・task.c の重複するプロトタイプ宣言の削除 66 ・リネームファイルの重複エントリの削除 67 ・call_almhdr (alarm.c) の引数の型を uintptr_t へ変更 73 68 74 Esample1 Avɨ¯éVXeOÌ}XNÝèÉÖ·éC³(O^XNÌú»ÄÑoµÇÁ)75 Esample1.c Ì SVC }NÅsÔª³µ\¦³êÈ¢âèÌC³ 76 Ehello_world.c Ì task VA|[gÌI[vÌÇÁ 77 Ehello_world.c ÌbZ[W\¦p}NÌC³ 69 ・sample1 アプリにおけるシステムログのマスク設定に関する修正(ログタスクの初期化処理呼び出し追加) 70 ・sample1.c の SVC マクロで行番号が正しく表示されない問題の修正 71 ・hello_world.c の task シリアルポートのオープン処理の追加 72 ・hello_world.c のメッセージ表示用マクロの修正 78 73 79 Earm_m_gcc ^[QbgË¶Ì prc_terminate ÖÌ NoReturn ®«ÇÁ 80 Ecq_frk_fm3_gcc^[QbgË¶Ì hardware_init_hook (prc_support.S) É function ®«ÌÝèÇÁ 74 ・arm_m_gcc ターゲット依存部の prc_terminate への NoReturn 属性追加 75 ・cq_frk_fm3_gccターゲット依存部の hardware_init_hook (prc_support.S) に function 属性の設定追加 81 76 82 EMISRA-C[ÉîÏX 83 Eȵ®èÖÚöêÌtÁ84 Einitialize_eventflag Å[vÏ i Ì^ð uint_t ©ç int_t ÉÏX85 Esyslog_print Ì switch É default ßðÇÁD86 Eserial_initialize, serial_terminate Ì for¶Å[vJE^ÌÝðgp·éæ¤ÉÏX87 Eserial_rea_dat ÅÌÙÈé^ÖÌãüÓðC³88 Etarget_timer_handler ÅßèlðgpµÈ¢ÖÄÑoµðvoidÅLXgµ½D89 Esample1.c ÌforÌ{Ìð¡¶ÉÏXµCRgÇÁ77 ・MISRA-Cルールに基く変更 78 ・符号なし整数定数へ接尾語の付加 79 ・initialize_eventflag でループ変数 i の型を uint_t から int_t に変更 80 ・syslog_print の switch に default 節を追加. 81 ・serial_initialize, serial_terminate の for文でループカウンタのみを使用するように変更 82 ・serial_rea_dat で符号の異なる型への代入箇所を修正 83 ・target_timer_handler で戻り値を使用しない関数呼び出しをvoidでキャストした. 84 ・sample1.c のforの本体を複合文に変更し,コメント追加 90 85 91 ^[Qbg˶ÌvC³Ói1.2.1 ¨ 1.3.0j 86 ○ターゲット依存部の要修正箇所(1.2.1 → 1.3.0) 92 87 93 (1) char_t Ìp~ɺ¢Cchar_t ð char ÉÏX·é88 (1) char_t の廃止に伴い,char_t を char に変更する 94 89 95 90 ---------------------------------------------------------------------- 96 91 97 TOPPERS/SSP J[l98 Release 1.2.0 ©ç 1.2.1 ÖÌÏX_92 TOPPERS/SSPカーネル 93 Release 1.2.0 から 1.2.1 への変更点 99 94 100 ECRE_FLG Ì iflgptn Éηé`FbNÇÁ¨æÑG[ððÏX 101 ECxgtOÌrbgp^[Éηérbgè`ðÇÁ 102 Edequeue_dataÖÌø^w貯ÌC³ 103 E(toppers-users 4129)ÅwEÌC³ 104 Esample1 ÌC³ 105 Eenqueue_data, dequeue_data ð static Ö©çÊíÌÖÖÏX 106 EMakefile.kernel ÌC³ 107 Esample1 ÌAvÌྶðsample1.c ÌRgƵÄÇÁ 108 EVXeRtBM 109 [Vt@CÅ serial.cfg ð INCLUDE µÈ¢ 110 êÉ TARGET_NAME ª¢è`ÆÈéâèÌC³(banner.tf) 95 ・CRE_FLG の iflgptn に対するチェック追加およびエラー条件を変更 96 ・イベントフラグのビットパターンに対するビット数定義を追加 97 ・dequeue_data関数の引数型指定抜けの修正 98 ・(toppers-users 4129)で指摘事項の修正 99 ・sample1 の修正 100 ・enqueue_data, dequeue_data を static 関数から通常の関数へ変更 101 ・Makefile.kernel の修正 102 ・sample1 のアプリの説明文をsample1.c のコメントとして追加 103 ・システムコンフィギュレーションファイルで serial.cfg を INCLUDE しない 104 場合に TARGET_NAME が未定義となる問題の修正(banner.tf) 111 105 112 ^[Qbg˶ÌvC³Ói1.2.0 ¨ 1.2.1j 113 ^[Qbg˶ÖÌe¿ÍÈ¢½ßCC³ÍsvÅ éD106 ○ターゲット依存部の要修正箇所(1.2.0 → 1.2.1) 107 ターゲット依存部への影響はないため,修正は不要である. 114 108 115 109 ---------------------------------------------------------------------- 116 110 117 TOPPERS/SSP J[l118 Release 1.1.1 ©ç 1.2.0 ÖÌÏX_111 TOPPERS/SSPカーネル 112 Release 1.1.1 から 1.2.0 への変更点 119 113 120 E^XNN®vL 121 [COÌT|[g 122 ^XNN®vð1ñÜÅL 123 [CO·éæ¤ÉC³D 114 ・タスク起動要求キューイングのサポート 115 タスク起動要求を1回までキューイングするように修正. 124 116 125 EDEF_STKÌÇÁ 117 ・DEF_STKの追加 126 118 127 EDEF_ICSÌ@\C³ 119 ・DEF_ICSの機能修正 128 120 129 Eg£pbP[WÌÇÁ 130 - f[^L 131 [@\ 132 - CxgtO@\ 121 ・拡張パッケージの追加 122 - データキュー機能 123 - イベントフラグ機能 133 124 134 ETvvOÌC³ 135 - ^XNI¹ÌbZ[WoÍC³ 136 - f[^L 137 [ÌeXg@\ÌÇÁ 138 - CxgtOÌeXg@\ÌÇÁ 125 ・サンプルプログラムの修正 126 - タスク終了時のメッセージ出力修正 127 - データキューのテスト機能の追加 128 - イベントフラグのテスト機能の追加 139 129 140 130 141 ^[Qbg˶ÌvC³Ói1.1.1 ¨ 1.2.0j 131 ○ターゲット依存部の要修正箇所(1.1.1 → 1.2.0) 142 132 143 (1) TEST_EXC }NÌíɺ¢CCPUEXC1}NððRpCÉgp·éæ¤É144 ÏX·éD133 (1) TEST_EXCマクロの削除に伴い,CPUEXC1マクロを条件コンパイルに使用するように 134 変更する. 145 135 146 (2) TvvOÉdataqueue.cCeventflag.cðrhÎÛÉÜßéæ¤ÉÏXD147 (Makefile ðgpµÈ¢^[Qbg˶ÌÝ)136 (2) サンプルプログラムにdataqueue.c,eventflag.cをビルド対象に含めるように変更. 137 (Makefileを使用しないターゲット依存部のみ) 148 138 149 (3) ³À[vÌÀû@ðiTOPPERS_assert_abortCtarget_exitÈÇjtecsgenÅ150 ðßÅ«éLqû@ÉÏX·éD139 (3) 無限ループの実装方法を(TOPPERS_assert_abort,target_exitなど)tecsgenで 140 解釈できる記述方法に変更する. 151 141 152 142 ---------------------------------------------------------------------- 153 143 154 TOPPERS/SSP J[l155 Release 1.1.0 ©ç 1.1.1 ÖÌÏX_144 TOPPERS/SSPカーネル 145 Release 1.1.0 から 1.1.1 への変更点 156 146 157 EJ[lo[W}NÌC³ 158 (Release1.1.0 ÅÍJ[lo[W}NÌlÉëèª Á½j147 ・カーネルバージョンマクロの修正 148 (Release1.1.0ではカーネルバージョンマクロの値に誤りがあった) 159 149 160 EÀsDæxðÝèµÄ¢é^XNªact_tsk(TSK_SELF)ðÄÑoµ½êÌ 161 sïÌC³150 ・実行時優先度を設定しているタスクがact_tsk(TSK_SELF)を呼び出した場合の 151 不具合の修正 162 152 163 E\[XR[hÌt@N^O 164 - task.c/h ÖÌRgÇÁAÁÉúDæxÆÀsDæxÌá¢Ì¾mj»153 ・ソースコードのリファクタリング 154 - task.c/hへのコメント追加、特に初期優先度と実行時優先度の違いの明確j化 165 155 166 EDEF_EPRICDEF_ICSÌdlè`ðÇÁ(doc/original_static_api.txt)167 ( ½¾µTOPPERSdl1.4.0ÆÌêÑ«ÍÈ¢½ßÓj156 ・DEF_EPRI,DEF_ICSの仕様定義を追加(doc/original_static_api.txt) 157 (ただしTOPPERS統合仕様書1.4.0との一貫性はないため注意) 168 158 169 EVXeT[rXÌÇÁ 170 - syslog @\171 - O\¦^XN@\159 ・システムサービスの追加 160 - syslog機能 161 - ログ表示タスク機能 172 162 173 Esvt@CÌí 174 - utils fBNgȺÌsvÈXNvgÌí175 - confkernel XNvgÉÖAµ½t@CÌí163 ・不要ファイルの削除 164 - utilsディレクトリ以下の不要なスクリプトの削除 165 - confkernelスクリプトに関連したファイルの削除 176 166 177 EutilsfBNgÌXNvgÌC³ 178 - vV[WÄÑoµÌÛÌdo¶Ìí167 ・utilsディレクトリのスクリプトの修正 168 - プロシージャ呼び出しの際のdo文の削除 179 169 180 ETvvOÌ@\ÇÁ 181 - A[nhÌeXg@\ÌÇÁ182 - ObZ[Wðsyslog@\ðgpµÄoÍ·éæ¤ÉC³170 ・サンプルプログラムの機能追加 171 - アラームハンドラのテスト機能の追加 172 - ログメッセージをsyslog機能を使用して出力するように修正 183 173 184 174 185 175 ---------------------------------------------------------------------- 186 176 187 TOPPERS/SSP J[l188 Release 1.0.0 ©ç 1.1.0 ÖÌÏX_177 TOPPERS/SSPカーネル 178 Release 1.0.0 から 1.1.0 への変更点 189 179 190 EeXgvOÌÇÁ 180 ・テストプログラムの追加 191 181 192 EÝT[rX[`ÉÖ·éoOtBbNX 193 - ÝT[rX[`¶¬ÉKvÈ^[Qbg˶Ìè`ªÈ©Á½âèÌC³194 (x_get_ipm, t_get_ipm, i_get_ipm, x_set_ipm, t_set_ipm, i_set_ipm ÌÇÁj182 ・割込みサービスルーチンに関するバグフィックス 183 - 割込みサービスルーチン生成に必要なターゲット依存部の定義がなかった問題の修正 184 (x_get_ipm, t_get_ipm, i_get_ipm, x_set_ipm, t_set_ipm, i_set_ipmの追加) 195 185 196 EMISRA-CR[fBOX^_[hÉηé½ßÌR[hC³ 186 ・MISRA-Cコーディングスタンダードに対応するためのコード修正 197 187 198 E^[Qbg˶ÆÌC^[tF[XC³ 199 - TOPPERS_SUPPORT_DIS_INT ðTOPPERS_TARGET_SUPPORT_DIS_INTÉC³200 - TOPPERS_SUPPORT_ENA_INT ðTOPPERS_TARGET_SUPPORT_ENA_INTÉC³188 ・ターゲット依存部とのインターフェース修正 189 - TOPPERS_SUPPORT_DIS_INTをTOPPERS_TARGET_SUPPORT_DIS_INTに修正 190 - TOPPERS_SUPPORT_ENA_INTをTOPPERS_TARGET_SUPPORT_ENA_INTに修正 201 191 202 192 -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.