Changeset 389 for azure_iot_hub/trunk/asp3_dcre/kernel/task.h
- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/kernel/task.h
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-chdr
totext/x-chdr;charset=UTF-8
r388 r389 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 … … 68 53 69 54 /* 70 * ãã¬ã¼ã¹ãã°ãã¯ãã®ããã©ã«ãå®ç¾©55 * トレースログマクロのデフォルト定義 71 56 */ 72 57 #ifndef LOG_TSKSTAT … … 75 60 76 61 /* 77 * ã¿ã¹ã¯åªå 78 度ã®å 79 é¨è¡¨ç¾ã»å¤é¨è¡¨ç¾å¤æãã¯ã 62 * タスク優先度の内部表現・外部表現変換マクロ 80 63 */ 81 64 #define INT_PRIORITY(x) ((uint_t)((x) - TMIN_TPRI)) … … 83 66 84 67 /* 85 * ã¿ã¹ã¯ç¶æ 86 ã®å 87 é¨è¡¨ç¾ 88 * 89 * TCBä¸ã®ã¿ã¹ã¯ç¶æ 90 ã®ãã£ã¼ã«ãã§ã¯ï¼ã¿ã¹ã¯ã®ç¶æ 91 ã¨ï¼ã¿ã¹ã¯ãå¾ 92 ã¡ç¶æ 93 94 * ã®æã®å¾ 95 ã¡è¦å ã表ãï¼ãã ãï¼å®è¡ç¶æ 96 ï¼RUNNINGï¼ã¨å®è¡å¯è½ç¶æ 97 98 * ï¼READYï¼ã¯åºå¥ããï¼ä¸¡ç¶æ 99 ããããã¦å®è¡ã§ããç¶æ 100 ï¼RUNNABLEï¼ã¨ã 101 * ã¦ç®¡çããï¼äºéå¾ 102 ã¡ç¶æ 103 ã¯ï¼(TS_WAITING_??? | TS_SUSPENDED)ã§è¡¨ãï¼ 104 * 105 * ã¿ã¹ã¯ãå¾ 106 ã¡ç¶æ 107 ï¼äºéå¾ 108 ã¡ç¶æ 109 ãå«ãï¼ã®æã¯ï¼TS_WAITING_???ã§å¾ 110 ã¡ 111 * è¦å ã表ãï¼å¾ 112 ã¡è¦å ï¼5ãããã§è¡¨ç¾ãããï¼ã®ä¸ä½2ãããã§ï¼åæã» 113 * éä¿¡ãªãã¸ã§ã¯ãã®å¾ 114 ã¡ãã¥ã¼ã«ã¤ãªãã£ã¦ãããã©ããã表ãï¼åæã» 115 * éä¿¡ãªãã¸ã§ã¯ãã®å¾ 116 ã¡ãã¥ã¼ã«ã¤ãªãããªããã®ã¯ä¸ä½2ãããã00ï¼å 117 * æã»éä¿¡ãªãã¸ã§ã¯ãã®ç®¡çãããã¯ã®å 118 ±éé¨åï¼WOBJCBï¼ã®å¾ 119 ã¡ãã¥ã¼ 120 * ã«ã¤ãªãããã®ã¯10ã¾ãã¯11ï¼ãã以å¤ã®å¾ 121 ã¡ãã¥ã¼ã«ã¤ãªãããã®ã¯01 122 * ã¨ããï¼ 123 */ 124 #define TS_DORMANT 0x00U /* ä¼æ¢ç¶æ 125 */ 126 #define TS_RUNNABLE 0x01U /* å®è¡ã§ããç¶æ 127 */ 128 #define TS_SUSPENDED 0x02U /* å¼·å¶å¾ 129 ã¡ç¶æ 130 */ 131 132 #define TS_WAITING_SLP (0x01U << 2) /* èµ·åºå¾ 133 ã¡ */ 134 #define TS_WAITING_DLY (0x02U << 2) /* æéçµéå¾ 135 ã¡ */ 136 #define TS_WAITING_RDTQ (0x08U << 2) /* ãã¼ã¿ãã¥ã¼ããã®åä¿¡å¾ 137 ã¡ */ 138 #define TS_WAITING_RPDQ (0x09U << 2) /* åªå 139 度ãã¼ã¿ãã¥ã¼ããã®åä¿¡å¾ 140 ã¡ */ 141 #define TS_WAITING_SEM (0x10U << 2) /* ã»ããã©è³æºã®ç²å¾å¾ 142 ã¡ */ 143 #define TS_WAITING_FLG (0x11U << 2) /* ã¤ãã³ããã©ã°å¾ 144 ã¡ */ 145 #define TS_WAITING_SDTQ (0x12U << 2) /* ãã¼ã¿ãã¥ã¼ã¸ã®éä¿¡å¾ 146 ã¡ */ 147 #define TS_WAITING_SPDQ (0x13U << 2) /* åªå 148 度ãã¼ã¿ãã¥ã¼ã¸ã®éä¿¡å¾ 149 ã¡ */ 150 #define TS_WAITING_MTX (0x14U << 2) /* ãã¥ã¼ããã¯ã¹ã®ããã¯å¾ 151 ã¡ */ 152 #define TS_WAITING_MPF (0x15U << 2) /* åºå®é·ã¡ã¢ãªãããã¯ã®ç²å¾å¾ 153 ã¡ */ 154 155 #define TS_WAITING_MASK (0x1fU << 2) /* å¾ 156 ã¡ç¶æ 157 ã®å¤å¥ç¨ãã¹ã¯ */ 158 159 /* 160 * ã¿ã¹ã¯ç¶æ 161 å¤å¥ãã¯ã 162 * 163 * TSTAT_DORMANTã¯ã¿ã¹ã¯ãä¼æ¢ç¶æ 164 ã§ãããã©ãããï¼TSTAT_RUNNABLE㯠165 * ã¿ã¹ã¯ãå®è¡ã§ããç¶æ 166 ã§ãããã©ãããå¤å¥ããï¼TSTAT_WAITINGã¯å¾ 167 168 * ã¡ç¶æ 169 ã¨äºéå¾ 170 ã¡ç¶æ 171 ã®ããããã§ãããã©ãããï¼TSTAT_SUSPENDED㯠172 * å¼·å¶å¾ 173 ã¡ç¶æ 174 ã¨äºéå¾ 175 ã¡ç¶æ 176 ã®ããããã§ãããã©ãããå¤å¥ããï¼ 68 * タスク状態の内部表現 69 * 70 * TCB中のタスク状態のフィールドでは,タスクの状態と,タスクが待ち状態 71 * の時の待ち要因を表す.ただし,実行状態(RUNNING)と実行可能状態 72 * (READY)は区別せず,両状態をあわせて実行できる状態(RUNNABLE)とし 73 * て管理する.二重待ち状態は,(TS_WAITING_??? | TS_SUSPENDED)で表す. 74 * 75 * タスクが待ち状態(二重待ち状態を含む)の時は,TS_WAITING_???で待ち 76 * 要因を表す.待ち要因(5ビットで表現される)の上位2ビットで,同期・ 77 * 通信オブジェクトの待ちキューにつながっているかどうかを表す.同期・ 78 * 通信オブジェクトの待ちキューにつながらないものは上位2ビットを00,同 79 * 期・通信オブジェクトの管理ブロックの共通部分(WOBJCB)の待ちキュー 80 * につながるものは10または11,それ以外の待ちキューにつながるものは01 81 * とする. 82 */ 83 #define TS_DORMANT 0x00U /* 休止状態 */ 84 #define TS_RUNNABLE 0x01U /* 実行できる状態 */ 85 #define TS_SUSPENDED 0x02U /* 強制待ち状態 */ 86 87 #define TS_WAITING_SLP (0x01U << 2) /* 起床待ち */ 88 #define TS_WAITING_DLY (0x02U << 2) /* 時間経過待ち */ 89 #define TS_WAITING_RDTQ (0x08U << 2) /* データキューからの受信待ち */ 90 #define TS_WAITING_RPDQ (0x09U << 2) /* 優先度データキューからの受信待ち */ 91 #define TS_WAITING_SEM (0x10U << 2) /* セマフォ資源の獲得待ち */ 92 #define TS_WAITING_FLG (0x11U << 2) /* イベントフラグ待ち */ 93 #define TS_WAITING_SDTQ (0x12U << 2) /* データキューへの送信待ち */ 94 #define TS_WAITING_SPDQ (0x13U << 2) /* 優先度データキューへの送信待ち */ 95 #define TS_WAITING_MTX (0x14U << 2) /* ミューテックスのロック待ち */ 96 #define TS_WAITING_MPF (0x15U << 2) /* 固定長メモリブロックの獲得待ち */ 97 98 #define TS_WAITING_MASK (0x1fU << 2) /* 待ち状態の判別用マスク */ 99 100 /* 101 * タスク状態判別マクロ 102 * 103 * TSTAT_DORMANTはタスクが休止状態であるかどうかを,TSTAT_RUNNABLEは 104 * タスクが実行できる状態であるかどうかを判別する.TSTAT_WAITINGは待 105 * ち状態と二重待ち状態のいずれかであるかどうかを,TSTAT_SUSPENDEDは 106 * 強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する. 177 107 */ 178 108 #define TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT) … … 182 112 183 113 /* 184 * ã¿ã¹ã¯å¾ 185 ã¡è¦å å¤å¥ãã¯ã 186 * 187 * TSTAT_WAIT_SLPã¯ã¿ã¹ã¯ãèµ·åºå¾ 188 ã¡ã§ãããã©ãããï¼TSTAT_WAIT_MTX㯠189 * ã¿ã¹ã¯ããã¥ã¼ããã¯ã¹å¾ 190 ã¡ã§ãããã©ãããå¤å¥ããï¼ 191 * 192 * ã¾ãï¼TSTAT_WAIT_WOBJ ã¯ã¿ã¹ã¯ãåæã»éä¿¡ãªãã¸ã§ã¯ãã«å¯¾ããå¾ 193 ã¡ 194 * ã§ãããï¼è¨ãæããã¨ï¼åæã»éä¿¡ãªãã¸ã§ã¯ãã®å¾ 195 ã¡ãã¥ã¼ã«ã¤ãªã 196 * ãã¦ãããï¼ã©ãããï¼TSTAT_WAIT_WOBJCBã¯ã¿ã¹ã¯ãåæã»éä¿¡ãªãã¸ã§ 197 * ã¯ãã®ç®¡çãããã¯ã®å 198 ±éé¨åï¼WOBJCBï¼ã®å¾ 199 ã¡ãã¥ã¼ã«ã¤ãªããã¦ãã 200 * ãã©ãããå¤å¥ããï¼ 114 * タスク待ち要因判別マクロ 115 * 116 * TSTAT_WAIT_SLPはタスクが起床待ちであるかどうかを,TSTAT_WAIT_MTXは 117 * タスクがミューテックス待ちであるかどうかを判別する. 118 * 119 * また,TSTAT_WAIT_WOBJ はタスクが同期・通信オブジェクトに対する待ち 120 * であるか(言い換えると,同期・通信オブジェクトの待ちキューにつなが 121 * れているか)どうかを,TSTAT_WAIT_WOBJCBはタスクが同期・通信オブジェ 122 * クトの管理ブロックの共通部分(WOBJCB)の待ちキューにつながれている 123 * かどうかを判別する. 201 124 */ 202 125 #define TSTAT_WAIT_SLP(tstat) (((tstat) & ~TS_SUSPENDED) == TS_WAITING_SLP) … … 207 130 208 131 /* 209 * å¾ 210 ã¡æ 211 å ±ãããã¯ï¼WINFOï¼ã®å®ç¾© 212 * 213 * ã¿ã¹ã¯ãå¾ 214 ã¡ç¶æ 215 ã®éã¯ï¼TCBããã³ãã®p_winfoã§æãããWINFOã次㮠216 * ããã«è¨å®ããªããã°ãªããªãï¼ 217 * 218 * (a) TCBã®ã¿ã¹ã¯ç¶æ 219 ãå¾ 220 ã¡ç¶æ 221 ï¼TS_WAITING_???ï¼ã«ããï¼ 222 * 223 * (b) ã¿ã¤ã ã¢ã¦ããç£è¦ããããã«ï¼ã¿ã¤ã ã¤ãã³ããããã¯ãç»é²ããï¼ 224 * ç»é²ããã¿ã¤ã ã¤ãã³ããããã¯ã¯ï¼å¾ 225 ã¡ã«å 226 ¥ããµã¼ãã¹ã³ã¼ã«å¦çé¢æ° 227 * ã®ãã¼ã«ã«å¤æ°ã¨ãã¦ç¢ºä¿ãï¼ããã¸ã®ãã¤ã³ã¿ãWINFOã®p_tmevtbã«è¨ 228 * æ¶ããï¼ã¿ã¤ã ã¢ã¦ãã®ç£è¦ãå¿ 229 è¦ãªãå ´åï¼æ°¸ä¹ 230 å¾ 231 ã¡ã®å ´åï¼ã«ã¯ï¼ 232 * p_tmevtbãNULLã«ããï¼ 233 * 234 * åæã»éä¿¡ãªãã¸ã§ã¯ãã«å¯¾ããå¾ 235 ã¡ç¶æ 236 ã®å ´åã«ã¯ï¼æ¨æºã®WINFOã« 237 * p_wobjcbãã£ã¼ã«ãã追å ããæ§é ä½ï¼WINFO_WOBJï¼wait.hã§å®ç¾©ï¼ã«ï¼ 238 * å¾ 239 ã¡å¯¾è±¡ã®åæã»éä¿¡ãªãã¸ã§ã¯ãã«ä¾åãã¦è¨æ¶ãããã¨ãå¿ 240 è¦ãªæ 241 å ± 242 * ã®ããã®ãã£ã¼ã«ãã追å ããæ§é ä½ï¼WINFO_???ï¼ãå®ç¾©ãï¼WINFOã®ä»£ 243 * ããã«ç¨ããï¼ã¾ãï¼ä»¥ä¸ã®(c)ï½(e)ã®è¨å®ãè¡ãå¿ 244 è¦ãããï¼åæã»é 245 * ä¿¡ãªãã¸ã§ã¯ãã«é¢ä¿ããªãå¾ 246 ã¡ï¼èµ·åºå¾ 247 ã¡ï¼æéçµéå¾ 248 ã¡ï¼ã®å ´åã«ã¯ï¼ 249 * ãããã¯å¿ 250 è¦ãªãï¼ 251 * 252 * (c) TCBãå¾ 253 ã¡å¯¾è±¡ã®åæã»éä¿¡ãªãã¸ã§ã¯ãã®å¾ 254 ã¡ãã¥ã¼ã«ã¤ãªãï¼å¾ 255 256 * ã¡ãã¥ã¼ã«ã¤ãªãããã«ï¼task_queueã使ãï¼ 257 * 258 * (d) å¾ 259 ã¡å¯¾è±¡ã®åæã»éä¿¡ãªãã¸ã§ã¯ãã®ç®¡çãããã¯ã¸ã®ãã¤ã³ã¿ãï¼ 260 * WINFO_WOBJã®p_wobjcbã«è¨æ¶ããï¼ 261 * 262 * (e) å¾ 263 ã¡å¯¾è±¡ã®åæã»éä¿¡ãªãã¸ã§ã¯ãã«ä¾åãã¦è¨æ¶ãããã¨ãå¿ 264 è¦ãª 265 * æ 266 å ±ãããå ´åã«ã¯ï¼WINFO_???å 267 ã®ãã£ã¼ã«ãã«è¨æ¶ããï¼ 268 * 269 * å¾ 270 ã¡ç¶æ 271 ã解é¤ããéã«ã¯ï¼å¾ 272 ã¡è§£é¤ããã¿ã¹ã¯ã«å¯¾ããè¿å¤ãWINFOã® 273 * wercdã«è¨å®ããï¼wercdãå¿ 274 è¦ãªã®ã¯å¾ 275 ã¡è§£é¤ä»¥éã§ããã®ã«å¯¾ãã¦ï¼ 276 * p_tmevtbã¯å¾ 277 ã¡è§£é¤å¾ã¯å¿ 278 è¦ãªãããï¼ã¡ã¢ãªç¯ç´ã®ããã«å 279 ±ç¨ä½ã使㣠280 * ã¦ããï¼ãã®ããï¼wercdã¸ã¨ã©ã¼ã³ã¼ããè¨å®ããã®ã¯ï¼ã¿ã¤ã ã¤ãã³ã 281 * ãããã¯ãç»é²è§£é¤ããå¾ã«ããªããã°ãªããªãï¼ 132 * 待ち情報ブロック(WINFO)の定義 133 * 134 * タスクが待ち状態の間は,TCBおよびそのp_winfoで指されるWINFOを次の 135 * ように設定しなければならない. 136 * 137 * (a) TCBのタスク状態を待ち状態(TS_WAITING_???)にする. 138 * 139 * (b) タイムアウトを監視するために,タイムイベントブロックを登録する. 140 * 登録するタイムイベントブロックは,待ちに入るサービスコール処理関数 141 * のローカル変数として確保し,それへのポインタをWINFOのp_tmevtbに記 142 * 憶する.タイムアウトの監視が必要ない場合(永久待ちの場合)には, 143 * p_tmevtbをNULLにする. 144 * 145 * 同期・通信オブジェクトに対する待ち状態の場合には,標準のWINFOに 146 * p_wobjcbフィールドを追加した構造体(WINFO_WOBJ,wait.hで定義)に, 147 * 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な情報 148 * のためのフィールドを追加した構造体(WINFO_???)を定義し,WINFOの代 149 * わりに用いる.また,以下の(c)~(e)の設定を行う必要がある.同期・通 150 * 信オブジェクトに関係しない待ち(起床待ち,時間経過待ち)の場合には, 151 * これらは必要ない. 152 * 153 * (c) TCBを待ち対象の同期・通信オブジェクトの待ちキューにつなぐ.待 154 * ちキューにつなぐために,task_queueを使う. 155 * 156 * (d) 待ち対象の同期・通信オブジェクトの管理ブロックへのポインタを, 157 * WINFO_WOBJのp_wobjcbに記憶する. 158 * 159 * (e) 待ち対象の同期・通信オブジェクトに依存して記憶することが必要な 160 * 情報がある場合には,WINFO_???内のフィールドに記憶する. 161 * 162 * 待ち状態を解除する際には,待ち解除したタスクに対する返値をWINFOの 163 * wercdに設定する.wercdが必要なのは待ち解除以降であるのに対して, 164 * p_tmevtbは待ち解除後は必要ないため,メモリ節約のために共用体を使っ 165 * ている.そのため,wercdへエラーコードを設定するのは,タイムイベント 166 * ブロックを登録解除した後にしなければならない. 282 167 */ 283 168 typedef union waiting_information { 284 ER wercd; /* å¾ 285 ã¡è§£é¤æã®ã¨ã©ã¼ã³ã¼ã */ 286 TMEVTB *p_tmevtb; /* å¾ 287 ã¡ç¶æ 288 ç¨ã®ã¿ã¤ã ã¤ãã³ãããã㯠*/ 169 ER wercd; /* 待ち解除時のエラーコード */ 170 TMEVTB *p_tmevtb; /* 待ち状態用のタイムイベントブロック */ 289 171 } WINFO; 290 172 291 173 /* 292 * ãã¥ã¼ããã¯ã¹ç®¡çãããã¯ã®åã®åæ¹åç 293 § 174 * ミューテックス管理ブロックの型の前方参照 294 175 */ 295 176 typedef struct mutex_control_block MTXCB; 296 177 297 178 /* 298 * ã¿ã¹ã¯åæåããã㯠299 * 300 * ã¿ã¹ã¯ã«é¢ããæ 301 å ±ãï¼å¤ãå¤ãããªãããã«ROMã«ç½®ããé¨åï¼ã¿ã¹ã¯ 302 * åæåãããã¯ï¼ã¨ï¼å¤ãå¤åããããã«RAMã«ç½®ããªããã°ãªããªãé¨ 303 * åï¼ã¿ã¹ã¯ç®¡çãããã¯ï¼TCBï¼ã«åé¢ãï¼TCBå 304 ã«å¯¾å¿ããã¿ã¹ã¯åæå 305 * ãããã¯ãæããã¤ã³ã¿ãå 306 ¥ããï¼ã¿ã¹ã¯åæåãããã¯å 307 ã«å¯¾å¿ãã 308 * TCBãæããã¤ã³ã¿ãå 309 ¥ããæ¹æ³ã®æ¹ãï¼RAMã®ç¯ç´ã®è¦³ç¹ããã¯æã¾ãã 310 * ãï¼å®è¡å¹çãæªããªãããã«æ¡ç¨ãã¦ããªãï¼ä»ã®ãªãã¸ã§ã¯ãã«ã¤ã 311 * ã¦ãåæ§ã«æ±ãï¼ 312 * 313 * ã¿ã¹ã¯åæåãããã¯ã«ã¯ï¼DEF_TEXã§å®ç¾©ãããã¿ã¹ã¯ä¾å¤å¦çã«ã¼ã 314 * ã³ã«é¢ããæ 315 å ±ãå«ãï¼ 179 * タスク初期化ブロック 180 * 181 * タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク 182 * 初期化ブロック)と,値が変化するためにRAMに置かなければならない部 183 * 分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化 184 * ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する 185 * TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい 186 * が,実行効率が悪くなるために採用していない.他のオブジェクトについ 187 * ても同様に扱う. 188 * 189 * タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ 190 * ンに関する情報も含む. 316 191 */ 317 192 typedef struct task_initialization_block { 318 ATR tskatr; /* ã¿ã¹ã¯å±æ§ */ 319 intptr_t exinf; /* ã¿ã¹ã¯ã®æ¡å¼µæ 320 å ± */ 321 TASK task; /* ã¿ã¹ã¯ã®èµ·åçªå° */ 322 uint_t ipriority; /* ã¿ã¹ã¯ã®èµ·åæåªå 323 度ï¼å 324 é¨è¡¨ç¾ï¼ */ 193 ATR tskatr; /* タスク属性 */ 194 intptr_t exinf; /* タスクの拡張情報 */ 195 TASK task; /* タスクの起動番地 */ 196 uint_t ipriority; /* タスクの起動時優先度(内部表現) */ 325 197 326 198 #ifdef USE_TSKINICTXB 327 TSKINICTXB tskinictxb; /* ã¿ã¹ã¯åæåã³ã³ããã¹ããããã¯*/199 TSKINICTXB tskinictxb; /* タスク初期化コンテキストブロック */ 328 200 #else /* USE_TSKINICTXB */ 329 size_t stksz; /* ã¹ã¿ãã¯é åã®ãµã¤ãºï¼ä¸¸ããå¤ï¼ */ 330 void *stk; /* ã¹ã¿ãã¯é åã®å 331 é çªå° */ 201 size_t stksz; /* スタック領域のサイズ(丸めた値) */ 202 void *stk; /* スタック領域の先頭番地 */ 332 203 #endif /* USE_TSKINICTXB */ 333 204 } TINIB; 334 205 335 206 /* 336 * ã¿ã¹ã¯ç®¡çãããã¯ï¼TCBï¼ 337 * 338 * ASPã«ã¼ãã«ã§ã¯ï¼ã¿ã¹ã¯ã®èµ·åè¦æ±ãã¥ã¼ã¤ã³ã°æ°ã®æ大å¤ï¼TMAX_ACTCNTï¼ 339 * ã¨èµ·åºè¦æ±ãã¥ã¼ã¤ã³ã°æ°ã®æ大å¤ï¼TMAX_WUPCNTï¼ã¯1ã«åºå®ããã¦ãã 340 * ããï¼ãã¥ã¼ã¤ã³ã°ããã¦ãããã©ããã®çå½å¤ã§è¡¨ç¾ãããã¨ãã§ããï¼ 341 * ã¾ãï¼å¼·å¶å¾ 342 ã¡è¦æ±ãã¹ãæ°ã®æ大å¤ï¼TMAX_SUSCNTï¼ã1ã«åºå®ããã¦ã 343 * ãã®ã§ï¼å¼·å¶å¾ 344 ã¡è¦æ±ãã¹ãæ°ï¼suscntï¼ã¯å¿ 345 è¦ãªãï¼ 346 * 347 * TCBã®ããã¤ãã®ãã£ã¼ã«ãã¯ï¼ç¹å®ã®ã¿ã¹ã¯ç¶æ 348 ã§ã®ã¿æå¹ãªå¤ãä¿æãï¼ 349 * ãã以å¤ã®å ´åã¯å¤ãä¿è¨¼ãããªãï¼ãã£ã¦ï¼åç 350 §ãã¦ã¯ãªããªãï¼ï¼å 351 * ãã£ã¼ã«ããæå¹ãªå¤ãä¿æããæ¡ä»¶ã¯æ¬¡ã®éãï¼ 352 * 353 * ã»åæåå¾ã¯å¸¸ã«æå¹ï¼ 354 * p_tinibï¼tstatï¼actque 355 * ã»ä¼æ¢ç¶æ 356 以å¤ã§æå¹ï¼ä¼æ¢ç¶æ 357 ã§ã¯åæå¤ã«ãªã£ã¦ããï¼ï¼ 358 * bpriorityï¼priorityï¼wupqueï¼rasterï¼enaterï¼p_lastmtx 359 * ã»å¾ 360 ã¡ç¶æ 361 ï¼äºéå¾ 362 ã¡ç¶æ 363 ãå«ãï¼ã§æå¹ï¼ 207 * タスク管理ブロック(TCB) 208 * 209 * ASPカーネルでは,タスクの起動要求キューイング数の最大値(TMAX_ACTCNT) 210 * と起床要求キューイング数の最大値(TMAX_WUPCNT)は1に固定されている 211 * ため,キューイングされているかどうかの真偽値で表現することができる. 212 * また,強制待ち要求ネスト数の最大値(TMAX_SUSCNT)が1に固定されてい 213 * るので,強制待ち要求ネスト数(suscnt)は必要ない. 214 * 215 * TCBのいくつかのフィールドは,特定のタスク状態でのみ有効な値を保持し, 216 * それ以外の場合は値が保証されない(よって,参照してはならない).各 217 * フィールドが有効な値を保持する条件は次の通り. 218 * 219 * ・初期化後は常に有効: 220 * p_tinib,tstat,actque 221 * ・休止状態以外で有効(休止状態では初期値になっている): 222 * bpriority,priority,wupque,raster,enater,p_lastmtx 223 * ・待ち状態(二重待ち状態を含む)で有効: 364 224 * p_winfo 365 * ã»å®è¡ã§ããç¶æ 366 ã¨åæã»éä¿¡ãªãã¸ã§ã¯ãã«å¯¾ããå¾ 367 ã¡ç¶æ 368 ã§æå¹ï¼ 225 * ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効: 369 226 * task_queue 370 * ã»å®è¡å¯è½ç¶æ 371 ï¼å¾ 372 ã¡ç¶æ 373 ï¼å¼·å¶å¾ 374 ã¡ç¶æ 375 ï¼äºéå¾ 376 ã¡ç¶æ 377 ã§æå¹ï¼ 227 * ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効: 378 228 * tskctxb 379 229 */ 380 230 typedef struct task_control_block { 381 QUEUE task_queue; /* ã¿ã¹ã¯ãã¥ã¼*/382 const TINIB *p_tinib; /* åæåãããã¯ã¸ã®ãã¤ã³ã¿*/231 QUEUE task_queue; /* タスクキュー */ 232 const TINIB *p_tinib; /* 初期化ブロックへのポインタ */ 383 233 384 234 #ifdef UINT8_MAX 385 uint8_t tstat; /* ã¿ã¹ã¯ç¶æ 386 ï¼å 387 é¨è¡¨ç¾ï¼*/ 388 uint8_t bpriority; /* ãã¼ã¹åªå 389 度ï¼å 390 é¨è¡¨ç¾ï¼*/ 391 uint8_t priority; /* ç¾å¨ã®åªå 392 度ï¼å 393 é¨è¡¨ç¾ï¼*/ 235 uint8_t tstat; /* タスク状態(内部表現)*/ 236 uint8_t bpriority; /* ベース優先度(内部表現)*/ 237 uint8_t priority; /* 現在の優先度(内部表現)*/ 394 238 #else /* UINT8_MAX */ 395 BIT_FIELD_UINT tstat : 8; /* ã¿ã¹ã¯ç¶æ 396 ï¼å 397 é¨è¡¨ç¾ï¼*/ 398 BIT_FIELD_UINT bpriority : 8; /* ãã¼ã¹åªå 399 度ï¼å 400 é¨è¡¨ç¾ï¼*/ 401 BIT_FIELD_UINT priority : 8 /* ç¾å¨ã®åªå 402 度ï¼å 403 é¨è¡¨ç¾ï¼*/; 239 BIT_FIELD_UINT tstat : 8; /* タスク状態(内部表現)*/ 240 BIT_FIELD_UINT bpriority : 8; /* ベース優先度(内部表現)*/ 241 BIT_FIELD_UINT priority : 8 /* 現在の優先度(内部表現)*/; 404 242 #endif /* UINT8_MAX */ 405 BIT_FIELD_BOOL actque : 1; /* èµ·åè¦æ±ãã¥ã¼ã¤ã³ã° */ 406 BIT_FIELD_BOOL wupque : 1; /* èµ·åºè¦æ±ãã¥ã¼ã¤ã³ã° */ 407 BIT_FIELD_BOOL raster : 1; /* ã¿ã¹ã¯çµäºè¦æ±ç¶æ 408 */ 409 BIT_FIELD_BOOL enater : 1; /* ã¿ã¹ã¯çµäºè¨±å¯ç¶æ 410 */ 411 412 WINFO *p_winfo; /* å¾ 413 ã¡æ 414 å ±ãããã¯ã¸ã®ãã¤ã³ã¿ */ 415 MTXCB *p_lastmtx; /* æå¾ã«ããã¯ãããã¥ã¼ããã¯ã¹ */ 416 TSKCTXB tskctxb; /* ã¿ã¹ã¯ã³ã³ããã¹ãããã㯠*/ 243 BIT_FIELD_BOOL actque : 1; /* 起動要求キューイング */ 244 BIT_FIELD_BOOL wupque : 1; /* 起床要求キューイング */ 245 BIT_FIELD_BOOL raster : 1; /* タスク終了要求状態 */ 246 BIT_FIELD_BOOL enater : 1; /* タスク終了許可状態 */ 247 248 WINFO *p_winfo; /* 待ち情報ブロックへのポインタ */ 249 MTXCB *p_lastmtx; /* 最後にロックしたミューテックス */ 250 TSKCTXB tskctxb; /* タスクコンテキストブロック */ 417 251 } TCB; 418 252 419 253 /* 420 * å®è¡ç¶æ 421 ã®ã¿ã¹ã¯ 422 * 423 * å®è¡ç¶æ 424 ã®ã¿ã¹ã¯ï¼ï¼ããã»ããµãã³ã³ããã¹ããæã£ã¦ããã¿ã¹ã¯ï¼ã® 425 * TCBãæããã¤ã³ã¿ï¼å®è¡ç¶æ 426 ã®ã¿ã¹ã¯ããªãå ´åã¯NULLã«ããï¼ 427 * 428 * ãµã¼ãã¹ã³ã¼ã«ã®å¦çä¸ã§ï¼èªã¿ã¹ã¯ï¼ãµã¼ãã¹ã³ã¼ã«ãå¼ã³åºããã¿ã¹ 429 * ã¯ï¼ã«é¢ããæ 430 å ±ãåç 431 §ããå ´åã¯p_runtskã使ãï¼p_runtskãæ¸ãæã 432 * ãã®ã¯ï¼ãã£ã¹ãããã£ï¼ã¨åæåå¦çï¼ã®ã¿ã§ããï¼ 254 * 実行状態のタスク 255 * 256 * 実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の 257 * TCBを指すポインタ.実行状態のタスクがない場合はNULLにする. 258 * 259 * サービスコールの処理中で,自タスク(サービスコールを呼び出したタス 260 * ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え 261 * るのは,ディスパッチャ(と初期化処理)のみである. 433 262 */ 434 263 extern TCB *p_runtsk; 435 264 436 265 /* 437 * å®è¡ãã¹ãã¿ã¹ã¯ 438 * 439 * å®è¡ãã¹ãã¿ã¹ã¯ã®TCBãæããã¤ã³ã¿ï¼å®è¡ã§ããã¿ã¹ã¯ããªãå ´å㯠440 * NULLã«ããï¼ 441 * 442 * p_runtskã¯ï¼é常ã¯p_schedtskã¨ä¸è´ãã¦ãããï¼éã¿ã¹ã¯ã³ã³ããã¹ã 443 * å®è¡ä¸ã¯ï¼ä¸è´ãã¦ããã¨ã¯éããªãï¼å²è¾¼ã¿åªå 444 度ãã¹ã¯å 445 ¨è§£é¤ã§ãªã 446 * ç¶æ 447 ã®éã¨ãã£ã¹ãããç¦æ¢ç¶æ 448 ã®éï¼ããªãã¡ï¼dspflgãfalseã§ããéï¼ 449 * ã¯ï¼p_schedtskãæ´æ°ããªãï¼ 266 * 実行すべきタスク 267 * 268 * 実行すべきタスクのTCBを指すポインタ.実行できるタスクがない場合は 269 * NULLにする. 270 * 271 * p_runtskは,通常はp_schedtskと一致しているが,非タスクコンテキスト 272 * 実行中は,一致しているとは限らない.割込み優先度マスク全解除でない 273 * 状態の間とディスパッチ禁止状態の間(すなわち,dspflgがfalseである間) 274 * は,p_schedtskを更新しない. 450 275 */ 451 276 extern TCB *p_schedtsk; 452 277 453 278 /* 454 * ãã£ã¹ããã許å¯ç¶æ 455 456 * 457 * ãã£ã¹ããã許å¯ç¶æ 458 ã§ãããã¨ã示ããã©ã°ï¼ 279 * ディスパッチ許可状態 280 * 281 * ディスパッチ許可状態であることを示すフラグ. 459 282 */ 460 283 extern bool_t enadsp; 461 284 462 285 /* 463 * ã¿ã¹ã¯ãã£ã¹ãããå¯è½ç¶æ 464 465 * 466 * å²è¾¼ã¿åªå 467 度ãã¹ã¯å 468 ¨è§£é¤ç¶æ 469 ã§ããï¼ãã£ã¹ããã許å¯ç¶æ 470 ã§ããï¼ã㣠471 * ã¹ãããç¦æ¢ç¶æ 472 ã§ãªãï¼ãã¨ã示ããã©ã°ï¼ãã£ã¹ãããä¿çç¶æ 473 ã§ãª 474 * ããã¨ã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãå®è¡ä¸ã§ï¼CPUããã¯ç¶æ 475 ã§ãªãï¼dspflgã 476 * trueã§ãããã¨ã§å¤å¥ãããã¨ãã§ããï¼ 286 * タスクディスパッチ可能状態 287 * 288 * 割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ 289 * スパッチ禁止状態でない)ことを示すフラグ.ディスパッチ保留状態でな 290 * いことは,タスクコンテキスト実行中で,CPUロック状態でなく,dspflgが 291 * trueであることで判別することができる. 477 292 */ 478 293 extern bool_t dspflg; 479 294 480 295 /* 481 * ã¬ãã£ãã¥ã¼ 482 * 483 * ã¬ãã£ãã¥ã¼ã¯ï¼å®è¡ã§ããç¶æ 484 ã®ã¿ã¹ã¯ã管çããããã®ãã¥ã¼ã§ããï¼ 485 * å®è¡ç¶æ 486 ã®ã¿ã¹ã¯ã管çãã¦ããããï¼ã¬ãã£ï¼å®è¡å¯è½ï¼ãã¥ã¼ã¨ãã 487 * å称ã¯æ£ç¢ºã§ã¯ãªããï¼ã¬ãã£ãã¥ã¼ã¨ããå称ãå®çãã¦ããããï¼ã 488 * ã®å称ã§å¼ã¶ãã¨ã«ããï¼ 489 * 490 * ã¬ãã£ãã¥ã¼ã¯ï¼åªå 491 度ãã¨ã®ã¿ã¹ã¯ãã¥ã¼ã§æ§æããã¦ããï¼ã¿ã¹ã¯ã® 492 * TCBã¯ï¼è©²å½ããåªå 493 度ã®ãã¥ã¼ã«ç»é²ãããï¼ 296 * レディキュー 297 * 298 * レディキューは,実行できる状態のタスクを管理するためのキューである. 299 * 実行状態のタスクも管理しているため,レディ(実行可能)キューという 300 * 名称は正確ではないが,レディキューという名称が定着しているため,こ 301 * の名称で呼ぶことにする. 302 * 303 * レディキューは,優先度ごとのタスクキューで構成されている.タスクの 304 * TCBは,該当する優先度のキューに登録される. 494 305 */ 495 306 extern QUEUE ready_queue[TNUM_TPRI]; 496 307 497 308 /* 498 * ã¬ãã£ãã¥ã¼ãµã¼ãã®ããã®ãããããã 499 * 500 * ã¬ãã£ãã¥ã¼ã®ãµã¼ããå¹çããè¡ãããã«ï¼åªå 501 度ãã¨ã®ã¿ã¹ã¯ãã¥ã¼ 502 * ã«ã¿ã¹ã¯ãå 503 ¥ã£ã¦ãããã©ããã示ããããããããç¨æãã¦ããï¼ãã 504 * ããããã使ããã¨ã§ï¼ã¡ã¢ãªã¢ã¯ã»ã¹ã®åæ°ãæ¸ãããã¨ãã§ãããï¼ 505 * ãããæä½å½ä»¤ãå 506 507 å®ãã¦ããªãããã»ããµã§ï¼åªå 508 度ã®æ®µéæ°ãå°ãªã 509 * å ´åã«ã¯ï¼ããããããæä½ã®ãªã¼ãã¼ãããã®ããã«ï¼éã«å¹çãè½ã¡ 510 * ãå¯è½æ§ãããï¼ 511 * 512 * åªå 513 度ã16段éã§ãããã¨ãä»®å®ãã¦ããããï¼uint16_tåã¨ãã¦ããï¼ 309 * レディキューサーチのためのビットマップ 310 * 311 * レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー 312 * にタスクが入っているかどうかを示すビットマップを用意している.ビッ 313 * トマップを使うことで,メモリアクセスの回数を減らすことができるが, 314 * ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない 315 * 場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち 316 * る可能性もある. 317 * 318 * 優先度が16段階であることを仮定しているため,uint16_t型としている. 514 319 */ 515 320 extern uint16_t ready_primap; 516 321 517 322 /* 518 * 使ç¨ãã¦ããªãTCBã®ãªã¹ã323 * 使用していないTCBのリスト 519 324 */ 520 325 extern QUEUE free_tcb; 521 326 522 327 /* 523 * ã¿ã¹ã¯IDã®æ大å¤ï¼kernel_cfg.cï¼328 * タスクIDの最大値(kernel_cfg.c) 524 329 */ 525 330 extern const ID tmax_tskid; … … 527 332 528 333 /* 529 * ã¿ã¹ã¯åæåãããã¯ã®ã¨ãªã¢ï¼kernel_cfg.cï¼334 * タスク初期化ブロックのエリア(kernel_cfg.c) 530 335 */ 531 336 extern const TINIB tinib_table[]; … … 533 338 534 339 /* 535 * ã¿ã¹ã¯çæé åºãã¼ãã«ï¼kernel_cfg.cï¼340 * タスク生成順序テーブル(kernel_cfg.c) 536 341 */ 537 342 extern const ID torder_table[]; 538 343 539 344 /* 540 * TCB ã®ã¨ãªã¢ï¼kernel_cfg.cï¼345 * TCBのエリア(kernel_cfg.c) 541 346 */ 542 347 extern TCB tcb_table[]; 543 348 544 349 /* 545 * ã¿ã¹ã¯ã®æ°350 * タスクの数 546 351 */ 547 352 #define tnum_tsk ((uint_t)(tmax_tskid - TMIN_TSKID + 1)) … … 549 354 550 355 /* 551 * ã¿ã¹ã¯IDããTCBãåãåºãããã®ãã¯ã356 * タスクIDからTCBを取り出すためのマクロ 552 357 */ 553 358 #define INDEX_TSK(tskid) ((uint_t)((tskid) - TMIN_TSKID)) … … 555 360 556 361 /* 557 * TCB ããã¿ã¹ã¯IDãåãåºãããã®ãã¯ã362 * TCBからタスクIDを取り出すためのマクロ 558 363 */ 559 364 #define TSKID(p_tcb) ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID)) 560 365 561 366 /* 562 * ã¿ã¹ã¯ç®¡çã¢ã¸ã¥ã¼ã«ã®åæå367 * タスク管理モジュールの初期化 563 368 */ 564 369 extern void initialize_task(void); 565 370 566 371 /* 567 * æé«åªå 568 é ä½ã¿ã¹ã¯ã®ãµã¼ã 569 * 570 * ã¬ãã£ãã¥ã¼ä¸ã®æé«åªå 571 é ä½ã®ã¿ã¹ã¯ããµã¼ããï¼ãã®TCBã¸ã®ãã¤ã³ã¿ 572 * ãè¿ãï¼ã¬ãã£ãã¥ã¼ã空ã®å ´åã«ã¯ï¼ãã®é¢æ°ãå¼ã³åºãã¦ã¯ãªããªãï¼ 372 * 最高優先順位タスクのサーチ 373 * 374 * レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ 375 * を返す.レディキューが空の場合には,この関数を呼び出してはならない. 573 376 */ 574 377 extern TCB *search_schedtsk(void); 575 378 576 379 /* 577 * å®è¡ã§ããç¶æ 578 ã¸ã®é·ç§» 579 * 580 * p_tcbã§æå®ãããã¿ã¹ã¯ãã¬ãã£ãã¥ã¼ã«æ¿å 581 ¥ããï¼ã¬ãã£ãã¥ã¼ã«æ¿å 582 ¥ 583 * ããã¿ã¹ã¯ã®åªå 584 度ãï¼å®è¡ãã¹ãã¿ã¹ã¯ã®åªå 585 度ãããé«ãå ´åã¯ï¼å® 586 * è¡ãã¹ãã¿ã¹ã¯ãæ´æ°ããï¼ 380 * 実行できる状態への遷移 381 * 382 * p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入 383 * したタスクの優先度が,実行すべきタスクの優先度よりも高い場合は,実 384 * 行すべきタスクを更新する. 587 385 */ 588 386 extern void make_runnable(TCB *p_tcb); 589 387 590 388 /* 591 * å®è¡ã§ããç¶æ 592 ããä»ã®ç¶æ 593 ã¸ã®é·ç§» 594 * 595 * p_tcbã§æå®ãããã¿ã¹ã¯ãã¬ãã£ãã¥ã¼ããåé¤ããï¼p_tcbã§æå®ãã 596 * ã¿ã¹ã¯ãå®è¡ãã¹ãã¿ã¹ã¯ã§ãã£ãå ´åã«ã¯ï¼å®è¡ãã¹ãã¿ã¹ã¯ãæ´æ°ã 597 * ãï¼ 389 * 実行できる状態から他の状態への遷移 390 * 391 * p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した 392 * タスクが実行すべきタスクであった場合には,実行すべきタスクを更新す 393 * る. 598 394 */ 599 395 extern void make_non_runnable(TCB *p_tcb); 600 396 601 397 /* 602 * ä¼æ¢ç¶æ 603 ã¸ã®é·ç§» 604 * 605 * p_tcbã§æå®ãããã¿ã¹ã¯ã®ç¶æ 606 ãä¼æ¢ç¶æ 607 ã¨ããï¼ã¾ãï¼ã¿ã¹ã¯ã®èµ·å 608 * æã«åæåãã¹ãå¤æ°ã®åæåã¨ï¼ã¿ã¹ã¯èµ·åã®ããã®ã³ã³ããã¹ããè¨ 609 * å®ããï¼ 398 * 休止状態への遷移 399 * 400 * p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動 401 * 時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設 402 * 定する. 610 403 */ 611 404 extern void make_dormant(TCB *p_tcb); 612 405 613 406 /* 614 * ä¼æ¢ç¶æ 615 ããå®è¡ã§ããç¶æ 616 ã¸ã®é·ç§» 617 * 618 * p_tcbã§æå®ãããã¿ã¹ã¯ã®ç¶æ 619 ãä¼æ¢ç¶æ 620 ããå®è¡ã§ããç¶æ 621 ã¨ããï¼ 407 * 休止状態から実行できる状態への遷移 408 * 409 * p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする. 622 410 */ 623 411 extern void make_active(TCB *p_tcb); 624 412 625 413 /* 626 * ã¿ã¹ã¯ã®åªå 627 度ã®å¤æ´ 628 * 629 * p_tcbã§æå®ãããã¿ã¹ã¯ã®åªå 630 度ãnewpriï¼å 631 é¨è¡¨ç¾ï¼ã«å¤æ´ããï¼ã¾ãï¼ 632 * å¿ 633 è¦ãªå ´åã«ã¯ï¼å®è¡ãã¹ãã¿ã¹ã¯ãæ´æ°ããï¼ 634 * 635 * p_tcbã§æå®ãããã¿ã¹ã¯ã®åªå 636 é ä½ã¯ï¼åªå 637 度ãåãã¿ã¹ã¯ã®ä¸ã§ï¼ 638 * mtxmodeãfalseã®æã¯æä½ï¼mtxmodeãtrueã®æã¯æé«ã¨ããï¼ 414 * タスクの優先度の変更 415 * 416 * p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また, 417 * 必要な場合には,実行すべきタスクを更新する. 418 * 419 * p_tcbで指定されるタスクの優先順位は,優先度が同じタスクの中で, 420 * mtxmodeがfalseの時は最低,mtxmodeがtrueの時は最高とする. 639 421 */ 640 422 extern void change_priority(TCB *p_tcb, uint_t newpri, bool_t mtxmode); 641 423 642 424 /* 643 * ã¬ãã£ãã¥ã¼ã®å転 644 * 645 * ã¬ãã£ãã¥ã¼ä¸ã®ï¼p_queueã§æå®ãããã¿ã¹ã¯ãã¥ã¼ãå転ãããï¼ã¾ãï¼ 646 * å¿ 647 è¦ãªå ´åã«ã¯ï¼å®è¡ãã¹ãã¿ã¹ã¯ãæ´æ°ããï¼ 425 * レディキューの回転 426 * 427 * レディキュー中の,p_queueで指定されるタスクキューを回転させる.また, 428 * 必要な場合には,実行すべきタスクを更新する. 648 429 */ 649 430 extern void rotate_ready_queue(QUEUE *p_queue); 650 431 651 432 /* 652 * ã¿ã¹ã¯ã®çµäºå¦ç653 * 654 * p_tcb ã§æå®ãããã¿ã¹ã¯ãçµäºãããå¦çãè¡ãï¼ã¿ã¹ã¯ã®èµ·åè¦æ±ãã¥ã¼655 * ã¤ã³ã°æ°ã0ã§ãªãå ´åã«ã¯ï¼å度起åããããã®å¦çãè¡ãï¼433 * タスクの終了処理 434 * 435 * p_tcbで指定されるタスクを終了させる処理を行う.タスクの起動要求キュー 436 * イング数が0でない場合には,再度起動するための処理を行う. 656 437 */ 657 438 extern void task_terminate(TCB *p_tcb);
Note:
See TracChangeset
for help on using the changeset viewer.