Changeset 95 for ssp_qb_r5f100le_cs/trunk/doc/configurator.txt
- Timestamp:
- Jun 2, 2015, 3:39:53 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ssp_qb_r5f100le_cs/trunk/doc/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
Note:
See TracChangeset
for help on using the changeset viewer.