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