Changeset 315 for rubycfg_asp/trunk/asp_dcre/doc/porting.txt
- Timestamp:
- Jul 23, 2017, 2:29:40 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
rubycfg_asp/trunk/asp_dcre/doc/porting.txt
-
Property svn:mime-type
changed from
text/plain
totext/plane; charset=UTF-8
r313 r315 1 1 2 TOPPERS/ASPã«ã¼ãã« 3 ã¿ã¼ã²ããä¾åé¨ ãã¼ãã£ã³ã°ã¬ã¤ã 4 5 対å¿ãã¼ã¸ã§ã³: Release 1.9.3 6 æçµæ´æ°: 2014å¹´11æ17æ¥ 7 8 ãã®ããã¥ã¡ã³ãã¯ï¼TOPPERS/ASPã«ã¼ãã«ãï¼æªãµãã¼ãã®ã¿ã¼ã²ããã·ã¹ã 9 ã ã«ãã¼ãã£ã³ã°ããããã«å¿ 10 è¦ã¨ãªãã¿ã¼ã²ããä¾åé¨ã®å®è£ 11 æ¹æ³ã説æã 12 ããã®ã§ããï¼ 2 TOPPERS/ASPカーネル 3 ターゲット依存部 ポーティングガイド 4 5 対応バージョン: Release 1.9.3 6 最終更新: 2014年11月17日 7 8 このドキュメントは,TOPPERS/ASPカーネルを,未サポートのターゲットシステ 9 ムにポーティングするために必要となるターゲット依存部の実装方法を説明す 10 るものである. 13 11 14 12 ---------------------------------------------------------------------- … … 20 18 Graduate School of Information Science, Nagoya Univ., JAPAN 21 19 22 ä¸è¨èä½æ¨©è 23 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 24 ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 25 å¤ã»åé 26 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 27 (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 28 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 29 ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 30 (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 31 ç¨ã§ããå½¢ã§åé 32 å¸ããå ´åã«ã¯ï¼åé 33 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 34 è 35 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 36 ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 37 (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 38 ç¨ã§ããªãå½¢ã§åé 39 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 40 ã¨ï¼ 41 (a) åé 42 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 43 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 44 ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 45 (b) åé 46 å¸ã®å½¢æ 47 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 48 å ±åãããã¨ï¼ 49 (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 50 害ãããï¼ä¸è¨èä½æ¨©è 51 ããã³TOPPERSããã¸ã§ã¯ããå 52 責ãããã¨ï¼ 53 ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 54 ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 55 ããã³TOPPERSããã¸ã§ã¯ãã 56 å 57 責ãããã¨ï¼ 20 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 21 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 22 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 23 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 24 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 25 スコード中に含まれていること. 26 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 27 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 28 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 29 の無保証規定を掲載すること. 30 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 31 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 32 と. 33 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 34 作権表示,この利用条件および下記の無保証規定を掲載すること. 35 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 36 報告すること. 37 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 38 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 39 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 40 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 41 免責すること. 58 42 59 æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 60 ã 61 ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 62 ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 63 ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 64 ã®è²¬ä»»ãè² ããªãï¼ 43 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 44 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 45 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 46 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 47 の責任を負わない. 65 48 66 49 $Id$ 67 50 ---------------------------------------------------------------------- 68 51 69 âç®æ¬¡ 70 71 ï¼ï¼å 72 ±éäºé 73 74 1.1 ã¿ã¼ã²ããä¾åé¨ã®æ§æ 75 1.2 ååã®è¡çªã®é²æ¢ 76 1.3 å¤éã¤ã³ã¯ã«ã¼ãã®é²æ¢ 77 1.4 ã¢ã»ã³ããªè¨èªã¨ã®ããããã¡ã¤ã«ã®å 78 ±ç¨ 79 1.5 ã¤ã³ã¯ã«ã¼ãè¨è¿°ã®æ¹æ³ 80 1.6 ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 81 ¥å¦çã®å®ç¾ã«é¢ããå¶ç´ 82 ï¼ï¼ã·ã¹ãã æ§ç¯ç°å¢ã®ã¿ã¼ã²ããä¾åé¨ 83 2.1 ã¿ã¼ã²ããç¥ç§°ã¨ã¿ã¼ã²ããä¾åé¨ã®ãã£ã¬ã¯ã㪠84 2.2 Makefileã®ã¿ã¼ã²ããä¾åé¨ 85 2.3 éçºç°å¢åã¨ã³ãã³ãåã®è¨å® 86 2.4 ã³ã³ãã¤ã«ãªãã·ã§ã³ã¨ãªãã¸ã§ã¯ããã¡ã¤ã«ã®è¨å® 87 2.5 ãªãã»ãããã¡ã¤ã«ã®çææ¹æ³ 88 2.5.1 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãç¨ããæ¹æ³ 89 2.5.2 makeoffset.cã¨genoffsetãç¨ããæ¹æ³ 90 2.6 ãªã³ã¯æ¹æ³ã®è¨å® 91 2.7 ä¾åé¢ä¿ã®å®ç¾© 92 2.8 ãã®ä»ã®è¨å® 93 ï¼ï¼TOPPERSå 94 ±éå®ç¾©ã®ã¿ã¼ã²ããä¾åé¨ 95 3.1 ã¿ã¼ã²ããèå¥ãã¯ã 96 3.2 æ´æ°åã®æ大å¤ã»æå°å¤ã»ãããæ° 97 3.3 ãµã¤ãºã®æå®ãããæ´æ°åï¼ãã®æ大å¤ã»æå°å¤ï¼æ´æ°å®æ°ãä½ããã¯ã 98 3.4 ãµã¤ãºã®æå®ãããæµ®åå°æ°ç¹åï¼ãã®æ大å¤ã»æå°å¤ã®ãã¯ã 99 3.5 ã³ã³ãã¤ã©ã®æ¡å¼µæ©è½ã®ããã®ãã¯ãå®ç¾© 100 3.6 æ¨æºçãªå®ç¾©ã®ä¸æ¸ã 101 3.7 ã¢ãµã¼ã·ã§ã³ã®ããã®å®ç¾© 102 ï¼ï¼ã·ã¹ãã ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¤ã¤ï¼SILï¼ã®ã¿ã¼ã²ããä¾åé¨ 103 4.1 å 104 ¨å²è¾¼ã¿ããã¯ç¶æ 105 ã®ç®¡ç 106 4.2 å¾®å°æéå¾ 107 ã¡ 108 4.3 ããã»ããµã®ã¨ã³ãã£ã¢ã³ 109 4.4 ã¡ã¢ãªç©ºéã¢ã¯ã»ã¹é¢æ° 110 4.5 I/O空éã¢ã¯ã»ã¹é¢æ° 111 ï¼ï¼ã«ã¼ãã«APIã®ã¿ã¼ã²ããä¾åé¨ 112 5.1 ã¿ã¼ã²ããå®ç¾©ã§ãµãã¼ãããæ©è½ 113 5.2 å²è¾¼ã¿åªå 114 度ã®ç¯å² 115 5.3 ã¿ã¤ã ãã£ãã¯ã®å®ç¾© 116 5.4 ã¡ã¢ãªé å確ä¿ã®ããã®åå®ç¾© 117 5.5 ããããã¿ã¼ã³ã®ãããæ° 118 5.6 ã¡ã¢ãªé å確ä¿ã®ããã®ãã¯ã 119 5.7 ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µã®ããã®å®ç¾©ï¼ãªãã·ã§ã³ï¼ 120 ï¼ï¼ã«ã¼ãã«å®è£ 121 ã®ã¿ã¼ã²ããä¾åé¨ 122 6.1 ã«ã¼ãã«å®è£ 123 ã®ã¿ã¼ã²ããä¾åé¨ã®å 124 ±éäºé 125 126 6.1.1 ã«ã¼ãã«å®è£ 127 ã®ã¿ã¼ã²ããä¾åé¨ã®æ§æè¦ç´ 128 6.1.2 ã¿ã¼ã²ããä¾åé¨ã®é¢æ°ã®å½åè¦å 129 6.2 ãã¬ã¼ã¹ãã°æ©è½ã¸ã®å¯¾å¿ 130 6.3 ã·ã¹ãã ç¶æ 131 ã®ç®¡ç 132 6.3.1 å 133 ¨å²è¾¼ã¿ããã¯ç¶æ 134 ã®ç®¡ç 135 6.3.2 ã³ã³ããã¹ãã®ç®¡ç 136 6.3.3 CPUããã¯ç¶æ 137 ã®ç®¡ç 138 6.4 å²è¾¼ã¿ã«é¢é£ããã·ã¹ãã ç¶æ 139 ã®ç®¡ç 140 6.4.1 å²è¾¼ã¿åªå 141 度ãã¹ã¯ã®ç®¡ç 142 6.4.2 å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ã®ç®¡ç 143 6.4.3 å²è¾¼ã¿è¦æ±ã®ã¯ãªã¢ 144 6.4.4 å²è¾¼ã¿è¦æ±ã®ããã¼ã 145 6.4.5 å²è¾¼ã¿ãã³ãã©ã®å 146 é å¦çã¨æ«å°¾å¦ç 147 6.5 ã¿ã¹ã¯ãã£ã¹ããã㣠148 6.5.1 ã¿ã¹ã¯ã³ã³ããã¹ããããã¯ã¨ã¿ã¹ã¯åæåã³ã³ããã¹ãããã㯠149 6.5.2 ãã£ã¹ãããã£æ¬ä½ 150 6.5.3 ã¿ã¹ã¯ã³ã³ããã¹ãããã®ãã£ã¹ããã 151 6.5.4 ãã£ã¹ãããã£ã®åä½éå§ 152 6.5.5 ç¾å¨ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã£ã¹ããã 153 6.5.6 ã¿ã¹ã¯ã®èµ·åå¦ç 154 6.6 å²è¾¼ã¿ãã³ãã© 155 6.6.1 å²è¾¼ã¿ãã³ãã©ã®åºå 156 ¥å£å¦ç 157 6.6.2 å²è¾¼ã¿ãã³ãã©æ¯ã®åºå 158 ¥å£å¦çã®çæ 159 6.6.3 å²è¾¼ã¿ãã³ãã©ã®è¨å® 160 6.6.4 å²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å® 161 6.6.5 å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çã®å¤æ´ 162 6.6.6 ããã©ã«ãã®å²è¾¼ã¿ãã³ãã© 163 6.6.7 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ 164 6.6.8 å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã®çæ 165 6.7 CPUä¾å¤ãã³ãã©ã¨CPUä¾å¤çºçæã®ã·ã¹ãã ç¶æ 166 ã®åç 167 § 168 6.7.1 CPUä¾å¤ãã³ãã©ã®åºå 169 ¥å£å¦ç 170 6.7.2 CPUä¾å¤ãã³ãã©ã®åºå 171 ¥å£å¦çã®çæ 172 6.7.3 CPUä¾å¤ãã³ãã©ã®è¨å® 173 6.7.4 CPUä¾å¤ç®¡çæ©è½ã®åæåå¦çã®å¤æ´ 174 6.7.5 ããã©ã«ãã®CPUä¾å¤ãã³ãã© 175 6.7.6 CPUä¾å¤çºçæã®ã·ã¹ãã ç¶æ 176 ã®åç 177 § 178 6.8 ã«ã¼ãã«ã®èµ·åã»çµäºã¨ã¹ã¿ãã¯é åãªã© 179 6.9 ã«ã¼ãã«å 180 é¨ã®ãã¥ã¼ãã³ã° 181 6.9.1 ãããããããµã¼ã 182 6.9.2 ããããã£ã¼ã«ã 183 6.10 ã«ã¼ãã«å®è£ 184 ã«é¢ãããã®ä»ã®å®ç¾© 185 6.10.1 ãªãã¸ã§ã¯ãå±æ§ã®æ¡å¼µ 186 6.10.2 ã¨ã©ã¼ãã§ãã¯æ¹æ³ã®æå® 187 6.10.3 éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯é å 188 6.10.4 空ã©ãã«ã®å®ç¾© 189 6.11 ãã¬ã¼ã¹ãã°æ©è½ã«é¢ããè¨å® 190 6.11.1 åå¾ã§ãããã¬ã¼ã¹ãã°ã®ç¨®é¡ã¨ãã¯ã 191 6.11.2 ãã¬ã¼ã¹ãã°è¨é²ã®ãµã³ãã«ã³ã¼ã 192 6.12 ã«ã¼ãã«å®è£ 193 ã®ã¿ã¼ã²ããä¾åé¨ã®ããã®ãªãã¼ã è¨è¿° 194 6.13 ã¿ã¤ããã©ã¤ã 195 6.13.1 ã¿ã¤ããã©ã¤ãã®ãã¡ã¤ã«æ§æ 196 6.13.2 ã¿ã¤ãã®åæåã»çµäºå¦çã»å²è¾¼ã¿å¦ç 197 6.13.3 æ§è½è©ä¾¡ç¨ã·ã¹ãã æå»ã®åç 198 §ã®ããã®æ©è½ 199 6.14 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãï¼ãªãã·ã§ã³ï¼ 200 6.14.1 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã®ãã¡ã¤ã«æ§æ 201 6.14.2 ãªã¼ãã©ã³ã¿ã¤ãã®æä½ã¨å²è¾¼ã¿å¦ç 202 6.15 åçã¡ã¢ãªç®¡çï¼ãªãã·ã§ã³ï¼ 203 6.15.1 TLSFãç¨ããã¡ã¢ãªç®¡çã¢ã¸ã¥ã¼ã«ã®ä¾ 204 ï¼ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿è¨å®ãã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ 205 7.1 è¨å®ãã¡ã¤ã«ã¨ã¿ã¼ã²ããä¾åé¨ã®ä½ç½®ä»ã 206 7.2 ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ 207 7.2.1 ã¿ã¼ã²ããéä¾åé¨ãã¤ã³ã¯ã«ã¼ãããåã«å®ç¾©ãã¹ãå¤æ° 208 7.2.2 ã¿ã¼ã²ããéä¾åé¨ã§å®ç¾©ãããå¤æ° 209 7.3 ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ 210 7.3.1 ã¿ã¼ã²ããéä¾åé¨ãã¤ã³ã¯ã«ã¼ãããåã«å®ç¾©ãã¹ãå¤æ° 211 7.3.2 ã¿ã¼ã²ããä¾åé¨ã§è¡ãã¹ãã¨ã©ã¼ãã§ã㯠212 7.4 cfg1_out.cã®ãªã³ã¯ã«å¿ 213 è¦ãªã¹ã¿ãã®å®ç¾©ãã¡ã¤ã« 214 ï¼ï¼ã·ã¹ãã ãµã¼ãã¹çã®ã¿ã¼ã²ããä¾åé¨ 215 8.0 ã·ã¹ãã ãµã¼ãã¹ã®ã¿ã¼ã²ããä¾åé¨ 216 8.1 ã·ã¹ãã ãã°æ©è½ã®ã¿ã¼ã²ããä¾åå®ç¾© 217 8.2 ãã°ã¿ã¹ã¯ã®ã¿ã¼ã²ããä¾åå®ç¾© 218 8.3 ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã®ã¿ã¼ã²ããä¾åé¨ 219 8.3.1 å¤æ°ï¼ãã¼ã¿åï¼ç®¡çé¢æ° 220 8.3.2 ããã¤ã¹ãµã¼ãã¹ã«ã¼ãã³ 221 8.3.3 ã³ã¼ã«ããã¯ã«ã¼ãã³ 222 8.4 ã«ã¼ãã«èµ·åã¡ãã»ã¼ã¸ã®åºåã®ã¿ã¼ã²ããä¾åå®ç¾© 223 8.5 ãµã³ãã«ããã°ã©ã ã¨ãã¹ãããã°ã©ã ã®ã¿ã¼ã²ããä¾åå®ç¾© 224 8.6 å®è¡æéåå¸éè¨ã¢ã¸ã¥ã¼ã«ã®ã¿ã¼ã²ããä¾åå®ç¾© 225 ï¼ï¼ãã®ä» 226 9.1 ããã¥ã¡ã³ã 227 9.2 ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã« 228 ï¼ï¼ï¼ãªãã¡ã¬ã³ã¹ 229 10.1 ã¿ã¼ã²ããä¾åé¨ã®ãã¡ã¤ã«ä¸è¦§ 230 231 232 ï¼ï¼å 233 ±éäºé 234 235 236 1.1 ã¿ã¼ã²ããä¾åé¨ã®æ§æ 237 238 ã¿ã¼ã²ããä¾åé¨ã¯ï¼targetãã£ã¬ã¯ããªã®ä¸ã«ï¼ã¿ã¼ã²ãããã¼ãã¦ã§ã¢ã¨ 239 éçºç°å¢ã®çµã¿åããæ¯ã«ç¨æããï¼ãã ãï¼ã¿ã¼ã²ããä¾åé¨ã®åå©ç¨æ§ã 240 èæ 241 ®ãï¼ããã»ããµï¼ãããï¼éçºç°å¢ã®ã¿ã«ä¾åããé¨åãï¼ããã»ããµä¾ 242 åé¨ï¼ãããä¾åé¨ï¼éçºç°å¢ä¾åé¨ã¨ããå½¢ã§åãåãã¦ãããï¼åãåã 243 æ¹ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã®å®è£ 244 ã«ä»»ããã¦ããï¼ããã»ããµä¾åé¨ï¼ãããä¾ 245 åé¨ï¼éçºç°å¢ä¾åé¨ã¯ï¼archãã£ã¬ã¯ããªã®ä¸ã«ç½®ãï¼ 246 247 ASPã«ã¼ãã«ã®ã¿ã¼ã²ããä¾åé¨ã¯ï¼ã·ã¹ãã æ§ç¯ç°å¢ï¼Makefileçï¼ã®ã¿ã¼ã²ã 248 ãä¾åé¨ï¼TOPPERSå 249 ±éå®ç¾©ï¼t_stddef.hï¼ã®ã¿ã¼ã²ããä¾åé¨ï¼ã·ã¹ãã ã¤ã³ 250 ã¿ãã§ã¼ã¹ã¬ã¤ã¤ï¼SILï¼sil.hï¼ã®ã¿ã¼ã²ããä¾åé¨ï¼ã«ã¼ãã«APIï¼kernel.hï¼ 251 ã®ã¿ã¼ã²ããä¾åé¨ï¼ã«ã¼ãã«å®è£ 252 ã®ã¿ã¼ã²ããä¾åé¨ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ 253 è¨å®ãã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ãå«ãï¼ï¼ã·ã¹ãã ãµã¼ãã¹ã®ã¿ã¼ã²ããä¾ 254 åé¨ï¼ã¿ã¼ã²ããä¾åé¨ã«é¢ããããã¥ã¡ã³ãçã§æ§æãããï¼ 255 256 1.2 ååã®è¡çªã®é²æ¢ 257 258 TOPPERSããã¸ã§ã¯ããæä¾ããã½ããã¦ã§ã¢ã®ããã«ï¼TOPPERS_ã§å§ã¾ãã·ã³ 259 ãã«ãäºç´ãã¦ããï¼ããããã¡ã¤ã«ä¸ã«è¨è¿°ããï¼ã¢ããªã±ã¼ã·ã§ã³ããå 260 ç 261 §ã§ããå 262 é¨ã·ã³ãã«ã¯ï¼TOPPERS_ã§å§ã¾ãååã¨ããï¼ 263 264 ã¾ãï¼_kernel_ã§å§ã¾ãã·ã³ãã«ã¯ï¼ã«ã¼ãã«å 265 é¨ã®å¤æ°ãé¢æ°ã®ããã«äºç´ 266 ãã¦ããï¼ã«ã¼ãã«å 267 é¨ã®å¤æ°ãé¢æ°ã®ååã§ï¼ãªã³ã¯æã«ã¢ããªã±ã¼ã·ã§ã³ 268 ã®ååã¨è¡çªããå¯è½æ§ããããã®ã¯ï¼ãªãã¼ã è¨è¿°ã«ãªã¹ãã¢ããããã㨠269 ã§ï¼ã³ã³ãã¤ã«æã«_kernel_ã§å§ã¾ãååã«ç½®ãæãããã¨ã¨ãã¦ããï¼ 270 271 1.3 å¤éã¤ã³ã¯ã«ã¼ãã®é²æ¢ 272 273 ãã¹ã¦ã®ããããã¡ã¤ã«ã¯ï¼å¤éã«ã¤ã³ã¯ã«ã¼ããããã®ãé²æ¢ããããã®æ¡ 274 件ã³ã³ãã¤ã«è¨è¿°ãå 275 ¥ãããã¨ã¨ããï¼ä¾ãã°ï¼target_config.hã§ããã°ï¼ãã¡ 276 ã¤ã«ã®å 277 é ã« 52 ○目次 53 54 1.共通事項 55 1.1 ターゲット依存部の構成 56 1.2 名前の衝突の防止 57 1.3 多重インクルードの防止 58 1.4 アセンブリ言語とのヘッダファイルの共用 59 1.5 インクルード記述の方法 60 1.6 クリティカルセクションの出入処理の実現に関する制約 61 2.システム構築環境のターゲット依存部 62 2.1 ターゲット略称とターゲット依存部のディレクトリ 63 2.2 Makefileのターゲット依存部 64 2.3 開発環境名とコマンド名の設定 65 2.4 コンパイルオプションとオブジェクトファイルの設定 66 2.5 オフセットファイルの生成方法 67 2.5.1 コンフィギュレータを用いる方法 68 2.5.2 makeoffset.cとgenoffsetを用いる方法 69 2.6 リンク方法の設定 70 2.7 依存関係の定義 71 2.8 その他の設定 72 3.TOPPERS共通定義のターゲット依存部 73 3.1 ターゲット識別マクロ 74 3.2 整数型の最大値・最小値・ビット数 75 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ 76 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ 77 3.5 コンパイラの拡張機能のためのマクロ定義 78 3.6 標準的な定義の上書き 79 3.7 アサーションのための定義 80 4.システムインタフェースレイヤ(SIL)のターゲット依存部 81 4.1 全割込みロック状態の管理 82 4.2 微少時間待ち 83 4.3 プロセッサのエンディアン 84 4.4 メモリ空間アクセス関数 85 4.5 I/O空間アクセス関数 86 5.カーネルAPIのターゲット依存部 87 5.1 ターゲット定義でサポートする機能 88 5.2 割込み優先度の範囲 89 5.3 タイムティックの定義 90 5.4 メモリ領域確保のための型定義 91 5.5 ビットパターンのビット数 92 5.6 メモリ領域確保のためのマクロ 93 5.7 オーバランハンドラ機能拡張のための定義(オプション) 94 6.カーネル実装のターゲット依存部 95 6.1 カーネル実装のターゲット依存部の共通事項 96 6.1.1 カーネル実装のターゲット依存部の構成要素 97 6.1.2 ターゲット依存部の関数の命名規則 98 6.2 トレースログ機能への対応 99 6.3 システム状態の管理 100 6.3.1 全割込みロック状態の管理 101 6.3.2 コンテキストの管理 102 6.3.3 CPUロック状態の管理 103 6.4 割込みに関連するシステム状態の管理 104 6.4.1 割込み優先度マスクの管理 105 6.4.2 割込み要求禁止フラグの管理 106 6.4.3 割込み要求のクリア 107 6.4.4 割込み要求のプローブ 108 6.4.5 割込みハンドラの先頭処理と末尾処理 109 6.5 タスクディスパッチャ 110 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック 111 6.5.2 ディスパッチャ本体 112 6.5.3 タスクコンテキストからのディスパッチ 113 6.5.4 ディスパッチャの動作開始 114 6.5.5 現在のコンテキストを捨ててディスパッチ 115 6.5.6 タスクの起動処理 116 6.6 割込みハンドラ 117 6.6.1 割込みハンドラの出入口処理 118 6.6.2 割込みハンドラ毎の出入口処理の生成 119 6.6.3 割込みハンドラの設定 120 6.6.4 割込み要求ラインの属性の設定 121 6.6.5 割込み管理機能の初期化処理の変更 122 6.6.6 デフォルトの割込みハンドラ 123 6.6.7 カーネル管理外の割込み 124 6.6.8 割込みサービスルーチンの生成 125 6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照 126 6.7.1 CPU例外ハンドラの出入口処理 127 6.7.2 CPU例外ハンドラの出入口処理の生成 128 6.7.3 CPU例外ハンドラの設定 129 6.7.4 CPU例外管理機能の初期化処理の変更 130 6.7.5 デフォルトのCPU例外ハンドラ 131 6.7.6 CPU例外発生時のシステム状態の参照 132 6.8 カーネルの起動・終了とスタック領域など 133 6.9 カーネル内部のチューニング 134 6.9.1 ビットマップサーチ 135 6.9.2 ビットフィールド 136 6.10 カーネル実装に関するその他の定義 137 6.10.1 オブジェクト属性の拡張 138 6.10.2 エラーチェック方法の指定 139 6.10.3 非タスクコンテキスト用のスタック領域 140 6.10.4 空ラベルの定義 141 6.11 トレースログ機能に関する設定 142 6.11.1 取得できるトレースログの種類とマクロ 143 6.11.2 トレースログ記録のサンプルコード 144 6.12 カーネル実装のターゲット依存部のためのリネーム記述 145 6.13 タイマドライバ 146 6.13.1 タイマドライバのファイル構成 147 6.13.2 タイマの初期化・終了処理・割込み処理 148 6.13.3 性能評価用システム時刻の参照のための機能 149 6.14 オーバランタイマドライバ(オプション) 150 6.14.1 オーバランタイマドライバのファイル構成 151 6.14.2 オーバランタイマの操作と割込み処理 152 6.15 動的メモリ管理(オプション) 153 6.15.1 TLSFを用いたメモリ管理モジュールの例 154 7.コンフィギュレータ設定ファイルのターゲット依存部 155 7.1 設定ファイルとターゲット依存部の位置付け 156 7.2 パス2のテンプレートファイルのターゲット依存部 157 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数 158 7.2.2 ターゲット非依存部で定義される変数 159 7.3 パス3のテンプレートファイルのターゲット依存部 160 7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数 161 7.3.2 ターゲット依存部で行うべきエラーチェック 162 7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル 163 8.システムサービス等のターゲット依存部 164 8.0 システムサービスのターゲット依存部 165 8.1 システムログ機能のターゲット依存定義 166 8.2 ログタスクのターゲット依存定義 167 8.3 シリアルインタフェースドライバのターゲット依存部 168 8.3.1 変数,データ型,管理関数 169 8.3.2 デバイスサービスルーチン 170 8.3.3 コールバックルーチン 171 8.4 カーネル起動メッセージの出力のターゲット依存定義 172 8.5 サンプルプログラムとテストプログラムのターゲット依存定義 173 8.6 実行時間分布集計モジュールのターゲット依存定義 174 9.その他 175 9.1 ドキュメント 176 9.2 パッケージ記述ファイル 177 10.リファレンス 178 10.1 ターゲット依存部のファイル一覧 179 180 181 1.共通事項 182 183 1.1 ターゲット依存部の構成 184 185 ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと 186 開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を 187 考慮し,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依 188 存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け 189 方は,ターゲット依存部の実装に任されている.プロセッサ依存部,チップ依 190 存部,開発環境依存部は,archディレクトリの下に置く. 191 192 ASPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ 193 ト依存部,TOPPERS共通定義(t_stddef.h)のターゲット依存部,システムイン 194 タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h) 195 のターゲット依存部,カーネル実装のターゲット依存部(コンフィギュレータ 196 設定ファイルのターゲット依存部を含む),システムサービスのターゲット依 197 存部,ターゲット依存部に関するドキュメント等で構成される. 198 199 1.2 名前の衝突の防止 200 201 TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン 202 ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参 203 照できる内部シンボルは,TOPPERS_で始まる名前とする. 204 205 また,_kernel_で始まるシンボルは,カーネル内部の変数や関数のために予約 206 している.カーネル内部の変数や関数の名前で,リンク時にアプリケーション 207 の名前と衝突する可能性があるものは,リネーム記述にリストアップすること 208 で,コンパイル時に_kernel_で始まる名前に置き換えることとしている. 209 210 1.3 多重インクルードの防止 211 212 すべてのヘッダファイルは,多重にインクルードされるのを防止するための条 213 件コンパイル記述を入れることとする.例えば,target_config.hであれば,ファ 214 イルの先頭に 278 215 279 216 #ifndef TOPPERS_TARGET_CONFIG_H 280 217 #define TOPPERS_TARGET_CONFIG_H 281 218 282 ãï¼ãã¡ã¤ã«ã®æ«å°¾ã« 219 を,ファイルの末尾に 283 220 284 221 #endif /* TOPPERS_TARGET_CONFIG_H */ 285 222 286 ãè¨è¿°ããï¼ 287 288 1.4 ã¢ã»ã³ããªè¨èªã¨ã®ããããã¡ã¤ã«ã®å 289 ±ç¨ 290 291 ASPã«ã¼ãã«ã®ããããã¡ã¤ã«ã®å¤ãã¯ï¼ã¢ã»ã³ããªè¨èªã®ã½ã¼ã¹ãã¡ã¤ã«ãã 292 ãã¤ã³ã¯ã«ã¼ãã§ããããã«ããããã«ï¼æ¬¡ã®ã«ã¼ã«ã«å¾ã£ã¦è¨è¿°ãããã®ã¨ 293 ããï¼ 294 295 ã»TOPPERS_MACRO_ONLYããã¯ãå®ç¾©ããã¦ããå ´åã«ã¯ï¼ã¢ã»ã³ããªè¨èªã§ã¯ 296 ã解éã§ããªãè¨è¿°ï¼ãã¯ãå®ç¾©ä»¥å¤ã®è¨è¿°ï¼ãé¤ãããã«è¨è¿°ããï¼ 297 298 ã»ç¬¦å·ç¡ãæ´æ°åã®å®æ°å¤ã¯ï¼UINT_CãULONG_Cãªã©ã®æ´æ°å®æ°ãä½ãããã®ã 299 ãã¯ããç¨ãã¦è¨è¿°ããï¼ãã ãï¼ã¢ã»ã³ããªè¨èªã®ã½ã¼ã¹ãã¡ã¤ã«ããã㤠300 ãã³ã¯ã«ã¼ãã§ãããã¡ã¤ã«ä¸ã§ãã£ã¦ãï¼Cè¨èªã®ã¿ã§ç¨ããå®æ°ããããã® 301 ããã¯ãã使ã£ã¦è¨è¿°ããå¿ 302 è¦ã¯ãªãï¼ 303 304 ã¾ãï¼ã«ã¼ãã«å®è£ 305 ã«ããã¦ã¯ï¼æ¬¡ã®ã«ã¼ã«ã«å¾ããã®ã¨ããï¼ 306 307 ã»ã¢ã»ã³ããªè¨èªãããç¨ããå®æ°ã®å®ç¾©ä¸ã«åãã£ã¹ããç¨ããå ´åã«ã¯ï¼ 308 ãCASTãã¯ããç¨ãã¦è¨è¿°ããï¼ 309 310 ã¢ã»ã³ããªè¨èªããããããã¡ã¤ã«ãã¤ã³ã¯ã«ã¼ãããéã«ã¯ï¼å¿ 311 è¦ã«å¿ãã¦ï¼ 312 TOPPERS_MACRO_ONLYï¼UINC_Cï¼ULONG_Cï¼CASTããã¯ãå®ç¾©ãã¦ããï¼ã¤ã³ã¯ã«ã¼ 313 ãããªããã°ãªããªãï¼ 314 315 1.5 ã¤ã³ã¯ã«ã¼ãè¨è¿°ã®æ¹æ³ 316 317 éçºç°å¢ã§ç¨æããã¦ããæ¨æºããããã¡ã¤ã«ããã³includeãã£ã¬ã¯ããªä¸ã® 318 æ¨æºããããã¡ã¤ã«ã¯ï¼ã#include <...>ãã«ããã¤ã³ã¯ã«ã¼ãããï¼ 319 320 ãã®ä»ã®ããããã¡ã¤ã«ã¯ï¼ã#include "..."ãã«ããã¤ã³ã¯ã«ã¼ãããï¼ãã 321 ããã¡ã¤ã«ãï¼ã«ã¬ã³ããã£ã¬ã¯ããªãã¤ã³ã¯ã«ã¼ããããã¡ã¤ã«ã¨åãã㣠322 ã¬ã¯ããªä»¥å¤ã®ãã£ã¬ã¯ããªã«ç½®ããã¦ããå ´åã«ã¯ï¼æ¬¡ã®ããã«ãã¹æå®ã 323 è¡ãï¼ 324 325 ã»ã¿ã¼ã²ããä¾åé¨ï¼target/<ã¿ã¼ã²ããå>ï¼ã®ãã£ã¬ã¯ããªã«ç½®ããã¦ãã 326 ãå ´åã¯ï¼ãã¹æå®ãè¡ããï¼ãã¡ã¤ã«åã®ã¿ãè¨è¿°ããï¼ 327 ä¾ï¼#include "target_config.h" 328 329 ã»archãã£ã¬ã¯ããªä¸ã®ãã£ã¬ã¯ããªã«ç½®ããã¦ããå ´åã«ã¯ï¼archãã£ã¬ã¯ 330 ãããªããã®ç¸å¯¾ãã¹ã§è¨è¿°ããï¼ 331 ä¾ï¼#include "m68k_gcc/prc_config.h" 332 333 ã»ãã®ä»ã®å ´åã«ã¯ï¼ã½ã¼ã¹ããã°ã©ã ã®ã«ã¼ããã£ã¬ã¯ããªï¼configureãç½® 334 ãããã¦ãããã£ã¬ã¯ããªï¼ããã®ç¸å¯¾ãã¹ã§è¨è¿°ããï¼ 335 ä¾ï¼#include "pdic/upd72001/upd72001.h" 336 337 ã»ã«ã¼ãã«ãæ§æãããã¡ã¤ã«ããï¼kernelãã£ã¬ã¯ããªä¸ã®ããããã¡ã¤ã« 338 ããã¤ã³ã¯ã«ã¼ãããå ´åã¯ï¼ãã¹æå®ãè¡ããï¼ãã¡ã¤ã«åã®ã¿ãè¨è¿°ããï¼ 339 ä¾ï¼#include "kernel_impl.h" 340 341 1.6 ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 342 ¥å¦çã®å®ç¾ã«é¢ããå¶ç´ 343 344 ã«ã¼ãã«å 345 ã§ç¨ããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 346 ¥å¦çãå®ç¾ããå ´åã«ã¯ï¼ 347 次ã®2ã¤ã®æ¡ä»¶ãæºããããã«å®è£ 348 ããªããã°ãªããªãï¼ 349 350 (1-6-1) åºå 351 ¥å¦çããæããæç¹ã§ã¯ï¼å²è¾¼ã¿ã®ç¦æ¢ï¼è¨±å¯ãå®äºãã¦ããªã 352 ãã°ãªããªãï¼ä¾ãã°ï¼å²è¾¼ã¿ç¦æ¢ï¼è¨±å¯å½ä»¤ãå®è¡ãã¦ããå®éã«å²è¾¼ã¿ã 353 ç¦æ¢ï¼è¨±å¯ãããã¾ã§ä½å½ä»¤ãé 354 延ããããã»ããµã®å ´åã«ã¯ï¼åºå 355 ¥å¦çã®ä¸ 356 ã«NOPå½ä»¤ãå 357 ¥ãããªã©ã®æ¹æ³ã§ï¼åºå 358 ¥å¦çãæããæç¹ã§ã¯ï¼å²è¾¼ã¿ãç¦æ¢ï¼ 359 許å¯ãããç¶æ 360 ã«ãªã£ã¦ãããã¨ãä¿è¨¼ããªããã°ãªããªãï¼ 361 362 (1-6-2) ã¡ã¢ãªä¸ã®ãã¼ã¿æ§é ãæ¸ãå¤ããå¯è½æ§ããããã¨ãï¼ä½ããã®æ¹ 363 æ³ã§ã³ã³ãã¤ã©ã«ç¥ãããªããã°ãªããªãï¼GNUéçºç°å¢ã§ã¯ï¼æ¬¡ã®ããããã® 364 æ¹æ³ã§ãã®å¶ç´ãæºãããã¨ãã§ããï¼ 365 366 (a) ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 367 ¥å¦çã®å 368 ¨ä½ã¾ãã¯åºå 369 ¥å¦çã®æ¬è³ªçãªé¨å 370 ï¼å 371 ·ä½çã«ã¯ï¼å²è¾¼ã¿ç¦æ¢ï¼è¨±å¯ããå¦çï¼ãï¼ã¤ã³ã©ã¤ã³ã§ãªãï¼é常 372 ã®é¢æ°ã«ããå®ç¾ããï¼ 373 374 (b) ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 375 ¥å¦çã®æ¬è³ªçãªé¨åãã¤ã³ã©ã¤ã³ã¢ã»ã³ã 376 ã©ã«ãã£ã¦å®ç¾ãã¦ããå ´åã«ã¯ï¼ãã®ã¤ã³ã©ã¤ã³ã¢ã»ã³ãã©ã®clobberå¤ 377 æ°ãªã¹ãã«"memory"ã追å ããï¼ 378 379 (c) ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 380 ¥å¦çã®æ¬è³ªçãªé¨åãï¼ãã¯ããã¤ã³ã©ã¤ 381 ã³é¢æ°å¼åºãã§å®ç¾ãã¦ããå ´åã«ã¯ï¼ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã«å 382 ¥ãå¦ 383 çã®æå¾ã¨åºãå¦çã®å 384 é ã«ï¼Asm("":::"memory")ã¨ããè¨è¿°ãå 385 ¥ããï¼ 386 387 ãã®ãããªå¶ç´ãè¨ããçç±ã«ã¤ãã¦ã¯ï¼ãTOPPERS/ASPã«ã¼ãã« è¨è¨ã¡ã¢ã 388 ã®ãã«ã¼ãã«ã®ãã¼ã¿æ§é ã«å¯¾ããvolatile宣è¨ã«ã¤ãã¦ãã®ç¯ãåç 389 §ããã 390 ã¨ï¼ 391 392 393 ï¼ï¼ã·ã¹ãã æ§ç¯ç°å¢ã®ã¿ã¼ã²ããä¾åé¨ 394 395 ãã®ç« ã®èª¬æã¯ï¼GNUéçºç°å¢ï¼GCCï¼GASï¼BINUTILSï¼GNU Makeï¼ãç¨ããã㨠396 ãæ³å®ãã¦è¨è¿°ãã¦ããï¼ãã以å¤ã®éçºç°å¢ãç¨ããå ´åã«ã¯ï¼éçºç°å¢ã« 397 ãããã¦ä¿®æ£ããå¿ 398 è¦ãããï¼ 399 400 2.1 ã¿ã¼ã²ããç¥ç§°ã¨ã¿ã¼ã²ããä¾åé¨ã®ãã£ã¬ã¯ã㪠401 402 æ°ããã¿ã¼ã²ããä¾åé¨ãä½æããæã¯ï¼ã¾ãï¼ã¿ã¼ã²ããç¥ç§°ãå®ããï¼ã¿ã¼ 403 ã²ããç¥ç§°ã¯ï¼ã·ã¹ãã ç¥ç§°ã¨éçºç°å¢ç¥ç§°ã"_"ã§é£çµãããã®ã¨ããï¼ã·ã¹ 404 ãã ç¥ç§°ã«ç¨ããæåã¯è±å°æåã¨æ°åã¨"_"ã«ï¼éçºç°å¢ç¥ç§°ã«ç¨ããæå㯠405 è±å°æåã¨æ°åã«éå®ããï¼GNUéçºç°å¢ã®éçºç°å¢ç¥ç§°ã¯ï¼"gcc"ã¨ããï¼ä¾ 406 ãã°ï¼ã·ã¹ãã ç¥ç§°ã"dve68k"ã§ï¼GNUéçºç°å¢ãç¨ããå ´åã«ã¯ï¼ã¿ã¼ã²ãã 407 ç¥ç§°ã¯"dve68k_gcc"ã¨ãªãï¼ 408 409 ã¿ã¼ã²ããä¾åé¨ã®ãã¡ã¤ã«ãç½®ãããã«ï¼targetãã£ã¬ã¯ããªã®ä¸ã«ï¼ã¿ã¼ 410 ã²ããç¥ç§°ãå称ã¨ãããã£ã¬ã¯ããªãä½æããï¼ãããã¿ã¼ã²ããä¾åé¨ã㣠411 ã¬ã¯ããªã¨å¼ã¶ï¼ 412 413 ã¿ã¼ã²ããä¾åé¨ããããã»ããµä¾åé¨ããããä¾åé¨ãåãåããå ´åã«ã¯ï¼ 414 ä¾åé¨ç¥ç§°ãå®ããï¼ä¾åé¨ç¥ç§°ã¯ï¼ããã»ããµããããã®ç¥ç§°ã¨éçºç°å¢ç¥ 415 称ã"_"ã§é£çµãããã®ã¨ããï¼ããã»ããµããããã®ç¥ç§°ã«ç¨ããæåã¯ï¼è± 416 å°æåã¨æ°åã¨"_"ã«éå®ããï¼ä¾ãã°ï¼ããã»ããµç¥ç§°ã"m68k"ã§ï¼GNUéçº 417 ç°å¢ãç¨ããå ´åã«ã¯ï¼ä¾åé¨ç¥ç§°ã¯"m68k_gcc"ã¨ãªãï¼ 418 419 ã¾ãï¼ã¿ã¼ã²ããä¾åé¨ããéçºç°å¢ä¾åé¨ãåãåããå ´åã«ã¯ï¼éçºç°å¢ 420 ç¥ç§°ãä¾åé¨ç¥ç§°ã¨ããï¼ä¾ãã°ï¼GNUéçºç°å¢ä¾åé¨ã®ä¾åé¨ç¥ç§°ã¯ï¼"gcc" 421 ã¨ãªãï¼ 422 423 ãããã®ä¾åé¨ã®ãã¡ã¤ã«ãç½®ãããã«ï¼archãã£ã¬ã¯ããªã®ä¸ã«ï¼ä¾åé¨ç¥ 424 称ãå称ã¨ãããã£ã¬ã¯ããªãä½æããï¼ 425 426 ãªãï¼GNUéçºç°å¢ä»¥å¤ã®éçºç°å¢ãç¨ããå ´åã«ã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã·ã§ã³ 427 ã¹ã¯ãªããï¼configureï¼ï¼ãµã³ãã«ã®Makefileï¼sample/Makefileï¼ï¼ä¸é¨ã® 428 ã¦ã¼ãã£ãªãã£ããã°ã©ã ï¼utils/makedepï¼ãï¼ãã®éçºç°å¢ç¨ã«ç¨æããå¿ 429 430 è¦ãããå ´åãããï¼ãã®å ´åã«ã¯ï¼ãããã®ãã¡ã¤ã«ãï¼ã¿ã¼ã²ããä¾åé¨ 431 ãã£ã¬ã¯ããªãéçºç°å¢ä¾åé¨ãã£ã¬ã¯ããªã«ç½®ããã®ã¨ããï¼ã¾ãï¼éçºç° 432 å¢ç¨ã®ããã¸ã§ã¯ããã¡ã¤ã«ãå¿ 433 è¦ãªå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ãã£ã¬ã¯ã 434 ãªã«ç½®ããã®ã¨ããï¼ 435 436 2.2 Makefileã®ã¿ã¼ã²ããä¾åé¨ 437 438 Makefileã®ã¿ã¼ã²ããä¾åé¨ã¯ï¼ã¿ã¼ã²ããä¾åé¨ãã£ã¬ã¯ããªã«ç½®ãã 439 Makefile.targetã¾ãã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ããã»ããµã»ãã 440 ãã»éçºç°å¢ä¾åé¨ã§ç¨æããããã¡ã¤ã«ãªã©ï¼ã«å«ããï¼ 441 442 2.3 éçºç°å¢åã¨ã³ãã³ãåã®è¨å® 443 444 éçºç°å¢åã¨ã³ãã³ãåãè¨å®ããããã«ï¼Makefileã®ã¿ã¼ã²ããä¾åé¨ã§æ¬¡ 445 ã®å¤æ°ãå®ç¾©ããï¼ 446 447 (2-3-1) TOOL éçºç°å¢å 448 449 éçºç°å¢åã«å®ç¾©ããï¼GNUéçºç°å¢ãç¨ããå ´åã«ã¯ï¼gccã«å®ç¾©ããï¼ 450 451 (2-3-2) GCC_TARGET GNUéçºç°å¢ã®ã¿ã¼ã²ããå 452 453 GNUéçºç°å¢ãç¨ããå ´åã«ï¼GNUéçºç°å¢ãconfigureããå ´åã«æå®ããã¿ã¼ 454 ã²ããåã«å®ç¾©ããï¼ããã§æå®ããã¿ã¼ã²ããåã¯ï¼éçºç°å¢ã®ã³ãã³ãå 455 ã®å 456 é ã«ä»ä¸ãããæååã¨ãªãï¼ä¾ãã°ï¼GCC_TARGETãm68k-unknown-elfã« 457 å®ç¾©ããå ´åã«ã¯ï¼ã³ã³ãã¤ã©ã¨ãã¦m68k-unknown-elf-gccã使ãããï¼ãã® 458 å¤æ°ãå®ç¾©ãããªãå ´åã«ã¯ï¼åãªãgccã使ãããï¼ 459 460 (2-3-3) CC Cã³ã³ãã¤ã©ãã©ã¤ãã®å称 461 (2-3-4) CXX C++ã³ã³ãã¤ã©ãã©ã¤ãã®å称 462 (2-3-5) AS ã¢ã»ã³ãã©ã®å称 463 (2-3-6) LD ãªã³ã«ã®å称 464 (2-3-7) AR ã¢ã¼ã«ã¤ãã®å称 465 (2-3-8) NM nmããã°ã©ã ã®å称 466 (2-3-9) RANLIB ranlibããã°ã©ã ã®å称 467 (2-3-10) OBJCOPY objcopyããã°ã©ã ã®å称 468 (2-3-11) OBJDUMP objdumpããã°ã©ã ã®å称 469 470 GNUéçºç°å¢ä»¥å¤ã®éçºç°å¢ãç¨ããå ´åã«ï¼ããããã®ã³ãã³ãã®å称ã«å®ç¾© 471 ããï¼å¯¾å¿ããã³ãã³ãããªãå ´åãï¼ã³ãã³ããã©ã¡ã¼ã¿ãç°ãªãå ´åã«ã¯ï¼ 472 Makefileä¸ã§ãã®ã³ãã³ããå¼ã³åºãã¦ããé¨åãå¤æ´ããå¿ 473 è¦ãããï¼ 474 475 GNUéçºç°å¢ã§ã¯ï¼ãããã¯GCC_TARGETãç¨ãã¦å®ç¾©ãããã®ã§ï¼å®ç¾©ããå¿ 476 è¦ 477 ã¯ãªãï¼ 478 479 2.4 ã³ã³ãã¤ã«ãªãã·ã§ã³ã¨ãªãã¸ã§ã¯ããã¡ã¤ã«ã®è¨å® 480 481 Makefileã®ã¿ã¼ã²ããä¾åé¨ã§ä»¥ä¸ã§èª¬æããå¤æ°ãå®ç¾©ããæã«ã¯ï¼":="ã 482 ç¨ãã¦ï¼ããã¾ã§ã®å®ç¾©ã«è¿½å ããå½¢ã§è¡ãï¼ä¾ãã°ï¼ã³ã³ãã¤ã©ã«å¯¾ããã 483 ã®ä»ã®ãªãã·ã§ã³ã¨ãã¦ã-Wall -g -O2ãã追å ãããå ´åã«ã¯ï¼ãCOPTS := 484 $(COPTS) -Wall -g -O2ãã¨ããè¨è¿°ãMakefileã®ã¿ã¼ã²ããä¾åé¨ã«å«ããï¼ 485 486 (2-4-1) COPTS ã³ã³ãã¤ã©ã«å¯¾ãããã®ä»ã®ãªãã·ã§ã³ 487 (2-4-2) CDEFS ãã¯ãå®ç¾©ãªãã·ã§ã³ï¼-Dãªãã·ã§ã³ï¼ 488 (2-4-3) INCLUDES ããããã¡ã¤ã«ã®ç½®ããããã£ã¬ã¯ããªæå®ãª 489 ãã·ã§ã³ï¼-Iãªãã·ã§ã³ï¼ 490 (2-4-4) LDFLAGS ãªã³ã«ã«å¯¾ãããã®ä»ã®ãªãã·ã§ã³ 491 (2-4-5) LIBS ã©ã¤ãã©ãªãªã³ã¯æå®ã®ããã®ãªãã·ã§ã³ 492 493 ã¿ã¼ã²ããã«ä¾åãã¦ï¼ãã¹ã¦ã®ã½ã¼ã¹ãã¡ã¤ã«ã«å 494 ±éããã³ã³ãã¤ã«ãªãã·ã§ 495 ã³ã®è¿½å ãå¿ 496 è¦ãªå ´åã«ã¯ï¼ãªãã·ã§ã³ã®ç¨®é¡æ¯ã«ä¸ã«ç¤ºããå¤æ°ã«å®ç¾©ããï¼ 497 498 ã»ã¨ãã©ã®å ´åã«ï¼ã¿ã¼ã²ããä¾åé¨ãã£ã¬ã¯ããªã®Makefile.targetã«ã¯ï¼ä»¥ 499 ä¸ã®è¨è¿°ãå«ããå¿ 500 è¦ãããï¼ 223 を記述する. 224 225 1.4 アセンブリ言語とのヘッダファイルの共用 226 227 ASPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから 228 もインクルードできるようにするために,次のルールに従って記述するものと 229 する. 230 231 ・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では 232 解釈できない記述(マクロ定義以外の記述)を除くように記述する. 233 234 ・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ 235 クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ 236 ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの 237 マクロを使って記述する必要はない. 238 239 また,カーネル実装においては,次のルールに従うものとする. 240 241 ・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には, 242 CASTマクロを用いて記述する. 243 244 アセンブリ言語からヘッダファイルをインクルードする際には,必要に応じて, 245 TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー 246 ドしなければならない. 247 248 1.5 インクルード記述の方法 249 250 開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の 251 標準ヘッダファイルは,「#include <...>」によりインクルードする. 252 253 その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ 254 ダファイルが,カレントディレクトリやインクルードするファイルと同じディ 255 レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を 256 行う. 257 258 ・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている 259 場合は,パス指定を行わず,ファイル名のみを記述する. 260 例)#include "target_config.h" 261 262 ・archディレクトリ下のディレクトリに置かれている場合には,archディレク 263 トリからの相対パスで記述する. 264 例)#include "m68k_gcc/prc_config.h" 265 266 ・その他の場合には,ソースプログラムのルートディレクトリ(configureが置 267 かれているディレクトリ)からの相対パスで記述する. 268 例)#include "pdic/upd72001/upd72001.h" 269 270 ・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル 271 をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する. 272 例)#include "kernel_impl.h" 273 274 1.6 クリティカルセクションの出入処理の実現に関する制約 275 276 カーネル内で用いるクリティカルセクションの出入処理を実現する場合には, 277 次の2つの条件を満たすように実装しなければならない. 278 279 (1-6-1) 出入処理から抜けた時点では,割込みの禁止/許可が完了していなけ 280 ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが 281 禁止/許可されるまで何命令か遅延するプロセッサの場合には,出入処理の中 282 にNOP命令を入れるなどの方法で,出入処理を抜けた時点では,割込みが禁止/ 283 許可された状態になっていることを保証しなければならない. 284 285 (1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方 286 法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの 287 方法でこの制約を満たすことができる. 288 289 (a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分 290 (具体的には,割込み禁止/許可する処理)を(インラインでない)通常 291 の関数により実現する. 292 293 (b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ 294 ラによって実現している場合には,そのインラインアセンブラのclobber変 295 数リストに"memory"を追加する. 296 297 (c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ 298 ン関数呼出しで実現している場合には,クリティカルセクションに入る処 299 理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる. 300 301 このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」 302 の「カーネルのデータ構造に対するvolatile宣言について」の節を参照するこ 303 と. 304 305 306 2.システム構築環境のターゲット依存部 307 308 この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること 309 を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に 310 あわせて修正する必要がある. 311 312 2.1 ターゲット略称とターゲット依存部のディレクトリ 313 314 新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター 315 ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス 316 テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は 317 英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例 318 えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット 319 略称は"dve68k_gcc"となる. 320 321 ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター 322 ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ 323 レクトリと呼ぶ. 324 325 ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には, 326 依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略 327 称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英 328 小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発 329 環境を用いる場合には,依存部略称は"m68k_gcc"となる. 330 331 また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境 332 略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc" 333 となる. 334 335 これらの依存部のファイルを置くために,archディレクトリの下に,依存部略 336 称を名称とするディレクトリを作成する. 337 338 なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション 339 スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の 340 ユーティリティプログラム(utils/makedep)を,その開発環境用に用意する必 341 要がある場合がある.その場合には,これらのファイルを,ターゲット依存部 342 ディレクトリか開発環境依存部ディレクトリに置くものとする.また,開発環 343 境用のプロジェクトファイルが必要な場合には,ターゲット依存部ディレクト 344 リに置くものとする. 345 346 2.2 Makefileのターゲット依存部 347 348 Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた 349 Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ 350 プ・開発環境依存部で用意されるファイルなど)に含める. 351 352 2.3 開発環境名とコマンド名の設定 353 354 開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次 355 の変数を定義する. 356 357 (2-3-1) TOOL 開発環境名 358 359 開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する. 360 361 (2-3-2) GCC_TARGET GNU開発環境のターゲット名 362 363 GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター 364 ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名 365 の先頭に付与される文字列となる.例えば,GCC_TARGETをm68k-unknown-elfに 366 定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この 367 変数が定義されない場合には,単なるgccが使われる. 368 369 (2-3-3) CC Cコンパイラドライバの名称 370 (2-3-4) CXX C++コンパイラドライバの名称 371 (2-3-5) AS アセンブラの名称 372 (2-3-6) LD リンカの名称 373 (2-3-7) AR アーカイバの名称 374 (2-3-8) NM nmプログラムの名称 375 (2-3-9) RANLIB ranlibプログラムの名称 376 (2-3-10) OBJCOPY objcopyプログラムの名称 377 (2-3-11) OBJDUMP objdumpプログラムの名称 378 379 GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義 380 する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には, 381 Makefile中でそのコマンドを呼び出している部分を変更する必要がある. 382 383 GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必要 384 はない. 385 386 2.4 コンパイルオプションとオブジェクトファイルの設定 387 388 Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を 389 用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ 390 の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS := 391 $(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める. 392 393 (2-4-1) COPTS コンパイラに対するその他のオプション 394 (2-4-2) CDEFS マクロ定義オプション(-Dオプション) 395 (2-4-3) INCLUDES ヘッダファイルの置かれたディレクトリ指定オ 396 プション(-Iオプション) 397 (2-4-4) LDFLAGS リンカに対するその他のオプション 398 (2-4-5) LIBS ライブラリリンク指定のためのオプション 399 400 ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ 401 ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する. 402 403 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 404 下の記述を含める必要がある. 501 405 502 406 ---------------------------------------- … … 504 408 ---------------------------------------- 505 409 506 ããã§TARGETDIRã¯ï¼ã¿ã¼ã²ããä¾åé¨ãã£ã¬ã¯ããªã«å®ç¾©ããã¦ããï¼ã¾ã 507 SRCDIR ã¯ï¼Makefileã«ããã¦ï¼ã½ã¼ã¹ããã°ã©ã ã®ã«ã¼ããã£ã¬ã¯ããª508 ï¼configureãç½®ããã¦ãããã£ã¬ã¯ããªï¼ã«å®ç¾©ããã¦ããï¼ 509 510 ã³ã³ãã¤ã©ã®åé¡çã§ï¼è¦åã¡ãã»ã¼ã¸ãåºããã¨ãé²ããªãç¶æ³ä»¥å¤ã§ã¯ï¼ 511 COPTS ã«-Werrorã追å ãããã¨ãæ¨å¥¨ããï¼410 ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また 411 SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ 412 (configureが置かれているディレクトリ)に定義されている. 413 414 コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では, 415 COPTSに-Werrorを追加することを推奨する. 512 416 513 417 ---------------------------------------- … … 515 419 ---------------------------------------- 516 420 517 ã«ã¼ãã«ã®ã³ã³ãã¤ã«æã«ï¼dereferencing type-punned pointer will break 518 strict-aliasing rulesã¨ããè¦åãåºãå ´åã«ã¯ï¼ä»¥ä¸ã追å ããã¨ããï¼ã 519 ã®è¦åã¡ãã»ã¼ã¸ã«é¢ãã詳細ã¯ï¼ãTOPPERS/ASPã«ã¼ãã« è¨è¨ã¡ã¢ãã®ãå 520 ãã£ã¹ãã«ä¼´ãè¦åã¡ãã»ã¼ã¸ãã®ç¯ãåç 521 §ãããã¨ï¼ 421 カーネルのコンパイル時に,dereferencing type-punned pointer will break 422 strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ 423 の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型 424 キャストに伴う警告メッセージ」の節を参照すること. 522 425 523 426 ---------------------------------------- … … 525 428 ---------------------------------------- 526 429 527 ã¾ãï¼ã¢ã»ã³ããªè¨èªã¬ãã«ã®èå¥åãï¼Cè¨èªã¬ãã«ã®èå¥åã®å 528 é ã«"_"ã 529 ä»ãããã®ã«ãªãå ´åã«ã¯ï¼CDEFSã«-DTOPPERS_LABEL_ASMã追å ããï¼ 530 531 (2-4-6) SYSSVC_DIR ã·ã¹ãã ãµã¼ãã¹ã®ã½ã¼ã¹ãç½®ããããã£ã¬ã¯ã㪠532 (2-4-7) SYSSVC_ASMOBJS ã¢ã»ã³ããªè¨èªã§è¨è¿°ãããã·ã¹ãã ãµã¼ãã¹ã® 533 ãªãã¸ã§ã¯ã 534 (2-4-8) SYSSVC_COBJS Cè¨èªã§è¨è¿°ãããã·ã¹ãã ãµã¼ãã¹ã®ãªãã¸ã§ã¯ã 535 (2-4-9) SYSSVC_CFLAGS ã·ã¹ãã ãµã¼ãã¹ã«å¯¾ããã³ã³ãã¤ã«ãªãã·ã§ã³ 536 (2-4-10) SYSSVC_LIBS ã·ã¹ãã ãµã¼ãã¹ã«å¯¾ããã©ã¤ãã©ãªãªã³ã¯æå® 537 538 ã¿ã¼ã²ããã«ä¾åãã¦ï¼ã·ã¹ãã ãµã¼ãã¹ï¼ã·ã¹ãã ãã°ã¿ã¹ã¯ãããã¤ã¹ã 539 ã©ã¤ããªã©ï¼ã®ã½ã¼ã¹ãç½®ããããã£ã¬ã¯ããªï¼ã·ã¹ãã ãµã¼ãã¹ãæ§æãã 540 ãªãã¸ã§ã¯ããã¡ã¤ã«ã®ãªã¹ãï¼ããããã³ã³ãã¤ã«ããéã«é©ç¨ããã³ã³ã 541 ã¤ã«ãªãã·ã§ã³ï¼ãã®æ§æã«å¿ 542 è¦ãªã©ã¤ãã©ãªãªã³ã¯æå®ã追å ããå ´åã«ã¯ï¼ 543 ä¸ã«ç¤ºããå¤æ°ã«å®ç¾©ããï¼ 544 545 (2-4-11) KERNEL_DIR ã«ã¼ãã«ã®ã½ã¼ã¹ãç½®ããããã£ã¬ã¯ã㪠546 (2-4-12) KERNEL_ASMOBJS ã¢ã»ã³ããªè¨èªã§è¨è¿°ãããã«ã¼ãã«ã®ãªãã¸ã§ã¯ã 547 (2-4-13) KERNEL_COBJS Cè¨èªã§è¨è¿°ãããã«ã¼ãã«ã®ãªãã¸ã§ã¯ã 548 (2-4-14) KERNEL_CFLAGS ã«ã¼ãã«ã«å¯¾ããã³ã³ãã¤ã«ãªãã·ã§ã³ 549 550 ã¿ã¼ã²ããã«ä¾åãã¦ï¼ã«ã¼ãã«ã®ã½ã¼ã¹ãç½®ããããã£ã¬ã¯ããªï¼ã«ã¼ãã« 551 ãæ§æãããªãã¸ã§ã¯ããã¡ã¤ã«ã®ãªã¹ãï¼ããããã³ã³ãã¤ã«ããéã«é©ç¨ 552 ããã³ã³ãã¤ã«ãªãã·ã§ã³ã追å ããå ´åã«ã¯ï¼ä¸ã«ç¤ºããå¤æ°ã«å®ç¾©ããï¼ 553 554 ã»ã¨ãã©ã®å ´åã«ï¼ã¿ã¼ã²ããä¾åé¨ãã£ã¬ã¯ããªã®Makefile.targetã«ã¯ï¼ä»¥ 555 ä¸ã®è¨è¿°ãå«ããå¿ 556 è¦ãããï¼ 430 また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に"_"が 431 付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する. 432 433 (2-4-6) SYSSVC_DIR システムサービスのソースが置かれたディレクトリ 434 (2-4-7) SYSSVC_ASMOBJS アセンブリ言語で記述されたシステムサービスの 435 オブジェクト 436 (2-4-8) SYSSVC_COBJS C言語で記述されたシステムサービスのオブジェクト 437 (2-4-9) SYSSVC_CFLAGS システムサービスに対するコンパイルオプション 438 (2-4-10) SYSSVC_LIBS システムサービスに対するライブラリリンク指定 439 440 ターゲットに依存して,システムサービス(システムログタスクやデバイスド 441 ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する 442 オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ 443 イルオプション,その構成に必要なライブラリリンク指定を追加する場合には, 444 上に示した変数に定義する. 445 446 (2-4-11) KERNEL_DIR カーネルのソースが置かれたディレクトリ 447 (2-4-12) KERNEL_ASMOBJS アセンブリ言語で記述されたカーネルのオブジェクト 448 (2-4-13) KERNEL_COBJS C言語で記述されたカーネルのオブジェクト 449 (2-4-14) KERNEL_CFLAGS カーネルに対するコンパイルオプション 450 451 ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル 452 を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用 453 するコンパイルオプションを追加する場合には,上に示した変数に定義する. 454 455 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 456 下の記述を含める必要がある. 557 457 558 458 ---------------------------------------- … … 562 462 ---------------------------------------- 563 463 564 (2-4-15) CFG_TABS ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã«å¯¾ãããªãã·ã§ã³ 565 566 ã¿ã¼ã²ããã«ä¾åãã¦ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã«å¯¾ãããªãã·ã§ã³ã追å ããå ´ 567 åã«ã¯ï¼ä¸ã«ç¤ºããå¤æ°ã«å®ç¾©ããï¼å 568 ·ä½çã«ã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®å¤å 569 å¾ã·ã³ãã«ãã¼ãã«ã®ã¿ã¼ã²ããä¾åé¨ï¼target_def.csvï¼ãããå ´åã«ã¯ï¼ 570 ãããæå®ãããªãã·ã§ã³ã追å ããå¿ 571 è¦ãããï¼ 572 573 ã»ã¨ãã©ã®å ´åã«ï¼ã¿ã¼ã²ããä¾åé¨ãã£ã¬ã¯ããªã®Makefile.targetã«ã¯ï¼ä»¥ 574 ä¸ã®è¨è¿°ãå«ããå¿ 575 è¦ãããï¼ 464 (2-4-15) CFG_TABS コンフィギュレータに対するオプション 465 466 ターゲットに依存して,コンフィギュレータに対するオプションを追加する場 467 合には,上に示した変数に定義する.具体的には,コンフィギュレータの値取 468 得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には, 469 それを指定するオプションを追加する必要がある. 470 471 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 472 下の記述を含める必要がある. 576 473 577 474 ---------------------------------------- … … 579 476 ---------------------------------------- 580 477 581 (2-4-16) CFG1_OUT_LDFLAGS cfg1_out.cã«å¯¾ãããªã³ã¯ãªãã·ã§ã³ 582 583 ã¿ã¼ã²ããã«ä¾åãã¦ï¼cfg1_out.cããªã³ã¯ããéã«é©ç¨ãããªãã·ã§ã³ã追 584 å ããå ´åã«ã¯ï¼ä¸ã«ç¤ºããå¤æ°ã«å®ç¾©ããï¼ 585 586 ãªãï¼LDFLAGSã¯ï¼cfg1_out.cããªã³ã¯ããéã«ã¯é©ç¨ãããªãããï¼LDFLAGS 587 ã«å®ç¾©ãããªãã·ã§ã³ã§ï¼cfg1_out.cããªã³ã¯ããéã«ãå¿ 588 è¦ãªãã®ã¯ï¼ 589 CFG1_OUT_LDFLAGSã«ãå®ç¾©ããå¿ 590 è¦ãããï¼ 591 592 (2-4-17) CFG_ASMOBJS ã¢ã»ã³ããªè¨èªã§è¨è¿°ãããã·ã¹ãã ã³ã³ã㣠593 ã®ã¥ã¬ã¼ã·ã§ã³ã®ããã®ãªãã¸ã§ã¯ã 594 (2-4-18) CFG_COBJS Cè¨èªã§è¨è¿°ãããã·ã¹ãã ã³ã³ãã£ã®ã¥ã¬ã¼ 595 ã·ã§ã³ã®ããã®ãªãã¸ã§ã¯ã 596 597 ã¿ã¼ã²ããã«ä¾åãã¦ï¼ã·ã¹ãã ã³ã³ãã£ã®ã¥ã¬ã¼ã·ã§ã³ã®ããã®ãªãã¸ã§ã¯ 598 ããã¡ã¤ã«ãï¼kernel_cfg.o以å¤ã«ï¼è¿½å ããå ´åã«ã¯ï¼ä¸ã«ç¤ºããå¤æ°ã«å® 599 義ããï¼ãã®å ´åï¼è¿½å ãããªãã¸ã§ã¯ããã¡ã¤ã«ã®ä½æã«ã¼ã«ï¼ã³ã³ãã¤ã«ï¼ 600 ã¢ã»ã³ãã«ã«ã¼ã«ã¨ä¾åé¢ä¿ä½æã«ã¼ã«ï¼ãï¼Makefileã®ã¿ã¼ã²ããä¾åé¨ã« 601 è¨è¿°ããå¿ 602 è¦ãããï¼ 478 (2-4-16) CFG1_OUT_LDFLAGS cfg1_out.cに対するリンクオプション 479 480 ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追 481 加する場合には,上に示した変数に定義する. 482 483 なお,LDFLAGSは,cfg1_out.cをリンクする際には適用されないため,LDFLAGS 484 に定義したオプションで,cfg1_out.cをリンクする際にも必要なものは, 485 CFG1_OUT_LDFLAGSにも定義する必要がある. 486 487 (2-4-17) CFG_ASMOBJS アセンブリ言語で記述されたシステムコンフィ 488 ギュレーションのためのオブジェクト 489 (2-4-18) CFG_COBJS C言語で記述されたシステムコンフィギュレー 490 ションのためのオブジェクト 491 492 ターゲットに依存して,システムコンフィギュレーションのためのオブジェク 493 トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定 494 義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/ 495 アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に 496 記述する必要がある. 603 497 604 498 (2-4-19) CFG2_OUT_SRCS 605 499 606 ã¿ã¼ã²ããã«ä¾åãã¦ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹2ã§kernel_cfg.c㨠607 kernel_cfg.h 以å¤ã®ãã¡ã¤ã«ãçæããå ´åã«ã¯ï¼ä¸ã«ç¤ºããå¤æ°ã«å®ç¾©ããï¼500 ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと 501 kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する. 608 502 609 503 (2-4-20) OMIT_WARNING_ALL 610 504 (2-4-21) OMIT_OPTIMIZATION 611 505 612 ãµã³ãã«ã®Makefileã§ã¯ï¼ã³ã³ãã¤ã©ã«å¯¾ãããªãã·ã§ã³ã«ã-Wall -g -O2ã 613 ã追å ããï¼-Wallã追å ããããªãå ´åã«ã¯ï¼Makefileã®ã¿ã¼ã²ããä¾åé¨ã§ 614 OMIT_WARNING_ALLã"true"ã«å®ç¾©ããï¼-O2ã追å ããããªãå ´åã«ã¯ï¼ 615 Makefileã®ã¿ã¼ã²ããä¾åé¨ã§OMIT_OPTIMIZATIONã"true"ã«å®ç¾©ããï¼ 616 617 2.5 ãªãã»ãããã¡ã¤ã«ã®çææ¹æ³ 618 619 ã¢ã»ã³ããªè¨èªã§è¨è¿°ãããããã°ã©ã ããï¼Cè¨èªã®æ§é ä½ã«ã¢ã¯ã»ã¹ããå ´ 620 åã«ã¯ï¼æ§é ä½ã®åãã£ã¼ã«ãã®ãªãã»ããå¤ãåç 621 §ãããã¨ãå¿ 622 è¦ã§ããï¼ 623 ASPã«ã¼ãã«ã§ã¯ï¼å¿ 624 è¦ãªãªãã»ããå¤ãæ±ãã¦ãã¡ã¤ã«ï¼æ¨æºã§ã¯offset.hï¼ 625 ã«çæããããã®ä»çµã¿ãç¨æãã¦ããï¼ 626 627 ãã®ä»çµã¿ãç¨ãããã¨ã§ï¼ä¾ãã°ï¼TCBä¸ã®texptnãã£ã¼ã«ãã®ãªãã»ããå¤ 628 ãTCB_texptnã«ãã¯ãå®ç¾©ãããã¨ãï¼TCBä¸ã®ã¿ã¹ã¯ã³ã³ããã¹ãããã㯠629 ï¼tskctxbï¼ã«å«ã¾ããpcãã£ã¼ã«ãã®ãªãã»ããå¤ãTCB_pcã«ãã¯ãå®ç¾©ãã 630 ãã¨ãã§ããï¼ã¾ãï¼TCBä¸ã®enatexãã£ã¼ã«ãã®ãªãã»ããå¤ï¼ãããä½ç½®ï¼ 631 ããããã¹ã¯ãï¼ããããTCB_enatexï¼TCB_enatex_bitï¼TCB_enatex_maskã«ã 632 ã¯ãå®ç¾©ãããã¨ãã§ããï¼ 633 634 offset.hãçæããããã®ä»çµã¿ã¨ãã¦ï¼ç¾æç¹ã§ã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã 635 ç¨ããæ¹æ³ã¨ï¼makeoffset.cã¨genoffsetãç¨ããæ¹æ³ãç¨æãã¦ããï¼å¾è 636 ã® 637 æ¹æ³ã¯ï¼GNUéçºç°å¢ã«ãã対å¿ãã¦ããªããã¨ããï¼å°æ¥ã®ãã¼ã¸ã§ã³ã§ã¯ï¼ 638 å¾è 639 ã®æ¹æ³ã®ãµãã¼ãããããè¨ç»ã§ããï¼æ°ãã«ãã¼ãã£ã³ã°ããå ´åã«ã¯ï¼ 640 åè 641 ã®æ¹æ³ãç¨ãããã¨ãæ¨å¥¨ããï¼ 642 643 ãããã®ä»çµã¿ã§ãªãã»ãããã¡ã¤ã«ãçæã§ããªãæã«ã¯ï¼offset.hãã¿ã¼ 644 ã²ããä¾åé¨ã§ç¨æãï¼Makefileã®ã¿ã¼ã²ããä¾åé¨ã§OMIT_MAKEOFFSETã 645 "true"ã«å®ç¾©ããï¼ 646 647 æ¡å¼µããã±ã¼ã¸ã®ä¸ã«ã¯ï¼TCBã«ãã£ã¼ã«ãã追å ãããã®ãããããï¼TCBä¸ 648 ã®ãã£ã¼ã«ãã®ãªãã»ããå¤ã¯å¤åããï¼offset.hãçæããå ´åã§ãï¼ã¿ã¼ 649 ã²ããä¾åé¨ã§ç¨æããå ´åã§ãï¼æ¡å¼µããã±ã¼ã¸ã«å¯¾å¿ããããã«ã¯ï¼ãã® 650 ãã¨ãèæ 651 ®ããå¿ 652 è¦ãããï¼ 653 654 2.5.1 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãç¨ããæ¹æ³ 655 656 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹1ã§çæããcfg1_out.cãã³ã³ãã¤ã«ãã¦çæãã㪠657 ãã¸ã§ã¯ããã¡ã¤ã«ããï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã«ãã£ã¦offset.hãçæããæ¹ 658 æ³ã§ããï¼ãã®æ¹æ³ãç¨ããããã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ãªãã»ãããã¡ã¤ 659 ã«çæç¨ãã³ãã¬ã¼ããã¡ã¤ã«ãç¨æãï¼target_cfg1_out.hï¼ã¾ãã¯ï¼ããã 660 ãã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ã¨target_def.csvï¼ã¾ãã¯ï¼åçã®å½¹å²ãæ 661 ã¤ãã¡ã¤ã«ï¼ã«è¨è¿°ã追å ããå¿ 662 è¦ãããï¼ãªãï¼ãããã®ãã¡ã¤ã«ãæ°ãã« 663 ç¨æããéãä¿®æ£ããéã«ã¯ï¼offset.hã«å¦¥å½ãªå®ç¾©ãçæããã¦ãããã¨ã 664 確èªãã¹ãã§ããï¼ 665 666 ãªãã»ãããã¡ã¤ã«çæç¨ãã³ãã¬ã¼ããã¡ã¤ã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ï¼ 667 target_offset.tfï¼ã¾ãã¯ï¼ããã»ããµä¾åé¨ããããä¾åé¨ã§ç¨æãããã 668 ã«ä»£ãããã¡ã¤ã«ï¼ã«ç¨æããï¼ã¾ãï¼Makefileã®ã¿ã¼ã²ããä¾åé¨ã§ï¼æ¬¡ã® 669 ä¾ã®ããã«ï¼OFFSET_TFã«ãªãã»ãããã¡ã¤ã«çæç¨ãã³ãã¬ã¼ããã¡ã¤ã«ã®ãã¡ 670 ã¤ã«åãå®ç¾©ããï¼ 671 672 ---------------------------------------- 673 # ãªãã»ãããã¡ã¤ã«çæã®ããã®å®ç¾© 506 サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」 507 を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で 508 OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には, 509 Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する. 510 511 2.5 オフセットファイルの生成方法 512 513 アセンブリ言語で記述されるプログラムから,C言語の構造体にアクセスする場 514 合には,構造体の各フィールドのオフセット値を参照することが必要である. 515 ASPカーネルでは,必要なオフセット値を求めてファイル(標準ではoffset.h) 516 に生成するための仕組みを用意している. 517 518 この仕組みを用いることで,例えば,TCB中のtexptnフィールドのオフセット値 519 をTCB_texptnにマクロ定義することや,TCB中のタスクコンテキストブロック 520 (tskctxb)に含まれるpcフィールドのオフセット値をTCB_pcにマクロ定義する 521 ことができる.また,TCB中のenatexフィールドのオフセット値,ビット位置, 522 ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,TCB_enatex_maskにマ 523 クロ定義することができる. 524 525 offset.hを生成するための仕組みとして,現時点では,コンフィギュレータを 526 用いる方法と,makeoffset.cとgenoffsetを用いる方法を用意している.後者の 527 方法は,GNU開発環境にしか対応していないことから,将来のバージョンでは, 528 後者の方法のサポートをやめる計画である.新たにポーティングする場合には, 529 前者の方法を用いることを推奨する. 530 531 これらの仕組みでオフセットファイルを生成できない時には,offset.hをター 532 ゲット依存部で用意し,Makefileのターゲット依存部でOMIT_MAKEOFFSETを 533 "true"に定義する. 534 535 拡張パッケージの中には,TCBにフィールドを追加するものがあるため,TCB中 536 のフィールドのオフセット値は変化する.offset.hを生成する場合でも,ター 537 ゲット依存部で用意する場合でも,拡張パッケージに対応するためには,この 538 ことを考慮する必要がある. 539 540 2.5.1 コンフィギュレータを用いる方法 541 542 コンフィギュレータのパス1で生成するcfg1_out.cをコンパイルして生成したオ 543 ブジェクトファイルから,コンフィギュレータによってoffset.hを生成する方 544 法である.この方法を用いるためには,ターゲット依存部でオフセットファイ 545 ル生成用テンプレートファイルを用意し,target_cfg1_out.h(または,そこか 546 らインクルードされるファイル)とtarget_def.csv(または,同等の役割を持 547 つファイル)に記述を追加する必要がある.なお,これらのファイルを新たに 548 用意した際や修正した際には,offset.hに妥当な定義が生成されていることを 549 確認すべきである. 550 551 オフセットファイル生成用テンプレートファイルは,ターゲット依存部で, 552 target_offset.tf(または,プロセッサ依存部やチップ依存部で用意するそれ 553 に代わるファイル)に用意する.また,Makefileのターゲット依存部で,次の 554 例のように,OFFSET_TFにオフセットファイル生成用テンプレートファイルのファ 555 イル名を定義する. 556 557 ---------------------------------------- 558 # オフセットファイル生成のための定義 674 559 OFFSET_TF = $(TARGETDIR)/target_offset.tf 675 560 ---------------------------------------- 676 561 677 ãªãã»ãããã¡ã¤ã«çæç¨ãã³ãã¬ã¼ããã¡ã¤ã«ã«ã¯ï¼ä»¥ä¸ã®å 678 容ãè¨è¿°ããï¼ 679 680 (1) æ¨æºãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¤ã³ã¯ã«ã¼ã 681 682 ãªãã»ãããã¡ã¤ã«çæç¨ã®æ¨æºãã³ãã¬ã¼ããã¡ã¤ã«ï¼kernel/genoffset.tfï¼ 683 ãã¤ã³ã¯ã«ã¼ãããï¼æ¨æºãã³ãã¬ã¼ããã¡ã¤ã«ã«ã¯ï¼ä»¥ä¸ã§ç¨ããDEFINEé¢ 684 æ°ãDEFINE_BITé¢æ°ã®å®ç¾©ãªã©ãå«ã¾ãã¦ããï¼ 685 686 ---------------------------------------- 687 $ æ¨æºãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¤ã³ã¯ã«ã¼ã 562 オフセットファイル生成用テンプレートファイルには,以下の内容を記述する. 563 564 (1) 標準テンプレートファイルのインクルード 565 566 オフセットファイル生成用の標準テンプレートファイル(kernel/genoffset.tf) 567 をインクルードする.標準テンプレートファイルには,以下で用いるDEFINE関 568 数やDEFINE_BIT関数の定義などが含まれている. 569 570 ---------------------------------------- 571 $ 標準テンプレートファイルのインクルード 688 572 $INCLUDE "kernel/genoffset.tf"$ 689 573 ---------------------------------------- 690 574 691 (2) ãªãã»ããå¤ã®ãã¯ãå®ç¾©ã®çæ692 693 DEFINE é¢æ°ãç¨ãã¦ï¼ãªãã»ããå¤ã®ãã¯ãå®ç¾©ãçæããï¼ä¾ãã°ï¼TCBä¸ã®694 ã¿ã¹ã¯ã³ã³ããã¹ããããã¯ï¼tskctxbï¼ã«å«ã¾ããpcãã£ã¼ã«ãã®ãªãã»ãã 695 å¤ãï¼TCB_pcã«ãã¯ãå®ç¾©ããå ´åã«ã¯ï¼æ¬¡ã®ããã«è¨è¿°ããï¼ 696 697 ---------------------------------------- 698 $ ãªãã»ããå¤ã®ãã¯ãå®ç¾©ã®çæ575 (2) オフセット値のマクロ定義の生成 576 577 DEFINE関数を用いて,オフセット値のマクロ定義を生成する.例えば,TCB中の 578 タスクコンテキストブロック(tskctxb)に含まれるpcフィールドのオフセット 579 値を,TCB_pcにマクロ定義する場合には,次のように記述する. 580 581 ---------------------------------------- 582 $ オフセット値のマクロ定義の生成 699 583 $DEFINE("TCB_pc", offsetof_TCB_pc)$ 700 584 ---------------------------------------- 701 585 702 ããã§ï¼DEFINEé¢æ°ã®ç¬¬1ãã©ã¡ã¼ã¿ã¯ãã¯ãå®ç¾©ããã·ã³ãã«ï¼ç¬¬2ãã©ã¡ã¼ 703 ã¿ã¯ï¼ãªãã»ããå¤ãä¿æããã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®å¤æ°ã§ããï¼ 704 705 ã¾ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãï¼ãªãã»ããå¤ãä¿æããå¤æ°ï¼ä¸ã®ä¾ã§ã¯ 706 offsetof_TCB_pc ï¼ã«å¤ãè¨å®ããããã«ï¼target_def.csvï¼ã¾ãã¯ï¼åçã®å½¹707 å²ãæã¤ãã¡ã¤ã«ï¼ã«æ¬¡ã®ä¾ã®ãããªè¡ã追å ããï¼ 586 ここで,DEFINE関数の第1パラメータはマクロ定義するシンボル,第2パラメー 587 タは,オフセット値を保持するコンフィギュレータの変数である. 588 589 また,コンフィギュレータが,オフセット値を保持する変数(上の例では 590 offsetof_TCB_pc)に値を設定するために,target_def.csv(または,同等の役 591 割を持つファイル)に次の例のような行を追加する. 708 592 709 593 ---------------------------------------- … … 711 595 ---------------------------------------- 712 596 713 ãã ãï¼åãªãã¸ã§ã¯ãã®åæåãããã¯ã®ã¿ã¼ã²ããéä¾åã®ãã£ã¼ã«ãã® 714 ãªãã»ããå¤ãåå¾ããããã®è¨è¿°ã¯ï¼kernel/kernel_def.csvã«å«ã¾ãã¦ããï¼ 715 kernel/kernel_def.csvã«å«ã¾ãã¦ããè¨è¿°ã¯ï¼target_def.csvï¼ã¾ãã¯ï¼åç 716 ã®å½¹å²ãæã¤ãã¡ã¤ã«ï¼ã«è¿½å ããå¿ 717 è¦ã¯ãªãï¼ 718 719 (3) ããããªãã»ããå¤çã®ãã¯ãå®ç¾©ã®çæ 720 721 DEFINE_BITé¢æ°ãç¨ãã¦ï¼ãããã®ãªãã»ããå¤ï¼ãããä½ç½®ï¼ããããã¹ã¯ 722 ã®ãã¯ãå®ç¾©ãçæããï¼ä¾ãã°ï¼TCBä¸ã®enatexãã£ã¼ã«ãã®ãªãã»ããå¤ï¼ 723 ãããä½ç½®ï¼ããããã¹ã¯ãï¼ããããTCB_enatexï¼TCB_enatex_bitï¼ 724 TCB_enatex_maskã«ãã¯ãå®ç¾©ããå ´åã«ã¯ï¼æ¬¡ã®ããã«è¨è¿°ããï¼ 597 ただし,各オブジェクトの初期化ブロックのターゲット非依存のフィールドの 598 オフセット値を取得するための記述は,kernel/kernel_def.csvに含まれている. 599 kernel/kernel_def.csvに含まれている記述は,target_def.csv(または,同等 600 の役割を持つファイル)に追加する必要はない. 601 602 (3) ビットオフセット値等のマクロ定義の生成 603 604 DEFINE_BIT関数を用いて,ビットのオフセット値,ビット位置,ビットマスク 605 のマクロ定義を生成する.例えば,TCB中のenatexフィールドのオフセット値, 606 ビット位置,ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit, 607 TCB_enatex_maskにマクロ定義する場合には,次のように記述する. 725 608 726 609 ---------------------------------------- … … 728 611 ---------------------------------------- 729 612 730 ããã§ï¼DEFINE_BITé¢æ°ã®ç¬¬1ãã©ã¡ã¼ã¿ã¯ãã¯ãå®ç¾©ããã·ã³ãã«ï¼ã®å 731 é é¨ 732 åï¼ï¼ç¬¬2ãã©ã¡ã¼ã¿ã¯æ§é ä½ã®ãµã¤ãºã§ããï¼ç¬¬3ãã©ã¡ã¼ã¿ã«ã¯ï¼ãããã® 733 ãªãã»ããï¼ãããä½ç½®ï¼ããããã¹ã¯ãï¼8ãããåä½ï¼ãã¤ãåä½ï¼ã§æ±ã 734 ãå ´åã«ã¯"B"ãï¼16ãããåä½ã§æ±ããå ´åã«ã¯"H"ãï¼32ãããåä½ã§æ±ã 735 ãå ´åã«ã¯"W"ãæå®ããï¼ãªãï¼ãããä½ç½®ã¯ï¼LSBã0ã¨ããå¤ï¼ããããªã 736 ã«ã¨ã³ãã£ã¢ã³ãæ³å®ï¼ãæ±ããï¼ 737 738 ã¾ãï¼target_cfg1_out.hï¼ã¾ãã¯ï¼ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ã«ï¼ 739 ããããªãã»ããå¤çãæ±ããããã®æ§é ä½ã®å¤æ°å®ç¾©ã追å ããï¼ãã®æ§é 740 ä½ã®å¤æ°ã¯ï¼å称ããã¯ãå®ç¾©ããã·ã³ãã«ï¼DEFINE_BITé¢æ°ã®ç¬¬1ãã©ã¡ã¼ã¿ï¼ 741 ã¨ãï¼å¯¾è±¡ã®ãããã®ã¿ã1ã§ï¼ä»ã®ãã¹ã¦ã®ãããã0ã«ãªãããã«åæåã 742 ãï¼ã¾ãï¼const修飾åãä»å ããï¼ä¾ãã°ï¼TCBä¸ã®enatexãã£ã¼ã«ãã®ãã 743 ããªãã»ããå¤çãæ±ããå ´åã«ã¯ï¼æ¬¡ã®ãããªå®ç¾©ã追å ããï¼tskctxbã®å 744 æå¤ã¯ï¼ã¿ã¼ã²ããä¾åãªã®ã§æ³¨æãããã¨ï¼ï¼ 613 ここで,DEFINE_BIT関数の第1パラメータはマクロ定義するシンボル(の先頭部 614 分),第2パラメータは構造体のサイズである.第3パラメータには,ビットの 615 オフセット,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求め 616 る場合には"B"を,16ビット単位で求める場合には"H"を,32ビット単位で求め 617 る場合には"W"を指定する.なお,ビット位置は,LSBを0とした値(ビットリト 618 ルエンディアンを想定)を求める. 619 620 また,target_cfg1_out.h(または,そこからインクルードされるファイル)に, 621 ビットオフセット値等を求めるための構造体の変数定義を追加する.この構造 622 体の変数は,名称をマクロ定義するシンボル(DEFINE_BIT関数の第1パラメータ) 623 とし,対象のビットのみが1で,他のすべてのビットが0になるように初期化す 624 る.また,const修飾子を付加する.例えば,TCB中のenatexフィールドのビッ 625 トオフセット値等を求める場合には,次のような定義を追加する(tskctxbの初 626 期値は,ターゲット依存なので注意すること). 745 627 746 628 ---------------------------------------- … … 768 650 ---------------------------------------- 769 651 770 ããã«ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãï¼æ§é ä½ã®ãµã¤ãºï¼ä¸ã®ä¾ã§ã¯sizeof_TCBï¼ã« 771 å¤ãè¨å®ããããã«ï¼target_def.csvï¼ã¾ãã¯ï¼åçã®å½¹å²ãæã¤ãã¡ã¤ã«ï¼ 772 ã«æ¬¡ã®ä¾ã®ãããªè¡ã追å ããï¼ 652 さらに,コンフィギュレータが,構造体のサイズ(上の例ではsizeof_TCB)に 653 値を設定するために,target_def.csv(または,同等の役割を持つファイル) 654 に次の例のような行を追加する. 773 655 774 656 ---------------------------------------- … … 776 658 ---------------------------------------- 777 659 778 ãã ãï¼åè¿°ããéãï¼kernel/kernel_def.csvã«å«ã¾ãã¦ããè¨è¿°ã¯ï¼ 779 target_def.csvï¼ã¾ãã¯ï¼åçã®å½¹å²ãæã¤ãã¡ã¤ã«ï¼ã«è¿½å ããå¿ 780 è¦ã¯ãªãï¼ 781 782 æå¾ã«ï¼target_cfg1_out.hï¼ã¾ãã¯ï¼ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ 783 ã«ï¼offset.hãçæããä»çµã¿ãæ£ããåä½ãã¦ãããã¨ã確èªããããã®æ¬¡ 784 ã®è¨è¿°ã追å ããï¼ 660 ただし,前述した通り,kernel/kernel_def.csvに含まれている記述は, 661 target_def.csv(または,同等の役割を持つファイル)に追加する必要はない. 662 663 最後に,target_cfg1_out.h(または,そこからインクルードされるファイル) 664 に,offset.hを生成する仕組みが正しく動作していることを確認するための次 665 の記述を追加する. 785 666 786 667 ---------------------------------------- … … 790 671 ---------------------------------------- 791 672 792 2.5.2 makeoffset.cã¨genoffsetãç¨ããæ¹æ³ 793 794 makeoffset.cã¯ï¼ã©ã®ãªãã»ããå¤ãoffset.hã«çæããããæå®ãããã¡ã¤ 795 ã«ã§ï¼ã¿ã¼ã²ããä¾åé¨ã§ç¨æããï¼genoffsetã¯ï¼makeoffset.cãã³ã³ãã¤ã« 796 ãã¦å¾ãããã¢ã»ã³ããªã½ã¼ã¹ãã¡ã¤ã«ããï¼offset.hãçæããã¹ã¯ãªãã 797 ã§ããï¼genoffsetã¯ï¼GNUéçºç°å¢ã«ã®ã¿å¯¾å¿ãã¦ããï¼ 798 799 makeoffset.cãè¨è¿°ããå ´åã«ã¯ï¼æ¢åã®ã¿ã¼ã²ããä¾åé¨ã«å«ã¾ãã 800 makeoffset.cãä¿®æ£ããã®ãè¿éã§ããï¼æ¨æºçãªmakeoffset.cã¯ï¼ä»¥ä¸ã®6㤠801 ã®é¨åã§æ§æããã¦ããï¼ãªãï¼makeoffset.cãæ°ãã«è¨è¿°ããéã«ã¯ï¼ 802 offset.hã«å¦¥å½ãªå®ç¾©ãçæããã¦ãããã¨ã確èªãã¹ãã§ããï¼ 803 804 (1) å¿ 805 è¦ãªãã¡ã¤ã«ã®ã¤ã³ã¯ã«ã¼ã 806 807 ãªãã»ããå¤ãæ±ããããã£ã¼ã«ããå«ãæ§é ä½ãå®ç¾©ããããããã¡ã¤ã«ã 808 ã¤ã³ã¯ã«ã¼ãããï¼TCBä¸ã®ãã£ã¼ã«ãã®ãªãã»ããå¤ãæ±ãããå ´åã«ã¯ï¼ä»¥ 809 ä¸ã®3è¡ãå«ããã°ããï¼ 673 2.5.2 makeoffset.cとgenoffsetを用いる方法 674 675 makeoffset.cは,どのオフセット値をoffset.hに生成するかを指定するファイ 676 ルで,ターゲット依存部で用意する.genoffsetは,makeoffset.cをコンパイル 677 して得られるアセンブリソースファイルから,offset.hを生成するスクリプト 678 である.genoffsetは,GNU開発環境にのみ対応している. 679 680 makeoffset.cを記述する場合には,既存のターゲット依存部に含まれる 681 makeoffset.cを修正するのが近道である.標準的なmakeoffset.cは,以下の6つ 682 の部分で構成されている.なお,makeoffset.cを新たに記述した際には, 683 offset.hに妥当な定義が生成されていることを確認すべきである. 684 685 (1) 必要なファイルのインクルード 686 687 オフセット値を求めたいフィールドを含む構造体を定義するヘッダファイルを 688 インクルードする.TCB中のフィールドのオフセット値を求めたい場合には,以 689 下の3行を含めればよい. 810 690 811 691 #include "kernel_impl.h" … … 813 693 #include "sil.h" 814 694 815 (2) ãªãã»ããå¤åºåç¨ãã¯ãã®å®ç¾© 816 817 æ§é ä½ä¸ã®ãã£ã¼ã«ãã®ãªãã»ããå¤ã®å®ç¾©ãçæããããã«ç¨ãããã¯ã 818 ï¼OFFSET_DEFã¨OFFSET_DEF2ï¼ã®å®ç¾©ï¼ãããã®ãã¯ãã®å®ç¾©ã¯ï¼ä¿®æ£ããå¿ 819 è¦ 820 ããªãï¼ 821 822 (3) ãªãã»ããå¤åºåç¨é¢æ°ã®å®ç¾© 823 824 æ§é ä½ä¸ã®ãã£ã¼ã«ãã®ãªãã»ããå¤ã®å®ç¾©ãçæããããã®é¢æ° 825 ï¼makeoffsetï¼ã®å®ç¾©ï¼ãªãã»ããå¤ã®ãã¯ãå®ç¾©ãçæããããã£ã¼ã«ãæ¯ 826 ã«ï¼æ¬¡ã®ããããã®ãã¯ããè¨è¿°ããï¼ 695 (2) オフセット値出力用マクロの定義 696 697 構造体中のフィールドのオフセット値の定義を生成するために用いるマクロ 698 (OFFSET_DEFとOFFSET_DEF2)の定義.これらのマクロの定義は,修正する必要 699 がない. 700 701 (3) オフセット値出力用関数の定義 702 703 構造体中のフィールドのオフセット値の定義を生成するための関数 704 (makeoffset)の定義.オフセット値のマクロ定義を生成したいフィールド毎 705 に,次のいずれかのマクロを記述する. 827 706 828 707 (2-5-2-1) OFFSET_DEF(TYPE, FIELD) 829 708 830 TYPE ã«æ§é ä½ã®ãã¼ã¿ååï¼FIELDã«ãã®æ§é ä½ä¸ã®ãã£ã¼ã«ããæå®ããã¨ï¼831 TYPE_FIELD ã¨ããååã®ã·ã³ãã«ã«ï¼ãã®ãã£ã¼ã«ãã®ãªãã»ããå¤ããã¯ã832 å®ç¾©ããè¨è¿°ãçæããï¼ 709 TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると, 710 TYPE_FIELDという名前のシンボルに,そのフィールドのオフセット値をマクロ 711 定義する記述を生成する. 833 712 834 713 (2-5-2-2) OFFSET_DEF2(TYPE, FIELD, FIELDNAME) 835 714 836 TYPEã«æ§é ä½ã®ãã¼ã¿ååï¼FIELDã«ãã®æ§é ä½ä¸ã®ãã£ã¼ã«ããæå®ããã¨ï¼ 837 TYPE_FIELDNAMEã¨ããååã®ã·ã³ãã«ã«ï¼ãã®ãã£ã¼ã«ãã®ãªãã»ããå¤ãã 838 ã¯ãå®ç¾©ããè¨è¿°ãçæããï¼æ§é ä½ã«å«ã¾ããæ§é ä½ä¸ã®ãã£ã¼ã«ãã®ãªã 839 ã»ããå¤ãæ±ãããå ´åã«ã¯ï¼ãã¡ãã®ãã¯ãã使ç¨ããï¼ 840 841 (4) ã¨ã³ãã£ã¢ã³ãåç 842 §ããããã®é¢æ°ã®å®ç¾© 843 844 SILã§å®ç¾©ãããã¨ã³ãã£ã¢ã³ãåç 845 §ããããã®é¢æ°ï¼sil_endianï¼ã®å®ç¾©ï¼ã 846 ã®é¢æ°ã®å®ç¾©ã¯ï¼ä¿®æ£ããå¿ 847 è¦ããªãï¼ 848 849 (5) ããããªãã»ããå¤åºåã®ããã®åç 850 §å®ç¾© 851 852 åæå¤ãæã£ãå¤æ°å®ç¾©ã«å¯¾ãã¦ï¼ã³ã³ãã¤ã©ãçæããã¢ã»ã³ããªå½ä»¤ãå 853 ç 854 §ããããã®å¤æ°ï¼BIT_REF_4ï¼BIT_REF_2ï¼BIT_REF_1ï¼ã®å®ç¾©ï¼ãããã®å®ç¾© 855 ã¯ï¼ã»ã¨ãã©ã®å ´åã«ä¿®æ£ããå¿ 856 è¦ããªãï¼ãã ãï¼uint8_tåã®ãµãã¼ããã 857 ã¦ããªãã¿ã¼ã²ããã§ã¯ï¼BIT_REF_1ã®å®ç¾©ã¯åé¤ããå¿ 858 è¦ãããï¼ã¾ãï¼ã㤠859 ã³ã¿ã64ãããã®ã¿ã¼ã²ããçã§ã¯ï¼BIT_REF_8ã®å®ç¾©ã追å ããªããã°ãªã㪠860 ãã¨æãããï¼ 861 862 (6) ããããªãã»ããå¤åºåç¨å¤æ°ã®å®ç¾© 863 864 ãããã®ãªãã»ããå¤ï¼ãããä½ç½®ï¼ããããã¹ã¯ã®å®ç¾©ãçæããããã®ãã¼ 865 ã¿åã®å®ç¾©ï¼ãããã®å®ç¾©ãçæãããããããã£ã¼ã«ãæ¯ã«ï¼ä»¥ä¸ã®èª¬æã 866 ãå¤æ°ãå®ç¾©ããï¼ 867 868 æ§é ä½ã®ãã¼ã¿ååãTYPEï¼ãã®æ§é ä½ä¸ã®ããããã£ã¼ã«ãåãFIELDã®å ´å 869 ã«ï¼ãã¼ã¿åãTYPEã§ï¼å¤æ°åãBIT_xy_TYPE_FIELDã®å¤æ°ãå®ç¾©ããï¼ã¾ãï¼ 870 ãã®å¤æ°ãï¼å¯¾è±¡ã®ãããã®ã¿ã1ã§ï¼ä»ã®ãã¹ã¦ã®ãããã0ã«ãªãããã«å 871 æåããï¼ããã§ï¼xã¯ã¨ã³ãã£ã¢ã³ãæå®ããæåã§ï¼Bï¼ããã°ã¨ã³ãã£ã¢ 872 ã³ï¼ã¾ãã¯Lï¼ãªãã«ã¨ã³ãã£ã¢ã³ï¼ãæå®ããï¼ã¾ãyã«ã¯ï¼ãããã®ãªãã»ã 873 ãï¼ãããä½ç½®ï¼ããããã¹ã¯ãï¼8ãããåä½ï¼ãã¤ãåä½ï¼ã§æ±ããå ´åã« 874 ã¯Bãï¼16ãããåä½ã§æ±ããå ´åã«ã¯Hãï¼32ãããåä½ã§æ±ããå ´åã«ã¯Wã 875 æå®ããï¼ 876 877 ããã«ããï¼TYPE_FIELDã¨ããååã®ã·ã³ãã«ã«ãã®ãããã®ãªãã»ããï¼ 878 TYPE_FIELD_bitã¨ããååã®ã·ã³ãã«ã«ãããä½ç½®ï¼TYPE_FIELD_maskã¨ããå 879 åã®ã·ã³ãã«ã«ããããã¹ã¯ããã¯ãå®ç¾©ããè¨è¿°ãçæããï¼ãªãï¼ããã 880 ä½ç½®ã¯ï¼LSBã0ã¨ããå¤ï¼ããããªãã«ã¨ã³ãã£ã¢ã³ãæ³å®ï¼ãæ±ããï¼ 881 882 2.6 ãªã³ã¯æ¹æ³ã®è¨å® 883 884 (2-6-1) LDSCRIPT ãªã³ã«ã¹ã¯ãªããã®ãã¡ã¤ã«å 885 886 éçºç°å¢ã«æ¨æºã®ãªã³ã«ã¹ã¯ãªããã使ç¨ã§ããªãå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾å 887 é¨ã§ãªã³ã«ã¹ã¯ãªãããç¨æãï¼ãã®ãã¡ã¤ã«åããã®å¤æ°ã«å®ç¾©ããï¼ 888 889 (2-6-2) TEXT_START_ADDRESS ããã¹ãã»ã¯ã·ã§ã³ã®å 890 é çªå° 891 (2-6-3) DATA_START_ADDRESS ãã¼ã¿ã»ã¯ã·ã§ã³ã®å 892 é çªå° 893 894 åã»ã¯ã·ã§ã³ã®å 895 é çªå°ã®æå®ãå¿ 896 è¦ãªå ´åã«ã¯ï¼ãããã®å¤æ°ã«å 897 é çªå°ã 898 å®ç¾©ããï¼ 899 900 (2-6-4) START_OBJS å 901 é ã«ãªã³ã¯ãã¹ãã¢ã¸ã¥ã¼ã«å 902 (2-6-5) END_OBJS æå¾ã«ãªã³ã¯ãã¹ãã¢ã¸ã¥ã¼ã«å 903 904 ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼ãã¼ãã¢ã¸ã¥ã¼ã«ã®å 905 é ã¨æå¾ã«ãªã³ã¯ãã¹ãã¢ã¸ã¥ã¼ 906 ã«ãï¼ã¿ã¼ã²ããä¾åé¨ã§ç¨æããå¿ 907 è¦ãããï¼å¤ãã®å ´åï¼ã¹ã¿ã¼ãã¢ãã 908 ã¢ã¸ã¥ã¼ã«ããã¼ãã¢ã¸ã¥ã¼ã«ã®å 909 é ã«ãªã³ã¯ããå¿ 910 è¦ãããï¼ 911 912 ãã¼ãã¢ã¸ã¥ã¼ã«ã®å 913 é ã«ãªã³ã¯ãã¹ãããã°ã©ã ãããå ´åã«ã¯ï¼Makefile 914 ã®ã¿ã¼ã²ããä¾åé¨ã«ããã¦ï¼ãã®ãªãã¸ã§ã¯ããã¡ã¤ã«åãSTART_OBJSã«å® 915 義ãï¼ããã«å¯¾ããã³ã³ãã¤ã«ã«ã¼ã«ã¨ä¾åé¢ä¿ä½æã«ã¼ã«ãå®ç¾©ããï¼ãã¼ 916 ãã¢ã¸ã¥ã¼ã«ã®æå¾ã«ãªã³ã¯ãã¹ãã¢ã¸ã¥ã¼ã«ãããå ´åã«ã¯ï¼ãã®ãªãã¸ã§ 917 ã¯ããã¡ã¤ã«åãEND_OBJSã«å®ç¾©ãï¼ããã«å¯¾ããã³ã³ãã¤ã«ã«ã¼ã«ã¨ä¾åé¢ 918 ä¿ä½æã«ã¼ã«ãå®ç¾©ããï¼ã¾ãï¼æ¨æºã®ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ï¼crt0.oï¼ 919 ããªã³ã¯ããªãããã«ï¼LDFLAGSã¨CFG1_OUT_LDFLAGSã«-nostdlibã追å ããå¿ 920 921 è¦ãããï¼ããã«ï¼-nostdlibãã¤ãããã¨ã§æ¨æºã©ã¤ãã©ãªããªã³ã¯ãããªã 922 ãªãããï¼LIBSã«-lgccã追å ããªããã°ãªããªãï¼ 923 924 ä¾ãã°ï¼ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ã½ã¼ã¹ãã¡ã¤ã«ãstart.Sã®å ´åã«ã¯ï¼ 925 Makefileã®ã¿ã¼ã²ããä¾åé¨ã«æ¬¡ã®ãããªè¨è¿°ãå 926 ¥ããã¨ããï¼ 927 928 ---------------------------------------- 929 # ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ãªãã¸ã§ã¯ããã¡ã¤ã«å 715 TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると, 716 TYPE_FIELDNAMEという名前のシンボルに,そのフィールドのオフセット値をマ 717 クロ定義する記述を生成する.構造体に含まれる構造体中のフィールドのオフ 718 セット値を求めたい場合には,こちらのマクロを使用する. 719 720 (4) エンディアンを参照するための関数の定義 721 722 SILで定義されたエンディアンを参照するための関数(sil_endian)の定義.こ 723 の関数の定義は,修正する必要がない. 724 725 (5) ビットオフセット値出力のための参照定義 726 727 初期値を持った変数定義に対して,コンパイラが生成するアセンブリ命令を参 728 照するための変数(BIT_REF_4,BIT_REF_2,BIT_REF_1)の定義.これらの定義 729 は,ほとんどの場合に修正する必要がない.ただし,uint8_t型のサポートされ 730 ていないターゲットでは,BIT_REF_1の定義は削除する必要がある.また,ポイ 731 ンタが64ビットのターゲット等では,BIT_REF_8の定義を追加しなければならな 732 いと思われる. 733 734 (6) ビットオフセット値出力用変数の定義 735 736 ビットのオフセット値,ビット位置,ビットマスクの定義を生成するためのデー 737 タ型の定義.これらの定義を生成したいビットフィールド毎に,以下の説明す 738 る変数を定義する. 739 740 構造体のデータ型名がTYPE,その構造体中のビットフィールド名がFIELDの場合 741 に,データ型がTYPEで,変数名がBIT_xy_TYPE_FIELDの変数を定義する.また, 742 その変数を,対象のビットのみが1で,他のすべてのビットが0になるように初 743 期化する.ここで,xはエンディアンを指定する文字で,B(ビッグエンディア 744 ン)またはL(リトルエンディアン)を指定する.またyには,ビットのオフセッ 745 ト,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求める場合に 746 はBを,16ビット単位で求める場合にはHを,32ビット単位で求める場合にはWを 747 指定する. 748 749 これにより,TYPE_FIELDという名前のシンボルにそのビットのオフセット, 750 TYPE_FIELD_bitという名前のシンボルにビット位置,TYPE_FIELD_maskという名 751 前のシンボルにビットマスクをマクロ定義する記述を生成する.なお,ビット 752 位置は,LSBを0とした値(ビットリトルエンディアンを想定)を求める. 753 754 2.6 リンク方法の設定 755 756 (2-6-1) LDSCRIPT リンカスクリプトのファイル名 757 758 開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存 759 部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する. 760 761 (2-6-2) TEXT_START_ADDRESS テキストセクションの先頭番地 762 (2-6-3) DATA_START_ADDRESS データセクションの先頭番地 763 764 各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を 765 定義する. 766 767 (2-6-4) START_OBJS 先頭にリンクすべきモジュール名 768 (2-6-5) END_OBJS 最後にリンクすべきモジュール名 769 770 ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきモジュー 771 ルを,ターゲット依存部で用意する必要がある.多くの場合,スタートアップ 772 モジュールをロードモジュールの先頭にリンクする必要がある. 773 774 ロードモジュールの先頭にリンクすべきプログラムがある場合には,Makefile 775 のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定 776 義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー 777 ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ 778 クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関 779 係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o) 780 をリンクしないように,LDFLAGSとCFG1_OUT_LDFLAGSに-nostdlibを追加する必 781 要がある.さらに,-nostdlibをつけることで標準ライブラリがリンクされなく 782 なるため,LIBSに-lgccを追加しなければならない. 783 784 例えば,スタートアップモジュールのソースファイルがstart.Sの場合には, 785 Makefileのターゲット依存部に次のような記述を入れるとよい. 786 787 ---------------------------------------- 788 # スタートアップモジュールのオブジェクトファイル名 930 789 START_OBJS = start.o 931 790 932 # ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ã³ã³ãã¤ã«ã«ã¼ã«791 # スタートアップモジュールのコンパイルルール 933 792 $(START_OBJS): %.o: %.S 934 793 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< 935 794 936 # ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ä¾åé¢ä¿ä½æã«ã¼ã«795 # スタートアップモジュールの依存関係作成ルール 937 796 $(START_OBJS:.o=.d): %.d: %.S 938 797 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \ 939 798 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend 940 799 941 # ãªã³ã«ã«å¯¾ãããªãã·ã§ã³800 # リンカに対するオプション 942 801 LDFLAGS := -nostdlib $(LDFLAGS) 943 802 CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS) … … 945 804 ---------------------------------------- 946 805 947 ã¾ãï¼GNUéçºç°å¢ã§ï¼ã³ã³ãã¤ã©ã«æ¨æºã®crtbegin.oã¨crtend.oãç¨ããå ´å 948 ã«ã¯ï¼Makefile ã®ã¿ã¼ã²ããä¾åé¨ã«æ¬¡ã®ãããªè¨è¿°ãå 949 ¥ããã¨ããï¼ 950 951 ---------------------------------------- 952 # ãªãã¸ã§ã¯ããã¡ã¤ã«å 806 また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合 807 には,Makefile のターゲット依存部に次のような記述を入れるとよい. 808 809 ---------------------------------------- 810 # オブジェクトファイル名 953 811 START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o) 954 812 END_OBJS = $(shell $(CC) -print-file-name=crtend.o) 955 813 956 # ä¾åé¢ä¿ä½æã«ã¼ã«814 # 依存関係作成ルール 957 815 $(START_OBJS:.o=.d): %.d: 958 816 $(END_OBJS:.o=.d): %.d: 959 817 960 # ãªã³ã«ã«å¯¾ãããªãã·ã§ã³818 # リンカに対するオプション 961 819 LDFLAGS := -nostdlib $(LDFLAGS) 962 820 CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS) … … 964 822 ---------------------------------------- 965 823 966 ãã®å ´åï¼ãããã®ãã¡ã¤ã«ãã³ã³ãã¤ã«ãããã¨ã¯ãªãããï¼ã³ã³ãã¤ã«ã«ã¼ 967 ã«ã¯ä¸è¦ã§ããï¼ã¾ãï¼ä¾åé¢ä¿ä½æã«ã¼ã«ã¯ããã¼ã§ããï¼ä¾åé¢ä¿ä½æã«ã¼ 968 ã«ããªãã¨ã¨ã©ã¼ã«ãªãï¼ï¼ 969 970 (2-6-6) HIDDEN_OBJS æå®ããªãã¦ããªã³ã¯ãããã¢ã¸ã¥ã¼ã«å 971 972 ãã¼ãã¢ã¸ã¥ã¼ã«ã«ãªã³ã¯ãã¹ãã¢ã¸ã¥ã¼ã«ãï¼ãªã³ã«ã«å¯¾ãããã©ã¡ã¼ã¿ã§ 973 ã¯ãªãï¼ãªã³ã«ã¹ã¯ãªããä¸ã«ï¼ä¾ãã°ï¼GNUéçºç°å¢ã®ãªã³ã«ã¹ã¯ãªããã® 974 STARTUPã使ã£ã¦ï¼è¨è¿°ããå ´åã«ã¯ï¼ãã®ãªãã¸ã§ã¯ããã¡ã¤ã«åãï¼ 975 ï¼START_OBJSã¾ãã¯END_OBJSã§ã¯ãªãï¼HIDDEN_OBJSã«å®ç¾©ãï¼ããã«å¯¾ããã³ 976 ã³ãã¤ã«ã«ã¼ã«ã¨ä¾åé¢ä¿ä½æã«ã¼ã«ãå®ç¾©ããï¼HIDDEN_OBJSã«å®ç¾©ãã㢠977 ã¸ã¥ã¼ã«ã¯ï¼ãªã³ã«ã«å¯¾ãããã©ã¡ã¼ã¿ããã¯é¤å¤ãããï¼LDFLAGS㨠978 CFG1_OUT_LDFLAGSï¼LIBSã«ã¤ãã¦ã¯ï¼START_OBJSã¾ãã¯END_OBJSãç¨ããå ´å 979 ã¨åæ§ã§ããï¼ 980 981 ä¾ãã°ï¼ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ã½ã¼ã¹ãã¡ã¤ã«ãstart.Sã§ï¼start.oã 982 ãªã³ã¯ãããã¨ããªã³ã«ã¹ã¯ãªããä¸ã«è¨è¿°ããå ´åã«ã¯ï¼Makefileã®ã¿ã¼ã²ã 983 ãä¾åé¨ã«æ¬¡ã®ãããªè¨è¿°ãå 984 ¥ããã¨ããï¼ 985 986 ---------------------------------------- 987 # ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ãªãã¸ã§ã¯ããã¡ã¤ã«å 824 この場合,これらのファイルをコンパイルすることはないため,コンパイルルー 825 ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー 826 ルがないとエラーになる). 827 828 (2-6-6) HIDDEN_OBJS 指定しなくてもリンクされるモジュール名 829 830 ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで 831 はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの 832 STARTUPを使って)記述する場合には,そのオブジェクトファイル名を, 833 (START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ 834 ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ 835 ジュールは,リンカに対するパラメータからは除外される.LDFLAGSと 836 CFG1_OUT_LDFLAGS,LIBSについては,START_OBJSまたはEND_OBJSを用いる場合 837 と同様である. 838 839 例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを 840 リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ 841 ト依存部に次のような記述を入れるとよい. 842 843 ---------------------------------------- 844 # スタートアップモジュールのオブジェクトファイル名 988 845 HIDDEN_OBJS = start.o 989 846 990 # ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ã³ã³ãã¤ã«ã«ã¼ã«847 # スタートアップモジュールのコンパイルルール 991 848 $(HIDDEN_OBJS): %.o: %.S 992 849 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< 993 850 994 # ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®ä¾åé¢ä¿ä½æã«ã¼ã«851 # スタートアップモジュールの依存関係作成ルール 995 852 $(HIDDEN_OBJS:.o=.d): %.d: %.S 996 853 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \ 997 854 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend 998 855 999 # ãªã³ã«ã«å¯¾ãããªãã·ã§ã³856 # リンカに対するオプション 1000 857 LDFLAGS := -nostdlib $(LDFLAGS) 1001 858 CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS) … … 1003 860 ---------------------------------------- 1004 861 1005 2.7 ä¾åé¢ä¿ã®å®ç¾© 1006 1007 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®åãã¹ã«å¯¾ãã¦ï¼ã¿ã¼ã²ããä¾åã®ãã¡ã¤ã«ã¸ã®ä¾åé¢ 1008 ä¿ãå®ç¾©ããï¼å 1009 ·ä½çã«ã¯ï¼ãã¹1ï¼ãã¹2ï¼ãã¹3ãä¾åãããã¡ã¤ã«ãï¼ãã 1010 ããcfg1_out.cï¼kernel_cfg.timestampï¼$(OBJFILE)ã«å¯¾ããä¾åé¢ä¿ã®å½¢ã§ 1011 è¨è¿°ããï¼ 1012 1013 ã»ã¨ãã©ã®å ´åã«ï¼ã¿ã¼ã²ããä¾åé¨ãã£ã¬ã¯ããªã®Makefile.targetã«ã¯ï¼ä»¥ 1014 ä¸ã®è¨è¿°ãå«ããå¿ 1015 è¦ãããï¼ 862 2.7 依存関係の定義 863 864 コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関 865 係を定義する.具体的には,パス1,パス2,パス3が依存するファイルを,それ 866 ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で 867 記述する. 868 869 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以 870 下の記述を含める必要がある. 1016 871 1017 872 ---------------------------------------- … … 1021 876 ---------------------------------------- 1022 877 1023 2.8 ãã®ä»ã®è¨å® 1024 1025 (2-8-1) CLEAN_FILES cleanã«ããåé¤ãããã¡ã¤ã«å 1026 1027 cleanã«ããåé¤ãããã¡ã¤ã«ãã¿ã¼ã²ããä¾åé¨ã§è¿½å ãããå ´åã«ã¯ï¼ãã¡ 1028 ã¤ã«åããã®å¤æ°ã«è¿½å å®ç¾©ããï¼ 1029 1030 (2-8-2) REALCLEAN_FILES realcleanã«ããåé¤ãããã¡ã¤ã«å 1031 1032 realcleanã«ããåé¤ãããã¡ã¤ã«ãã¿ã¼ã²ããä¾åé¨ã§è¿½å ãããå ´åã«ã¯ï¼ 1033 ãã¡ã¤ã«åããã®å¤æ°ã«è¿½å å®ç¾©ããï¼ 1034 1035 1036 ï¼ï¼TOPPERSå 1037 ±éå®ç¾©ã®ã¿ã¼ã²ããä¾åé¨ 1038 1039 TOPPERSå 1040 ±éå®ç¾©ï¼t_stddef.hï¼ã®ã¿ã¼ã²ããä¾åé¨ã¯ï¼target_stddef.hã¾ã 1041 ã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ããã»ããµã»ãããã»éçºç°å¢ä¾å 1042 é¨ã§ç¨æãããããããã¡ã¤ã«ãªã©ï¼ã«å«ããï¼ 1043 1044 3.1 ã¿ã¼ã²ããèå¥ãã¯ã 1045 1046 ã¢ããªã±ã¼ã·ã§ã³ãã·ã¹ãã ãµã¼ãã¹ã§ã¿ã¼ã²ãããèå¥ããããã«ï¼ 1047 "TOPPERS_"ã«ã·ã¹ãã ç¥ç§°ã大æåã«ããæååãé£çµãããã®ï¼ä¾ãã°ï¼ 1048 "TOPPERS_DVE68K"ï¼ããã¯ãå®ç¾©ããï¼ 1049 1050 ã¾ãï¼ã¿ã¼ã²ããä¾åé¨ããããã»ããµä¾åé¨ããããä¾åé¨ãåãåããå ´ 1051 åã«ã¯ï¼"TOPPERS_"ã«ä¾åé¨ç¥ç§°ã大æåã«ããæååãé£çµãããã®ï¼ä¾ã 1052 ã°ï¼"TOPPERS_M68K"ï¼ããã¯ãå®ç¾©ããï¼ 1053 1054 3.2 æ´æ°åã®æ大å¤ã»æå°å¤ã»ãããæ° 1055 1056 (3-2-1) INT_MAX intã«æ ¼ç´ã§ããæ大å¤ï¼C90æºæ ï¼ 1057 (3-2-2) INT_MIN intã«æ ¼ç´ã§ããæå°å¤ï¼C90æºæ ï¼ 1058 (3-2-3) UINT_MAX unsigned intã«æ ¼ç´ã§ããæ大å¤ï¼C90æºæ ï¼ 1059 (3-2-4) LONG_MAX longã«æ ¼ç´ã§ããæ大å¤ï¼C90æºæ ï¼ 1060 (3-2-5) LONG_MIN longã«æ ¼ç´ã§ããæå°å¤ï¼C90æºæ ï¼ 1061 (3-2-6) ULONG_MAX unsigned longã«æ ¼ç´ã§ããæ大å¤ï¼C90æºæ ï¼ 1062 (3-2-7) CHAR_BIT charåã®ãããæ°ï¼C90æºæ ï¼ 1063 1064 æ´æ°åã®æ大å¤ã»æå°å¤ã»ãããæ°ãï¼ãããã®ã·ã³ãã«ã«ãã¯ãã«å®ç¾©ããï¼ 1065 1066 ãããã®ãã¯ãã¯ï¼C90ã«æºæ ãããã®ã§ããï¼éçºç°å¢ã«C90ã«æºæ ãã 1067 limits.hãç¨æããã¦ããå ´åã«ã¯ï¼ãããã®ãã¯ããå®ç¾©ãããã¨ã«ä»£ãã¦ï¼ 1068 limits.hãã¤ã³ã¯ã«ã¼ãããã°ããï¼ 1069 1070 3.3 ãµã¤ãºã®æå®ãããæ´æ°åï¼ãã®æ大å¤ã»æå°å¤ï¼æ´æ°å®æ°ãä½ããã¯ã 1071 1072 (3-3-1) int8_t 符å·ä»ã8ãããæ´æ°ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1073 (3-3-2) uint8_t 符å·ç¡ã8ãããæ´æ°ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1074 (3-3-3) int16_t 符å·ä»ã16ãããæ´æ°ï¼C99æºæ ï¼ 1075 (3-3-4) uint16_t 符å·ç¡ã16ãããæ´æ°ï¼C99æºæ ï¼ 1076 (3-3-5) int32_t 符å·ä»ã32ãããæ´æ°ï¼C99æºæ ï¼ 1077 (3-3-6) uint32_t 符å·ç¡ã32ãããæ´æ°ï¼C99æºæ ï¼ 1078 (3-3-7) int64_t 符å·ä»ã64ãããæ´æ°ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1079 (3-3-8) uint64_t 符å·ç¡ã64ãããæ´æ°ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1080 (3-3-9) int128_t 符å·ä»ã128ãããæ´æ°ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1081 (3-3-10) uint128_t 符å·ç¡ã128ãããæ´æ°ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1082 (3-3-11) int_least8_t 8ããã以ä¸ã®ç¬¦å·ä»ãæ´æ°ï¼C99æºæ ï¼ 1083 (3-3-12) uint_least8_t 8ããã以ä¸ã®ç¬¦å·ç¡ãæ´æ°ï¼C99æºæ ï¼ 1084 (3-3-13) intptr_t ãã¤ã³ã¿ãæ ¼ç´ã§ãããµã¤ãºã®ç¬¦å·ä»ãæ´æ°ï¼C99æºæ ï¼ 1085 (3-3-14) uintptr_t ãã¤ã³ã¿ãæ ¼ç´ã§ãããµã¤ãºã®ç¬¦å·ç¡ãæ´æ°ï¼C99æºæ ï¼ 1086 (3-3-15) INT8_MAX int8_tã«æ ¼ç´ã§ããæ大å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1087 (3-3-16) INT8_MIN int8_tã«æ ¼ç´ã§ããæå°å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1088 (3-3-17) UINT8_MAX uint8_tã«æ ¼ç´ã§ããæ大å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1089 (3-3-18) INT16_MAX int16_tã«æ ¼ç´ã§ããæ大å¤ï¼C99æºæ ï¼ 1090 (3-3-19) INT16_MIN int16_tã«æ ¼ç´ã§ããæå°å¤ï¼C99æºæ ï¼ 1091 (3-3-20) UINT16_MAX uint16_tã«æ ¼ç´ã§ããæ大å¤ï¼C99æºæ ï¼ 1092 (3-3-21) INT32_MAX int32_tã«æ ¼ç´ã§ããæ大å¤ï¼C99æºæ ï¼ 1093 (3-3-22) INT32_MIN int32_tã«æ ¼ç´ã§ããæå°å¤ï¼C99æºæ ï¼ 1094 (3-3-23) UINT32_MAX uint32_tã«æ ¼ç´ã§ããæ大å¤ï¼C99æºæ ï¼ 1095 (3-3-24) INT64_MAX int64_tã«æ ¼ç´ã§ããæ大å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1096 (3-3-25) INT64_MIN int64_tã«æ ¼ç´ã§ããæå°å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1097 (3-3-26) UINT64_MAX uint64_tã«æ ¼ç´ã§ããæ大å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1098 (3-3-27) INT128_MAX int128_tã«æ ¼ç´ã§ããæ大å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1099 (3-3-28) INT128_MIN int128_tã«æ ¼ç´ã§ããæå°å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1100 (3-3-29) UINT128_MAX uint128_tã«æ ¼ç´ã§ããæ大å¤ï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1101 (3-3-30) INT_LEAST8_MAX int_least8_tã«æ ¼ç´ã§ããæ大å¤ï¼C99æºæ ï¼ 1102 (3-3-31) INT_LEAST8_MIN int_least8_tã«æ ¼ç´ã§ããæå°å¤ï¼C99æºæ ï¼ 1103 (3-3-32) UINT_LEAST8_MAX uint_least8_tã«æ ¼ç´ã§ããæ大å¤ï¼C99æºæ ï¼ 1104 (3-3-33) INT8_C(val) int_least8_tåã®å®æ°ãä½ããã¯ãï¼C99æºæ ï¼ 1105 (3-3-34) UINT8_C(val) uint_least8_tåã®å®æ°ãä½ããã¯ãï¼C99æºæ ï¼ 1106 (3-3-35) INT16_C(val) int16_tåã®å®æ°ãä½ããã¯ãï¼C99æºæ ï¼ 1107 (3-3-36) UINT16_C(val) uint16_tåã®å®æ°ãä½ããã¯ãï¼C99æºæ ï¼ 1108 (3-3-37) INT32_C(val) int32_tåã®å®æ°ãä½ããã¯ãï¼C99æºæ ï¼ 1109 (3-3-38) UINT32_C(val) uint32_tåã®å®æ°ãä½ããã¯ãï¼C99æºæ ï¼ 1110 (3-3-39) INT64_C(val) int64_tåã®å®æ°ãä½ããã¯ãï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1111 (3-3-40) UINT64_C(val) uint64_tåã®å®æ°ãä½ããã¯ãï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1112 (3-3-41) INT128_C(val) int128_tåã®å®æ°ãä½ããã¯ãï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1113 (3-3-42) UINT128_C(val) uint128_tåã®å®æ°ãä½ããã¯ãï¼ãªãã·ã§ã³ï¼C99æºæ ï¼ 1114 1115 æå®ããããµã¤ãºã®æ´æ°åãï¼ãããã®ã·ã³ãã«ã«åå®ç¾©ããï¼ã¾ãï¼ãã¼ã¿ 1116 åã«æ ¼ç´ã§ããæ大å¤ã»æå°å¤ã¨ï¼æ´æ°å®æ°ãä½ããã¯ããï¼ãããã®ã·ã³ã 1117 ã«ã«ãã¯ãå®ç¾©ããï¼ 1118 1119 ãããã®ãã¼ã¿åããã³ãã¯ãã¯ï¼C99ã«æºæ ãããã®ã§ããï¼éçºç°å¢ã«C99 1120 ã«æºæ ããstdint.hãç¨æããã¦ããå ´åã«ã¯ï¼ãããã®ãã¼ã¿åããã³ã㯠1121 ããå®ç¾©ãããã¨ã«ä»£ãã¦ï¼stdint.hãã¤ã³ã¯ã«ã¼ãããã°ããï¼ 1122 1123 ä¸ã§ãªãã·ã§ã³ã¨è¨è¿°ãããã®ã¯ï¼è©²å½ãããã¼ã¿åãã³ã³ãã¤ã©ã§ãµãã¼ã 1124 ããã¦ããå ´åã«ã®ã¿å®ç¾©ãããã¨ã示ãï¼ 1125 1126 3.4 ãµã¤ãºã®æå®ãããæµ®åå°æ°ç¹åï¼ãã®æ大å¤ã»æå°å¤ã®ãã¯ã 1127 1128 (3-4-1) float32_t IEEE754æºæ ã®32ãããå精度浮åå°æ°ç¹æ°ï¼ãªã 1129 ã·ã§ã³ï¼ 1130 (3-4-2) double64_t IEEE754æºæ ã®64ãããå精度浮åå°æ°ç¹æ°ï¼ãªã 1131 ã·ã§ã³ï¼ 1132 (3-4-3) FLOAT32_MIN float32_tã«æ ¼ç´ã§ããæå°ã®æ£è¦åãããæ£ã®æµ® 1133 åå°æ°ç¹æ°ï¼ãªãã·ã§ã³ï¼ 1134 (3-4-4) FLOAT32_MAX float32_tã«æ ¼ç´ã§ãã表ç¾å¯è½ãªæ大ã®æéæµ®å 1135 å°æ°ç¹æ°ï¼ãªãã·ã§ã³ï¼ 1136 (3-4-5) DOUBLE64_MIN double64_tã«æ ¼ç´ã§ããæå°ã®æ£è¦åãããæ£ã®æµ® 1137 åå°æ°ç¹æ°ï¼ãªãã·ã§ã³ï¼ 1138 (3-4-6) DOUBLE64_MAX double64_tã«æ ¼ç´ã§ãã表ç¾å¯è½ãªæ大ã®æéæµ®å 1139 å°æ°ç¹æ°ï¼ãªãã·ã§ã³ï¼ 1140 1141 æå®ããããµã¤ãºã»è¡¨ç¾å½¢å¼ã®æµ®åå°æ°ç¹åãï¼ãããã®ã·ã³ãã«ã«åå®ç¾©ã 1142 ãï¼ã¾ãï¼ãã¼ã¿åã«æ ¼ç´ã§ããæ大å¤ã»æå°å¤ãï¼ãããã®ã·ã³ãã«ã«ã㯠1143 ãå®ç¾©ããï¼ 1144 1145 ããããï¼è©²å½ãããã¼ã¿åãã³ã³ãã¤ã©ã§ãµãã¼ãããã¦ããå ´åã«ã®ã¿å® 1146 義ããï¼ 1147 1148 3.5 ã³ã³ãã¤ã©ã®æ¡å¼µæ©è½ã®ããã®ãã¯ãå®ç¾© 1149 1150 ã³ã³ãã¤ã©ã®æ¡å¼µæ©è½ãç¨ããããã®ãã¯ãã¨ãã¦ï¼å¿ 1151 è¦ã«å¿ãã¦ï¼ä»¥ä¸ã®ã 1152 ã¯ãã®å®ç¾©ãå«ããï¼ 1153 1154 (3-5-1) inlineï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯æªå®ç¾©ï¼ 1155 (3-5-2) Inlineï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯static inlineï¼ 1156 1157 ã¤ã³ã©ã¤ã³é¢æ°ã§ãããã¨ã示ãæå®ï¼Inlineã¯ï¼ã³ã³ãã¤ã«åä½ã«ãã¼ã«ã« 1158 ãªã¤ã³ã©ã¤ã³é¢æ°ã§ãããã¨ã示ãï¼ 1159 1160 (3-5-3) asmï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯æªå®ç¾©ï¼ 1161 (3-5-4) Asmï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯æªå®ç¾©ï¼ 1162 1163 ã¤ã³ã©ã¤ã³ã¢ã»ã³ãã©ãè¨è¿°ããããã®æå®ï¼Asmã¯ï¼æé©åã«ããåé¤ãã¦ã¯ 1164 ãªããªããã¨ã示ãï¼ãããã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ã®ã¿ä½¿ããã¯ãã§ããã 1165 ãï¼ã¿ã¼ã²ããä¾åé¨ã§ä½¿ããªããªãå®ç¾©ããå¿ 1166 è¦ã¯ãªãï¼ 1167 1168 (3-5-5) offsetof(structure, field)ï¼ãªãã·ã§ã³ï¼ããã©ã«ãã®å®ç¾©ããï¼ 1169 1170 æ§é ä½structureã®ä¸ã§ã®ï¼ãã£ã¼ã«ãfieldã®ãªãã»ãããæ±ãããã¯ãï¼ 1171 1172 (3-5-6) alignof(type)ï¼ãªãã·ã§ã³ï¼ããã©ã«ãã®å®ç¾©ããï¼ 1173 1174 ãã¼ã¿åtypeã®ã¢ã©ã¤ã³ã¡ã³ãåä½ãæ±ãããã¯ãï¼ 1175 1176 (3-5-7) NoReturnï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯æªå®ç¾©ï¼ 1177 1178 ãªã¿ã¼ã³ãããã¨ã®ãªãé¢æ°ã§ãããã¨ã示ãæå®ï¼ããã¯ï¼ã¿ã¼ã²ããä¾å 1179 é¨ã®ã¿ä½¿ããã¯ãã§ããããï¼ã¿ã¼ã²ããä¾åé¨ã§ä½¿ããªããªãå®ç¾©ããå¿ 1180 è¦ 1181 ã¯ãªãï¼ 1182 1183 3.6 æ¨æºçãªå®ç¾©ã®ä¸æ¸ã 1184 1185 t_stddef.hã«å«ã¾ããTOPPERSå 1186 ±éå®ç¾©ã®æ¨æºçãªå®ç¾©ãä¸æ¸ãããå ´åã«ã¯ï¼ 1187 以ä¸ã®ãã¯ããå®ç¾©ããï¼ 1188 1189 (3-6-1) TOPPERS_boolï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯intï¼ 1190 (3-6-2) TOPPERS_sizeï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯uintptr_tï¼ 1191 (3-6-3) TOPPERS_fpï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯ä»ã¨äºææ§ã®ãªãé¢æ°ãã¤ã³ã¿ï¼ 1192 1193 ããããï¼bool_tï¼SIZEï¼FPã«åå®ç¾©ãã¹ããã¼ã¿åï¼ 1194 1195 (3-6-4) UINT_C(val)ï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯Uãä»å ï¼ 1196 (3-6-5) ULONG_C(val)ï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯ULãä»å ï¼ 1197 1198 ããããï¼unsigned uintåï¼unsigned longåã®å®æ°ãä½ãããã®ãã¯ãï¼ 1199 1200 (3-6-6) NULLï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯0ï¼ 1201 1202 C90æºæ ã®Cè¨èªç°å¢ã§ã¯ï¼NULLã®å®ç¾©ã¯stddef.hã«å«ã¾ãã¦ããããï¼ããã 1203 ã¤ã³ã¯ã«ã¼ããã¦ãããï¼ 1204 1205 (3-6-7) ERCD(mercd, sercd)ï¼ãªãã·ã§ã³ï¼ 1206 (3-6-8) MERCD(ercd)ï¼ãªãã·ã§ã³ï¼ 1207 (3-6-9) SERCD(ercd)ï¼ãªãã·ã§ã³ï¼ 1208 1209 ERCDï¼MERCDï¼SERCDã®æ¨æºã®å®ç¾©ã¯ï¼ç¬¦å·ä»ãæ´æ°ã2ã®è£æ°ã§è¡¨ç¾ããã¦ããï¼ 1210 å³ã·ããæ¼ç®åï¼>>ï¼ãç®è¡ã·ããããããã¨ãä»®å®ãã¦ããï¼å¤ãã®ã³ã³ã 1211 ã¤ã©ã§ãã®ä»®å®ãæãç«ã¤ãï¼ããã§ãªãå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ãã 1212 ãã®å®ç¾©ãä¸æ¸ãããå¿ 1213 è¦ãããï¼ 1214 1215 (3-6-10) ALIGN_TYPE(addr, type)ï¼ãªãã·ã§ã³ï¼ 1216 1217 ã¢ãã¬ã¹addrãï¼ãã¼ã¿åtypeã®ã¢ã©ã¤ã³ã¡ã³ãåä½ã«ã¢ã©ã¤ã³ãã¦ããã 1218 ãã§ãã¯ãããã¯ãï¼ 1219 1220 3.7 ã¢ãµã¼ã·ã§ã³ã®ããã®å®ç¾© 1221 1222 t_stddef.hã«ã¯ï¼assertã®å®ç¾©ãå«ã¾ããï¼assertã失æããå ´åï¼assertã® 1223 ãã©ã¡ã¼ã¿ãfalseã«ãªã£ãå ´åï¼ã®å¦çãï¼ã¿ã¼ã²ããä¾åã«ç¨æããå¿ 1224 è¦ã 1225 ããï¼ãããã®å®ç¾©ã¯ï¼assertãã¯ãã使ç¨ããåã§ããã°ï¼t_stddef.h以é 1226 ã«ã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ã«å«ã¾ãã¦ãã¦ãããï¼ãªãï¼assertãç¡å¹ã« 1227 ããï¼NDEBUGããã¯ãå®ç¾©ãã¦ã³ã³ãã¤ã«ããï¼å ´åã«ã¯ï¼ããããç¨æãã 1228 å¿ 1229 è¦ã¯ãªãï¼ 878 2.8 その他の設定 879 880 (2-8-1) CLEAN_FILES cleanにより削除するファイル名 881 882 cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ 883 イル名をこの変数に追加定義する. 884 885 (2-8-2) REALCLEAN_FILES realcleanにより削除するファイル名 886 887 realcleanにより削除するファイルをターゲット依存部で追加したい場合には, 888 ファイル名をこの変数に追加定義する. 889 890 891 3.TOPPERS共通定義のターゲット依存部 892 893 TOPPERS共通定義(t_stddef.h)のターゲット依存部は,target_stddef.hまた 894 はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存 895 部で用意されるヘッダファイルなど)に含める. 896 897 3.1 ターゲット識別マクロ 898 899 アプリケーションやシステムサービスでターゲットを識別するために, 900 "TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば, 901 "TOPPERS_DVE68K")をマクロ定義する. 902 903 また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場 904 合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え 905 ば,"TOPPERS_M68K")をマクロ定義する. 906 907 3.2 整数型の最大値・最小値・ビット数 908 909 (3-2-1) INT_MAX intに格納できる最大値(C90準拠) 910 (3-2-2) INT_MIN intに格納できる最小値(C90準拠) 911 (3-2-3) UINT_MAX unsigned intに格納できる最大値(C90準拠) 912 (3-2-4) LONG_MAX longに格納できる最大値(C90準拠) 913 (3-2-5) LONG_MIN longに格納できる最小値(C90準拠) 914 (3-2-6) ULONG_MAX unsigned longに格納できる最大値(C90準拠) 915 (3-2-7) CHAR_BIT char型のビット数(C90準拠) 916 917 整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する. 918 919 これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した 920 limits.hが用意されている場合には,これらのマクロを定義することに代えて, 921 limits.hをインクルードすればよい. 922 923 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ 924 925 (3-3-1) int8_t 符号付き8ビット整数(オプション,C99準拠) 926 (3-3-2) uint8_t 符号無し8ビット整数(オプション,C99準拠) 927 (3-3-3) int16_t 符号付き16ビット整数(C99準拠) 928 (3-3-4) uint16_t 符号無し16ビット整数(C99準拠) 929 (3-3-5) int32_t 符号付き32ビット整数(C99準拠) 930 (3-3-6) uint32_t 符号無し32ビット整数(C99準拠) 931 (3-3-7) int64_t 符号付き64ビット整数(オプション,C99準拠) 932 (3-3-8) uint64_t 符号無し64ビット整数(オプション,C99準拠) 933 (3-3-9) int128_t 符号付き128ビット整数(オプション,C99準拠) 934 (3-3-10) uint128_t 符号無し128ビット整数(オプション,C99準拠) 935 (3-3-11) int_least8_t 8ビット以上の符号付き整数(C99準拠) 936 (3-3-12) uint_least8_t 8ビット以上の符号無し整数(C99準拠) 937 (3-3-13) intptr_t ポインタを格納できるサイズの符号付き整数(C99準拠) 938 (3-3-14) uintptr_t ポインタを格納できるサイズの符号無し整数(C99準拠) 939 (3-3-15) INT8_MAX int8_tに格納できる最大値(オプション,C99準拠) 940 (3-3-16) INT8_MIN int8_tに格納できる最小値(オプション,C99準拠) 941 (3-3-17) UINT8_MAX uint8_tに格納できる最大値(オプション,C99準拠) 942 (3-3-18) INT16_MAX int16_tに格納できる最大値(C99準拠) 943 (3-3-19) INT16_MIN int16_tに格納できる最小値(C99準拠) 944 (3-3-20) UINT16_MAX uint16_tに格納できる最大値(C99準拠) 945 (3-3-21) INT32_MAX int32_tに格納できる最大値(C99準拠) 946 (3-3-22) INT32_MIN int32_tに格納できる最小値(C99準拠) 947 (3-3-23) UINT32_MAX uint32_tに格納できる最大値(C99準拠) 948 (3-3-24) INT64_MAX int64_tに格納できる最大値(オプション,C99準拠) 949 (3-3-25) INT64_MIN int64_tに格納できる最小値(オプション,C99準拠) 950 (3-3-26) UINT64_MAX uint64_tに格納できる最大値(オプション,C99準拠) 951 (3-3-27) INT128_MAX int128_tに格納できる最大値(オプション,C99準拠) 952 (3-3-28) INT128_MIN int128_tに格納できる最小値(オプション,C99準拠) 953 (3-3-29) UINT128_MAX uint128_tに格納できる最大値(オプション,C99準拠) 954 (3-3-30) INT_LEAST8_MAX int_least8_tに格納できる最大値(C99準拠) 955 (3-3-31) INT_LEAST8_MIN int_least8_tに格納できる最小値(C99準拠) 956 (3-3-32) UINT_LEAST8_MAX uint_least8_tに格納できる最大値(C99準拠) 957 (3-3-33) INT8_C(val) int_least8_t型の定数を作るマクロ(C99準拠) 958 (3-3-34) UINT8_C(val) uint_least8_t型の定数を作るマクロ(C99準拠) 959 (3-3-35) INT16_C(val) int16_t型の定数を作るマクロ(C99準拠) 960 (3-3-36) UINT16_C(val) uint16_t型の定数を作るマクロ(C99準拠) 961 (3-3-37) INT32_C(val) int32_t型の定数を作るマクロ(C99準拠) 962 (3-3-38) UINT32_C(val) uint32_t型の定数を作るマクロ(C99準拠) 963 (3-3-39) INT64_C(val) int64_t型の定数を作るマクロ(オプション,C99準拠) 964 (3-3-40) UINT64_C(val) uint64_t型の定数を作るマクロ(オプション,C99準拠) 965 (3-3-41) INT128_C(val) int128_t型の定数を作るマクロ(オプション,C99準拠) 966 (3-3-42) UINT128_C(val) uint128_t型の定数を作るマクロ(オプション,C99準拠) 967 968 指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ 969 型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ 970 ルにマクロ定義する. 971 972 これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99 973 に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク 974 ロを定義することに代えて,stdint.hをインクルードすればよい. 975 976 上でオプションと記述したものは,該当するデータ型がコンパイラでサポート 977 されている場合にのみ定義することを示す. 978 979 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ 980 981 (3-4-1) float32_t IEEE754準拠の32ビット単精度浮動小数点数(オプ 982 ション) 983 (3-4-2) double64_t IEEE754準拠の64ビット倍精度浮動小数点数(オプ 984 ション) 985 (3-4-3) FLOAT32_MIN float32_tに格納できる最小の正規化された正の浮 986 動小数点数(オプション) 987 (3-4-4) FLOAT32_MAX float32_tに格納できる表現可能な最大の有限浮動 988 小数点数(オプション) 989 (3-4-5) DOUBLE64_MIN double64_tに格納できる最小の正規化された正の浮 990 動小数点数(オプション) 991 (3-4-6) DOUBLE64_MAX double64_tに格納できる表現可能な最大の有限浮動 992 小数点数(オプション) 993 994 指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す 995 る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク 996 ロ定義する. 997 998 いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定 999 義する. 1000 1001 3.5 コンパイラの拡張機能のためのマクロ定義 1002 1003 コンパイラの拡張機能を用いるためのマクロとして,必要に応じて,以下のマ 1004 クロの定義を含める. 1005 1006 (3-5-1) inline(オプション,デフォルトは未定義) 1007 (3-5-2) Inline(オプション,デフォルトはstatic inline) 1008 1009 インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル 1010 なインライン関数であることを示す. 1011 1012 (3-5-3) asm(オプション,デフォルトは未定義) 1013 (3-5-4) Asm(オプション,デフォルトは未定義) 1014 1015 インラインアセンブラを記述するための指定.Asmは,最適化により削除しては 1016 ならないことを示す.これらは,ターゲット依存部でのみ使うマクロであるた 1017 め,ターゲット依存部で使わないなら定義する必要はない. 1018 1019 (3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり) 1020 1021 構造体structureの中での,フィールドfieldのオフセットを求めるマクロ. 1022 1023 (3-5-6) alignof(type)(オプション,デフォルトの定義あり) 1024 1025 データ型typeのアラインメント単位を求めるマクロ. 1026 1027 (3-5-7) NoReturn(オプション,デフォルトは未定義) 1028 1029 リターンすることのない関数であることを示す指定.これは,ターゲット依存 1030 部のみ使うマクロであるため,ターゲット依存部で使わないなら定義する必要 1031 はない. 1032 1033 3.6 標準的な定義の上書き 1034 1035 t_stddef.hに含まれるTOPPERS共通定義の標準的な定義を上書きする場合には, 1036 以下のマクロを定義する. 1037 1038 (3-6-1) TOPPERS_bool(オプション,デフォルトはint) 1039 (3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t) 1040 (3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ) 1041 1042 それぞれ,bool_t,SIZE,FPに型定義すべきデータ型. 1043 1044 (3-6-4) UINT_C(val)(オプション,デフォルトはUを付加) 1045 (3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加) 1046 1047 それぞれ,unsigned uint型,unsigned long型の定数を作るためのマクロ. 1048 1049 (3-6-6) NULL(オプション,デフォルトは0) 1050 1051 C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを 1052 インクルードしてもよい. 1053 1054 (3-6-7) ERCD(mercd, sercd)(オプション) 1055 (3-6-8) MERCD(ercd)(オプション) 1056 (3-6-9) SERCD(ercd)(オプション) 1057 1058 ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており, 1059 右シフト演算子(>>)が算術シフトされることを仮定している.多くのコンパ 1060 イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ 1061 らの定義を上書きする必要がある. 1062 1063 (3-6-10) ALIGN_TYPE(addr, type)(オプション) 1064 1065 アドレスaddrが,データ型typeのアラインメント単位にアラインしているか 1066 チェックするマクロ. 1067 1068 3.7 アサーションのための定義 1069 1070 t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの 1071 パラメータがfalseになった場合)の処理を,ターゲット依存に用意する必要が 1072 ある.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降 1073 にインクルードされるファイルに含まれていてもよい.なお,assertを無効に 1074 する(NDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する 1075 必要はない. 1230 1076 1231 1077 (3-7-1) TOPPERS_assert_abort(void) 1232 1078 1233 assert ã失æããå ´åã«ï¼ããã°ã©ã ãåæ¢ãããé¢æ°ï¼ã·ã¹ãã éçºä¸ã¯ã1234 ããã¬ã«è½ã¨ãã®ãçæ³çã§ããï¼ã·ã¹ãã 稼åæã«ã¯ä¾å¤å¦çãè¡ãããã 1235 ã¨ã«ãªãï¼ 1079 assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ 1080 バッガに落とすのが理想的である.システム稼働時には例外処理を行わせるこ 1081 とになる. 1236 1082 1237 1083 (3-7-2) TOPPERS_assert_fail(exp, file, line) 1238 1084 1239 assertã失æããæã®æ 1240 å ±ã表示/è¨é²ããããã®ãã¯ãï¼ã·ã¹ãã ãã°æ©è½ã 1241 ç¨ããå ´åã«ã¯ï¼t_syslog.hã«ã·ã¹ãã ãã°æ©è½ã«è¨é²ããããã®å®ç¾©ãå«ã¾ 1242 ãã¦ããã®ã§ï¼ã¿ã¼ã²ããä¾åé¨ã§ç¨æããå¿ 1243 è¦ã¯ãªãï¼ 1244 1245 1246 ï¼ï¼ã·ã¹ãã ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¤ã¤ï¼SILï¼ã®ã¿ã¼ã²ããä¾åé¨ 1247 1248 ã·ã¹ãã ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¤ã¤ï¼SILï¼sil.hï¼ã®ã¿ã¼ã²ããä¾åé¨ã®å®ç¾©ã¯ï¼ 1249 target_sil.hã¾ãã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ããã»ããµã»ãã 1250 ãã»éçºç°å¢ä¾åé¨ã§ç¨æãããããããã¡ã¤ã«ãªã©ï¼ã«å«ããï¼ 1251 1252 SILã®ãµã¼ãã¹ã³ã¼ã«ã¯ï¼ä»»æã®ã·ã¹ãã ç¶æ 1253 ã§å¼ã³åºããã¨ãã§ããï¼ãã®ã 1254 ãï¼SILã®ã¿ã¼ã²ããä¾åé¨ã®é¢æ°ã¯ï¼ä»»æã®ã·ã¹ãã ç¶æ 1255 ã§å¼ã³åºããããã« 1256 å®è£ 1257 ããªããã°ãªããªãï¼ 1258 1259 4.1 å 1260 ¨å²è¾¼ã¿ããã¯ç¶æ 1261 ã®ç®¡ç 1262 1263 SILã®ã¿ã¼ã²ããä¾åé¨ã§ã¯ï¼å 1264 ¨å²è¾¼ã¿ããã¯ç¶æ 1265 ã¸é·ç§»ããæ©è½ã¨ï¼å 1266 ã®ç¶æ 1267 1268 ã¸æ»ãæ©è½ï¼å 1269 ã®ç¶æ 1270 ãè¨æ¶ããããã«å¤æ°ã使ãï¼ãæä¾ããï¼å 1271 ¨å²è¾¼ã¿ãã 1272 ã¯ç¶æ 1273 ã§ããããå¤å¥ããæ©è½ã¯æä¾ããå¿ 1274 è¦ããªãï¼ 1275 1276 SILã®æ©è½ã¯ï¼ã«ã¼ãã«ã使ç¨ããªãå ´åã«ã使ç¨ã§ããå¿ 1277 è¦ãããï¼ãã®ããï¼ 1278 å 1279 ¨å²è¾¼ã¿ããã¯ç¶æ 1280 ã¸ã®é·ç§»ã¨å 1281 ã®ç¶æ 1282 ã¸ã®å¾©å¸°ã¯ï¼ã«ã¼ãã«ãç¨ããï¼ãã 1283 ã»ããµã®ãªã½ã¼ã¹ãç´æ¥æä½ãããã¨ã«ãã£ã¦å®ç¾ããï¼ã¾ãï¼å 1284 ¨å²è¾¼ã¿ãã 1285 ã¯ç¶æ 1286 ã¸ã®é·ç§»ã¨å 1287 ã®ç¶æ 1288 ã¸ã®å¾©å¸°ã¯ï¼å 1289 ¨å²è¾¼ã¿ããã¯ç¶æ 1290 ãCPUããã¯ç¶æ 1291 㧠1292 ãè¡ããå¿ 1293 è¦ãããï¼ 1294 1295 ä¿è·æ©è½ãæã£ãã«ã¼ãã«ã§ã¯ï¼ã¦ã¼ã¶ã¿ã¹ã¯ããããã»ããµã®ãªã½ã¼ã¹ãç´ 1296 æ¥æä½ãããã¨ãã§ããªãããï¼ã¦ã¼ã¶ã¿ã¹ã¯ããã¯ãããã®æ©è½ãç¨ããã 1297 ã¨ãã§ããªãï¼ç¨ããå ´åã®æ¯èãã¯ã¿ã¼ã²ããããã»ããµã«ä¾åãããï¼å 1298 ¸ 1299 åçã«ã¯ï¼ç¹æ¨©å½ä»¤éåãªã©ã®CPUä¾å¤ãçºçãããã¨ã«ãªãï¼ 1085 assertが失敗した時の情報を表示/記録するためのマクロ.システムログ機能を 1086 用いる場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま 1087 れているので,ターゲット依存部で用意する必要はない. 1088 1089 1090 4.システムインタフェースレイヤ(SIL)のターゲット依存部 1091 1092 システムインタフェースレイヤ(SIL,sil.h)のターゲット依存部の定義は, 1093 target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ 1094 プ・開発環境依存部で用意されるヘッダファイルなど)に含める. 1095 1096 SILのサービスコールは,任意のシステム状態で呼び出すことができる.そのた 1097 め,SILのターゲット依存部の関数は,任意のシステム状態で呼び出せるように 1098 実装しなければならない. 1099 1100 4.1 全割込みロック状態の管理 1101 1102 SILのターゲット依存部では,全割込みロック状態へ遷移する機能と,元の状態 1103 へ戻す機能(元の状態を記憶するために変数を使う)を提供する.全割込みロッ 1104 ク状態であるかを判別する機能は提供する必要がない. 1105 1106 SILの機能は,カーネルを使用しない場合にも使用できる必要がある.そのため, 1107 全割込みロック状態への遷移と元の状態への復帰は,カーネルを用いず,プロ 1108 セッサのリソースを直接操作することによって実現する.また,全割込みロッ 1109 ク状態への遷移と元の状態への復帰は,全割込みロック状態やCPUロック状態で 1110 も行える必要がある. 1111 1112 保護機能を持ったカーネルでは,ユーザタスクからプロセッサのリソースを直 1113 接操作することができないため,ユーザタスクからはこれらの機能を用いるこ 1114 とができない.用いた場合の振舞いはターゲットプロセッサに依存するが,典 1115 型的には,特権命令違反などのCPU例外が発生することになる. 1300 1116 1301 1117 (4-1-1) SIL_PRE_LOC 1302 1118 1303 å 1304 ¨å²è¾¼ã¿ããã¯ãã©ã°ã®ç¶æ 1305 ãä¿åããããã®å¤æ°ãå®ç¾©ãããã¯ãï¼ååã® 1306 å¾ã«ï¼å¤æ°åãç¶ãããã®ã«å®ç¾©ããï¼å¤æ°åã¯ï¼ä»ã®ååã¨è¡çªããªããã 1307 ã«ï¼"TOPPERS_"ã§å§ã¾ãååã«ããï¼ 1119 全割込みロックフラグの状態を保存するための変数を定義するマクロ.型名の 1120 後に,変数名を続けたものに定義する.変数名は,他の名前と衝突しないよう 1121 に,"TOPPERS_"で始まる名前にする. 1308 1122 1309 1123 (4-1-2) SIL_LOC_INT() 1310 1124 1311 ç¾å¨ã®å 1312 ¨å²è¾¼ã¿ããã¯ãã©ã°ã®ç¶æ 1313 ãSIL_PRE_LOCã§å®ç¾©ããå¤æ°ã«ä¿åãï¼å 1314 ¨ 1315 å²è¾¼ã¿ããã¯ç¶æ 1316 ã«é·ç§»ããããã¯ãï¼ãã®ãã¯ããå®ç¾ããéã«ã¯ï¼ã1.6 1317 ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 1318 ¥å¦çã®å®ç¾ã«é¢ããå¶ç´ãã®ç¯ã«è¨è¿°ããã¦ã 1319 ãå¶ç´ã«å¾ããªããã°ãªããªãï¼ 1125 現在の全割込みロックフラグの状態をSIL_PRE_LOCで定義した変数に保存し,全 1126 割込みロック状態に遷移させるマクロ.このマクロを実現する際には,「1.6 1127 クリティカルセクションの出入処理の実現に関する制約」の節に記述されてい 1128 る制約に従わなければならない. 1320 1129 1321 1130 (4-1-3) SIL_UNL_INT() 1322 1131 1323 SIL_LOC_INT()ã«ãã£ã¦å¤æ°ã«ä¿åããç¶æ 1324 ã«æ»ããã¯ãï¼ãã®ãã¯ããå®ç¾ã 1325 ãéã«ã¯ï¼ã1.6 ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 1326 ¥å¦çã®å®ç¾ã«é¢ããå¶ç´ãã® 1327 ç¯ã«è¨è¿°ããã¦ããå¶ç´ã«å¾ããªããã°ãªããªãï¼ 1328 1329 4.2 å¾®å°æéå¾ 1330 ã¡ 1132 SIL_LOC_INT()によって変数に保存した状態に戻すマクロ.このマクロを実現す 1133 る際には,「1.6 クリティカルセクションの出入処理の実現に関する制約」の 1134 節に記述されている制約に従わなければならない. 1135 1136 4.2 微少時間待ち 1331 1137 1332 1138 (4-2-1) void sil_dly_nse(ulong_t dlytim) 1333 1139 1334 dlytimã§æå®ããã以ä¸ã®æéï¼åä½ã¯ããç§ï¼ï¼ã«ã¼ããªã©ã«ãã£ã¦å¾ 1335 ã¤é¢ 1336 æ°ï¼ 1337 1338 以ä¸ã®é¢æ°ã¨ç価ãªå¦çãï¼ã¢ã»ã³ããªè¨èªã§è¨è¿°ããæ¹æ³ãï¼æ¨æºçãªå®è£ 1339 1340 æ¹æ³ã¨ããï¼ã¢ã»ã³ããªè¨èªã§è¨è¿°ããã®ã¯ï¼ã³ã³ãã¤ã©ã®æé©åã«ä¾åã㪠1341 ãããã«ããããã§ããï¼ã¾ããã®é¢æ°ã¯ï¼ãã£ãã·ã¥çã®å½±é¿ãåããªãã 1342 ãã«ï¼ã§ããéãã¡ã¢ãªã¢ã¯ã»ã¹ãè¡ããªãããã«å®è£ 1343 ãã¹ãã§ããï¼ 1140 dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ関 1141 数. 1142 1143 以下の関数と等価な処理を,アセンブリ言語で記述する方法を,標準的な実装 1144 方法とする.アセンブリ言語で記述するのは,コンパイラの最適化に依存しな 1145 いようにするためである.またこの関数は,キャッシュ等の影響を受けないよ 1146 うに,できる限りメモリアクセスを行わないように実装すべきである. 1344 1147 1345 1148 void sil_dly_nse(ulong_t dlytim) 1346 1149 { 1347 1150 dlytim -= SIL_DLY_TIM1; 1348 if ( çµæã0ãã大ãã) {1151 if (結果が0より大きい) { 1349 1152 do { 1350 1153 dlytim -= SIL_DLY_TIM2; 1351 } while ( çµæã0ãã大ãã);1154 } while (結果が0より大きい); 1352 1155 } 1353 1156 } 1354 1157 1355 ãã®é¢æ°ã®åä½ã¯æ¬¡ã®éãã§ããï¼dlytimãSIL_DLY_TIM1以ä¸ã®å ´åã«ã¯ï¼æ 1356 åã®ifæã®æ¡ä»¶ãæç«ããï¼ããã«é¢æ°ããæããï¼dlytimãSIL_DLY_TIM1ã 1357 ã大ããï¼(SIL_DLY_TIM1+SIL_DLY_TIM2)以ä¸ã®å ´åã«ã¯ï¼æåã®ifæã®æ¡ä»¶ã¯ 1358 æç«ãããï¼doã«ã¼ãã¯1åãåããã«é¢æ°ããæããï¼dlytimã 1359 (SIL_DLY_TIM1+SIL_DLY_TIM2)ãã大ããï¼(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以 1360 ä¸ã®å ´åã«ã¯ï¼doã«ã¼ãã1åã ãåã£ã¦é¢æ°ããæããï¼ãã®å¾ï¼dlytimã 1361 SIL_DLY_TIM2大ãããªã度ã«ï¼whileã«ã¼ããåãåæ°ã1åãã¤å¢ããï¼ 1362 1363 ãªãï¼ãã®é¢æ°ãã¢ã»ã³ããªè¨èªï¼ã¾ãã¯ï¼Cè¨èªï¼ã§è¨è¿°ããå ´åï¼ã©ã®ãã¡ 1364 ã¤ã«ã«è¨è¿°ããããåé¡ã«ãªãï¼SILã®ã¿ã¼ã²ããä¾åé¨ã«ã¯ï¼æ¨æºã§ã¯ï¼ã¢ã» 1365 ã³ããªè¨èªï¼ã¾ãã¯ï¼Cè¨èªï¼ã®é¢æ°å®ç¾©ãè¨è¿°ããããã®ãã¡ã¤ã«ãç¨æã㦠1366 ããªãï¼ã¿ã¼ã²ããä¾åã§ç¨æãã¦ããããï¼ä¾å¤çã«ï¼ã«ã¼ãã«å®è£ 1367 ã®ã¿ã¼ 1368 ã²ããä¾åã¢ã¸ã¥ã¼ã«ï¼target_support.Sã¾ãã¯target_config.cï¼ã«è¨è¿°ã㦠1369 ããããã¨ã«ããï¼ 1370 1371 (4-2-2) SIL_DLY_TIM1ï¼ãªãã·ã§ã³ï¼ 1372 (4-2-3) SIL_DLY_TIM2ï¼ãªãã·ã§ã³ï¼ 1373 1374 sil_dly_nseãä¸è¨ã®æ¨æºçãªæ¹æ³ã§å®ç¾ããå ´åï¼ãã®2ã¤ã®å®æ°ãã¿ã¼ã²ã 1375 ãä¾åé¨ã§ãã¯ãå®ç¾©ããï¼ 1376 1377 SIL_DLY_TIM2ã¯ï¼ä¸è¨ã®é¢æ°ã«ããã¦ï¼doã«ã¼ã1åã®å®è¡æéï¼åä½ã¯ããç§ï¼ 1378 ã«è¨å®ããï¼ã¿ã¼ã²ããããã»ããµã®å½ä»¤ã»ããã«ããããï¼ããããï¼æ¸ç® 1379 å½ä»¤ã¨æ¡ä»¶åå²å½ä»¤å1åã®å®è¡æéã«ãªãï¼SIL_DLY_TIM2ã決ã¾ãã°ï¼é¢æ°å¼ 1380 åºããå«ããå 1381 ¨ä½ã®æéãdlytimã§æå®ããã以ä¸ã®æéã«ãªãããã«ï¼ 1382 SIL_DLY_TIM1ã決ããï¼ 1383 1384 ãã®2ã¤ã®å®æ°å¤ã®æ±ºå®ãæ¯æ´ããããã°ã©ã ã¨ãã¦ï¼testãã£ã¬ã¯ããªã«ï¼ 1385 test_dlynseãç¨æãã¦ããï¼test_dlynseãå®è¡ããã¨ï¼æ¬¡ã®ãããªåºåãå¾ 1386 ãããï¼ 1158 この関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最 1159 初のif文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ 1160 り大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は 1161 成立するが,doループは1回も回らずに関数から抜ける.dlytimが 1162 (SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以 1163 下の場合には,doループを1回だけ回って関数から抜ける.その後,dlytimが 1164 SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える. 1165 1166 なお,この関数をアセンブリ言語(または,C言語)で記述する場合,どのファ 1167 イルに記述するかが問題になる.SILのターゲット依存部には,標準では,アセ 1168 ンブリ言語(または,C言語)の関数定義を記述するためのファイルを用意して 1169 いない.ターゲット依存で用意してもよいが,例外的に,カーネル実装のター 1170 ゲット依存モジュール(target_support.Sまたはtarget_config.c)に記述して 1171 もよいことにする. 1172 1173 (4-2-2) SIL_DLY_TIM1(オプション) 1174 (4-2-3) SIL_DLY_TIM2(オプション) 1175 1176 sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ 1177 ト依存部でマクロ定義する. 1178 1179 SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒) 1180 に設定する.ターゲットプロセッサの命令セットにもよるが,おおよそ,減算 1181 命令と条件分岐命令各1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼 1182 出しも含めた全体の時間がdlytimで指定された以上の時間になるように, 1183 SIL_DLY_TIM1を決める. 1184 1185 この2つの定数値の決定を支援するプログラムとして,testディレクトリに, 1186 test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得 1187 られる. 1387 1188 1388 1189 -- for fitting parameters -- … … 1391 1192 sil_dly_nse(510): 520 OK 1392 1193 sil_dly_nse(600): 610 OK 1393 < ä¸ç¥>1194 <中略> 1394 1195 -- for checking boundary conditions -- 1395 1196 sil_dly_nse(421): 520 OK … … 1397 1198 sil_dly_nse(601): 700 OK 1398 1199 1399 "for fitting parameters"ã«ç¶ãåºåã¯ï¼sil_dly_nse(dlytim)ãå¼ã³åºããå ´ 1400 åã®å¾ 1401 ã¡æéã測å®ããçµæã§ããï¼ãã®ããã°ã©ã ãç¨ãã¦ï¼":"ã®å³å´ã®æ° 1402 å¤ãï¼dlytimããã大ããç¯å²ã§ãªãã¹ãè¿ãå¤ã«ãªãããã«ï¼2ã¤ã®å®æ°å¤ã 1403 調æ´ããï¼"for checking boundary conditions"ã«ç¶ãåºåã¯ï¼ããã°ã©ã ã® 1404 妥å½æ§ããã§ãã¯ããããã®ãã®ã§ï¼":"ã®å³å´ã®æ°å¤ãï¼dlytimããã大ãã 1405 ãã¨ã確èªããï¼è¿ãå¤ã«ãªãå¿ 1406 è¦ã¯ãªãï¼ï¼ 1407 1408 4.3 ããã»ããµã®ã¨ã³ãã£ã¢ã³ 1200 "for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場 1201 合の待ち時間を測定した結果である.このプログラムを用いて,":"の右側の数 1202 値が,dlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を 1203 調整する."for checking boundary conditions"に続く出力は,プログラムの 1204 妥当性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい 1205 ことを確認する(近い値になる必要はない). 1206 1207 4.3 プロセッサのエンディアン 1409 1208 1410 1209 (4-3-1) SIL_ENDIAN_BIG 1411 1210 (4-3-2) SIL_ENDIAN_LITTLE 1412 1211 1413 ããã»ããµã®ã¨ã³ãã£ã¢ã³ã«ããï¼ããããçæ¹ã®ã·ã³ãã«ããã¯ãå®ç¾©ããï¼ 1414 1415 (4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16 ï¼ãªãã·ã§ã³ï¼1416 (4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32 ï¼ãªãã·ã§ã³ï¼1417 1418 ããããï¼16ãããï¼32ãããã®ç¬¦å·ç¡ãæ´æ°ã®ã¨ã³ãã£ã¢ã³ãå転ãããã 1419 ã¯ãï¼ããã»ããµãã¨ã³ãã£ã¢ã³å転ã®ããã®å½ä»¤ãæã¤å ´åã«ã¯ï¼ãã®å½ä»¤ 1420 ãç¨ãã¦å®ç¾ããï¼ãããã®ã·ã³ãã«ããã¯ãå®ç¾©ããªãå ´åã«ã¯ï¼ããã©ã« 1421 ãã®å®ç¾©ã使ãããï¼ 1422 1423 4.4 ã¡ã¢ãªç©ºéã¢ã¯ã»ã¹é¢æ°1212 プロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する. 1213 1214 (4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション) 1215 (4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション) 1216 1217 それぞれ,16ビット,32ビットの符号無し整数のエンディアンを反転させるマ 1218 クロ.プロセッサがエンディアン反転のための命令を持つ場合には,その命令 1219 を用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル 1220 トの定義が使われる. 1221 1222 4.4 メモリ空間アクセス関数 1424 1223 1425 1224 (4-4-1) TOPPERS_OMIT_SIL_ACCESS 1426 1225 1427 æ¨æºã®ã¡ã¢ãªç©ºéã¢ã¯ã»ã¹é¢æ°ã使ç¨ããï¼ã¿ã¼ã²ããä¾åé¨ã§ç¨æããå ´å 1428 ã«ã¯ï¼ãã®ã·ã³ãã«ããã¯ãå®ç¾©ããï¼ 1226 標準のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合 1227 には,このシンボルをマクロ定義する. 1429 1228 1430 1229 (4-4-2) TOPPERS_OMIT_SIL_REH_LEM … … 1437 1236 (4-4-9) TOPPERS_OMIT_SIL_WRW_BEM 1438 1237 1439 ããããï¼æ¨æºã®sil_reh_lemï¼sil_wrh_lemï¼sil_reh_bemï¼sil_wrh_bemï¼ 1440 sil_rew_lemï¼sil_wrw_lemï¼sil_rew_bemï¼sil_wrw_bemã使ç¨ããï¼ã¿ã¼ã²ã 1441 ãä¾åé¨ã§ç¨æããå ´åã«ã¯ï¼ãããã®ã·ã³ãã«ããã¯ãå®ç¾©ããï¼ 1442 1443 4.5 I/O空éã¢ã¯ã»ã¹é¢æ° 1444 1445 ã¡ã¢ãªç©ºéã¨ã¯å¥ã«I/O空éãæã¤ããã»ããµã§ã¯ï¼I/O空éã«ããããã¤ã¹ã¬ 1446 ã¸ã¹ã¿ãã¢ã¯ã»ã¹ããããã®é¢æ°ã¨ãã¦ï¼sil_reb_iopï¼sil_wrb_iopï¼ 1447 sil_reh_iopï¼sil_wrh_iopï¼sil_reh_lepï¼sil_wrh_lepï¼sil_reh_bepï¼ 1448 sil_wrh_bepï¼sil_rew_iopï¼sil_wrw_iopï¼sil_rew_lepï¼sil_wrw_lepï¼ 1449 sil_rew_bepï¼sil_wrw_bepã®ä¸ã§å¿ 1450 è¦ãªãã®ãï¼ã¿ã¼ã²ããä¾åé¨ã§ç¨æããï¼ 1451 1452 1453 ï¼ï¼ã«ã¼ãã«APIã®ã¿ã¼ã²ããä¾åé¨ 1454 1455 ã«ã¼ãã«APIï¼kernel.hï¼ã®ã¿ã¼ã²ããä¾åé¨ã®å®ç¾©ã¯ï¼target_kernel.hã¾ã 1456 ã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ããã»ããµã»ãããã»éçºç°å¢ä¾å 1457 é¨ã§ç¨æãããããããã¡ã¤ã«ãªã©ï¼ã«å«ããï¼ 1458 1459 5.1 ã¿ã¼ã²ããå®ç¾©ã§ãµãã¼ãããæ©è½ 1460 1461 (5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT dis_intããµãã¼ããã 1462 (5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT ena_intããµãã¼ããã 1463 (5-1-3) TOPPERS_TARGET_SUPPORT_GET_UTM get_utmããµãã¼ããã 1464 1465 dis_intï¼ena_intï¼get_utmããµãã¼ãããå ´åã«ï¼ããããã®ã·ã³ãã«ãã㯠1466 ãå®ç¾©ããï¼ 1467 1468 5.2 å²è¾¼ã¿åªå 1469 度ã®ç¯å² 1470 1471 (5-2-1) TMIN_INTPRI å²è¾¼ã¿åªå 1472 度ã®æå°å¤ï¼æé«å¤ï¼ 1473 (5-2-2) TMAX_INTPRI å²è¾¼ã¿åªå 1474 度ã®æ大å¤ï¼æä½å¤ï¼ 1475 1476 ããããï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿åªå 1477 度ã®æå°å¤ï¼ï¼åªå 1478 度ãæé«ï¼ï¼ã«ã¼ã 1479 ã«ç®¡çã®å²è¾¼ã¿åªå 1480 度ã®æ大å¤ï¼åªå 1481 度ãæä½ï¼ã«å®ç¾©ããï¼TMAX_INTPRIã¯-1 1482 ã«åºå®ããã¦ãããï¼å¯¾ç§°æ§ã®ããã«ï¼ã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ãããã¨ã«ã 1483 ã¦ããï¼ 1484 1485 5.3 ã¿ã¤ã ãã£ãã¯ã®å®ç¾© 1486 1487 (5-3-1) TIC_NUME ã¿ã¤ã ãã£ãã¯ã®å¨æã®åå 1488 (5-3-2) TIC_DENO ã¿ã¤ã ãã£ãã¯ã®å¨æã®åæ¯ 1489 1490 ã¿ã¤ã ãã£ãã¯ã®å¨æï¼signal_timeãå¼ã³åºãå¨æï¼ãï¼ããªç§åä½ã§ï¼ 1491 TIC_NUME/TIC_DENOã«å®ç¾©ããï¼ä¾ãã°ï¼ã¿ã¤ã ãã£ãã¯ã®å¨æã1/30ç§ã®å ´å 1492 ã«ã¯ï¼TIC_NUMEã100ã«ï¼TIC_DENOã3ã«å®ç¾©ããã°ããï¼ 1493 1494 ã¿ã¤ã ãã£ãã¯ã®å¨æã¯ï¼1ããªç§ã¨ããï¼ã¤ã¾ãï¼TIC_NUMEï¼TIC_DENOã¨ã1 1495 ã«å®ç¾©ããï¼ãã¨ãæ¨å¥¨ãããï¼ã·ãã¥ã¬ã¼ã·ã§ã³ç°å¢ãæ§è½ã®ä½ãããã»ã 1496 ãµã§ãããé©åã§ãªãå ´åã«ã¯ï¼ãã以å¤ã®å¤ã¨ãã¦ãããï¼ãã®å ´åã§ãï¼ 1497 å¯è½ãªéãï¼1ããªç§ã®åæ°ã§ããï¼ã¤ã¾ãï¼TIC_DENOã1ã«å®ç¾©ããï¼ãã¨ã 1498 æã¾ããï¼ 1499 1500 TIC_NUMEã¨TIC_DENOã®å®ç¾©ãå¤æ´ãããã¨ã§ï¼ã¿ã¤ã ãã£ãã¯ã®å¨æãå¤æ´ã§ 1501 ããããã«ã¿ã¤ããã©ã¤ããå®è£ 1502 ããå ´åã«ã¯ï¼ãã®2ã¤ã®å®æ°ã®å®ç¾©ã¯ããã© 1503 ã«ãå¤ãä¸ãã¦ãããã¨ã«ãªãï¼ããã§ï¼ãããã®å®ç¾©ãã#ifndef TIC_NUMEã 1504 ã#endifãã§å²ãã§è¨è¿°ããï¼ 1505 1506 5.4 ã¡ã¢ãªé å確ä¿ã®ããã®åå®ç¾© 1507 1508 (5-4-1) TOPPERS_STK_T ã¹ã¿ãã¯é åã確ä¿ããããã®åï¼ãªãã·ã§ã³ï¼ 1509 (5-4-2) TOPPERS_MPF_T åºå®é·ã¡ã¢ãªãã¼ã«é åã確ä¿ããããã®åï¼ãªãã·ã§ã³ï¼ 1510 1511 ã¹ã¿ãã¯é åã¨åºå®é·ã¡ã¢ãªãã¼ã«é åã¯ï¼æ¨æºã§ã¯ï¼intptr_tåã®é 1512 åã¨ã 1513 ã¦ç¢ºä¿ãããï¼ãã大ããåä½ã§ã¢ã©ã¤ã³ãããããªã©ã®çç±ã§ï¼ãã以å¤ã® 1514 åã®é 1515 åã¨ãã¦ç¢ºä¿ããå ´åã«ã¯ï¼ããããTOPPERS_STK_Tã¨TOPPERS_MPF_Tãï¼ 1516 é 1517 åã®ãã¼ã¹ã¨ãªããã¼ã¿åã«ãã¯ãå®ç¾©ããï¼ 1518 1519 5.5 ããããã¿ã¼ã³ã®ãããæ° 1520 1521 (5-5-1) TBIT_TEXPTN ã¿ã¹ã¯ä¾å¤è¦å ã®ãããæ°ï¼ãªãã·ã§ã³ï¼ 1522 (5-5-2) TBIT_FLGPTN ã¤ãã³ããã©ã°ã®ãããæ°ï¼ãªãã·ã§ã³ï¼ 1523 1524 TBIT_TEXPTNï¼TBIT_FLGPTNã®æ¨æºã®å®ç¾©ã§ã¯ï¼æ´æ°åã®æå¹ãããæ°ãï¼ãã® 1525 åã®sizeofã«CHAR_BITãä¹ãããã®ã¨ä¸è´ãã¦ãããã¨ãä»®å®ãã¦ããï¼å¤ã 1526 ã®ã³ã³ãã¤ã©ã§ãã®ä»®å®ãæãç«ã¤ãï¼ããã§ãªãå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾å 1527 é¨ã§ãããã®å®ç¾©ãä¸æ¸ãããå¿ 1528 è¦ãããï¼ãã ãï¼ãããã®å¤ã¯16以ä¸ã§ãª 1529 ããã°ãªããªãï¼ 1530 1531 5.6 ã¡ã¢ãªé å確ä¿ã®ããã®ãã¯ã 1532 1533 (5-6-1) TOPPERS_ROUND_SZï¼ãªãã·ã§ã³ï¼ 1534 (5-6-2) TOPPERS_COUNT_SZï¼ãªãã·ã§ã³ï¼ 1535 1536 TOPPERS_COUNT_SZ(sz, unit)ã¯ï¼sz/unitãåãä¸ããå¤ãæ±ãããã¯ãã§ï¼ãµ 1537 ã¤ãºãszã®ã¡ã¢ãªé åããµã¤ãºãunitã®ãã¼ã¿åã®é 1538 åã§ç¢ºä¿ããå ´åã®è¦ç´ 1539 æ°ãæ±ããããã«ç¨ããï¼TOPPERS_ROUND_SZ(sz, unit)ã¯ï¼sz/unitãåãä¸ã 1540 ããã®ã«unitããããå¤ãæ±ãããã¯ãã§ï¼ãµã¤ãºãszã®ã¡ã¢ãªé åããµã¤ãº 1541 ãunitã®ãã¼ã¿åã®é 1542 åã§ç¢ºä¿ããå ´åã®ãã¼ã¿ã«ãµã¤ãºãæ±ããããã«ç¨ã 1543 ãï¼ 1544 1545 ããããï¼æ¨æºã®TOPPERS_ROUND_SZï¼TOPPERS_COUNT_SZãé©åã§ãªãï¼ã¿ã¼ã²ã 1546 ãä¾åé¨ã§ç¨æããå ´åã«ã¯ï¼ãããã®ã·ã³ãã«ãé©åãªå¤ã«ãã¯ãå®ç¾©ããï¼ 1547 1548 5.7 ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µã®ããã®å®ç¾©ï¼ãªãã·ã§ã³ï¼ 1549 1550 ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µããã±ã¼ã¸ããµãã¼ãããï¼ä½¿ç¨ã§ããããã«ã 1551 ãï¼å ´åã«ã¯ï¼æ¬¡ã®3ã¤ãå®æ½ãããã¨ãå¿ 1552 è¦ã§ããï¼ 1553 1554 ã»ãã®ç¯ã§èª¬æããå®ç¾©ãè¡ãï¼ 1555 ã»ï¼ç« ã«ç¤ºãã³ã¼ãä¸ã§ï¼TOPPERS_SUPPORT_OVRHDRããã¯ãå®ç¾©ããã¦ããå ´ 1556 ãåã«ã®ã¿æå¹ã¨ãªãã³ã¼ããå®è£ 1557 ããï¼ 1558 ã»ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ããç¨æããï¼ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã«ã¤ã㦠1559 ãã¯ï¼ã6.14 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ããã®ç¯ãåç 1560 §ãããã¨ï¼ 1238 それぞれ,標準のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem, 1239 sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ 1240 ト依存部で用意する場合には,これらのシンボルをマクロ定義する. 1241 1242 4.5 I/O空間アクセス関数 1243 1244 メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ 1245 ジスタをアクセスするための関数として,sil_reb_iop,sil_wrb_iop, 1246 sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep, 1247 sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep, 1248 sil_rew_bep,sil_wrw_bepの中で必要なものを,ターゲット依存部で用意する. 1249 1250 1251 5.カーネルAPIのターゲット依存部 1252 1253 カーネルAPI(kernel.h)のターゲット依存部の定義は,target_kernel.hまた 1254 はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存 1255 部で用意されるヘッダファイルなど)に含める. 1256 1257 5.1 ターゲット定義でサポートする機能 1258 1259 (5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT dis_intをサポートする 1260 (5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT ena_intをサポートする 1261 (5-1-3) TOPPERS_TARGET_SUPPORT_GET_UTM get_utmをサポートする 1262 1263 dis_int,ena_int,get_utmをサポートする場合に,それぞれのシンボルをマク 1264 ロ定義する. 1265 1266 5.2 割込み優先度の範囲 1267 1268 (5-2-1) TMIN_INTPRI 割込み優先度の最小値(最高値) 1269 (5-2-2) TMAX_INTPRI 割込み優先度の最大値(最低値) 1270 1271 それぞれ,カーネル管理の割込み優先度の最小値(=優先度が最高),カーネ 1272 ル管理の割込み優先度の最大値(優先度が最低)に定義する.TMAX_INTPRIは-1 1273 に固定されているが,対称性のために,ターゲット依存部で定義することにし 1274 ている. 1275 1276 5.3 タイムティックの定義 1277 1278 (5-3-1) TIC_NUME タイムティックの周期の分子 1279 (5-3-2) TIC_DENO タイムティックの周期の分母 1280 1281 タイムティックの周期(signal_timeを呼び出す周期)を,ミリ秒単位で, 1282 TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合 1283 には,TIC_NUMEを100に,TIC_DENOを3に定義すればよい. 1284 1285 タイムティックの周期は,1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1 1286 に定義する)ことを推奨するが,シミュレーション環境や性能の低いプロセッ 1287 サでそれが適切でない場合には,それ以外の値としてもよい.その場合でも, 1288 可能な限り,1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが 1289 望ましい. 1290 1291 TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で 1292 きるようにタイマドライバを実装する場合には,この2つの定数の定義はデフォ 1293 ルト値を与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」 1294 「#endif」で囲んで記述する. 1295 1296 5.4 メモリ領域確保のための型定義 1297 1298 (5-4-1) TOPPERS_STK_T スタック領域を確保するための型(オプション) 1299 (5-4-2) TOPPERS_MPF_T 固定長メモリプール領域を確保するための型(オプション) 1300 1301 スタック領域と固定長メモリプール領域は,標準では,intptr_t型の配列とし 1302 て確保するが,より大きい単位でアラインさせたいなどの理由で,それ以外の 1303 型の配列として確保する場合には,それぞれTOPPERS_STK_TとTOPPERS_MPF_Tを, 1304 配列のベースとなるデータ型にマクロ定義する. 1305 1306 5.5 ビットパターンのビット数 1307 1308 (5-5-1) TBIT_TEXPTN タスク例外要因のビット数(オプション) 1309 (5-5-2) TBIT_FLGPTN イベントフラグのビット数(オプション) 1310 1311 TBIT_TEXPTN,TBIT_FLGPTNの標準の定義では,整数型の有効ビット数が,その 1312 型のsizeofにCHAR_BITを乗じたものと一致していることを仮定している.多く 1313 のコンパイラでこの仮定が成り立つが,そうでない場合には,ターゲット依存 1314 部でこれらの定義を上書きする必要がある.ただし,これらの値は16以上でな 1315 ければならない. 1316 1317 5.6 メモリ領域確保のためのマクロ 1318 1319 (5-6-1) TOPPERS_ROUND_SZ(オプション) 1320 (5-6-2) TOPPERS_COUNT_SZ(オプション) 1321 1322 TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ 1323 イズがszのメモリ領域をサイズがunitのデータ型の配列で確保する場合の要素 1324 数を求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ 1325 たものにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ 1326 がunitのデータ型の配列で確保する場合のトータルサイズを求めるために用い 1327 る. 1328 1329 それぞれ,標準のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ 1330 ト依存部で用意する場合には,これらのシンボルを適切な値にマクロ定義する. 1331 1332 5.7 オーバランハンドラ機能拡張のための定義(オプション) 1333 1334 オーバランハンドラ機能拡張パッケージをサポートする(使用できるようにす 1335 る)場合には,次の3つを実施することが必要である. 1336 1337 ・この節で説明する定義を行う. 1338 ・6章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されている場 1339 合にのみ有効となるコードを実装する. 1340 ・オーバランタイマドライバを用意する.オーバランタイマドライバについて 1341 は,「6.14 オーバランタイマドライバ」の節を参照すること. 1561 1342 1562 1343 (5-7-1) TOPPERS_TARGET_SUPPORT_OVRHDR 1563 1344 1564 ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µããã±ã¼ã¸ããµãã¼ãããå ´åã«ã¯ï¼ãã®ã·ã³ã 1565 ã«ããã¯ãå®ç¾©ããï¼ 1566 1567 (5-7-2) TMAX_OVRTIMï¼ãªãã·ã§ã³ï¼ããã©ã«ãã¯ULONG_MAXï¼ 1568 1569 ããã»ããµæéã¨ãã¦ãªã¼ãã©ã³ã¿ã¤ãã«è¨å®ã§ããæ大å¤ï¼åä½ã¯ãã¤ã¯ã 1570 ç§ï¼ã«ãã¯ãå®ç¾©ããï¼ 1571 1572 1573 ï¼ï¼ã«ã¼ãã«å®è£ 1574 ã®ã¿ã¼ã²ããä¾åé¨ 1575 1576 6.1 ã«ã¼ãã«å®è£ 1577 ã®ã¿ã¼ã²ããä¾åé¨ã®å 1578 ±éäºé 1579 1580 1581 6.1.1 ã«ã¼ãã«å®è£ 1582 ã®ã¿ã¼ã²ããä¾åé¨ã®æ§æè¦ç´ 1583 1584 ã«ã¼ãã«å®è£ 1585 ã®ã¿ã¼ã²ããä¾åé¨ã¯ï¼ä»¥ä¸ã®è¦ç´ ã§æ§æãããï¼ 1586 1587 (a) ã«ã¼ãã«å®è£ 1588 ã®ã¿ã¼ã²ããä¾åã®å®ç¾© 1589 1590 ã«ã¼ãã«å®è£ 1591 ã®ã¿ã¼ã²ããéä¾åé¨ããåç 1592 §ãããã¿ã¼ã²ããä¾åã®å®ç¾©ã¯ï¼ 1593 target_config.hã¾ãã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ããã»ããµã»ãã 1594 ãã»éçºç°å¢ä¾åé¨ã§ç¨æãããããããã¡ã¤ã«ãªã©ï¼ã«å«ããï¼ 1595 1596 ã¿ã¼ã²ããã®ãã¼ãã¦ã§ã¢è³æºï¼å²è¾¼ã¿ãã³ãã©çªå·ãCPUä¾å¤ãã³ãã©çªå·ï¼ 1597 ããã¤ã¹ã¬ã¸ã¹ã¿ã®çªå°ãªã©ï¼ã®å®ç¾©ã¯ï¼ã·ã¹ãã ãµã¼ãã¹ãã¢ããªã±ã¼ã·ã§ 1598 ã³ã«ãæç¨ã§ããããï¼ã«ã¼ãã«å®è£ 1599 ã®ã¿ã«æç¨ãªå®ç¾©ãå«ããã¡ã¤ã«ã¨ã¯å 1600 ãåãã¦ï¼ç¬ç«ããããããã¡ã¤ã«ã«å«ããï¼ãã®ããããã¡ã¤ã«ã®æ¨æºç㪠1601 å称ãï¼ã·ã¹ãã ç¥ç§°.hï¼ã¾ãã¯ï¼ãããç¥ç§°.hï¼ããã»ããµç¥ç§°.hï¼ã¨ããï¼ 1602 1603 (b) ã«ã¼ãã«å®è£ 1604 ã®ã¿ã¼ã²ããä¾åã¢ã¸ã¥ã¼ã« 1605 1606 ã«ã¼ãã«å®è£ 1607 ã®ã¿ã¼ã²ããä¾åã®å¤æ°å®ç¾©ãé¢æ°ãå«ãã¢ã¸ã¥ã¼ã«ï¼Cè¨èªã§è¨ 1608 è¿°ãããé¨åãtarget_config.cï¼ã¢ã»ã³ããªè¨èªã§è¨è¿°ãããé¨åã 1609 target_support.Sã«å«ããï¼ããã»ããµã»ãããã»éçºç°å¢ä¾åé¨ãåãåã 1610 ããã¨ãï¼ãã¡ã¤ã«ã大ãããªãå ´åã«è¤æ°ã®ãã¡ã¤ã«ã«åå²ãããã¨ãå¯è½ 1611 ã§ããï¼ 1612 1613 (c) ã«ã¼ãã«å®è£ 1614 ã®ã¿ã¼ã²ããä¾åé¨ã®ããã®ãªãã¼ã è¨è¿° 1615 1616 ã«ã¼ãã«å®è£ 1617 ã®ã¿ã¼ã²ããä¾åé¨ã®å¤æ°åãé¢æ°åãï¼å 1618 é ã«_kernel_ãä»ä¸ 1619 ããååã«ãªãã¼ã ããããã®ã¢ã¸ã¥ã¼ã«ï¼target_rename.defãç¨æãï¼ãã¼ 1620 ã«ï¼utils/genrenameï¼ã«ããï¼target_rename.hã¨target_unrename.hãçæã 1621 ãï¼ããã»ããµã»ãããã»éçºç°å¢ä¾åé¨ãåãåããå ´åã«ã¯ï¼ãªãã¼ã è¨ 1622 è¿°ãåãåããï¼ 1623 1624 (d) ã¿ã¤ããã©ã¤ã 1625 1626 ã«ã¼ãã«ã«ã¿ã¤ã ãã£ãã¯ãéç¥ããï¼signal_timeãå¨æçã«å¼ã³åºãï¼ãã 1627 ã®ã¿ã¤ããã©ã¤ãã®ããããã¡ã¤ã«ï¼å®è£ 1628 ãã¡ã¤ã«ï¼ã·ã¹ãã ã³ã³ãã£ã®ã¥ã¬ã¼ 1629 ã·ã§ã³ãã¡ã¤ã«ãï¼ããããï¼target_timer.hï¼target_timer.cï¼ 1630 target_timer.cfgã«å«ããï¼ããã»ããµã»ãããã»éçºç°å¢ä¾åé¨ãåãåã 1631 ããã¨ãå¯è½ã§ããï¼ 1632 1633 ã¾ãï¼ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µããã±ã¼ã¸ããµãã¼ãããå ´åã«ã¯ï¼ãªã¼ 1634 ãã©ã³ãã³ãã©ãèµ·åããï¼call_ovrhdrãå¼ã³åºãï¼ããã®ãªã¼ãã©ã³ã¿ã¤ã 1635 ãã©ã¤ããï¼åããã¡ã¤ã«ã«å«ããï¼ 1636 1637 ãªãï¼ãã®ç« ã«ç¤ºãã³ã¼ãä¸ã§ï¼TOPPERS_SUPPORT_OVRHDRããã¯ãå®ç¾©ãã㦠1638 ããå ´åã«ã®ã¿æå¹ã¨ãªãã³ã¼ãã¯ï¼ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µããã±ã¼ã¸ 1639 ããµãã¼ãããªãå ´åã«ã¯ï¼å®è£ 1640 ããå¿ 1641 è¦ããªãï¼ 1642 1643 (e) ã³ã³ãã£ã®ã¥ã¬ã¼ã¿è¨å®ãã¡ã¤ã« 1644 1645 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®è¨å®ãã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ãï¼target_def.csvï¼ 1646 target.tfï¼target_check.tfã«ç¨æããï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿è¨å®ãã¡ã¤ã«ã® 1647 è¨è¿°æ¹æ³ã«ã¤ãã¦ã¯ï¼ï¼ç« ã§èª¬æããï¼ 1648 1649 6.1.2 ã¿ã¼ã²ããä¾åé¨ã®é¢æ°ã®å½åè¦å 1650 1651 ã«ã¼ãã«å®è£ 1652 ã®ã¿ã¼ã²ããä¾åé¨ãæ§æããé¢æ°ã®ä¸ã§ï¼t_ã§å§ã¾ããã®ã¯ã¿ 1653 ã¹ã¯ã³ã³ããã¹ãå°ç¨ï¼i_ã§å§ã¾ããã®ã¯éã¿ã¹ã¯ã³ã³ããã¹ãå°ç¨ï¼x_ã§å§ 1654 ã¾ããã®ã¯ãããã®ã³ã³ããã¹ãããã§ãå¼ã³åºããã¨ãã§ããé¢æ°ã§ããï¼ 1655 1656 6.2 ãã¬ã¼ã¹ãã°æ©è½ã¸ã®å¯¾å¿ 1657 1658 ã«ã¼ãã«ã®ãã¬ã¼ã¹ãã°æ©è½ã®ä¸ã§ï¼ãã£ã¹ãããã£ï¼å²è¾¼ã¿ãã³ãã©ï¼CPUä¾ 1659 å¤ãã³ãã©ã®éå§ã»çµäºã®ãã¬ã¼ã¹ãã°åå¾ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§å®è£ 1660 ãã 1661 å¿ 1662 è¦ãããï¼ã»ã¨ãã©ã®ã¿ã¼ã²ããã·ã¹ãã ã«ããã¦ï¼ãããã®å¦çã¯ã¢ã»ã³ 1663 ããªè¨èªã§è¨è¿°ããã¦ããï¼ã¿ã¼ã²ããéä¾åé¨åãã®ãã¬ã¼ã¹ãã°ãã¯ã㨠1664 åãæ¹æ³ï¼ãã¬ã¼ã¹ãã°ãã¯ããï¼ãã¬ã¼ã¹ãã°åå¾å¦çã®Cè¨èªè¨è¿°ã«ãã¯ã 1665 å®ç¾©ããæ¹æ³ï¼ã¯ï¼ç¨ãããã¨ãã§ããªãï¼ 1666 1667 ããã§ï¼ã¢ã»ã³ããªè¨èªã§è¨è¿°ããã¦ããå¦çä¸ã«ãã¬ã¼ã¹ãã°åå¾ãåãè¾¼ 1668 ãå ´åã«ã¯ï¼ãã¬ã¼ã¹ãã°ãã¯ããå®ç¾©ããã¦ããã°ï¼ãããä½ã«å®ç¾©ãã㦠1669 ãããã¯ç¡è¦ãã¦ï¼æ¨æºçãªãã¬ã¼ã¹ãã°é¢æ°ãCè¨èªã§è¨è¿°ããã¦ããã¨æ³å® 1670 ãã¦ï¼ãããå¼ã³åºãããã«ã³ã¼ãã£ã³ã°ããï¼ 1671 1672 å 1673 ·ä½çã«ã¯ï¼ä¸ã®è¡¨ã®å·¦å´ã«ç¤ºãããã¬ã¼ã¹ãã°ãã¯ããå®ç¾©ããã¦ããã°ï¼ 1674 表ã®å³å´ã«ç¤ºããCè¨èªè¨è¿°ã¨åçã®å¦çãè¡ãããã«ã³ã¼ãã£ã³ã°ããï¼ 1675 1676 ãã¬ã¼ã¹ãã°ãã¯ã ãã¬ã¼ã¹ãã°åå¾å¦ç 1345 オーバランハンドラ機能拡張パッケージをサポートする場合には,このシンボ 1346 ルをマクロ定義する. 1347 1348 (5-7-2) TMAX_OVRTIM(オプション,デフォルトはULONG_MAX) 1349 1350 プロセッサ時間としてオーバランタイマに設定できる最大値(単位はマイクロ 1351 秒)にマクロ定義する. 1352 1353 1354 6.カーネル実装のターゲット依存部 1355 1356 6.1 カーネル実装のターゲット依存部の共通事項 1357 1358 6.1.1 カーネル実装のターゲット依存部の構成要素 1359 1360 カーネル実装のターゲット依存部は,以下の要素で構成される. 1361 1362 (a) カーネル実装のターゲット依存の定義 1363 1364 カーネル実装のターゲット非依存部から参照されるターゲット依存の定義は, 1365 target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ 1366 プ・開発環境依存部で用意されるヘッダファイルなど)に含める. 1367 1368 ターゲットのハードウェア資源(割込みハンドラ番号やCPU例外ハンドラ番号, 1369 デバイスレジスタの番地など)の定義は,システムサービスやアプリケーショ 1370 ンにも有用であるため,カーネル実装のみに有用な定義を含むファイルとは切 1371 り分けて,独立したヘッダファイルに含める.このヘッダファイルの標準的な 1372 名称を,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする. 1373 1374 (b) カーネル実装のターゲット依存モジュール 1375 1376 カーネル実装のターゲット依存の変数定義や関数を含むモジュール.C言語で記 1377 述される部分をtarget_config.c,アセンブリ言語で記述される部分を 1378 target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け 1379 ることや,ファイルが大きくなる場合に複数のファイルに分割することも可能 1380 である. 1381 1382 (c) カーネル実装のターゲット依存部のためのリネーム記述 1383 1384 カーネル実装のターゲット依存部の変数名や関数名を,先頭に_kernel_を付与 1385 した名前にリネームするためのモジュール.target_rename.defを用意し,ツー 1386 ル(utils/genrename)により,target_rename.hとtarget_unrename.hを生成す 1387 る.プロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記 1388 述も切り分ける. 1389 1390 (d) タイマドライバ 1391 1392 カーネルにタイムティックを通知する(signal_timeを周期的に呼び出す)ため 1393 のタイマドライバのヘッダファイル,実装ファイル,システムコンフィギュレー 1394 ションファイルを,それぞれ,target_timer.h,target_timer.c, 1395 target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け 1396 ることも可能である. 1397 1398 また,オーバランハンドラ機能拡張パッケージをサポートする場合には,オー 1399 バランハンドラを起動する(call_ovrhdrを呼び出す)ためのオーバランタイマ 1400 ドライバも,同じファイルに含める. 1401 1402 なお,この章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されて 1403 いる場合にのみ有効となるコードは,オーバランハンドラ機能拡張パッケージ 1404 をサポートしない場合には,実装する必要がない. 1405 1406 (e) コンフィギュレータ設定ファイル 1407 1408 コンフィギュレータの設定ファイルのターゲット依存部を,target_def.csv, 1409 target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの 1410 記述方法については,7章で説明する. 1411 1412 6.1.2 ターゲット依存部の関数の命名規則 1413 1414 カーネル実装のターゲット依存部を構成する関数の中で,t_で始まるものはタ 1415 スクコンテキスト専用,i_で始まるものは非タスクコンテキスト専用,x_で始 1416 まるものはいずれのコンテキストからでも呼び出すことができる関数である. 1417 1418 6.2 トレースログ機能への対応 1419 1420 カーネルのトレースログ機能の中で,ディスパッチャ,割込みハンドラ,CPU例 1421 外ハンドラの開始・終了のトレースログ取得は,ターゲット依存部で実装する 1422 必要がある.ほとんどのターゲットシステムにおいて,それらの処理はアセン 1423 ブリ言語で記述されており,ターゲット非依存部向けのトレースログマクロと 1424 同じ方法(トレースログマクロを,トレースログ取得処理のC言語記述にマクロ 1425 定義する方法)は,用いることができない. 1426 1427 そこで,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込 1428 む場合には,トレースログマクロが定義されていれば,それが何に定義されて 1429 いるかは無視して,標準的なトレースログ関数がC言語で記述されていると想定 1430 して,それを呼び出すようにコーディングする. 1431 1432 具体的には,下の表の左側に示したトレースログマクロが定義されていれば, 1433 表の右側に示したC言語記述と同等の処理を行うようにコーディングする. 1434 1435 トレースログマクロ トレースログ取得処理 1677 1436 ----------------------------------------------- 1678 1437 LOG_DSP_ENTER log_dsp_enter(p_runtsk) … … 1683 1442 LOG_EXC_LEAVE log_exc_leave(excno) 1684 1443 1685 6.3 ã·ã¹ãã ç¶æ 1686 ã®ç®¡ç 1687 1688 ASPã«ã¼ãã«ãæ°ããªã¿ã¼ã²ããã·ã¹ãã ã«ãã¼ãã£ã³ã°ããéã«ï¼æãéè¦ãª 1689 ä½æ¥ã¯ï¼ã«ã¼ãã«ãå®ç¾©ããã·ã¹ãã ç¶æ 1690 ãï¼ãã¼ãã¦ã§ã¢ï¼ããã»ããµï¼ä¸ 1691 ã§ã©ã®ããã«å®ç¾ãããã§ããï¼ä»¥ä¸ã®èª¬æã¯ï¼TOPPERSæ°ä¸ä»£ã«ã¼ãã«ã«ãã 1692 ãã·ã¹ãã ç¶æ 1693 ã®å®ç¾©ã»æå³ãç¥ã£ã¦ãããã¨ãåæã«è¨è¿°ãã¦ããï¼ 1694 1695 6.3.1 å 1696 ¨å²è¾¼ã¿ããã¯ç¶æ 1697 ã®ç®¡ç 1698 1699 å 1700 ¨å²è¾¼ã¿ããã¯ç¶æ 1701 ã¯ï¼NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ã¯ããç¶æ 1702 ã§ããï¼å 1703 ¨ 1704 å²è¾¼ã¿ããã¯ç¶æ 1705 ã管çããæ©è½ã¯ï¼ã·ã¹ãã ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¤ã¤ï¼SILï¼ã« 1706 ãã£ã¦æä¾ããï¼ã«ã¼ãã«ã¯å 1707 ¨å²è¾¼ã¿ããã¯ç¶æ 1708 ã管çããªãï¼ 1709 1710 å 1711 ¨å²è¾¼ã¿ããã¯ç¶æ 1712 ã§ã¯ï¼sns_kerã¨ext_ker以å¤ã®ã«ã¼ãã«ã®ãµã¼ãã¹ã³ã¼ã« 1713 ãå¼ã¶ãã¨ã¯ã§ããªããã®ã¨ãã¦ããï¼å¼ãã å ´åã«ã¯ä½ãèµ·ãããä¿è¨¼ã㦠1714 ããªãï¼sns_kerã¨ext_kerããå¼ã³åºãå¦çã¯ï¼ãã¬ã¼ã¹ãã°åå¾å¦çã¨SILã® 1715 ãµã¼ãã¹ã³ã¼ã«ãé¤ãã¨ï¼call_exit_kernelã®ã¿ã§ããï¼ãã®ããï¼ 1716 call_exit_kernelããå¼ã³åºããã®ãé¤ãã¦ï¼ã«ã¼ãã«ã®ã¿ã¼ã²ããä¾åé¨ã® 1717 é¢æ°ãï¼å 1718 ¨å²è¾¼ã¿ããã¯ç¶æ 1719 ã§å¼ã³åºãããç¶æ³ã¯èããå¿ 1720 è¦ããªãï¼ 1721 1722 6.3.2 ã³ã³ããã¹ãã®ç®¡ç 1723 1724 å¦çåä½ãå®è¡ãããã³ã³ããã¹ãã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã¨éã¿ã¹ã¯ã³ã³ã 1725 ãã¹ãã«åé¡ãããï¼ 1726 1727 ã¿ã¼ã²ããä¾åé¨ã¯ï¼å®è¡ä¸ã®å¦çåä½ãï¼ã¿ã¹ã¯ã³ã³ããã¹ãã§å®è¡ãã㦠1728 ãããéã¿ã¹ã¯ã³ã³ããã¹ãã§å®è¡ããã¦ããããå¤å¥ããæ©è½ãæä¾ããï¼ 1729 ã¾ãï¼CPUä¾å¤ãçºçããã³ã³ããã¹ãã«ã¤ãã¦å¤å¥ããæ©è½ãæä¾ããï¼ 1730 1731 ã¿ã¼ã²ããä¾åé¨ã§ã¯ï¼å²è¾¼ã¿ãã³ãã©ã¨CPUä¾å¤ãã³ãã©ã®å 1732 ¥å£å¦çã§éã¿ã¹ 1733 ã¯ã³ã³ããã¹ãã«åãæãï¼ãããã®åºå£å¦çã§å 1734 ã®ã³ã³ããã¹ãã«æ»ãï¼ã¾ 1735 ãï¼ãã£ã¹ãããã£ã®å 1736 é¨ã§ä¸æçã«éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæããï¼ 1444 6.3 システム状態の管理 1445 1446 ASPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な 1447 作業は,カーネルが定義するシステム状態を,ハードウェア(プロセッサ)上 1448 でどのように実現するかである.以下の説明は,TOPPERS新世代カーネルにおけ 1449 るシステム状態の定義・意味を知っていることを前提に記述している. 1450 1451 6.3.1 全割込みロック状態の管理 1452 1453 全割込みロック状態は,NMIを除くすべての割込みをマスクした状態である.全 1454 割込みロック状態を管理する機能は,システムインタフェースレイヤ(SIL)に 1455 よって提供され,カーネルは全割込みロック状態を管理しない. 1456 1457 全割込みロック状態では,sns_kerとext_ker以外のカーネルのサービスコール 1458 を呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して 1459 いない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの 1460 サービスコールを除くと,call_exit_kernelのみである.そのため, 1461 call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の 1462 関数が,全割込みロック状態で呼び出される状況は考える必要がない. 1463 1464 6.3.2 コンテキストの管理 1465 1466 処理単位が実行されるコンテキストは,タスクコンテキストと非タスクコンテ 1467 キストに分類される. 1468 1469 ターゲット依存部は,実行中の処理単位が,タスクコンテキストで実行されて 1470 いるか非タスクコンテキストで実行されているかを判別する機能を提供する. 1471 また,CPU例外が発生したコンテキストについて判別する機能を提供する. 1472 1473 ターゲット依存部では,割込みハンドラとCPU例外ハンドラの入口処理で非タス 1474 クコンテキストに切り換え,それらの出口処理で元のコンテキストに戻す.ま 1475 た,ディスパッチャの内部で一時的に非タスクコンテキストに切り換える. 1737 1476 1738 1477 (6-3-2-1) bool_t sense_context(void) 1739 1478 1740 å®è¡ä¸ã®å¦çåä½ãï¼ã¿ã¹ã¯ã³ã³ããã¹ãã§å®è¡ããã¦ããå ´åã«ã¯falseï¼é 1741 ã¿ã¹ã¯ã³ã³ããã¹ãã§å®è¡ããã¦ããå ´åã«ã¯trueãè¿ãé¢æ°ï¼ãã®é¢æ°ã¯ï¼ 1742 CPUããã¯ç¶æ 1743 ã§ãCPUããã¯è§£é¤ç¶æ 1744 ã§ãå¼ã³åºããããã«å®è£ 1745 ããªããã°ãª 1746 ããªãï¼ 1747 1748 6.3.3 CPUããã¯ç¶æ 1749 ã®ç®¡ç 1750 1751 ã¿ã¼ã²ããä¾åé¨ã¯ï¼CPUããã¯ç¶æ 1752 ã¸é·ç§»ããæ©è½ï¼CPUããã¯è§£é¤ç¶æ 1753 ã¸é· 1754 移ããæ©è½ï¼CPUããã¯ç¶æ 1755 ã§ããããå¤å¥ããæ©è½ãæä¾ããï¼ 1479 実行中の処理単位が,タスクコンテキストで実行されている場合にはfalse,非 1480 タスクコンテキストで実行されている場合にはtrueを返す関数.この関数は, 1481 CPUロック状態でもCPUロック解除状態でも呼び出せるように実装しなければな 1482 らない. 1483 1484 6.3.3 CPUロック状態の管理 1485 1486 ターゲット依存部は,CPUロック状態へ遷移する機能,CPUロック解除状態へ遷 1487 移する機能,CPUロック状態であるかを判別する機能を提供する. 1756 1488 1757 1489 (6-3-3-1) void t_lock_cpu(void) … … 1759 1491 (6-3-3-3) void x_lock_cpu(void) 1760 1492 1761 CPUããã¯è§£é¤ç¶æ 1762 ããï¼CPUããã¯ç¶æ 1763 ã¸é·ç§»ãããé¢æ°ï¼ãããã®é¢æ°ã¯ï¼ 1764 CPUããã¯ç¶æ 1765 ã§å¼ã³åºããããã¨ã¯ãªãï¼å¼ã³åºãããå ´åã®åä½ã¯ä¿è¨¼ãã 1766 å¿ 1767 è¦ããªãï¼ 1768 1769 ãããã®é¢æ°ãå®ç¾ããéã«ã¯ï¼ã1.6 ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 1770 ¥å¦çã® 1771 å®ç¾ã«é¢ããå¶ç´ãã®ç¯ã«è¨è¿°ããã¦ããå¶ç´ã«å¾ããªããã°ãªããªãï¼ 1493 CPUロック解除状態から,CPUロック状態へ遷移させる関数.これらの関数は, 1494 CPUロック状態で呼び出されることはなく,呼び出された場合の動作は保証する 1495 必要がない. 1496 1497 これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の 1498 実現に関する制約」の節に記述されている制約に従わなければならない. 1772 1499 1773 1500 (6-3-3-4) void t_unlock_cpu(void) … … 1775 1502 (6-3-3-6) void x_unlock_cpu(void) 1776 1503 1777 CPUããã¯ç¶æ 1778 ããï¼CPUããã¯è§£é¤ç¶æ 1779 ã¸é·ç§»ãããé¢æ°ï¼ãããã®é¢æ°ã¯ï¼ 1780 CPUããã¯è§£é¤ç¶æ 1781 ã§å¼ã³åºããããã¨ã¯ãªãï¼å¼ã³åºãããå ´åã®åä½ã¯ä¿è¨¼ 1782 ããå¿ 1783 è¦ããªãï¼ 1784 1785 ã¿ã¹ã¯ã³ã³ããã¹ãã§CPUããã¯ç¶æ 1786 ã«é·ç§»ããå ´åã«ã¯ï¼CPUããã¯è§£é¤ç¶æ 1787 1788 ã«æ»ãã®ã¯ã¿ã¹ã¯ã³ã³ããã¹ãã«éããï¼éã¿ã¹ã¯ã³ã³ããã¹ãã§CPUããã¯è§£ 1789 é¤ç¶æ 1790 ã«æ»ããã¨ã¯ãªãï¼è¨ãæããã¨ï¼t_unlock_cpuãå¼ã³åºãããã®ã¯ï¼ 1791 t_lock_cpuã«ãã£ã¦CPUããã¯ç¶æ 1792 ã«ãªã£ã¦ããæã§ããï¼i_lock_cpuã«ãã£ã¦ 1793 CPUããã¯ç¶æ 1794 ã«ãªã£ã¦ããæã«ã¯ï¼t_unlock_cpuãå¼ã³åºããããã¨ã¯ãªãï¼ 1795 1796 åæ§ã«ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã§CPUããã¯ç¶æ 1797 ã«é·ç§»ããå ´åã«ã¯ï¼CPUãã 1798 ã¯è§£é¤ç¶æ 1799 ã«æ»ãã®ã¯éã¿ã¹ã¯ã³ã³ããã¹ãã«éããï¼ã¿ã¹ã¯ã³ã³ããã¹ã㧠1800 CPUããã¯è§£é¤ç¶æ 1801 ã«æ»ããã¨ã¯ãªãï¼è¨ãæããã¨ï¼i_unlock_cpuãå¼ã³åºã 1802 ããã®ã¯ï¼i_lock_cpuã«ãã£ã¦CPUããã¯ç¶æ 1803 ã«ãªã£ã¦ããæã§ããï¼ 1804 t_lock_cpuã«ãã£ã¦CPUããã¯ç¶æ 1805 ã«ãªã£ã¦ããæã«ã¯ï¼i_unlock_cpuãå¼ã³åº 1806 ããããã¨ã¯ãªãï¼ 1807 1808 ãããã®é¢æ°ãå®ç¾ããéã«ã¯ï¼ã1.6 ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®åºå 1809 ¥å¦çã® 1810 å®ç¾ã«é¢ããå¶ç´ãã®ç¯ã«è¨è¿°ããã¦ããå¶ç´ã«å¾ããªããã°ãªããªãï¼ 1504 CPUロック状態から,CPUロック解除状態へ遷移させる関数.これらの関数は, 1505 CPUロック解除状態で呼び出されることはなく,呼び出された場合の動作は保証 1506 する必要がない. 1507 1508 タスクコンテキストでCPUロック状態に遷移した場合には,CPUロック解除状態 1509 に戻るのはタスクコンテキストに限られ,非タスクコンテキストでCPUロック解 1510 除状態に戻ることはない.言い換えると,t_unlock_cpuが呼び出されるのは, 1511 t_lock_cpuによってCPUロック状態になっている時である.i_lock_cpuによって 1512 CPUロック状態になっている時には,t_unlock_cpuが呼び出されることはない. 1513 1514 同様に,非タスクコンテキストでCPUロック状態に遷移した場合には,CPUロッ 1515 ク解除状態に戻るのは非タスクコンテキストに限られ,タスクコンテキストで 1516 CPUロック解除状態に戻ることはない.言い換えると,i_unlock_cpuが呼び出さ 1517 れるのは,i_lock_cpuによってCPUロック状態になっている時である. 1518 t_lock_cpuによってCPUロック状態になっている時には,i_unlock_cpuが呼び出 1519 されることはない. 1520 1521 これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の 1522 実現に関する制約」の節に記述されている制約に従わなければならない. 1811 1523 1812 1524 (6-3-3-7) bool_t t_sense_lock(void) … … 1814 1526 (6-3-3-9) bool_t x_sense_lock(void) 1815 1527 1816 ç¾å¨ã®ã·ã¹ãã ç¶æ 1817 ãï¼CPUããã¯ç¶æ 1818 ã®å ´åã¯trueï¼CPUããã¯è§£é¤ç¶æ 1819 ã®å ´ 1820 åã«ã¯falseãè¿ãé¢æ°ï¼ 1821 1822 ãããã®é¢æ°ãå 1823 ¨å²è¾¼ã¿ããã¯ç¶æ 1824 ã§å¼ã³åºãããç¶æ³ã¯èããå¿ 1825 è¦ããªãã 1826 ã¨ããï¼å 1827 ¨å²è¾¼ã¿ããã¯ç¶æ 1828 ã¨CPUããã¯ç¶æ 1829 ãåºå¥ã§ããå¿ 1830 è¦ã¯ãªãï¼NMI以 1831 å¤ã«ã«ã¼ãã«ã®ç®¡çå¤ã®å²è¾¼ã¿ãè¨ããªãå ´åã«ã¯ï¼å 1832 ¨å²è¾¼ã¿ããã¯ç¶æ 1833 㨠1834 CPUããã¯ç¶æ 1835 ãå 1836 ¨ãåä¸ã®ç¶æ 1837 ã§ããã¾ããªãï¼ 1838 1839 6.4 å²è¾¼ã¿ã«é¢é£ããã·ã¹ãã ç¶æ 1840 ã®ç®¡ç 1841 1842 6.4.1 å²è¾¼ã¿åªå 1843 度ãã¹ã¯ã®ç®¡ç 1844 1845 ã¿ã¼ã²ããä¾åé¨ã¯ï¼å²è¾¼ã¿åªå 1846 度ãã¹ã¯ãè¨å®ããæ©è½ã¨ï¼å²è¾¼ã¿åªå 1847 度ã 1848 ã¹ã¯ãåç 1849 §ããæ©è½ãæä¾ããï¼ 1850 1851 (6-4-1-1) bool_t VALID_INTPRI_CHGIPM(PRI intpri)ï¼ãªãã·ã§ã³ï¼ 1852 1853 intpriãï¼chg_ipmã«å¯¾ããå²è¾¼ã¿åªå 1854 度ã¨ãã¦æå¹ãªå¤ã§ããå ´åã«trueï¼ã 1855 ãã§ãªãå ´åã«falseãè¿ããã¯ãï¼æ¨æºã§ã¯ï¼TMIN_INTPRI以ä¸ï¼TIPM_ENAALL 1856 ï¼ï¼0ï¼ä»¥ä¸ã®å¤ãchg_ipmã«å¯¾ããå²è¾¼ã¿åªå 1857 度ã¨ãã¦æå¹ã§ãããï¼ã¿ã¼ã²ã 1858 ãä¾åé¨ã§ãã®ãã¯ããå®ç¾©ãããã¨ã§ï¼TMIN_INTPRIãããå°ããå¤ãæå¹ã¨ 1859 ãããã¨ãã§ããï¼æå¹ãªå¤ã®ç¯å²ãçãã¦ã¯ãªããªãï¼ï¼ 1528 現在のシステム状態が,CPUロック状態の場合はtrue,CPUロック解除状態の場 1529 合にはfalseを返す関数. 1530 1531 これらの関数が全割込みロック状態で呼び出される状況は考える必要がないこ 1532 とから,全割込みロック状態とCPUロック状態を区別できる必要はない.NMI以 1533 外にカーネルの管理外の割込みを設けない場合には,全割込みロック状態と 1534 CPUロック状態が全く同一の状態でもかまわない. 1535 1536 6.4 割込みに関連するシステム状態の管理 1537 1538 6.4.1 割込み優先度マスクの管理 1539 1540 ターゲット依存部は,割込み優先度マスクを設定する機能と,割込み優先度マ 1541 スクを参照する機能を提供する. 1542 1543 (6-4-1-1) bool_t VALID_INTPRI_CHGIPM(PRI intpri)(オプション) 1544 1545 intpriが,chg_ipmに対する割込み優先度として有効な値である場合にtrue,そ 1546 うでない場合にfalseを返すマクロ.標準では,TMIN_INTPRI以上,TIPM_ENAALL 1547 (=0)以下の値がchg_ipmに対する割込み優先度として有効であるが,ターゲッ 1548 ト依存部でこのマクロを定義することで,TMIN_INTPRIよりも小さい値を有効と 1549 することができる(有効な値の範囲を狭めてはならない). 1860 1550 1861 1551 (6-4-1-2) void x_set_ipm(PRI intpri) … … 1863 1553 (6-4-1-4) void i_set_ipm(PRI intpri) 1864 1554 1865 å²è¾¼ã¿åªå 1866 度ãã¹ã¯ã®å¤ãintpriã«è¨å®ããé¢æ°ï¼ 1867 1868 ãããã®é¢æ°ã¯ï¼CPUããã¯ç¶æ 1869 ã§ãCPUããã¯è§£é¤ç¶æ 1870 ã§ãå¼ã³åºããããã« 1871 å®è£ 1872 ããã®ãæã¾ããï¼ãã ãï¼x_set_ipmã¨t_set_ipmã¯ï¼ã¿ã¼ã²ããéä¾å 1873 é¨ãCPUããã¯è§£é¤ç¶æ 1874 ã§å¼ã³åºããã¨ã¯ãªãããï¼CPUããã¯è§£é¤ç¶æ 1875 ã§å¼ã³ 1876 åºãããå ´åã®åä½ã¯ä¿è¨¼ããå¿ 1877 è¦ããªãï¼i_set_ipmã¯ï¼CPUããã¯ç¶æ 1878 ã§ã 1879 CPUããã¯è§£é¤ç¶æ 1880 ã§ãå¼ã³åºããããã«å®è£ 1881 ããªããã°ãªããªãï¼ 1882 1883 ã¾ãï¼ãããã®é¢æ°ã¯ï¼VALID_INTPRI_CHGIPM(intpri)ãtrueãè¿ãintpriã«å¯¾ 1884 ãã¦ã®ã¿å¼ã°ããï¼intpriã«ããã§ãªãå¤ã渡ãããå ´åã®åä½ã¯ä¿è¨¼ããå¿ 1885 1886 è¦ããªãï¼ 1555 割込み優先度マスクの値をintpriに設定する関数. 1556 1557 これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように 1558 実装するのが望ましい.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存 1559 部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び 1560 出された場合の動作は保証する必要がない.i_set_ipmは,CPUロック状態でも 1561 CPUロック解除状態でも呼び出せるように実装しなければならない. 1562 1563 また,これらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対 1564 してのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証する必 1565 要がない. 1887 1566 1888 1567 (6-4-1-5) PRI x_get_ipm(void) … … 1890 1569 (6-4-1-7) PRI i_get_ipm(void) 1891 1570 1892 å²è¾¼ã¿åªå 1893 度ãã¹ã¯ã®å¤ãåç 1894 §ãã¦è¿ãé¢æ°ï¼ 1895 1896 ãããã®é¢æ°ã¯ï¼CPUããã¯ç¶æ 1897 ã§ãCPUããã¯è§£é¤ç¶æ 1898 ã§ãå¼ã³åºããããã« 1899 å®è£ 1900 ããã®ãæã¾ããï¼ãã ãï¼x_get_ipmã¨t_get_ipmã¯ï¼ã¿ã¼ã²ããéä¾å 1901 é¨ãCPUããã¯è§£é¤ç¶æ 1902 ã§å¼ã³åºããã¨ã¯ãªãããï¼CPUããã¯è§£é¤ç¶æ 1903 ã§å¼ã³ 1904 åºãããå ´åã®åä½ã¯ä¿è¨¼ããå¿ 1905 è¦ããªãï¼i_get_ipmã¯ï¼CPUããã¯ç¶æ 1906 ã§ã 1907 CPUããã¯è§£é¤ç¶æ 1908 ã§ãå¼ã³åºããããã«å®è£ 1909 ããªããã°ãªããªãï¼ 1910 1911 å²è¾¼ã¿åªå 1912 度ãã¹ã¯ãç¨ãã¦ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ããã¹ã¦ãã¹ã¯ããç¶æ 1913 ã¯ï¼ 1914 CPUããã¯ç¶æ 1915 ã¨åºå¥ã§ãããã¨ãå¿ 1916 è¦ã§ããï¼å 1917 ·ä½çã«ã¯ï¼CPUããã¯è§£é¤ç¶ 1918 æ 1919 ã«ããã¦ï¼x_set_ipmãç¨ãã¦ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ããã¹ã¦ãã¹ã¯ããå ´å 1920 ã§ãï¼x_sense_lockã¯falseãè¿ãï¼ 1921 1922 ããã«å¯¾ãã¦ï¼å²è¾¼ã¿åªå 1923 度ãã¹ã¯ãç¨ãã¦NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ã¯ 1924 ã§ããå ´åï¼ãã®ç¶æ 1925 ã¨å 1926 ¨å²è¾¼ã¿ããã¯ç¶æ 1927 ãåºå¥ã§ããå¿ 1928 è¦ã¯ãªãï¼å 1929 ¨ãå 1930 ä¸ã®ç¶æ 1931 ã§ããã¾ããªãï¼ 1932 1933 6.4.2 å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ã®ç®¡ç 1934 1935 ã¿ã¼ã²ããä¾åé¨ã¯ï¼å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ãã»ããããæ©è½ã¨ã¯ãªã¢ããæ© 1936 è½ãæä¾ããï¼ 1571 割込み優先度マスクの値を参照して返す関数. 1572 1573 これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように 1574 実装するのが望ましい.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存 1575 部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び 1576 出された場合の動作は保証する必要がない.i_get_ipmは,CPUロック状態でも 1577 CPUロック解除状態でも呼び出せるように実装しなければならない. 1578 1579 割込み優先度マスクを用いてカーネル管理の割込みをすべてマスクした状態は, 1580 CPUロック状態と区別できることが必要である.具体的には,CPUロック解除状 1581 態において,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合 1582 でも,x_sense_lockはfalseを返す. 1583 1584 それに対して,割込み優先度マスクを用いてNMIを除くすべての割込みをマスク 1585 できる場合,その状態と全割込みロック状態を区別できる必要はなく,全く同 1586 一の状態でもかまわない. 1587 1588 6.4.2 割込み要求禁止フラグの管理 1589 1590 ターゲット依存部は,割込み要求禁止フラグをセットする機能とクリアする機 1591 能を提供する. 1937 1592 1938 1593 (6-4-2-1) bool_t VALID_INTNO_DISINT(INTNO intno) 1939 1594 1940 intno ãï¼dis_intï¼ena_intã«å¯¾ããå²è¾¼ã¿çªå·ã¨ãã¦æå¹ãªå¤ã§ããå ´åã«1941 true ï¼ããã§ãªãå ´åã«falseãè¿ããã¯ãï¼å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ãã»ããï¼1942 ã¯ãªã¢ã§ããªãintnoã«å¯¾ãã¦ã¯ï¼ãã®ãã¯ããfalseãè¿ãããã«ããï¼ 1595 intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に 1596 true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/ 1597 クリアできないintnoに対しては,このマクロがfalseを返すようにする. 1943 1598 1944 1599 (6-4-2-2) bool_t x_disable_int(INTNO intno) … … 1946 1601 (6-4-2-4) bool_t i_disable_int(INTNO intno) 1947 1602 1948 intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ããå²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ãã»ãããï¼ 1949 trueãè¿ãé¢æ°ï¼æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ãã¦ï¼å²è¾¼ã¿å±æ§ãè¨å®ã 1950 ãã¦ããªãå ´åã«ã¯ï¼falseãè¿ãï¼ 1951 1952 ãããã®é¢æ°ã¯ï¼ã¿ã¼ã²ããéä¾åé¨ãCPUããã¯è§£é¤ç¶æ 1953 ã§å¼ã³åºããã¨ã¯ãª 1954 ãããï¼CPUããã¯è§£é¤ç¶æ 1955 ã§å¼ã³åºãããå ´åã®åä½ã¯ä¿è¨¼ããå¿ 1956 è¦ããªãï¼ 1957 ãã ãï¼ã¿ã¼ã²ããä¾åé¨ããCPUããã¯è§£é¤ç¶æ 1958 ã§å¼ã³åºãå ´åã«ã¯ï¼ä¿è¨¼ã 1959 ãå¿ 1960 è¦ãããï¼ 1961 1962 ã¾ãï¼ãããã®é¢æ°ã¯ï¼VALID_INTNO_DISINT(intno)ãtrueã¨ãªãintnoã«å¯¾ã 1963 ã¦ã®ã¿å¼ã°ããï¼intnoã«ããã§ãªãå¤ã渡ãããå ´åã®åä½ã¯ä¿è¨¼ããå¿ 1964 è¦ã 1965 ãªãï¼ 1966 1967 dis_intãµã¼ãã¹ã³ã¼ã«ããµãã¼ãããå ´åï¼TOPPERS_SUPPORT_DIS_INTãã㯠1968 ãå®ç¾©ããå ´åï¼ã«ã¯ï¼t_disable_intãç¨æããã¦ããªããã°ãªããªãï¼ 1603 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし, 1604 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ 1605 れていない場合には,falseを返す. 1606 1607 これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな 1608 いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない. 1609 ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す 1610 る必要がある. 1611 1612 また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し 1613 てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が 1614 ない. 1615 1616 dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク 1617 ロ定義する場合)には,t_disable_intが用意されていなければならない. 1969 1618 1970 1619 (6-4-2-5) bool_t x_enable_int(INTNO intno) … … 1972 1621 (6-4-2-7) bool_t i_enable_int(INTNO intno) 1973 1622 1974 intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ããå²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ãã¯ãªã¢ãï¼ 1975 trueãè¿ãé¢æ°ï¼æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ãã¦ï¼å²è¾¼ã¿å±æ§ãè¨å®ã 1976 ãã¦ããªãå ´åã«ã¯ï¼falseãè¿ãï¼ 1977 1978 ãããã®é¢æ°ã¯ï¼ã¿ã¼ã²ããéä¾åé¨ãCPUããã¯è§£é¤ç¶æ 1979 ã§å¼ã³åºããã¨ã¯ãª 1980 ãããï¼CPUããã¯è§£é¤ç¶æ 1981 ã§å¼ã³åºãããå ´åã®åä½ã¯ä¿è¨¼ããå¿ 1982 è¦ããªãï¼ 1983 ãã ãï¼ã¿ã¼ã²ããä¾åé¨ããCPUããã¯è§£é¤ç¶æ 1984 ã§å¼ã³åºãå ´åã«ã¯ï¼ä¿è¨¼ã 1985 ãå¿ 1986 è¦ãããï¼ 1987 1988 ã¾ãï¼ãããã®é¢æ°ã¯ï¼VALID_INTNO_DISINT(intno)ãtrueã¨ãªãintnoã«å¯¾ã 1989 ã¦ã®ã¿å¼ã°ããï¼intnoã«ããã§ãªãå¤ã渡ãããå ´åã®åä½ã¯ä¿è¨¼ããå¿ 1990 è¦ã 1991 ãªãï¼ 1992 1993 ena_intãµã¼ãã¹ã³ã¼ã«ããµãã¼ãããå ´åï¼TOPPERS_SUPPORT_ENA_INTãã㯠1994 ãå®ç¾©ããå ´åï¼ã«ã¯ï¼t_enable_intãç¨æããã¦ããªããã°ãªããªãï¼ 1995 1996 6.4.3 å²è¾¼ã¿è¦æ±ã®ã¯ãªã¢ 1623 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし, 1624 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ 1625 れていない場合には,falseを返す. 1626 1627 これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな 1628 いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない. 1629 ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す 1630 る必要がある. 1631 1632 また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し 1633 てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が 1634 ない. 1635 1636 ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク 1637 ロ定義する場合)には,t_enable_intが用意されていなければならない. 1638 1639 6.4.3 割込み要求のクリア 1997 1640 1998 1641 (6-4-3-1) void x_clear_int(INTNO intno) … … 2000 1643 (6-4-3-3) void i_clear_int(INTNO intno) 2001 1644 2002 intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ãã¨ãã¸ããªã¬ã§ããå ´åã«ï¼ããªã¬ãã 2003 ãå²è¾¼ã¿è¦æ±ãã¯ãªã¢ããé¢æ°ï¼intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ãã¬ãã« 2004 ããªã¬ã§ããå ´åã«ã¯ä½ãããªãï¼ 2005 2006 ASPã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ã¯ï¼ãããã®é¢æ°ãå¼ã³åºãã¦ããªããï¼ 2007 ã¿ã¼ã²ããä¾åé¨ãã·ã¹ãã ãµã¼ãã¹ã§å¼ã³åºãå¯è½æ§ãé«ãããï¼ç¨æãã 2008 ãã¨ã¨ãã¦ããï¼ãã®ããï¼ãããã®é¢æ°ãã©ã®ãããªã·ã¹ãã ç¶æ 2009 ã§å¼ã³åº 2010 ãããã¯ï¼ã¿ã¼ã²ããä¾åé¨å 2011 ã§ä¸è²«ãã¦ããã°ããï¼ 2012 2013 6.4.4 å²è¾¼ã¿è¦æ±ã®ããã¼ã 1645 intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ 1646 た割込み要求をクリアする関数.intnoで指定された割込み要求ラインがレベル 1647 トリガである場合には何もしない. 1648 1649 ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが, 1650 ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する 1651 こととしている.そのため,これらの関数がどのようなシステム状態で呼び出 1652 せるかは,ターゲット依存部内で一貫していればよい. 1653 1654 6.4.4 割込み要求のプローブ 2014 1655 2015 1656 (6-4-4-1) bool_t x_probe_int(INTNO intno) … … 2017 1658 (6-4-4-3) bool_t i_probe_int(INTNO intno) 2018 1659 2019 intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ãã¦ï¼å²è¾¼ã¿ãè¦æ±ããã¦ããå ´åã« 2020 trueï¼ããã§ãªãå ´åã«falseãè¿ãé¢æ°ï¼ 2021 2022 ASPã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ã¯ï¼ãããã®é¢æ°ãå¼ã³åºãã¦ããªããï¼ 2023 ã¿ã¼ã²ããä¾åé¨ãã·ã¹ãã ãµã¼ãã¹ã§å¼ã³åºãå¯è½æ§ãé«ãããï¼ç¨æãã 2024 ãã¨ã¨ãã¦ããï¼ãã®ããï¼ãããã®é¢æ°ãã©ã®ãããªã·ã¹ãã ç¶æ 2025 ã§å¼ã³åº 2026 ãããã¯ï¼ã¿ã¼ã²ããä¾åé¨å 2027 ã§ä¸è²«ãã¦ããã°ããï¼ 2028 2029 6.4.5 å²è¾¼ã¿ãã³ãã©ã®å 2030 é å¦çã¨æ«å°¾å¦ç 1660 intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に 1661 true,そうでない場合にfalseを返す関数. 1662 1663 ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが, 1664 ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する 1665 こととしている.そのため,これらの関数がどのようなシステム状態で呼び出 1666 せるかは,ターゲット依存部内で一貫していればよい. 1667 1668 6.4.5 割込みハンドラの先頭処理と末尾処理 2031 1669 2032 1670 (6-4-5-1) void i_begin_int(INTNO intno) 2033 1671 2034 intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ããå²è¾¼ã¿ãã³ãã©ã®å 2035 é ã§è¡ãã¹ã 2036 å¦çãè¡ãé¢æ°ï¼ããã§è¡ãã¹ãå¦çã¨ãã¦ã¯ï¼å²è¾¼ã¿è¦æ±ã©ã¤ã³ãã¨ãã¸ã 2037 ãªã¬ã§ããå ´åã®ããªã¬ãããå²è¾¼ã¿è¦æ±ã®ã¯ãªã¢ãæããããï¼ 2038 2039 intnoã«å¯¾ãã¦ç»é²ãããå²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ãå¼ã³åºãå²è¾¼ã¿ãã³ãã©ã® 2040 å 2041 é ã§å¼ã³åºãããï¼ãã®ãããã®é¢æ°ã¯ï¼å²è¾¼ã¿ãã³ãã©ã®å 2042 é ï¼é常㯠2043 CPUããã¯è§£é¤ç¶æ 2044 ï¼ã§å¼ã³åºããããã«å®è£ 2045 ããªããã°ãªããªãï¼ 1672 intnoで指定された割込み要求ラインに対する割込みハンドラの先頭で行うべき 1673 処理を行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト 1674 リガである場合のトリガされた割込み要求のクリアが挙げられる. 1675 1676 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの 1677 先頭で呼び出される.そのためこの関数は,割込みハンドラの先頭(通常は 1678 CPUロック解除状態)で呼び出せるように実装しなければならない. 2046 1679 2047 1680 (6-4-5-2) void i_end_int(INTNO intno) 2048 1681 2049 intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ããå²è¾¼ã¿ãã³ãã©ã®æ«å°¾ã§è¡ãã¹ã 2050 å¦çãè¡ãé¢æ°ï¼ããã§è¡ãã¹ãå¦çã¨ãã¦ã¯ï¼å²è¾¼ã¿ã³ã³ããã¼ã©ï¼IRCï¼ã« 2051 対ããå²è¾¼ã¿å¦çã®çµäºéç¥ãæããããï¼ 2052 2053 intnoã«å¯¾ãã¦ç»é²ãããå²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ãå¼ã³åºãå²è¾¼ã¿ãã³ãã©ã® 2054 æ«å°¾ã§å¼ã³åºãããï¼ãã®ãããã®é¢æ°ã¯ï¼å²è¾¼ã¿ãã³ãã©ã®æ«å°¾ï¼é常㯠2055 CPUããã¯è§£é¤ç¶æ 2056 ï¼ã§å¼ã³åºããããã«å®è£ 2057 ããªããã°ãªããªãï¼ 2058 2059 ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼IRCã«å¯¾ããå²è¾¼ã¿å¦çã®çµäºéç¥ãè¡ãåã«ï¼ãã¹ã¦ 2060 ã®å²è¾¼ã¿ãç¦æ¢ããªããã°ãªããªãå ´åãããï¼ãã®å ´åã«ã¯ï¼ãã®é¢æ°ã®ä¸ 2061 ã§å²è¾¼ã¿ãç¦æ¢ãï¼ãã®ç¶æ 2062 ã®ã¾ã¾ï¼å²è¾¼ã¿ãã³ãã©ãããªã¿ã¼ã³ããï¼å²è¾¼ 2063 ã¿ãã³ãã©ããã®ãªã¿ã¼ã³åã«ã¯ï¼å²è¾¼ã¿ç¦æ¢ã解é¤ããã®ãååã§ãããï¼ 2064 å²è¾¼ã¿ãã³ãã©ã®åºå£å¦çã§å 2065 ã«æ»ãå¦çãè¡ãã®ã§å·®ãæ¯ããªãã¯ãã§ããï¼ 2066 å²è¾¼ã¿ãã³ãã©ã®åºå£å¦çãï¼ããã§å·®ãæ¯ããªãå®è£ 2067 ã«ãªã£ã¦ãããã¨ã確 2068 èªããã¹ãã§ããï¼ 2069 2070 6.5 ã¿ã¹ã¯ãã£ã¹ããã㣠2071 2072 6.5.1 ã¿ã¹ã¯ã³ã³ããã¹ããããã¯ã¨ã¿ã¹ã¯åæåã³ã³ããã¹ãããã㯠1682 intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき 1683 処理を行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に 1684 対する割込み処理の終了通知が挙げられる. 1685 1686 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの 1687 末尾で呼び出される.そのためこの関数は,割込みハンドラの末尾(通常は 1688 CPUロック解除状態)で呼び出せるように実装しなければならない. 1689 1690 ターゲットによっては,IRCに対する割込み処理の終了通知を行う前に,すべて 1691 の割込みを禁止しなければならない場合がある.この場合には,この関数の中 1692 で割込みを禁止し,その状態のまま,割込みハンドラからリターンする.割込 1693 みハンドラからのリターン前には,割込み禁止を解除するのが原則であるが, 1694 割込みハンドラの出口処理で元に戻す処理を行うので差し支えないはずである. 1695 割込みハンドラの出口処理が,これで差し支えない実装になっていることを確 1696 認するべきである. 1697 1698 6.5 タスクディスパッチャ 1699 1700 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック 2073 1701 2074 1702 (6-5-1-1) TSKCTXB 2075 1703 2076 ã¿ã¼ã²ããä¾åã®ã¿ã¹ã¯ã³ã³ããã¹ããä¿åããããã«ï¼TCBä¸ã«æã¤ãã¨ãå¿ 2077 2078 è¦ãªãã¼ã¿æ§é ã®åãï¼TSKCTXBã«å®ç¾©ããï¼æ¨æºçã«ã¯ï¼TSKCTXBã«ã¯ï¼ã¿ã¹ 2079 ã¯ã®ã¹ã¿ãã¯ãã¤ã³ã¿ã¨å®è¡åéçªå°ãæ ¼ç´ããï¼ 2080 2081 (6-5-1-2) USE_TSKINICTXBï¼ãªãã·ã§ã³ï¼ 2082 (6-5-1-3) TSKINICTXBï¼ãªãã·ã§ã³ï¼ 2083 2084 ã¿ã¼ã²ããä¾åã®æ 2085 å ±ãã¿ã¹ã¯åæåãããã¯ï¼TINIBï¼ã«å 2086 ¥ãããå ´åãï¼ 2087 TINIBä¸ã®ã¹ã¿ãã¯é åã®ãµã¤ãºã¨å 2088 é çªå°ã®æã¡æ¹ãã¿ã¼ã²ããä¾åã«å¤æ´ã 2089 ããå ´åã«ã¯ï¼USE_TSKINICTXBããã¯ãå®ç¾©ãï¼TINIBä¸ã«æã¤ãã¨ãå¿ 2090 è¦ãªãã¼ 2091 ã¿æ§é ã®åãï¼TSKINICTXBã«å®ç¾©ããï¼ 2092 2093 USE_TSKINICTXBããã¯ãå®ç¾©ããã¨ï¼TINIBä¸ã«ã¹ã¿ãã¯é åã¨ãµã¤ãºã¨å 2094 é çª 2095 å°ãå«ã¾ããªããªãããï¼ããã«ä»£ããæ 2096 å ±ãTSKINICTXBä¸ã«æã¤å¿ 2097 è¦ãããï¼ 2098 ã¾ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾å 2099 é¨ã§ï¼TSKINICTXBã®åæåæ 2100 å ±ãçæããããã®GENERATE_TSKINICTXBãï¼ãã¹ 2101 3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ï¼TINIBããã¹ã¿ãã¯é åã® 2102 å 2103 é çªå°ãåãåºãããã®GET_STK_TSKINICTXBãå®ç¾©ããå¿ 2104 è¦ãããï¼ 2105 2106 6.5.2 ãã£ã¹ãããã£æ¬ä½ 2107 2108 ãã£ã¹ãããã£æ¬ä½ï¼dispatcherï¼ã¯ï¼ã¿ã¼ã²ããéä¾åé¨ããç´æ¥å¼ã³åºã 2109 ãããã¨ã¯ãªãï¼ã«ã¼ãã«ã®ã¿ã¼ã²ããä¾åé¨ã®å 2110 é¨ããã®ã¿å¼ã³åºãããï¼ 2111 dispatcherã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 2112 ã»å²è¾¼ã¿åªå 2113 度ãã¹ã¯å 2114 ¨è§£ 2115 é¤ç¶æ 2116 ã»ãã£ã¹ããã許å¯ç¶æ 2117 ã§å¼ã³åºãããï¼ 2118 2119 dispatcherã®å¦çå 2120 容ã¯æ¬¡ã®éãï¼ 1704 ターゲット依存のタスクコンテキストを保存するために,TCB中に持つことが必 1705 要なデータ構造の型を,TSKCTXBに定義する.標準的には,TSKCTXBには,タス 1706 クのスタックポインタと実行再開番地を格納する. 1707 1708 (6-5-1-2) USE_TSKINICTXB(オプション) 1709 (6-5-1-3) TSKINICTXB(オプション) 1710 1711 ターゲット依存の情報をタスク初期化ブロック(TINIB)に入れたい場合や, 1712 TINIB中のスタック領域のサイズと先頭番地の持ち方をターゲット依存に変更し 1713 たい場合には,USE_TSKINICTXBをマクロ定義し,TINIB中に持つことが必要なデー 1714 タ構造の型を,TSKINICTXBに定義する. 1715 1716 USE_TSKINICTXBをマクロ定義すると,TINIB中にスタック領域とサイズと先頭番 1717 地が含まれなくなるため,それに代わる情報をTSKINICTXB中に持つ必要がある. 1718 また,コンフィギュレータのパス2のテンプレートファイルのターゲット非依存 1719 部で,TSKINICTXBの初期化情報を生成するためのGENERATE_TSKINICTXBを,パス 1720 3のテンプレートファイルのターゲット非依存部で,TINIBからスタック領域の 1721 先頭番地を取り出すためのGET_STK_TSKINICTXBを定義する必要がある. 1722 1723 6.5.2 ディスパッチャ本体 1724 1725 ディスパッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ 1726 れることはなく,カーネルのターゲット依存部の内部からのみ呼び出される. 1727 dispatcherは,タスクコンテキスト・CPUロック状態・割込み優先度マスク全解 1728 除状態・ディスパッチ許可状態で呼び出される. 1729 1730 dispatcherの処理内容は次の通り. 2121 1731 2122 1732 ---------------------------------------- … … 2129 1739 dispatcher_0: 2130 1740 while ((p_runtsk = p_schedtsk) == NULL) { 2131 å²è¾¼ã¿ã許å¯ãããCPUããã¯è§£é¤ç¶æ 2132 ã«ãªãããæºåãã 2133 éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã ⦠(*1) 1741 割込みを許可したらCPUロック解除状態になるよう準備する 1742 非タスクコンテキストに切り換える … (*1) 2134 1743 do { 2135 å²è¾¼ã¿ããã¹ã¦è¨±å¯ãï¼å²è¾¼ã¿çºçãå¾ 2136 㤠⦠(*2) 2137 å²è¾¼ã¿è¨±å¯åã®ç¶æ 2138 ã«æ»ãï¼ï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããï¼ 1744 割込みをすべて許可し,割込み発生を待つ … (*2) 1745 割込み許可前の状態に戻す(=カーネル管理の割込みを禁止する) 2139 1746 } while (!reqflg); 2140 1747 reqflg = false; 2141 ã¿ã¹ã¯ã³ã³ããã¹ãã«æ»ã ⦠(*1) 2142 CPUããã¯ç¶æ 2143 ã«æ»ã ... (*3) 1748 タスクコンテキストに戻す … (*1) 1749 CPUロック状態に戻す ... (*3) 2144 1750 } 2145 èªã¿ã¹ã¯ï¼p_runtskï¼ã®TCBããã¹ã¿ãã¯ãã¤ã³ã¿ã復帰ãã1751 自タスク(p_runtsk)のTCBからスタックポインタを復帰する 2146 1752 #ifdef LOG_DSP_LEAVE 2147 1753 log_dsp_leave(p_runtsk); 2148 1754 #endif /* LOG_DSP_LEAVE */ 2149 èªã¿ã¹ã¯ã®TCBããå®è¡åéçªå°ã復帰ãï¼ããã¸åå²ãã â¦(*a)1755 自タスクのTCBから実行再開番地を復帰し,そこへ分岐する … (*a) 2150 1756 } 2151 1757 ---------------------------------------- 2152 1758 2153 å²è¾¼ã¿çºçãå¾ 2154 ã¤éã«éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæããã®ã¯ï¼ãã®éã«å®è¡ 2155 ãããå²è¾¼ã¿ãã³ãã©å 2156 ã§ï¼ã¿ã¹ã¯ãã£ã¹ããããããªãããã«ããããã§ã 2157 ãï¼ãã®æï¼å²è¾¼ã¿ãã³ãã©ãï¼éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã使ãã 2158 ãã«ããªããã°ãªããªãï¼é常ã¯ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæããéã«é 2159 ã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæãï¼ã¿ã¹ã¯ã³ã³ããã¹ãã«æ»ãéã« 2160 å 2161 ã®ã¹ã¿ãã¯ã«åãæããï¼ 2162 2163 ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼ç¹ã«ï¼ã·ãã¥ã¬ã¼ã·ã§ã³ç°å¢ã®å ´åï¼ï¼å¼·å¶çã«éã¿ 2164 ã¹ã¯ã³ã³ããã¹ãã«åãæãããã¨ãé£ããå ´åãããï¼ãã®å ´åã«ã¯ï¼ãã® 2165 éã«å®è¡ãããå²è¾¼ã¿ãã³ãã©å 2166 ã§ã¿ã¹ã¯ãã£ã¹ããããããªããããªä»çµã¿ 2167 ãå®è£ 2168 ãããã¨ã§ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã¸ã®åæããçç¥ãããã¨ãã§ããï¼ 2169 2170 (*1)ã®éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæããå¦çã¨ã¿ã¹ã¯ã³ã³ããã¹ãã«æ»ãå¦ 2171 çã¯ï¼doã«ã¼ãã®ä¸ã§è¡ã£ã¦ãããï¼ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼å²è¾¼ã¿ã®è¨±å¯ï¼ 2172 ç¦æ¢ã¨ã¾ã¨ãã¦å¦çããæ¹ãå¹çãè¯ãï¼ï¼ 2173 2174 (*2)ã«ããã¦ï¼å²è¾¼ã¿ã許å¯ããå¦çã¨ï¼å²è¾¼ã¿çºçãå¾ 2175 ã¤å¦çã¨ã¯ï¼ä¸å¯å 2176 ã«è¡ãªãå¿ 2177 è¦ãããï¼ãããä¸å¯åã«è¡ãªããªãå ´åï¼å²è¾¼ã¿ã許å¯ããç´å¾ 2178 ã«å²è¾¼ã¿ãå 2179 ¥ãï¼ãã®ä¸ã§ã¿ã¹ã¯ãå®è¡å¯è½ç¶æ 2180 ã«ãªãã¨ï¼å®è¡ãã¹ãã¿ã¹ã¯ 2181 ãããã«ããããããããã»ããµãå²è¾¼ã¿å¾ 2182 ã¡ã«ãªã£ã¦ãã¾ãï¼ 2183 2184 ã¾ãï¼(*2)ã«ããã¦ï¼å²è¾¼ã¿çºçãå¾ 2185 ã¤å½ä»¤ãç¨æããã¦ããªãå ´åãï¼ãã 2186 ãçºè¡ããã®ãä¸é½åãªå ´åã«ã¯ï¼å²è¾¼ã¿ããã¹ã¦è¨±å¯ãã¦å²è¾¼ã¿ãåãä»ã 2187 ãããç¶æ 2188 ã«ãªã£ãå¾ã«ï¼å²è¾¼ã¿çºçãå¾ 2189 ããã«æ¬¡ã«é²ãã§ãããï¼ãã®å ´åï¼ 2190 ãã®å¤å´ã®doã«ã¼ãã«ãã£ã¦ï¼å²è¾¼ã¿çºçãå¾ 2191 ã¤ãã¨ã«ãªãï¼ 2192 2193 CPUããã¯ã解é¤ããããã®æ 2194 å ±ï¼ä¾ãã°ï¼CPUããã¯åã®å²è¾¼ã¿åªå 2195 度ãã¹ã¯ï¼ 2196 ãå¤æ°ã«ä¿æãã¦ããå ´åã«ã¯ï¼(*3)ã§CPUããã¯ç¶æ 2197 ã«æ»ãéã«ï¼ãã®å¤æ°ã® 2198 å¤ãå 2199 ã«æ»ã£ã¦ããå¿ 2200 è¦ãããï¼ç¹ã«ï¼ãã®å¤æ°ãï¼å²è¾¼ã¿å¾ 2201 ã¡ã®éã«å®è¡ã 2202 ãå²è¾¼ã¿ãã³ãã©å 2203 ã§æ¸ãæããããå ´åã¯ï¼å 2204 ã®å¤ã«æ»ããã¨ãå¿ 2205 è¦ã§ããï¼ 2206 2207 å²è¾¼ã¿å¾ 2208 ã¡ã®éã¯ï¼p_runtskãNULLï¼ï¼0ï¼ã«è¨å®ããªããã°ãªããªãï¼ä¸ã®å¦ 2209 çå 2210 容ããã®ã¾ã¾å®è£ 2211 ããã°ãããªãï¼ï¼ãã®ããã«è¨å®ããªãã¨ï¼å²è¾¼ã¿ã 2212 ã³ãã©ããiget_tidãå¼ã³åºããéã®åä½ãä»æ§ã«åè´ããªããªãï¼ 2213 2214 dispatcherãã¢ã»ã³ããªè¨èªã§è¨è¿°ããå ´åã«ã¯ï¼ãã¬ã¼ã¹ãã°åå¾å¦çã¯ï¼ 2215 ã6.2 ãã¬ã¼ã¹ãã°æ©è½ã¸ã®å¯¾å¿ãã®ç¯ã§è¨è¿°ããæ¹æ³ã§ã³ã¼ãã£ã³ã°ããã 2216 ã¨ï¼ãªãï¼log_dsp_enterã¯åæãåã®ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã§ï¼log_dsp_leave 㯠2217 åæãå¾ã®ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã§å®è¡ããï¼ 2218 2219 6.5.3 ã¿ã¹ã¯ã³ã³ããã¹ãããã®ãã£ã¹ããã 1759 割込み発生を待つ間に非タスクコンテキストに切り換えるのは,この間に実行 1760 される割込みハンドラ内で,タスクディスパッチをしないようにするためであ 1761 る.この時,割込みハンドラが,非タスクコンテキスト用のスタックを使うよ 1762 うにしなければならない.通常は,非タスクコンテキストに切り換える際に非 1763 タスクコンテキスト用のスタックに切り換え,タスクコンテキストに戻す際に 1764 元のスタックに切り換える. 1765 1766 ターゲットによっては(特に,シミュレーション環境の場合),強制的に非タ 1767 スクコンテキストに切り換えることが難しい場合がある.その場合には,この 1768 間に実行される割込みハンドラ内でタスクディスパッチをしないような仕組み 1769 を実装することで,非タスクコンテキストへの切換えを省略することができる. 1770 1771 (*1)の非タスクコンテキストに切り換える処理とタスクコンテキストに戻す処 1772 理は,doループの中で行ってもよい(ターゲットによっては,割込みの許可/ 1773 禁止とまとめて処理した方が効率が良い). 1774 1775 (*2)において,割込みを許可する処理と,割込み発生を待つ処理とは,不可分 1776 に行なう必要がある.これを不可分に行なわない場合,割込みを許可した直後 1777 に割込みが入り,その中でタスクが実行可能状態になると,実行すべきタスク 1778 があるにもかかわらずプロセッサが割込み待ちになってしまう. 1779 1780 また,(*2)において,割込み発生を待つ命令が用意されていない場合や,それ 1781 を発行するのが不都合な場合には,割込みをすべて許可して割込みを受け付け 1782 られる状態になった後に,割込み発生を待たずに次に進んでもよい.この場合, 1783 その外側のdoループによって,割込み発生を待つことになる. 1784 1785 CPUロックを解除するための情報(例えば,CPUロック前の割込み優先度マスク) 1786 を変数に保持している場合には,(*3)でCPUロック状態に戻す際に,その変数の 1787 値も元に戻っている必要がある.特に,その変数が,割込み待ちの間に実行し 1788 た割込みハンドラ内で書き換えられる場合は,元の値に戻すことが必要である. 1789 1790 割込み待ちの間は,p_runtskをNULL(=0)に設定しなければならない(上の処 1791 理内容をそのまま実装すればこうなる).このように設定しないと,割込みハ 1792 ンドラからiget_tidを呼び出した際の動作が仕様に合致しなくなる. 1793 1794 dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は, 1795 「6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ 1796 と.なお,log_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave は 1797 切換え後のタスクのスタックで実行する. 1798 1799 6.5.3 タスクコンテキストからのディスパッチ 2220 1800 2221 1801 (6-5-3-1) void dispatch(void) 2222 (6-5-3-2) OMIT_CALLTEXï¼ãªãã·ã§ã³ï¼ 2223 2224 ã¿ã¹ã¯ã³ã³ããã¹ãããã®ãã£ã¹ãããï¼dispatchï¼ã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ã 2225 ç¨ã®ãµã¼ãã¹ã³ã¼ã«å¦çã«ããã¦ã¿ã¹ã¯åæããå¿ 2226 è¦ã«ãªã£ãå ´åã«ï¼ã¿ã¼ã²ã 2227 ãéä¾åé¨ã®ãµã¼ãã¹ã³ã¼ã«å¦çé¢æ°ããå¼ã³åºãããï¼ 2228 2229 dispatchã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 2230 ã»å²è¾¼ã¿åªå 2231 度ãã¹ã¯å 2232 ¨è§£é¤ 2233 ç¶æ 2234 ã»ãã£ã¹ããã許å¯ç¶æ 2235 ã§å¼ã³åºãããï¼ 2236 2237 dispatchã®å¦çå 2238 容ã¯æ¬¡ã®éãï¼ 1802 (6-5-3-2) OMIT_CALLTEX(オプション) 1803 1804 タスクコンテキストからのディスパッチ(dispatch)は,タスクコンテキスト 1805 用のサービスコール処理においてタスク切換えが必要になった場合に,ターゲッ 1806 ト非依存部のサービスコール処理関数から呼び出される. 1807 1808 dispatchは,タスクコンテキスト・CPUロック状態・割込み優先度マスク全解除 1809 状態・ディスパッチ許可状態で呼び出される. 1810 1811 dispatchの処理内容は次の通り. 2239 1812 2240 1813 ---------------------------------------- … … 2243 1816 { 2244 1817 #ifdef TOPPERS_SUPPORT_OVRHDR 2245 ovrtimer_stop(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åæ¢*/1818 ovrtimer_stop(); /* オーバランタイマの停止 */ 2246 1819 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2247 ã¹ã¯ã©ããã¬ã¸ã¹ã¿(*)ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã2248 ã¹ã¿ãã¯ãã¤ã³ã¿ãèªã¿ã¹ã¯ï¼p_runtskï¼ã®TCBã«ä¿åãã2249 dispatch_r ãï¼å®è¡åéçªå°ã¨ãã¦èªã¿ã¹ã¯ã®TCBã«ä¿åãã â¦(*a)2250 dispatcher ã«åå²ãã1820 スクラッチレジスタ(*)を除くすべてのレジスタをスタックに保存する 1821 スタックポインタを自タスク(p_runtsk)のTCBに保存する 1822 dispatch_rを,実行再開番地として自タスクのTCBに保存する … (*a) 1823 dispatcherに分岐する 2251 1824 2252 1825 dispatch_r: 2253 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã1826 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する 2254 1827 #ifdef TOPPERS_SUPPORT_OVRHDR 2255 ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§*/1828 ovrtimer_start(); /* オーバランタイマの動作開始 */ 2256 1829 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2257 calltex(); â¦(*b)1830 calltex(); … (*b) 2258 1831 } 2259 1832 ---------------------------------------- 2260 1833 2261 ããã§ã¹ã¯ã©ããã¬ã¸ã¹ã¿(*)ã¨ã¯ï¼é¢æ°å¼åºãã«ããä¿åãããªãã¬ã¸ã¹ã¿ã® 2262 ãã¨ã§ããï¼å¿ 2263 è¦ãªå ´åã«ã¯ï¼é¢æ°ãå¼ã³åºãå´ã§ä¿åããªããã°ãªããªãã 2264 ãï¼caller saved registerã¨å¼ã°ããå ´åãããï¼ 2265 2266 dispatchãå¼ã³åºããã¿ã¹ã¯ã次ã«å®è¡ãããæã«ã¯ï¼å®è¡åéçªå°ã¨ãã¦ç» 2267 é²ããdispatch_rã«æ»ã£ã¦ããï¼dispatch_rã«ã¯ï¼dispatcherã®ã¿ããåå²ãï¼ 2268 ãã®æã®ç¶æ 2269 ã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 2270 ã»å²è¾¼ã¿åªå 2271 度ãã¹ã¯å 2272 ¨ 2273 解é¤ç¶æ 2274 ã»ãã£ã¹ããã許å¯ç¶æ 2275 ã§ããï¼ 2276 2277 (*b)ã§calltexãå¼ã¶ä»£ããã«ï¼calltexã®å¦çå 2278 容ï¼p_runtsk->enatexãtrue 2279 ã§ï¼p_runtsk->texptnã0ã§ãªãï¼ipmflgãtrueã®å ´åã«ï¼call_texrtnãå¼ã¶ï¼ 2280 ãããã«ã¤ã³ã©ã¤ã³å±éããæ¹ãå¹çãããï¼ã¿ã¼ã²ããéä¾åé¨ã®calltexã 2281 使ããªãå ´åã«ã¯ï¼OMIT_CALLTEXããã¯ãå®ç¾©ãããã¨ã§ï¼ã¿ã¼ã²ããéä¾å 2282 é¨ããcalltexãåãé¤ããã¨ãã§ããï¼ 2283 2284 6.5.4 ãã£ã¹ãããã£ã®åä½éå§ 1834 ここでスクラッチレジスタ(*)とは,関数呼出しにより保存されないレジスタの 1835 ことである.必要な場合には,関数を呼び出す側で保存しなければならないた 1836 め,caller saved registerと呼ばれる場合もある. 1837 1838 dispatchを呼び出したタスクが次に実行される時には,実行再開番地として登 1839 録したdispatch_rに戻ってくる.dispatch_rには,dispatcherのみから分岐し, 1840 その時の状態は,タスクコンテキスト・CPUロック状態・割込み優先度マスク全 1841 解除状態・ディスパッチ許可状態である. 1842 1843 (*b)でcalltexを呼ぶ代わりに,calltexの処理内容(p_runtsk->enatexがtrue 1844 で,p_runtsk->texptnが0でなく,ipmflgがtrueの場合に,call_texrtnを呼ぶ) 1845 をここにインライン展開した方が効率がよい.ターゲット非依存部のcalltexを 1846 使わない場合には,OMIT_CALLTEXをマクロ定義することで,ターゲット非依存 1847 部からcalltexを取り除くことができる. 1848 1849 6.5.4 ディスパッチャの動作開始 2285 1850 2286 1851 (6-5-4-1) void start_dispatch(void) 2287 1852 2288 ãã£ã¹ãããã£ã®åä½éå§ï¼start_dispatchï¼ã¯ï¼ã«ã¼ãã«èµ·åæã«ï¼ã«ã¼ã 2289 ã«ã®åæåå¦çããå¼ã³åºãããï¼start_dispatchã¯ï¼ãªã¿ã¼ã³ãããã¨ã®ãª 2290 ãé¢æ°ã§ããï¼ 2291 2292 start_dispatchã¯ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã§ï¼NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ 2293 ã¯ããç¶æ 2294 ï¼å 2295 ¨å²è¾¼ã¿ããã¯ç¶æ 2296 ã¨åçã®ç¶æ 2297 ï¼ã§å¼ã³åºãããï¼start_dispatch 2298 å 2299 ã§ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãï¼CPUããã¯ç¶æ 2300 ã»å²è¾¼ã¿åªå 2301 度ãã¹ã¯å 2302 ¨ 2303 解é¤ç¶æ 2304 ã«ããªããã°ãªããªãï¼ 2305 2306 start_dispatchã®å¦çå 2307 容ã¯æ¬¡ã®éãï¼ 1853 ディスパッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ 1854 ルの初期化処理から呼び出される.start_dispatchは,リターンすることのな 1855 い関数である. 1856 1857 start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス 1858 クした状態(全割込みロック状態と同等の状態)で呼び出される.start_dispatch 1859 内で,タスクコンテキストに切り換え,CPUロック状態・割込み優先度マスク全 1860 解除状態にしなければならない. 1861 1862 start_dispatchの処理内容は次の通り. 2308 1863 2309 1864 ---------------------------------------- … … 2311 1866 start_dispatch(void) 2312 1867 { 2313 ã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã 2314 CPUããã¯ç¶æ 2315 ã»å²è¾¼ã¿åªå 2316 度ãã¹ã¯å 2317 ¨è§£é¤ç¶æ 2318 ã«ãã 2319 dispatcher_0ã«åå²ãã 1868 タスクコンテキストに切り換える 1869 CPUロック状態・割込み優先度マスク全解除状態にする 1870 dispatcher_0に分岐する 2320 1871 } 2321 1872 ---------------------------------------- 2322 1873 2323 6.5.5 ç¾å¨ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã£ã¹ããã1874 6.5.5 現在のコンテキストを捨ててディスパッチ 2324 1875 2325 1876 (6-5-5-1) void exit_and_dispatch(void) 2326 1877 2327 ç¾å¨ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã£ã¹ãããï¼exit_and_dispatchï¼ã¯ï¼èªã¿ã¹ã¯ 2328 ãçµäºããããµã¼ãã¹ã³ã¼ã«å¦çé¢æ°ããå¼ã³åºãããï¼exit_and_dispatchã¯ï¼ 2329 ãªã¿ã¼ã³ãããã¨ã®ãªãé¢æ°ã§ããï¼ 2330 2331 exit_and_dispatchã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 2332 ã»å²è¾¼ã¿åªå 2333 度ã 2334 ã¹ã¯å 2335 ¨è§£é¤ç¶æ 2336 ã»ãã£ã¹ããã許å¯ç¶æ 2337 ã§å¼ã³åºãããï¼ 2338 2339 exit_and_dispatchã®å¦çå 2340 容ã¯æ¬¡ã®éãï¼ 1878 現在のコンテキストを捨ててディスパッチ(exit_and_dispatch)は,自タスク 1879 を終了させるサービスコール処理関数から呼び出される.exit_and_dispatchは, 1880 リターンすることのない関数である. 1881 1882 exit_and_dispatchは,タスクコンテキスト・CPUロック状態・割込み優先度マ 1883 スク全解除状態・ディスパッチ許可状態で呼び出される. 1884 1885 exit_and_dispatchの処理内容は次の通り. 2341 1886 2342 1887 ---------------------------------------- … … 2344 1889 exit_and_dispatch(void) 2345 1890 { 2346 dispatcher ã«åå²ãã1891 dispatcherに分岐する 2347 1892 } 2348 1893 ---------------------------------------- 2349 1894 2350 6.5.6 ã¿ã¹ã¯ã®èµ·åå¦ç1895 6.5.6 タスクの起動処理 2351 1896 2352 1897 (6-5-6-1) void activate_context(TCB *p_tcb) 2353 1898 2354 ã¿ã¹ã¯ã®èµ·åå¦çï¼activate_contextï¼ã¯ï¼ã¿ã¹ã¯ãä¼æ¢ç¶æ 2355 ããå®è¡ã§ãã 2356 ç¶æ 2357 ã«ããæã«å¼ã°ãï¼p_tcbã§æå®ãããã¿ã¹ã¯ï¼å¯¾è±¡ã¿ã¹ã¯ï¼ã®TCBä¸ã®ã¹ 2358 ã¿ãã¯ãã¤ã³ã¿ãåæåãï¼å®è¡åéçªå°ãã¿ã¹ã¯éå§æå¦çï¼start_rï¼ã«è¨ 2359 å®ããï¼ãã®æç¹ã§ã¯ï¼å¾è¿°ããçç±ã§ï¼å¯¾è±¡ã¿ã¹ã¯ã®ã¹ã¿ãã¯é åã使ã£ã¦ 2360 ã¯ãªããªãï¼ 2361 2362 対象ã¿ã¹ã¯ãæåã«å®è¡ãããæã«ã¯ï¼å¯¾è±¡ã¿ã¹ã¯ãèªã¿ã¹ã¯ã¨ãã¦ï¼å®è¡å 2363 éçªå°ã¨ãã¦ç»é²ããstart_rã«åå²ãã¦ããï¼start_rã«ã¯ï¼dispatcherã®ã¿ 2364 ããåå²ãï¼ãã®æã®ç¶æ 2365 ã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 2366 ã»å²è¾¼ã¿åª 2367 å 2368 度ãã¹ã¯å 2369 ¨è§£é¤ç¶æ 2370 ã»ãã£ã¹ããã許å¯ç¶æ 2371 ã§ããï¼ 2372 2373 start_rã¯ï¼CPUããã¯ç¶æ 2374 ã解é¤ããå¾ï¼ã¿ã¹ã¯ã®èµ·åçªå°ãå¼ã³åºãï¼ãã 2375 ã«ï¼ã¿ã¹ã¯ã®èµ·åçªå°ããæ»ã£ã¦ããå ´åã«ã¯ï¼ext_tskãå¼ã³åºãï¼ 2376 2377 activate_contextã¨start_rã®å¦çå 2378 容ã¯æ¬¡ã®éãï¼ 1899 タスクの起動処理(activate_context)は,タスクを休止状態から実行できる 1900 状態にする時に呼ばれ,p_tcbで指定されたタスク(対象タスク)のTCB中のス 1901 タックポインタを初期化し,実行再開番地をタスク開始時処理(start_r)に設 1902 定する.この時点では,後述する理由で,対象タスクのスタック領域を使って 1903 はならない. 1904 1905 対象タスクが最初に実行される時には,対象タスクを自タスクとして,実行再 1906 開番地として登録したstart_rに分岐してくる.start_rには,dispatcherのみ 1907 から分岐し,その時の状態は,タスクコンテキスト・CPUロック状態・割込み優 1908 先度マスク全解除状態・ディスパッチ許可状態である. 1909 1910 start_rは,CPUロック状態を解除した後,タスクの起動番地を呼び出す.さら 1911 に,タスクの起動番地から戻ってきた場合には,ext_tskを呼び出す. 1912 1913 activate_contextとstart_rの処理内容は次の通り. 2379 1914 2380 1915 ---------------------------------------- … … 2382 1917 activate_context(TCB *p_tcb) 2383 1918 { 2384 æå®ãããã¿ã¹ã¯ï¼p_tcbï¼ã®TCBä¸ã®ã¹ã¿ãã¯ãã¤ã³ã¿ãåæåãã2385 start_r ãï¼å®è¡åéçªå°ã¨ãã¦èªã¿ã¹ã¯ã®TCBã«ä¿åãã â¦(*a)1919 指定されたタスク(p_tcb)のTCB中のスタックポインタを初期化する 1920 start_rを,実行再開番地として自タスクのTCBに保存する … (*a) 2386 1921 return; 2387 1922 2388 1923 start_r: 2389 1924 #ifdef TOPPERS_SUPPORT_OVRHDR 2390 ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§*/1925 ovrtimer_start(); /* オーバランタイマの動作開始 */ 2391 1926 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2392 CPUããã¯è§£é¤ç¶æ 2393 ã«ãã 2394 èªã¿ã¹ã¯ï¼p_runtskï¼ã®èµ·åçªå°ãï¼æ¡å¼µæ 2395 å ±ããã©ã¡ã¼ã¿ã¨ãã¦å¼ã³åºã 2396 ext_tskã«åå²ãã ... (*c) 1927 CPUロック解除状態にする 1928 自タスク(p_runtsk)の起動番地を,拡張情報をパラメータとして呼び出す 1929 ext_tskに分岐する ... (*c) 2397 1930 } 2398 1931 ---------------------------------------- 2399 1932 2400 (*c)ã§ext_tskãå¼ã¶ä»£ããã«ï¼èªã¿ã¹ã¯ã®èµ·åçªå°ãå¼ã³åºãæã®è¿ãçªå°ã 2401 ext_tskã®çªå°ã¨ãã¦ããæ¹æ³ãããï¼ 2402 2403 ããã§ï¼ã¿ã¹ã¯ã®èµ·åå¦çã«ããã¦å¯¾è±¡ã¿ã¹ã¯ã®ã¹ã¿ãã¯é åã使ã£ã¦ã¯ãªã 2404 ãªãçç±ã¯ï¼æ¬¡ã®éãï¼å¶ç´ã¿ã¹ã¯æ¡å¼µããã±ã¼ã¸ã«ããã¦ï¼è¤æ°ã®å¶ç´ã¿ã¹ 2405 ã¯ãã¹ã¿ãã¯é åãå 2406 ±æãã¦ããå ´åã«ï¼ã¿ã¹ã¯ã®èµ·åæç¹ã§ã¯ï¼ãã®ã¿ã¹ã¯ 2407 ã¨ã¹ã¿ãã¯é åãå 2408 ±æãã¦ããã¿ã¹ã¯ãï¼ã¹ã¿ãã¯é åã使ç¨ãã¦ããå¯è½æ§ 2409 ãããããã§ããï¼ 2410 2411 ãã®ãã¼ãã£ã³ã°ã¬ã¤ãã§ã¯ï¼ã¿ã¹ã¯ã®å®è¡åéçªå°ãTCBã«ä¿åãã¦ãã 2412 (*a)ããããã¹ã¿ãã¯ã«ä¿åããæ¹æ³ãèãããããï¼ã¿ã¹ã¯ã®èµ·åå¦çã§ã¹ 2413 ã¿ãã¯é åã使ããªããã¨ããï¼ã¿ã¹ã¯ã®èµ·åå¦çã ãã¯ä¾å¤æ±ãããªããã° 2414 ãªããªãï¼ä¾ãã°ï¼ã¿ã¹ã¯ã®èµ·åå¦çã«ããã¦ã¯TCBä¸ã®ã¹ã¿ãã¯ãã¤ã³ã¿ãç¹ 2415 æ®ãªå¤ï¼ä¾ãã°0ï¼ã«è¨å®ãã¦ããï¼ãã£ã¹ãããã£æ¬ä½ã§TCBä¸ã®ã¹ã¿ãã¯ã 2416 ã¤ã³ã¿ããã®å¤ã®å ´åã«ã¯start_rã«åå²ããï¼start_rã«ããã¦ã¹ã¿ãã¯ã㤠2417 ã³ã¿ãåæåããæ¹æ³ãèããããï¼ 2418 2419 6.6 å²è¾¼ã¿ãã³ãã© 2420 2421 6.6.1 å²è¾¼ã¿ãã³ãã©ã®åºå 2422 ¥å£å¦ç 2423 2424 ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ã®åºå 2425 ¥å£å¦çã®æ¹æ³ã¯ï¼ããã»ããµã«ãã£ã¦å¤§ããç°ãª 2426 ããï¼ããããã®å¦çå 2427 容ã¯æ¬¡ã®éãï¼ 1933 (*c)でext_tskを呼ぶ代わりに,自タスクの起動番地を呼び出す時の返り番地を 1934 ext_tskの番地としておく方法がある. 1935 1936 ここで,タスクの起動処理において対象タスクのスタック領域を使ってはなら 1937 ない理由は,次の通り.制約タスク拡張パッケージにおいて,複数の制約タス 1938 クがスタック領域を共有している場合に,タスクの起動時点では,そのタスク 1939 とスタック領域を共有しているタスクが,スタック領域を使用している可能性 1940 があるためである. 1941 1942 このポーティングガイドでは,タスクの実行再開番地をTCBに保存している 1943 (*a)。これをスタックに保存する方法も考えられるが,タスクの起動処理でス 1944 タック領域が使えないことから,タスクの起動処理だけは例外扱いしなければ 1945 ならない.例えば,タスクの起動処理においてはTCB中のスタックポインタを特 1946 殊な値(例えば0)に設定しておき,ディスパッチャ本体でTCB中のスタックポ 1947 インタがその値の場合にはstart_rに分岐させ,start_rにおいてスタックポイ 1948 ンタを初期化する方法が考えられる. 1949 1950 6.6 割込みハンドラ 1951 1952 6.6.1 割込みハンドラの出入口処理 1953 1954 カーネル管理の割込みの出入口処理の方法は,プロセッサによって大きく異な 1955 るが,おおよその処理内容は次の通り. 2428 1956 2429 1957 ---------------------------------------- 2430 1958 void 2431 <å²è¾¼ã¿ã®åºå 2432 ¥å£å¦ç>(void) 1959 <割込みの出入口処理>(void) 2433 1960 { 2434 å°ãªãã¨ãã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 2435 ã«ãã ⦠(*f) 2436 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã 2437 if (ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç) { 1961 少なくともカーネル管理の割込みを禁止した状態にする … (*f) 1962 スクラッチレジスタをスタックに保存する 1963 if (タスクコンテキストで割込み発生) { 2438 1964 #ifdef TOPPERS_SUPPORT_OVRHDR 2439 ovrtimer_stop(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åæ¢*/1965 ovrtimer_stop(); /* オーバランタイマの停止 */ 2440 1966 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2441 ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæãï¼2442 éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã1967 スタックを非タスクコンテキスト用のスタックに切り換え, 1968 非タスクコンテキストに切り換える 2443 1969 } 2444 å²è¾¼ã¿åªå 2445 度ãã¹ã¯ãï¼åãä»ããå²è¾¼ã¿è¦æ±ã®å²è¾¼åªå 2446 度ã«è¨å®ãï¼ 2447 CPUããã¯è§£é¤ç¶æ 2448 ã«ããï¼åãä»ããå²è¾¼ã¿ããã 2449 åªå 2450 度ã®é«ãå²è¾¼ã¿ãåãä»ããããã«ããï¼â¦ (*i) 1970 割込み優先度マスクを,受け付けた割込み要求の割込優先度に設定し, 1971 CPUロック解除状態にする(受け付けた割込みよりも 1972 優先度の高い割込みを受け付けるようにする)… (*i) 2451 1973 2452 1974 2453 1975 #ifdef LOG_INH_ENTER 2454 log_inh_enter( å²è¾¼ã¿ãã³ãã©çªå·);1976 log_inh_enter(割込みハンドラ番号); 2455 1977 #endif /* LOG_INH_ENTER */ 2456 å²è¾¼ã¿ãã³ãã©ãå¼ã³åºã1978 割込みハンドラを呼び出す 2457 1979 #ifdef LOG_INH_LEAVE 2458 log_inh_leave( å²è¾¼ã¿ãã³ãã©çªå·);1980 log_inh_leave(割込みハンドラ番号); 2459 1981 #endif /* LOG_INH_LEAVE */ 2460 1982 2461 1983 ret_int: 2462 if (ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç) { 2463 ï¼å°ãªãã¨ãï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 2464 ã«ãã ⦠(*d) 2465 ã¹ã¿ãã¯ãã¿ã¹ã¯ç¨ã®ã¹ã¿ãã¯ã«æ»ãï¼ã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã 2466 ⦠(*g) 1984 if (タスクコンテキストで割込み発生) { 1985 (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d) 1986 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える 1987 … (*g) 2467 1988 if (reqflg) { 2468 1989 reqflg = false; 2469 CPUããã¯ç¶æ 2470 ã«ãã ⦠(*e) 2471 å²è¾¼ã¿åªå 2472 度ãã¹ã¯ãï¼å 2473 ¨è§£é¤ç¶æ 2474 ï¼TIPM_ENAALLï¼ã«è¨å®ãã ⦠(*h) 1990 CPUロック状態にする … (*e) 1991 割込み優先度マスクを,全解除状態(TIPM_ENAALL)に設定する … (*h) 2475 1992 if (dspflg && p_runtsk != p_schedtsk) { 2476 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã2477 ã¹ã¿ãã¯ãã¤ã³ã¿ãèªã¿ã¹ã¯ï¼p_runtskï¼ã®TCBã«ä¿åãã2478 ret_int_r ãï¼å®è¡åéçªå°ã¨ãã¦èªã¿ã¹ã¯ã®TCBã«ä¿åãã â¦(*a)2479 dispatcher ã«åå²ãã1993 スクラッチレジスタを除くすべてのレジスタをスタックに保存する 1994 スタックポインタを自タスク(p_runtsk)のTCBに保存する 1995 ret_int_rを,実行再開番地として自タスクのTCBに保存する … (*a) 1996 dispatcherに分岐する 2480 1997 2481 1998 ret_int_r: 2482 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã1999 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する 2483 2000 } 2484 2001 #ifdef TOPPERS_SUPPORT_OVRHDR 2485 ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§*/2002 ovrtimer_start(); /* オーバランタイマの動作開始 */ 2486 2003 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2487 calltex(); â¦(*b)2004 calltex(); … (*b) 2488 2005 } 2489 2006 #ifdef TOPPERS_SUPPORT_OVRHDR 2490 2007 else { 2491 ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§*/2008 ovrtimer_start(); /* オーバランタイマの動作開始 */ 2492 2009 } 2493 2010 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2494 2011 } 2495 å²è¾¼ã¿å¦çããã®ãªã¿ã¼ã³å¾ã«ï¼å²è¾¼ã¿åªå 2496 度ãã¹ã¯ã 2497 å²è¾¼ã¿å¦çåã®å¤ã«æ»ãããã«æºåãã 2498 å²è¾¼ã¿å¦çããã®ãªã¿ã¼ã³å¾ã«ï¼CPUããã¯è§£é¤ç¶æ 2499 ã«æ»ãããã«æºåãã 2500 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã 2501 å²è¾¼ã¿å¦çããã®ãªã¿ã¼ã³ 2012 割込み処理からのリターン後に,割込み優先度マスクが 2013 割込み処理前の値に戻るように準備する 2014 割込み処理からのリターン後に,CPUロック解除状態に戻るように準備する 2015 スクラッチレジスタをスタックから復帰する 2016 割込み処理からのリターン 2502 2017 } 2503 2018 ---------------------------------------- 2504 2019 2505 å²è¾¼ã¿ã®åä»ãã«ããï¼ã¹ã¿ãã¯ãã¤ã³ã¿ãåãæãããï¼ãã¹ã¦ã®å²è¾¼ã¿ã 2506 ç¦æ¢ãããªãããã»ããµã§ã¯ï¼(*f)ã«ããã¦ï¼å°ãªãã¨ãã«ã¼ãã«ç®¡çã®å²è¾¼ 2507 ã¿ãç¦æ¢ããï¼ãã®çç±ã¯æ¬¡ã®éãã§ããï¼ 2508 2509 å²è¾¼ã¿ã®å 2510 ¥å£å¦çã«ããã¦ï¼ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã« 2511 åãæããåã«å¤éå²è¾¼ã¿ãçºçããã¨ï¼ã¿ã¹ã¯ã®ã¹ã¿ãã¯é åã使ç¨ãããï¼ 2512 ä¸è¨ã®ãããªããã»ããµã§ã¯ï¼ã¹ã¿ãã¯ã®åæãåã«ï¼æ大ã§å²è¾¼ã¿åªå 2513 度㮠2514 段æ°åã®å¤éå²è¾¼ã¿ãçºçãããã¨ãé²ããã¨ã¯ã§ããï¼åã¿ã¹ã¯ã®ã¹ã¿ã㯠2515 é åã確ä¿ããéã«ï¼ãã®åãè¦è¾¼ãã§ç¢ºä¿ããªããã°ãªããªãï¼åã¿ã¹ã¯ã® 2516 ã¹ã¿ãã¯é åããªãã¹ãå°ããããããã«ã¯ï¼ã¹ã¿ãã¯ããªãã¹ã使ç¨ããªã 2517 å 2518 ã«ï¼å¤éå²è¾¼ã¿ãç¦æ¢ããã®ãæã¾ããï¼ãã®ããï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã 2519 ã¹ã¿ãã¯ã«ä¿åããåã«ï¼å²è¾¼ã¿ãç¦æ¢ããï¼ãã ãï¼å²è¾¼ã¿ã®ç¦æ¢å¦çã«å¿ 2520 2521 è¦ãªæä½éã®ã¬ã¸ã¹ã¿ã«ã¤ãã¦ã¯ï¼å²è¾¼ã¿ã®ç¦æ¢ã«å 2522 ç«ã£ã¦ã¹ã¿ãã¯ã«ä¿åã 2523 ãå¿ 2524 è¦ãããï¼ 2525 2526 åæ§ã®ãã¨ã¯ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«ãå½ã¦ã¯ã¾ãï¼ããªãã¡ï¼ã«ã¼ãã« 2527 管çå¤ã®å²è¾¼ã¿ã«ã¤ãã¦ãï¼ã¹ã¿ãã¯ããªãã¹ã使ç¨ããªãå 2528 ã«ç¦æ¢ããã®ã 2529 æã¾ããï¼ãã®ãã¨ããï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã使ç¨ããå ´åã«ã¯ï¼(*f) 2530 ã«ããã¦ï¼ãã¹ã¦ã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 2531 ã«ããã®ãæã¾ãããã¨ã«ãªãï¼ä¸ 2532 æ¹ã§ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã®ç¦æ¢æéãé·ããªãã¨ï¼ã«ã¼ãã«ç®¡çå¤ã®å² 2533 è¾¼ã¿ã®å¿çæ§ãä½ä¸ããããï¼ã¦ã¼ã¶ã«æ³¨æãä¿ãå¿ 2534 è¦ãããï¼ã¾ãï¼ã«ã¼ã 2535 ã«ç®¡çå¤ã®å²è¾¼ã¿å¦çã«ããã¦ãï¼éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ï¼ã¾ã 2536 ã¯ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿å¦çç¨ã®ã¹ã¿ãã¯ï¼ã«åãæãããã¨ãæã¾ãã 2537 ãï¼ããã¯ã«ã¼ãã«ã®ç®¡è½å¤ã§ããï¼ 2538 2539 (*i)ã«å«ã¾ããå²è¾¼ã¿åªå 2540 度ãã¹ã¯ãè¨å®ããå¦çã¯ï¼ããã»ããµããã¼ãã¦ã§ 2541 ã¢ã§å®ç¾ãã¦ããå ´åãå¤ãï¼ 2542 2543 (*d)ã«ããã¦ã¯ï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããã ãã§ï¼CPUããã¯ç¶æ 2544 ã«ã 2545 ãå¿ 2546 è¦ã¯ãªãï¼ä¾ãã°ï¼CPUããã¯ç¶æ 2547 ã§ãããã¨ã示ãå¤æ°ãç¨æãã¦ããå ´ 2548 åã«ã¯ï¼(*d)ã®æç¹ã§ã¯ãã®å¤æ°ãCPUããã¯ç¶æ 2549 ã示ãå¤ã«å¤æ´ããå¿ 2550 è¦ã¯ãª 2551 ãï¼(*e)ã«ããã¦å¤æ´ããã°ããï¼ 2552 2553 (*g)ã«ããã¦ã¿ã¹ã¯ã³ã³ããã¹ãã«åãæããå¦çã¯ï¼å²è¾¼ã¿å¦çããã®ãªã¿ã¼ 2554 ã³ã«ããã¹ã¿ãã¯ã¨ã³ã³ããã¹ããå 2555 ã«æ»ãããã»ããµã§ã¯ï¼reqflgãtrueã® 2556 å ´åã«ã®ã¿è¡ãã°ããï¼reqflgãfalseã®æã¯ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã®ã¾ã¾å¦ 2557 çãç¶ãï¼å²è¾¼ã¿å¦çããã®ãªã¿ã¼ã³ã§ã¿ã¹ã¯ã³ã³ããã¹ãã«æ»ããã¨ã«ãªãï¼ 2558 2559 (*e)ã«ããã¦CPUããã¯ç¶æ 2560 ã«ããã®ã¯ï¼dispatcherã«åå²ããéã¨ï¼(*b)ã«ã 2561 ãã¦calltexï¼ã¾ãã¯ï¼ãããå±éããå ´åã«ã¯call_texrtnï¼ãå¼ã³åºãéã«ï¼ 2562 CPUããã¯ç¶æ 2563 ã«ãªã£ã¦ããå¿ 2564 è¦ãããããã§ããï¼ 2565 2566 (*h)ã®å¦çãå®è¡ãããã®ã¯ï¼å²è¾¼ã¿å¦çåã«å²è¾¼ã¿åªå 2567 度ãã¹ã¯ãå 2568 ¨è§£é¤ç¶ 2569 æ 2570 ï¼TIPM_ENAALLï¼ã§ãã£ãå ´åã«éããï¼ããã§å²è¾¼ã¿åªå 2571 度ãã¹ã¯ãå 2572 ¨è§£é¤ 2573 ç¶æ 2574 ã«è¨å®ããã®ã¯ï¼å²è¾¼ã¿å¦çåã®å¤ã«æ»ãã®ã¨ç価ã§ããï¼ããã§ãã®å¦ 2575 çãè¡ãã®ã¯ï¼dispatcherã«åå²ããéã¨ï¼(*b)ã«ããã¦calltexï¼ã¾ãã¯ï¼ã 2576 ããå±éããå ´åã«ã¯call_texrtnï¼ãå¼ã³åºãéã«ã¯ï¼å²è¾¼ã¿åªå 2577 度ãã¹ã¯å 2578 ¨ 2579 解é¤ç¶æ 2580 ã«ãªã£ã¦ããå¿ 2581 è¦ãããããã§ããï¼ 2582 2583 ã¿ã¹ã¯ã®å®è¡ä¸ã«å²è¾¼ã¿ãçºçãï¼ä¸ã®å¦çä¸ã§dispatcherã«åå²ããå ´åï¼ 2584 ãã®ã¿ã¹ã¯ã次ã«å®è¡ãããæã«ã¯ï¼å®è¡åéçªå°ã¨ãã¦ç»é²ããret_int_rã« 2585 æ»ã£ã¦ããï¼ret_int_rã«ã¯ï¼dispatcherã®ã¿ããåå²ãï¼ãã®æã®ç¶æ 2586 ã¯ï¼ã¿ 2587 ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 2588 ã»å²è¾¼ã¿åªå 2589 度ãã¹ã¯å 2590 ¨è§£é¤ç¶æ 2591 ã»ãã£ã¹ãã 2592 ã許å¯ç¶æ 2593 ã§ããï¼ 2594 2595 å²è¾¼ã¿ã®åºå 2596 ¥å£å¦çãã¢ã»ã³ããªè¨èªã§è¨è¿°ããå ´åã«ã¯ï¼ãã¬ã¼ã¹ãã°åå¾ 2597 å¦çã¯ï¼ã6.2 ãã¬ã¼ã¹ãã°æ©è½ã¸ã®å¯¾å¿ãã®ç¯ã§è¨è¿°ããæ¹æ³ã§ã³ã¼ãã£ã³ 2598 ã°ãããã¨ï¼ 2599 2600 6.6.2 å²è¾¼ã¿ãã³ãã©æ¯ã®åºå 2601 ¥å£å¦çã®çæ 2602 2603 å²è¾¼ã¿ãã¯ãã«ããã¼ãã¦ã§ã¢ã§å®ç¾ãã¦ããå ´åãªã©ï¼å²è¾¼ã¿ãã³ãã©æ¯ã« 2604 åºå 2605 ¥å£å¦çãç¨æããæ¹ãå¹çãè¯ãã¿ã¼ã²ããã®ããã«ï¼å²è¾¼ã¿ãã³ãã©æ¯ 2606 ã«åºå 2607 ¥å£å¦çãçæããæ©æ§ãç¨æãã¦ããï¼ 2608 2609 以ä¸ã®ãã¯ãã¯ï¼æ¨æºã®å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãç¨ããå ´åã®ã¿ï¼ã¿ã¼ 2610 ã²ããéä¾åé¨ã§ä½¿ãããï¼å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãã¿ã¼ã²ããä¾åé¨ 2611 ã§ç¨æãï¼ãã®ä¸ã§ãããã®ãã¯ãã使ããªãå ´åã«ã¯ï¼ãããã®ãã¯ããç¨ 2612 æããå¿ 2613 è¦ã¯ãªãï¼ 2020 割込みの受付けにより,スタックポインタが切り換わらず,すべての割込みが 2021 禁止されないプロセッサでは,(*f)において,少なくともカーネル管理の割込 2022 みを禁止する.この理由は次の通りである. 2023 2024 割込みの入口処理において,スタックを非タスクコンテキスト用のスタックに 2025 切り換える前に多重割込みが発生すると,タスクのスタック領域が使用される. 2026 上記のようなプロセッサでは,スタックの切換え前に,最大で割込み優先度の 2027 段数分の多重割込みが発生することを防ぐことはできず,各タスクのスタック 2028 領域を確保する際に,その分を見込んで確保しなければならない.各タスクの 2029 スタック領域をなるべく小さくするためには,スタックをなるべく使用しない 2030 内に,多重割込みを禁止するのが望ましい.そのため,スクラッチレジスタを 2031 スタックに保存する前に,割込みを禁止する.ただし,割込みの禁止処理に必 2032 要な最低限のレジスタについては,割込みの禁止に先立ってスタックに保存す 2033 る必要がある. 2034 2035 同様のことは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル 2036 管理外の割込みについても,スタックをなるべく使用しない内に禁止するのが 2037 望ましい.このことから,カーネル管理外の割込みを使用する場合には,(*f) 2038 において,すべての割込みを禁止した状態にするのが望ましいことになる.一 2039 方で,カーネル管理外の割込みの禁止時間が長くなると,カーネル管理外の割 2040 込みの応答性が低下するため,ユーザに注意を促す必要がある.また,カーネ 2041 ル管理外の割込み処理においても,非タスクコンテキスト用のスタック(また 2042 は,カーネル管理外の割込み処理用のスタック)に切り換えることが望ましい 2043 が,これはカーネルの管轄外である. 2044 2045 (*i)に含まれる割込み優先度マスクを設定する処理は,プロセッサがハードウェ 2046 アで実現している場合も多い. 2047 2048 (*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状態にす 2049 る必要はない.例えば,CPUロック状態であることを示す変数を用意している場 2050 合には,(*d)の時点ではその変数をCPUロック状態を示す値に変更する必要はな 2051 く,(*e)において変更すればよい. 2052 2053 (*g)においてタスクコンテキストに切り換える処理は,割込み処理からのリター 2054 ンによりスタックとコンテキストが元に戻るプロセッサでは,reqflgがtrueの 2055 場合にのみ行えばよい.reqflgがfalseの時は,非タスクコンテキストのまま処 2056 理を続け,割込み処理からのリターンでタスクコンテキストに戻ることになる. 2057 2058 (*e)においてCPUロック状態にするのは,dispatcherに分岐する際と,(*b)にお 2059 いてcalltex(または,それを展開した場合にはcall_texrtn)を呼び出す際に, 2060 CPUロック状態になっている必要があるためである. 2061 2062 (*h)の処理が実行されるのは,割込み処理前に割込み優先度マスクが全解除状 2063 態(TIPM_ENAALL)であった場合に限られ,ここで割込み優先度マスクを全解除 2064 状態に設定するのは,割込み処理前の値に戻すのと等価である.ここでこの処 2065 理を行うのは,dispatcherに分岐する際と,(*b)においてcalltex(または,そ 2066 れを展開した場合にはcall_texrtn)を呼び出す際には,割込み優先度マスク全 2067 解除状態になっている必要があるためである. 2068 2069 タスクの実行中に割込みが発生し,上の処理中でdispatcherに分岐した場合, 2070 そのタスクが次に実行される時には,実行再開番地として登録したret_int_rに 2071 戻ってくる.ret_int_rには,dispatcherのみから分岐し,その時の状態は,タ 2072 スクコンテキスト・CPUロック状態・割込み優先度マスク全解除状態・ディスパッ 2073 チ許可状態である. 2074 2075 割込みの出入口処理をアセンブリ言語で記述する場合には,トレースログ取得 2076 処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン 2077 グすること. 2078 2079 6.6.2 割込みハンドラ毎の出入口処理の生成 2080 2081 割込みベクトルをハードウェアで実現している場合など,割込みハンドラ毎に 2082 出入口処理を用意した方が効率が良いターゲットのために,割込みハンドラ毎 2083 に出入口処理を生成する機構を用意している. 2084 2085 以下のマクロは,標準の割込み管理機能の初期化処理を用いた場合のみ,ター 2086 ゲット非依存部で使われる.割込み管理機能の初期化処理をターゲット依存部 2087 で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用 2088 意する必要はない. 2614 2089 2615 2090 (6-6-2-1) INT_ENTRY(inhno, inthdr) 2616 2091 2617 å²è¾¼ã¿ãã³ãã©çªå·ãinhnoï¼å²è¾¼ã¿ãã³ãã©ã®é¢æ°åãinthdrã§ããå²è¾¼ã¿ã 2618 ã³ãã©ã®åºå 2619 ¥å£å¦çã®ã©ãã«ãä½ããã¯ãï¼INTHDR_ENTRYãç¨ãã¦å²è¾¼ã¿ãã³ 2620 ãã©æ¯ã«åºå 2621 ¥å£å¦çãçæããå ´åã«ã¯ï¼æ¬¡ã®ããã«å®ç¾©ããï¼ 2092 割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ 2093 ンドラの出入口処理のラベルを作るマクロ.INTHDR_ENTRYを用いて割込みハン 2094 ドラ毎に出入口処理を生成する場合には,次のように定義する. 2622 2095 2623 2096 #define INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno 2624 2097 2625 å²è¾¼ã¿ãã³ãã©æ¯ã«åºå 2626 ¥å£å¦çãä½ãå¿ 2627 è¦ããªãå ´åã«ã¯ï¼æ¬¡ã®ããã«å®ç¾©ã 2628 ã¦ï¼å²è¾¼ã¿ãã³ãã©ã®é¢æ°åããã®ã¾ã¾è¿ãï¼ 2098 割込みハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し 2099 て,割込みハンドラの関数名をそのまま返す. 2629 2100 2630 2101 #define INT_ENTRY(inhno, inthdr) inthdr … … 2632 2103 (6-6-2-2) INTHDR_ENTRY(inhno, inhno_num, inthdr) 2633 2104 2634 å²è¾¼ã¿ãã³ãã©çªå·ãinhnoï¼å²è¾¼ã¿ãã³ãã©ã®é¢æ°åãinthdrã§ããå²è¾¼ã¿ã 2635 ã³ãã©ã®åºå 2636 ¥å£å¦çãçæãããã¯ãï¼inhno_numã«ã¯ï¼ã¢ã»ã³ããªè¨èªè¨è¿°ç¨ 2637 ã«ï¼å²è¾¼ã¿ãã³ãã©çªå·ãæ°å¤ã§æ¸¡ãããï¼å²è¾¼ã¿ãã³ãã©æ¯ã«åºå 2638 ¥å£å¦çã 2639 ä½ãå¿ 2640 è¦ããªãå ´åã«ã¯ï¼ç©ºã«å®ç¾©ããï¼ 2641 2642 6.6.3 å²è¾¼ã¿ãã³ãã©ã®è¨å® 2643 2644 (6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)ï¼ãªãã·ã§ã³ï¼ 2645 2646 inhnoãï¼DEF_INHã«å¯¾ããå²è¾¼ã¿ãã³ãã©çªå·ã¨ãã¦æå¹ãªå¤ã§ããå ´åã« 2647 trueï¼ããã§ãªãå ´åã«falseãè¿ããã¯ãï¼ 2648 2649 ASPã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ã¯ï¼ãã®ãã¯ãã¯ä½¿ããã¦ããªãããï¼ã¿ã¼ 2650 ã²ããä¾åé¨ã§ä½¿ããªããªãï¼ç¨æããå¿ 2651 è¦ããªãï¼ 2105 割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ 2106 ンドラの出入口処理を生成するマクロ.inhno_numには,アセンブリ言語記述用 2107 に,割込みハンドラ番号が数値で渡される.割込みハンドラ毎に出入口処理を 2108 作る必要がない場合には,空に定義する. 2109 2110 6.6.3 割込みハンドラの設定 2111 2112 (6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション) 2113 2114 inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に 2115 true,そうでない場合にfalseを返すマクロ. 2116 2117 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター 2118 ゲット依存部で使わないなら,用意する必要がない. 2652 2119 2653 2120 (6-6-3-2) void x_define_inh(INHNO inhno, FP int_entry) 2654 2121 2655 inhnoã§æå®ãããå²è¾¼ã¿ãã³ãã©ã®åºå 2656 ¥å£å¦çã®çªå°ãint_entryã«è¨å®ããï¼ 2657 2658 ãã®é¢æ°ã¯ï¼æ¨æºã®å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãç¨ããå ´åã®ã¿ï¼ã¿ã¼ã²ã 2659 ãéä¾åé¨ããå¼ã³åºãããï¼å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãã¿ã¼ã²ããä¾å 2660 é¨ã§ç¨æãï¼ãã®ä¸ã§ãã®é¢æ°ãå¼ã³åºããªãå ´åã«ã¯ï¼ãã®é¢æ°ãç¨æãã 2661 å¿ 2662 è¦ã¯ãªãï¼ 2663 2664 ãã®é¢æ°ã¯ï¼ã¿ã¼ã²ããéä¾åé¨ã®ã«ã¼ãã«åæåå¦çããå¼ã³åºãããããï¼ 2665 ã«ã¼ãã«ã®åæåå¦çï¼NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ã¯ããã¦ããï¼ããå¼ 2666 ã³åºããããã«å®è£ 2667 ããã°ããï¼ 2668 2669 æå®ãããå²è¾¼ã¿ãã³ãã©çªå·ãDEF_INHã«å¯¾ãããã®ã¨ãã¦æå¹ãªå¤ã§ãªãå ´ 2670 åã®åä½ã¯ä¿è¨¼ããå¿ 2671 è¦ããªãï¼assertã§ã¨ã©ã¼ã¨ããã®ãæã¾ããï¼ï¼ãã 2672 ã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãï¼ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ 2673 ã§å®ç¾©ããINHNO_DEFINH_VALIDãç¨ãã¦ã¨ã©ã¼ãæ¤åºããããã§ããï¼ 2674 2675 6.6.4 å²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å® 2676 2677 (6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)ï¼ãªãã·ã§ã³ï¼ 2678 2679 intnoãï¼å²è¾¼ã¿çªå·ã¨ãã¦æå¹ãªå¤ã§ããå ´åã«trueï¼ããã§ãªãå ´åã« 2680 falseãè¿ããã¯ãï¼CFG_INTã«ã¯ï¼ãã¹ã¦ã®å²è¾¼ã¿çªå·ãæå®ãããã¨ãã§ã 2681 ãããï¼ãã®ãã¯ãã¯ï¼intnoãæå¹ãªå¤ã®å ´åã«ã¯trueï¼intnoãç¡å¹ã®å¤ã® 2682 å ´åã«ã¯falseãè¿ãããã«ããï¼ 2683 2684 ASPã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ã¯ï¼ãã®ãã¯ãã¯ä½¿ããã¦ããªãããï¼ã¿ã¼ 2685 ã²ããä¾åé¨ã§ä½¿ããªããªãï¼ç¨æããå¿ 2686 è¦ããªãï¼ 2122 inhnoで指定された割込みハンドラの出入口処理の番地をint_entryに設定する. 2123 2124 この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ 2125 ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存 2126 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する 2127 必要はない. 2128 2129 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため, 2130 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼 2131 び出せるように実装すればよい. 2132 2133 指定された割込みハンドラ番号がDEF_INHに対するものとして有効な値でない場 2134 合の動作は保証する必要がない(assertでエラーとするのが望ましい).これ 2135 は,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存部 2136 で定義するINHNO_DEFINH_VALIDを用いてエラーを検出するためである. 2137 2138 6.6.4 割込み要求ラインの属性の設定 2139 2140 (6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション) 2141 2142 intnoが,割込み番号として有効な値である場合にtrue,そうでない場合に 2143 falseを返すマクロ.CFG_INTには,すべての割込み番号を指定することができ 2144 るため,このマクロは,intnoが有効な値の場合にはtrue,intnoが無効の値の 2145 場合にはfalseを返すようにする. 2146 2147 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター 2148 ゲット依存部で使わないなら,用意する必要がない. 2687 2149 2688 2150 (6-6-4-2) void x_config_int(INTNO intno, ATR intatr, PRI intpri) 2689 2151 2690 intnoã§æå®ãããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å²è¾¼ã¿å±æ§ãï¼intatrã§æå®ãããéã 2691 ã«è¨å®ããï¼ã¾ãï¼å²è¾¼ã¿åªå 2692 度ãï¼intpriã§æå®ãããå¤ã«è¨å®ããï¼ 2693 2694 ãã®é¢æ°ã¯ï¼æ¨æºã®å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãç¨ããå ´åã®ã¿ï¼ã¿ã¼ã²ã 2695 ãéä¾åé¨ããå¼ã³åºãããï¼å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãã¿ã¼ã²ããä¾å 2696 é¨ã§ç¨æãï¼ãã®ä¸ã§ãã®é¢æ°ãå¼ã³åºããªãå ´åã«ã¯ï¼ãã®é¢æ°ãç¨æãã 2697 å¿ 2698 è¦ã¯ãªãï¼ 2699 2700 ãã®é¢æ°ã¯ï¼ã¿ã¼ã²ããéä¾åé¨ã®ã«ã¼ãã«åæåå¦çããå¼ã³åºãããããï¼ 2701 ã«ã¼ãã«ã®åæåå¦çï¼NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ã¯ããã¦ããï¼ããå¼ 2702 ã³åºããããã«å®è£ 2703 ããã°ããï¼ 2704 2705 intatrã¨ãã¦è¨å®ã§ããå²è¾¼ã¿å±æ§ã¯æ¬¡ã®éãï¼ 2706 2707 TA_ENAINT 0x01 å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ãã¯ãªã¢ 2708 TA_EDGE 0x02 ã¨ãã¸ããªã¬ 2709 2710 ãã®ä»ã«ï¼ã¿ã¼ã²ããå®ç¾©ã§å²è¾¼ã¿å±æ§ã追å ãã¦ãããï¼ã¿ã¼ã²ããå®ç¾©ã§ 2711 追å ããããã«ï¼ä»¥ä¸ã®å±æ§åãäºç´ããã¦ããï¼ 2712 2713 TA_POSEDGE ãã¸ãã£ãã¨ãã¸ããªã¬ 2714 TA_NEGEDGE ãã¬ãã£ãã¨ãã¸ããªã¬ 2715 TA_BOTHEDGE 両ã¨ãã¸ããªã¬ 2716 TA_LOWLEVEL ãã¼ã¬ãã«ããªã¬ 2717 TA_HIGHLEVEL ãã¤ã¬ãã«ããªã¬ 2718 2719 ãããã®å±æ§åãã¿ã¼ã²ããå®ç¾©ã§è¿½å ããå ´åã«ã¯ï¼ãã®å±æ§å¤ã決å®ãï¼ 2720 å®ç¾©ãtarget_kernel.hï¼ã¾ãã¯ï¼ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ã«å« 2721 ããï¼ã¾ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãã³ãã¬ã¼ããã¡ã¤ã«ããåç 2722 §ã§ããããã«ï¼ 2723 target_def.csvï¼ã¾ãã¯ï¼åçã®å½¹å²ãæã¤ãã¡ã¤ã«ï¼ã«å«ãï¼ã³ã³ãã£ã®ã¥ 2724 ã¬ã¼ã¿ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ã¨ã©ã¼ã¨ãªããªãããã«ï¼ 2725 target.tfï¼ã¾ãã¯ï¼ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ã§TARGET_INTATR 2726 ã«è¨å®ããï¼ 2727 2728 æå®ãããå²è¾¼ã¿çªå·ãæå¹ãªå¤ã§ãªãå ´åãï¼ãã®å²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ã 2729 ã¦è¨å®ã§ããªãå±æ§ãæå®ããå ´åï¼è¨å®ã§ããªãå²è¾¼ã¿åªå 2730 度ãæå®ããå ´ 2731 åã®åä½ã¯ä¿è¨¼ããå¿ 2732 è¦ããªãï¼assertã§ã¨ã©ã¼ã¨ããã®ãæã¾ããï¼ï¼ãã® 2733 ãããªã±ã¼ã¹ã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã§ã¨ã©ã¼ãæ¤åºãã¹ãã§ããï¼ã³ã³ã㣠2734 ã®ã¥ã¬ã¼ã¿ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ã¯ï¼ãã¹2ã®ãã³ãã¬ã¼ 2735 ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ããINTNO_CFGINT_VALIDï¼ 2736 TARGET_INTATRï¼INTPRI_CFGINT_VALIDãç¨ãã¦ã¨ã©ã¼ãæ¤åºãããï¼æ¨æºã®å² 2737 è¾¼ã¿å±æ§ï¼TA_ENAINTï¼TA_EDGEï¼ãè¨å®ã§ããªãå ´åãï¼è¨å®ã§ããªãå±æ§ã 2738 å²è¾¼ã¿åªå 2739 度ãå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«ãã£ã¦ç°ãªãå ´åã«ã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ 2740 ã¿ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ã§æ¤åºããªããã°ãªããªãï¼ 2741 2742 6.6.5 å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çã®å¤æ´ 2743 2744 (6-6-5-1) OMIT_INITIALIZE_INTERRUPTï¼ãªãã·ã§ã³ï¼ 2745 2746 å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãã¿ã¼ã²ããä¾åé¨ã§ç¨æãï¼ã¿ã¼ã²ããéä¾å 2747 é¨ã«å«ã¾ããæ¨æºã®å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãç¨ããªãå ´åã«ã¯ï¼ãã®ã· 2748 ã³ãã«ããã¯ãå®ç¾©ããï¼ 2749 2750 ãã®ã·ã³ãã«ããã¯ãå®ç¾©ããã¨ï¼INHINIBï¼INTINIBï¼initialize_interrupt 2751 ã®å®ç¾©ãï¼ã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ããåãé¤ãããï¼ã¾ãï¼ 2752 TNUM_INHNOï¼tnum_inhnoï¼inhinib_tableï¼TNUM_INTNOï¼tnum_intnoï¼ 2753 intinib_tableã®å®ç¾©ã¨ï¼å²è¾¼ã¿ãã³ãã©æ¯ã®åºå 2754 ¥å£å¦çãçæããããã®è¨è¿° 2755 ï¼INTHDR_ENTRYãã¯ãã®ãªã¹ãï¼ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹2ã®ãã³ãã¬ã¼ 2756 ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ã«ãã£ã¦kernel_cfg.cã«çæãããªããªãï¼ 2757 ãã ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾å 2758 é¨ã§ï¼USE_INHINIB_TABLEã¨USE_INTINIB_TABLEãè¨å®ãããã¨ã§ï¼ãã®ä¸é¨ 2759 åãkernel_cfg.cã«çæãããã¨ãå¯è½ã§ããï¼ 2760 2761 (6-6-5-2) void initialize_interrupt(void)ï¼ãªãã·ã§ã³ï¼ 2762 2763 OMIT_INITIALIZE_INTERRUPTããã¯ãå®ç¾©ããå ´åã«ã¯ï¼ãã®é¢æ°ãã¿ã¼ã²ãã 2764 ä¾åé¨ã§ç¨æããï¼OMIT_INITIALIZE_INTERRUPTããã¯ãå®ç¾©ãããã¨ã«ããå 2765 ãé¤ããããã®ä»ã®ãã¼ã¿åï¼å¤æ°ï¼ãã¯ãã¯ï¼ãã®é¢æ°ã§ä½¿ç¨ããå ´åã«ã® 2766 ã¿ç¨æããã°ããï¼ 2767 2768 6.6.6 ããã©ã«ãã®å²è¾¼ã¿ãã³ãã© 2769 2770 (6-6-6-1) void default_int_handler(void)ï¼ãªãã·ã§ã³ï¼ 2771 2772 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã«ããå²è¾¼ã¿ãã³ãã©ã®ãã¼ãã«ãçæããå ´åãªã©ã«ã¯ï¼ 2773 å²è¾¼ã¿ãã³ãã©ãç»é²ããªãã£ãå²è¾¼ã¿ãã³ãã©çªå·ã«å¯¾ãã¦ï¼ããã©ã«ãã® 2774 å²è¾¼ã¿ãã³ãã©ã¨ãã¦ï¼default_int_handlerãç»é²ããï¼ 2775 2776 default_int_handlerã¯ï¼æ¨æºã®ãã®ãã¿ã¼ã²ããä¾åé¨ã§ç¨æãããï¼ã¦ã¼ã¶ 2777 ãç¨æãããã®ã§ç½®ãæããããããã«ï¼OMIT_DEFAULT_INT_HANDLERããã¯ã 2778 å®ç¾©ããå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ããªãããã«ããï¼ãªãï¼ã¦ã¼ã¶ 2779 ãç¨æããå ´åã®å称ã¯ï¼_kernel_default_int_handlerã¨ãªãï¼ 2780 2781 6.6.7 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ 2782 2783 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ãã³ãã©ã¯ï¼ã«ã¼ãã«å 2784 ã®å²è¾¼ã¿åºå 2785 ¥å£å¦çãçµç±ã 2786 ãã«å®è¡ããã®ãåºæ¬ã§ããï¼ 2787 2788 ãã ãï¼ãã¹ã¦ã®å²è¾¼ã¿ã§åãã¢ãã¬ã¹ã«åå²ããããã»ããµã§ã¯ï¼ã«ã¼ãã« 2789 å 2790 ã®å²è¾¼ã¿åºå 2791 ¥å£å¦çãå 2792 ¨ãçµç±ããã«ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ãã³ãã©ãå® 2793 è¡ãããã¨ãã§ããªãããï¼å²è¾¼ã¿åºå 2794 ¥å£å¦çã®ãªãã¹ãæ©ãã¿ã¤ãã³ã°ã§ï¼ 2795 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã§ããããå¤å¥ãï¼å¦çå 2796 容ãåããå¿ 2797 è¦ãããï¼å 2798 · 2799 ä½çã«ã¯ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã®åºå 2800 ¥å£å¦çã§ã¯ï¼ãªã¼ãã©ã³ãã³ãã©ã® 2801 åæ¢ã¨åä½éå§ãè¡ã£ã¦ã¯ãªããªãï¼ã¾ãï¼reqflgããã§ãã¯ãï¼ã¿ã¹ã¯åæ 2802 ããã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã®å¼åºããè¡ãå¿ 2803 è¦ããªãï¼ããã«ï¼NMIã®åºå 2804 ¥å£ 2805 å¦çã§ã¯ï¼ãã¬ã¼ã¹ãã°åå¾å¦çï¼log_inh_enterããã³log_inh_leaveï¼ãå¼ 2806 ã³åºãã¦ã¯ãªããªãï¼ 2807 2808 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ãã³ãã©ãå®è¡ããéã«ï¼ã«ã¼ãã«å 2809 ã®å²è¾¼ã¿åºå 2810 ¥å£ 2811 å¦çã®ä¸é¨åãçµç±ããå ´åã«ã¯ï¼CPUä¾å¤ãèµ·ããå¯è½æ§ã極åæ¸ããã¨ã¨ã 2812 ã«ï¼CPUä¾å¤ãèµ·ããå¯è½æ§ãããå ´åã«ã¯ï¼ãã®å¯è½æ§ãã¿ã¼ã²ããä¾åé¨ã® 2813 ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ã«è¨è¼ããªããã°ãªããªãï¼ 2814 2815 次ã«ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã®è¨å®æ¹æ³ã«é¢ãã¦ï¼ãTOPPERSæ°ä¸ä»£ã«ã¼ãã« 2816 çµ±åä»æ§æ¸ãã®ã2.7.8 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã®è¨å®æ¹æ³ãã®ç¯ã®3ã¤ã®æ¹æ³ 2817 ã®ããããæ¡ç¨ãããã決å®ããï¼ 2818 2819 (a-1)ã¾ãã¯(a-2)ãæ¡ç¨ãï¼ã«ã¼ãã«ç®¡çå¤ã¨ããå²è¾¼ã¿ã«å¯¾ãã¦ï¼ã«ã¼ãã« 2820 ã®APIã«ããå²è¾¼ã¿ãã³ãã©ã®ç»é²ã¨å²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å®ããµãã¼ã 2821 ããªãå ´åã«ã¯ï¼ããã«ä»£ããæ¹æ³ãã¿ã¼ã²ããä¾åé¨ã®ã¦ã¼ã¶ã¼ãºããã¥ã¢ 2822 ã«ã«è¨è¿°ããï¼ 2823 2824 (a-1)ã¾ãã¯(a-2)ãæ¡ç¨ãã¦ã«ã¼ãã«ã®APIã«ããå²è¾¼ã¿ãã³ãã©ã®ç»é²ãå²è¾¼ 2825 ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å®ããµãã¼ãããå ´åãï¼(b)ãæ¡ç¨ããå ´åã«ã¯ï¼ã¿ã¼ 2826 ã²ããä¾åé¨ã«ããã¦ãããå®ç¾ããå¿ 2827 è¦ãããï¼ 2828 2829 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«å¯¾ãã¦ï¼DEF_INHã«ããå²è¾¼ã¿ãã³ãã©ã®ç»é²ããµãã¼ 2830 ãããã«ã¯ï¼æ¬¡ã®è¨å®ãå¿ 2831 è¦ã«ãªãï¼ 2832 2833 ã»TARGET_INHATRã«ï¼TA_NONKERNELãè¨å®ããï¼ 2834 2835 ã»(a-1)ã¾ãã¯(a-2)ãæ¡ç¨ããå ´åã«ã¯ï¼INHNO_DEFINH_VALIDã«ï¼ã«ã¼ãã«ç®¡ 2836 ãçå¤ã¨ããå²è¾¼ã¿ã«å¯¾å¿ããå²è¾¼ã¿ãã³ãã©çªå·ãå«ããï¼ã¾ãï¼ 2837 ãVALID_INHNO_DEFINHãï¼ã«ã¼ãã«ç®¡çå¤ã¨ããå²è¾¼ã¿ãã³ãã©çªå·ãæå¹ãª 2838 ãå¤ã¨å¤å®ããããã«ããï¼ 2839 2840 ã»(a-1)ã¾ãã¯(a-2)ãæ¡ç¨ããå ´åã«ã¯ï¼INHNO_FIX_KERNELã«ã«ã¼ãã«ç®¡ç㨠2841 ãããå²è¾¼ã¿ãã³ãã©çªå·ã®ãªã¹ããï¼INHNO_FIX_NONKERNELã«ã«ã¼ãã«ç®¡çå¤ 2842 ãã¨ããå²è¾¼ã¿ãã³ãã©çªå·ã®ãªã¹ãè¨å®ããï¼ 2843 2844 ã»DEF_INHãã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«å¯¾å¿ã§ããããã«ããï¼æ¨æºã®å²è¾¼ã¿ç®¡ 2845 ãçæ©è½ã®åæåå¦çãç¨ããå ´åã«ã¯ï¼x_define_inhãã«ã¼ãã«ç®¡çå¤ã®å² 2846 ãè¾¼ã¿ã«å¯¾å¿ãããï¼ 2847 2848 ã»å¿ 2849 è¦ãªå ´åã«ã¯ï¼TA_NONKERNELå±æ§ãè¨å®ãããå²è¾¼ã¿ãã³ãã©ãã«ã¼ãã« 2850 ã管çå¤ã¨æ±ãããã«ï¼ã«ã¼ãã«å 2851 ã®å²è¾¼ã¿åºå 2852 ¥å£å¦çãä¿®æ£ããï¼æ¨æºã®å² 2853 ãè¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãç¨ããå ´åï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«å¯¾ã㦠2854 ãã¯ï¼ã«ã¼ãã«å 2855 ã®å²è¾¼ã¿åºå 2856 ¥å£å¦çãçæããï¼ã¢ããªã±ã¼ã·ã§ã³ãç»é²ã 2857 ããå²è¾¼ã¿ãã³ãã©ãç´æ¥å¼ã³åºãããã«ï¼ã¿ã¼ã²ããéä¾åé¨ã«ããè¨å®ã 2858 ãããããï¼ã¿ã¼ã²ããä¾åé¨ã§ã¯å¯¾å¿ããå¿ 2859 è¦ããªãï¼ 2860 2861 ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«å¯¾ãã¦ï¼CFG_INTã«ããå²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨ 2862 å®ããµãã¼ãããã«ã¯ï¼æ¬¡ã®è¨å®ãå¿ 2863 è¦ã«ãªãï¼ 2864 2865 ã»(a-1)ã¾ãã¯(a-2)ãæ¡ç¨ããå ´åã«ã¯ï¼INTNO_CFGINT_VALIDã«ï¼ã«ã¼ãã«ç®¡ 2866 ãçå¤ã¨ããå²è¾¼ã¿ã«å¯¾å¿ããå²è¾¼ã¿çªå·ãå«ããï¼ã¾ãï¼VALID_INTNO_CFGINT 2867 ããï¼ã«ã¼ãã«ç®¡çå¤ã¨ããå²è¾¼ã¿çªå·ãæå¹ãªå¤ã¨å¤å®ããããã«ããï¼ 2868 2869 ã»(a-1)ã¾ãã¯(a-2)ãæ¡ç¨ããå ´åã«ã¯ï¼INTNO_FIX_KERNELã«ã«ã¼ãã«ç®¡ç㨠2870 ãããå²è¾¼ã¿çªå·ã®ãªã¹ããï¼INTNO_FIX_NONKERNELã«ã«ã¼ãã«ç®¡çå¤ã¨ããå² 2871 ãè¾¼ã¿çªå·ã®ãªã¹ãè¨å®ããï¼ 2872 2873 ã»INTPRI_CFGINT_VALIDã«ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã¨ãªãåªå 2874 度ãå«ããï¼ 2875 2876 ã»CFG_INTãã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«å¯¾å¿ã§ããããã«ããï¼æ¨æºã®å²è¾¼ã¿ç®¡ 2877 ãçæ©è½ã®åæåå¦çãç¨ããå ´åã«ã¯ï¼x_config_intãã«ã¼ãã«ç®¡çå¤ã®å² 2878 ãè¾¼ã¿ã«å¯¾å¿ãããï¼ 2879 2880 chg_ipmã«ããï¼ï¼NMI以å¤ã®ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ããã¹ã¯ã§ããããã« 2881 ããå ´åã«ã¯ï¼æ¬¡ã®è¨å®ãå¿ 2882 è¦ã«ãªãï¼ 2883 2884 ã»VALID_INTPRI_CHGIPMãï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã¨ãªãåªå 2885 度ãæå¹ãªå¤ã¨ 2886 ãå¤å®ããããã«ããï¼ 2887 2888 ã»t_set_ipmãï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã¨ãªãåªå 2889 度ãæ±ããããã«ããï¼ 2890 2891 6.6.8 å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã®çæ 2152 intnoで指定された割込み要求ラインの割込み属性を,intatrで指定された通り 2153 に設定する.また,割込み優先度を,intpriで指定された値に設定する. 2154 2155 この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ 2156 ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存 2157 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する 2158 必要はない. 2159 2160 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため, 2161 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼 2162 び出せるように実装すればよい. 2163 2164 intatrとして設定できる割込み属性は次の通り. 2165 2166 TA_ENAINT 0x01 割込み要求禁止フラグをクリア 2167 TA_EDGE 0x02 エッジトリガ 2168 2169 この他に,ターゲット定義で割込み属性を追加してもよい.ターゲット定義で 2170 追加するために,以下の属性名が予約されている. 2171 2172 TA_POSEDGE ポジティブエッジトリガ 2173 TA_NEGEDGE ネガティブエッジトリガ 2174 TA_BOTHEDGE 両エッジトリガ 2175 TA_LOWLEVEL ローレベルトリガ 2176 TA_HIGHLEVEL ハイレベルトリガ 2177 2178 これらの属性名をターゲット定義で追加する場合には,その属性値を決定し, 2179 定義をtarget_kernel.h(または,そこからインクルードされるファイル)に含 2180 める.また,コンフィギュレータテンプレートファイルから参照できるように, 2181 target_def.csv(または,同等の役割を持つファイル)に含め,コンフィギュ 2182 レータテンプレートファイルのターゲット非依存部でエラーとならないように, 2183 target.tf(または,そこからインクルードされるファイル)でTARGET_INTATR 2184 に設定する. 2185 2186 指定された割込み番号が有効な値でない場合や,その割込み要求ラインに対し 2187 て設定できない属性を指定した場合,設定できない割込み優先度を指定した場 2188 合の動作は保証する必要がない(assertでエラーとするのが望ましい).この 2189 ようなケースは,コンフィギュレータでエラーを検出すべきである.コンフィ 2190 ギュレータテンプレートファイルのターゲット非依存部は,パス2のテンプレー 2191 トファイルのターゲット依存部で定義するINTNO_CFGINT_VALID, 2192 TARGET_INTATR,INTPRI_CFGINT_VALIDを用いてエラーを検出するが,標準の割 2193 込み属性(TA_ENAINT,TA_EDGE)が設定できない場合や,設定できない属性や 2194 割込み優先度が割込み要求ラインによって異なる場合には,コンフィギュレー 2195 タテンプレートファイルのターゲット依存部で検出しなければならない. 2196 2197 6.6.5 割込み管理機能の初期化処理の変更 2198 2199 (6-6-5-1) OMIT_INITIALIZE_INTERRUPT(オプション) 2200 2201 割込み管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存 2202 部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ 2203 ンボルをマクロ定義する. 2204 2205 このシンボルをマクロ定義すると,INHINIB,INTINIB,initialize_interrupt 2206 の定義が,カーネルのターゲット非依存部から取り除かれる.また, 2207 TNUM_INHNO,tnum_inhno,inhinib_table,TNUM_INTNO,tnum_intno, 2208 intinib_tableの定義と,割込みハンドラ毎の出入口処理を生成するための記述 2209 (INTHDR_ENTRYマクロのリスト)が,コンフィギュレータのパス2のテンプレー 2210 トファイルのターゲット非依存部によってkernel_cfg.cに生成されなくなる. 2211 ただし,コンフィギュレータのパス2のテンプレートファイルのターゲット依存 2212 部で,USE_INHINIB_TABLEとUSE_INTINIB_TABLEを設定することで,その一部 2213 分をkernel_cfg.cに生成することが可能である. 2214 2215 (6-6-5-2) void initialize_interrupt(void)(オプション) 2216 2217 OMIT_INITIALIZE_INTERRUPTをマクロ定義した場合には,この関数をターゲット 2218 依存部で用意する.OMIT_INITIALIZE_INTERRUPTをマクロ定義することにより取 2219 り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの 2220 み用意すればよい. 2221 2222 6.6.6 デフォルトの割込みハンドラ 2223 2224 (6-6-6-1) void default_int_handler(void)(オプション) 2225 2226 コンフィギュレータにより割込みハンドラのテーブルを生成する場合などには, 2227 割込みハンドラを登録しなかった割込みハンドラ番号に対して,デフォルトの 2228 割込みハンドラとして,default_int_handlerを登録する. 2229 2230 default_int_handlerは,標準のものをターゲット依存部で用意するが,ユーザ 2231 が用意したもので置き換えられるように,OMIT_DEFAULT_INT_HANDLERをマクロ 2232 定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ 2233 が用意する場合の名称は,_kernel_default_int_handlerとなる. 2234 2235 6.6.7 カーネル管理外の割込み 2236 2237 カーネル管理外の割込みハンドラは,カーネル内の割込み出入口処理を経由せ 2238 ずに実行するのが基本である. 2239 2240 ただし,すべての割込みで同じアドレスに分岐するプロセッサでは,カーネル 2241 内の割込み出入口処理を全く経由せずにカーネル管理外の割込みハンドラを実 2242 行することができないため,割込み出入口処理のなるべく早いタイミングで, 2243 カーネル管理外の割込みであるかを判別し,処理内容を分ける必要がある.具 2244 体的には,カーネル管理外の割込みの出入口処理では,オーバランハンドラの 2245 停止と動作開始を行ってはならない.また,reqflgをチェックし,タスク切換 2246 えやタスク例外処理ルーチンの呼出しを行う必要がない.さらに,NMIの出入口 2247 処理では,トレースログ取得処理(log_inh_enterおよびlog_inh_leave)を呼 2248 び出してはならない. 2249 2250 カーネル管理外の割込みハンドラを実行する際に,カーネル内の割込み出入口 2251 処理の一部分を経由する場合には,CPU例外が起こる可能性を極力減らすととも 2252 に,CPU例外を起こす可能性がある場合には,その可能性をターゲット依存部の 2253 ユーザーズマニュアルに記載しなければならない. 2254 2255 次に,カーネル管理外の割込みの設定方法に関して,「TOPPERS新世代カーネル 2256 統合仕様書」の「2.7.8 カーネル管理外の割込みの設定方法」の節の3つの方法 2257 のいずれを採用するかを決定する. 2258 2259 (a-1)または(a-2)を採用し,カーネル管理外とした割込みに対して,カーネル 2260 のAPIによる割込みハンドラの登録と割込み要求ラインの属性の設定をサポート 2261 しない場合には,それに代わる方法をターゲット依存部のユーザーズマニュア 2262 ルに記述する. 2263 2264 (a-1)または(a-2)を採用してカーネルのAPIによる割込みハンドラの登録や割込 2265 み要求ラインの属性の設定をサポートする場合や,(b)を採用した場合には,ター 2266 ゲット依存部においてそれを実現する必要がある. 2267 2268 カーネル管理外の割込みに対して,DEF_INHによる割込みハンドラの登録をサポー 2269 トするには,次の設定が必要になる. 2270 2271 ・TARGET_INHATRに,TA_NONKERNELを設定する. 2272 2273 ・(a-1)または(a-2)を採用した場合には,INHNO_DEFINH_VALIDに,カーネル管 2274 理外とした割込みに対応する割込みハンドラ番号を含める.また, 2275 VALID_INHNO_DEFINHを,カーネル管理外とした割込みハンドラ番号を有効な 2276 値と判定するようにする. 2277 2278 ・(a-1)または(a-2)を採用した場合には,INHNO_FIX_KERNELにカーネル管理と 2279 した割込みハンドラ番号のリストを,INHNO_FIX_NONKERNELにカーネル管理外 2280 とした割込みハンドラ番号のリスト設定する. 2281 2282 ・DEF_INHがカーネル管理外の割込みに対応できるようにする.標準の割込み管 2283 理機能の初期化処理を用いる場合には,x_define_inhをカーネル管理外の割 2284 込みに対応させる. 2285 2286 ・必要な場合には,TA_NONKERNEL属性が設定された割込みハンドラをカーネル 2287 管理外と扱うように,カーネル内の割込み出入口処理を修正する.標準の割 2288 込み管理機能の初期化処理を用いる場合,カーネル管理外の割込みに対して 2289 は,カーネル内の割込み出入口処理を生成せず,アプリケーションが登録し 2290 た割込みハンドラを直接呼び出すように,ターゲット非依存部により設定さ 2291 れるため,ターゲット依存部では対応する必要がない. 2292 2293 カーネル管理外の割込みに対して,CFG_INTによる割込み要求ラインの属性の設 2294 定をサポートするには,次の設定が必要になる. 2295 2296 ・(a-1)または(a-2)を採用した場合には,INTNO_CFGINT_VALIDに,カーネル管 2297 理外とした割込みに対応する割込み番号を含める.また,VALID_INTNO_CFGINT 2298 を,カーネル管理外とした割込み番号を有効な値と判定するようにする. 2299 2300 ・(a-1)または(a-2)を採用した場合には,INTNO_FIX_KERNELにカーネル管理と 2301 した割込み番号のリストを,INTNO_FIX_NONKERNELにカーネル管理外とした割 2302 込み番号のリスト設定する. 2303 2304 ・INTPRI_CFGINT_VALIDに,カーネル管理外の割込みとなる優先度を含める. 2305 2306 ・CFG_INTがカーネル管理外の割込みに対応できるようにする.標準の割込み管 2307 理機能の初期化処理を用いる場合には,x_config_intをカーネル管理外の割 2308 込みに対応させる. 2309 2310 chg_ipmにより,(NMI以外の)カーネル管理外の割込みをマスクできるように 2311 する場合には,次の設定が必要になる. 2312 2313 ・VALID_INTPRI_CHGIPMを,カーネル管理外の割込みとなる優先度を有効な値と 2314 判定するようにする. 2315 2316 ・t_set_ipmを,カーネル管理外の割込みとなる優先度を扱えるようにする. 2317 2318 6.6.8 割込みサービスルーチンの生成 2892 2319 2893 2320 (6-6-8-1) bool_t VALID_INTNO_CREISR(INTNO intno) 2894 2321 2895 intnoãï¼acre_isrã«å¯¾ããå²è¾¼ã¿çªå·ã¨ãã¦æå¹ãªå¤ã§ããå ´åã«trueï¼ãã 2896 ã§ãªãå ´åã«falseãè¿ããã¯ãï¼åççææ©è½æ¡å¼µããã±ã¼ã¸ã使ç¨ããªãå ´ 2897 åã«ã¯ï¼å®ç¾©ããå¿ 2898 è¦ããªãï¼ 2899 2900 6.7 CPUä¾å¤ãã³ãã©ã¨CPUä¾å¤çºçæã®ã·ã¹ãã ç¶æ 2901 ã®åç 2902 § 2903 2904 6.7.1 CPUä¾å¤ãã³ãã©ã®åºå 2905 ¥å£å¦ç 2906 2907 CPUä¾å¤ã®åºå 2908 ¥å£å¦çã®æ¹æ³ã¯ããã»ããµã«ãã£ã¦å¤§ããç°ãªããï¼ããããã® 2909 å¦çå 2910 容ã¯æ¬¡ã®éãï¼ 2322 intnoが,acre_isrに対する割込み番号として有効な値である場合にtrue,そう 2323 でない場合にfalseを返すマクロ.動的生成機能拡張パッケージを使用しない場 2324 合には,定義する必要がない. 2325 2326 6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照 2327 2328 6.7.1 CPU例外ハンドラの出入口処理 2329 2330 CPU例外の出入口処理の方法はプロセッサによって大きく異なるが,おおよその 2331 処理内容は次の通り. 2911 2332 2912 2333 ---------------------------------------- 2913 2334 void 2914 <CPUä¾å¤ã®åºå 2915 ¥å£å¦ç>(void) 2335 <CPU例外の出入口処理>(void) 2916 2336 { 2917 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã2918 if ( ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤) {2919 if ( ã¿ã¹ã¯ã³ã³ããã¹ãã§CPUä¾å¤çºç) {2920 ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæãï¼2921 éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã â¦(*j)2337 スクラッチレジスタをスタックに保存する 2338 if (カーネル管理外のCPU例外) { 2339 if (タスクコンテキストでCPU例外発生) { 2340 スタックを非タスクコンテキスト用のスタックに切り換え, 2341 非タスクコンテキストに切り換える … (*j) 2922 2342 } 2923 ã·ã¹ãã ç¶æ 2924 ï¼ã³ã³ããã¹ãã¯é¤ãï¼ãï¼CPUä¾å¤çºçæã®ç¶æ 2925 ã«ãã 2926 CPUä¾å¤ãã³ãã©ãï¼CPUä¾å¤ã®æ 2927 å ±ãè¨æ¶ãã¦ããé åã®å 2928 é çªå°ã 2929 ãã©ã¡ã¼ã¿ï¼p_excinfï¼ã¨ãã¦å¼ã³åºã 2930 if (ã¿ã¹ã¯ã³ã³ããã¹ãã§CPUä¾å¤çºç) { 2931 ã¹ã¿ãã¯ãã¿ã¹ã¯ç¨ã®ã¹ã¿ãã¯ã«æ»ãï¼ 2932 ã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã ⦠(*j) 2343 システム状態(コンテキストは除く)を,CPU例外発生時の状態にする 2344 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を 2345 パラメータ(p_excinf)として呼び出す 2346 if (タスクコンテキストでCPU例外発生) { 2347 スタックをタスク用のスタックに戻し, 2348 タスクコンテキストに切り換える … (*j) 2933 2349 } 2934 CPUä¾å¤å¦çããã®ãªã¿ã¼ã³å¾ã«ï¼CPUä¾å¤çºçæã®ã·ã¹ãã ç¶æ 2935 ã« 2936 æ»ãããã«æºåãã 2350 CPU例外処理からのリターン後に,CPU例外発生時のシステム状態に 2351 戻るように準備する 2937 2352 } 2938 2353 else { 2939 if (ã¿ã¹ã¯ã³ã³ããã¹ãã§CPUä¾å¤çºç) { 2940 ï¼å°ãªãã¨ãï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 2941 ã«ãã 2354 if (タスクコンテキストでCPU例外発生) { 2355 (少なくとも)カーネル管理の割込みを禁止した状態にする 2942 2356 #ifdef TOPPERS_SUPPORT_OVRHDR 2943 ovrtimer_stop(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åæ¢*/2357 ovrtimer_stop(); /* オーバランタイマの停止 */ 2944 2358 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2945 ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæãï¼2946 éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã2359 スタックを非タスクコンテキスト用のスタックに切り換え, 2360 非タスクコンテキストに切り換える 2947 2361 } 2948 å²è¾¼ã¿åªå 2949 度ãã¹ã¯ãï¼CPUä¾å¤çºçæã®å¤ã«è¨å®ãï¼ 2950 CPUããã¯è§£é¤ç¶æ 2951 ã«ããï¼CPUä¾å¤çºçæã®å²è¾¼ã¿åªå 2952 度ãã¹ã¯ 2953 ãããåªå 2954 度ã®é«ãå²è¾¼ã¿ãåãä»ããããã«ããï¼ 2362 割込み優先度マスクを,CPU例外発生時の値に設定し, 2363 CPUロック解除状態にする(CPU例外発生時の割込み優先度マスク 2364 よりも優先度の高い割込みを受け付けるようにする) 2955 2365 2956 2366 #ifdef LOG_EXC_ENTER 2957 log_exc_enter(CPU ä¾å¤ãã³ãã©çªå·);2367 log_exc_enter(CPU例外ハンドラ番号); 2958 2368 #endif /* LOG_EXC_ENTER */ 2959 CPUä¾å¤ãã³ãã©ãï¼CPUä¾å¤ã®æ 2960 å ±ãè¨æ¶ãã¦ããé åã®å 2961 é çªå°ã 2962 ãã©ã¡ã¼ã¿ï¼p_excinfï¼ã¨ãã¦å¼ã³åºã 2369 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を 2370 パラメータ(p_excinf)として呼び出す 2963 2371 #ifdef LOG_EXC_LEAVE 2964 log_exc_leave(CPU ä¾å¤ãã³ãã©çªå·);2372 log_exc_leave(CPU例外ハンドラ番号); 2965 2373 #endif /* LOG_EXC_LEAVE */ 2966 2374 2967 2375 ret_exc: 2968 if (ã¿ã¹ã¯ã³ã³ããã¹ãã§CPUä¾å¤çºç) { 2969 ï¼å°ãªãã¨ãï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 2970 ã«ãã ⦠(*d) 2971 ã¹ã¿ãã¯ãã¿ã¹ã¯ç¨ã®ã¹ã¿ãã¯ã«æ»ãï¼ã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã 2972 ⦠(*g) 2376 if (タスクコンテキストでCPU例外発生) { 2377 (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d) 2378 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える 2379 … (*g) 2973 2380 if (reqflg) { 2974 2381 reqflg = false; 2975 CPUããã¯ç¶æ 2976 ã«ãã ⦠(*e) 2382 CPUロック状態にする … (*e) 2977 2383 if (dspflg && p_runtsk != p_schedtsk) { 2978 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã2979 ã¹ã¿ãã¯ãã¤ã³ã¿ãèªã¿ã¹ã¯ï¼p_runtskï¼ã®TCBã«ä¿åãã2980 ret_exc_r ãï¼å®è¡åéçªå°ã¨ãã¦èªã¿ã¹ã¯ã®TCBã«ä¿åãã2981 â¦(*a)2982 dispatcher ã«åå²ãã2384 スクラッチレジスタを除くすべてのレジスタをスタックに保存する 2385 スタックポインタを自タスク(p_runtsk)のTCBに保存する 2386 ret_exc_rを,実行再開番地として自タスクのTCBに保存する 2387 … (*a) 2388 dispatcherに分岐する 2983 2389 2984 2390 ret_exc_r: 2985 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ã2986 ã¹ã¿ãã¯ãã復帰ãã2391 スクラッチレジスタを除くすべてのレジスタを 2392 スタックから復帰する 2987 2393 } 2988 2394 #ifdef TOPPERS_SUPPORT_OVRHDR 2989 ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§*/2395 ovrtimer_start(); /* オーバランタイマの動作開始 */ 2990 2396 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2991 calltex(); â¦(*b)2397 calltex(); … (*b) 2992 2398 } 2993 2399 #ifdef TOPPERS_SUPPORT_OVRHDR 2994 2400 else { 2995 ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§*/2401 ovrtimer_start(); /* オーバランタイマの動作開始 */ 2996 2402 } 2997 2403 #endif /* TOPPERS_SUPPORT_OVRHDR */ 2998 2404 } 2999 CPUä¾å¤å¦çããã®ãªã¿ã¼ã³å¾ã«ï¼CPUããã¯è§£é¤ç¶æ 3000 ã«æ»ãããã«æºåãã 2405 CPU例外処理からのリターン後に,CPUロック解除状態に戻るように準備する 3001 2406 } 3002 ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã3003 CPU ä¾å¤å¦çããã®ãªã¿ã¼ã³2407 スクラッチレジスタをスタックから復帰する 2408 CPU例外処理からのリターン 3004 2409 } 3005 2410 ---------------------------------------- 3006 2411 3007 CPUä¾å¤ãã³ãã©ã¯ï¼éã³ã³ããã¹ãã«åãæãããã¨ãé¤ãã¦ã¯ï¼CPUä¾å¤çº 3008 çæã¨åãã·ã¹ãã ç¶æ 3009 ã§å¼ã³åºããªããã°ãªããªãï¼ä¾ãã°ï¼CPUä¾å¤ãCPU 3010 ããã¯ç¶æ 3011 ã§çºçããå ´åã«ã¯CPUããã¯ç¶æ 3012 ï¼CPUããã¯è§£é¤ç¶æ 3013 ã§çºçãã 3014 å ´åã«ã¯CPUããã¯è§£é¤ç¶æ 3015 ã§ï¼CPUä¾å¤ãã³ãã©ãå¼ã³åºããªããã°ãªããªãï¼ 3016 CPUããã¯ç¶æ 3017 ã§çºçããCPUä¾å¤ã¯ï¼ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã¨ãªãããï¼ã«ã¼ 3018 ãã«ç®¡çã®CPUä¾å¤ãã³ãã©ã«ã¤ãã¦ã¯ï¼CPUããã¯è§£é¤ç¶æ 3019 ã§å¼ã³åºããã¨ã« 3020 ãªãï¼ 3021 3022 ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ãæ£ç¢ºã«å¤å®ããã®ãé£ãã 3023 å ´åãããï¼ãã®ãããªå ´åã«ã¯ï¼å²è¾¼ã¿åªå 3024 度ãã¹ã¯ãå 3025 ¨è§£é¤ã§ãªãç¶æ 3026 㧠3027 çºçããCPUä¾å¤ãï¼ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã¨æ±ã£ã¦ãæ¯éããªãï¼ããã¯ï¼ 3028 å²è¾¼ã¿åªå 3029 度ãã¹ã¯ãå 3030 ¨è§£é¤ã§ãªãå ´åã«ã¯ï¼xsns_dpnï¼xsns_xpnã¨ãtrueã 3031 è¿ãããï¼ã¢ããªã±ã¼ã·ã§ã³ããã¯ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã¨åºå¥ã§ããªãã 3032 ãã§ããï¼ 3033 3034 å 3035 ·ä½çã«ã¯ï¼å 3036 ¨å²è¾¼ã¿ããã¯ï¼ã¾ãã¯CPUããã¯ï¼ãå°ãããªã¼ããããã§å®ç¾ 3037 ãããã¨ããã¨ï¼CPUä¾å¤ãã³ãã©ã®ä¸ã§ï¼å 3038 ¨å²è¾¼ã¿ããã¯ç¶æ 3039 ï¼ã¾ãã¯CPUãã 3040 ã¯ç¶æ 3041 ï¼ã¨å²è¾¼ã¿åªå 3042 度ãã¹ã¯ãé«ãã¬ãã«ã«è¨å®ããç¶æ 3043 ãåºå¥ã§ããªãå ´ 3044 åãããï¼ã¾ãï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿å¦çä¸ãã«ã¼ãã«å®è¡ä¸ã§ããã㨠3045 ãæ£ç¢ºã«å¤æãããã¨ãé£ããå ´åãããï¼ 3046 3047 ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ãã³ãã©ãå¼ã¶æã«ï¼(*j)ã«ããã¦ï¼ã¹ã¿ãã¯ãéã¿ 3048 ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæãï¼éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæã 3049 ã¦ãããï¼ãã®åæãã¯ã¿ã¼ã²ããå®ç¾©ã§çãã¦ãè¯ãï¼ããã¯ï¼ã«ã¼ãã«ç®¡ 3050 çå¤ã®CPUä¾å¤ã¯ï¼ã«ã¼ãã«å 3051 ã®ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ä¸ã§çºçããå¯è½æ§ã 3052 ããããï¼å®å 3053 ¨ã«åãæããããã¨ã¯éããªãããã§ããï¼ã¾ãï¼ã«ã¼ãã«ç®¡ 3054 çå¤ã®å²è¾¼ã¿ãã³ãã©ãå¼ã¶æã®ã³ã³ããã¹ããã¹ã¿ãã¯ã¯ã¿ã¼ã²ããä¾å㪠3055 ã®ã§ï¼ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ãã³ãã©ãããã¨åæ§ã«æ±ã£ã¦è¯ãã¨èããã 3056 ãããã§ããï¼ 3057 3058 ä¸ã®ã³ã¼ãã§ã¯ï¼ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã«å¯¾ãã¦ï¼ãã¬ã¼ã¹ãã°åå¾å¦ç 3059 ï¼log_exc_enterããã³log_exc_leaveï¼ãå¼ã³åºãã¦ããªããï¼å 3060 ¨å²è¾¼ã¿ãã 3061 ã¯ç¶æ 3062 ãNMIã®å¦çä¸ã«CPUä¾å¤ãçºçããå ´åãé¤å¤ããã°ï¼å¼ã³åºãã¦ãã 3063 ã¾ããªãï¼å 3064 ¨å²è¾¼ã¿ããã¯ç¶æ 3065 ãNMIã®å¦çä¸ã«çºçããCPUä¾å¤ã®å ´åã«ã¯ï¼ 3066 ãã¬ã¼ã¹ãã°åå¾å¦çãå¼ã³åºãã¦ã¯ãªããªãï¼ 3067 3068 CPUä¾å¤ãã³ãã©ãå®è¡ããéã«çµç±ããé¨åã§ã¯ï¼CPUä¾å¤ãèµ·ããå¯è½æ§ã 3069 極åæ¸ããã¨ã¨ãã«ï¼CPUä¾å¤ãèµ·ããå¯è½æ§ãããå ´åï¼ä¾ãã°ï¼ã¹ã¯ã©ãã 3070 ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åããæã«ï¼ãã¹ã¨ã©ã¼ãªã©ã®CPUä¾å¤ãçºçããå¯è½ 3071 æ§ãèããããï¼ã«ã¯ï¼ãã®å¯è½æ§ãã¿ã¼ã²ããä¾åé¨ã®ã¦ã¼ã¶ã¼ãºããã¥ã¢ 3072 ã«ã«è¨è¼ããªããã°ãªããªãï¼ 3073 3074 ret_exc以éã®å¦çã¯ï¼å²è¾¼ã¿ã®åºå 3075 ¥å£å¦çã®ret_int以éã®å¦çã¨ã»ã¼åã㧠3076 ããããï¼ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼å 3077 ±éã®ã«ã¼ãã³ãç¨ãããã¨ãã§ããå¯è½ 3078 æ§ãããï¼ 3079 3080 CPUä¾å¤ã®åºå 3081 ¥å£å¦çãã¢ã»ã³ããªè¨èªã§è¨è¿°ããå ´åã«ã¯ï¼ãã¬ã¼ã¹ãã°åå¾ 3082 å¦çã¯ï¼ã6.2 ãã¬ã¼ã¹ãã°æ©è½ã¸ã®å¯¾å¿ãã®ç¯ã§è¨è¿°ããæ¹æ³ã§ã³ã¼ãã£ã³ 3083 ã°ãããã¨ï¼ 3084 3085 6.7.2 CPUä¾å¤ãã³ãã©ã®åºå 3086 ¥å£å¦çã®çæ 3087 3088 CPUä¾å¤ãã¯ãã«ããã¼ãã¦ã§ã¢ã§å®ç¾ãã¦ããå ´åãªã©ï¼CPUä¾å¤ãã³ãã©æ¯ 3089 ã«åºå 3090 ¥å£å¦çãç¨æããæ¹ãå¹çãè¯ãã¿ã¼ã²ããã®ããã«ï¼CPUä¾å¤ãã³ãã© 3091 æ¯ã«åºå 3092 ¥å£å¦çãçæããæ©æ§ãç¨æãã¦ããï¼ 3093 3094 以ä¸ã®ãã¯ãã¯ï¼æ¨æºã®CPUä¾å¤ç®¡çæ©è½ã®åæåå¦çãç¨ããå ´åã®ã¿ï¼ã¿ã¼ 3095 ã²ããéä¾åé¨ã§ä½¿ãããï¼CPUä¾å¤ç®¡çæ©è½ã®åæåå¦çãã¿ã¼ã²ããä¾åé¨ 3096 ã§ç¨æãï¼ãã®ä¸ã§ãããã®ãã¯ãã使ããªãå ´åã«ã¯ï¼ãããã®ãã¯ããç¨ 3097 æããå¿ 3098 è¦ã¯ãªãï¼ 2412 CPU例外ハンドラは,非コンテキストに切り換えることを除いては,CPU例外発 2413 生時と同じシステム状態で呼び出さなければならない.例えば,CPU例外がCPU 2414 ロック状態で発生した場合にはCPUロック状態,CPUロック解除状態で発生した 2415 場合にはCPUロック解除状態で,CPU例外ハンドラを呼び出さなければならない. 2416 CPUロック状態で発生したCPU例外は,カーネル管理外のCPU例外となるため,カー 2417 ネル管理のCPU例外ハンドラについては,CPUロック解除状態で呼び出すことに 2418 なる. 2419 2420 ターゲットによっては,カーネル管理外のCPU例外を正確に判定するのが難しい 2421 場合がある.このような場合には,割込み優先度マスクが全解除でない状態で 2422 発生したCPU例外を,カーネル管理外のCPU例外と扱っても支障がない.これは, 2423 割込み優先度マスクが全解除でない場合には,xsns_dpn,xsns_xpnともtrueを 2424 返すため,アプリケーションからはカーネル管理外のCPU例外と区別できないた 2425 めである. 2426 2427 具体的には,全割込みロック(またはCPUロック)を小さいオーバヘッドで実現 2428 しようとすると,CPU例外ハンドラの中で,全割込みロック状態(またはCPUロッ 2429 ク状態)と割込み優先度マスクを高いレベルに設定した状態を区別できない場 2430 合がある.また,カーネル管理外の割込み処理中やカーネル実行中であること 2431 を正確に判断することも難しい場合がある. 2432 2433 カーネル管理外のCPU例外ハンドラを呼ぶ時に,(*j)において,スタックを非タ 2434 スクコンテキスト用のスタックに切り換え,非タスクコンテキストに切り換え 2435 ているが,この切換えはターゲット定義で省いても良い.これは,カーネル管 2436 理外のCPU例外は,カーネル内のクリティカルセクション中で発生する可能性が 2437 あるため,安全に切り換えられるとは限らないためである.また,カーネル管 2438 理外の割込みハンドラを呼ぶ時のコンテキストやスタックはターゲット依存な 2439 ので,カーネル管理外のCPU例外ハンドラもそれと同様に扱って良いと考えられ 2440 るためである. 2441 2442 上のコードでは,カーネル管理外のCPU例外に対して,トレースログ取得処理 2443 (log_exc_enterおよびlog_exc_leave)を呼び出していないが,全割込みロッ 2444 ク状態かNMIの処理中にCPU例外が発生した場合を除外すれば,呼び出してもか 2445 まわない.全割込みロック状態かNMIの処理中に発生したCPU例外の場合には, 2446 トレースログ取得処理を呼び出してはならない. 2447 2448 CPU例外ハンドラを実行する際に経由する部分では,CPU例外が起こる可能性を 2449 極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,スクラッチ 2450 レジスタをスタックに保存する時に,バスエラーなどのCPU例外が発生する可能 2451 性が考えられる)には,その可能性をターゲット依存部のユーザーズマニュア 2452 ルに記載しなければならない. 2453 2454 ret_exc以降の処理は,割込みの出入口処理のret_int以降の処理とほぼ同じで 2455 あるため,ターゲットによっては,共通のルーチンを用いることができる可能 2456 性がある. 2457 2458 CPU例外の出入口処理をアセンブリ言語で記述する場合には,トレースログ取得 2459 処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン 2460 グすること. 2461 2462 6.7.2 CPU例外ハンドラの出入口処理の生成 2463 2464 CPU例外ベクトルをハードウェアで実現している場合など,CPU例外ハンドラ毎 2465 に出入口処理を用意した方が効率が良いターゲットのために,CPU例外ハンドラ 2466 毎に出入口処理を生成する機構を用意している. 2467 2468 以下のマクロは,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ター 2469 ゲット非依存部で使われる.CPU例外管理機能の初期化処理をターゲット依存部 2470 で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用 2471 意する必要はない. 3099 2472 3100 2473 (6-7-2-1) EXC_ENTRY(excno, exchdr) 3101 2474 3102 CPUä¾å¤ãã³ãã©çªå·ãexcnoï¼CPUä¾å¤ãã³ãã©ã®é¢æ°åãexchdrã§ããCPUä¾ 3103 å¤ãã³ãã©ã®åºå 3104 ¥å£å¦çã®ã©ãã«ãä½ããã¯ãï¼EXCHDR_ENTRYãç¨ãã¦CPUä¾å¤ 3105 ãã³ãã©æ¯ã«åºå 3106 ¥å£å¦çãçæããå ´åã«ã¯ï¼æ¬¡ã®ããã«å®ç¾©ããï¼ 2475 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例 2476 外ハンドラの出入口処理のラベルを作るマクロ.EXCHDR_ENTRYを用いてCPU例外 2477 ハンドラ毎に出入口処理を生成する場合には,次のように定義する. 3107 2478 3108 2479 #define EXC_ENTRY(excno, exchdr) _kernel_##exchdr##_##excno 3109 2480 3110 CPUä¾å¤ãã³ãã©æ¯ã«åºå 3111 ¥å£å¦çãä½ãå¿ 3112 è¦ããªãå ´åã«ã¯ï¼æ¬¡ã®ããã«å®ç¾©ã 3113 ã¦ï¼CPUä¾å¤ãã³ãã©ã®é¢æ°åããã®ã¾ã¾è¿ãï¼ 2481 CPU例外ハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し 2482 て,CPU例外ハンドラの関数名をそのまま返す. 3114 2483 3115 2484 #define EXC_ENTRY(excno, exchdr) exchdr … … 3117 2486 (6-7-2-2) EXCHDR_ENTRY(excno, excno_num, exchdr) 3118 2487 3119 CPUä¾å¤ãã³ãã©çªå·ãexcnoï¼CPUä¾å¤ãã³ãã©ã®é¢æ°åãexchdrã§ããCPUä¾ 3120 å¤ãã³ãã©ã®åºå 3121 ¥å£å¦çãçæãããã¯ãï¼excno_numã«ã¯ï¼ã¢ã»ã³ããªè¨èªè¨ 3122 è¿°ç¨ã«ï¼CPUä¾å¤ãã³ãã©çªå·ãæ°å¤ã§æ¸¡ãããï¼CPUä¾å¤ãã³ãã©æ¯ã«åºå 3123 ¥å£ 3124 å¦çãä½ãå¿ 3125 è¦ããªãå ´åã«ã¯ï¼ç©ºã«å®ç¾©ããï¼ 3126 3127 6.7.3 CPUä¾å¤ãã³ãã©ã®è¨å® 3128 3129 (6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)ï¼ãªãã·ã§ã³ï¼ 3130 3131 excnoãï¼DEF_EXCã«å¯¾ããCPUä¾å¤ãã³ãã©çªå·ã¨ãã¦æå¹ãªå¤ã§ããå ´åã« 3132 trueï¼ããã§ãªãå ´åã«falseãè¿ããã¯ãï¼ 3133 3134 ASPã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ã¯ï¼ãã®ãã¯ãã¯ä½¿ããã¦ããªãããï¼ã¿ã¼ 3135 ã²ããä¾åé¨ã§ä½¿ããªããªãï¼ç¨æããå¿ 3136 è¦ããªãï¼ 2488 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例 2489 外ハンドラの出入口処理を生成するマクロ.excno_numには,アセンブリ言語記 2490 述用に,CPU例外ハンドラ番号が数値で渡される.CPU例外ハンドラ毎に出入口 2491 処理を作る必要がない場合には,空に定義する. 2492 2493 6.7.3 CPU例外ハンドラの設定 2494 2495 (6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)(オプション) 2496 2497 excnoが,DEF_EXCに対するCPU例外ハンドラ番号として有効な値である場合に 2498 true,そうでない場合にfalseを返すマクロ. 2499 2500 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター 2501 ゲット依存部で使わないなら,用意する必要がない. 3137 2502 3138 2503 (6-7-3-2) void x_define_exc(EXCNO excno, FP exc_entry) 3139 2504 3140 excnoã§æå®ãããCPUä¾å¤ãã³ãã©ã®åºå 3141 ¥å£å¦çã®çªå°ãexc_entryã«è¨å®ããï¼ 3142 3143 ãã®é¢æ°ã¯ï¼æ¨æºã®CPUä¾å¤ç®¡çæ©è½ã®åæåå¦çãç¨ããå ´åã®ã¿ï¼ã¿ã¼ã²ã 3144 ãéä¾åé¨ããå¼ã³åºãããï¼CPUä¾å¤ç®¡çæ©è½ã®åæåå¦çãã¿ã¼ã²ããä¾å 3145 é¨ã§ç¨æãï¼ãã®ä¸ã§ãã®é¢æ°ãå¼ã³åºããªãå ´åã«ã¯ï¼ãã®é¢æ°ãç¨æãã 3146 å¿ 3147 è¦ã¯ãªãï¼ 3148 3149 ãã®é¢æ°ã¯ï¼ã¿ã¼ã²ããéä¾åé¨ã®ã«ã¼ãã«åæåå¦çããå¼ã³åºãããããï¼ 3150 ã«ã¼ãã«ã®åæåå¦çï¼NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ã¯ããã¦ããï¼ããå¼ 3151 ã³åºããããã«å®è£ 3152 ããã°ããï¼ 3153 3154 æå®ãããCPUä¾å¤ãã³ãã©çªå·ãDEF_EXCã«å¯¾ãããã®ã¨ãã¦æå¹ãªå¤ã§ãªã 3155 å ´åã®åä½ã¯ä¿è¨¼ããå¿ 3156 è¦ããªãï¼assertã§ã¨ã©ã¼ã¨ããã®ãæã¾ããï¼ï¼ã 3157 ãã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãï¼ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾å 3158 é¨ã§å®ç¾©ããEXCNO_DEFEXC_VALIDãç¨ãã¦ã¨ã©ã¼ãæ¤åºããããã§ããï¼ 3159 3160 6.7.4 CPUä¾å¤ç®¡çæ©è½ã®åæåå¦çã®å¤æ´ 3161 3162 (6-7-4-1) OMIT_INITIALIZE_EXCEPTIONï¼ãªãã·ã§ã³ï¼ 3163 3164 CPUä¾å¤ç®¡çæ©è½ã®åæåå¦çãã¿ã¼ã²ããä¾åé¨ã§ç¨æãï¼ã¿ã¼ã²ããéä¾å 3165 é¨ã«å«ã¾ããæ¨æºã®å²è¾¼ã¿ç®¡çæ©è½ã®åæåå¦çãç¨ããªãå ´åã«ã¯ï¼ãã®ã· 3166 ã³ãã«ããã¯ãå®ç¾©ããï¼ 3167 3168 ãã®ã·ã³ãã«ããã¯ãå®ç¾©ããã¨ï¼EXCINIBã¨initialize_exceptionã®å®ç¾©ãï¼ 3169 ã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ããåãé¤ãããï¼ã¾ãï¼TNUM_EXCNOï¼ 3170 tnum_excnoï¼excinib_tableã®å®ç¾©ã¨ï¼CPUä¾å¤ãã³ãã©æ¯ã®åºå 3171 ¥å£å¦çãçæ 3172 ããããã®è¨è¿°ï¼EXCHDR_ENTRYãã¯ãã®ãªã¹ãï¼ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ã 3173 ã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ã«ãã£ã¦kernel_cfg.cã«çæ 3174 ãããªããªãï¼ 3175 3176 (6-7-4-2) void initialize_exception(void)ï¼ãªãã·ã§ã³ï¼ 3177 3178 OMIT_INITIALIZE_EXCEPTIONããã¯ãå®ç¾©ããå ´åã«ã¯ï¼ãã®é¢æ°ãã¿ã¼ã²ãã 3179 ä¾åé¨ã§ç¨æããï¼OMIT_INITIALIZE_EXCEPTIONããã¯ãå®ç¾©ãããã¨ã«ããå 3180 ãé¤ããããã®ä»ã®ãã¼ã¿åï¼å¤æ°ï¼ãã¯ãã¯ï¼ãã®é¢æ°ã§ä½¿ç¨ããå ´åã«ã® 3181 ã¿ç¨æããã°ããï¼ 3182 3183 6.7.5 ããã©ã«ãã®CPUä¾å¤ãã³ãã© 3184 3185 (6-7-5-1) void default_exc_handler(void *p_excinf)ï¼ãªãã·ã§ã³ï¼ 3186 3187 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã«ããCPUä¾å¤ãã³ãã©ã®ãã¼ãã«ãçæããå ´åãªã©ã«ã¯ï¼ 3188 CPUä¾å¤ãã³ãã©ãç»é²ããªãã£ãCPUä¾å¤ãã³ãã©çªå·ã«å¯¾ãã¦ï¼ããã©ã«ã 3189 ã®CPUä¾å¤ãã³ãã©ã¨ãã¦ï¼default_exc_handlerãç»é²ããï¼ 3190 3191 default_exc_handlerã¯ï¼æ¨æºã®ãã®ãã¿ã¼ã²ããä¾åé¨ã§ç¨æãããï¼ã¦ã¼ã¶ 3192 ãç¨æãããã®ã§ç½®ãæããããããã«ï¼OMIT_DEFAULT_EXC_HANDLERããã¯ã 3193 å®ç¾©ããå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ããªãããã«ããï¼ãªãï¼ã¦ã¼ã¶ 3194 ãç¨æããå ´åã®å称ã¯ï¼_kernel_default_exc_handlerã¨ãªãï¼ 3195 3196 6.7.6 CPUä¾å¤çºçæã®ã·ã¹ãã ç¶æ 3197 ã®åç 3198 § 2505 excnoで指定されたCPU例外ハンドラの出入口処理の番地をexc_entryに設定する. 2506 2507 この関数は,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ターゲッ 2508 ト非依存部から呼び出される.CPU例外管理機能の初期化処理をターゲット依存 2509 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する 2510 必要はない. 2511 2512 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため, 2513 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼 2514 び出せるように実装すればよい. 2515 2516 指定されたCPU例外ハンドラ番号がDEF_EXCに対するものとして有効な値でない 2517 場合の動作は保証する必要がない(assertでエラーとするのが望ましい).こ 2518 れは,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存 2519 部で定義するEXCNO_DEFEXC_VALIDを用いてエラーを検出するためである. 2520 2521 6.7.4 CPU例外管理機能の初期化処理の変更 2522 2523 (6-7-4-1) OMIT_INITIALIZE_EXCEPTION(オプション) 2524 2525 CPU例外管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存 2526 部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ 2527 ンボルをマクロ定義する. 2528 2529 このシンボルをマクロ定義すると,EXCINIBとinitialize_exceptionの定義が, 2530 カーネルのターゲット非依存部から取り除かれる.また,TNUM_EXCNO, 2531 tnum_excno,excinib_tableの定義と,CPU例外ハンドラ毎の出入口処理を生成 2532 するための記述(EXCHDR_ENTRYマクロのリスト)を,コンフィギュレータのパ 2533 ス2のテンプレートファイルのターゲット非依存部によってkernel_cfg.cに生成 2534 されなくなる. 2535 2536 (6-7-4-2) void initialize_exception(void)(オプション) 2537 2538 OMIT_INITIALIZE_EXCEPTIONをマクロ定義した場合には,この関数をターゲット 2539 依存部で用意する.OMIT_INITIALIZE_EXCEPTIONをマクロ定義することにより取 2540 り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの 2541 み用意すればよい. 2542 2543 6.7.5 デフォルトのCPU例外ハンドラ 2544 2545 (6-7-5-1) void default_exc_handler(void *p_excinf)(オプション) 2546 2547 コンフィギュレータによりCPU例外ハンドラのテーブルを生成する場合などには, 2548 CPU例外ハンドラを登録しなかったCPU例外ハンドラ番号に対して,デフォルト 2549 のCPU例外ハンドラとして,default_exc_handlerを登録する. 2550 2551 default_exc_handlerは,標準のものをターゲット依存部で用意するが,ユーザ 2552 が用意したもので置き換えられるように,OMIT_DEFAULT_EXC_HANDLERをマクロ 2553 定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ 2554 が用意する場合の名称は,_kernel_default_exc_handlerとなる. 2555 2556 6.7.6 CPU例外発生時のシステム状態の参照 3199 2557 3200 2558 (6-7-6-1) bool_t exc_sense_intmask(void *p_excinf) 3201 2559 3202 CPUä¾å¤ã®çºçããæã®ã·ã¹ãã ç¶æ 3203 ãï¼ã«ã¼ãã«å®è¡ä¸ã§ãªãï¼ã¿ã¹ã¯ã³ã³ã 3204 ãã¹ãã§ããï¼å 3205 ¨å²è¾¼ã¿ããã¯ç¶æ 3206 ã§ãªãï¼CPUããã¯ç¶æ 3207 ã§ãªãï¼å²è¾¼ã¿åªå 3208 3209 度ãã¹ã¯å 3210 ¨è§£é¤ç¶æ 3211 ã§ããæã«trueï¼ããã§ãªãæã«falseãè¿ãé¢æ°ï¼ 3212 3213 p_excinfã«ã¯ï¼CPUä¾å¤ã®æ 3214 å ±ãè¨æ¶ãã¦ããé åã®å 3215 é çªå°ã渡ãããï¼ 3216 3217 CPUä¾å¤ãã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿å¦çä¸ã§çºçããå ´åã«ãfalseãè¿ããªã 3218 ãã°ãªããªããã¨ã«æ³¨æãããã¨ï¼ 3219 3220 6.8 ã«ã¼ãã«ã®èµ·åã»çµäºã¨ã¹ã¿ãã¯é åãªã© 3221 3222 (6-8-1) ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã« 3223 3224 ã«ã¼ãã«ã®ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã¯ï¼ã·ã¹ãã ã®ãªã»ããå¾ã«æåã«å®è¡ 3225 ãããããã°ã©ã ã§ããï¼ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã¯ï¼æ¨æºçã«ã¯ï¼ããã»ã 3226 ãµä¾åé¨ã¾ãã¯ãããä¾åé¨ã§ç¨æã以ä¸ã®å¦çãè¡ããï¼ããã«ãã ããå¿ 3227 3228 è¦ã¯ãªãï¼å 3229 ·ä½çã«ã¯ï¼éçºç°å¢ã«ç¨æããã¦ããã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã« 3230 ãç¨ããæ¹æ³ï¼ãã®å ´åï¼ã¿ã¼ã²ããä¾åé¨ã§mainé¢æ°ãç¨æããå¿ 3231 è¦ãããï¼ 3232 ãï¼ã¢ããªã±ã¼ã·ã§ã³ã§ç¨æããå ´åãèããããï¼ 3233 3234 (a) ããã»ããµç¶æ 3235 ã®åæå 3236 3237 ããã»ããµã¢ã¼ãï¼ã¹ã¿ãã¯ãã¤ã³ã¿ï¼ãã¬ã¼ã ãã¤ã³ã¿çï¼ããã»ããµã®ç¶ 3238 æ 3239 ãåæåããï¼ã¾ãï¼NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ã¯ããç¶æ 3240 ï¼å 3241 ¨å²è¾¼ã¿ 3242 ããã¯ç¶æ 3243 ã¨åçã®ç¶æ 3244 ï¼ã¨ããï¼DRAMã³ã³ããã¼ã©ã®åæåãªã©ï¼ã¡ã¢ãªã 3245 ã¢ã¯ã»ã¹ããããã«å¿ 3246 è¦ãªåæåå¦çãããã§è¡ã£ã¦ãããï¼æ¬¡ã® 3247 hardware_init_hookã§è¡ã£ã¦ãããï¼ï¼ 3248 3249 (b) hardware_init_hookãå¼ã³åºã 3250 3251 ã·ã¹ãã ã®ãªã»ããå¾ããã«è¡ãå¿ 3252 è¦ã®ããã¿ã¼ã²ããã·ã¹ãã ä¾åã®åæå 3253 å¦çãè¡ãããã«ï¼hardware_init_hookãå¼ã³åºãï¼hardware_init_hookãç¨ 3254 æããã¦ããªãå ´åã¯ï¼ä½ãããªãï¼GNUéçºç°å¢ã§ã¯ï¼ãªã³ã«ã¹ã¯ãªããä¸ã® 3255 weak definitionã«ããï¼hardware_init_hookãç¨æããã¦ããªãå ´åã®å¤ã0 3256 ã¨ãããã¨ã§ï¼ãããå®ç¾ã§ããï¼weak definitionã®æ©è½ãæããªãéçºç°å¢ 3257 ã§ã¯ï¼hardware_init_hookãå¿ 3258 ãå¼ã³åºããã¨ã«ããï¼ 3259 3260 hardware_init_hookã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ç¨æããã®ãæ¨æºã§ãããï¼ã·ã¹ 3261 ãã ã®ãªã»ããå¾ããã«è¡ãå¿ 3262 è¦ã®ããåæåå¦çã追å ããããã«ï¼ã¢ã㪠3263 ã±ã¼ã·ã§ã³ã§ç¨æãããã®ãç¨ããå ´åãããï¼ 3264 3265 ã¡ã¢ãªã¢ã¯ã»ã¹ã«å¿ 3266 è¦ãªåæåå¦çãhardware_init_hookã§è¡ãå ´åã«ã¯ï¼ã 3267 ããå¼ã³åºãæç¹ã§ã¡ã¢ãªã«ã¢ã¯ã»ã¹ãããã¨ãã§ããªãããï¼é¢æ°ï¼ãµãã«ã¼ 3268 ãã³ï¼ãå¼ã³åºãããã«ã¹ã¿ãã¯ã使ç¨ããããã»ããµã§ã¯ï¼æ»ãçªå°ãæ±ç¨ 3269 ã¬ã¸ã¹ã¿ã«å 3270 ¥ãã¦å¼ã³åºãã¨ãã£ã工夫ãå¿ 3271 è¦ã§ããï¼ãã®å ´åï¼ 3272 hardware_init_hookãCè¨èªã§è¨è¿°ãããã¨ã¯ã§ããªããªããï¼ãããããªãï¼ 3273 3274 (c) bssã»ã¯ã·ã§ã³ã¨dataã»ã¯ã·ã§ã³ã®åæå 3275 3276 bssã»ã¯ã·ã§ã³ãã¯ãªã¢ãï¼dataã»ã¯ã·ã§ã³ã«åæå¤ãè¨å®ããï¼ 3277 3278 ãã ãï¼ã«ã¼ãã«æ¬ä½ã¯ï¼kerflgãfalseï¼ï¼0ï¼ã«åæåããããã¨ä»¥å¤ã«ï¼ 3279 ãããã®ã»ã¯ã·ã§ã³ãåæåããããã¨ã«ä¾åãã¦ããªãããï¼ã¹ã¿ã¼ãã¢ã 3280 ãã¢ã¸ã¥ã¼ã«ãã¢ããªã±ã¼ã·ã§ã³ã§ç¨æããå ´åã§ï¼ã·ã¹ãã ãµã¼ãã¹ãã¢ã 3281 ãªã±ã¼ã·ã§ã³ããããã®ã»ã¯ã·ã§ã³ãåæåããããã¨ã«ä¾åãã¦ããªãå ´å 3282 ã«ã¯ï¼ã·ã¹ãã ã®èµ·åæéãç縮ããããã«ï¼kerflgãfalseã«åæåããã ã 3283 ã§ååã§ããï¼ 3284 3285 (d) software_init_hookãå¼ã³åºã 3286 3287 éçºç°å¢ï¼ç¹ã«ã©ã¤ãã©ãªï¼ã«ä¾åãã¦å¿ 3288 è¦ãªåæåå¦çãè¡ãããã«ï¼ 3289 software_init_hookãå¼ã³åºãï¼software_init_hookãç¨æããã¦ããªãå ´å 3290 ã¯ï¼ä½ãããªãï¼GNUéçºç°å¢ã§ã¯ï¼ãªã³ã«ã¹ã¯ãªããä¸ã®weak definitionã« 3291 ããï¼software_init_hookãç¨æããã¦ããªãå ´åã®å¤ã0ã¨ãããã¨ã§ï¼ãã 3292 ãå®ç¾ã§ããï¼weak definitionã®æ©è½ãæããªãéçºç°å¢ã§ã¯ï¼ 3293 software_init_hookãå¿ 3294 ãå¼ã³åºããã¨ã«ããï¼ 3295 3296 software_init_hookã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ç¨æããã®ãæ¨æºã§ããï¼ 3297 3298 (e) sta_kerã¸åå² 3299 3300 sta_kerãå¼ã³åºãï¼sta_kerã¯ï¼NMIãé¤ããã¹ã¦ã®å²è¾¼ã¿ããã¹ã¯ããç¶æ 3301 3302 ï¼å 3303 ¨å²è¾¼ã¿ããã¯ç¶æ 3304 ã¨åçã®ç¶æ 3305 ï¼ã§å¼ã³åºããªããã°ãªããªãï¼sta_kerã 3306 ãã¯ãªã¿ã¼ã³ãããã¨ããªãããï¼ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã«æ»ã£ã¦ããã 3307 ã¨ã¯èããå¿ 3308 è¦ããªãï¼ 2560 CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコンテ 2561 キストであり,全割込みロック状態でなく,CPUロック状態でなく,割込み優先 2562 度マスク全解除状態である時にtrue,そうでない時にfalseを返す関数. 2563 2564 p_excinfには,CPU例外の情報を記憶している領域の先頭番地が渡される. 2565 2566 CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返さなけ 2567 ればならないことに注意すること. 2568 2569 6.8 カーネルの起動・終了とスタック領域など 2570 2571 (6-8-1) スタートアップモジュール 2572 2573 カーネルのスタートアップモジュールは,システムのリセット後に最初に実行 2574 されるプログラムである.スタートアップモジュールは,標準的には,プロセッ 2575 サ依存部またはチップ依存部で用意し以下の処理を行うが,それにこだわる必 2576 要はない.具体的には,開発環境に用意されているスタートアップモジュール 2577 を用いる方法(この場合,ターゲット依存部でmain関数を用意する必要がある) 2578 や,アプリケーションで用意する場合が考えられる. 2579 2580 (a) プロセッサ状態の初期化 2581 2582 プロセッサモード,スタックポインタ,フレームポインタ等,プロセッサの状 2583 態を初期化する.また,NMIを除くすべての割込みをマスクした状態(全割込み 2584 ロック状態と同等の状態)とする.DRAMコントローラの初期化など,メモリを 2585 アクセスするために必要な初期化処理をここで行ってもよい(次の 2586 hardware_init_hookで行ってもよい). 2587 2588 (b) hardware_init_hookを呼び出す 2589 2590 システムのリセット後すぐに行う必要のあるターゲットシステム依存の初期化 2591 処理を行うために,hardware_init_hookを呼び出す.hardware_init_hookが用 2592 意されていない場合は,何もしない.GNU開発環境では,リンカスクリプト中の 2593 weak definitionにより,hardware_init_hookが用意されていない場合の値を0 2594 とすることで,これを実現できる.weak definitionの機能を持たない開発環境 2595 では,hardware_init_hookを必ず呼び出すことにする. 2596 2597 hardware_init_hookは,ターゲット依存部で用意するのが標準であるが,シス 2598 テムのリセット後すぐに行う必要のある初期化処理を追加するために,アプリ 2599 ケーションで用意したものを用いる場合もある. 2600 2601 メモリアクセスに必要な初期化処理をhardware_init_hookで行う場合には,こ 2602 れを呼び出す時点でメモリにアクセスすることができないため,関数(サブルー 2603 チン)を呼び出すためにスタックを使用するプロセッサでは,戻り番地を汎用 2604 レジスタに入れて呼び出すといった工夫が必要である.この場合, 2605 hardware_init_hookをC言語で記述することはできなくなるが,やむをえない. 2606 2607 (c) bssセクションとdataセクションの初期化 2608 2609 bssセクションをクリアし,dataセクションに初期値を設定する. 2610 2611 ただし,カーネル本体は,kerflgがfalse(=0)に初期化されること以外に, 2612 これらのセクションが初期化されることに依存していないため,スタートアッ 2613 プモジュールをアプリケーションで用意する場合で,システムサービスやアプ 2614 リケーションがこれらのセクションが初期化されることに依存していない場合 2615 には,システムの起動時間を短縮するために,kerflgをfalseに初期化するだけ 2616 で十分である. 2617 2618 (d) software_init_hookを呼び出す 2619 2620 開発環境(特にライブラリ)に依存して必要な初期化処理を行うために, 2621 software_init_hookを呼び出す.software_init_hookが用意されていない場合 2622 は,何もしない.GNU開発環境では,リンカスクリプト中のweak definitionに 2623 より,software_init_hookが用意されていない場合の値を0とすることで,これ 2624 を実現できる.weak definitionの機能を持たない開発環境では, 2625 software_init_hookを必ず呼び出すことにする. 2626 2627 software_init_hookは,ターゲット依存部で用意するのが標準である. 2628 2629 (e) sta_kerへ分岐 2630 2631 sta_kerを呼び出す.sta_kerは,NMIを除くすべての割込みをマスクした状態 2632 (全割込みロック状態と同等の状態)で呼び出さなければならない.sta_kerか 2633 らはリターンすることがないため,スタートアップモジュールに戻ってくるこ 2634 とは考える必要がない. 3309 2635 3310 2636 (6-8-2) void target_initialize(void) 3311 2637 3312 ã¿ã¼ã²ããä¾åé¨ã®åæåãè¡ãé¢æ°ï¼sta_kerã®æåã§å¼ã³åºãããï¼ããã»ã 3313 ãµã»ãããã»éçºç°å¢ä¾åã®åæåå¦çãï¼ãããã®ä¾åé¨ã«åãåããã㨠3314 ãå¯è½ã§ããï¼ 3315 3316 ãã®é¢æ°ã¯ï¼ããã¾ã§ãã«ã¼ãã«ã®ã¿ã¼ã²ããä¾åé¨ã®åæåå¦çãè¡ããã 3317 ã®ãã®ã§ããï¼ã¢ããªã±ã¼ã·ã§ã³ã«å¿ 3318 è¦ãªåæåå¦çã¯ï¼åæåã«ã¼ãã³ã§è¡ 3319 ãã®ãåºæ¬ã§ãããï¼ã·ã¹ãã ã®ãªã»ããå¾ããã«è¡ãå¿ 3320 è¦ãããå ´åã«ã¯ï¼ 3321 hardware_init_hookãç¨ããï¼ 2638 ターゲット依存部の初期化を行う関数.sta_kerの最初で呼び出される.プロセッ 2639 サ・チップ・開発環境依存の初期化処理を,それらの依存部に切り分けること 2640 も可能である. 2641 2642 この関数は,あくまでもカーネルのターゲット依存部の初期化処理を行うため 2643 のものである.アプリケーションに必要な初期化処理は,初期化ルーチンで行 2644 うのが基本であるが,システムのリセット後すぐに行う必要がある場合には, 2645 hardware_init_hookを用いる. 3322 2646 3323 2647 (6-8-3) void call_exit_kernel(void) 3324 2648 3325 éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã¦ï¼exit_kernelã¸åå²ããé¢æ°ï¼ext_kerã 3326 ãå¼ã³åºãããï¼exit_kernelããã¯ãªã¿ã¼ã³ãããã¨ããªãããï¼ãã®é¢æ°ã« 3327 æ»ã£ã¦ãããã¨ã¯èããå¿ 3328 è¦ããªãï¼ 3329 3330 éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæããã®ã¯ï¼çµäºå¦çã«ã¼ãã³ãï¼éã¿ã¹ã¯ã³ã³ 3331 ããã¹ãç¨ã®ã¹ã¿ãã¯ã§å®è¡ããããã§ããï¼çµäºå¦çã«ã¼ãã³ãã¿ã¹ã¯ç¨ã® 3332 ã¹ã¿ãã¯ã§å®è¡ããã¨ï¼åã¿ã¹ã¯ã®ã¹ã¿ãã¯é åã®ãµã¤ãºã決å®ããéã«ï¼çµ 3333 äºå¦çã«ã¼ãã³ã使ç¨ããã¹ã¿ãã¯é åãèæ 3334 ®ããªããã°ãªããªãï¼ããã«ã¯ï¼ 3335 çµäºå¦çã«ã¼ãã³ã使ç¨ããã¹ã¿ãã¯é åã大ããå ´åã«åã¿ã¹ã¯ã®ã¹ã¿ã㯠3336 é åãç¡é§ã«å¤§ããããªããã°ãªããªããã¨ã«å ãã¦ï¼æå³ããªãã¹ã¿ãã¯ãªã¼ 3337 ãã¼ããã¼ãçºçããå¯è½æ§ãé«ããã¨ããåé¡ãããï¼ 3338 3339 ãã®é¢æ°ã¯ï¼å 3340 ¨å²è¾¼ã¿ããã¯ç¶æ 3341 ã§å¼ã°ããããï¼å 3342 ¨å²è¾¼ã¿ããã¯ç¶æ 3343 ããå¼ 3344 ã³åºããã¨ãã§ããªãé¢æ°ãå¼ã°ãªãããã«å®è£ 3345 ããªããã°ãªããªãï¼ 2649 非タスクコンテキストに切り換えて,exit_kernelへ分岐する関数.ext_kerか 2650 ら呼び出される.exit_kernelからはリターンすることがないため,この関数に 2651 戻ってくることは考える必要がない. 2652 2653 非タスクコンテキストに切り換えるのは,終了処理ルーチンを,非タスクコン 2654 テキスト用のスタックで実行するためである.終了処理ルーチンをタスク用の 2655 スタックで実行すると,各タスクのスタック領域のサイズを決定する際に,終 2656 了処理ルーチンが使用するスタック領域を考慮しなければならない.これには, 2657 終了処理ルーチンが使用するスタック領域が大きい場合に各タスクのスタック 2658 領域を無駄に大きくしなければならないことに加えて,意図しないスタックオー 2659 バーフローが発生する可能性を高めるという問題がある. 2660 2661 この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼 2662 び出すことができない関数を呼ばないように実装しなければならない. 3346 2663 3347 2664 (6-8-4) void target_exit(void) 3348 2665 3349 ã¿ã¼ã²ããä¾åé¨ã®çµäºå¦çãè¡ãé¢æ°ï¼ãã®é¢æ°ã¯ï¼ã«ã¼ãã«çµäºå¦çã®æ 3350 å¾ã«å¼ã³åºããï¼ãªã¿ã¼ã³ãã¦ã¯ãªããªãï¼ããã»ããµã»ãããã»éçºç°å¢ä¾ 3351 åã®çµäºå¦çãï¼ãããã®ä¾åé¨ã«åãåãããã¨ãå¯è½ã§ããï¼ 3352 3353 ãã®é¢æ°ã§ã¯ï¼æåã«ï¼atexitã«ãã£ã¦ç»é²ãããé¢æ°ã¨ãã¹ãã©ã¯ã¿ãå¼ã³ 3354 åºããã¨ãæå³ãã¦ããï¼æ¨æºçã«ã¯ï¼software_term_hookãå¼ã³åºãï¼ 3355 software_term_hookãç¨æããã¦ããªãå ´åã¯ï¼ä½ãããªãï¼GNUéçºç°å¢ã§ã¯ï¼ 3356 ãªã³ã«ã¹ã¯ãªããä¸ã®weak definitionã«ããï¼software_term_hookãç¨æãã 3357 ã¦ããªãå ´åã®å¤ã0ã¨ãããã¨ã§ï¼ãããå®ç¾ã§ããï¼weak definitionã®æ© 3358 è½ãæããªãéçºç°å¢ã§ã¯ï¼software_term_hookãå¿ 3359 ãå¼ã³åºããã¨ã«ããï¼ 3360 3361 ãã®é¢æ°ã¯ï¼å 3362 ¨å²è¾¼ã¿ããã¯ç¶æ 3363 ã§å¼ã°ããããï¼å 3364 ¨å²è¾¼ã¿ããã¯ç¶æ 3365 ããå¼ 3366 ã³åºããã¨ãã§ããªãé¢æ°ãå¼ã°ãªãããã«å®è£ 3367 ããªããã°ãªããªãï¼ 3368 3369 6.9 ã«ã¼ãã«å 3370 é¨ã®ãã¥ã¼ãã³ã° 3371 3372 6.9.1 ãããããããµã¼ã 3373 3374 (6-9-1-1) OMIT_BITMAP_SEARCHï¼ãªãã·ã§ã³ï¼ 3375 (6-9-1-2) uint_t bitmap_search(uint16_t bitmap)ï¼ãªãã·ã§ã³ï¼ 3376 3377 ã¿ã¼ã²ããéä¾åé¨ã§ï¼uint16_tåã®æ´æ°å¤ï¼bitmapï¼ä¸ã®1ã®ãããã®å 3378 ï¼æ 3379 ãä¸ä½ï¼å³ï¼ã®ãã®ããµã¼ããï¼ãã®ãããçªå·ãè¿ãé¢æ°bitmap_searchãç¨ 3380 æãã¦ããï¼ããã§ï¼ãããçªå·ã¯æä¸ä½ãããã0ã¨ãï¼bitmapã«0ãæå®ã 3381 ã¦ã¯ãªããªããã®ã¨ãã¦ããï¼ 3382 3383 ããããµã¼ãå½ä»¤ãæã¤ããã»ããµã§ã¯ï¼bitmap_searchãï¼ããããµã¼ãå½ä»¤ 3384 ã使ãããã«æ¸ãç´ããæ¹ãå¹çãè¯ãå ´åãããï¼ãã®ãããªå ´åã«ã¯ï¼ã¿ã¼ 3385 ã²ããä¾åé¨ã§ããããµã¼ãå½ä»¤ã使ã£ãbitmap_searchãå®ç¾©ãï¼ 3386 OMIT_BITMAP_SEARCHããã¯ãå®ç¾©ããï¼ 3387 3388 æ¨æºã©ã¤ãã©ãªã«ããããµã¼ãå½ä»¤ãç¨ããffsãããå ´åï¼bitmap_searchã 3389 (ffs(bitmap) - 1)ã«å®ç¾©ããã¨ããï¼ 3390 3391 (6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)ï¼ãªãã·ã§ã³ï¼ 3392 3393 ããããµã¼ãå½ä»¤ã®ãµã¼ãæ¹åãéãªã©ã®çç±ã§ï¼åªå 3394 度ã¨ãããã¨ã®å¯¾å¿ã 3395 å¤æ´ãããå ´åã«ã¯ï¼PRIMAP_BITããã¯ãå®ç¾©ããï¼ 3396 3397 6.9.2 ããããã£ã¼ã«ã 3398 3399 (6-9-2-1) BIT_FIELD_UINTï¼ãªãã·ã§ã³ï¼ 3400 3401 8ããã以ä¸ã®å¹ 3402 ã®ããããã£ã¼ã«ãã§ï¼ç¬¦å·ç¡ãæ´æ°å¤ãä¿æãããå ´åã«ç¨ 3403 ããã¹ããã¼ã¿åï¼ããã©ã«ãã®å®ç¾©ã¯unsigned intã¨ãªã£ã¦ãããï¼ã¿ã¼ã²ã 3404 ãããã¼ã«ä¾åã§ï¼unsigned charã¾ãã¯unsigned shortã«å®ç¾©ããæ¹ãå¹çã 3405 è¯ãå ´åãããï¼ 3406 3407 (6-9-2-2) BIT_FIELD_BOOLï¼ãªãã·ã§ã³ï¼ 3408 3409 1ãããå¹ 3410 ã®ããããã£ã¼ã«ãã§ï¼ãã¼ã«å¤ãä¿æãããå ´åã«ç¨ããã¹ããã¼ 3411 ã¿åï¼ããã©ã«ãã§ã¯BIT_FIELD_UINTã¨åä¸ã«å®ç¾©ãã¦ãããï¼ãã¼ã«å¤ãä¿ 3412 æãããã¨ãæ示ããããã«å¥ã®ååã¨ãã¦ããï¼ 3413 3414 (6-9-2-3) TBIT_TCB_PRIORITYï¼ãªãã·ã§ã³ï¼ 3415 3416 ç¾å¨åªå 3417 度ï¼ããã³ï¼ãã¥ã¼ããã¯ã¹æ¡å¼µã«ããããã¼ã¹åªå 3418 度ï¼ãä¿æãã 3419 ããã®TCBä¸ã®ãã£ã¼ã«ãã®ãããæ°ï¼ããã©ã«ãã§ã¯8ãããã«å®ç¾©ãã¦ãã 3420 ãï¼ãã以å¤ã«å®ç¾©ãããå ´åã«ï¼ãããæ°ããã®ååã«ãã¯ãå®ç¾©ããï¼ 3421 3422 6.10 ã«ã¼ãã«å®è£ 3423 ã«é¢ãããã®ä»ã®å®ç¾© 3424 3425 6.10.1 ã¿ã¼ã²ããä¾åã®ãªãã¸ã§ã¯ãå±æ§ 3426 3427 (6-10-1-1) TARGET_TSKATRï¼ãªãã·ã§ã³ï¼ ã¿ã¼ã²ããå®ç¾©ã®ã¿ã¹ã¯å±æ§ 3428 (6-10-1-2) TARGET_ISRATRï¼ãªãã·ã§ã³ï¼ ã¿ã¼ã²ããå®ç¾©ã®ISRå±æ§ 3429 (6-10-1-3) TARGET_INHATRï¼ãªãã·ã§ã³ï¼ ã¿ã¼ã²ããå®ç¾©ã®å²è¾¼ã¿ãã³ãã©å±æ§ 3430 (6-10-1-4) TARGET_INTATRï¼ãªãã·ã§ã³ï¼ ã¿ã¼ã²ããå®ç¾©ã®å²è¾¼ã¿å±æ§ 3431 (6-10-1-5) TARGET_EXCATRï¼ãªãã·ã§ã³ï¼ ã¿ã¼ã²ããå®ç¾©ã®CPUä¾å¤ãã³ãã©å±æ§ 3432 3433 åãªãã¸ã§ã¯ãã®å±æ§ãï¼ã¿ã¼ã²ããå®ç¾©ã«æ¡å¼µããå ´åã«ï¼è©²å½ãããªãã¸ã§ 3434 ã¯ãå±æ§ã示ãå¤æ°ã«ï¼æ¡å¼µã«ä½¿ç¨ãããããã®è«çåãå®ç¾©ããï¼ããã«ã 3435 ãï¼æ¡å¼µã«ä½¿ç¨ããããããè¨å®ããã¦ããå ´åã«ï¼ã¨ã©ã¼ã«ãªãã®ãé²ãï¼ 3436 3437 ãªãï¼TOPPERSæ°ä¸ä»£ã«ã¼ãã«çµ±åä»æ§æ¸ã§ã¯ï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ï¼ISRï¼ 3438 å±æ§ãã¿ã¼ã²ããå®ç¾©ã§æ¡å¼µã§ããä»æ§ã¨ã¯ãªã£ã¦ããªãï¼ 3439 3440 6.10.2 ã¨ã©ã¼ãã§ãã¯æ¹æ³ã®æå® 3441 3442 (6-10-2-1) TARGET_MIN_STKSZï¼ãªãã·ã§ã³ï¼ 3443 3444 ã¿ã¼ã²ããå®ç¾©ã§ï¼ã¿ã¹ã¯ã®ã¹ã¿ãã¯ãµã¤ãºã®æå°å¤ãè¨å®ããå ´åã«ã¯ï¼ã 3445 ã®å¤æ°ãã¹ã¿ãã¯ãµã¤ãºã®æå°å¤ã«å®ç¾©ããï¼ 3446 3447 (6-10-2-2) TARGET_MIN_ISTKSZï¼ãªãã·ã§ã³ï¼ 3448 3449 ã¿ã¼ã²ããå®ç¾©ã§ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã®ã¹ã¿ãã¯ãµã¤ãºã®æå°å¤ãè¨å®ã 3450 ãå ´åã«ã¯ï¼ãã®å¤æ°ãã¹ã¿ãã¯ãµã¤ãºã®æå°å¤ã«å®ç¾©ããï¼ 3451 3452 (6-10-2-3) CHECK_STKSZ_ALIGNï¼ãªãã·ã§ã³ï¼ 3453 3454 ã¹ã¿ãã¯é åã®ãµã¤ãºãããå¤ï¼ã¢ã©ã¤ã³åä½ï¼ã®åæ°ã§ãªããã°ãªããªãå ´ 3455 åã«ï¼ãã®å¤æ°ãã¢ã©ã¤ã³åä½ã«å®ç¾©ããï¼ãã®å¤æ°ãå®ç¾©ãããã¨ã§ï¼ 3456 kernel.tfããã³acre_tskï¼åççææ©è½æ¡å¼µããã±ã¼ã¸ã®ã¿ï¼ã«ããã¦ï¼ã¹ã¿ã 3457 ã¯é åã®ãµã¤ãºãæ£ãããªãï¼ãã®å¤æ°ã«å®ç¾©ããå¤ã®åæ°ã§ãªãï¼å ´åã®ã¨ 3458 ã©ã¼ããã§ãã¯ããããã«ãªãï¼ãã§ãã¯ãå¿ 3459 è¦ãªãå ´åã«ã¯ï¼ãã®å¤æ°ãå® 3460 義ããªãï¼ 3461 3462 (6-10-2-4) CHECK_FUNC_ALIGNï¼ãªãã·ã§ã³ï¼ å¦çåä½ã®ã¢ã©ã¤ã³åä½ 3463 (6-10-2-5) CHECK_FUNC_NONNULLï¼ãªãã·ã§ã³ï¼ å¦çåä½ã®éNULLãã§ã㯠3464 (6-10-2-6) CHECK_STACK_ALIGNï¼ãªãã·ã§ã³ï¼ ã¹ã¿ãã¯é åã®ã¢ã©ã¤ã³åä½ 3465 (6-10-2-7) CHECK_STACK_NONNULLï¼ãªãã·ã§ã³ï¼ã¹ã¿ãã¯é åã®éNULLãã§ã㯠3466 (6-10-2-8) CHECK_MPF_ALIGNï¼ãªãã·ã§ã³ï¼ åºå®é·ã¡ã¢ãªãã¼ã«é åã®ã¢ã©ã¤ã³åä½ 3467 (6-10-2-9) CHECK_MPF_NONNULLï¼ãªãã·ã§ã³ï¼åºå®é·ã¡ã¢ãªãã¼ã«é åã®éNULLãã§ã㯠3468 3469 å¦çåä½ï¼ã¹ã¿ãã¯é åï¼åºå®é·ã¡ã¢ãªãã¼ã«é åã®å 3470 é çªå°ãããå¤ï¼ã¢ã© 3471 ã¤ã³åä½ï¼ã®åæ°ã§ãªããã°ãªããªãå ´åã«ï¼ããããï¼CHECK_FUNC_ALIGNï¼ 3472 CHECK_STACK_ALIGNï¼CHECK_MPF_ALIGNãã¢ã©ã¤ã³åä½ã«å®ç¾©ããï¼å¦çåä½ï¼ 3473 ã¹ã¿ãã¯é åï¼åºå®é·ã¡ã¢ãªãã¼ã«é åã®å 3474 é çªå°ãNULLã§ãªããã®ãã§ã㯠3475 ãè¡ãå ´åã«ã¯ï¼ããããCHECK_FUNC_NONNULLï¼CHECK_STACK_NONNULLï¼ 3476 CHECK_MPF_NONNULLãå®ç¾©ããï¼ 3477 3478 (6-10-2-10) CHECK_MB_ALIGNï¼ãªãã·ã§ã³ï¼ 管çé åã®ã¢ã©ã¤ã³åä½ 3479 3480 ã«ã¼ãã«å 3481 ã®ç®¡çé åï¼å 3482 ·ä½çã«ã¯ï¼ãã¼ã¿ãã¥ã¼ç®¡çé åï¼åªå 3483 度ãã¼ã¿ 3484 ãã¥ã¼ç®¡çé åï¼åºå®é·ã¡ã¢ãªãã¼ã«ç®¡çé åï¼ã®å 3485 é çªå°ãããå¤ï¼ã¢ã©ã¤ 3486 ã³åä½ï¼ã®åæ°ã§ãªããã°ãªããªãå ´åã«ï¼ãã®å¤æ°ãã¢ã©ã¤ã³åä½ã«å®ç¾©ã 3487 ãï¼åççææ©è½æ¡å¼µããã±ã¼ã¸ã使ç¨ããªãå ´åã«ã¯ï¼å®ç¾©ããå¿ 3488 è¦ããªãï¼ 3489 3490 6.10.3 éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯é å 2666 ターゲット依存部の終了処理を行う関数.この関数は,カーネル終了処理の最 2667 後に呼び出され,リターンしてはならない.プロセッサ・チップ・開発環境依 2668 存の終了処理を,それらの依存部に切り分けることも可能である. 2669 2670 この関数では,最初に,atexitによって登録された関数とデストラクタを呼び 2671 出すことを意図しており,標準的には,software_term_hookを呼び出す. 2672 software_term_hookが用意されていない場合は,何もしない.GNU開発環境では, 2673 リンカスクリプト中のweak definitionにより,software_term_hookが用意され 2674 ていない場合の値を0とすることで,これを実現できる.weak definitionの機 2675 能を持たない開発環境では,software_term_hookを必ず呼び出すことにする. 2676 2677 この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼 2678 び出すことができない関数を呼ばないように実装しなければならない. 2679 2680 6.9 カーネル内部のチューニング 2681 2682 6.9.1 ビットマップサーチ 2683 2684 (6-9-1-1) OMIT_BITMAP_SEARCH(オプション) 2685 (6-9-1-2) uint_t bitmap_search(uint16_t bitmap)(オプション) 2686 2687 ターゲット非依存部で,uint16_t型の整数値(bitmap)中の1のビットの内,最 2688 も下位(右)のものをサーチし,そのビット番号を返す関数bitmap_searchを用 2689 意している.ここで,ビット番号は最下位ビットを0とし,bitmapに0を指定し 2690 てはならないものとしている. 2691 2692 ビットサーチ命令を持つプロセッサでは,bitmap_searchを,ビットサーチ命令 2693 を使うように書き直した方が効率が良い場合がある.このような場合には,ター 2694 ゲット依存部でビットサーチ命令を使ったbitmap_searchを定義し, 2695 OMIT_BITMAP_SEARCHをマクロ定義する. 2696 2697 標準ライブラリにビットサーチ命令を用いたffsがある場合,bitmap_searchを 2698 (ffs(bitmap) - 1)に定義するとよい. 2699 2700 (6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)(オプション) 2701 2702 ビットサーチ命令のサーチ方向が逆などの理由で,優先度とビットとの対応を 2703 変更したい場合には,PRIMAP_BITをマクロ定義する. 2704 2705 6.9.2 ビットフィールド 2706 2707 (6-9-2-1) BIT_FIELD_UINT(オプション) 2708 2709 8ビット以下の幅のビットフィールドで,符号無し整数値を保持したい場合に用 2710 いるべきデータ型.デフォルトの定義はunsigned intとなっているが,ターゲッ 2711 トやツール依存で,unsigned charまたはunsigned shortに定義した方が効率が 2712 良い場合がある. 2713 2714 (6-9-2-2) BIT_FIELD_BOOL(オプション) 2715 2716 1ビット幅のビットフィールドで,ブール値を保持したい場合に用いるべきデー 2717 タ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブール値を保 2718 持することを明示するために別の名前としている. 2719 2720 (6-9-2-3) TBIT_TCB_PRIORITY(オプション) 2721 2722 現在優先度(および,ミューテックス拡張におけるベース優先度)を保持する 2723 ためのTCB中のフィールドのビット数.デフォルトでは8ビットに定義している 2724 が,それ以外に定義したい場合に,ビット数をこの名前にマクロ定義する. 2725 2726 6.10 カーネル実装に関するその他の定義 2727 2728 6.10.1 ターゲット依存のオブジェクト属性 2729 2730 (6-10-1-1) TARGET_TSKATR(オプション) ターゲット定義のタスク属性 2731 (6-10-1-2) TARGET_ISRATR(オプション) ターゲット定義のISR属性 2732 (6-10-1-3) TARGET_INHATR(オプション) ターゲット定義の割込みハンドラ属性 2733 (6-10-1-4) TARGET_INTATR(オプション) ターゲット定義の割込み属性 2734 (6-10-1-5) TARGET_EXCATR(オプション) ターゲット定義のCPU例外ハンドラ属性 2735 2736 各オブジェクトの属性を,ターゲット定義に拡張する場合に,該当するオブジェ 2737 クト属性を示す変数に,拡張に使用するビットの論理和を定義する.これによ 2738 り,拡張に使用するビットが設定されている場合に,エラーになるのを防ぐ. 2739 2740 なお,TOPPERS新世代カーネル統合仕様書では,割込みサービスルーチン(ISR) 2741 属性をターゲット定義で拡張できる仕様とはなっていない. 2742 2743 6.10.2 エラーチェック方法の指定 2744 2745 (6-10-2-1) TARGET_MIN_STKSZ(オプション) 2746 2747 ターゲット定義で,タスクのスタックサイズの最小値を設定する場合には,こ 2748 の変数をスタックサイズの最小値に定義する. 2749 2750 (6-10-2-2) TARGET_MIN_ISTKSZ(オプション) 2751 2752 ターゲット定義で,非タスクコンテキストのスタックサイズの最小値を設定す 2753 る場合には,この変数をスタックサイズの最小値に定義する. 2754 2755 (6-10-2-3) CHECK_STKSZ_ALIGN(オプション) 2756 2757 スタック領域のサイズがある値(アライン単位)の倍数でなければならない場 2758 合に,この変数をアライン単位に定義する.この変数を定義することで, 2759 kernel.tfおよびacre_tsk(動的生成機能拡張パッケージのみ)において,スタッ 2760 ク領域のサイズが正しくない(この変数に定義した値の倍数でない)場合のエ 2761 ラーをチェックするようになる.チェックが必要ない場合には,この変数を定 2762 義しない. 2763 2764 (6-10-2-4) CHECK_FUNC_ALIGN(オプション) 処理単位のアライン単位 2765 (6-10-2-5) CHECK_FUNC_NONNULL(オプション) 処理単位の非NULLチェック 2766 (6-10-2-6) CHECK_STACK_ALIGN(オプション) スタック領域のアライン単位 2767 (6-10-2-7) CHECK_STACK_NONNULL(オプション)スタック領域の非NULLチェック 2768 (6-10-2-8) CHECK_MPF_ALIGN(オプション) 固定長メモリプール領域のアライン単位 2769 (6-10-2-9) CHECK_MPF_NONNULL(オプション)固定長メモリプール領域の非NULLチェック 2770 2771 処理単位/スタック領域/固定長メモリプール領域の先頭番地がある値(アラ 2772 イン単位)の倍数でなければならない場合に,それぞれ,CHECK_FUNC_ALIGN/ 2773 CHECK_STACK_ALIGN/CHECK_MPF_ALIGNをアライン単位に定義する.処理単位/ 2774 スタック領域/固定長メモリプール領域の先頭番地がNULLでないかのチェック 2775 を行う場合には,それぞれCHECK_FUNC_NONNULL/CHECK_STACK_NONNULL/ 2776 CHECK_MPF_NONNULLを定義する. 2777 2778 (6-10-2-10) CHECK_MB_ALIGN(オプション) 管理領域のアライン単位 2779 2780 カーネル内の管理領域(具体的には,データキュー管理領域,優先度データ 2781 キュー管理領域,固定長メモリプール管理領域)の先頭番地がある値(アライ 2782 ン単位)の倍数でなければならない場合に,この変数をアライン単位に定義す 2783 る.動的生成機能拡張パッケージを使用しない場合には,定義する必要がない. 2784 2785 6.10.3 非タスクコンテキスト用のスタック領域 3491 2786 3492 2787 (6-10-3-1) DEFAULT_ISTKSZ 3493 2788 3494 DEF_ICSã«ããéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯é åãæå®ãããªãå ´åã®ï¼ 3495 ããã©ã«ãã®ã¹ã¿ãã¯é åã®ãµã¤ãºï¼ 3496 3497 (6-10-3-2) DEFAULT_ISTKï¼ãªãã·ã§ã³ï¼ 3498 3499 DEF_ICSã«ããéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯é åãæå®ãããªãå ´åã®ï¼ 3500 ããã©ã«ãã®ã¹ã¿ãã¯é åã®å 3501 é çªå°ï¼ãã®ãã¯ããå®ç¾©ãããªãå ´åã«ã¯ï¼ 3502 ãµã¤ãºãDEFAULT_ISTKSZã®ã¹ã¿ãã¯é åãï¼é 3503 åã«ãã確ä¿ãããï¼ 3504 3505 (6-10-3-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)ï¼ãªãã·ã§ã³ï¼ 3506 3507 éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ãã¤ã³ã¿ã®åæå¤ãä¿æããå¤æ°ï¼istkptï¼ 3508 ãç¨ããå ´åã«ï¼ãã®ã·ã³ãã«ã«ï¼ã¹ã¿ãã¯é åã®å 3509 é çªå°ï¼istkï¼ã¨ã¹ã¿ã 3510 ã¯é åã®ãµã¤ãºï¼istkszï¼ããï¼ã¹ã¿ãã¯ãã¤ã³ã¿ã®åæå¤ãæ±ãããã¯ãã 3511 å®ç¾©ããï¼ 3512 3513 6.10.4 空ã©ãã«ã®å®ç¾© 3514 3515 (6-10-4-1) TOPPERS_EMPTY_LABEL(type, symbol)ï¼ãªãã·ã§ã³ï¼ 3516 3517 ãªã³ã¯ã¨ã©ã¼ãé²ãããã«ï¼ãã¼ã¿åtypeã®é 3518 åã§ããå¤æ°symbolã«å®ç¾©ãä¸ 3519 ããããã®ãã¯ãï¼ä¸ããå®ç¾©ãåç 3520 §ããããã¨ã¯ãªãããï¼ã©ã®ãããªå®ç¾© 3521 ãä¸ãã¦ãããï¼ 3522 3523 ããã©ã«ãã§ã¯ï¼symbolãï¼è¦ç´ åãtypeã§ãµã¤ãºã0ã®é 3524 åã«å®ç¾©ãã¦ããï¼ 3525 ãµã¤ãºã0ã®é 3526 åãã¨ã©ã¼ã¨ãªããªãã³ã³ãã¤ã©ï¼GCCã¯ããã«è©²å½ï¼ãç¨ãã 3527 å ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ããå¿ 3528 è¦ã¯ãªãï¼ 3529 3530 6.11 ãã¬ã¼ã¹ãã°æ©è½ã«é¢ããè¨å® 3531 3532 ASPã«ã¼ãã«ã®ã½ã¼ã¹ã³ã¼ãã«ã¯ï¼ã«ã¼ãã«ã®å®è¡ãã¬ã¼ã¹ãã°ãåå¾ãããã 3533 ã®ãã¯ãçãåãè¾¼ãã§ããï¼ããã©ã«ãã§ã¯ï¼ãããã®ãã¯ãã¯ç©ºã«å®ç¾©ã 3534 ãã¦ãã¬ã¼ã¹ãã°ã®åå¾ã¯è¡ããªããï¼ãããã®ãã¯ããé©åã«å®ç¾©ããã㨠3535 ã§ãã¬ã¼ã¹ãã°ã®åå¾ãè¡ããã¨ãã§ããï¼ 3536 3537 6.11.1 åå¾ã§ãããã¬ã¼ã¹ãã°ã®ç¨®é¡ã¨ãã¯ã 3538 3539 åå¾ã§ãããã¬ã¼ã¹ãã°ã®ç¨®é¡ã¨ï¼ãããåå¾ããããã«å®ç¾©ãããã¯ãã¯æ¬¡ 3540 ã®éãã§ããï¼ 3541 3542 (a) ã«ã¼ãã«ã®åä½éå§ã¨çµäº 3543 3544 次ã®ãã¯ããå®ç¾©ãããã¨ã§ï¼ã«ã¼ãã«ã®åä½éå§æã¨çµäºæã®ãã¬ã¼ã¹ãã° 3545 ãåå¾ãããã¨ãã§ããï¼ 3546 3547 LOG_KER_ENTER ã«ã¼ãã«ãåä½ãéå§ããç´åï¼åæåã®å®äºå¾ï¼ 3548 LOG_KER_LEAVE ã«ã¼ãã«ã®çµäºï¼ext_kerï¼ãå¼ã°ããç´å¾ï¼çµäºå¦ 3549 çã®å®è¡åï¼ 3550 3551 (b) å¦çåä½ã®å®è¡éå§ã¨çµäº 3552 3553 次ã®ãã¯ããå®ç¾©ãããã¨ã§ï¼å²è¾¼ã¿ãã³ãã©ï¼INHï¼ï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ã 3554 ã³ï¼ISRï¼ï¼å¨æãã³ãã©ï¼CYCï¼ï¼ã¢ã©ã¼ã ãã³ãã©ï¼ALMï¼ï¼CPUä¾å¤ãã³ã 3555 ã©ï¼EXCï¼ï¼ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ï¼TEXï¼ã®å®è¡éå§åã¨çµäºå¾ã®ãã¬ã¼ã¹ 3556 ãã°ãåå¾ãããã¨ãã§ããï¼ 3557 3558 LOG_<å¦çåä½ç¥å·>_ENTER å¦çåä½ã®å®è¡éå§ç´å 3559 LOG_<å¦çåä½ç¥å·>_LEAVE å¦çåä½ã®çµäºç´å¾ 3560 3561 å²è¾¼ã¿ãã³ãã©ã¯ï¼ã¢ããªã±ã¼ã·ã§ã³ãç»é²ãããã®ã®ã¿ã対象ã¨ãï¼å²è¾¼ã¿ 3562 ãµã¼ãã¹ã«ã¼ãã³ãå¼ã³åºãããã«ã«ã¼ãã«å 3563 ã«çæããããã®ã¯å¯¾è±¡ã¨ã㪠3564 ãï¼ã¿ã¹ã¯ã®å®è¡éå§ã¨çµäºã¯ï¼ä»ã®æ¹æ³ã§åå¾ã§ããããï¼ãã®æ¹æ³ã¯ç¨æ 3565 ãã¦ããªãï¼ 3566 3567 ãªãï¼å²è¾¼ã¿ãã³ãã©ã¨CPUä¾å¤ãã³ãã©ã®å®è¡éå§ã¨çµäºã®ãã¬ã¼ã¹ãã°åå¾ 3568 ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§å®è£ 3569 ããå¿ 3570 è¦ãããï¼è©³ããã¯ï¼ã6.2 ãã¬ã¼ã¹ãã° 3571 æ©è½ã¸ã®å¯¾å¿ãã6.6.1 å²è¾¼ã¿ãã³ãã©ã®åºå 3572 ¥å£å¦çãã6.7.1 CPUä¾å¤ãã³ã 3573 ã©ã®åºå 3574 ¥å£å¦çãã®ç¯ãåç 3575 §ãããã¨ï¼ 3576 3577 (c) ã¿ã¹ã¯ç¶æ 3578 ã®å¤å 3579 3580 次ã®ãã¯ããå®ç¾©ãããã¨ã§ï¼ã¿ã¹ã¯ç¶æ 3581 ãå¤åããæã®ãã¬ã¼ã¹ãã°ãåå¾ 3582 ãããã¨ãã§ããï¼ãã ãï¼å®è¡ç¶æ 3583 ã¨å®è¡å¯è½ç¶æ 3584 ã®éã®é·ç§»ã¯ï¼ä»ã®æ¹æ³ 3585 ã§åå¾ã§ããããï¼ãã®ãã¯ãã§ã¯åå¾ã§ããªãï¼ 3586 3587 LOG_TSKSTAT ã¿ã¹ã¯ç¶æ 3588 ã®å¤å 3589 3590 (d) ãã£ã¹ãããã£ã®å®è¡éå§ã¨çµäº 3591 3592 次ã®ãã¯ããå®ç¾©ãããã¨ã§ï¼ãã£ã¹ãããã£ãå®è¡éå§ããæã¨ï¼çµäºãã 3593 æã®ãã¬ã¼ã¹ãã°ãåå¾ãããã¨ãã§ããï¼ 3594 3595 LOG_DSP_ENTER ãã£ã¹ãããã£ã®å®è¡éå§ 3596 LOG_DSP_LEAVE ãã£ã¹ãããã£ã®çµäº 3597 3598 ãã£ã¹ãããã£ã®å®è¡éå§ã¯ï¼ã¿ã¹ã¯ãå®è¡ç¶æ 3599 ããå®è¡å¯è½ç¶æ 3600 ã«é·ç§»ãã 3601 ã¿ã¤ãã³ã°ã§ããããï¼å®è¡å¯è½ç¶æ 3602 ã¸é·ç§»ããã¿ã¹ã¯ã®TCBã¸ã®ãã¤ã³ã¿ãã 3603 ã©ã¡ã¼ã¿ã¨ããï¼éã«ï¼ãã£ã¹ãããã£ã®çµäºã¯ï¼ã¿ã¹ã¯ãå®è¡å¯è½ç¶æ 3604 ãã 3605 å®è¡ç¶æ 3606 ã«é·ç§»ããã¿ã¤ãã³ã°ã§ããããï¼å®è¡ç¶æ 3607 ã¸é·ç§»ããã¿ã¹ã¯ã®TCB㸠3608 ã®ãã¤ã³ã¿ããã©ã¡ã¼ã¿ã¨ããï¼ 3609 3610 ASPã«ã¼ãã«ã§ã¯ï¼å®è¡ã§ããã¿ã¹ã¯ããªãï¼ã«ã¼ãã«ãã¢ã¤ãã«ç¶æ 3611 ã«ãªãå ´ 3612 åã«ã¯ï¼ãã£ã¹ãããã£ã®ä¸ã«çã¾ãï¼ãã®ããï¼ã¢ã¤ãã«ç¶æ 3613 ã¸ã®é·ç§»ã¨ã¢ 3614 ã¤ãã«ç¶æ 3615 ããä»ã®ç¶æ 3616 ã¸ã®é·ç§»ã¯ï¼ãã®ãã¯ãã§ã¯åå¾ã§ããªãï¼ 3617 3618 ãªãï¼ãã£ã¹ãããã£ã®å®è¡éå§ã¨çµäºã®ãã¬ã¼ã¹ãã°åå¾ã¯ï¼ã¿ã¼ã²ããä¾ 3619 åé¨ã§å®è£ 3620 ããå¿ 3621 è¦ãããï¼è©³ããã¯ï¼ã6.2 ãã¬ã¼ã¹ãã°æ©è½ã¸ã®å¯¾å¿ã㨠3622 ã6.5.2 ãã£ã¹ãããã£æ¬ä½ãã®ç¯ãåç 3623 §ãããã¨ï¼ 3624 3625 (e) ãµã¼ãã¹ã³ã¼ã«ã®å 3626 ¥å£ã¨åºå£ 3627 3628 次ã®ãã¯ããå®ç¾©ãããã¨ã§ï¼åãµã¼ãã¹ã³ã¼ã«ã®å 3629 ¥å£ã¨åºå£ã®ãã¬ã¼ã¹ãã° 3630 ãåå¾ãããã¨ãã§ããï¼ 3631 3632 LOG_<ãµã¼ãã¹ã³ã¼ã«ã®å¤§æå表è¨>_ENTER ãµã¼ãã¹ã³ã¼ã«åã®å 3633 ¥å£ 3634 LOG_<ãµã¼ãã¹ã³ã¼ã«ã®å¤§æå表è¨>_LEAVE ãµã¼ãã¹ã³ã¼ã«åã®åºå£ 3635 3636 ããããã®ãã¯ãã®å称ããã©ã¡ã¼ã¿ã®è©³ç´°ã«ã¤ãã¦ã¯ï¼ã«ã¼ãã«ã®ã½ã¼ã¹ã³ã¼ 3637 ããåç 3638 §ãããã¨ï¼ 3639 3640 6.11.2 ãã¬ã¼ã¹ãã°è¨é²ã®ãµã³ãã«ã³ã¼ã 3641 3642 ãã¬ã¼ã¹ãã°ãè¨é²ããæ¹æ³ã®ä¸ä¾ã¨ãã¦ï¼ã¡ã¢ãªä¸ã«ãã¬ã¼ã¹ãã°ãè¨é²ã 3643 ãããã®ãµã³ãã«ã³ã¼ããarch/logtraceãã£ã¬ã¯ããªã«ç¨æãã¦ããï¼ãã®ãµ 3644 ã³ãã«ã³ã¼ãã¯ï¼ã·ã¹ãã ãã°æ©è½ã¨åæ§ã®ãã¬ã¼ã¹ãã°æ©è½ãç¨æãï¼ãã¬ã¼ 3645 ã¹ãã°æ 3646 å ±ãã¡ã¢ãªä¸ã«è¨é²ããã¨ã¨ãã«ï¼ãããèªã¿åºãã¦è¡¨ç¤ºããæ©è½ã 3647 å®ç¾ãã¦ããï¼ 3648 3649 ãã®ãµã³ãã«ã³ã¼ããçµã¿è¾¼ãæ¹æ³ã¯æ¬¡ã®éãã§ããï¼ 3650 3651 (1) target_config.hããã³target_syssvc.hã«ï¼æ¬¡ã®è¨è¿°ã追å ããï¼ 2789 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の, 2790 デフォルトのスタック領域のサイズ. 2791 2792 (6-10-3-2) DEFAULT_ISTK(オプション) 2793 2794 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の, 2795 デフォルトのスタック領域の先頭番地.このマクロが定義されない場合には, 2796 サイズがDEFAULT_ISTKSZのスタック領域が,配列により確保される. 2797 2798 (6-10-3-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)(オプション) 2799 2800 非タスクコンテキスト用のスタックポインタの初期値を保持する変数(istkpt) 2801 を用いる場合に,このシンボルに,スタック領域の先頭番地(istk)とスタッ 2802 ク領域のサイズ(istksz)から,スタックポインタの初期値を求めるマクロを 2803 定義する. 2804 2805 6.10.4 空ラベルの定義 2806 2807 (6-10-4-1) TOPPERS_EMPTY_LABEL(type, symbol)(オプション) 2808 2809 リンクエラーを防ぐために,データ型typeの配列である変数symbolに定義を与 2810 えるためのマクロ.与えた定義が参照されることはないため,どのような定義 2811 を与えてもよい. 2812 2813 デフォルトでは,symbolを,要素型がtypeでサイズが0の配列に定義している. 2814 サイズが0の配列がエラーとならないコンパイラ(GCCはこれに該当)を用いる 2815 場合には,ターゲット依存部で定義する必要はない. 2816 2817 6.11 トレースログ機能に関する設定 2818 2819 ASPカーネルのソースコードには,カーネルの実行トレースログを取得するため 2820 のマクロ等が埋め込んである.デフォルトでは,これらのマクロは空に定義さ 2821 れてトレースログの取得は行わないが,これらのマクロを適切に定義すること 2822 でトレースログの取得を行うことができる. 2823 2824 6.11.1 取得できるトレースログの種類とマクロ 2825 2826 取得できるトレースログの種類と,それを取得するために定義するマクロは次 2827 の通りである. 2828 2829 (a) カーネルの動作開始と終了 2830 2831 次のマクロを定義することで,カーネルの動作開始時と終了時のトレースログ 2832 を取得することができる. 2833 2834 LOG_KER_ENTER カーネルが動作を開始する直前(初期化の完了後) 2835 LOG_KER_LEAVE カーネルの終了(ext_ker)が呼ばれた直後(終了処 2836 理の実行前) 2837 2838 (b) 処理単位の実行開始と終了 2839 2840 次のマクロを定義することで,割込みハンドラ(INH),割込みサービスルーチ 2841 ン(ISR),周期ハンドラ(CYC),アラームハンドラ(ALM),CPU例外ハンド 2842 ラ(EXC),タスク例外処理ルーチン(TEX)の実行開始前と終了後のトレース 2843 ログを取得することができる. 2844 2845 LOG_<処理単位略号>_ENTER 処理単位の実行開始直前 2846 LOG_<処理単位略号>_LEAVE 処理単位の終了直後 2847 2848 割込みハンドラは,アプリケーションが登録したもののみを対象とし,割込み 2849 サービスルーチンを呼び出すためにカーネル内に生成されるものは対象としな 2850 い.タスクの実行開始と終了は,他の方法で取得できるため,この方法は用意 2851 していない. 2852 2853 なお,割込みハンドラとCPU例外ハンドラの実行開始と終了のトレースログ取得 2854 は,ターゲット依存部で実装する必要がある.詳しくは,「6.2 トレースログ 2855 機能への対応」「6.6.1 割込みハンドラの出入口処理」「6.7.1 CPU例外ハンド 2856 ラの出入口処理」の節を参照すること. 2857 2858 (c) タスク状態の変化 2859 2860 次のマクロを定義することで,タスク状態が変化した時のトレースログを取得 2861 することができる.ただし,実行状態と実行可能状態の間の遷移は,他の方法 2862 で取得できるため,このマクロでは取得できない. 2863 2864 LOG_TSKSTAT タスク状態の変化 2865 2866 (d) ディスパッチャの実行開始と終了 2867 2868 次のマクロを定義することで,ディスパッチャが実行開始する時と,終了する 2869 時のトレースログを取得することができる. 2870 2871 LOG_DSP_ENTER ディスパッチャの実行開始 2872 LOG_DSP_LEAVE ディスパッチャの終了 2873 2874 ディスパッチャの実行開始は,タスクが実行状態から実行可能状態に遷移する 2875 タイミングであるため,実行可能状態へ遷移するタスクのTCBへのポインタをパ 2876 ラメータとする.逆に,ディスパッチャの終了は,タスクが実行可能状態から 2877 実行状態に遷移するタイミングであるため,実行状態へ遷移するタスクのTCBへ 2878 のポインタをパラメータとする. 2879 2880 ASPカーネルでは,実行できるタスクがなく,カーネルがアイドル状態になる場 2881 合には,ディスパッチャの中に留まる.そのため,アイドル状態への遷移とア 2882 イドル状態から他の状態への遷移は,このマクロでは取得できない. 2883 2884 なお,ディスパッチャの実行開始と終了のトレースログ取得は,ターゲット依 2885 存部で実装する必要がある.詳しくは,「6.2 トレースログ機能への対応」と 2886 「6.5.2 ディスパッチャ本体」の節を参照すること. 2887 2888 (e) サービスコールの入口と出口 2889 2890 次のマクロを定義することで,各サービスコールの入口と出口のトレースログ 2891 を取得することができる. 2892 2893 LOG_<サービスコールの大文字表記>_ENTER サービスコール名の入口 2894 LOG_<サービスコールの大文字表記>_LEAVE サービスコール名の出口 2895 2896 それぞれのマクロの名称やパラメータの詳細については,カーネルのソースコー 2897 ドを参照すること. 2898 2899 6.11.2 トレースログ記録のサンプルコード 2900 2901 トレースログを記録する方法の一例として,メモリ上にトレースログを記録す 2902 るためのサンプルコードをarch/logtraceディレクトリに用意している.このサ 2903 ンプルコードは,システムログ機能と同様のトレースログ機能を用意し,トレー 2904 スログ情報をメモリ上に記録するとともに,それを読み出して表示する機能を 2905 実現している. 2906 2907 このサンプルコードを組み込む方法は次の通りである. 2908 2909 (1) target_config.hおよびtarget_syssvc.hに,次の記述を追加する. 3652 2910 3653 2911 #ifdef TOPPERS_ENABLE_TRACE … … 3655 2913 #endif /* TOPPERS_ENABLE_TRACE */ 3656 2914 3657 (2) Makefile.target ã«ï¼æ¬¡ã®è¨è¿°ã追å ããï¼2915 (2) Makefile.targetに,次の記述を追加する. 3658 2916 3659 2917 ifeq ($(ENABLE_TRACE),true) … … 3663 2921 endif 3664 2922 3665 (3) ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã§ï¼bssã»ã¯ã·ã§ã³ã®ã¯ãªã¢ãçç¥ãã¦ããå ´å 3666 ã«ã¯ï¼trace_modeãTRACE_STOPï¼ï¼0ï¼ã«åæåããã³ã¼ãã追å ããï¼ã 3667 ãã¯ï¼ãã¬ã¼ã¹ãã°æ©è½ãåæåãããåã«æ¸ãè¾¼ã¾ãããã¬ã¼ã¹ãã°ã 3668 ç¡è¦ããããã§ããï¼ 3669 3670 ãã®ãµã³ãã«ã³ã¼ããç¨ãã¦ï¼ãã¬ã¼ã¹ãã°ãè¨é²ã»ãã³ãããæ¹æ³ã®ä¾ã«ã¤ 3671 ãã¦ã¯ï¼ãTOPPERS/ASPã«ã¼ãã« ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ãã®ã11.6 ãã¬ã¼ã¹ã 3672 ã°è¨é²ã®ãµã³ãã«ã³ã¼ãã®ä½¿ç¨æ¹æ³ãã®ç¯ãåç 3673 §ãããã¨ï¼ 3674 3675 ãªãï¼ãã®ãµã³ãã«ã³ã¼ãã§ã¯ï¼ãã£ã¹ãããã£ã®åºå£ï¼ã¿ã¹ã¯ã®ç¶æ 3676 é·ç§»ï¼ 3677 ã·ã¹ãã ãã°ã®åºåã®3ã¤ã®ãã¬ã¼ã¹ãã°ã®ã¿ãè¨é²ãã¦ããï¼ä»ã®ãã¬ã¼ã¹ã 3678 ã°ãè¨é²ãããå ´åã«ã¯ï¼trace_config.hï¼ããã³trace_dump.cï¼ãä¿®æ£ãã 3679 å¿ 3680 è¦ãããï¼ãªãï¼ã«ã¼ãã«ã®ãã¬ã¼ã¹ãã°ãç¶²ç¾ 3681 çã«è¨é²ããããã®ã³ã¼ã 3682 ã¯ï¼TLVï¼TraceLogVisualizerï¼ã®é 3683 å¸ããã±ã¼ã¸ã«å«ã¾ãã¦ããï¼ 3684 3685 6.12 ã«ã¼ãã«å®è£ 3686 ã®ã¿ã¼ã²ããä¾åé¨ã®ããã®ãªãã¼ã è¨è¿° 3687 3688 ã«ã¼ãã«å 3689 é¨ã«éãã¦ä½¿ãããé¢æ°ãå¤æ°ãªã©ã®å称ã§ï¼ãªãã¸ã§ã¯ããã¡ã¤ 3690 ã«ã®ã·ã³ãã«è¡¨ã«ç»é²ããã¦å¤é¨ããåç 3691 §ã§ããå称ã¯ï¼Cè¨èªã¬ãã«ã§ï¼å 3692 é 3693 ã"_kernel_"ã¾ãã¯"_KERNEL_"ã§ããå称ã¨ããªããã°ãªããªããï¼ASPã«ã¼ã 3694 ã«ã§ã¯ï¼ã½ã¼ã¹ã³ã¼ããã³ã³ãã¯ãã«ä¿ã¡ã¤ã¤ãããå®ç¾ããããã«ï¼ãªãã¼ 3695 ã è¨è¿°ãã¡ã¤ã«ãå°å 3696 ¥ãã¦ããï¼ 3697 3698 å 3699 ·ä½çã«ã¯ï¼ãªãã¼ã ãã¹ãå称ããªã¹ãã¢ããããxxx_rename.defãç¨æãï¼ 3700 ãã®ãã¡ã¤ã«ãããã¼ã«ï¼utils/genrenameï¼ã«ããï¼å称ããªãã¼ã ãããã 3701 ã®ãã¯ãå®ç¾©ãå«ãxxx_rename.hã¨ï¼ãããã®ãã¯ãå®ç¾©ã解é¤ããããã® 3702 xxx_unrename.hãçæããï¼ãã¼ã«ã®èµ·åæ¹æ³ã¯æ¬¡ã®éãã§ããï¼ 2923 (3) スタートアップモジュールで,bssセクションのクリアを省略している場合 2924 には,trace_modeをTRACE_STOP(=0)に初期化するコードを追加する.こ 2925 れは,トレースログ機能が初期化される前に書き込まれるトレースログを 2926 無視するためである. 2927 2928 このサンプルコードを用いて,トレースログを記録・ダンプする方法の例につ 2929 いては,「TOPPERS/ASPカーネル ユーザーズマニュアル」の「11.6 トレースロ 2930 グ記録のサンプルコードの使用方法」の節を参照すること. 2931 2932 なお,このサンプルコードでは,ディスパッチャの出口,タスクの状態遷移, 2933 システムログの出力の3つのトレースログのみを記録している.他のトレースロ 2934 グを記録したい場合には,trace_config.h(およびtrace_dump.c)を修正する 2935 必要がある.なお,カーネルのトレースログを網羅的に記録するためのコード 2936 は,TLV(TraceLogVisualizer)の配布パッケージに含まれている. 2937 2938 6.12 カーネル実装のターゲット依存部のためのリネーム記述 2939 2940 カーネル内部に閉じて使われる関数や変数などの名称で,オブジェクトファイ 2941 ルのシンボル表に登録されて外部から参照できる名称は,C言語レベルで,先頭 2942 が"_kernel_"または"_KERNEL_"である名称としなければならないが,ASPカーネ 2943 ルでは,ソースコードをコンパクトに保ちつつこれを実現するために,リネー 2944 ム記述ファイルを導入している. 2945 2946 具体的には,リネームすべき名称をリストアップしたxxx_rename.defを用意し, 2947 このファイルからツール(utils/genrename)により,名称をリネームするため 2948 のマクロ定義を含むxxx_rename.hと,それらのマクロ定義を解除するための 2949 xxx_unrename.hを生成する.ツールの起動方法は次の通りである. 3703 2950 3704 2951 % genrename xxx 3705 2952 3706 xxx_rename.def ã«ã¯ï¼ãªãã¼ã ãã¹ãå称ã1è¡ã«1ã¤è¨è¿°ããï¼xxxxã¨ããå3707 称ãè¨è¿°ããã¦ããå ´åï¼xxx_rename.hã«ã¯æ¬¡ã®ãããªè¨è¿°ãçæãããï¼ 2953 xxx_rename.defには,リネームすべき名称を1行に1つ記述する.xxxxという名 2954 称が記述されている場合,xxx_rename.hには次のような記述が生成される. 3708 2955 3709 2956 #define xxxx _kernel_xxxx … … 3712 2959 #endif /* TOPPERS_LABEL_ASM */ 3713 2960 3714 ã¾ãï¼xxx_unrename.hã«ã¯æ¬¡ã®ãããªè¨è¿°ãçæãããï¼ 2961 また,xxx_unrename.hには次のような記述が生成される. 3715 2962 3716 2963 #undef xxxx … … 3719 2966 #endif /* TOPPERS_LABEL_ASM */ 3720 2967 3721 xxx_rename.defã®ä¸ã«ã¯ï¼ä»ã®ãªãã¼ã è¨è¿°ãåãè¾¼ãããã«ï¼ãINCLUDE 3722 "yyy"ãã¾ãã¯ãINCLUDE <yyy>ãã¨ããè¨è¿°ãå«ãããã¨ãã§ããï¼ãã®è¨è¿° 3723 ãããã¦ããå ´åï¼xxx_rename.hã«ã¯ã#include "yyy_rename.h"ãã¾ã㯠3724 ã#include <yyy_rename.h>ãã¨ããè¨è¿°ãï¼xxx_unrename.hã«ã¯ã#include 3725 "yyy_unrename.h"ãã¾ãã¯ã#include <yyy_unrename.h>ãã¨ããè¨è¿°ãçæã 3726 ããï¼ 3727 3728 xxx_rename.defã®ä¸ã®"#"ã§å§ã¾ãè¡ã¯ã³ã¡ã³ãã¨ãã¦èªã¿é£ã°ãããï¼ã¾ãï¼ 3729 空è¡ãç¡è¦ãããï¼ 3730 3731 ã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ä½¿ãããå称ããªãã¼ã ããããã«ï¼kernel 3732 ãã£ã¬ã¯ããªã«ï¼kernel_rename.defã¨ï¼ããããçæããkernel_rename.hã 3733 ãã³kernel_unrename.hãç¨æããã¦ããï¼kernel_rename.defã«ã¯ï¼ 3734 ãINCLUDE "target"ãã¨ããè¨è¿°ãå«ã¾ãã¦ããï¼ã¿ã¼ã²ããä¾åé¨ã®ãªãã¼ 3735 ã è¨è¿°ãåãè¾¼ãããã«ãªã£ã¦ããï¼ã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ãï¼ã¿ã¼ã²ãã 3736 éä¾åé¨ã§åç 3737 §ãããå称ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã®ãªãã¼ã è¨è¿°ã«å«ããï¼ 3738 3739 ã¿ã¼ã²ããä¾åé¨ã§ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ä½¿ãããå称ããªãã¼ã ãããã 3740 ã«ï¼target_rename.defã¨ï¼ããããçæããtarget_rename.hããã³ 3741 target_unrename.hãç¨æããï¼ã¿ã¼ã²ããä¾åé¨ããããã»ããµã»ãããã»é 3742 çºç°å¢ä¾åé¨ãåãåããå ´åã«ã¯ï¼target_rename.defã«INCLUDEè¨è¿°ãå 3743 ¥ãï¼ 3744 ããã»ããµã»ãããã»éçºç°å¢ä¾åé¨ã®ãªãã¼ã è¨è¿°ãåãè¾¼ãããã«ããï¼ 3745 3746 6.13 ã¿ã¤ããã©ã¤ã 3747 3748 ã¿ã¤ããã©ã¤ãã¯ï¼ã«ã¼ãã«ã«ã¿ã¤ã ãã£ãã¯ãéç¥ããããã®ã¿ã¤ããã©ã¤ 3749 ãã§ããï¼ 3750 3751 6.13.1 ã¿ã¤ããã©ã¤ãã®ãã¡ã¤ã«æ§æ 3752 3753 ã¿ã¤ããã©ã¤ããçµã¿è¾¼ãããã®éçAPIãè¨è¿°ããã·ã¹ãã ã³ã³ãã£ã®ã¥ã¬ã¼ 3754 ã·ã§ã³ãã¡ã¤ã«ãï¼target_timer.cfgã«ç¨æããï¼ãã®ãã¡ã¤ã«ã«ã¯ï¼ã¿ã¤ã 3755 ãã©ã¤ããåæåããããã®åæåã«ã¼ãã³ã®è¿½å ï¼ã¿ã¤ããã©ã¤ããçµäºã 3756 ããããã®çµäºå¦çã«ã¼ãã³ã®è¿½å ï¼ã¿ã¤ãå²è¾¼ã¿ã®ããã®å²è¾¼ã¿ãã³ãã©ã® 3757 å®ç¾©ï¼ã¾ãã¯ï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã®è¿½å ï¼ï¼ã¿ã¤ãå²è¾¼ã¿ã®ããã®å²è¾¼ 3758 ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å®ã®éçAPIãªã©ãå«ããã¨ã«ãªãï¼ 3759 3760 ã¿ã¤ããã©ã¤ããå¼ã³åºãããã«å¿ 3761 è¦ãªå®ç¾©ãå«ãããããã¡ã¤ã«ãï¼ 3762 target_timer.hã«ç¨æããï¼ã¾ãï¼ã¿ã¤ããã©ã¤ãã®å®è£ 3763 ãã¡ã¤ã«ã 3764 target_timer.cã«ç¨æããï¼ 3765 3766 ã¿ã¤ã ãã£ãã¯ã®éç¥ã«ããè¡ãå¦çã®å¤ãã¯ï¼ã¿ã¹ã¯ã®èµ·åãå¾ 3767 ã¡è§£é¤ãè¡ 3768 ããã®ã§ããããï¼ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åªå 3769 度ã¯ï¼å²è¾¼ã¿ã®ä¸ã§æä½ã®åªå 3770 3771 度ã§ååã§ããï¼ãã ãï¼å¨æãã³ãã©ãã¢ã©ã¼ã ãã³ãã©ã®å®è¡éå§é 3772 ãã 3773 åé¡ã«ãªãå ´åã«ã¯ï¼ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åªå 3774 度ãããé«ãå¤ã«è¨å®ãããï¼ 3775 ããã§ï¼ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åªå 3776 度ãå¤æ´ããæ¹æ³ãï¼ã¿ã¼ã²ããä¾åé¨ã® 3777 ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ã«è¨è¼ãã¹ãã§ããï¼ 3778 3779 6.13.2 ã¿ã¤ãã®åæåã»çµäºå¦çã»å²è¾¼ã¿å¦ç 2968 xxx_rename.defの中には,他のリネーム記述を取り込むために,「INCLUDE 2969 "yyy"」または「INCLUDE <yyy>」という記述を含めることができる.この記述 2970 がされている場合,xxx_rename.hには「#include "yyy_rename.h"」または 2971 「#include <yyy_rename.h>」という記述が,xxx_unrename.hには「#include 2972 "yyy_unrename.h"」または「#include <yyy_unrename.h>」という記述が生成さ 2973 れる. 2974 2975 xxx_rename.defの中の"#"で始まる行はコメントとして読み飛ばされる.また, 2976 空行も無視される. 2977 2978 カーネルのターゲット非依存部で使われる名称をリネームするために,kernel 2979 ディレクトリに,kernel_rename.defと,そこから生成したkernel_rename.hお 2980 よびkernel_unrename.hが用意されている.kernel_rename.defには, 2981 「INCLUDE "target"」という記述が含まれており,ターゲット依存部のリネー 2982 ム記述を取り込むようになっている.ターゲット依存部で定義し,ターゲット 2983 非依存部で参照される名称は,ターゲット依存部のリネーム記述に含める. 2984 2985 ターゲット依存部では,ターゲット依存部で使われる名称をリネームするため 2986 に,target_rename.defと,そこから生成したtarget_rename.hおよび 2987 target_unrename.hを用意する.ターゲット依存部からプロセッサ・チップ・開 2988 発環境依存部を切り分ける場合には,target_rename.defにINCLUDE記述を入れ, 2989 プロセッサ・チップ・開発環境依存部のリネーム記述を取り込むようにする. 2990 2991 6.13 タイマドライバ 2992 2993 タイマドライバは,カーネルにタイムティックを通知するためのタイマドライ 2994 バである. 2995 2996 6.13.1 タイマドライバのファイル構成 2997 2998 タイマドライバを組み込むための静的APIを記述したシステムコンフィギュレー 2999 ションファイルを,target_timer.cfgに用意する.このファイルには,タイマ 3000 ドライバを初期化するための初期化ルーチンの追加,タイマドライバを終了さ 3001 せるための終了処理ルーチンの追加,タイマ割込みのための割込みハンドラの 3002 定義(または,割込みサービスルーチンの追加),タイマ割込みのための割込 3003 み要求ラインの属性の設定の静的APIなどを含むことになる. 3004 3005 タイマドライバを呼び出すために必要な定義を含むヘッダファイルを, 3006 target_timer.hに用意する.また,タイマドライバの実装ファイルを 3007 target_timer.cに用意する. 3008 3009 タイムティックの通知により行う処理の多くは,タスクの起動や待ち解除を行 3010 うものであるため,タイマ割込みの割込み優先度は,割込みの中で最低の優先 3011 度で十分である.ただし,周期ハンドラやアラームハンドラの実行開始遅れが 3012 問題になる場合には,タイマ割込みの割込み優先度をより高い値に設定したい. 3013 そこで,タイマ割込みの割込み優先度を変更する方法を,ターゲット依存部の 3014 ユーザーズマニュアルに記載すべきである. 3015 3016 6.13.2 タイマの初期化・終了処理・割込み処理 3780 3017 3781 3018 (6-13-2-1) void target_timer_initialize(intptr_t exinf) 3782 3019 3783 ã¿ã¤ããåæåãï¼ã¿ã¤ãå²è¾¼ã¿ãå¨æçã«çºçãããé¢æ°ï¼ã¿ã¤ãå²è¾¼ã¿ã® 3784 å¨æã¯ï¼TIC_NUMEã¨TIC_DENOã§æå®ãããæéã¨ä¸è´ãããï¼ã5.2 ã¿ã¤ã 3785 ãã£ãã¯ã®å®ç¾©ãã®ç¯ãåç 3786 §ï¼ï¼ 3787 3788 ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼åæåã«ã¼ãã³ã¨ 3789 ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼ 3020 タイマを初期化し,タイマ割込みを周期的に発生させる関数.タイマ割込みの 3021 周期は,TIC_NUMEとTIC_DENOで指定された時間と一致させる(「5.2 タイム 3022 ティックの定義」の節を参照). 3023 3024 この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと 3025 してカーネルに登録することを想定している. 3790 3026 3791 3027 (6-13-2-2) void target_timer_terminate(intptr_t exinf) 3792 3028 3793 ã¿ã¤ãã®åä½ãåæ¢ããï¼ã¿ã¤ãå²è¾¼ã¿ãçºçããªãããã«ããé¢æ°ï¼ 3794 3795 ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼çµäºå¦çã«ã¼ãã³ 3796 ã¨ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼ 3029 タイマの動作を停止させ,タイマ割込みを発生しないようにする関数. 3030 3031 この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン 3032 としてカーネルに登録することを想定している. 3797 3033 3798 3034 (6-13-2-3) void target_timer_handler(void) 3799 ã¾ãã¯void target_timer_isr(intptr_t exinf)3800 3801 ã¿ã¤ãå²è¾¼ã¿ã«ããèµ·åãããå²è¾¼ã¿å¦çããã°ã©ã ï¼å²è¾¼ã¿ãã³ãã©ã¨ã㦠3802 å®ç¾ããå ´åã«ã¯target_timer_handlerï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã¨ãã¦å®ç¾ 3803 ããå ´åã«ã¯target_timer_isrã®å称ã¨ããï¼ã¿ã¼ã²ããéä¾åé¨ã® 3804 signal_time ãå¼ã³åºãï¼3805 3806 target_timer_handler ã¯ï¼æ¨æºçã«ã¯æ¬¡ã®ããã«å®ç¾©ããï¼3035 または void target_timer_isr(intptr_t exinf) 3036 3037 タイマ割込みにより起動される割込み処理プログラム.割込みハンドラとして 3038 実現する場合にはtarget_timer_handler,割込みサービスルーチンとして実現 3039 する場合にはtarget_timer_isrの名称とする.ターゲット非依存部の 3040 signal_timeを呼び出す. 3041 3042 target_timer_handlerは,標準的には次のように定義する. 3807 3043 3808 3044 ---------------------------------------- … … 3810 3046 target_timer_handler(void) 3811 3047 { 3812 i_begin_int(< ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿çªå·>);3048 i_begin_int(<タイマ割込みの割込み番号>); 3813 3049 signal_time(); 3814 i_end_int(< ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿çªå·>);3050 i_end_int(<タイマ割込みの割込み番号>); 3815 3051 } 3816 3052 ---------------------------------------- 3817 3053 3818 ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼å²è¾¼ã¿ãã³ãã©ã¾ 3819 ãã¯å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã¨ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼ 3820 3821 6.13.3 æ§è½è©ä¾¡ç¨ã·ã¹ãã æå»ã®åç 3822 §ã®ããã®æ©è½ 3823 3824 æ§è½è©ä¾¡ç¨ã·ã¹ãã æå»ã®åç 3825 §æ©è½ï¼get_utmï¼ããµãã¼ãããå ´åã«ã¯ï¼ã¿ã¤ 3826 ããã©ã¤ãã§ï¼ä»¥ä¸ã®ãã¼ã¿åãé¢æ°ãªã©ãç¨æããï¼ 3827 3828 (6-13-3-1) OMIT_GET_UTMï¼ãªãã·ã§ã³ï¼ 3829 3830 ã¿ã¼ã²ããéä¾åé¨ã®get_utmã®å®è£ 3831 ã使ç¨ããï¼ã¿ã¼ã²ããä¾åé¨ã§get_utm 3832 ãç¨æããå ´åã«ã¯ï¼ãã®ã·ã³ãã«ããã¯ãå®ç¾©ããï¼ãã®ã·ã³ãã«ããã¯ã 3833 å®ç¾©ããå ´åï¼ä»¥ä¸ã®ãã¼ã¿åãé¢æ°ãªã©ãç¨æããå¿ 3834 è¦ã¯ãªãï¼ 3054 この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま 3055 たは割込みサービスルーチンとしてカーネルに登録することを想定している. 3056 3057 6.13.3 性能評価用システム時刻の参照のための機能 3058 3059 性能評価用システム時刻の参照機能(get_utm)をサポートする場合には,タイ 3060 マドライバで,以下のデータ型や関数などを用意する. 3061 3062 (6-13-3-1) OMIT_GET_UTM(オプション) 3063 3064 ターゲット非依存部のget_utmの実装を使用せず,ターゲット依存部でget_utm 3065 を用意する場合には,このシンボルをマクロ定義する.このシンボルをマクロ 3066 定義した場合,以下のデータ型や関数などを用意する必要はない. 3835 3067 3836 3068 (6-13-3-2) CLOCK 3837 3069 3838 ã¿ã¤ãå¤ã®å 3839 é¨è¡¨ç¾ã®ããã®ãã¼ã¿åï¼ 3070 タイマ値の内部表現のためのデータ型. 3840 3071 3841 3072 (6-13-3-3) CLOCK target_timer_get_current(void) 3842 3073 3843 ã¿ã¤ãã®ç¾å¨å¤ãèªã¿åºãï¼å 3844 é¨è¡¨ç¾ã§è¿ãé¢æ°ï¼ã¿ã¤ãå¤ã¯ï¼æéã®çµé㨠3845 ã¨ãã«å¢å ãããã¨ãæ³å®ãã¦ããï¼ãã¼ãã¦ã§ã¢ã®ã¿ã¤ããï¼ã¿ã¤ãå¤ãæ¸ 3846 å°ãããã®ã§ããå ´åã«ã¯ï¼ãã®é¢æ°å 3847 ã§å¢å ããå¤ã¨ãªãããã«å¤æããï¼ 3074 タイマの現在値を読み出し,内部表現で返す関数.タイマ値は,時間の経過と 3075 ともに増加することを想定している.ハードウェアのタイマが,タイマ値が減 3076 少するものである場合には,この関数内で増加する値となるように変換する. 3848 3077 3849 3078 (6-13-3-4) bool_t target_timer_probe_int(void) 3850 3079 3851 ã¿ã¤ãå²è¾¼ã¿è¦æ±ããã§ãã¯ããé¢æ°ï¼ã¿ã¤ãå²è¾¼ã¿ãè¦æ±ããã¦ããå ´åã« 3852 true ï¼è¦æ±ããã¦ããªãå ´åã«falseãè¿ãï¼3080 タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に 3081 true,要求されていない場合にfalseを返す. 3853 3082 3854 3083 (6-13-3-5) TO_USEC(clock) 3855 3084 3856 ã¿ã¤ãå¤ã®å 3857 é¨è¡¨ç¾ãï¼1μç§åä½ã«å¤æããããã®ãã¯ãï¼ã¾ãã¯é¢æ°ï¼ï¼ 3858 targettimer_get_currentã§èªã¿åºããå¤ãï¼ã¿ã¤ãå²è¾¼ã¿çºçããã®çµéæé 3859 ï¼åä½: 1μç§ï¼ã«å¤æããããã«ç¨ããï¼ 3860 3861 6.14 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãï¼ãªãã·ã§ã³ï¼ 3862 3863 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã¯ï¼ãªã¼ãã©ã³ãã³ãã©ãèµ·åããããã®ã¿ã¤ãã® 3864 ãã©ã¤ãã§ããï¼ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µããã±ã¼ã¸ããµãã¼ãããªãå ´ 3865 åã«ã¯ï¼ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ããç¨æããå¿ 3866 è¦ã¯ãªãï¼ 3867 3868 6.14.1 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã®ãã¡ã¤ã«æ§æ 3869 3870 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã¯ï¼ã¿ã¤ããã©ã¤ãã¨åããã¡ã¤ã«ã®ä¸ã«è¨è¿°ããï¼ 3871 ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã®ããã®è¨è¿°ã¯ï¼TOPPERS_SUPPORT_OVRHDRããã¯ã 3872 å®ç¾©ããã¦ããå ´åã«ã®ã¿æå¹ã«ãªãããã«ããï¼ 3873 3874 ããªãã¡ï¼ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ããçµã¿è¾¼ãããã®éçAPI㯠3875 target_timer.cfgã®ä¸ã«è¨è¿°ããï¼ãã®ãã¡ã¤ã«ã«ã¯ï¼ãªã¼ãã©ã³ã¿ã¤ããã© 3876 ã¤ããåæåããããã®åæåã«ã¼ãã³ã®è¿½å ï¼ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã 3877 çµäºãããããã®çµäºå¦çã«ã¼ãã³ã®è¿½å ï¼ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã®ããã® 3878 å²è¾¼ã¿ãã³ãã©ã®å®ç¾©ï¼ã¾ãã¯ï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã®è¿½å ï¼ï¼ãªã¼ãã© 3879 ã³ã¿ã¤ãå²è¾¼ã¿ã®ããã®å²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å®ã®éçAPIãªã©ãå«ãã 3880 ã¨ã«ãªãï¼ 3881 3882 ã¾ãï¼ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ããå¼ã³åºãããã«å¿ 3883 è¦ãªå®ç¾©ã¯ 3884 target_timer.hã®ä¸ã«ï¼ãªã¼ãã©ã³ã¿ã¤ããã©ã¤ãã®å®è£ 3885 ã¯target_timer.cã® 3886 ä¸ã«è¨è¿°ããï¼ 3887 3888 ãªã¼ãã©ã³ãã³ãã©ã¯ï¼ã¿ã¹ã¯ã®ãªã¼ãã©ã³ã«å¯¾ããå¦çãè¡ããã®ã§ããã 3889 ãï¼ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åªå 3890 度ã¯ï¼å²è¾¼ã¿ã®ä¸ã§æä½ã®åªå 3891 度㧠3892 ååã§ããï¼ãã ãï¼ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åªå 3893 度ãããé«ãå¤ã« 3894 è¨å®ãããå ´åããªãã¨ã¯è¨ããªãããï¼ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åª 3895 å 3896 度ãå¤æ´ããæ¹æ³ãï¼ã¿ã¼ã²ããä¾åé¨ã®ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ã«è¨è¼ãã¹ 3897 ãã§ããï¼ 3898 3899 6.14.2 ãªã¼ãã©ã³ã¿ã¤ãã®æä½ã¨å²è¾¼ã¿å¦ç 3085 タイマ値の内部表現を,1μ秒単位に変換するためのマクロ(または関数). 3086 targettimer_get_currentで読み出した値を,タイマ割込み発生からの経過時間 3087 (単位: 1μ秒)に変換するために用いる. 3088 3089 6.14 オーバランタイマドライバ(オプション) 3090 3091 オーバランタイマドライバは,オーバランハンドラを起動するためのタイマの 3092 ドライバである.オーバランハンドラ機能拡張パッケージをサポートしない場 3093 合には,オーバランタイマドライバを用意する必要はない. 3094 3095 6.14.1 オーバランタイマドライバのファイル構成 3096 3097 オーバランタイマドライバは,タイマドライバと同じファイルの中に記述する. 3098 オーバランタイマドライバのための記述は,TOPPERS_SUPPORT_OVRHDRがマクロ 3099 定義されている場合にのみ有効になるようにする. 3100 3101 すなわち,オーバランタイマドライバを組み込むための静的APIは 3102 target_timer.cfgの中に記述する.このファイルには,オーバランタイマドラ 3103 イバを初期化するための初期化ルーチンの追加,オーバランタイマドライバを 3104 終了させるための終了処理ルーチンの追加,オーバランタイマ割込みのための 3105 割込みハンドラの定義(または,割込みサービスルーチンの追加),オーバラ 3106 ンタイマ割込みのための割込み要求ラインの属性の設定の静的APIなどを含むこ 3107 とになる. 3108 3109 また,オーバランタイマドライバを呼び出すために必要な定義は 3110 target_timer.hの中に,オーバランタイマドライバの実装はtarget_timer.cの 3111 中に記述する. 3112 3113 オーバランハンドラは,タスクのオーバランに対する処理を行うものであるた 3114 め,オーバランタイマ割込みの割込み優先度は,割込みの中で最低の優先度で 3115 十分である.ただし,オーバランタイマ割込みの割込み優先度をより高い値に 3116 設定したい場合もないとは言えないため,オーバランタイマ割込みの割込み優 3117 先度を変更する方法を,ターゲット依存部のユーザーズマニュアルに記載すべ 3118 きである. 3119 3120 6.14.2 オーバランタイマの操作と割込み処理 3900 3121 3901 3122 (6-14-2-1) void target_ovrtimer_initialize(intptr_t exinf) 3902 3123 3903 ãªã¼ãã©ã³ã¿ã¤ãã®åæåå¦çãè¡ãï¼ã¿ã¤ãã®åä½éå§ã¯è¡ããªãï¼ 3904 3905 ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼åæåã«ã¼ãã³ã¨ 3906 ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼ 3124 オーバランタイマの初期化処理を行う.タイマの動作開始は行わない. 3125 3126 この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと 3127 してカーネルに登録することを想定している. 3907 3128 3908 3129 (6-14-2-2) void target_ovrtimer_terminate(intptr_t exinf) 3909 3130 3910 ãªã¼ãã©ã³ã¿ã¤ããåæ¢ããï¼ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ãçºçããªãããã«ã 3911 ãï¼ 3912 3913 ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼çµäºå¦çã«ã¼ãã³ 3914 ã¨ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼ 3131 オーバランタイマを停止させ,オーバランタイマ割込みを発生しないようにす 3132 る. 3133 3134 この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン 3135 としてカーネルに登録することを想定している. 3915 3136 3916 3137 (6-14-2-3) void target_ovrtimer_start(OVRTIM ovrtim) 3917 3138 3918 ãªã¼ãã©ã³ã¿ã¤ãã«ï¼æ®ãæéovrtimãè¨å®ãï¼åä½éå§ããï¼ovrtimã®åä½ 3919 ã¯ãã¤ã¯ãç§ã¨ããï¼ 3139 オーバランタイマに,残り時間ovrtimを設定し,動作開始する.ovrtimの単位 3140 はマイクロ秒とする. 3920 3141 3921 3142 (6-14-2-4) OVRTIM target_ovrtimer_stop(void) 3922 3143 3923 ãªã¼ãã©ã³ã¿ã¤ããåæ¢ãï¼ã¿ã¤ãã®æ®ãæéãèªã¿åºãï¼ããæ®ãæéã 3924 0 ï¼ã¾ãã¯ããæªæºï¼ã«ãªã£ã¦ããå ´åã«ã¯ï¼1ãè¿ãï¼ã¾ãï¼ãªã¼ãã©ã³ã¿ã¤3925 ãããã®å²è¾¼ã¿ãã¯ãªã¢ããï¼ 3144 オーバランタイマを停止し,タイマの残り時間を読み出す.もし残り時間が 3145 0(またはそれ未満)になっていた場合には,1を返す.また,オーバランタイ 3146 マからの割込みをクリアする. 3926 3147 3927 3148 (6-14-2-5) OVRTIM target_ovrtimer_get_current(void) 3928 3149 3929 ãªã¼ãã©ã³ã¿ã¤ãã®æ®ãæéãèªã¿åºãï¼ããæ®ãæéã0ï¼ã¾ãã¯ããæªæºï¼ 3930 ã«ãªã£ã¦ããå ´åã«ã¯ï¼0ãè¿ãï¼ãªã¼ãã©ã³ã¿ã¤ãããã®å²è¾¼ã¿ã¯ã¯ãªã¢ã㪠3931 ãï¼ 3150 オーバランタイマの残り時間を読み出す.もし残り時間が0(またはそれ未満) 3151 になっていた場合には,0を返す.オーバランタイマからの割込みはクリアしな 3152 い. 3932 3153 3933 3154 (6-14-2-6) void target_ovrtimer_handler(void) 3934 ã¾ãã¯void target_ovrtimer_isr(intptr_t exinf)3935 3936 ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã«ããèµ·åãããå²è¾¼ã¿å¦çããã°ã©ã ï¼å²è¾¼ã¿ãã³ 3937 ãã©ã¨ãã¦å®ç¾ããå ´åã«ã¯target_ovrtimer_handlerï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ã 3938 ã³ã¨ãã¦å®ç¾ããå ´åã«ã¯target_ovrtimer_isrã®å称ã¨ããï¼ã¿ã¼ã²ããéä¾ 3939 åé¨ã®call_ovrhdrãå¼ã³åºãï¼ 3940 3941 target_timer_handler ã¯ï¼æ¨æºçã«ã¯æ¬¡ã®ããã«å®ç¾©ããï¼3155 または void target_ovrtimer_isr(intptr_t exinf) 3156 3157 オーバランタイマ割込みにより起動される割込み処理プログラム.割込みハン 3158 ドラとして実現する場合にはtarget_ovrtimer_handler,割込みサービスルーチ 3159 ンとして実現する場合にはtarget_ovrtimer_isrの名称とする.ターゲット非依 3160 存部のcall_ovrhdrを呼び出す. 3161 3162 target_timer_handlerは,標準的には次のように定義する. 3942 3163 3943 3164 ---------------------------------------- … … 3945 3166 target_ovrtimer_handler(void) 3946 3167 { 3947 i_begin_int(<ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿çªå·>); 3948 ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿è¦æ±ã®ã¯ãªã¢ï¼å¿ 3949 è¦ãªãï¼ 3168 i_begin_int(<オーバランタイマ割込みの割込み番号>); 3169 オーバランタイマ割込み要求のクリア(必要なら) 3950 3170 call_ovrhdr(); 3951 i_end_int(< ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿çªå·>);3171 i_end_int(<オーバランタイマ割込みの割込み番号>); 3952 3172 } 3953 3173 ---------------------------------------- 3954 3174 3955 ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼å²è¾¼ã¿ãã³ãã©ã¾ 3956 ãã¯å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã¨ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼ 3175 この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま 3176 たは割込みサービスルーチンとしてカーネルに登録することを想定している. 3957 3177 3958 3178 (6-14-2-7) OMIT_OVRTIMER_START 3959 3179 (6-14-2-8) OMIT_OVRTIMER_STOP 3960 3180 3961 ã¿ã¼ã²ããä¾åé¨ããå¼ã³åºãovrtimer_startã¨ovrtimer_stopãï¼ã¢ã»ã³ã㪠3962 è¨èªã®ã½ã¼ã¹ã³ã¼ãä¸ã«å±éãï¼Cè¨èªã®é¢æ°ãä¸è¦ã«ãªãå ´åã«ã¯ï¼ããããï¼ 3963 OMIT_OVRTIMER_STARTã¨OMIT_OVRTIMER_STOPããã¯ãå®ç¾©ããï¼ 3964 3965 6.15 åçã¡ã¢ãªç®¡çï¼ãªãã·ã§ã³ï¼ 3966 3967 åççææ©è½æ¡å¼µããã±ã¼ã¸ã使ç¨ããå ´åã«ã¯ï¼ã«ã¼ãã«å 3968 ã§ã®åçã¡ã¢ãª 3969 管çã®æ¹æ³ã決ããå¿ 3970 è¦ãããï¼ 3971 3972 åççææ©è½æ¡å¼µããã±ã¼ã¸ã®ã¿ã¼ã²ããéä¾åé¨ã§ã¯ï¼ã¡ã¢ãªé åãå 3973 é ã 3974 ãé ã«å²ãå½ã¦ï¼è§£æ¾ãããã¡ã¢ãªé åãåå©ç¨ããªãã¡ã¢ãªç®¡çã¢ã¸ã¥ã¼ã« 3975 ã®ã¿ãå®è£ 3976 ãã¦ããï¼ããã©ã«ãã§ã¯ï¼ãã®ã¡ã¢ãªç®¡çã¢ã¸ã¥ã¼ã«ã使ç¨ãã 3977 ãï¼ 3978 3979 æ¬æ ¼çãªåçã¡ã¢ãªç®¡çãè¡ãããå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã¾ãã¯ã¦ã¼ã¶ 3980 å´ã§ï¼ä»¥ä¸ã®é¢æ°ãå®ç¾©ããã¡ã¢ãªç®¡çã¢ã¸ã¥ã¼ã«ãç¨æããå¿ 3981 è¦ãããï¼ 3982 3983 (6-15-1) OMIT_KMM_ALLOCONLYï¼ãªãã·ã§ã³ï¼ 3984 3985 ã¿ã¼ã²ããéä¾åé¨ã®ã¡ã¢ãªç®¡çã¢ã¸ã¥ã¼ã«ã使ç¨ããï¼ã¿ã¼ã²ããä¾åé¨ã¾ 3986 ãã¯ã¦ã¼ã¶å´ã§ç¨æããå ´åã«ã¯ï¼ãã®ã·ã³ãã«ããã¯ãå®ç¾©ããï¼ 3987 3988 (6-15-2) void initialize_kmm(void)ï¼ãªãã·ã§ã³ï¼ 3989 3990 ã¡ã¢ãªç®¡çã¢ã¸ã¥ã¼ã«ãåæåããé¢æ°ï¼ã«ã¼ãã«ã®å²ãä»ããã¡ã¢ãªé åã® 3991 ãµã¤ãºã¨å 3992 é çªå°ã¯ï¼ããããkmmszã¨kmmã«ãã£ã¦åç 3993 §ã§ããï¼ 3994 3995 (6-15-3) void *kernel_malloc(SIZE size)ï¼ãªãã·ã§ã³ï¼ 3996 3997 sizeã§æå®ããããµã¤ãºã®ã¡ã¢ãªé åãå²ãä»ãï¼ãã®å 3998 é çªå°ãè¿ãé¢æ°ï¼ 3999 å²ãä»ãããã¨ãã§ããªãå ´åã«ã¯ï¼NULLãè¿ãï¼ 4000 4001 (6-15-4) void kernel_free(void *ptr)ï¼ãªãã·ã§ã³ï¼ 4002 4003 ptrã§æå®ãããã¡ã¢ãªé åã解æ¾ããé¢æ°ï¼ 4004 4005 6.15.1 TLSFãç¨ããã¡ã¢ãªç®¡çã¢ã¸ã¥ã¼ã«ã®ä¾ 4006 4007 ãªã¼ãã³ã½ã¼ã¹ã®ã¡ã¢ãªå²ä»ãã©ã¤ãã©ãªã§ããTLSFãç¨ãã¦åçã¡ã¢ãªç®¡ç 4008 ãå®ç¾ããã«ã¯ï¼OMIT_KMM_ALLOCONLYããã¯ãå®ç¾©ãï¼ä»¥ä¸ã®é¢æ°å®ç¾©çãCè¨ 4009 èªã½ã¼ã¹ãã¡ã¤ã«ã«å«ããã°ããï¼ 3181 ターゲット依存部から呼び出すovrtimer_startとovrtimer_stopを,アセンブリ 3182 言語のソースコード中に展開し,C言語の関数が不要になる場合には,それぞれ, 3183 OMIT_OVRTIMER_STARTとOMIT_OVRTIMER_STOPをマクロ定義する. 3184 3185 6.15 動的メモリ管理(オプション) 3186 3187 動的生成機能拡張パッケージを使用する場合には,カーネル内での動的メモリ 3188 管理の方法を決める必要がある. 3189 3190 動的生成機能拡張パッケージのターゲット非依存部では,メモリ領域を先頭か 3191 ら順に割り当て,解放されたメモリ領域を再利用しないメモリ管理モジュール 3192 のみを実装している.デフォルトでは,このメモリ管理モジュールが使用され 3193 る. 3194 3195 本格的な動的メモリ管理を行いたい場合には,ターゲット依存部またはユーザ 3196 側で,以下の関数を定義したメモリ管理モジュールを用意する必要がある. 3197 3198 (6-15-1) OMIT_KMM_ALLOCONLY(オプション) 3199 3200 ターゲット非依存部のメモリ管理モジュールを使用せず,ターゲット依存部ま 3201 たはユーザ側で用意する場合には,このシンボルをマクロ定義する. 3202 3203 (6-15-2) void initialize_kmm(void)(オプション) 3204 3205 メモリ管理モジュールを初期化する関数.カーネルの割り付けるメモリ領域の 3206 サイズと先頭番地は,それぞれkmmszとkmmによって参照できる. 3207 3208 (6-15-3) void *kernel_malloc(SIZE size)(オプション) 3209 3210 sizeで指定されたサイズのメモリ領域を割り付け,その先頭番地を返す関数. 3211 割り付けることができない場合には,NULLを返す. 3212 3213 (6-15-4) void kernel_free(void *ptr)(オプション) 3214 3215 ptrで指定されたメモリ領域を解放する関数. 3216 3217 6.15.1 TLSFを用いたメモリ管理モジュールの例 3218 3219 オープンソースのメモリ割付けライブラリであるTLSFを用いて動的メモリ管理 3220 を実現するには,OMIT_KMM_ALLOCONLYをマクロ定義し,以下の関数定義等をC言 3221 語ソースファイルに含めればよい. 4010 3222 4011 3223 ---------------------------------------- … … 4043 3255 4044 3256 4045 ï¼ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿è¨å®ãã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ 4046 4047 7.1 è¨å®ãã¡ã¤ã«ã¨ã¿ã¼ã²ããä¾åé¨ã®ä½ç½®ä»ã 4048 4049 ASPã«ã¼ãã«ã®ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã¯ï¼è¨å®ãã¡ã¤ã«ã®è¨è¿°ã«å¾ã£ã¦ãã¡ã¤ã«ã® 4050 çæããã³ã¨ã©ã¼ãã§ãã¯ãè¡ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®è¨å®ãã¡ã¤ã«ã«ã¯ï¼ 4051 以ä¸ã®4ã¤ãããï¼ 4052 4053 (a) éçAPIãã¼ãã« 4054 4055 éçAPIã®ä¸è¦§ã¨ï¼åéçAPIã®ãã©ã¡ã¼ã¿ã«ã¤ãã¦è¨è¿°ãããã¡ã¤ã«ï¼éç 4056 APIãæ¡å¼µããå ´å以å¤ã¯å¤æ´ããå¿ 4057 è¦ããªãããï¼ã¿ã¼ã²ããéä¾åé¨ã§ç¨æ 4058 ãã¦ããï¼kernel/kernel_api.csvï¼ï¼ 4059 4060 (b) å¤åå¾ã·ã³ãã«ãã¼ãã« 4061 4062 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹1ã«ããã¦ï¼ãã©ã¡ã¼ã¿è¨ç®ç¨Cè¨èªãã¡ã¤ã«ã«åºå 4063 ãï¼å¤ãæ±ãããã·ã³ãã«ï¼ä¸è¬ã«ã¯å¼ï¼ãè¨è¿°ããããã®ãã¡ã¤ã«ï¼ã¿ã¼ã²ã 4064 ãéä¾åé¨ã§ã¯ï¼ã¿ã¼ã²ããã«ä¾åããã«å¿ 4065 è¦ã¨ãªãã·ã³ãã«ãè¨è¿°ãããã¡ 4066 ã¤ã«ãç¨æãã¦ããï¼kernel/kernel_def.csvï¼ï¼ 4067 4068 ã¿ã¼ã²ããã«ä¾åãã¦å¿ 4069 è¦ã¨ãªãã·ã³ãã«ãããå ´åã«ã¯ï¼targetãã£ã¬ã¯ã 4070 ãªã«ç½®ãããtarget_def.csvä¸ã«è¨è¿°ããï¼target_def.csvä¸ã«è¨è¿°ãã¦å¤ã 4071 æ±ãããã¨ãã§ããã·ã³ãã«ã¯ï¼kernel/kernel_int.hããã³ããããã¤ã³ã¯ã«ã¼ 4072 ãããããã¡ã¤ã«ã§å®ç¾©ããã¦ããªããã°ãªããªãï¼kernel_int.hããã¯ï¼ 4073 target_stddef.hï¼target_kernel.hï¼target_config.hãï¼éæ¥çã«ï¼ã¤ã³ã¯ã«ã¼ 4074 ããã¦ããããï¼ãããã®ãã¡ã¤ã«ããã³ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ 4075 ã«ã§å®ç¾©ãããã¿ã¼ã²ããä¾åã®ã·ã³ãã«ã¯ï¼target_def.csvä¸ã«è¨è¿°ããã 4076 ã¨ãã§ããï¼ 4077 4078 ããã§å¤ãæ±ããã·ã³ãã«ã®å¤ã¯ï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹2ããã³ãã¹3ã® 4079 ãã³ãã¬ã¼ããã¡ã¤ã«ä¸ã§åç 4080 §ãããã¨ãã§ããï¼ 4081 4082 (c) ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã« 4083 4084 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹2ã¯ï¼ãã³ãã¬ã¼ããã¡ã¤ã«ã«å¾ã£ã¦ï¼ã«ã¼ãã«ã®æ§ 4085 æã»åæåãã¡ã¤ã«ï¼kernel_cfg.cï¼ï¼æ§æã»åæåããããã¡ã¤ã« 4086 ï¼kernel_cfg.hï¼ãªã©ãçæããï¼ãã®ãã³ãã¬ã¼ããã¡ã¤ã«ã¯ï¼ã¿ã¼ã²ãã 4087 éä¾åé¨ã¨ã¿ã¼ã²ããä¾åé¨ã«åãåãã¦ãããï¼ä»ã®ãã¡ã¤ã«ã®ã¿ã¼ã²ãã 4088 ä¾åé¨ã¨ã¯éã«ï¼ã¿ã¼ã²ããä¾åé¨ããã¿ã¼ã²ããéä¾åé¨ãã¤ã³ã¯ã«ã¼ãã 4089 ãå½¢ã«ãªã£ã¦ããï¼ 4090 4091 å 4092 ·ä½çã«ã¯ï¼targetãã£ã¬ã¯ããªã«ç½®ãããtarget.tfã§ï¼å¿ 4093 è¦ãªå¤æ°ãå®ç¾©ã 4094 ãå¾ï¼ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ï¼kernel/kernel.tfï¼ã㤠4095 ã³ã¯ã«ã¼ãããï¼kernel.tfã§ã¯ï¼ã«ã¼ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§ä½¿ç¨ããå¤ 4096 æ°å®ç¾©çãçæããï¼kernel.tfãã¤ã³ã¯ã«ã¼ãããå¾ï¼target.tfã§ã¯ï¼ã«ã¼ 4097 ãã«ã®ã¿ã¼ã²ããä¾åé¨ã§ä½¿ç¨ããå¤æ°å®ç¾©çãçæããï¼target.tfããï¼ã 4098 ãã»ããµä¾åé¨ï¼ãããä¾åé¨ãï¼éçºç°å¢ä¾åé¨ãåãåãã¦ãããï¼ 4099 4100 (d) ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã« 4101 4102 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹3ã¯ï¼ãã³ãã¬ã¼ããã¡ã¤ã«ã«å¾ã£ã¦ï¼éçAPIã®ä¸ 4103 è¬å®æ°å¼ãã©ã¡ã¼ã¿ã®ãã§ãã¯ãè¡ãï¼ãã®ãã³ãã¬ã¼ããã¡ã¤ã«ãï¼ã¿ã¼ã²ã 4104 ãéä¾åé¨ã¨ã¿ã¼ã²ããä¾åé¨ã«åãåãã¦ããï¼ã¿ã¼ã²ããä¾åé¨ããã¿ã¼ 4105 ã²ããéä¾åé¨ãã¤ã³ã¯ã«ã¼ãããå½¢ã«ãªã£ã¦ããï¼ 4106 4107 å 4108 ·ä½çã«ã¯ï¼targetãã£ã¬ã¯ããªã«ç½®ãããtarget_check.tfã§ï¼å¿ 4109 è¦ãªå¤æ°ã 4110 å®ç¾©ããå¾ï¼ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ 4111 ï¼kernel/kernel_check.tfï¼ãã¤ã³ã¯ã«ã¼ãããï¼kernel_check.tfã§ã¯ï¼ã«ã¼ 4112 ãã«ã®ã¿ã¼ã²ããéä¾åé¨ã§åæåãããã¯ã«åºåããä¸è¬å®æ°å¼ãã©ã¡ã¼ã¿ 4113 ã®ãã§ãã¯ãè¡ãï¼kernel_check.tfãã¤ã³ã¯ã«ã¼ãããå¾ï¼target_check.tf 4114 ã§ã¯ï¼ã¿ã¼ã²ããã«ä¾åãããã§ãã¯ãè¡ãï¼target_check.tfããï¼ããã»ã 4115 ãµä¾åé¨ï¼ãããä¾åé¨ãï¼éçºç°å¢ä¾åé¨ãåãåãã¦ãããï¼ 4116 4117 ãªãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®è©³ç´°ä»æ§ã¨è¨å®ãã¡ã¤ã«ã®è¨è¿°æ¹æ³ã«ã¤ãã¦ã¯ï¼ 4118 å¥éPDFãã¡ã¤ã«ã®å½¢ã§é 4119 å¸ãã¦ãããTOPPERSæ°ä¸ä»£ã«ã¼ãã«ç¨ã³ã³ãã£ã®ã¥ 4120 ã¬ã¼ã¿ä»æ§ãããã³ãTOPPERSæ°ä¸ä»£ã«ã¼ãã«ç¨ã³ã³ãã£ã®ã¥ã¬ã¼ã¿å 4121 èµãã¯ã 4122 ããã»ããµä»æ§ããåç 4123 §ãããã¨ï¼ 4124 4125 7.2 ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ 4126 4127 以ä¸ã§ã¯ï¼ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ãè¨è¿°ããä¸ã§å¿ 4128 4129 è¦ãªäºé 4130 ã«ã¤ãã¦èª¬æããï¼ 4131 4132 7.2.1 ã¿ã¼ã²ããéä¾åé¨ãã¤ã³ã¯ã«ã¼ãããåã«å®ç¾©ãã¹ãå¤æ° 4133 4134 target.tfããkernel.tfãã¤ã³ã¯ã«ã¼ãããåã«ï¼æ¬¡ã®å¤æ°ãå®ç¾©ãã¦ãã㪠4135 ããã°ãªããªãï¼ 4136 4137 (7-2-1-1) INTNO_ATTISR_VALID ATT_ISRã§ä½¿ç¨ã§ããå²è¾¼ã¿çªå· 4138 (7-2-1-2) INHNO_ATTISR_VALID INTNO_ATTISR_VALIDã«å¯¾å¿ããå²è¾¼ãã³ãã©çªå· 4139 (7-2-1-3) INHNO_DEFINH_VALID DEF_INTã§ä½¿ç¨ã§ããå²è¾¼ã¿ãã³ãã©çªå· 4140 (7-2-1-4) EXCNO_DEFEXC_VALID DEF_EXCã§ä½¿ç¨ã§ããCPUä¾å¤ãã³ãã©çªå· 4141 (7-2-1-5) INTNO_CFGINT_VALID CFG_INTã§ä½¿ç¨ã§ããå²è¾¼ã¿çªå· 4142 (7-2-1-6) INTPRI_CFGINT_VALID CFG_INTã§ä½¿ç¨ã§ããå²è¾¼ã¿åªå 4143 度 4144 4145 APIã§ä½¿ç¨ã§ããå²è¾¼ã¿çªå·ï¼å²è¾¼ã¿ãã³ãã©çªå·ï¼CPUä¾å¤ãã³ãã©çªå·ï¼å² 4146 è¾¼ã¿åªå 4147 度ã®ãªã¹ããï¼åå¤æ°ã«å®ç¾©ããï¼INHNO_ATTISR_VALIDã«ã¯ï¼ 4148 INTNO_ATTISR_VALIDã«ãªã¹ãã¢ããããå²è¾¼ã¿çªå·ã«å¯¾å¿ããå²è¾¼ã¿ãã³ãã© 4149 çªå·ã®ãªã¹ããå®ç¾©ããï¼CFG_INTã«ã¯ï¼ãã¹ã¦ã®å²è¾¼ã¿çªå·ãæå®ãããã¨ã 4150 ã§ããããï¼INTNO_CFGINT_VALIDã«ã¯ï¼æå¹ãªå²è¾¼ã¿çªå·ããã¹ã¦ãªã¹ãã¢ã 4151 ãããï¼ 4152 4153 (7-2-1-7) INTNO_FIX_KERNELï¼ãªãã·ã§ã³ï¼ ã«ã¼ãã«ç®¡çã«åºå®ããã¦ãã 4154 å²è¾¼ã¿çªå· 4155 (7-2-1-8) INHNO_FIX_KERNELï¼ãªãã·ã§ã³ï¼ ã«ã¼ãã«ç®¡çã«åºå®ããã¦ãã 4156 å²è¾¼ã¿ãã³ãã©çªå· 4157 (7-2-1-9) INHNO_FIX_NONKERNELï¼ãªãã·ã§ã³ï¼ ã«ã¼ãã«ç®¡çå¤ã«åºå®ããã¦ãã 4158 å²è¾¼ã¿çªå· 4159 (7-2-1-10) INHNO_FIX_NONKERNELï¼ãªãã·ã§ã³ï¼ã«ã¼ãã«ç®¡çå¤ã«åºå®ããã¦ãã 4160 å²è¾¼ã¿ãã³ãã©çªå· 4161 4162 ã«ã¼ãã«ç®¡çã¾ãã¯ã«ã¼ãã«ç®¡çå¤ã«åºå®ããã¦ããå²è¾¼ã¿ãããå ´åã«ã¯ï¼ 4163 ãããã®å²è¾¼ã¿çªå·ã¨å²è¾¼ã¿ãã³ãã©çªå·ã®ãªã¹ããï¼åå¤æ°ã«å®ç¾©ããï¼ 4164 4165 (7-2-1-11) USE_INHINIB_TABLEï¼ãªãã·ã§ã³ï¼ 4166 4167 OMIT_INITIALIZE_INTERRUPTãå®ç¾©ãããï¼å²è¾¼ã¿ãã³ãã©ã®åæåã«å¿ 4168 è¦ãªæ 4169 4170 å ±ãkernel_cfg.cã«çæãããå ´åã«ã¯ï¼ãã®å¤æ°ã1ã«è¨å®ããï¼å 4171 ·ä½çã«ã¯ï¼ 4172 TNUM_INHNOï¼tnum_inhnoï¼inhinib_tableã®å®ç¾©ã¨ï¼å²è¾¼ã¿ãã³ãã©æ¯ã®åºå 4173 ¥å£ 4174 å¦çãçæããããã®è¨è¿°ï¼INTHDR_ENTRYãã¯ãã®ãªã¹ãï¼ãï¼ã¿ã¼ã²ããé 4175 ä¾åé¨ã«ãã£ã¦çæãããï¼ 4176 4177 (7-2-1-12) USE_INTINIB_TABLEï¼ãªãã·ã§ã³ï¼ 4178 4179 OMIT_INITIALIZE_INTERRUPTãå®ç¾©ãããï¼å²è¾¼ã¿è¦æ±ã©ã¤ã³ã®åæåã«å¿ 4180 è¦ãª 4181 æ 4182 å ±ãkernel_cfg.cã«çæãããå ´åã«ã¯ï¼ãã®å¤æ°ã1ã«è¨å®ããï¼å 4183 ·ä½çã« 4184 ã¯ï¼TNUM_INTNOï¼tnum_intnoï¼intinib_tableã®å®ç¾©ãï¼ã¿ã¼ã²ããéä¾åé¨ã« 4185 ãã£ã¦çæãããï¼ 4186 4187 (7-2-1-13) GENERATE_TSKINICTXBï¼ãªãã·ã§ã³ï¼ 4188 4189 USE_TSKINICTXBããã¯ãå®ç¾©ããå ´åï¼TSKINICTXBã®åæåæ 4190 å ±ãçæããã 4191 ããã³ãã¬ã¼ããã¡ã¤ã«é¢æ°GENERATE_TSKINICTXBãå®ç¾©ããï¼ 4192 GENERATE_TSKINICTXBã«ã¯ï¼ã¿ã¹ã¯IDããã©ã¡ã¼ã¿ã¨ãã¦æ¸¡ãããï¼ 4193 4194 (7-2-1-14) ALLOC_STACKï¼ãªãã·ã§ã³ï¼ 4195 4196 ã¹ã¿ãã¯é åã®çææ¹æ³ãããã©ã«ãããå¤æ´ãããå ´åã«ã¯ï¼ã¹ã¿ãã¯é å 4197 ãçæããããã®ãã³ãã¬ã¼ããã¡ã¤ã«é¢æ°ALLOC_STACKãå®ç¾©ããï¼ 4198 ALLOC_STACKã«ã¯ï¼ã¹ã¿ãã¯é åã®å¤æ°åã¨ä¸¸ããåã®ãµã¤ãºããã©ã¡ã¼ã¿ã¨ã 4199 ã¦æ¸¡ãããã®ã§ï¼ã¹ã¿ãã¯é åãçæããã³ã¼ããçæãï¼å¤§ããæ¹ã«ä¸¸ãã 4200 ãµã¤ãºã表ãæååãè¿ãï¼ 4201 4202 7.2.2 ã¿ã¼ã²ããéä¾åé¨ã§å®ç¾©ãããå¤æ° 4203 4204 kernel.tfã®ä¸ã§ã¯æ¬¡ã®å¤æ°ãå®ç¾©ãããããï¼kernel.tfãã¤ã³ã¯ã«ã¼ããã 4205 å¾ï¼target.tfã®ä¸ã§ããããåç 4206 §ãããã¨ãã§ããï¼ 4207 4208 (7-2-2-1) INTNO[inhno] inhnoã対å¿ããintnoã«å¤æããããã®é£æ³é 4209 å 4210 (7-2-2-2) INHNO[intno] intnoã対å¿ããinhnoã«å¤æããããã®é£æ³é 4211 å 4212 4213 7.3 ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ 4214 4215 以ä¸ã§ã¯ï¼ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ãè¨è¿°ããä¸ã§å¿ 4216 4217 è¦ãªäºé 4218 ã«ã¤ãã¦èª¬æããï¼ 4219 4220 7.3.1 ã¿ã¼ã²ããéä¾åé¨ãã¤ã³ã¯ã«ã¼ãããåã«å®ç¾©ãã¹ãå¤æ° 4221 4222 target_check.tfããkernel_check.tfãã¤ã³ã¯ã«ã¼ãããåã«ï¼å¿ 4223 è¦ã«å¿ãã¦ï¼ 4224 次ã®å¤æ°ãå®ç¾©ãã¦ãããªããã°ãªããªãï¼ 4225 4226 (7-3-1-1) GET_STK_TSKINICTXBï¼ãªãã·ã§ã³ï¼ 4227 4228 USE_TSKINICTXBããã¯ãå®ç¾©ããå ´åï¼TINIBããã¹ã¿ãã¯é åã®å 4229 é çªå°ãå 4230 ãåºãããã®ãã³ãã¬ã¼ããã¡ã¤ã«é¢æ°GET_STK_TSKINICTXBãå®ç¾©ããï¼ 4231 GET_STK_TSKINICTXBã«ã¯ï¼ã¿ã¹ã¯åæåãããã¯ï¼TINIBï¼ã®å 4232 é çªå°ããã©ã¡ã¼ 4233 ã¿ã¨ãã¦æ¸¡ãããï¼CHECK_STACK_ALIGNï¼CHECK_STACK_NONNULLã¨ãå®ç¾©ããªã 4234 å ´åã«ã¯ï¼GET_STK_TSKINICTXBãå®ç¾©ããå¿ 4235 è¦ã¯ãªãï¼ 4236 4237 (7-3-1-2) LMA.ORDER_LISTï¼ãªãã·ã§ã³ï¼ 4238 (7-3-1-3) LMA.START_DATA[lmano]ï¼ãªãã·ã§ã³ï¼ 4239 (7-3-1-4) LMA.END_DATA[lmano]ï¼ãªãã·ã§ã³ï¼ 4240 (7-3-1-5) LMA.START_IDATA[lmano]ï¼ãªãã·ã§ã³ï¼ 4241 4242 ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããä¾åé¨ã§dataã»ã¯ã·ã§ã³ãããã¼ã¿ 4243 ãåå¾ããå ´åãï¼rodataã»ã¯ã·ã§ã³ãRAMã«ç½®ãå ´åï¼ã¦ã¼ã¶ã¼ãºããã¥ã¢ã« 4244 ã®ã11.8 rodataã»ã¯ã·ã§ã³ãRAMã«ç½®ãå ´åãã®ç¯ãåç 4245 §ï¼ã«ã¯ï¼ãããã®ã» 4246 ã¯ã·ã§ã³ã®å 4247 容ãï¼é 4248 ç½®ã¢ãã¬ã¹ï¼ROMå 4249 ã®ã¢ãã¬ã¹ï¼LMAã¨å¼ã¶ï¼ããã¢ã¯ã» 4250 ã¹ã¢ãã¬ã¹ï¼RAMå 4251 ã®ã¢ãã¬ã¹ï¼VMAã¨å¼ã¶ï¼ã«ã³ãã¼ããå¿ 4252 è¦ãããï¼ 4253 4254 ãã®ã³ãã¼ã¯ï¼LMA.ORDER_LISTã«ï¼ã³ãã¼ããã»ã¯ã·ã§ã³ã®çªå·ï¼lmanoï¼ã®ãª 4255 ã¹ãï¼çªå·ã¯ä»»æã«ä»ä¸ãã¦ããï¼ï¼LMA.START_DATA[lmano]ã«ã³ãã¼ããã»ã¯ 4256 ã·ã§ã³ã®ã¢ã¯ã»ã¹ã¢ãã¬ã¹ã®å 4257 é ã®ã©ãã«ï¼LMA.END_DATA[lmano]ã«æ«å°¾ã®ã©ã 4258 ã«ï¼LMA.START_IDATA[lmano]ã«ãã®é 4259 ç½®ã¢ãã¬ã¹ã®å 4260 é ã®ã©ãã«ãè¨å®ããã 4261 ã¨ã§ï¼ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ããéä¾åé¨ã§å®æ½ããï¼ 4262 4263 ä¾ãã°ï¼ã³ãã¼ããã»ã¯ã·ã§ã³ã®ã¢ã¯ã»ã¹ã¢ãã¬ã¹ã®å 4264 é ã®ã©ãã«ã 4265 "__data_start"ï¼æ«å°¾ã®ã©ãã«ã"__data_end"ï¼ãã®é 4266 ç½®ã¢ãã¬ã¹ã®å 4267 é ã®ã© 4268 ãã«ã"__idata_start"ã®å ´åã«ã¯ï¼ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã®ã¿ã¼ã²ã 4269 ãä¾åé¨ã«ä»¥ä¸ã®è¨è¿°ãå«ããï¼ 3257 7.コンフィギュレータ設定ファイルのターゲット依存部 3258 3259 7.1 設定ファイルとターゲット依存部の位置付け 3260 3261 ASPカーネルのコンフィギュレータは,設定ファイルの記述に従ってファイルの 3262 生成およびエラーチェックを行う.コンフィギュレータの設定ファイルには, 3263 以下の4つがある. 3264 3265 (a) 静的APIテーブル 3266 3267 静的APIの一覧と,各静的APIのパラメータについて記述したファイル.静的 3268 APIを拡張する場合以外は変更する必要がないため,ターゲット非依存部で用意 3269 している(kernel/kernel_api.csv). 3270 3271 (b) 値取得シンボルテーブル 3272 3273 コンフィギュレータのパス1において,パラメータ計算用C言語ファイルに出力 3274 し,値を求めたいシンボル(一般には式)を記述するためのファイル.ターゲッ 3275 ト非依存部では,ターゲットに依存せずに必要となるシンボルを記述したファ 3276 イルを用意している(kernel/kernel_def.csv). 3277 3278 ターゲットに依存して必要となるシンボルがある場合には,targetディレクト 3279 リに置かれたtarget_def.csv中に記述する.target_def.csv中に記述して値を 3280 求めることができるシンボルは,kernel/kernel_int.hおよびそこからインクルー 3281 ドされるファイルで定義されていなければならない.kernel_int.hからは, 3282 target_stddef.h,target_kernel.h,target_config.hを(間接的に)インクルー 3283 ドしているため,これらのファイルおよびそこからインクルードされるファイ 3284 ルで定義されるターゲット依存のシンボルは,target_def.csv中に記述するこ 3285 とができる. 3286 3287 ここで値を求めたシンボルの値は,コンフィギュレータのパス2およびパス3の 3288 テンプレートファイル中で参照することができる. 3289 3290 (c) パス2のテンプレートファイル 3291 3292 コンフィギュレータのパス2は,テンプレートファイルに従って,カーネルの構 3293 成・初期化ファイル(kernel_cfg.c),構成・初期化ヘッダファイル 3294 (kernel_cfg.h)などを生成する.このテンプレートファイルは,ターゲット 3295 非依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット 3296 依存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードす 3297 る形になっている. 3298 3299 具体的には,targetディレクトリに置かれたtarget.tfで,必要な変数を定義し 3300 た後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)をイ 3301 ンクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用する変 3302 数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,カー 3303 ネルのターゲット依存部で使用する変数定義等を生成する.target.tfから,プ 3304 ロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい. 3305 3306 (d) パス3のテンプレートファイル 3307 3308 コンフィギュレータのパス3は,テンプレートファイルに従って,静的APIの一 3309 般定数式パラメータのチェックを行う.このテンプレートファイルも,ターゲッ 3310 ト非依存部とターゲット依存部に切り分けてあり,ターゲット依存部からター 3311 ゲット非依存部をインクルードする形になっている. 3312 3313 具体的には,targetディレクトリに置かれたtarget_check.tfで,必要な変数を 3314 定義した後,テンプレートファイルのターゲット非依存部 3315 (kernel/kernel_check.tf)をインクルードする.kernel_check.tfでは,カー 3316 ネルのターゲット非依存部で初期化ブロックに出力した一般定数式パラメータ 3317 のチェックを行う.kernel_check.tfをインクルードした後,target_check.tf 3318 では,ターゲットに依存するチェックを行う.target_check.tfから,プロセッ 3319 サ依存部,チップ依存部を,開発環境依存部を切り分けてもよい. 3320 3321 なお,コンフィギュレータの詳細仕様と設定ファイルの記述方法については, 3322 別途PDFファイルの形で配布している「TOPPERS新世代カーネル用コンフィギュ 3323 レータ仕様」および「TOPPERS新世代カーネル用コンフィギュレータ内蔵マクロ 3324 プロセッサ仕様」を参照すること. 3325 3326 7.2 パス2のテンプレートファイルのターゲット依存部 3327 3328 以下では,パス2のテンプレートファイルのターゲット依存部を記述する上で必 3329 要な事項について説明する. 3330 3331 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数 3332 3333 target.tfからkernel.tfをインクルードする前に,次の変数を定義しておかな 3334 ければならない. 3335 3336 (7-2-1-1) INTNO_ATTISR_VALID ATT_ISRで使用できる割込み番号 3337 (7-2-1-2) INHNO_ATTISR_VALID INTNO_ATTISR_VALIDに対応する割込ハンドラ番号 3338 (7-2-1-3) INHNO_DEFINH_VALID DEF_INTで使用できる割込みハンドラ番号 3339 (7-2-1-4) EXCNO_DEFEXC_VALID DEF_EXCで使用できるCPU例外ハンドラ番号 3340 (7-2-1-5) INTNO_CFGINT_VALID CFG_INTで使用できる割込み番号 3341 (7-2-1-6) INTPRI_CFGINT_VALID CFG_INTで使用できる割込み優先度 3342 3343 APIで使用できる割込み番号/割込みハンドラ番号/CPU例外ハンドラ番号/割 3344 込み優先度のリストを,各変数に定義する.INHNO_ATTISR_VALIDには, 3345 INTNO_ATTISR_VALIDにリストアップした割込み番号に対応する割込みハンドラ 3346 番号のリストを定義する.CFG_INTには,すべての割込み番号を指定することが 3347 できるため,INTNO_CFGINT_VALIDには,有効な割込み番号をすべてリストアッ 3348 プする. 3349 3350 (7-2-1-7) INTNO_FIX_KERNEL(オプション) カーネル管理に固定されている 3351 割込み番号 3352 (7-2-1-8) INHNO_FIX_KERNEL(オプション) カーネル管理に固定されている 3353 割込みハンドラ番号 3354 (7-2-1-9) INHNO_FIX_NONKERNEL(オプション) カーネル管理外に固定されている 3355 割込み番号 3356 (7-2-1-10) INHNO_FIX_NONKERNEL(オプション)カーネル管理外に固定されている 3357 割込みハンドラ番号 3358 3359 カーネル管理またはカーネル管理外に固定されている割込みがある場合には, 3360 それらの割込み番号と割込みハンドラ番号のリストを,各変数に定義する. 3361 3362 (7-2-1-11) USE_INHINIB_TABLE(オプション) 3363 3364 OMIT_INITIALIZE_INTERRUPTを定義したが,割込みハンドラの初期化に必要な情 3365 報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的には, 3366 TNUM_INHNO,tnum_inhno,inhinib_tableの定義と,割込みハンドラ毎の出入口 3367 処理を生成するための記述(INTHDR_ENTRYマクロのリスト)が,ターゲット非 3368 依存部によって生成される. 3369 3370 (7-2-1-12) USE_INTINIB_TABLE(オプション) 3371 3372 OMIT_INITIALIZE_INTERRUPTを定義したが,割込み要求ラインの初期化に必要な 3373 情報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的に 3374 は,TNUM_INTNO,tnum_intno,intinib_tableの定義が,ターゲット非依存部に 3375 よって生成される. 3376 3377 (7-2-1-13) GENERATE_TSKINICTXB(オプション) 3378 3379 USE_TSKINICTXBをマクロ定義した場合,TSKINICTXBの初期化情報を生成するた 3380 めテンプレートファイル関数GENERATE_TSKINICTXBを定義する. 3381 GENERATE_TSKINICTXBには,タスクIDがパラメータとして渡される. 3382 3383 (7-2-1-14) ALLOC_STACK(オプション) 3384 3385 スタック領域の生成方法をデフォルトから変更したい場合には,スタック領域 3386 を生成するためのテンプレートファイル関数ALLOC_STACKを定義する. 3387 ALLOC_STACKには,スタック領域の変数名と丸める前のサイズがパラメータとし 3388 て渡されるので,スタック領域を生成するコードを生成し,大きい方に丸めた 3389 サイズを表す文字列を返す. 3390 3391 7.2.2 ターゲット非依存部で定義される変数 3392 3393 kernel.tfの中では次の変数が定義されるため,kernel.tfをインクルードした 3394 後,target.tfの中でこれらを参照することができる. 3395 3396 (7-2-2-1) INTNO[inhno] inhnoを対応するintnoに変換するための連想配列 3397 (7-2-2-2) INHNO[intno] intnoを対応するinhnoに変換するための連想配列 3398 3399 7.3 パス3のテンプレートファイルのターゲット依存部 3400 3401 以下では,パス3のテンプレートファイルのターゲット依存部を記述する上で必 3402 要な事項について説明する. 3403 3404 7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数 3405 3406 target_check.tfからkernel_check.tfをインクルードする前に,必要に応じて, 3407 次の変数を定義しておかなければならない. 3408 3409 (7-3-1-1) GET_STK_TSKINICTXB(オプション) 3410 3411 USE_TSKINICTXBをマクロ定義した場合,TINIBからスタック領域の先頭番地を取 3412 り出すためのテンプレートファイル関数GET_STK_TSKINICTXBを定義する. 3413 GET_STK_TSKINICTXBには,タスク初期化ブロック(TINIB)の先頭番地がパラメー 3414 タとして渡される.CHECK_STACK_ALIGN,CHECK_STACK_NONNULLとも定義しない 3415 場合には,GET_STK_TSKINICTXBを定義する必要はない. 3416 3417 (7-3-1-2) LMA.ORDER_LIST(オプション) 3418 (7-3-1-3) LMA.START_DATA[lmano](オプション) 3419 (7-3-1-4) LMA.END_DATA[lmano](オプション) 3420 (7-3-1-5) LMA.START_IDATA[lmano](オプション) 3421 3422 パス3のテンプレートファイルのターゲット依存部でdataセクションからデータ 3423 を取得する場合や,rodataセクションをRAMに置く場合(ユーザーズマニュアル 3424 の「11.8 rodataセクションをRAMに置く場合」の節を参照)には,これらのセ 3425 クションの内容を,配置アドレス(ROM内のアドレス,LMAと呼ぶ)からアクセ 3426 スアドレス(RAM内のアドレス,VMAと呼ぶ)にコピーする必要がある. 3427 3428 このコピーは,LMA.ORDER_LISTに,コピーするセクションの番号(lmano)のリ 3429 スト(番号は任意に付与してよい),LMA.START_DATA[lmano]にコピーするセク 3430 ションのアクセスアドレスの先頭のラベル,LMA.END_DATA[lmano]に末尾のラベ 3431 ル,LMA.START_IDATA[lmano]にその配置アドレスの先頭のラベルを設定するこ 3432 とで,パス3のテンプレートファイルのターゲット非依存部で実施する. 3433 3434 例えば,コピーするセクションのアクセスアドレスの先頭のラベルが 3435 "__data_start",末尾のラベルが"__data_end",その配置アドレスの先頭のラ 3436 ベルが"__idata_start"の場合には,パス3のテンプレートファイルのターゲッ 3437 ト依存部に以下の記述を含める. 4270 3438 4271 3439 ---------------------------------------- … … 4277 3445 4278 3446 4279 7.3.2 ã¿ã¼ã²ããä¾åé¨ã§è¡ãã¹ãã¨ã©ã¼ãã§ã㯠4280 4281 以ä¸ã®å 4282 é çªå°ã¯ï¼ã¿ã¼ã²ããéä¾åé¨ã§çæãããã¼ãã«ã«åºåãããªãã 4283 ãï¼ãã¹3ã®ã¿ã¼ã²ããéä¾åé¨ï¼kernel_check.tfï¼ã§ã¯ï¼ããã°ã©ã ã®éå§ 4284 çªå°ã¨ãã¦æ£ãããªãå ´åã®ã¨ã©ã¼ããã§ãã¯ããªãï¼ãã®ããï¼ã¿ã¼ã²ãã 4285 ä¾åé¨ã§ã¨ã©ã¼ãã§ãã¯ãè¡ãå¿ 4286 è¦ãããï¼ 4287 4288 ã»å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã®å 4289 é çªå°ï¼ATT_ISRã®isrï¼ 4290 ã»å²è¾¼ã¿ãã³ãã©ã®å 4291 é çªå°ï¼DEF_INHã®inthdrï¼ 4292 ã»CPUä¾å¤ãã³ãã©ã®å 4293 é çªå°ï¼DEF_EXCã®exchdrï¼ 4294 ã»åæåã«ã¼ãã³ã®å 4295 é çªå°ï¼ATT_INIã®inirtnï¼ 4296 ã»çµäºå¦çã«ã¼ãã³ã®å 4297 é çªå°ï¼ATT_TERã®terrtnï¼ 4298 4299 ãã ãï¼ã¿ã¼ã²ããä¾åé¨ã«ããã¦ãï¼ãããã®ã¨ã©ã¼ãã§ãã¯ãè¡ããã¨ã¯ 4300 éããªãããï¼ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ã®ã1.5 æ¢ç¥ã®åé¡ãã®ç¯ã«ã¯ï¼ã¿ã¼ã²ã 4301 ãä¾åã§ãããã®ã¨ã©ã¼ãæ¤åºãããªããã¨ãããæ¨ãè¨è¼ãã¦ããï¼ 4302 4303 7.4 cfg1_out.cã®ãªã³ã¯ã«å¿ 4304 è¦ãªã¹ã¿ãã®å®ç¾©ãã¡ã¤ã« 4305 4306 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã«é¢ãã¦ã¿ã¼ã²ããä¾åã«ç¨æããå¿ 4307 è¦ããããã¡ã¤ã«ã¨ 4308 ãã¦ï¼è¨å®ãã¡ã¤ã«ä»¥å¤ã«ï¼cfg1_out.cããªã³ã¯ããããã«å¿ 4309 è¦ãªã¹ã¿ãã®å® 4310 義ãã¡ã¤ã«ãããï¼ 4311 4312 ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹1ã§ã¯ï¼éçAPIã®æ´æ°å®æ°å¼ãã©ã¡ã¼ã¿ã®å¤ãCã³ã³ 4313 ãã¤ã©ãç¨ãã¦æ±ããããã«ï¼cfg1_out.cãçæããï¼ãããã³ã³ãã¤ã«ï¼ãª 4314 ã³ã¯ãã¦ãªãã¸ã§ã¯ããã¡ã¤ã«ãçæããéã«ï¼ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã 4315 ãåç 4316 §ãããã·ã³ãã«ã®å®ç¾©ãä¸ããå¿ 4317 è¦ãããï¼ 4318 4319 ãã®å®ç¾©ãä¸ããããã«ï¼cfg1_out.cããï¼ã¿ã¼ã²ããä¾åé¨ã® 4320 target_cfg1_out.hãã¤ã³ã¯ã«ã¼ããã¦ããï¼target_cfg1_out.hï¼ã¾ãã¯ï¼ã 4321 ãããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ã«ã¯ï¼ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ããå 4322 ç 4323 §ãããã·ã³ãã«ã®ã¹ã¿ãã®å®ç¾©ãå«ããï¼å 4324 ¸åçã«ã¯ï¼ä»¥ä¸ã®ãããªå®ç¾©ã 4325 å«ããå¿ 4326 è¦ãããï¼ 3447 7.3.2 ターゲット依存部で行うべきエラーチェック 3448 3449 以下の先頭番地は,ターゲット非依存部で生成するテーブルに出力されないた 3450 め,パス3のターゲット非依存部(kernel_check.tf)では,プログラムの開始 3451 番地として正しくない場合のエラーをチェックしない.そのため,ターゲット 3452 依存部でエラーチェックを行う必要がある. 3453 3454 ・割込みサービスルーチンの先頭番地(ATT_ISRのisr) 3455 ・割込みハンドラの先頭番地(DEF_INHのinthdr) 3456 ・CPU例外ハンドラの先頭番地(DEF_EXCのexchdr) 3457 ・初期化ルーチンの先頭番地(ATT_INIのinirtn) 3458 ・終了処理ルーチンの先頭番地(ATT_TERのterrtn) 3459 3460 ただし,ターゲット依存部においても,これらのエラーチェックを行えるとは 3461 限らないため,ユーザーズマニュアルの「1.5 既知の問題」の節には,ターゲッ 3462 ト依存でこれらのエラーが検出されないことがある旨を記載してある. 3463 3464 7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル 3465 3466 コンフィギュレータに関してターゲット依存に用意する必要があるファイルと 3467 して,設定ファイル以外に,cfg1_out.cをリンクするために必要なスタブの定 3468 義ファイルがある. 3469 3470 コンフィギュレータのパス1では,静的APIの整数定数式パラメータの値をCコン 3471 パイラを用いて求めるために,cfg1_out.cを生成する.これをコンパイル,リ 3472 ンクしてオブジェクトファイルを生成する際に,スタートアップモジュールか 3473 ら参照されるシンボルの定義を与える必要がある. 3474 3475 この定義を与えるために,cfg1_out.cから,ターゲット依存部の 3476 target_cfg1_out.hをインクルードしている.target_cfg1_out.h(または,そ 3477 こからインクルードされるファイル)には,スタートアップモジュールから参 3478 照されるシンボルのスタブの定義を含める.典型的には,以下のような定義を 3479 含める必要がある. 4327 3480 4328 3481 ---------------------------------------- … … 4344 3497 ---------------------------------------- 4345 3498 4346 ã¾ãï¼ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ãç¨ãã¦ãªãã»ãããã¡ã¤ã«ï¼offset.hï¼ãçæã 4347 ãå ´åã«ã¯ï¼ãã®ããã®è¨è¿°ãtarget_cfg1_out.hï¼ã¾ãã¯ï¼ããããã¤ã³ã¯ã«ã¼ 4348 ãããããã¡ã¤ã«ï¼ã«è¿½å ããå¿ 4349 è¦ãããï¼è©³ããã¯ï¼ã2.5.1 ã³ã³ãã£ã®ã¥ 4350 ã¬ã¼ã¿ãç¨ããæ¹æ³ãã®ç¯ãåç 4351 §ãããã¨ï¼ 4352 4353 4354 ï¼ï¼ã·ã¹ãã ãµã¼ãã¹çã®ã¿ã¼ã²ããä¾åé¨ 4355 4356 8.0 ã·ã¹ãã ãµã¼ãã¹ã®ã¿ã¼ã²ããä¾åé¨ 4357 4358 ã·ãªã¢ã«ãã¼ãæ°ãã·ã¹ãã ãã°ã¿ã¹ã¯é¢é£ã®å®æ°ãªã©ï¼ã·ã¹ãã ãµã¼ãã¹ã® 4359 æ§æã決å®ããããã®å®ç¾©ãtarget_syssvc.hã¾ãã¯ããããã¤ã³ã¯ã«ã¼ããã 4360 ããã¡ã¤ã«ï¼ããã»ããµã»ãããã»éçºç°å¢ä¾åé¨ã§ç¨æãããããããã¡ã¤ 4361 ã«ãªã©ï¼ã«å«ããï¼ 4362 4363 ãªãï¼TOPPERSçµè¾¼ã¿ã³ã³ãã¼ãã³ãã·ã¹ãã ãå°å 4364 ¥ãããã¨ï¼ãã®ãã¡ã¤ã«ã® 4365 å 4366 容ã¯ã³ã³ãã¼ãã³ãè¨è¿°ãã¡ã¤ã«ã«è¨è¿°ããããã¨ã«ãªãï¼ãã®ãã¡ã¤ã«ã¯ 4367 ç¡ããªãï¼ã¾ãã¯ï¼å¤§å¹ 4368 ã«ç¸®å°ãããï¼è¦è¾¼ã¿ã§ããï¼ 4369 4370 8.1 ã·ã¹ãã ãã°æ©è½ã®ã¿ã¼ã²ããä¾åå®ç¾© 4371 4372 ã·ã¹ãã ãã°æ©è½ã使ç¨ããå ´åã§ï¼ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã§bssã»ã¯ã·ã§ 4373 ã³ã®ã¯ãªã¢ãçç¥ãã¦ããå ´åã«ã¯ï¼syslog_logmaskã¨syslog_lowmask_notã 4374 0ã«åæåããã³ã¼ãã追å ããï¼ããã¯ï¼ã·ã¹ãã ãã°æ©è½ãåæåãããå 4375 ã«åºåããããã°æ 4376 å ±ãï¼ä½ã¬ãã«åºåæ©è½ãç¨ãã¦åºåããããã§ããï¼ 4377 4378 ã¿ã¼ã²ããä¾åé¨ã§æä¾ãã¹ãã·ã¹ãã ãã°æ©è½ã®ããã®å®ç¾©ã¯æ¬¡ã®éãã§ã 4379 ãï¼ 3499 また,コンフィギュレータを用いてオフセットファイル(offset.h)を生成す 3500 る場合には,そのための記述をtarget_cfg1_out.h(または,そこからインクルー 3501 ドされるファイル)に追加する必要がある.詳しくは,「2.5.1 コンフィギュ 3502 レータを用いる方法」の節を参照すること. 3503 3504 3505 8.システムサービス等のターゲット依存部 3506 3507 8.0 システムサービスのターゲット依存部 3508 3509 シリアルポート数やシステムログタスク関連の定数など,システムサービスの 3510 構成を決定するための定義をtarget_syssvc.hまたはそこからインクルードされ 3511 るファイル(プロセッサ・チップ・開発環境依存部で用意されるヘッダファイ 3512 ルなど)に含める. 3513 3514 なお,TOPPERS組込みコンポーネントシステムが導入されると,このファイルの 3515 内容はコンポーネント記述ファイルに記述されることになり,このファイルは 3516 無くなる(または,大幅に縮小される)見込みである. 3517 3518 8.1 システムログ機能のターゲット依存定義 3519 3520 システムログ機能を使用する場合で,スタートアップモジュールでbssセクショ 3521 ンのクリアを省略している場合には,syslog_logmaskとsyslog_lowmask_notを 3522 0に初期化するコードを追加する.これは,システムログ機能が初期化される前 3523 に出力されたログ情報を,低レベル出力機能を用いて出力するためである. 3524 3525 ターゲット依存部で提供すべきシステムログ機能のための定義は次の通りであ 3526 る. 4380 3527 4381 3528 (8-1-1) TCNT_SYSLOG_BUFFER 4382 3529 4383 ã·ã¹ãã ãã°æ©è½ã®ãã°ãããã¡ã®ãµã¤ãºãå®ç¾©ãããã¯ãï¼å®ç¾©ããªãå ´å 4384 ã®ããã©ã«ãå¤ã¯32ï¼ 3530 システムログ機能のログバッファのサイズを定義するマクロ.定義しない場合 3531 のデフォルト値は32. 4385 3532 4386 3533 (8-1-2) void target_fput_log(char c) 4387 3534 4388 ã·ã¹ãã ãã°ã®ä½ã¬ãã«åºåã®ããã®æååºåé¢æ°ï¼ã¿ã¼ã²ããä¾åã®æ¹æ³ã§ï¼ 4389 æåcã表示/åºå/ä¿åããï¼ 4390 4391 ãã®é¢æ°ã¯ï¼ãªã¨ã³ãã©ã³ãã«å®è£ 4392 ããªããã°ãªããªãï¼ãã®é¢æ°å 4393 ã§æä»å¶ 4394 御ãå¿ 4395 è¦ãªå ´åã«ã¯ï¼SILãç¨ãã¦å 4396 ¨å²è¾¼ã¿ããã¯ç¶æ 4397 ã«ãããã¨ï¼ã¾ãï¼å 4398 ¨å² 4399 è¾¼ã¿ããã¯ç¶æ 4400 ã§å¼ã°ããå ´åãããããï¼å 4401 ¨å²è¾¼ã¿ããã¯ç¶æ 4402 ããå¼ã³åºã 4403 ãã¨ãã§ããªãé¢æ°ãå¼ã°ãªãããã«å®è£ 4404 ããªããã°ãªããªãï¼ 4405 4406 ä½ã¬ãã«åºåãã·ãªã¢ã«ãã¼ãçµç±ã§è¡ãå ´åã§ï¼ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ã 4407 ã©ã¤ãã¨ãã¼ããå 4408 ±ç¨ããªããã¨ãæã¾ãããï¼ãã¼ãæ°ã足ããªãããã«ã 4409 ããããå 4410 ±ç¨ããå ´åã«ã¯ï¼ä¸¡è 4411 ã競åããªãããã«æ³¨æãå¿ 4412 è¦ã§ããï¼å 4413 ·ä½ 4414 çã«ã¯ï¼ä¸¡è 4415 ãåãè¨å®ã§ã·ãªã¢ã«I/Oããã¤ã¹ã使ãããã«ãï¼ã·ãªã¢ã«ã¤ã³ 4416 ã¿ãã§ã¼ã¹ãã©ã¤ãã®åä½ä¸ã«ä½ã¬ãã«åºåãè¡ããã¦ãå·®ãæ¯ããªãããã« 4417 è¨è¨ããï¼ã¾ãï¼ä½ã¬ãã«åºåãåä½éå§å¾ã«ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ 4418 ããã·ãªã¢ã«I/Oããã¤ã¹ãåæåããã¨ï¼æååããèµ·ããå¯è½æ§ãããããï¼ 4419 å 4420 ±ç¨ãããã¼ãã¯ï¼ä½ã¬ãã«åºåæ©è½å´ã§åæåãï¼ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ 4421 ãã©ã¤ãã§ã¯åæåããªãããã«ããã¨ããï¼ 4422 4423 ãªãï¼ãã®é¢æ°ã®æ¬ä½ãï¼ã©ã®ãã¡ã¤ã«ã«è¨è¿°ããããåé¡ã«ãªãï¼ã·ã¹ãã 4424 ãµã¼ãã¹ã®ã¿ã¼ã²ããä¾åé¨ã«ã¯ï¼æ¨æºã§ã¯ï¼é¢æ°å®ç¾©ãè¨è¿°ããããã®ãã¡ 4425 ã¤ã«ãç¨æãã¦ããªãï¼ã¿ã¼ã²ããä¾åã§ç¨æãã¦ããããï¼ä¾å¤çã«ï¼ã«ã¼ 4426 ãã«å®è£ 4427 ã®ã¿ã¼ã²ããä¾åã¢ã¸ã¥ã¼ã«ï¼target_config.cï¼ã«è¨è¿°ãã¦ãããï¼ 4428 ãã®å ´åï¼target_fput_logãï¼ãªãã¼ã è¨è¿°ï¼target_rename.defãªã©ï¼ã«å« 4429 ãã¦ã¯ãªããªãï¼ 4430 4431 8.2 ãã°ã¿ã¹ã¯ã®ã¿ã¼ã²ããä¾åå®ç¾© 4432 4433 ã¿ã¼ã²ããä¾åé¨ã§æä¾ãã¹ããã°ã¿ã¹ã¯ã®ããã®å®ç¾©ã¯æ¬¡ã®éãã§ããï¼ã 4434 ããã®å®ç¾©ã¯ï¼target_syssvc.hã¾ãã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ã« 4435 å«ããï¼ 4436 4437 (8-2-1) LOGTASK_PRIORITYï¼ãªãã·ã§ã³ï¼ 4438 4439 ãã°ã¿ã¹ã¯ã®åªå 4440 度ãå®ç¾©ãããã¯ãï¼å®ç¾©ããªãå ´åã®ããã©ã«ãå¤ã¯3ï¼ 4441 4442 (8-2-2) LOGTASK_STACK_SIZEï¼ãªãã·ã§ã³ï¼ 4443 4444 ãã°ã¿ã¹ã¯ã®ã¹ã¿ãã¯ãµã¤ãºãå®ç¾©ãããã¯ãï¼å®ç¾©ããªãå ´åã®ããã©ã«ã 4445 å¤ã¯1024ï¼ 4446 4447 (8-2-3) LOGTASK_PORTIDï¼ãªãã·ã§ã³ï¼ 4448 4449 ãã°ã¿ã¹ã¯ã®åºåå 4450 ã®ã·ãªã¢ã«ãã¼ãçªå·ï¼å®ç¾©ããªãå ´åã®ããã©ã«ãå¤ã¯1ï¼ 4451 4452 (8-2-4) LOGTASK_INTERVALï¼ãªãã·ã§ã³ï¼ 4453 4454 ãã°ã¿ã¹ã¯ã®åä½ééï¼åä½ã¯ããªç§ï¼ï¼å®ç¾©ããªãå ´åã®ããã©ã«ãå¤ã¯10ï¼ 4455 4456 (8-2-5) LOGTASK_FLUSH_WAITï¼ãªãã·ã§ã³ï¼ 4457 4458 ãã°åºåãå¾ 4459 ã¡åãããå¦çã«ããã¦ï¼ã¿ã¹ã¯ãå¾ 4460 ãããåä½ã¨ãªãæéï¼å 4461 ä½ã¯ããªç§ï¼ï¼å®ç¾©ããªãå ´åã®ããã©ã«ãå¤ã¯1ï¼ 4462 4463 8.3 ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã®ã¿ã¼ã²ããä¾åé¨ 4464 4465 ã¿ã¼ã²ããä¾åé¨ã§æä¾ãã¹ãã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã®ããã®å®ç¾© 4466 ã¯æ¬¡ã®éãã§ããï¼ãããã®å®ç¾©ã¯ï¼å¥ã«æå®ããªãéãï¼target_serial.hã¾ 4467 ãã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ã«å«ãï¼å¿ 4468 è¦ãªã³ã³ãã£ã®ã¥ã¬ã¼ã·ã§ 4469 ã³æ 4470 å ±ãtarget_serial.cfgã«è¨è¿°ããï¼é¢æ°ã®å®ä½ãå¿ 4471 è¦ãªå ´åã«ã¯ï¼ 4472 target_serial.cçã®ãã¡ã¤ã«ãç¨æããï¼ 4473 4474 ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã®ä¸ã§ï¼ã¿ã¼ã²ããã®ã·ãªã¢ã«I/Oããã¤ã¹ã« 4475 ä¾åããé¨åãï¼ã·ãªã¢ã«I/Oããã¤ã¹ãã©ã¤ãã¨å¼ã¶ï¼ã·ãªã¢ã«I/Oããã¤ã¹ 4476 ãã©ã¤ãã¯ï¼ããããï¼ITRONããã¤ã¹ãã©ã¤ãè¨è¨ã¬ã¤ãã©ã¤ã³ã®PDICã«ç¸å½ 4477 ããï¼PDICã«ç¸å½ãããã¡ã¤ã«ã§ï¼ä»ã®ã·ã¹ãã ã«ãå 4478 ±éã«ä½¿ããå¯è½æ§ãã 4479 ãå ´åã«ã¯ï¼pdicãã£ã¬ã¯ããªã«ç½®ãï¼ 4480 4481 8.3.1 å¤æ°ï¼ãã¼ã¿åï¼ç®¡çé¢æ° 3535 システムログの低レベル出力のための文字出力関数.ターゲット依存の方法で, 3536 文字cを表示/出力/保存する. 3537 3538 この関数は,リエントラントに実装しなければならない.この関数内で排他制 3539 御が必要な場合には,SILを用いて全割込みロック状態にすること.また,全割 3540 込みロック状態で呼ばれる場合があるため,全割込みロック状態から呼び出す 3541 ことができない関数を呼ばないように実装しなければならない. 3542 3543 低レベル出力をシリアルポート経由で行う場合で,シリアルインタフェースド 3544 ライバとポートを共用しないことが望ましいが,ポート数が足りないためにや 3545 むをえず共用する場合には,両者が競合しないように注意が必要である.具体 3546 的には,両者が同じ設定でシリアルI/Oデバイスを使うようにし,シリアルイン 3547 タフェースドライバの動作中に低レベル出力が行われても差し支えないように 3548 設計する.また,低レベル出力が動作開始後にシリアルインタフェースドライ 3549 バがシリアルI/Oデバイスを初期化すると,文字化けが起こる可能性があるため, 3550 共用するポートは,低レベル出力機能側で初期化し,シリアルインタフェース 3551 ドライバでは初期化しないようにするとよい. 3552 3553 なお,この関数の本体を,どのファイルに記述するかが問題になる.システム 3554 サービスのターゲット依存部には,標準では,関数定義を記述するためのファ 3555 イルを用意していない.ターゲット依存で用意してもよいが,例外的に,カー 3556 ネル実装のターゲット依存モジュール(target_config.c)に記述してもよい. 3557 この場合,target_fput_logを,リネーム記述(target_rename.defなど)に含 3558 めてはならない. 3559 3560 8.2 ログタスクのターゲット依存定義 3561 3562 ターゲット依存部で提供すべきログタスクのための定義は次の通りである.こ 3563 れらの定義は,target_syssvc.hまたはそこからインクルードされるファイルに 3564 含める. 3565 3566 (8-2-1) LOGTASK_PRIORITY(オプション) 3567 3568 ログタスクの優先度を定義するマクロ.定義しない場合のデフォルト値は3. 3569 3570 (8-2-2) LOGTASK_STACK_SIZE(オプション) 3571 3572 ログタスクのスタックサイズを定義するマクロ.定義しない場合のデフォルト 3573 値は1024. 3574 3575 (8-2-3) LOGTASK_PORTID(オプション) 3576 3577 ログタスクの出力先のシリアルポート番号.定義しない場合のデフォルト値は1. 3578 3579 (8-2-4) LOGTASK_INTERVAL(オプション) 3580 3581 ログタスクの動作間隔(単位はミリ秒).定義しない場合のデフォルト値は10. 3582 3583 (8-2-5) LOGTASK_FLUSH_WAIT(オプション) 3584 3585 ログ出力を待ち合わせる処理において,タスクを待たせる単位となる時間(単 3586 位はミリ秒).定義しない場合のデフォルト値は1. 3587 3588 8.3 シリアルインタフェースドライバのターゲット依存部 3589 3590 ターゲット依存部で提供すべきシリアルインタフェースドライバのための定義 3591 は次の通りである.これらの定義は,別に指定がない限り,target_serial.hま 3592 たはそこからインクルードされるファイルに含め,必要なコンフィギュレーショ 3593 ン情報をtarget_serial.cfgに記述する.関数の実体が必要な場合には, 3594 target_serial.c等のファイルを用意する. 3595 3596 シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイスに 3597 依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイス 3598 ドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに相当 3599 する.PDICに相当するファイルで,他のシステムにも共通に使える可能性があ 3600 る場合には,pdicディレクトリに置く. 3601 3602 8.3.1 変数,データ型,管理関数 4482 3603 4483 3604 (8-3-1-1) TNUM_PORT 4484 3605 4485 ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãããµãã¼ãããã·ãªã¢ã«ãã¼ãæ°ãå®ç¾©ãã 4486 ãã¯ãï¼ãã®ãã¯ãã®å®ç¾©ã¯ï¼target_syssvc.hã¾ãã¯ããããã¤ã³ã¯ã«ã¼ãã 4487 ãããã¡ã¤ã«ã«å«ããï¼ 4488 4489 (8-3-1-2) void sio_initialize(intptr_t exinf) ï¼ãªãã·ã§ã³ï¼4490 4491 ã·ãªã¢ã«I/Oããã¤ã¹ãã©ã¤ãã®åæåå¦çï¼target_serial.cfgã«ï¼ãã®é¢æ° 4492 ãåæåã«ã¼ãã³ã¨ãã¦ç»é²ããéçAPIãå«ããï¼ 4493 4494 (8-3-1-3) void sio_terminate(intptr_t exinf) ï¼ãªãã·ã§ã³ï¼4495 4496 ã·ãªã¢ã«I/Oããã¤ã¹ãã©ã¤ãã®çµäºå¦çï¼target_serial.cfgã«ï¼ãã®é¢æ°ã 4497 çµäºå¦çã«ã¼ãã³ã¨ãã¦ç»é²ããéçAPIãå«ããï¼ 3606 シリアルインタフェースドライバがサポートするシリアルポート数を定義する 3607 マクロ.このマクロの定義は,target_syssvc.hまたはそこからインクルードさ 3608 れるファイルに含める. 3609 3610 (8-3-1-2) void sio_initialize(intptr_t exinf)(オプション) 3611 3612 シリアルI/Oデバイスドライバの初期化処理.target_serial.cfgに,この関数 3613 を初期化ルーチンとして登録する静的APIを含める. 3614 3615 (8-3-1-3) void sio_terminate(intptr_t exinf)(オプション) 3616 3617 シリアルI/Oデバイスドライバの終了処理.target_serial.cfgに,この関数を 3618 終了処理ルーチンとして登録する静的APIを含める. 4498 3619 4499 3620 (8-3-1-4) void sio_isr(intptr_t exinf) 4500 3621 4501 ã·ãªã¢ã«I/Oããã¤ã¹ã®å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ï¼target_serial.cfgã«ï¼ãã® 4502 é¢æ°ãå²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã¨ãã¦ç»é²ããéçAPIãå«ããï¼ã¾ãï¼ãã®é 4503 çAPIã«å¿ 4504 è¦ãªã·ãªã¢ã«I/Oããã¤ã¹ã®å²è¾¼ã¿çªå·ãªã©ã¯ï¼target_serial.hã§ã 4505 ã¯ãå®ç¾©ããï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ã§ã¯ãªãï¼å²è¾¼ã¿ãã³ãã©ã¨ããã㨠4506 ãã§ããï¼ 3622 シリアルI/Oデバイスの割込みサービスルーチン.target_serial.cfgに,この 3623 関数を割込みサービスルーチンとして登録する静的APIを含める.また,その静 3624 的APIに必要なシリアルI/Oデバイスの割込み番号などは,target_serial.hでマ 3625 クロ定義する.割込みサービスルーチンではなく,割込みハンドラとすること 3626 もできる. 4507 3627 4508 3628 (8-3-1-5) SIOPCB 4509 3629 4510 ã·ãªã¢ã«I/Oãã¼ã管çãããã¯ã®ãã¼ã¿åï¼target_serial.hã«ã¯ï¼ãã¼ã¿å 4511 ã®å®£è¨ã ãå«ã¾ãã¦ããã°ããï¼ï¼ 4512 4513 (8-3-1-6) SIO_RDY_SNDã¨SIO_RDY_RCV 4514 4515 éä¿¡å¯è½ã³ã¼ã«ããã¯ã®èå¥çªå·ãSIO_RDY_SNDã«ï¼åä¿¡éç¥ã³ã¼ã«ããã¯ã®è 4516 å¥çªå·ãSIO_RDY_RCVã«ãã¯ãå®ç¾©ããï¼ã³ã¼ã«ããã¯ã®ç¦æ¢ï¼è¨±å¯ãè¡ãªããµã¼ 4517 ãã¹ã³ã¼ã«ï¼sio_ena_cbrã¨sio_dis_cbrï¼ã§ç¨ããï¼ 4518 4519 8.3.2 ããã¤ã¹ãµã¼ãã¹ã«ã¼ãã³ 4520 4521 以ä¸ã®ããã¤ã¹ãµã¼ãã«ã«ã¼ãã³ã¯ï¼ï¼å°ãªãã¨ãï¼ã·ãªã¢ã«I/Oãã¼ãããã® 4522 å²è¾¼ã¿ããã¹ã¯ãããç¶æ 4523 ã§å¼ã³åºãããï¼ã¾ãï¼ã¿ã¹ã¯ã³ã³ããã¹ãï¼éã¿ 4524 ã¹ã¯ã³ã³ããã¹ãã®ãããã§å¼ã³åºãããå ´åãããï¼ãããã§å¼ã³åºãã㦠4525 ãåä½ããããã«ããªããã°ãªããªãï¼ï¼ 3630 シリアルI/Oポート管理ブロックのデータ型(target_serial.hには,データ型 3631 の宣言だけ含まれていればよい). 3632 3633 (8-3-1-6) SIO_RDY_SNDとSIO_RDY_RCV 3634 3635 送信可能コールバックの識別番号をSIO_RDY_SNDに,受信通知コールバックの識 3636 別番号をSIO_RDY_RCVにマクロ定義する.コールバックの禁止/許可を行なうサー 3637 ビスコール(sio_ena_cbrとsio_dis_cbr)で用いる. 3638 3639 8.3.2 デバイスサービスルーチン 3640 3641 以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートからの 3642 割込みがマスクされた状態で呼び出される.また,タスクコンテキスト,非タ 3643 スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて 3644 も動作するようにしなければならない). 4526 3645 4527 3646 (8-3-2-1) SIOPCB *sio_opn_por(ID siopid, intptr_t exinf) 4528 3647 4529 siopidã§æå®ãããã·ãªã¢ã«I/Oãã¼ãããªã¼ãã³ããé¢æ°ï¼exinfã¯ã·ãªã¢ã« 4530 I/Oãã¼ãã«å¯¾ããæ¡å¼µæ 4531 å ±ã§ï¼ã³ã¼ã«ããã¯ãå¼ã¶æã«ãã¼ããåºå¥ããã 4532 ãã«æ¸¡ãï¼ 3648 siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル 3649 I/Oポートに対する拡張情報で,コールバックを呼ぶ時にポートを区別するた 3650 めに渡す. 4533 3651 4534 3652 (8-3-2-2) void sio_cls_por(SIOPCB *siopcb) 4535 3653 4536 siopcb ã§æå®ãããã·ãªã¢ã«I/Oãã¼ããã¯ãã¼ãºããé¢æ°ï¼3654 siopcbで指定されるシリアルI/Oポートをクローズする関数. 4537 3655 4538 3656 (8-3-2-3) bool_t sio_snd_chr(SIOPCB *siopcb, char c) 4539 3657 4540 siopcbã§æå®ãããã·ãªã¢ã«I/Oãã¼ãã«ï¼cã§ç¤ºãããæåãéä¿¡ããé¢æ°ï¼ 4541 æåãéä¿¡ã¬ã¸ã¹ã¿ã«å 4542 ¥ããå ´åã«ã¯trueãï¼åã«éä¿¡ããæåã®éä¿¡ãçµã㣠4543 ã¦ããªãããã«ï¼æåãéä¿¡ã¬ã¸ã¹ã¿ã«å 4544 ¥ããããªãã£ãå ´åã«ã¯falseãè¿ãï¼ 3658 siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数. 3659 文字を送信レジスタに入れた場合にはtrueを,前に送信した文字の送信が終わっ 3660 ていないために,文字を送信レジスタに入れられなかった場合にはfalseを返す. 4545 3661 4546 3662 (8-3-2-4) int_t sio_rcv_chr(SIOPCB *siopcb) 4547 3663 4548 siopcb ã§æå®ãããã·ãªã¢ã«I/Oãã¼ãããæåãèªãé¢æ°ï¼æåãåä¿¡ãã¦ã4549 ãå ´åï¼èªãã æåã®ã³ã¼ãã¯æ£ã®å¤ã¨ãã¦è¿ãï¼æåãåä¿¡ãã¦ããªãå ´å 4550 ã«ã¯-1ãè¿ãï¼ 3664 siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信してい 3665 た場合,読んだ文字のコードは正の値として返し,文字を受信していない場合 3666 には-1を返す. 4551 3667 4552 3668 (8-3-2-5) void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn) 4553 3669 4554 siopcb ã§æå®ãããã·ãªã¢ã«I/Oãã¼ãããã®ï¼cbrtnã§æå®ãããã³ã¼ã«ãã4555 ã¯ã許å¯ããï¼cbrtnã«ã¯ï¼SIO_RDY_SNDãSIO_RDY_RCVãæå®ã§ããï¼ 3670 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ 3671 クを許可する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる. 4556 3672 4557 3673 (8-3-2-6) void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn) 4558 3674 4559 siopcbã§æå®ãããã·ãªã¢ã«I/Oãã¼ãããã®ï¼cbrtnã§æå®ãããã³ã¼ã«ãã 4560 ã¯ãç¦æ¢ããï¼cbrtnã«ã¯ï¼SIO_RDY_SNDãSIO_RDY_RCVãæå®ã§ããï¼ 4561 4562 8.3.3 ã³ã¼ã«ããã¯ã«ã¼ãã³ 4563 4564 ã¿ã¼ã²ããä¾åé¨ã¯ï¼å¿ 4565 è¦ãªã¿ã¤ãã³ã°ã§ï¼ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ã 4566 ã®ã¿ã¼ã²ããéä¾åé¨ã«å«ã¾ãã以ä¸ã®ã³ã¼ã«ããã¯ã«ã¼ãã³ãå¼ã³åºã³ã ã 4567 ãªããã°ãªããªãï¼ãã ãï¼ããããã®ã³ã¼ã«ããã¯ãç¦æ¢ããã¦ããæã¯ï¼ 4568 ã³ã¼ã«ããã¯ã«ã¼ãã³ãå¼ã³åºãã¦ã¯ãªããªãï¼ 4569 4570 ã³ã¼ã«ããã¯ã«ã¼ãã³ã¯ï¼ï¼å°ãªãã¨ãï¼ã·ãªã¢ã«I/Oãã¼ãããã®å²è¾¼ã¿ãç¦ 4571 æ¢ãããç¶æ 4572 ã§ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã§å¼ã³åºãï¼exinfã«ã¯ï¼ã·ãªã¢ã«I/O 4573 ãã¼ãã®ãªã¼ãã³æã«æå®ãããæ¡å¼µæ 4574 å ±ã渡ãï¼ 3675 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ 3676 クを禁止する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる. 3677 3678 8.3.3 コールバックルーチン 3679 3680 ターゲット依存部は,必要なタイミングで,シリアルインタフェースドライバ 3681 のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ 3682 なければならない.ただし,それぞれのコールバックが禁止されている時は, 3683 コールバックルーチンを呼び出してはならない. 3684 3685 コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが禁 3686 止された状態で,非タスクコンテキストで呼び出す.exinfには,シリアルI/O 3687 ポートのオープン時に指定された拡張情報を渡す. 4575 3688 4576 3689 (8-3-3-1) void sio_irdy_snd(intptr_t exinf) 4577 3690 4578 éä¿¡å¯è½ã³ã¼ã«ããã¯ã«ã¼ãã³ï¼ã·ãªã¢ã«I/Oãã¼ãã«å¯¾ãã¦æåãéä¿¡ã§ãã 4579 ç¶æ 4580 ã«ãªã£ãå ´åã«å¼ã³åºãï¼ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã¯ï¼ãã®ã³ã¼ 4581 ã«ããã¯ã«ã¼ãã³ã®ä¸ã§ï¼sio_snd_chrãå¼ã³åºãã¦æ¬¡ã®æåãéä¿¡ãããï¼é 4582 ä¿¡ãã¹ãæåããªãå ´åã«ã¯éä¿¡å¯è½ã³ã¼ã«ããã¯ãç¦æ¢ããï¼ 3691 送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信できる 3692 状態になった場合に呼び出す.シリアルインタフェースドライバは,このコー 3693 ルバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか,送 3694 信すべき文字がない場合には送信可能コールバックを禁止する. 4583 3695 4584 3696 (8-3-3-2) void sio_irdy_rcv(intptr_t exinf) 4585 3697 4586 åä¿¡éç¥ã³ã¼ã«ããã¯ã«ã¼ãã³ï¼ã·ãªã¢ã«I/Oãã¼ãããæåãåä¿¡ããå ´åã« 4587 å¼ã³åºãï¼ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã¯ï¼ãã®ã³ã¼ã«ããã¯ã«ã¼ãã³ã® 4588 ä¸ã§ï¼å¿ 4589 ãsio_rcv_chrãå¼ã³åºãã¦åä¿¡ããæåãåãåºãï¼ 4590 4591 8.4 ã«ã¼ãã«èµ·åã¡ãã»ã¼ã¸ã®åºåã®ã¿ã¼ã²ããä¾åå®ç¾© 4592 4593 ã¿ã¼ã²ããä¾åé¨ã§æä¾ãã¹ãã«ã¼ãã«èµ·åã¡ãã»ã¼ã¸ã®åºåã®ããã®å®ç¾©ã¯ 4594 次ã®éãã§ããï¼ 3698 受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合に 3699 呼び出す.シリアルインタフェースドライバは,このコールバックルーチンの 3700 中で,必ずsio_rcv_chrを呼び出して受信した文字を取り出す. 3701 3702 8.4 カーネル起動メッセージの出力のターゲット依存定義 3703 3704 ターゲット依存部で提供すべきカーネル起動メッセージの出力のための定義は 3705 次の通りである. 4595 3706 4596 3707 (8-4-1) TARGET_NAME 4597 3708 4598 ã¿ã¼ã²ããã®å称ã«å®ç¾©ããï¼ 4599 4600 (8-4-2) TARGET_COPYRIGHTï¼ãªãã·ã§ã³ï¼ 4601 4602 ã«ã¼ãã«èµ·åã¡ãã»ã¼ã¸ã«ï¼ã¿ã¼ã²ããä¾åé¨ã®èä½æ¨©è¡¨ç¤ºã追å ããããã® 4603 ãã¯ãï¼ããã©ã«ãã§ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã®èä½æ¨©è¡¨ç¤ºã追å ããªãï¼ 4604 4605 8.5 ãµã³ãã«ããã°ã©ã ã¨ãã¹ãããã°ã©ã ã®ã¿ã¼ã²ããä¾åå®ç¾© 4606 4607 ã¿ã¼ã²ããä¾åé¨ã§æä¾ãã¹ããµã³ãã«ããã°ã©ã ããã³ãã¹ãããã°ã©ã ã® 4608 ããã®å®ç¾©ã¯æ¬¡ã®éãã§ããï¼ãããã®å®ç¾©ã¯ï¼target_test.hï¼ã¾ãã¯ããã 4609 ããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ã«å«ããï¼ 4610 4611 (8-5-1) STACK_SIZEï¼ãªãã·ã§ã³ï¼ 4612 4613 ãµã³ãã«ããã°ã©ã ããã³ãã¹ãããã°ã©ã ã®ã¿ã¹ã¯ã®ã¹ã¿ãã¯ãµã¤ãºãå®ç¾© 4614 ãããã¯ãï¼å®ç¾©ããªãå ´åã®ããã©ã«ãå¤ã¯4096ï¼ããã©ã«ãè¨å®ã§ã¯ã¡ã¢ 4615 ãªãä¸è¶³ããå ´åãï¼ã·ãã¥ã¬ã¼ã·ã§ã³ç°å¢ãªã©ã§å¤§ããã¹ã¿ãã¯é åãå¿ 4616 è¦ 4617 ãªå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã§ãã®ãã¯ããè¨å®ããã¹ã¿ãã¯ãµã¤ãºã«å®ç¾© 4618 ããï¼ 4619 4620 (8-5-2) CPUEXC1ï¼ãªãã·ã§ã³ï¼ 4621 4622 ãµã³ãã«ããã°ã©ã ããã³ãã¹ãããã°ã©ã ã§ç¨ããCPUä¾å¤ã®CPUä¾å¤ãã³ã 4623 ã©çªå·ãå®ç¾©ãããã¯ãï¼ãã®ãã¯ããå®ç¾©ããªãå ´åï¼CPUä¾å¤ãã³ãã©ã使 4624 ãé¨åããµã³ãã«ããã°ã©ã ããé¤å¤ãããï¼CPUä¾å¤ãã³ãã©ã®ãã¹ãããã 4625 ãã¹ãããã°ã©ã ã¯ã³ã³ãã¤ã«ã§ããªãï¼ 4626 4627 (8-5-3) RAISE_CPU_EXCEPTIONï¼ãªãã·ã§ã³ï¼ 4628 4629 CPUEXC1ã«å®ç¾©ããCPUä¾å¤ãçºçãããCè¨èªã®ããã°ã©ã ãå®ç¾©ãããã¯ãï¼ 4630 CPUEXC1ãå®ç¾©ããå ´åã«ã¯å¿ 4631 ãå®ç¾©ããªããã°ãªããªãï¼ 4632 4633 (8-5-4) CANNOT_RETURN_CPUEXCï¼ãªãã·ã§ã³ï¼ 4634 4635 ã¿ã¼ã²ããã·ã¹ãã ã®å¶ç´ã«ããï¼CPUä¾å¤ãã³ãã©ãããªã¿ã¼ã³ããå¾ã«ï¼ã¿ 4636 ã¹ã¯ã®å®è¡ãç¶ç¶ã§ããªãå ´åã«å®ç¾©ãããã¯ãï¼ãã®ãã¯ããå®ç¾©ããã¨ï¼ 4637 CPUä¾å¤ãã³ãã©ã®ãã¹ãããããã¹ãããã°ã©ã ããï¼CPUä¾å¤ãã³ãã©ãã 4638 ãªã¿ã¼ã³ããå¾ã®å¦çãé¤å¤ãããï¼ãµã³ãã«ããã°ã©ã ã®è©²å½é¨åã¯æ£ãã 4639 åä½ããªãï¼ 4640 4641 (8-5-5) TASK_PORTIDï¼ãªãã·ã§ã³ï¼ 4642 4643 ãµã³ãã«ããã°ã©ã ã«ããã¦ï¼ã³ãã³ãæåãèªã¿è¾¼ãã·ãªã¢ã«ãã¼ãçªå·ã 4644 å®ç¾©ãããã¯ãï¼å®ç¾©ããªãå ´åã®ããã©ã«ãå¤ã¯1ï¼ 4645 4646 (8-5-6) LOOP_REFï¼ãªãã·ã§ã³ï¼ 4647 4648 ãµã³ãã«ããã°ã©ã ã«ããã¦ï¼ããã»ããµã®é度ãè¨æ¸¬ããããã®ã«ã¼ãåæ° 4649 ãå®ç¾©ãããã¯ãï¼å®ç¾©ããªãå ´åã®ããã©ã«ãå¤ã¯1000000ï¼ããã©ã«ãè¨å® 4650 ã§ã¯ï¼å¤ã大ãéãã¦è¨æ¸¬ã«æéãããããããå ´åãï¼å¤ãå°ãéãã¦è¨æ¸¬ 4651 çµæãå®å®ããªãå ´åã«ï¼ã¿ã¼ã²ããä¾åé¨ã§ãã®ãã¯ããè¨å®ããã«ã¼ãå 4652 æ°ã«å®ç¾©ããï¼ 4653 4654 (8-5-7) MEASURE_TWICEï¼ãªãã·ã§ã³ï¼ 4655 4656 ãµã³ãã«ããã°ã©ã ã«ããã¦ï¼ããã»ããµã®é度ã2度è¨æ¸¬ããå ´åã«å®ç¾©ãã 4657 ãã¯ãï¼ã·ãã¥ã¬ã¼ã·ã§ã³ç°å¢ãªã©ããã»ããµã®é度ãå¤åããç°å¢ã§ï¼1度㮠4658 è¨æ¸¬ã§ã¯è¨æ¸¬çµæãå®å®ããªãå ´åã«å®ç¾©ããï¼ 4659 4660 (8-5-8) TASK_LOOPï¼ãªãã·ã§ã³ï¼ 4661 4662 ãµã³ãã«ããã°ã©ã ã«ããã¦ï¼ããã»ããµã®é度ãè¨æ¸¬ããã«ï¼ã¿ã¹ã¯å 4663 ã§ã® 4664 ã«ã¼ãåæ°ãåºå®ããå ´åã«ï¼ã«ã¼ãåæ°ãå®ç¾©ãããã¯ãï¼ã«ã¼ãå 4665 ¨ä½ã®å® 4666 è¡æéã0.4ç§ç¨åº¦ã«ãªããããªã«ã¼ãåæ°ãï¼ãã®ãã¯ãã«å®ç¾©ããï¼ 4667 4668 8.6 å®è¡æéåå¸éè¨ã¢ã¸ã¥ã¼ã«ã®ã¿ã¼ã²ããä¾åå®ç¾© 4669 4670 å®è¡æéåå¸éè¨ã¢ã¸ã¥ã¼ã«ã®è¨å®ãã¿ã¼ã²ããä¾åé¨ã§å¤æ´ããå ´åã«ï¼ã¿ã¼ 4671 ã²ããä¾åé¨ã§æä¾ãã¹ãå®è¡æéåå¸éè¨ã¢ã¸ã¥ã¼ã«ã®ããã®å®ç¾©ã¯æ¬¡ã®é 4672 ãã§ããï¼ãããã®å®ç¾©ã¯ï¼target_test.hï¼ã¾ãã¯ããããã¤ã³ã¯ã«ã¼ããã 4673 ããã¡ã¤ã«ï¼ã«å«ããï¼ãã®ä»ã«ï¼ã¿ã¼ã²ããä¾åã§å¿ 4674 è¦ãªåæåå¦çããã 4675 å ´åã«ãï¼ã¿ã¼ã²ããä¾åé¨ã«å«ããï¼ 4676 4677 (8-6-1) HISTTIMï¼ãªãã·ã§ã³ï¼ 4678 4679 å®è¡æéè¨æ¸¬ç¨ã®æå»ã®ãã¼ã¿åãå®ç¾©ãããã¯ãï¼å®ç¾©ããªãå ´åã®ããã© 4680 ã«ãã¯SYSUTMï¼ 4681 4682 (8-6-2) void HIST_GET_TIM(HISTTIM *p_time)ï¼ãªãã·ã§ã³ï¼ 4683 4684 å®è¡æéè¨æ¸¬ç¨ã®ç¾å¨æå»ã*p_timeã«åå¾ããå¦çã«å®ç¾©ãããã¯ãï¼å®ç¾©ã 4685 ãªãå ´åã®ããã©ã«ãã¯get_utmï¼ 4686 4687 (8-6-3) uint_t HIST_CONV_TIM(HISTTIM time)ï¼ãªãã·ã§ã³ï¼ 4688 4689 å®è¡æéè¨æ¸¬ç¨ã®æå»ã®å·®ï¼æéï¼ãï¼å®è¡æéåå¸éè¨ç¨ã®å¤ã«å¤æããå¦ 4690 çã«å®ç¾©ãããã¯ãï¼æå»ãéå»ã«æ»ã£ãããªã¼ãããã¼ãããã®åºå¥ãã¤ã 4691 ãªãå ´åã«ã¯ï¼æä¸ä½ãããã1ã®å¤ï¼INT_MAXããã大ããå¤ï¼ãè¿ãï¼å®ç¾© 4692 ããªãå ´åã®ããã©ã«ãã¯ï¼timeãuint_tã«ãã£ã¹ãããå¦çï¼ 4693 4694 (8-6-4) void HIST_BM_HOOK(void)ï¼ãªãã·ã§ã³ï¼ 4695 4696 å®è¡æéè¨æ¸¬ç´åã«è¡ãã¹ãå¦çã«å®ç¾©ãããã¯ãï¼ãã£ãã·ã¥ã®ãã¼ã¸ãã㣠4697 ã«ï¼ã¡ã¢ãªããªã¢å¦ççãè¡ãããå ´åã«ã¯ï¼ãã®ãã¯ãã«å®ç¾©ããï¼å®ç¾©ã 4698 ãªãå ´åã®ããã©ã«ãã¯ï¼ç©ºã®å¦çã«ãªãï¼ 4699 4700 4701 ï¼ï¼ãã®ä» 4702 4703 9.1 ããã¥ã¡ã³ã 4704 4705 ã¿ã¼ã²ããä¾åé¨ã®ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ãï¼target_user.txtã«ç¨æããï¼ã 4706 ãã»ããµã»ãããã»éçºç°å¢ä¾åé¨ã®ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ãåãåãã¦ãã 4707 ããï¼ãã¡ã¤ã«ã大ãããªãå ´åã«ã¯è¤æ°ã®ãã¡ã¤ã«ã«åå²ãã¦ãããï¼ãã® 4708 å ´åã«ã¯ï¼target_user.txtä¸ã«ãããã®ãã¡ã¤ã«åãè¨è¿°ãããã¨ï¼ 4709 4710 ã¿ã¼ã²ããä¾åé¨ã®ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ã«ã¯ï¼å°ãªãã¨ã次ã®ãããªå 4711 容ã 4712 è¨è¿°ãããã¨ãæã¾ããï¼ 4713 4714 (1) 対å¿ãã¦ããã¿ã¼ã²ããã·ã¹ãã ã®ç¨®é¡ã»æ§æï¼ãã¼ã¸ã§ã³çªå· 4715 ã»ã¿ã¼ã²ãããã¼ãã¦ã§ã¢ï¼ãã¼ãçï¼ã®å称ã¨å¯¾å¿ãã¦ããæ§æ 4716 ã»ã¿ã¼ã²ããç¥ç§° 4717 ã»ã¿ã¼ã²ããéä¾åé¨ã®ãã¼ã¸ã§ã³çªå· 4718 ã»ããã»ããµï¼ãããï¼éçºç°å¢ä¾åé¨ã®æ§æã¨ãã¼ã¸ã§ã³çªå· 4719 ã»ä½¿ç¨ããPDICã¨ãã¼ã¸ã§ã³çªå· 4720 4721 (2) 使ç¨ããéçºç°å¢ã¨åä½æ¤è¨¼ããæ¡ä»¶ï¼ãã¼ã¸ã§ã³ï¼ãªãã·ã§ã³çï¼ 4722 ã»è¨èªå¦çç³»ï¼ã³ã³ãã¤ã©ï¼ã¢ã»ã³ãã©ï¼ãªã³ã«çï¼ 4723 ã»ãããã°ç°å¢ 4724 4725 (3) ã¿ã¼ã²ããå®ç¾©äºé 4726 ã®è¦å® 4727 4728 (3-1) ãã¼ã¿åã«é¢ããè¦å® 4729 ã»int_tåï¼long_tåã®ãµã¤ãº 4730 ã»charåï¼int_least8_tåï¼void *åï¼intptr_tåã®ãµã¤ãº 4731 ã»int8_tåï¼uint8_tåï¼int64_tåï¼uint64_tåï¼int128_tåï¼ 4732 ãuint128_tåï¼float32_tåï¼double64_tåã®ãµãã¼ãã®æç¡ 4733 4734 (3-2) å²è¾¼ã¿å¦çã«é¢ããè¦å® 4735 ã»å²è¾¼ã¿ãã³ãã©çªå·ã¨å²è¾¼ã¿çªå·ã®å²å½ã¦ï¼ä¸¡è 4736 ã®å¯¾å¿ 4737 ã»å²è¾¼ã¿åªå 4738 度ã®æ®µéæ°ï¼TMIN_INTPRIã®å¤ï¼ 4739 ã»dis_intã¨ena_intã®ãµãã¼ãã®æç¡ï¼ãã®å¶éäºé 4740 4741 ã»CFG_INTã®å¶éäºé 4742 ã¨æ¡å¼µï¼ã¿ã¼ã²ããå®ç¾©ã§ä½¿ç¨ã§ããå²è¾¼ã¿å±æ§ï¼ 4743 ã»TOPPERSæ¨æºå²è¾¼ã¿å¦çã¢ãã«ããã®ãã®ä»ã®é¸è± 4744 ã»ããã©ã«ãã®å²è¾¼ã¿ãã³ãã©ï¼default_int_handlerï¼ã®æç¡ã¨å¦çå 4745 容 4746 4747 (3-3) ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«é¢ããè¦å® 4748 ã»TMIN_INTPRIã¯åºå®ãè¨å®ã§ãããï¼ãã®è¨å®æ¹æ³ 4749 ã»NMI以å¤ã«ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ãè¨ãããï¼è¨ããããããã«ãããï¼ 4750 ã»ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã®è¨å®æ¹æ³ 4751 ã»ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã«å¯¾ãã¦DEF_INHï¼CFG_INTããµãã¼ãããã 4752 ã»ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ãã³ãã©ãå®è¡éå§ãããæã®ã·ã¹ãã ç¶æ 4753 㨠4754 ãã³ã³ããã¹ã 4755 ã»å²è¾¼ã¿ãã³ãã©ã®çµäºæã«è¡ãããå¦ç 4756 ã»ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ãã³ãã©ã®è¨è¿°æ¹æ³ 4757 ã»ã«ã¼ãã«å 4758 ã®å²è¾¼ã¿åºå 4759 ¥å£å¦çã§èµ·ããå¯è½æ§ã®ããCPUä¾å¤ 4760 4761 (3-4) CPUä¾å¤å¦çã«é¢ããè¦å® 4762 ã»CPUä¾å¤ãã³ãã©çªå·ã®å²å½ã¦ 4763 ã»å²è¾¼ã¿åªå 4764 度ãã¹ã¯ãTMIN_INTPRIã¨åãããããããé«ãå¤ã«è¨å®ã㦠4765 ãããç¶æ 4766 ã§çºçããCPUä¾å¤ãï¼ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã¨æ±ãã 4767 ã»ã«ã¼ãã«å 4768 ã®CPUä¾å¤åºå 4769 ¥å£å¦çã§èµ·ããå¯è½æ§ã®ããCPUä¾å¤ 4770 ã»ããã©ã«ãã®CPUä¾å¤ãã³ãã©ï¼default_exc_handlerï¼ã®æç¡ã¨å¦çå 4771 容 4772 4773 (3-5) æ§è½è©ä¾¡ç¨ã·ã¹ãã æå»ã®åç 4774 §ã«é¢ããè¦å® 4775 ã»get_utmã®ãµãã¼ãã®æç¡ï¼ãã®å¶éäºé 4776 4777 4778 (3-6) æ¡å¼µããã±ã¼ã¸ã«é¢ããè¦å® 4779 ã»åæ¡å¼µããã±ã¼ã¸ã®ãµãã¼ãã®æç¡ 4780 - ãã¥ã¼ããã¯ã¹æ©è½æ¡å¼µããã±ã¼ã¸ 4781 - ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µããã±ã¼ã¸ 4782 - ã¿ã¹ã¯åªå 4783 度æ¡å¼µããã±ã¼ã¸ 4784 - å¶ç´ã¿ã¹ã¯æ¡å¼µããã±ã¼ã¸ 4785 - åççææ©è½æ¡å¼µããã±ã¼ã¸ 4786 ã»ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µããã±ã¼ã¸ããµãã¼ãããå ´åã«ï¼ããã»ã 4787 ããµæéã«æå®ã§ããå¤ã®æ大å¤ï¼TMAX_OVRTIMã®å¤ï¼ 4788 ã»åççææ©è½æ¡å¼µããã±ã¼ã¸ããµãã¼ãããå ´åã«ï¼åçã¡ã¢ãªç®¡çã® 4789 ãæ¹æ³ 4790 4791 (3-7) ãã®ä» 4792 ã»ãã®ä»ã®å¶éäºé 4793 4794 ã»ãã®ä»ã®æ¡å¼µæ©è½ 4795 4796 (4) ã«ã¼ãã«ã®èµ·åï¼çµäºå¦çã«é¢ããæ 4797 å ± 4798 ã»ç¨æãã¦ããã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ã®å¦çå 4799 容 4800 ã»ã¹ã¿ã¼ãã¢ããã¢ã¸ã¥ã¼ã«ããhardware_init_hookãå¼ã³åºãã¦ããå ´ 4801 ãåã«ã¯ï¼hardware_init_hookãã¢ããªã±ã¼ã·ã§ã³ã§ç¨æããå ´åã®ä½æ 4802 ãæ¹æ³ãå¶éäºé 4803 ãªã© 4804 ã»ã«ã¼ãã«ãçµäºããå¾ã®æ¯èã 4805 4806 (5) ã¡ã¢ãªããã 4807 ã»ããã©ã«ãã®ã¡ã¢ãªãããï¼ãã®å¤æ´æ¹æ³ 4808 4809 (6) ã¿ã¤ããã©ã¤ãé¢é£ã®æ 4810 å ± 4811 ã»ã¿ã¤ã ãã£ãã¯ã®å¨æï¼ãã®å¤æ´æ¹æ³ 4812 ã»ä½¿ç¨ãããªã½ã¼ã¹ï¼ã¿ã¤ãï¼ 4813 ã»ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åªå 4814 度ã®å¤æ´æ¹æ³ 4815 ã»ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ã®å²è¾¼ã¿åªå 4816 度ã®å¤æ´æ¹æ³ 4817 4818 (7) ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãã®æ 4819 å ± 4820 ã»ä½¿ç¨ãããªã½ã¼ã¹ï¼SIOã³ã³ããã¼ã©ï¼ 4821 ã»éä¿¡ãã©ã¡ã¼ã¿ï¼ãã¼ã¬ã¼ãï¼ãããæ°ï¼ããªãã£ã®æç¡ï¼ã¹ããããããï¼ 4822 4823 (8) ã·ã¹ãã ãã°æ©è½ã®æ 4824 å ± 4825 ã»ã·ã¹ãã ãã°ã®ä½ã¬ãã«åºåã®å®ç¾æ¹æ³ 4826 ã»éä¿¡ãã©ã¡ã¼ã¿ï¼ãã¼ã¬ã¼ãï¼ãããæ°ï¼ããªãã£ã®æç¡ï¼ã¹ããããããï¼ 4827 4828 (9) ã·ã¹ãã æ§ç¯æé 4829 4830 (10) ã¿ã¼ã²ããã·ã¹ãã åºæã®æ³¨æäºé 4831 4832 ã»ã¿ã¹ã¯ã³ã³ããã¹ãã«å«ã¾ããã¬ã¸ã¹ã¿ï¼å«ã¾ããªãã¬ã¸ã¹ã¿ 4833 4834 (11) é¡ä¼¼ã®ã¿ã¼ã²ããã«ãã¼ãã£ã³ã°ããéçºè 4835 åãã®åèæ 4836 å ± 4837 4838 (12) ãã£ã¬ã¯ããªæ§æã»ãã¡ã¤ã«æ§æ 4839 4840 (13) ãã¼ã¸ã§ã³å±¥æ´ 4841 4842 ã¾ãï¼å¿ 4843 è¦ã«å¿ãã¦ï¼ã¿ã¼ã²ããä¾åé¨ã®è¨è¨ã¡ã¢ãï¼target_design.txtã«ç¨ 4844 æããï¼ããã»ããµã»ãããã»éçºç°å¢ä¾åé¨ã«é¢ããè¨è¨ã¡ã¢ãåãåã㦠4845 ããããï¼ãã¡ã¤ã«ã大ãããªãå ´åã«ã¯è¤æ°ã®ãã¡ã¤ã«ã«åå²ãã¦ããããï¼ 4846 ãã®å ´åã«ã¯ï¼target_design.txtä¸ã«ãããã®ãã¡ã¤ã«åãè¨è¿°ãããã¨ï¼ 4847 4848 9.2 ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã« 4849 4850 ãªãªã¼ã¹ããã±ã¼ã¸ï¼åå¥ããã±ã¼ã¸ããã³ç°¡æããã±ã¼ã¸ï¼ãä½æãããã 4851 ã«ï¼ããã±ã¼ã¸ã«å«ãããã¡ã¤ã«ãè¨è¿°ããããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ãç¨æã 4852 ãï¼ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ã®å称ã¯ï¼åå¥ããã±ã¼ã¸ç¨ãMANIFESTï¼ç°¡æãã 4853 ã±ã¼ã¸ç¨ãE_PACKAGEã¨ããï¼ 4854 4855 ä¾ãã°ï¼arch/arm_gccãã£ã¬ã¯ããªã«ç½®ãããMANIFESTãã¡ã¤ã«ãç¨ãã¦åå¥ 4856 ããã±ã¼ã¸ãä½æããå ´åã«ã¯ï¼æ¬¡ã®ã³ãã³ããå®è¡ããï¼ 3709 ターゲットの名称に定義する. 3710 3711 (8-4-2) TARGET_COPYRIGHT(オプション) 3712 3713 カーネル起動メッセージに,ターゲット依存部の著作権表示を追加するための 3714 マクロ.デフォルトでは,ターゲット依存部の著作権表示を追加しない. 3715 3716 8.5 サンプルプログラムとテストプログラムのターゲット依存定義 3717 3718 ターゲット依存部で提供すべきサンプルプログラムおよびテストプログラムの 3719 ための定義は次の通りである.これらの定義は,target_test.h(またはそれら 3720 からインクルードされるファイル)に含める. 3721 3722 (8-5-1) STACK_SIZE(オプション) 3723 3724 サンプルプログラムおよびテストプログラムのタスクのスタックサイズを定義 3725 するマクロ.定義しない場合のデフォルト値は4096.デフォルト設定ではメモ 3726 リが不足する場合や,シミュレーション環境などで大きいスタック領域が必要 3727 な場合には,ターゲット依存部でこのマクロを設定するスタックサイズに定義 3728 する. 3729 3730 (8-5-2) CPUEXC1(オプション) 3731 3732 サンプルプログラムおよびテストプログラムで用いるCPU例外のCPU例外ハンド 3733 ラ番号を定義するマクロ.このマクロを定義しない場合,CPU例外ハンドラを使 3734 う部分がサンプルプログラムから除外される.CPU例外ハンドラのテストをする 3735 テストプログラムはコンパイルできない. 3736 3737 (8-5-3) RAISE_CPU_EXCEPTION(オプション) 3738 3739 CPUEXC1に定義したCPU例外を発生させるC言語のプログラムを定義するマクロ. 3740 CPUEXC1を定義した場合には必ず定義しなければならない. 3741 3742 (8-5-4) CANNOT_RETURN_CPUEXC(オプション) 3743 3744 ターゲットシステムの制約により,CPU例外ハンドラからリターンした後に,タ 3745 スクの実行を継続できない場合に定義するマクロ.このマクロを定義すると, 3746 CPU例外ハンドラのテストをするテストプログラムから,CPU例外ハンドラから 3747 リターンした後の処理が除外される.サンプルプログラムの該当部分は正しく 3748 動作しない. 3749 3750 (8-5-5) TASK_PORTID(オプション) 3751 3752 サンプルプログラムにおいて,コマンド文字を読み込むシリアルポート番号を 3753 定義するマクロ.定義しない場合のデフォルト値は1. 3754 3755 (8-5-6) LOOP_REF(オプション) 3756 3757 サンプルプログラムにおいて,プロセッサの速度を計測するためのループ回数 3758 を定義するマクロ.定義しない場合のデフォルト値は1000000.デフォルト設定 3759 では,値が大き過ぎて計測に時間がかかりすぎる場合や,値が小さ過ぎて計測 3760 結果が安定しない場合に,ターゲット依存部でこのマクロを設定するループ回 3761 数に定義する. 3762 3763 (8-5-7) MEASURE_TWICE(オプション) 3764 3765 サンプルプログラムにおいて,プロセッサの速度を2度計測する場合に定義する 3766 マクロ.シミュレーション環境などプロセッサの速度が変動する環境で,1度の 3767 計測では計測結果が安定しない場合に定義する. 3768 3769 (8-5-8) TASK_LOOP(オプション) 3770 3771 サンプルプログラムにおいて,プロセッサの速度を計測せずに,タスク内での 3772 ループ回数を固定する場合に,ループ回数を定義するマクロ.ループ全体の実 3773 行時間が0.4秒程度になるようなループ回数を,このマクロに定義する. 3774 3775 8.6 実行時間分布集計モジュールのターゲット依存定義 3776 3777 実行時間分布集計モジュールの設定をターゲット依存部で変更する場合に,ター 3778 ゲット依存部で提供すべき実行時間分布集計モジュールのための定義は次の通 3779 りである.これらの定義は,target_test.h(またはそこからインクルードされ 3780 るファイル)に含める.この他に,ターゲット依存で必要な初期化処理がある 3781 場合にも,ターゲット依存部に含める. 3782 3783 (8-6-1) HISTTIM(オプション) 3784 3785 実行時間計測用の時刻のデータ型を定義するマクロ.定義しない場合のデフォ 3786 ルトはSYSUTM. 3787 3788 (8-6-2) void HIST_GET_TIM(HISTTIM *p_time)(オプション) 3789 3790 実行時間計測用の現在時刻を*p_timeに取得する処理に定義するマクロ.定義し 3791 ない場合のデフォルトはget_utm. 3792 3793 (8-6-3) uint_t HIST_CONV_TIM(HISTTIM time)(オプション) 3794 3795 実行時間計測用の時刻の差(時間)を,実行時間分布集計用の値に変換する処 3796 理に定義するマクロ.時刻が過去に戻ったかオーバフローしたかの区別がつか 3797 ない場合には,最上位ビットが1の値(INT_MAXよりも大きい値)を返す.定義 3798 しない場合のデフォルトは,timeをuint_tにキャストする処理. 3799 3800 (8-6-4) void HIST_BM_HOOK(void)(オプション) 3801 3802 実行時間計測直前に行うべき処理に定義するマクロ.キャッシュのパージやフィ 3803 ル,メモリバリア処理等を行いたい場合には,このマクロに定義する.定義し 3804 ない場合のデフォルトは,空の処理になる. 3805 3806 3807 9.その他 3808 3809 9.1 ドキュメント 3810 3811 ターゲット依存部のユーザーズマニュアルを,target_user.txtに用意する.プ 3812 ロセッサ・チップ・開発環境依存部のユーザーズマニュアルを切り分けてもよ 3813 いし,ファイルが大きくなる場合には複数のファイルに分割してよいが,その 3814 場合には,target_user.txt中にそれらのファイル名を記述すること. 3815 3816 ターゲット依存部のユーザーズマニュアルには,少なくとも次のような内容を 3817 記述することが望ましい. 3818 3819 (1) 対応しているターゲットシステムの種類・構成,バージョン番号 3820 ・ターゲットハードウェア(ボード等)の名称と対応している構成 3821 ・ターゲット略称 3822 ・ターゲット非依存部のバージョン番号 3823 ・プロセッサ,チップ,開発環境依存部の構成とバージョン番号 3824 ・使用するPDICとバージョン番号 3825 3826 (2) 使用する開発環境と動作検証した条件(バージョン,オプション等) 3827 ・言語処理系(コンパイラ,アセンブラ,リンカ等) 3828 ・デバッグ環境 3829 3830 (3) ターゲット定義事項の規定 3831 3832 (3-1) データ型に関する規定 3833 ・int_t型,long_t型のサイズ 3834 ・char型,int_least8_t型,void *型,intptr_t型のサイズ 3835 ・int8_t型,uint8_t型,int64_t型,uint64_t型,int128_t型, 3836 uint128_t型,float32_t型,double64_t型のサポートの有無 3837 3838 (3-2) 割込み処理に関する規定 3839 ・割込みハンドラ番号と割込み番号の割当て,両者の対応 3840 ・割込み優先度の段階数(TMIN_INTPRIの値) 3841 ・dis_intとena_intのサポートの有無,その制限事項 3842 ・CFG_INTの制限事項と拡張(ターゲット定義で使用できる割込み属性) 3843 ・TOPPERS標準割込み処理モデルからのその他の逸脱 3844 ・デフォルトの割込みハンドラ(default_int_handler)の有無と処理内容 3845 3846 (3-3) カーネル管理外の割込みに関する規定 3847 ・TMIN_INTPRIは固定か設定できるか,その設定方法 3848 ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか) 3849 ・カーネル管理外の割込みの設定方法 3850 ・カーネル管理外の割込みに対してDEF_INH,CFG_INTをサポートするか 3851 ・カーネル管理外の割込みハンドラが実行開始される時のシステム状態と 3852 コンテキスト 3853 ・割込みハンドラの終了時に行われる処理 3854 ・カーネル管理外の割込みハンドラの記述方法 3855 ・カーネル内の割込み出入口処理で起こる可能性のあるCPU例外 3856 3857 (3-4) CPU例外処理に関する規定 3858 ・CPU例外ハンドラ番号の割当て 3859 ・割込み優先度マスクをTMIN_INTPRIと同じかそれよりも高い値に設定して 3860 いる状態で発生したCPU例外を,カーネル管理外のCPU例外と扱うか 3861 ・カーネル内のCPU例外出入口処理で起こる可能性のあるCPU例外 3862 ・デフォルトのCPU例外ハンドラ(default_exc_handler)の有無と処理内容 3863 3864 (3-5) 性能評価用システム時刻の参照に関する規定 3865 ・get_utmのサポートの有無,その制限事項 3866 3867 (3-6) 拡張パッケージに関する規定 3868 ・各拡張パッケージのサポートの有無 3869 - ミューテックス機能拡張パッケージ 3870 - オーバランハンドラ機能拡張パッケージ 3871 - タスク優先度拡張パッケージ 3872 - 制約タスク拡張パッケージ 3873 - 動的生成機能拡張パッケージ 3874 ・オーバランハンドラ機能拡張パッケージをサポートする場合に,プロセッ 3875 サ時間に指定できる値の最大値(TMAX_OVRTIMの値) 3876 ・動的生成機能拡張パッケージをサポートする場合に,動的メモリ管理の 3877 方法 3878 3879 (3-7) その他 3880 ・その他の制限事項 3881 ・その他の拡張機能 3882 3883 (4) カーネルの起動/終了処理に関する情報 3884 ・用意しているスタートアップモジュールの処理内容 3885 ・スタートアップモジュールからhardware_init_hookを呼び出している場 3886 合には,hardware_init_hookをアプリケーションで用意する場合の作成 3887 方法や制限事項など 3888 ・カーネルを終了した後の振舞い 3889 3890 (5) メモリマップ 3891 ・デフォルトのメモリマップ,その変更方法 3892 3893 (6) タイマドライバ関連の情報 3894 ・タイムティックの周期,その変更方法 3895 ・使用するリソース(タイマ) 3896 ・タイマ割込みの割込み優先度の変更方法 3897 ・オーバランタイマ割込みの割込み優先度の変更方法 3898 3899 (7) シリアルインタフェースドライバの情報 3900 ・使用するリソース(SIOコントローラ) 3901 ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット) 3902 3903 (8) システムログ機能の情報 3904 ・システムログの低レベル出力の実現方法 3905 ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット) 3906 3907 (9) システム構築手順 3908 3909 (10) ターゲットシステム固有の注意事項 3910 ・タスクコンテキストに含まれるレジスタ,含まれないレジスタ 3911 3912 (11) 類似のターゲットにポーティングする開発者向けの参考情報 3913 3914 (12) ディレクトリ構成・ファイル構成 3915 3916 (13) バージョン履歴 3917 3918 また,必要に応じて,ターゲット依存部の設計メモを,target_design.txtに用 3919 意する.プロセッサ・チップ・開発環境依存部に関する設計メモを切り分けて 3920 もよいし,ファイルが大きくなる場合には複数のファイルに分割してもよいが, 3921 その場合には,target_design.txt中にそれらのファイル名を記述すること. 3922 3923 9.2 パッケージ記述ファイル 3924 3925 リリースパッケージ(個別パッケージおよび簡易パッケージ)を作成するため 3926 に,パッケージに含めるファイルを記述したパッケージ記述ファイルを用意す 3927 る.パッケージ記述ファイルの名称は,個別パッケージ用をMANIFEST,簡易パッ 3928 ケージ用をE_PACKAGEとする. 3929 3930 例えば,arch/arm_gccディレクトリに置かれたMANIFESTファイルを用いて個別 3931 パッケージを作成する場合には,次のコマンドを実行する. 4857 3932 4858 3933 % utils/makerelease arch/arm_gcc/MANIFEST 4859 3934 4860 ãã®ã³ãã³ãã«ããï¼RELEASE/asp_arch_arm_gcc-<ãã¼ã¸ã§ã³çªå·>.tar.gzã 4861 ä½æãããï¼ã¾ãï¼target/at91skyeye_gccãã£ã¬ã¯ããªã«ç½®ãããE_PACKAGE4862 ãã¡ã¤ã«ãç¨ãã¦ç°¡æããã±ã¼ã¸ãä½æããå ´åã«ã¯ï¼æ¬¡ã®ã³ãã³ããå®è¡ã 4863 ãï¼ 3935 このコマンドにより,RELEASE/asp_arch_arm_gcc-<バージョン番号>.tar.gzが 3936 作成される.また,target/at91skyeye_gccディレクトリに置かれたE_PACKAGE 3937 ファイルを用いて簡易パッケージを作成する場合には,次のコマンドを実行す 3938 る. 4864 3939 4865 3940 % utils/makerelease target/at91skyeye_gcc/E_PACKAGE 4866 3941 4867 ãã®ã³ãã³ãã«ããï¼RELEASE/asp_at91skyeye_gcc-<ãã¼ã¸ã§ã³çªå·>.tar.gz 4868 ãä½æãããï¼RELEASEãã£ã¬ã¯ããªããªãå ´åã«ã¯ï¼ãã£ã¬ã¯ããªãä½ãã 4869 ãï¼ï¼ 4870 4871 ãªãï¼makereleaseã¦ã¼ãã£ãªãã£ã¯ï¼ASPã«ã¼ãã«ã®ã½ã¼ã¹ãã¡ã¤ã«ãç½®ãã 4872 ããã£ã¬ã¯ããªãï¼aspã¨ããå称ã§ãããã¨ãä»®å®ãã¦ããï¼ç°ãªãå称ã®å ´ 4873 åã§ãããã±ã¼ã¸ã¯ä½æã§ãããï¼ããã±ã¼ã¸ãå±éããæã«å±éãããã㣠4874 ã¬ã¯ããªãaspã§ãªããªãï¼ï¼ã¾ãï¼æ¨æºã®tarã³ãã³ããGNU tarã§ããã㨠4875 ï¼æ£ç¢ºã«ã¯ï¼zãªãã·ã§ã³ã«å¯¾å¿ãã¦ãããã¨ï¼ãæ³å®ãã¦ããï¼ 4876 4877 ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ã«ã¯ï¼ããã±ã¼ã¸ã«å«ãããã¡ã¤ã«åãï¼ããã±ã¼ã¸ 4878 è¨è¿°ãã¡ã¤ã«ãç½®ããããã£ã¬ã¯ããªããã®ç¸å¯¾ãã¹åã§ï¼1è¡ã«1ã¤ãã¤è¨è¿° 4879 ããï¼ã¾ãï¼å¿ 4880 è¦ã«å¿ãã¦ï¼ä»¥ä¸ã®ãã£ã¬ã¯ãã£ããå«ããï¼ 4881 4882 (a) E_PACKAGE <ç°¡æããã±ã¼ã¸å> 4883 4884 ç°¡æããã±ã¼ã¸åãæå®ããï¼ç°¡æããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ï¼E_PACKAGEï¼ã®å 4885 4886 é ã«è¨è¿°ããï¼ç°¡æããã±ã¼ã¸åã¯ï¼asp_<ã¿ã¼ã²ããç¥ç§°>ã¨ããï¼ä¾ãã°ï¼ 4887 ã¿ã¼ã²ããç¥ç§°ãat91skyeye_gccã®å ´åã«ã¯ï¼asp_at91skyeye_gccã¨ãªãï¼å 4888 å¥ããã±ã¼ã¸ã¨åºå¥ããããã«ï¼ç°¡æããã±ã¼ã¸ã®ãã¡ã¤ã«åã«ã¯"target"ã 4889 å«ããªãï¼ 4890 4891 (b) PACKAGE <åå¥ããã±ã¼ã¸å> 4892 4893 åå¥ããã±ã¼ã¸åãæå®ããï¼åå¥ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ï¼MANIFESTï¼ã®å 4894 4895 é ã«è¨è¿°ããï¼ã¾ãï¼ããããã¤ã³ã¯ã«ã¼ããããåãã¡ã¤ã«ã®å 4896 é ã«ãè¨è¿° 4897 ãï¼ãããã¤ã³ã¯ã«ã¼ããã¦ããåå¥ããã±ã¼ã¸åãæå®ããï¼ã¿ã¼ã²ããä¾ 4898 åé¨ã®åå¥ããã±ã¼ã¸åã¯ï¼åå¥ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ãç½®ããããã£ã¬ã¯ 4899 ããªã®ç¸å¯¾ãã¹ä¸ã®"/"ã"_"ã«ç½®ãæããæååãï¼"asp_"ã®å¾ã«ã¤ãªããã 4900 ã®ã¨ããï¼ä¾ãã°ï¼åå¥ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ãarch/arm_gcc/MANIFESTã®å ´ 4901 åã«ã¯ï¼asp_arch_arm_gccã¨ãªãï¼ 4902 4903 (c) VERSION <ãã¼ã¸ã§ã³çªå·> 4904 4905 ããã±ã¼ã¸ã®ãã¼ã¸ã§ã³çªå·ãæå®ããï¼ç°¡æããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ããã³ 4906 åå¥ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ã®ä¸ã«è¨è¿°ããï¼ç°¡æããã±ã¼ã¸ã«ããã¦ï¼ãã¼ 4907 ã¸ã§ã³çªå·ãããã±ã¼ã¸åããæ¥ä»ã¨ããå ´åã«ã¯ï¼ããã±ã¼ã¸çªå·ã®ä»£ãã 4908 ã«%dateã¨è¨è¿°ããï¼ 4909 4910 ãã¼ã¸ã§ã³çªå·ã®ä»ä¸æ¹æ³ã«ã¤ãã¦ã¯ï¼ãTOPPERS/ASPã«ã¼ãã« ã¦ã¼ã¶ã¼ãºã 4911 ãã¥ã¢ã«ãã®ã2.2 ç°¡æããã±ã¼ã¸ãããã³ã2.3 åå¥ããã±ã¼ã¸ãã®ç¯ãå 4912 ç 4913 §ãããã¨ï¼ 4914 4915 (d) INCLUDE <ãã¡ã¤ã«å> 4916 4917 å¥ã®ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ãã¤ã³ã¯ã«ã¼ãããï¼ç°¡æããã±ã¼ã¸è¨è¿°ãã¡ã¤ 4918 ã«ããã¯ï¼åå¥ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ã®ã¿ãã¤ã³ã¯ã«ã¼ãããã®ãååã¨ã 4919 ãï¼åå¥ããã±ã¼ã¸è¨è¿°ãã¡ã¤ã«ããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ä¸ã§æå®ã 4920 ããåå¥ããã±ã¼ã¸åã¯ï¼ãã¹ã¦ä¸è´ãã¦ããªããã°ãªããªãï¼ 4921 4922 4923 ï¼ï¼ï¼ãªãã¡ã¬ã³ã¹ 4924 4925 10.1 ã¿ã¼ã²ããä¾åé¨ã®ãã¡ã¤ã«ä¸è¦§ 4926 4927 æ¨æºçãªã¿ã¼ã²ããä¾åé¨ã®ãã¡ã¤ã«æ§æã¯æ¬¡ã®éãã§ããï¼ 4928 4929 Makefile.target Makefileã®ã¿ã¼ã²ããä¾åé¨ï¼ï¼ç« ï¼ï¼ 4930 target_offset.tf ãªãã»ãããã¡ã¤ã«çæç¨ãã³ãã¬ã¼ããã¡ã¤ã«ï¼2.5.1ç¯ï¼ 4931 ãªãã·ã§ã³ï¼ 4932 4933 target_stddef.h TOPPERSå 4934 ±éå®ç¾©ï¼t_stddef.hï¼ã®ã¿ã¼ã²ããä¾åé¨ï¼ï¼ 4935 ç« ï¼ï¼ã¢ããªã±ã¼ã·ã§ã³ã¨ã«ã¼ãã«ã®ä¸¡æ¹ããã¤ã³ã¯ã«ã¼ 4936 ããããï¼ 4937 target_sil.h ã·ã¹ãã ã¤ã³ã¿ãã§ã¼ã¹ã¬ã¤ã¤ï¼sil.hï¼ã®ã¿ã¼ã²ããä¾ 4938 åé¨ï¼ï¼ç« ï¼ï¼ã¢ããªã±ã¼ã·ã§ã³ã¨ã«ã¼ãã«ã®ä¸¡æ¹ãã 4939 ã¤ã³ã¯ã«ã¼ããããï¼ 4940 target_kernel.h ã«ã¼ãã«APIï¼kernel.hï¼ã®ã¿ã¼ã²ããä¾åé¨ï¼ï¼ç« ï¼ï¼ 4941 ã¢ããªã±ã¼ã·ã§ã³ã¨ã«ã¼ãã«ã®ä¸¡æ¹ããã¤ã³ã¯ã«ã¼ãã 4942 ããï¼ 4943 4944 target_config.h ã«ã¼ãã«å®è£ 4945 ã®ã¿ã¼ã²ããä¾åé¨ã®ããããã¡ã¤ã«ï¼ï¼ 4946 ç« ï¼ï¼ã«ã¼ãã«ã®ã¿ããã¤ã³ã¯ã«ã¼ããããï¼ 4947 target_config.c ã«ã¼ãã«å®è£ 4948 ã®ã¿ã¼ã²ããä¾åé¨ã®Cè¨èªã§è¨è¿°ããã 4949 é¨åï¼ï¼ç« ï¼ãªãã·ã§ã³ï¼ï¼ 4950 target_support.S ã«ã¼ãã«å®è£ 4951 ã®ã¿ã¼ã²ããä¾åé¨ã®ã¢ã»ã³ããªè¨èªã§è¨ 4952 è¿°ãããé¨åï¼ï¼ç« ï¼ãªãã·ã§ã³ï¼ï¼ 4953 target_rename.def ã«ã¼ãã«å®è£ 4954 ã®ã¿ã¼ã²ããä¾åé¨ã®ããã®ãªãã¼ã è¨è¿° 4955 ï¼6.12ç¯ï¼ï¼ 4956 target_rename.h target_rename.defããçæããããã¡ã¤ã«ï¼6.12ç¯ï¼ï¼ 4957 target_unrename.h target_rename.defããçæããããã¡ã¤ã«ï¼6.12ç¯ï¼ï¼ 4958 target_timer.cfg ã¿ã¤ããã©ã¤ãã®ã·ã¹ãã ã³ã³ãã£ã®ã¥ã¬ã¼ã·ã§ã³ãã¡ 4959 ã¤ã«ï¼6.13ç¯ï¼ï¼ 4960 target_timer.h ã¿ã¤ããã©ã¤ãã®ããããã¡ã¤ã«ï¼6.13ç¯ï¼ï¼ã«ã¼ãã« 4961 ã®ã¿ããã¤ã³ã¯ã«ã¼ããããï¼ 4962 target_timer.c ã¿ã¤ããã©ã¤ãã®å®è£ 4963 ãã¡ã¤ã«ï¼6.13ç¯ï¼ãªãã·ã§ã³ï¼ï¼ 4964 ã·ã¹ãã ç¥ç§°.h ã¿ã¼ã²ããã®ãã¼ãã¦ã§ã¢è³æºï¼å²è¾¼ã¿ãã³ãã©çªå·ã 4965 CPUä¾å¤ãã³ãã©çªå·ï¼ããã¤ã¹ã¬ã¸ã¹ã¿ã®çªå°ãªã©ï¼ã® 4966 å®ç¾©ãå«ãããããã¡ã¤ã«ï¼ã¢ããªã±ã¼ã·ã§ã³ã¨ã«ã¼ã 4967 ã«ã®ä¸¡æ¹ããã¤ã³ã¯ã«ã¼ããããï¼ï¼ç« ï¼ãªãã·ã§ã³ï¼ï¼ 4968 4969 target_def.csv ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®å¤åå¾ã·ã³ãã«ãã¼ãã«ã®ã¿ã¼ã²ã 4970 ãä¾åé¨ï¼ï¼ç« ï¼ãªãã·ã§ã³ï¼ï¼ 4971 target.tf ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹2ã®ãã³ãã¬ã¼ããã¡ã¤ã«ã® 4972 ã¿ã¼ã²ããä¾åé¨ï¼7.2ç¯ï¼ï¼ 4973 target_check.tf ã³ã³ãã£ã®ã¥ã¬ã¼ã¿ã®ãã¹3ã®ãã³ãã¬ã¼ããã¡ã¤ã«ï¼7.3 4974 ç¯ï¼ï¼ 4975 target_cfg1_out.h cfg1_out.cã®ãªã³ã¯ã«å¿ 4976 è¦ãªã¹ã¿ãã®å®ç¾©ãã¡ã¤ã«ï¼7.4 4977 ç¯ï¼ï¼ 4978 4979 target_syssvc.h ã·ã¹ãã ãµã¼ãã¹ã®ã¿ã¼ã²ããä¾åå®ç¾©ï¼8.0ç¯ï¼ï¼ 4980 target_serial.cfg ã·ãªã¢ã«ãã©ã¤ãã®ã·ã¹ãã ã³ã³ãã£ã®ã¥ã¬ã¼ã·ã§ã³ãã¡ 4981 ã¤ã«ï¼8.3ç¯ï¼ï¼ 4982 target_serial.h ã·ãªã¢ã«ãã©ã¤ãã®ããããã¡ã¤ã«ï¼8.3ç¯ï¼ï¼ã·ãªã¢ã« 4983 ãã©ã¤ãã®ã¿ããã¤ã³ã¯ã«ã¼ããããï¼ 4984 target_serial.c ã·ãªã¢ã«ãã©ã¤ãã®å®è£ 4985 ãã¡ã¤ã«ï¼8.3ç¯ï¼ãªãã·ã§ã³ï¼ï¼ 4986 target_test.h ãã¹ãããã°ã©ã ã®ã¿ã¼ã²ããä¾åå®ç¾©ï¼8.4ç¯ï¼ï¼ 4987 4988 target_user.txt ã¦ã¼ã¶ã¼ãºããã¥ã¢ã«ï¼9.1ç¯ï¼ 4989 target_design.txt è¨è¨ã¡ã¢ï¼9.1ç¯ï¼ãªãã·ã§ã³ï¼ 4990 MANIFEST åå¥ããã±ã¼ã¸ã«å«ãããã¡ã¤ã«ã®ãªã¹ãï¼9.2ç¯ï¼ãªã 4991 ã·ã§ã³ï¼ 4992 E_PACKAGE ç°¡æããã±ã¼ã¸ã«å«ãããã¡ã¤ã«ã®ãªã¹ãï¼9.2ç¯ï¼ãªã 4993 ã·ã§ã³ï¼ 4994 4995 ä»¥ä¸ 3942 このコマンドにより,RELEASE/asp_at91skyeye_gcc-<バージョン番号>.tar.gz 3943 が作成される(RELEASEディレクトリがない場合には,ディレクトリが作られ 3944 る). 3945 3946 なお,makereleaseユーティリティは,ASPカーネルのソースファイルが置かれ 3947 たディレクトリが,aspという名称であることを仮定している(異なる名称の場 3948 合でもパッケージは作成できるが,パッケージを展開した時に展開されるディ 3949 レクトリがaspでなくなる).また,標準のtarコマンドがGNU tarであること 3950 (正確には,zオプションに対応していること)を想定している. 3951 3952 パッケージ記述ファイルには,パッケージに含めるファイル名を,パッケージ 3953 記述ファイルが置かれたディレクトリからの相対パス名で,1行に1つずつ記述 3954 する.また,必要に応じて,以下のディレクティブを含める. 3955 3956 (a) E_PACKAGE <簡易パッケージ名> 3957 3958 簡易パッケージ名を指定する.簡易パッケージ記述ファイル(E_PACKAGE)の先 3959 頭に記述する.簡易パッケージ名は,asp_<ターゲット略称>とする.例えば, 3960 ターゲット略称がat91skyeye_gccの場合には,asp_at91skyeye_gccとなる.個 3961 別パッケージと区別するために,簡易パッケージのファイル名には"target"を 3962 含めない. 3963 3964 (b) PACKAGE <個別パッケージ名> 3965 3966 個別パッケージ名を指定する.個別パッケージ記述ファイル(MANIFEST)の先 3967 頭に記述する.また,そこからインクルードされる各ファイルの先頭にも記述 3968 し,それをインクルードしている個別パッケージ名を指定する.ターゲット依 3969 存部の個別パッケージ名は,個別パッケージ記述ファイルが置かれたディレク 3970 トリの相対パス中の"/"を"_"に置き換えた文字列を,"asp_"の後につなげたも 3971 のとする.例えば,個別パッケージ記述ファイルがarch/arm_gcc/MANIFESTの場 3972 合には,asp_arch_arm_gccとなる. 3973 3974 (c) VERSION <バージョン番号> 3975 3976 パッケージのバージョン番号を指定する.簡易パッケージ記述ファイルおよび 3977 個別パッケージ記述ファイルの中に記述する.簡易パッケージにおいて,バー 3978 ジョン番号をパッケージ化した日付とする場合には,パッケージ番号の代わり 3979 に%dateと記述する. 3980 3981 バージョン番号の付与方法については,「TOPPERS/ASPカーネル ユーザーズマ 3982 ニュアル」の「2.2 簡易パッケージ」および「2.3 個別パッケージ」の節を参 3983 照すること. 3984 3985 (d) INCLUDE <ファイル名> 3986 3987 別のパッケージ記述ファイルをインクルードする.簡易パッケージ記述ファイ 3988 ルからは,個別パッケージ記述ファイルのみをインクルードするのを原則とす 3989 る.個別パッケージ記述ファイルからインクルードされるファイル中で指定さ 3990 れる個別パッケージ名は,すべて一致していなければならない. 3991 3992 3993 10.リファレンス 3994 3995 10.1 ターゲット依存部のファイル一覧 3996 3997 標準的なターゲット依存部のファイル構成は次の通りである. 3998 3999 Makefile.target Makefileのターゲット依存部(2章). 4000 target_offset.tf オフセットファイル生成用テンプレートファイル(2.5.1節, 4001 オプション) 4002 4003 target_stddef.h TOPPERS共通定義(t_stddef.h)のターゲット依存部(3 4004 章).アプリケーションとカーネルの両方からインクルー 4005 ドされる. 4006 target_sil.h システムインタフェースレイヤ(sil.h)のターゲット依 4007 存部(4章).アプリケーションとカーネルの両方から 4008 インクルードされる. 4009 target_kernel.h カーネルAPI(kernel.h)のターゲット依存部(5章). 4010 アプリケーションとカーネルの両方からインクルードさ 4011 れる. 4012 4013 target_config.h カーネル実装のターゲット依存部のヘッダファイル(6 4014 章).カーネルのみからインクルードされる. 4015 target_config.c カーネル実装のターゲット依存部のC言語で記述される 4016 部分(6章,オプション). 4017 target_support.S カーネル実装のターゲット依存部のアセンブリ言語で記 4018 述される部分(6章,オプション). 4019 target_rename.def カーネル実装のターゲット依存部のためのリネーム記述 4020 (6.12節). 4021 target_rename.h target_rename.defから生成されるファイル(6.12節). 4022 target_unrename.h target_rename.defから生成されるファイル(6.12節). 4023 target_timer.cfg タイマドライバのシステムコンフィギュレーションファ 4024 イル(6.13節). 4025 target_timer.h タイマドライバのヘッダファイル(6.13節).カーネル 4026 のみからインクルードされる. 4027 target_timer.c タイマドライバの実装ファイル(6.13節,オプション). 4028 システム略称.h ターゲットのハードウェア資源(割込みハンドラ番号や 4029 CPU例外ハンドラ番号,デバイスレジスタの番地など)の 4030 定義を含むヘッダファイル.アプリケーションとカーネ 4031 ルの両方からインクルードされる(6章,オプション). 4032 4033 target_def.csv コンフィギュレータの値取得シンボルテーブルのターゲッ 4034 ト依存部(7章,オプション). 4035 target.tf コンフィギュレータのパス2のテンプレートファイルの 4036 ターゲット依存部(7.2節). 4037 target_check.tf コンフィギュレータのパス3のテンプレートファイル(7.3 4038 節). 4039 target_cfg1_out.h cfg1_out.cのリンクに必要なスタブの定義ファイル(7.4 4040 節). 4041 4042 target_syssvc.h システムサービスのターゲット依存定義(8.0節). 4043 target_serial.cfg シリアルドライバのシステムコンフィギュレーションファ 4044 イル(8.3節). 4045 target_serial.h シリアルドライバのヘッダファイル(8.3節).シリアル 4046 ドライバのみからインクルードされる. 4047 target_serial.c シリアルドライバの実装ファイル(8.3節,オプション). 4048 target_test.h テストプログラムのターゲット依存定義(8.4節). 4049 4050 target_user.txt ユーザーズマニュアル(9.1節) 4051 target_design.txt 設計メモ(9.1節,オプション) 4052 MANIFEST 個別パッケージに含めるファイルのリスト(9.2節,オプ 4053 ション) 4054 E_PACKAGE 簡易パッケージに含めるファイルのリスト(9.2節,オプ 4055 ション) 4056 4057 以上 -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.