Changeset 315 for rubycfg_asp/trunk/asp_dcre/kernel/task.h
- Timestamp:
- Jul 23, 2017, 2:29:40 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
rubycfg_asp/trunk/asp_dcre/kernel/task.h
-
Property svn:mime-type
changed from
text/x-chdr
totext/x-chdr; charset=UTF-8
r313 r315 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ä¸è¨èä½æ¨©è 12 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 13 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 14 * å¤ã»åé 15 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 16 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 17 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 18 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 19 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 20 * ç¨ã§ããå½¢ã§åé 21 å¸ããå ´åã«ã¯ï¼åé 22 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 23 * è 24 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 25 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 26 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 27 * ç¨ã§ããªãå½¢ã§åé 28 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 29 * ã¨ï¼ 30 * (a) åé 31 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 32 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 33 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 34 * (b) åé 35 å¸ã®å½¢æ 36 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 37 * å ±åãããã¨ï¼ 38 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 39 * 害ãããï¼ä¸è¨èä½æ¨©è 40 ããã³TOPPERSããã¸ã§ã¯ããå 41 責ãããã¨ï¼ 42 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 43 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 44 ããã³TOPPERSããã¸ã§ã¯ãã 45 * å 46 責ãããã¨ï¼ 11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 16 * スコード中に含まれていること. 17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 20 * の無保証規定を掲載すること. 21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 23 * と. 24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 25 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 27 * 報告すること. 28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 32 * 免責すること. 47 33 * 48 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 49 ã 50 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 51 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 52 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 53 * ã®è²¬ä»»ãè² ããªãï¼ 34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 54 39 * 55 40 * $Id$ … … 57 42 58 43 /* 59 * ã¿ã¹ã¯ç®¡çã¢ã¸ã¥ã¼ã«44 * タスク管理モジュール 60 45 */ 61 46 … … 67 52 68 53 /* 69 * ãã¬ã¼ã¹ãã°ãã¯ãã®ããã©ã«ãå®ç¾©54 * トレースログマクロのデフォルト定義 70 55 */ 71 56 #ifndef LOG_TSKSTAT … … 74 59 75 60 /* 76 * ã¿ã¹ã¯åªå 77 度ã®å 78 é¨è¡¨ç¾ã»å¤é¨è¡¨ç¾å¤æãã¯ã 61 * タスク優先度の内部表現・外部表現変換マクロ 79 62 */ 80 63 #define INT_PRIORITY(x) ((uint_t)((x) - TMIN_TPRI)) … … 82 65 83 66 /* 84 * ã¿ã¹ã¯ç¶æ 85 ã®å 86 é¨è¡¨ç¾ 87 * 88 * TCBä¸ã®ã¿ã¹ã¯ç¶æ 89 ã§ã¯ï¼å®è¡ç¶æ 90 ï¼RUNNINGï¼ã¨å®è¡å¯è½ç¶æ 91 ï¼READYï¼ 92 * ã¯åºå¥ããªãï¼ä¸¡ç¶æ 93 ãç·ç§°ãã¦ï¼å®è¡ã§ããç¶æ 94 ï¼RUNNABLEï¼ã¨å¼ã¶ï¼ 95 * äºéå¾ 96 ã¡ç¶æ 97 ã¯ï¼(TS_WAITING | TS_SUSPENDED)ã§è¡¨ãï¼TS_WAIT_???ã¯å¾ 98 99 * ã¡è¦å ã表ãï¼å¾ 100 ã¡ç¶æ 101 ï¼äºéå¾ 102 ã¡ç¶æ 103 ãå«ãï¼ã®å ´åã«ã®ã¿è¨å®ããï¼ 104 */ 105 #define TS_DORMANT 0x00U /* ä¼æ¢ç¶æ 106 */ 107 #define TS_RUNNABLE 0x01U /* å®è¡ã§ããç¶æ 108 */ 109 #define TS_WAITING 0x02U /* å¾ 110 ã¡ç¶æ 111 */ 112 #define TS_SUSPENDED 0x04U /* å¼·å¶å¾ 113 ã¡ç¶æ 114 */ 115 116 #define TS_WAIT_DLY (0x00U << 3) /* æéçµéå¾ 117 ã¡ */ 118 #define TS_WAIT_SLP (0x01U << 3) /* èµ·åºå¾ 119 ã¡ */ 120 #define TS_WAIT_RDTQ (0x02U << 3) /* ãã¼ã¿ãã¥ã¼ããã®åä¿¡å¾ 121 ã¡ */ 122 #define TS_WAIT_RPDQ (0x03U << 3) /* åªå 123 度ãã¼ã¿ãã¥ã¼ããã®åä¿¡å¾ 124 ã¡ */ 125 #define TS_WAIT_SEM (0x04U << 3) /* ã»ããã©è³æºã®ç²å¾å¾ 126 ã¡ */ 127 #define TS_WAIT_FLG (0x05U << 3) /* ã¤ãã³ããã©ã°å¾ 128 ã¡ */ 129 #define TS_WAIT_SDTQ (0x06U << 3) /* ãã¼ã¿ãã¥ã¼ã¸ã®éä¿¡å¾ 130 ã¡ */ 131 #define TS_WAIT_SPDQ (0x07U << 3) /* åªå 132 度ãã¼ã¿ãã¥ã¼ã¸ã®éä¿¡å¾ 133 ã¡ */ 134 #define TS_WAIT_MBX (0x08U << 3) /* ã¡ã¼ã«ããã¯ã¹ããã®åä¿¡å¾ 135 ã¡ */ 136 #define TS_WAIT_MPF (0x09U << 3) /* åºå®é·ã¡ã¢ãªãããã¯ã®ç²å¾å¾ 137 ã¡ */ 138 139 /* 140 * ã¿ã¹ã¯ç¶æ 141 å¤å¥ãã¯ã 142 * 143 * TSTAT_DORMANTã¯ã¿ã¹ã¯ãä¼æ¢ç¶æ 144 ã§ãããã©ãããï¼TSTAT_RUNNABLE㯠145 * ã¿ã¹ã¯ãå®è¡ã§ããç¶æ 146 ã§ãããã©ãããå¤å¥ããï¼TSTAT_WAITINGã¯å¾ 147 148 * ã¡ç¶æ 149 ã¨äºéå¾ 150 ã¡ç¶æ 151 ã®ããããã§ãããã©ãããï¼TSTAT_SUSPENDED㯠152 * å¼·å¶å¾ 153 ã¡ç¶æ 154 ã¨äºéå¾ 155 ã¡ç¶æ 156 ã®ããããã§ãããã©ãããå¤å¥ããï¼ 67 * タスク状態の内部表現 68 * 69 * TCB中のタスク状態では,実行状態(RUNNING)と実行可能状態(READY) 70 * は区別しない.両状態を総称して,実行できる状態(RUNNABLE)と呼ぶ. 71 * 二重待ち状態は,(TS_WAITING | TS_SUSPENDED)で表す.TS_WAIT_???は待 72 * ち要因を表し,待ち状態(二重待ち状態を含む)の場合にのみ設定する. 73 */ 74 #define TS_DORMANT 0x00U /* 休止状態 */ 75 #define TS_RUNNABLE 0x01U /* 実行できる状態 */ 76 #define TS_WAITING 0x02U /* 待ち状態 */ 77 #define TS_SUSPENDED 0x04U /* 強制待ち状態 */ 78 79 #define TS_WAIT_DLY (0x00U << 3) /* 時間経過待ち */ 80 #define TS_WAIT_SLP (0x01U << 3) /* 起床待ち */ 81 #define TS_WAIT_RDTQ (0x02U << 3) /* データキューからの受信待ち */ 82 #define TS_WAIT_RPDQ (0x03U << 3) /* 優先度データキューからの受信待ち */ 83 #define TS_WAIT_SEM (0x04U << 3) /* セマフォ資源の獲得待ち */ 84 #define TS_WAIT_FLG (0x05U << 3) /* イベントフラグ待ち */ 85 #define TS_WAIT_SDTQ (0x06U << 3) /* データキューへの送信待ち */ 86 #define TS_WAIT_SPDQ (0x07U << 3) /* 優先度データキューへの送信待ち */ 87 #define TS_WAIT_MBX (0x08U << 3) /* メールボックスからの受信待ち */ 88 #define TS_WAIT_MPF (0x09U << 3) /* 固定長メモリブロックの獲得待ち */ 89 90 /* 91 * タスク状態判別マクロ 92 * 93 * TSTAT_DORMANTはタスクが休止状態であるかどうかを,TSTAT_RUNNABLEは 94 * タスクが実行できる状態であるかどうかを判別する.TSTAT_WAITINGは待 95 * ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDEDは 96 * 強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する. 157 97 */ 158 98 #define TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT) … … 162 102 163 103 /* 164 * ã¿ã¹ã¯å¾ 165 ã¡è¦å å¤å¥ãã¯ã 166 * 167 * TSTAT_WAIT_SLPã¯ã¿ã¹ã¯ãèµ·åºå¾ 168 ã¡ã§ãããã©ãããï¼TSTAT_WAIT_WOBJ 169 * ã¯ã¿ã¹ã¯ãåæã»éä¿¡ãªãã¸ã§ã¯ãã«å¯¾ããå¾ 170 ã¡ã§ãããï¼è¨ãæããã¨ï¼ 171 * åæéä¿¡ãªãã¸ã§ã¯ãã®å¾ 172 ã¡ãã¥ã¼ã«ã¤ãªããã¦ãããï¼ã©ãããå¤å¥ã 173 * ãï¼ã¾ãï¼TSTAT_WAIT_WOBJCBã¯ã¿ã¹ã¯ãåæã»éä¿¡ãªãã¸ã§ã¯ãã®ç®¡ç 174 * ãããã¯ã®å 175 ±éé¨åï¼WOBJCBï¼ã®å¾ 176 ã¡ãã¥ã¼ã«ã¤ãªããã¦ãããã©ããã 177 * å¤å¥ããï¼ 178 * 179 * TSTAT_WAIT_SLPã¯ï¼ä»»æã®ã¿ã¹ã¯ç¶æ 180 ã®ä¸ããï¼ã¿ã¹ã¯ãèµ·åºå¾ 181 ã¡ã§ãã 182 * ãã¨ãå¤å¥ã§ããï¼ããªãã¡ï¼TSTAT_WAITINGã«ããå¾ 183 ã¡ç¶æ 184 ã§ãããã¨ã 185 * å¤å¥ããã«ï¼TSTAT_SLPã ããç¨ãã¦èµ·åºå¾ 186 ã¡ç¶æ 187 ã§ãããã¨ãå¤å¥ã§ããï¼ 188 * ãããå¹ççã«å®ç¾ããããã«ï¼TS_WAIT_SLPã®å¤ãï¼(0x00U << 3)ã§ã¯ãª 189 * ã(0x01U << 3)ã¨ãã¦ããï¼ãã®ããï¼ã¿ã¹ã¯ãæéçµéå¾ 190 ã¡ç¶æ 191 ã§ãã 192 * ãã¨ãå¤å¥ããããã®TSTAT_WAIT_DLYãï¼TSTAT_WAIT_SLPã¨åæ§ã®æ¹æ³ã§ 193 * å®ç¾ãããã¨ã¯ã§ããªãï¼ 194 */ 195 #define TS_WAIT_MASK (0x0fU << 3) /* å¾ 196 ã¡è¦å ã®ååºããã¹ã¯ */ 104 * タスク待ち要因判別マクロ 105 * 106 * TSTAT_WAIT_SLPはタスクが起床待ちであるかどうかを,TSTAT_WAIT_WOBJ 107 * はタスクが同期・通信オブジェクトに対する待ちであるか(言い換えると, 108 * 同期通信オブジェクトの待ちキューにつながれているか)どうかを判別す 109 * る.また,TSTAT_WAIT_WOBJCBはタスクが同期・通信オブジェクトの管理 110 * ブロックの共通部分(WOBJCB)の待ちキューにつながれているかどうかを 111 * 判別する. 112 * 113 * TSTAT_WAIT_SLPは,任意のタスク状態の中から,タスクが起床待ちである 114 * ことを判別できる.すなわち,TSTAT_WAITINGにより待ち状態であることを 115 * 判別せずに,TSTAT_SLPだけを用いて起床待ち状態であることを判別できる. 116 * これを効率的に実現するために,TS_WAIT_SLPの値を,(0x00U << 3)ではな 117 * く(0x01U << 3)としている.そのため,タスクが時間経過待ち状態である 118 * ことを判別するためのTSTAT_WAIT_DLYを,TSTAT_WAIT_SLPと同様の方法で 119 * 実現することはできない. 120 */ 121 #define TS_WAIT_MASK (0x0fU << 3) /* 待ち要因の取出しマスク */ 197 122 198 123 #define TSTAT_WAIT_SLP(tstat) (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP) … … 201 126 202 127 /* 203 * å¾ 204 ã¡æ 205 å ±ãããã¯ï¼WINFOï¼ã®å®ç¾© 206 * 207 * ã¿ã¹ã¯ãå¾ 208 ã¡ç¶æ 209 ã®éã¯ï¼TCBããã³ãã®p_winfoã§æãããWINFOã次㮠210 * ããã«è¨å®ããªããã°ãªããªãï¼ 211 * 212 * (a) TCBã®ã¿ã¹ã¯ç¶æ 213 ãå¾ 214 ã¡ç¶æ 215 ï¼TS_WAITINGï¼ã«ããï¼ãã®éã«ï¼å¾ 216 ã¡ 217 * è¦å ï¼TS_WAIT_???ï¼ãè¨å®ããï¼ 218 * 219 * (b) ã¿ã¤ã ã¢ã¦ããç£è¦ããããã«ï¼ã¿ã¤ã ã¤ãã³ããããã¯ãç»é²ããï¼ 220 * ç»é²ããã¿ã¤ã ã¤ãã³ããããã¯ã¯ï¼å¾ 221 ã¡ã«å 222 ¥ããµã¼ãã¹ã³ã¼ã«å¦çé¢æ° 223 * ã®ãã¼ã«ã«å¤æ°ã¨ãã¦ç¢ºä¿ãï¼ããã¸ã®ãã¤ã³ã¿ãWINFOã®p_tmevtbã«è¨ 224 * æ¶ããï¼ã¿ã¤ã ã¢ã¦ãã®ç£è¦ãå¿ 225 è¦ãªãå ´åï¼æ°¸ä¹ 226 å¾ 227 ã¡ã®å ´åï¼ã«ã¯ï¼ 228 * p_tmevtbãNULLã«ããï¼ 229 * 230 * åæã»éä¿¡ãªãã¸ã§ã¯ãã«å¯¾ããå¾ 231 ã¡ç¶æ 232 ã®å ´åã«ã¯ï¼æ¨æºã®WINFOã« 233 * p_wobjcbãã£ã¼ã«ãã追å ããæ§é ä½ï¼WINFO_WOBJï¼wait.hã§å®ç¾©ï¼ã使 234 * ãï¼ã¾ãï¼ä»¥ä¸ã®(c)ï½(e)ã®è¨å®ãè¡ãå¿ 235 è¦ãããï¼åæã»éä¿¡ãªãã¸ã§ 236 * ã¯ãã«é¢ä¿ããªãå¾ 237 ã¡ï¼èµ·åºå¾ 238 ã¡ï¼æéçµéå¾ 239 ã¡ï¼ã®å ´åã«ã¯ï¼(c)ï½(e) 240 * ã¯å¿ 241 è¦ãªãï¼ 242 * 243 * (c) TCBãå¾ 244 ã¡å¯¾è±¡ã®åæã»éä¿¡ãªãã¸ã§ã¯ãã®å¾ 245 ã¡ãã¥ã¼ã«ã¤ãªãï¼å¾ 246 247 * ã¡ãã¥ã¼ã«ã¤ãªãããã«ï¼task_queueã使ãï¼ 248 * 249 * (d) å¾ 250 ã¡å¯¾è±¡ã®åæã»éä¿¡ãªãã¸ã§ã¯ãã®ç®¡çãããã¯ã¸ã®ãã¤ã³ã¿ãï¼ 251 * WINFO_WOBJã®p_wobjcbã«è¨æ¶ããï¼ 252 * 253 * (e) å¾ 254 ã¡å¯¾è±¡ã®åæã»éä¿¡ãªãã¸ã§ã¯ãã«ä¾åãã¦è¨æ¶ãããã¨ãå¿ 255 è¦ãª 256 * æ 257 å ±ãããå ´åã«ã¯ï¼WINFO_WOBJã«å¿ 258 è¦ãªæ 259 å ±ã®ããã®ãã£ã¼ã«ãã追å 260 * ããæ§é ä½ãå®ç¾©ãï¼WINFO_WOBJã®ä»£ããã«ç¨ããï¼ 261 * 262 * å¾ 263 ã¡ç¶æ 264 ã解é¤ããéã«ã¯ï¼å¾ 265 ã¡è§£é¤ããã¿ã¹ã¯ã«å¯¾ããè¿å¤ãWINFOã® 266 * wercdã«è¨å®ããï¼wercdãå¿ 267 è¦ãªã®ã¯å¾ 268 ã¡è§£é¤ä»¥éã§ããã®ã«å¯¾ãã¦ï¼ 269 * p_tmevtbã¯å¾ 270 ã¡è§£é¤å¾ã¯å¿ 271 è¦ãªãããï¼ã¡ã¢ãªç¯ç´ã®ããã«å 272 ±ç¨ä½ã使㣠273 * ã¦ããï¼ãã®ããï¼wercdã¸ã¨ã©ã¼ã³ã¼ããè¨å®ããã®ã¯ï¼ã¿ã¤ã ã¤ãã³ã 274 * ãããã¯ãç»é²è§£é¤ããå¾ã«ããªããã°ãªããªãï¼ 128 * 待ち情報ブロック(WINFO)の定義 129 * 130 * タスクが待ち状態の間は,TCBおよびそのp_winfoで指されるWINFOを次の 131 * ように設定しなければならない. 132 * 133 * (a) TCBのタスク状態を待ち状態(TS_WAITING)にする.その際に,待ち 134 * 要因(TS_WAIT_???)も設定する. 135 * 136 * (b) タイムアウトを監視するために,タイムイベントブロックを登録する. 137 * 登録するタイムイベントブロックは,待ちに入るサービスコール処理関数 138 * のローカル変数として確保し,それへのポインタをWINFOのp_tmevtbに記 139 * 憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には, 140 * p_tmevtbをNULLにする. 141 * 142 * 同期・通信オブジェクトに対する待ち状態の場合には,標準のWINFOに 143 * p_wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.hで定義)を使 144 * う.また,以下の(c)~(e)の設定を行う必要がある.同期・通信オブジェ 145 * クトに関係しない待ち(起床待ち,時間経過待ち)の場合には,(c)~(e) 146 * は必要ない. 147 * 148 * (c) TCBを待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待 149 * ちキューにつなぐために,task_queueを使う. 150 * 151 * (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを, 152 * WINFO_WOBJのp_wobjcbに記憶する. 153 * 154 * (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な 155 * 情報がある場合には,WINFO_WOBJに必要な情報のためのフィールドを追加 156 * した構造体を定義し,WINFO_WOBJの代わりに用いる. 157 * 158 * 待ち状態を解除する際には,待ち解除したタスクに対する返値をWINFOの 159 * wercdに設定する.wercdが必要なのは待ち解除以降であるのに対して, 160 * p_tmevtbは待ち解除後は必要ないため,メモリ節約のために共用体を使っ 161 * ている.そのため,wercdへエラーコードを設定するのは,タイムイベント 162 * ブロックを登録解除した後にしなければならない. 275 163 */ 276 164 typedef union waiting_information { 277 ER wercd; /* å¾ 278 ã¡è§£é¤æã®ã¨ã©ã¼ã³ã¼ã */ 279 TMEVTB *p_tmevtb; /* å¾ 280 ã¡ç¶æ 281 ç¨ã®ã¿ã¤ã ã¤ãã³ãããã㯠*/ 165 ER wercd; /* 待ち解除時のエラーコード */ 166 TMEVTB *p_tmevtb; /* 待ち状態用のタイムイベントブロック */ 282 167 } WINFO; 283 168 284 169 /* 285 * ã¿ã¹ã¯åæåããã㯠286 * 287 * ã¿ã¹ã¯ã«é¢ããæ 288 å ±ãï¼å¤ãå¤ãããªãããã«ROMã«ç½®ããé¨åï¼ã¿ã¹ã¯ 289 * åæåãããã¯ï¼ã¨ï¼å¤ãå¤åããããã«RAMã«ç½®ããªããã°ãªããªãé¨ 290 * åï¼ã¿ã¹ã¯ç®¡çãããã¯ï¼TCBï¼ã«åé¢ãï¼TCBå 291 ã«å¯¾å¿ããã¿ã¹ã¯åæå 292 * ãããã¯ãæããã¤ã³ã¿ãå 293 ¥ããï¼ã¿ã¹ã¯åæåãããã¯å 294 ã«å¯¾å¿ãã 295 * TCBãæããã¤ã³ã¿ãå 296 ¥ããæ¹æ³ã®æ¹ãï¼RAMã®ç¯ç´ã®è¦³ç¹ããã¯æã¾ãã 297 * ãï¼å®è¡å¹çãæªããªãããã«æ¡ç¨ãã¦ããªãï¼ä»ã®ãªãã¸ã§ã¯ãã«ã¤ã 298 * ã¦ãåæ§ã«æ±ãï¼ 299 * 300 * ã¿ã¹ã¯åæåãããã¯ã«ã¯ï¼DEF_TEXã§å®ç¾©ãããã¿ã¹ã¯ä¾å¤å¦çã«ã¼ã 301 * ã³ã«é¢ããæ 302 å ±ãå«ãï¼ 170 * タスク初期化ブロック 171 * 172 * タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク 173 * 初期化ブロック)と,値が変化するためにRAMに置かなければならない部 174 * 分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化 175 * ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する 176 * TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい 177 * が,実行効率が悪くなるために採用していない.他のオブジェクトについ 178 * ても同様に扱う. 179 * 180 * タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ 181 * ンに関する情報も含む. 303 182 */ 304 183 typedef struct task_initialization_block { 305 ATR tskatr; /* ã¿ã¹ã¯å±æ§ */ 306 intptr_t exinf; /* ã¿ã¹ã¯ã®æ¡å¼µæ 307 å ± */ 308 TASK task; /* ã¿ã¹ã¯ã®èµ·åçªå° */ 309 uint_t ipriority; /* ã¿ã¹ã¯ã®èµ·åæåªå 310 度ï¼å 311 é¨è¡¨ç¾ï¼ */ 184 ATR tskatr; /* タスク属性 */ 185 intptr_t exinf; /* タスクの拡張情報 */ 186 TASK task; /* タスクの起動番地 */ 187 uint_t ipriority; /* タスクの起動時優先度(内部表現) */ 312 188 313 189 #ifdef USE_TSKINICTXB 314 TSKINICTXB tskinictxb; /* ã¿ã¹ã¯åæåã³ã³ããã¹ããããã¯*/190 TSKINICTXB tskinictxb; /* タスク初期化コンテキストブロック */ 315 191 #else /* USE_TSKINICTXB */ 316 SIZE stksz; /* ã¹ã¿ãã¯é åã®ãµã¤ãºï¼ä¸¸ããå¤ï¼ */ 317 void *stk; /* ã¹ã¿ãã¯é åã®å 318 é çªå° */ 192 SIZE stksz; /* スタック領域のサイズ(丸めた値) */ 193 void *stk; /* スタック領域の先頭番地 */ 319 194 #endif /* USE_TSKINICTXB */ 320 195 321 ATR texatr; /* ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³å±æ§*/322 TEXRTN texrtn; /* ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã®èµ·åçªå°*/196 ATR texatr; /* タスク例外処理ルーチン属性 */ 197 TEXRTN texrtn; /* タスク例外処理ルーチンの起動番地 */ 323 198 } TINIB; 324 199 325 200 /* 326 * TCBä¸ã®ãã£ã¼ã«ãã®ãããå¹ 327 ã®å®ç¾© 328 * 329 * ããã»ããµã«ãã£ã¦ã¯ï¼TCBä¸ã®ãã£ã¼ã«ãã®ãããå¹ 330 ã§ã¡ã¢ãªä½¿ç¨é㨠331 * æ§è½ããã¬ã¼ããªãã«ãªãããï¼ã¿ã¼ã²ããä¾åã«ãã£ã¼ã«ãã®ãããå¹ 332 333 * ãå¤æ´ãããã¨ã許ãã¦ããï¼ 201 * TCB中のフィールドのビット幅の定義 202 * 203 * プロセッサによっては,TCB中のフィールドのビット幅でメモリ使用量と 204 * 性能がトレードオフになるため,ターゲット依存にフィールドのビット幅 205 * を変更することを許している. 334 206 */ 335 207 #ifndef TBIT_TCB_PRIORITY 336 #define TBIT_TCB_PRIORITY 8 /* priorityãã£ã¼ã«ãã®ãããå¹ 337 */ 208 #define TBIT_TCB_PRIORITY 8 /* priorityフィールドのビット幅 */ 338 209 #endif /* TBIT_TCB_PRIORITY */ 339 210 340 211 /* 341 * ã¿ã¹ã¯ç®¡çãããã¯ï¼TCBï¼ 342 * 343 * ASPã«ã¼ãã«ã§ã¯ï¼ã¿ã¹ã¯ã®èµ·åè¦æ±ãã¥ã¼ã¤ã³ã°æ°ã®æ大å¤ï¼TMAX_ACTCNTï¼ 344 * ã¨èµ·åºè¦æ±ãã¥ã¼ã¤ã³ã°æ°ã®æ大å¤ï¼TMAX_WUPCNTï¼ã¯1ã«åºå®ããã¦ãã 345 * ããï¼ãã¥ã¼ã¤ã³ã°ããã¦ãããã©ããã®çå½å¤ã§è¡¨ç¾ãããã¨ãã§ããï¼ 346 * ã¾ãï¼å¼·å¶å¾ 347 ã¡è¦æ±ãã¹ãæ°ã®æ大å¤ï¼TMAX_SUSCNTï¼ã1ã«åºå®ããã¦ã 348 * ãã®ã§ï¼å¼·å¶å¾ 349 ã¡è¦æ±ãã¹ãæ°ï¼suscntï¼ã¯å¿ 350 è¦ãªãï¼ 351 * 352 * TCBã®ããã¤ãã®ãã£ã¼ã«ãã¯ï¼ç¹å®ã®ã¿ã¹ã¯ç¶æ 353 ã§ã®ã¿æå¹ãªå¤ãä¿æãï¼ 354 * ãã以å¤ã®å ´åã¯å¤ãä¿è¨¼ãããªãï¼ãã£ã¦ï¼åç 355 §ãã¦ã¯ãªããªãï¼ï¼å 356 * ãã£ã¼ã«ããæå¹ãªå¤ãä¿æããæ¡ä»¶ã¯æ¬¡ã®éãï¼ 357 * 358 * ã»åæåå¾ã¯å¸¸ã«æå¹ï¼ 359 * p_tinibï¼tstatï¼actque 360 * ã»ä¼æ¢ç¶æ 361 以å¤ã§æå¹ï¼ä¼æ¢ç¶æ 362 ã§ã¯åæå¤ã«ãªã£ã¦ããï¼ï¼ 363 * priorityï¼wupqueï¼enatexï¼texptn 364 * ã»å¾ 365 ã¡ç¶æ 366 ï¼äºéå¾ 367 ã¡ç¶æ 368 ãå«ãï¼ã§æå¹ï¼ 212 * タスク管理ブロック(TCB) 213 * 214 * ASPカーネルでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT) 215 * と起床要求キューイング数の最大値(TMAX_WUPCNT)は1に固定されている 216 * ため,キューイングされているかどうかの真偽値で表現することができる. 217 * また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が1に固定されてい 218 * るので,強制待ち要求ネスト数(suscnt)は必要ない. 219 * 220 * TCBのいくつかのフィールドは,特定のタスク状態でのみ有効な値を保持し, 221 * それ以外の場合は値が保証されない(よって,参照してはならない).各 222 * フィールドが有効な値を保持する条件は次の通り. 223 * 224 * ・初期化後は常に有効: 225 * p_tinib,tstat,actque 226 * ・休止状態以外で有効(休止状態では初期値になっている): 227 * priority,wupque,enatex,texptn 228 * ・待ち状態(二重待ち状態を含む)で有効: 369 229 * p_winfo 370 * ã»å®è¡ã§ããç¶æ 371 ã¨åæã»éä¿¡ãªãã¸ã§ã¯ãã«å¯¾ããå¾ 372 ã¡ç¶æ 373 ã§æå¹ï¼ 230 * ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効: 374 231 * task_queue 375 * ã»å®è¡å¯è½ç¶æ 376 ï¼å¾ 377 ã¡ç¶æ 378 ï¼å¼·å¶å¾ 379 ã¡ç¶æ 380 ï¼äºéå¾ 381 ã¡ç¶æ 382 ã§æå¹ï¼ 232 * ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効: 383 233 * tskctxb 384 234 */ 385 235 typedef struct task_control_block { 386 QUEUE task_queue; /* ã¿ã¹ã¯ãã¥ã¼*/387 const TINIB *p_tinib; /* åæåãããã¯ã¸ã®ãã¤ã³ã¿*/236 QUEUE task_queue; /* タスクキュー */ 237 const TINIB *p_tinib; /* 初期化ブロックへのポインタ */ 388 238 389 239 #ifdef UINT8_MAX 390 uint8_t tstat; /* ã¿ã¹ã¯ç¶æ 391 ï¼å 392 é¨è¡¨ç¾ï¼*/ 240 uint8_t tstat; /* タスク状態(内部表現)*/ 393 241 #else /* UINT8_MAX */ 394 BIT_FIELD_UINT tstat : 8; /* ã¿ã¹ã¯ç¶æ 395 ï¼å 396 é¨è¡¨ç¾ï¼*/ 242 BIT_FIELD_UINT tstat : 8; /* タスク状態(内部表現)*/ 397 243 #endif /* UINT8_MAX */ 398 244 #if defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) 399 uint8_t priority; /* ç¾å¨ã®åªå 400 度ï¼å 401 é¨è¡¨ç¾ï¼*/ 245 uint8_t priority; /* 現在の優先度(内部表現)*/ 402 246 #else /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */ 403 247 BIT_FIELD_UINT priority : TBIT_TCB_PRIORITY; 404 /* ç¾å¨ã®åªå 405 度ï¼å 406 é¨è¡¨ç¾ï¼*/ 248 /* 現在の優先度(内部表現)*/ 407 249 #endif /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */ 408 BIT_FIELD_BOOL actque : 1; /* èµ·åè¦æ±ãã¥ã¼ã¤ã³ã° */ 409 BIT_FIELD_BOOL wupque : 1; /* èµ·åºè¦æ±ãã¥ã¼ã¤ã³ã° */ 410 BIT_FIELD_BOOL enatex : 1; /* ã¿ã¹ã¯ä¾å¤å¦ç許å¯ç¶æ 411 */ 412 413 TEXPTN texptn; /* ä¿çä¾å¤è¦å */ 414 WINFO *p_winfo; /* å¾ 415 ã¡æ 416 å ±ãããã¯ã¸ã®ãã¤ã³ã¿ */ 417 TSKCTXB tskctxb; /* ã¿ã¹ã¯ã³ã³ããã¹ãããã㯠*/ 250 BIT_FIELD_BOOL actque : 1; /* 起動要求キューイング */ 251 BIT_FIELD_BOOL wupque : 1; /* 起床要求キューイング */ 252 BIT_FIELD_BOOL enatex : 1; /* タスク例外処理許可状態 */ 253 254 TEXPTN texptn; /* 保留例外要因 */ 255 WINFO *p_winfo; /* 待ち情報ブロックへのポインタ */ 256 TSKCTXB tskctxb; /* タスクコンテキストブロック */ 418 257 } TCB; 419 258 420 259 /* 421 * å®è¡ç¶æ 422 ã®ã¿ã¹ã¯ 423 * 424 * å®è¡ç¶æ 425 ã®ã¿ã¹ã¯ï¼ï¼ããã»ããµãã³ã³ããã¹ããæã£ã¦ããã¿ã¹ã¯ï¼ã® 426 * TCBãæããã¤ã³ã¿ï¼å®è¡ç¶æ 427 ã®ã¿ã¹ã¯ããªãå ´åã¯NULLã«ããï¼ 428 * 429 * ãµã¼ãã¹ã³ã¼ã«ã®å¦çä¸ã§ï¼èªã¿ã¹ã¯ï¼ãµã¼ãã¹ã³ã¼ã«ãå¼ã³åºããã¿ã¹ 430 * ã¯ï¼ã«é¢ããæ 431 å ±ãåç 432 §ããå ´åã¯p_runtskã使ãï¼p_runtskãæ¸ãæã 433 * ãã®ã¯ï¼ãã£ã¹ãããã£ï¼ã¨åæåå¦çï¼ã®ã¿ã§ããï¼ 260 * 実行状態のタスク 261 * 262 * 実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の 263 * TCBを指すポインタ.実行状態のタスクがない場合はNULLにする. 264 * 265 * サービスコールの処理中で,自タスク(サービスコールを呼び出したタス 266 * ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え 267 * るのは,ディスパッチャ(と初期化処理)のみである. 434 268 */ 435 269 extern TCB *p_runtsk; 436 270 437 271 /* 438 * æé«åªå 439 é ä½ã®ã¿ã¹ã¯ 440 * 441 * å®è¡ã§ããã¿ã¹ã¯ã®ä¸ã§æé«åªå 442 é ä½ã®ã¿ã¹ã¯ã®TCBãæããã¤ã³ã¿ï¼å® 443 * è¡ã§ããã¿ã¹ã¯ããªãå ´åã¯NULLã«ããï¼ 444 * 445 * ãã£ã¹ãããç¦æ¢ç¶æ 446 ãªã©ï¼ãã£ã¹ããããä¿çããã¦ããéã¯p_runtsk 447 * ã¨ä¸è´ãã¦ããã¨ã¯éããªãï¼ 272 * 最高優先順位のタスク 273 * 274 * 実行できるタスクの中で最高優先順位のタスクのTCBを指すポインタ.実 275 * 行できるタスクがない場合はNULLにする. 276 * 277 * ディスパッチ禁止状態など,ディスパッチが保留されている間はp_runtsk 278 * と一致しているとは限らない. 448 279 */ 449 280 extern TCB *p_schedtsk; 450 281 451 282 /* 452 * ãã£ã¹ãããï¼ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³èµ·åè¦æ±ãã©ã°453 * 454 * å²è¾¼ã¿ãã³ãã©ï¼CPUä¾å¤ãã³ãã©ã®åºå£å¦çã«ï¼ãã£ã¹ãããã¾ãã¯455 * ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã®èµ·åãè¦æ±ãããã¨ã示ããã©ã°ï¼283 * ディスパッチ/タスク例外処理ルーチン起動要求フラグ 284 * 285 * 割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは 286 * タスク例外処理ルーチンの起動を要求することを示すフラグ. 456 287 */ 457 288 extern bool_t reqflg; 458 289 459 290 /* 460 * å²è¾¼ã¿åªå 461 度ãã¹ã¯å 462 ¨è§£é¤ç¶æ 463 464 * 465 * å²è¾¼ã¿åªå 466 度ãã¹ã¯å 467 ¨è§£é¤ç¶æ 468 ã§ãããã¨ã示ããã©ã°ï¼ 291 * 割込み優先度マスク全解除状態 292 * 293 * 割込み優先度マスク全解除状態であることを示すフラグ. 469 294 */ 470 295 extern bool_t ipmflg; 471 296 472 297 /* 473 * ãã£ã¹ãããç¦æ¢ç¶æ 474 475 * 476 * ãã£ã¹ãããç¦æ¢ç¶æ 477 ã§ãããã¨ã示ããã©ã°ï¼ 298 * ディスパッチ禁止状態 299 * 300 * ディスパッチ禁止状態であることを示すフラグ. 478 301 */ 479 302 extern bool_t disdsp; 480 303 481 304 /* 482 * ã¿ã¹ã¯ãã£ã¹ãããå¯è½ç¶æ 483 484 * 485 * å²è¾¼ã¿åªå 486 度ãã¹ã¯å 487 ¨è§£é¤ç¶æ 488 ã§ããï¼ãã£ã¹ããã許å¯ç¶æ 489 ã§ããï¼ã㣠490 * ã¹ãããç¦æ¢ç¶æ 491 ã§ãªãï¼ãã¨ã示ããã©ã°ï¼ 305 * タスクディスパッチ可能状態 306 * 307 * 割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ 308 * スパッチ禁止状態でない)ことを示すフラグ. 492 309 */ 493 310 extern bool_t dspflg; 494 311 495 312 /* 496 * ã¬ãã£ãã¥ã¼ 497 * 498 * ã¬ãã£ãã¥ã¼ã¯ï¼å®è¡ã§ããç¶æ 499 ã®ã¿ã¹ã¯ã管çããããã®ãã¥ã¼ã§ããï¼ 500 * å®è¡ç¶æ 501 ã®ã¿ã¹ã¯ã管çãã¦ããããï¼ã¬ãã£ï¼å®è¡å¯è½ï¼ãã¥ã¼ã¨ãã 502 * å称ã¯æ£ç¢ºã§ã¯ãªããï¼ã¬ãã£ãã¥ã¼ã¨ããå称ãå®çãã¦ããããï¼ã 503 * ã®å称ã§å¼ã¶ãã¨ã«ããï¼ 504 * 505 * ã¬ãã£ãã¥ã¼ã¯ï¼åªå 506 度ãã¨ã®ã¿ã¹ã¯ãã¥ã¼ã§æ§æããã¦ããï¼ã¿ã¹ã¯ã® 507 * TCBã¯ï¼è©²å½ããåªå 508 度ã®ãã¥ã¼ã«ç»é²ãããï¼ 313 * レディキュー 314 * 315 * レディキューは,実行できる状態のタスクを管理するためのキューである. 316 * 実行状態のタスクも管理しているため,レディ(実行可能)キューという 317 * 名称は正確ではないが,レディキューという名称が定着しているため,こ 318 * の名称で呼ぶことにする. 319 * 320 * レディキューは,優先度ごとのタスクキューで構成されている.タスクの 321 * TCBは,該当する優先度のキューに登録される. 509 322 */ 510 323 extern QUEUE ready_queue[TNUM_TPRI]; 511 324 512 325 /* 513 * ã¬ãã£ãã¥ã¼ãµã¼ãã®ããã®ãããããã 514 * 515 * ã¬ãã£ãã¥ã¼ã®ãµã¼ããå¹çããè¡ãããã«ï¼åªå 516 度ãã¨ã®ã¿ã¹ã¯ãã¥ã¼ 517 * ã«ã¿ã¹ã¯ãå 518 ¥ã£ã¦ãããã©ããã示ããããããããç¨æãã¦ããï¼ãã 519 * ããããã使ããã¨ã§ï¼ã¡ã¢ãªã¢ã¯ã»ã¹ã®åæ°ãæ¸ãããã¨ãã§ãããï¼ 520 * ãããæä½å½ä»¤ãå 521 522 å®ãã¦ããªãããã»ããµã§ï¼åªå 523 度ã®æ®µéæ°ãå°ãªã 524 * å ´åã«ã¯ï¼ããããããæä½ã®ãªã¼ãã¼ãããã®ããã«ï¼éã«å¹çãè½ã¡ 525 * ãå¯è½æ§ãããï¼ 526 * 527 * åªå 528 度ã16段éã§ãããã¨ãä»®å®ãã¦ããããï¼uint16_tåã¨ãã¦ããï¼ 326 * レディキューサーチのためのビットマップ 327 * 328 * レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー 329 * にタスクが入っているかどうかを示すビットマップを用意している.ビッ 330 * トマップを使うことで,メモリアクセスの回数を減らすことができるが, 331 * ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない 332 * 場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち 333 * る可能性もある. 334 * 335 * 優先度が16段階であることを仮定しているため,uint16_t型としている. 529 336 */ 530 337 extern uint16_t ready_primap; 531 338 532 339 /* 533 * 使ç¨ãã¦ããªãTCBã®ãªã¹ã340 * 使用していないTCBのリスト 534 341 */ 535 342 extern QUEUE free_tcb; 536 343 537 344 /* 538 * ã¿ã¹ã¯IDã®æ大å¤ï¼kernel_cfg.cï¼345 * タスクIDの最大値(kernel_cfg.c) 539 346 */ 540 347 extern const ID tmax_tskid; … … 542 349 543 350 /* 544 * ã¿ã¹ã¯åæåãããã¯ã®ã¨ãªã¢ï¼kernel_cfg.cï¼351 * タスク初期化ブロックのエリア(kernel_cfg.c) 545 352 */ 546 353 extern const TINIB tinib_table[]; … … 548 355 549 356 /* 550 * ã¿ã¹ã¯çæé åºãã¼ãã«ï¼kernel_cfg.cï¼357 * タスク生成順序テーブル(kernel_cfg.c) 551 358 */ 552 359 extern const ID torder_table[]; 553 360 554 361 /* 555 * TCB ã®ã¨ãªã¢ï¼kernel_cfg.cï¼362 * TCBのエリア(kernel_cfg.c) 556 363 */ 557 364 extern TCB tcb_table[]; 558 365 559 366 /* 560 * ã¿ã¹ã¯ã®æ°367 * タスクの数 561 368 */ 562 369 #define tnum_tsk ((uint_t)(tmax_tskid - TMIN_TSKID + 1)) … … 564 371 565 372 /* 566 * ã¿ã¹ã¯IDããTCBãåãåºãããã®ãã¯ã373 * タスクIDからTCBを取り出すためのマクロ 567 374 */ 568 375 #define INDEX_TSK(tskid) ((uint_t)((tskid) - TMIN_TSKID)) … … 571 378 572 379 /* 573 * TCB ããã¿ã¹ã¯IDãåãåºãããã®ãã¯ã380 * TCBからタスクIDを取り出すためのマクロ 574 381 */ 575 382 #define TSKID(p_tcb) ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID)) 576 383 577 384 /* 578 * ã¿ã¹ã¯ç®¡çã¢ã¸ã¥ã¼ã«ã®åæå385 * タスク管理モジュールの初期化 579 386 */ 580 387 extern void initialize_task(void); 581 388 582 389 /* 583 * æé«åªå 584 é ä½ã¿ã¹ã¯ã®ãµã¼ã 585 * 586 * ã¬ãã£ãã¥ã¼ä¸ã®æé«åªå 587 é ä½ã®ã¿ã¹ã¯ããµã¼ããï¼ãã®TCBã¸ã®ãã¤ã³ã¿ 588 * ãè¿ãï¼ã¬ãã£ãã¥ã¼ã空ã®å ´åã«ã¯ï¼ãã®é¢æ°ãå¼ã³åºãã¦ã¯ãªããªãï¼ 390 * 最高優先順位タスクのサーチ 391 * 392 * レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ 393 * を返す.レディキューが空の場合には,この関数を呼び出してはならない. 589 394 */ 590 395 extern TCB *search_schedtsk(void); 591 396 592 397 /* 593 * å®è¡ã§ããç¶æ 594 ã¸ã®é·ç§» 595 * 596 * p_tcbã§æå®ãããã¿ã¹ã¯ãã¬ãã£ãã¥ã¼ã«æ¿å 597 ¥ããï¼ã¬ãã£ãã¥ã¼ã«æ¿å 598 ¥ 599 * ããã¿ã¹ã¯ã®åªå 600 度ãï¼æé«åªå 601 é ä½ã®ã¿ã¹ã¯ã®åªå 602 度ãããé«ãå ´åã¯ï¼ 603 * æé«åªå 604 é ä½ã®ã¿ã¹ã¯ãæ´æ°ãï¼ãã£ã¹ããã許å¯ç¶æ 605 ã§ããã°trueãè¿ 606 * ãï¼ããã§ãªãå ´åã¯falseãè¿ãï¼ 398 * 実行できる状態への遷移 399 * 400 * p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入 401 * したタスクの優先度が,最高優先順位のタスクの優先度よりも高い場合は, 402 * 最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを返 403 * す.そうでない場合はfalseを返す. 607 404 */ 608 405 extern bool_t make_runnable(TCB *p_tcb); 609 406 610 407 /* 611 * å®è¡ã§ããç¶æ 612 ããä»ã®ç¶æ 613 ã¸ã®é·ç§» 614 * 615 * p_tcbã§æå®ãããã¿ã¹ã¯ãã¬ãã£ãã¥ã¼ããåé¤ããï¼p_tcbã§æå®ãã 616 * ã¿ã¹ã¯ãæé«åªå 617 é ä½ã®ã¿ã¹ã¯ã§ãã£ãå ´åã«ã¯ï¼æé«åªå 618 é ä½ã®ã¿ã¹ã¯ 619 * ãè¨å®ããªããï¼ãã£ã¹ããã許å¯ç¶æ 620 ã§ããã°trueãè¿ãï¼ããã§ãªã 621 * å ´åã¯falseãè¿ãï¼ã¿ã¹ã¯ã®ç¶æ 622 ã¯æ´æ°ããªãï¼ 408 * 実行できる状態から他の状態への遷移 409 * 410 * p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した 411 * タスクが最高優先順位のタスクであった場合には,最高優先順位のタスク 412 * を設定しなおし,ディスパッチ許可状態であればtrueを返す.そうでない 413 * 場合はfalseを返す.タスクの状態は更新しない. 623 414 */ 624 415 extern bool_t make_non_runnable(TCB *p_tcb); 625 416 626 417 /* 627 * ä¼æ¢ç¶æ 628 ã¸ã®é·ç§» 629 * 630 * p_tcbã§æå®ãããã¿ã¹ã¯ã®ç¶æ 631 ãä¼æ¢ç¶æ 632 ã¨ããï¼ã¾ãï¼ã¿ã¹ã¯ã®èµ·å 633 * æã«åæåãã¹ãå¤æ°ã®åæåã¨ï¼ã¿ã¹ã¯èµ·åã®ããã®ã³ã³ããã¹ããè¨ 634 * å®ããï¼ 418 * 休止状態への遷移 419 * 420 * p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動 421 * 時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設 422 * 定する. 635 423 */ 636 424 extern void make_dormant(TCB *p_tcb); 637 425 638 426 /* 639 * ä¼æ¢ç¶æ 640 ããå®è¡ã§ããç¶æ 641 ã¸ã®é·ç§» 642 * 643 * p_tcbã§æå®ãããã¿ã¹ã¯ã®ç¶æ 644 ãä¼æ¢ç¶æ 645 ããå®è¡ã§ããç¶æ 646 ã¨ããï¼ 647 * å®è¡ã§ããç¶æ 648 ã«é·ç§»ããã¿ã¹ã¯ã¸ã®ãã£ã¹ããããå¿ 649 è¦ãªå ´åã¯trueï¼ 650 * ããã§ãªãå ´åã¯falseãè¿ãï¼ 427 * 休止状態から実行できる状態への遷移 428 * 429 * p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする. 430 * 実行できる状態に遷移したタスクへのディスパッチが必要な場合はtrue, 431 * そうでない場合はfalseを返す. 651 432 */ 652 433 extern bool_t make_active(TCB *p_tcb); 653 434 654 435 /* 655 * ã¿ã¹ã¯ã®åªå 656 度ã®å¤æ´ 657 * 658 * p_tcbã§æå®ãããã¿ã¹ã¯ã®åªå 659 度ãnewpriï¼å 660 é¨è¡¨ç¾ï¼ã«å¤æ´ããï¼ã¾ãï¼ 661 * å¿ 662 è¦ãªå ´åã«ã¯æé«åªå 663 é ä½ã®ã¿ã¹ã¯ãæ´æ°ãï¼ãã£ã¹ããã許å¯ç¶æ 664 㧠665 * ããã°trueãè¿ãï¼ããã§ãªãå ´åã¯falseãè¿ãï¼ 436 * タスクの優先度の変更 437 * 438 * p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また, 439 * 必要な場合には最高優先順位のタスクを更新し,ディスパッチ許可状態で 440 * あればtrueを返す.そうでない場合はfalseを返す. 666 441 */ 667 442 extern bool_t change_priority(TCB *p_tcb, uint_t newpri); 668 443 669 444 /* 670 * ã¬ãã£ãã¥ã¼ã®å転 671 * 672 * ã¬ãã£ãã¥ã¼ä¸ã®ï¼priã§æå®ãããåªå 673 度ã®ã¿ã¹ã¯ãã¥ã¼ãå転ãããï¼ 674 * ã¾ãï¼å¿ 675 è¦ãªå ´åã«ã¯æé«åªå 676 é ä½ã®ã¿ã¹ã¯ãå¤æ´ãï¼ãã£ã¹ããããä¿ 677 * çããã¦ããªããã°trueãè¿ãï¼ããã§ãªãå ´åã¯falseãè¿ãï¼ 445 * レディキューの回転 446 * 447 * レディキュー中の,priで指定される優先度のタスクキューを回転させる. 448 * また,必要な場合には最高優先順位のタスクを変更し,ディスパッチが保 449 * 留されていなければtrueを返す.そうでない場合はfalseを返す. 678 450 */ 679 451 extern bool_t rotate_ready_queue(uint_t pri); 680 452 681 453 /* 682 * ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã®å¼åºã 683 * 684 * ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ãå¼ã³åºãï¼å¼ã³åºãåã«ï¼å®è¡ç¶æ 685 ã®ã¿ã¹ã¯ã® 686 * ä¿çä¾å¤è¦å ãã¯ãªã¢ãï¼ã¿ã¹ã¯ä¾å¤å¦çç¦æ¢ç¶æ 687 ã«ãï¼CPUããã¯ã解 688 * é¤ããï¼ 689 * 690 * ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ããæ»ãã¨ï¼ã¾ãCPUããã¯ç¶æ 691 ã«æ»ãï¼ãã®é 692 * ã«ä¿çä¾å¤è¦å ã0ã§ãªããªã£ã¦ããã°ï¼åã³ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã 693 * å¼ã³åºãï¼ä¿çä¾å¤è¦å ã0ã®å ´åã«ã¯ï¼ä¾å¤å¦ç許å¯ç¶æ 694 ã«ãã¦é¢æ°ã 695 * ããªã¿ã¼ã³ããï¼ 696 * 697 * ãã®é¢æ°ã¯ï¼å®è¡ç¶æ 698 ã®ã¿ã¹ã¯ãï¼ã¿ã¹ã¯ä¾å¤å¦ç許å¯ç¶æ 699 ï¼enatexã 700 * trueï¼ã§ï¼ä¿çä¾å¤è¦å ã0ã§ãªãï¼texptnã0ã§ãªãï¼å ´åã«å¼ã³åºãã 701 * ã¨ãæ³å®ãã¦ããï¼ãã®é¢æ°ã¯ï¼CPUããã¯ç¶æ 702 ã§å¼ã³åºããªããã°ãªã 703 * ãªãï¼ 454 * タスク例外処理ルーチンの呼出し 455 * 456 * タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの 457 * 保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解 458 * 除する. 459 * 460 * タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間 461 * に保留例外要因が0でなくなっていれば,再びタスク例外処理ルーチンを 462 * 呼び出す.保留例外要因が0の場合には,例外処理許可状態にして関数か 463 * らリターンする. 464 * 465 * この関数は,実行状態のタスクが,タスク例外処理許可状態(enatexが 466 * true)で,保留例外要因が0でない(texptnが0でない)場合に呼び出すこ 467 * とを想定している.この関数は,CPUロック状態で呼び出さなければなら 468 * ない. 704 469 */ 705 470 extern void call_texrtn(void); 706 471 707 472 /* 708 * ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã®èµ·å 709 * 710 * å®è¡ç¶æ 711 ã®ã¿ã¹ã¯ãã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã®èµ·åæ¡ä»¶ãæºããã¦ããã°ï¼ 712 * ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ãå¼ã³åºãï¼CPUä¾å¤å¦çã«ã¼ãã³ãå¼ã³åºãæ 713 * ã¯ï¼ä¸æçã«CPUããã¯ã解é¤ããï¼ 714 * 715 * ãã®é¢æ°ã¯ï¼ãã£ã¹ãããã£ãå²è¾¼ã¿ãã³ãã©ï¼CPUä¾å¤ãã³ãã©ã®åºå£ 716 * å¦çããå¼ã³åºããããã¨ãæ³å®ãã¦ããï¼ãã®é¢æ°ã¯ï¼CPUããã¯ç¶æ 717 718 * ã§å¼ã³åºããªããã°ãªããªãï¼ 719 * 720 * å®è¡å¹çãä¸ããããã«ï¼ãã®é¢æ°ãã¿ã¼ã²ããä¾åé¨ã§è¨è¿°ãã¦ãããï¼ 721 * ãã®å ´åã«ã¯ï¼OMIT_CALLTEXããã¯ãå®ç¾©ããï¼ 473 * タスク例外処理ルーチンの起動 474 * 475 * 実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば, 476 * タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時 477 * は,一時的にCPUロックを解除する. 478 * 479 * この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口 480 * 処理から呼び出されることを想定している.この関数は,CPUロック状態 481 * で呼び出さなければならない. 482 * 483 * 実行効率を上げるために,この関数をターゲット依存部で記述してもよい. 484 * その場合には,OMIT_CALLTEXをマクロ定義する. 722 485 */ 723 486 extern void calltex(void); -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.