Changeset 167 for UsbWattMeter/trunk/asp_dcre/kernel/task.h
- Timestamp:
- Mar 8, 2016, 8:37:45 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
UsbWattMeter/trunk/asp_dcre/kernel/task.h
-
Property svn:mime-type
changed from
text/x-chdr
totext/x-chdr; charset=SHIFT_JIS
r164 r167 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 12 * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 13 * ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 14 * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 15 * \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[ 16 * XR[hÉÜÜêĢ鱯D 17 * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 18 * pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 19 gip 20 * Ò}j 21 AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL 22 * Ì³ÛØKèðfÚ·é±ÆD 23 * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 24 * pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 25 * ÆD 26 * (a) Äzzɺ¤hL 27 gipÒ}j 28 AÈÇjÉCãLÌ 29 * ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD 30 * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 31 * ñ·é±ÆD 32 * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 33 * Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 34 * ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 35 * RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 36 * ÆÓ·é±ÆD 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 * 免責すること. 37 33 * 38 * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨39 * æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI40 * ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF41 * AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»42 * ÌÓCðíÈ¢D34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 43 39 * 44 40 * $Id$ … … 46 42 47 43 /* 48 * ^XNÇW 49 [ 44 * タスク管理モジュール 50 45 */ 51 46 … … 57 52 58 53 /* 59 * g[XO}NÌftHgè`54 * トレースログマクロのデフォルト定義 60 55 */ 61 56 #ifndef LOG_TSKSTAT … … 64 59 65 60 /* 66 * ^XNDæxÌà\»EO\»Ï·}N61 * タスク優先度の内部表現・外部表現変換マクロ 67 62 */ 68 63 #define INT_PRIORITY(x) ((uint_t)((x) - TMIN_TPRI)) … … 70 65 71 66 /* 72 * ^XNóÔÌà\» 73 * 74 * TCBÌ^XNóÔÅÍCÀsóÔiRUNNINGjÆÀsÂ\óÔiREADYj 75 * ÍæÊµÈ¢D¼óÔð̵ÄCÀsÅ«éóÔiRUNNABLEjÆÄÔD 76 * ñdÒ¿óÔÍC(TS_WAITING | TS_SUSPENDED)Å\·DTS_WAIT_???ÍÒ 77 * ¿vöð\µCÒ¿óÔiñdÒ¿óÔðÜÞjÌêÉÌÝÝè·éD 78 */ 79 #define TS_DORMANT 0x00U /* x~óÔ */ 80 #define TS_RUNNABLE 0x01U /* ÀsÅ«éóÔ */ 81 #define TS_WAITING 0x02U /* Ò¿óÔ */ 82 #define TS_SUSPENDED 0x04U /* §Ò¿óÔ */ 83 84 #define TS_WAIT_DLY (0x00U << 3) /* ÔoßÒ¿ */ 85 #define TS_WAIT_SLP (0x01U << 3) /* N°Ò¿ */ 86 #define TS_WAIT_RDTQ (0x02U << 3) /* f[^L 87 [©çÌóMÒ¿ */ 88 #define TS_WAIT_RPDQ (0x03U << 3) /* Dæxf[^L 89 [©çÌóMÒ¿ */ 90 #define TS_WAIT_SEM (0x04U << 3) /* Z}tH¹Ìl¾Ò¿ */ 91 #define TS_WAIT_FLG (0x05U << 3) /* CxgtOÒ¿ */ 92 #define TS_WAIT_SDTQ (0x06U << 3) /* f[^L 93 [ÖÌMÒ¿ */ 94 #define TS_WAIT_SPDQ (0x07U << 3) /* Dæxf[^L 95 [ÖÌMÒ¿ */ 96 #define TS_WAIT_MBX (0x08U << 3) /* [{bNX©çÌóMÒ¿ */ 97 #define TS_WAIT_MPF (0x09U << 3) /* Åè·ubNÌl¾Ò¿ */ 98 99 /* 100 * ^XNóÔ»Ê}N 101 * 102 * TSTAT_DORMANTÍ^XNªx~óÔÅ é©Ç¤©ðCTSTAT_RUNNABLEÍ 103 * ^XNªÀsÅ«éóÔÅ é©Ç¤©ð»Ê·éDTSTAT_WAITINGÍÒ 104 * ¿óÔÆñdÒ¿óÔÌ¢¸ê©Å é©Ç¤©ðCTSTAT_SUSPENDEDÍ 105 * §Ò¿óÔÆñdÒ¿óÔÌ¢¸ê©Å é©Ç¤©ð»Ê·éD 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 * 強制待ち状態と二重待ち状態のいずれかであるかどうかを判別する. 106 97 */ 107 98 #define TSTAT_DORMANT(tstat) ((tstat) == TS_DORMANT) … … 111 102 112 103 /* 113 * ^XNÒ¿vö»Ê}N 114 * 115 * TSTAT_WAIT_SLPÍ^XNªN°Ò¿Å é©Ç¤©ðCTSTAT_WAIT_WOBJ 116 * Í^XNª¯úEÊMIuWFNgÉηéÒ¿Å é©i¾¢·¦éÆC 117 * ¯úÊMIuWFNgÌÒ¿L 118 [ÉÂȪêÄ¢é©jǤ©ð»Ê· 119 * éDܽCTSTAT_WAIT_WOBJCBÍ^XNª¯úEÊMIuWFNgÌÇ 120 * ubN̤ʪiWOBJCBjÌÒ¿L 121 [ÉÂȪêÄ¢é©Ç¤©ð 122 * »Ê·éD 123 * 124 * TSTAT_WAIT_SLPÍCCÓÌ^XNóÔÌ©çC^XNªN°Ò¿Å é 125 * ±Æð»ÊÅ«éD·Èí¿CTSTAT_WAITINGÉæèÒ¿óÔŠ鱯ð 126 * »Ê¹¸ÉCTSTAT_SLP¾¯ðp¢ÄN°Ò¿óÔŠ鱯ð»ÊÅ«éD 127 * ±êðø¦IÉÀ»·é½ßÉCTS_WAIT_SLPÌlðC(0x00U << 3)ÅÍÈ 128 * (0x01U << 3)ƵĢéD»Ì½ßC^XNªÔoßÒ¿óÔÅ é 129 * ±Æð»Ê·é½ßÌTSTAT_WAIT_DLYðCTSTAT_WAIT_SLPƯlÌû@Å 130 * À»·é±ÆÍūȢD 131 */ 132 #define TS_WAIT_MASK (0x0fU << 3) /* Ò¿vöÌæoµ}XN */ 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) /* 待ち要因の取出しマスク */ 133 122 134 123 #define TSTAT_WAIT_SLP(tstat) (((tstat) & TS_WAIT_MASK) == TS_WAIT_SLP) … … 137 126 138 127 /* 139 * Ò¿îñubNiWINFOjÌè` 140 * 141 * ^XNªÒ¿óÔÌÔÍCTCB¨æÑ»Ìp_winfoÅw³êéWINFOðÌ 142 * æ¤ÉÝèµÈ¯êÎÈçÈ¢D 143 * 144 * (a) TCBÌ^XNóÔðÒ¿óÔiTS_WAITINGjÉ·éD»ÌÛÉCÒ¿ 145 * vöiTS_WAIT_???jàÝè·éD 146 * 147 * (b) ^CAEgðÄ·é½ßÉC^CCxgubNðo^·éD 148 * o^·é^CCxgubNÍCÒ¿ÉüéT[rXR[Ö 149 * Ì[JÏÆµÄmÛµC»êÖÌ|C^ðWINFOÌp_tmevtbÉL 150 * ¯·éD^CAEgÌĪKvÈ¢êiivÒ¿ÌêjÉÍC 151 * p_tmevtbðNULLÉ·éD 152 * 153 * ¯úEÊMIuWFNgÉηéÒ¿óÔÌêÉÍCWÌWINFOÉ 154 * p_wobjcbtB[hðÇÁµ½\¢ÌiWINFO_WOBJCwait.hÅè`jðg 155 * ¤DܽCȺÌ(c)`(e)ÌÝèðs¤Kvª éD¯úEÊMIuWF 156 * NgÉÖWµÈ¢Ò¿iN°Ò¿CÔoßÒ¿jÌêÉÍC(c)`(e) 157 * ÍKvÈ¢D 158 * 159 * (c) TCBðÒ¿ÎÛ̯úEÊMIuWFNgÌÒ¿L 160 [ÉÂÈ®DÒ 161 * ¿L 162 [ÉÂÈ®½ßÉCtask_queueðg¤D 163 * 164 * (d) Ò¿ÎÛ̯úEÊMIuWFNgÌÇubNÖÌ|C^ðC 165 * WINFO_WOBJÌp_wobjcbÉL¯·éD 166 * 167 * (e) Ò¿ÎÛ̯úEÊMIuWFNgÉ˶µÄL¯·é±ÆªKvÈ 168 * îñª éêÉÍCWINFO_WOBJÉKvÈîñ̽ßÌtB[hðÇÁ 169 * µ½\¢Ìðè`µCWINFO_WOBJÌãíèÉp¢éD 170 * 171 * Ò¿óÔðð·éÛÉÍCÒ¿ðµ½^XNÉηéÔlðWINFOÌ 172 * wercdÉÝè·éDwercdªKvÈÌÍÒ¿ðÈ~Å éÌÉεÄC 173 * p_tmevtbÍÒ¿ðãÍKvÈ¢½ßCßñ̽ßɤpÌðgÁ 174 * Ä¢éD»Ì½ßCwercdÖG[R[hðÝè·éÌÍC^CCxg 175 * ubNðo^ðµ½ãɵȯêÎÈçÈ¢D 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 * ブロックを登録解除した後にしなければならない. 176 163 */ 177 164 typedef union waiting_information { 178 ER wercd; /* Ò¿ðÌG[R[h*/179 TMEVTB *p_tmevtb; /* Ò¿óÔpÌ^CCxgubN*/165 ER wercd; /* 待ち解除時のエラーコード */ 166 TMEVTB *p_tmevtb; /* 待ち状態用のタイムイベントブロック */ 180 167 } WINFO; 181 168 182 169 /* 183 * ^XNú»ubN184 * 185 * ^XNÉÖ·éîñðClªÏíçÈ¢½ßÉROMÉu¯éªi^XN186 * ú»ubNjÆClªÏ»·é½ßÉRAMÉu©È¯êÎÈçÈ¢187 * ªi^XNÇubNCTCBjɪ£µCTCBàÉηé^XNú»188 * ubNðw·|C^ðüêéD^XNú»ubNàÉηé189 * TCB ðw·|C^ðüêéû@ÌûªCRAMÌßñÌÏ_©çÍ]ܵ¢190 * ªCÀsø¦ª«Èé½ßÉÌpµÄ¢È¢D¼ÌIuWFNgÉ¢191 * Äà¯lɵ¤D192 * 193 * ^XNú»ubNÉÍCDEF_TEXÅè`³êé^XNáO[`194 * ÉÖ·éîñàÜÞD170 * タスク初期化ブロック 171 * 172 * タスクに関する情報を,値が変わらないためにROMに置ける部分(タスク 173 * 初期化ブロック)と,値が変化するためにRAMに置かなければならない部 174 * 分(タスク管理ブロック,TCB)に分離し,TCB内に対応するタスク初期化 175 * ブロックを指すポインタを入れる.タスク初期化ブロック内に対応する 176 * TCBを指すポインタを入れる方法の方が,RAMの節約の観点からは望ましい 177 * が,実行効率が悪くなるために採用していない.他のオブジェクトについ 178 * ても同様に扱う. 179 * 180 * タスク初期化ブロックには,DEF_TEXで定義されるタスク例外処理ルーチ 181 * ンに関する情報も含む. 195 182 */ 196 183 typedef struct task_initialization_block { 197 ATR tskatr; /* ^XN®«*/198 intptr_t exinf; /* ^XNÌg£îñ*/199 TASK task; /* ^XNÌN®Ôn*/200 uint_t ipriority; /* ^XNÌN®Dæxià\»j*/184 ATR tskatr; /* タスク属性 */ 185 intptr_t exinf; /* タスクの拡張情報 */ 186 TASK task; /* タスクの起動番地 */ 187 uint_t ipriority; /* タスクの起動時優先度(内部表現) */ 201 188 202 189 #ifdef USE_TSKINICTXB 203 TSKINICTXB tskinictxb; /* ^XNú»ReLXgubN*/190 TSKINICTXB tskinictxb; /* タスク初期化コンテキストブロック */ 204 191 #else /* USE_TSKINICTXB */ 205 SIZE stksz; /* X^bNÌæÌTCYiÛß½lj*/206 void *stk; /* X^bNÌæÌæªÔn*/192 SIZE stksz; /* スタック領域のサイズ(丸めた値) */ 193 void *stk; /* スタック領域の先頭番地 */ 207 194 #endif /* USE_TSKINICTXB */ 208 195 209 ATR texatr; /* ^XNáO[`®«*/210 TEXRTN texrtn; /* ^XNáO[`ÌN®Ôn*/196 ATR texatr; /* タスク例外処理ルーチン属性 */ 197 TEXRTN texrtn; /* タスク例外処理ルーチンの起動番地 */ 211 198 } TINIB; 212 199 213 200 /* 214 * TCB ÌtB[hÌrbgÌè`215 * 216 * vZbTÉæÁÄÍCTCBÌtB[hÌrbgÅgpÊÆ217 * «\ªg[hItÉÈé½ßC^[Qbg˶ÉtB[hÌrbg218 * ðÏX·é±ÆðµÄ¢éD201 * TCB中のフィールドのビット幅の定義 202 * 203 * プロセッサによっては,TCB中のフィールドのビット幅でメモリ使用量と 204 * 性能がトレードオフになるため,ターゲット依存にフィールドのビット幅 205 * を変更することを許している. 219 206 */ 220 207 #ifndef TBIT_TCB_PRIORITY 221 #define TBIT_TCB_PRIORITY 8 /* priority tB[hÌrbg*/208 #define TBIT_TCB_PRIORITY 8 /* priorityフィールドのビット幅 */ 222 209 #endif /* TBIT_TCB_PRIORITY */ 223 210 224 211 /* 225 * ^XNÇubNiTCBj 226 * 227 * ASPJ[lÅÍC^XNÌN®vL 228 [COÌÅåliTMAX_ACTCNTj 229 * ÆN°vL 230 [COÌÅåliTMAX_WUPCNTjÍ1ÉÅè³êÄ¢é 231 * ½ßCL 232 [CO³êÄ¢é©Ç¤©Ì^UlÅ\»·é±ÆªÅ«éD 233 * ܽC§Ò¿vlXgÌÅåliTMAX_SUSCNTjª1ÉÅè³êÄ¢ 234 * éÌÅC§Ò¿vlXgisuscntjÍKvÈ¢D 235 * 236 * TCB̢©ÌtB[hÍCÁèÌ^XNóÔÅÌÝLøÈlðÛµC 237 * »êÈOÌêÍlªÛسêÈ¢iæÁÄCQƵÄÍÈçÈ¢jDe 238 * tB[hªLøÈlðÛ·éðÍÌÊèD 239 * 240 * Eú»ãÍíÉLøF 241 * p_tinibCtstatCactque 242 * Ex~óÔÈOÅLøix~óÔÅÍúlÉÈÁÄ¢éjF 243 * priorityCwupqueCenatexCtexptn 244 * EÒ¿óÔiñdÒ¿óÔðÜÞjÅLøF 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 * ・待ち状態(二重待ち状態を含む)で有効: 245 229 * p_winfo 246 * EÀsÅ«éóÔÆ¯úEÊMIuWFNgÉηéÒ¿óÔÅLøF230 * ・実行できる状態と同期・通信オブジェクトに対する待ち状態で有効: 247 231 * task_queue 248 * EÀsÂ\óÔCÒ¿óÔC§Ò¿óÔCñdÒ¿óÔÅLøF232 * ・実行可能状態,待ち状態,強制待ち状態,二重待ち状態で有効: 249 233 * tskctxb 250 234 */ 251 235 typedef struct task_control_block { 252 QUEUE task_queue; /* ^XNL 253 [ */ 254 const TINIB *p_tinib; /* ú»ubNÖÌ|C^ */ 236 QUEUE task_queue; /* タスクキュー */ 237 const TINIB *p_tinib; /* 初期化ブロックへのポインタ */ 255 238 256 239 #ifdef UINT8_MAX 257 uint8_t tstat; /* ^XNóÔià\»j*/240 uint8_t tstat; /* タスク状態(内部表現)*/ 258 241 #else /* UINT8_MAX */ 259 BIT_FIELD_UINT tstat : 8; /* ^XNóÔià\»j*/242 BIT_FIELD_UINT tstat : 8; /* タスク状態(内部表現)*/ 260 243 #endif /* UINT8_MAX */ 261 244 #if defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) 262 uint8_t priority; /* »ÝÌDæxià\»j*/245 uint8_t priority; /* 現在の優先度(内部表現)*/ 263 246 #else /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */ 264 247 BIT_FIELD_UINT priority : TBIT_TCB_PRIORITY; 265 /* »ÝÌDæxià\»j*/248 /* 現在の優先度(内部表現)*/ 266 249 #endif /* defined(UINT8_MAX) && (TBIT_TCB_PRIORITY == 8) */ 267 BIT_FIELD_BOOL actque : 1; /* N®vL 268 [CO */ 269 BIT_FIELD_BOOL wupque : 1; /* N°vL 270 [CO */ 271 BIT_FIELD_BOOL enatex : 1; /* ^XNáOÂóÔ */ 272 273 TEXPTN texptn; /* Û¯áOvö */ 274 WINFO *p_winfo; /* Ò¿îñubNÖÌ|C^ */ 275 TSKCTXB tskctxb; /* ^XNReLXgubN */ 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; /* タスクコンテキストブロック */ 276 257 } TCB; 277 258 278 259 /* 279 * ÀsóÔÌ^XN280 * 281 * ÀsóÔÌ^XNivZbTªReLXgðÁÄ¢é^XNjÌ282 * TCB ðw·|C^DÀsóÔÌ^XNªÈ¢êÍNULLÉ·éD283 * 284 * T[rXR[ÌÅC©^XNiT[rXR[ðÄÑoµ½^X285 * NjÉÖ·éîñðQÆ·éêÍp_runtskðg¤Dp_runtskð«·¦286 * éÌÍCfBXpb`iÆú»jÌÝÅ éD260 * 実行状態のタスク 261 * 262 * 実行状態のタスク(=プロセッサがコンテキストを持っているタスク)の 263 * TCBを指すポインタ.実行状態のタスクがない場合はNULLにする. 264 * 265 * サービスコールの処理中で,自タスク(サービスコールを呼び出したタス 266 * ク)に関する情報を参照する場合はp_runtskを使う.p_runtskを書き換え 267 * るのは,ディスパッチャ(と初期化処理)のみである. 287 268 */ 288 269 extern TCB *p_runtsk; 289 270 290 271 /* 291 * ÅDæÊÌ^XN292 * 293 * ÀsÅ«é^XNÌÅÅDæÊÌ^XNÌTCBðw·|C^DÀ294 * sÅ«é^XNªÈ¢êÍNULLÉ·éD295 * 296 * fBXpb`Ö~óÔÈÇCfBXpb`ªÛ¯³êÄ¢éÔÍp_runtsk297 * ÆêvµÄ¢éÆÍÀçÈ¢D272 * 最高優先順位のタスク 273 * 274 * 実行できるタスクの中で最高優先順位のタスクのTCBを指すポインタ.実 275 * 行できるタスクがない場合はNULLにする. 276 * 277 * ディスパッチ禁止状態など,ディスパッチが保留されている間はp_runtsk 278 * と一致しているとは限らない. 298 279 */ 299 280 extern TCB *p_schedtsk; 300 281 301 282 /* 302 * fBXpb`^^XNáO[`N®vtO303 * 304 * Ýnh^CPUáOnhÌoûÉCfBXpb`ܽÍ305 * ^XNáO[`ÌN®ðv·é±Æð¦·tOD283 * ディスパッチ/タスク例外処理ルーチン起動要求フラグ 284 * 285 * 割込みハンドラ/CPU例外ハンドラの出口処理に,ディスパッチまたは 286 * タスク例外処理ルーチンの起動を要求することを示すフラグ. 306 287 */ 307 288 extern bool_t reqflg; 308 289 309 290 /* 310 * ÝDæx}XNSðóÔ311 * 312 * ÝDæx}XNSðóÔŠ鱯ð¦·tOD291 * 割込み優先度マスク全解除状態 292 * 293 * 割込み優先度マスク全解除状態であることを示すフラグ. 313 294 */ 314 295 extern bool_t ipmflg; 315 296 316 297 /* 317 * fBXpb`Ö~óÔ318 * 319 * fBXpb`Ö~óÔŠ鱯ð¦·tOD298 * ディスパッチ禁止状態 299 * 300 * ディスパッチ禁止状態であることを示すフラグ. 320 301 */ 321 302 extern bool_t disdsp; 322 303 323 304 /* 324 * ^XNfBXpb`Â\óÔ325 * 326 * ÝDæx}XNSðóÔÅ èCfBXpb`ÂóÔÅ éifB327 * Xpb`Ö~óÔÅÈ¢j±Æð¦·tOD305 * タスクディスパッチ可能状態 306 * 307 * 割込み優先度マスク全解除状態であり,ディスパッチ許可状態である(ディ 308 * スパッチ禁止状態でない)ことを示すフラグ. 328 309 */ 329 310 extern bool_t dspflg; 330 311 331 312 /* 332 * fBL 333 [ 334 * 335 * fBL 336 [ÍCÀsÅ«éóÔÌ^XNðÇ·é½ßÌL 337 [Å éD 338 * ÀsóÔÌ^XNàǵĢé½ßCfBiÀsÂ\jL 339 [Æ¢¤ 340 * ¼ÌͳmÅÍÈ¢ªCfBL 341 [Æ¢¤¼Ìªè 342 µÄ¢é½ßC± 343 * ̼ÌÅÄÔ±ÆÉ·éD 344 * 345 * fBL 346 [ÍCDæx²ÆÌ^XNL 347 [Å\¬³êÄ¢éD^XNÌ 348 * TCBÍCY·éDæxÌL 349 [Éo^³êéD 313 * レディキュー 314 * 315 * レディキューは,実行できる状態のタスクを管理するためのキューである. 316 * 実行状態のタスクも管理しているため,レディ(実行可能)キューという 317 * 名称は正確ではないが,レディキューという名称が定着しているため,こ 318 * の名称で呼ぶことにする. 319 * 320 * レディキューは,優先度ごとのタスクキューで構成されている.タスクの 321 * TCBは,該当する優先度のキューに登録される. 350 322 */ 351 323 extern QUEUE ready_queue[TNUM_TPRI]; 352 324 353 325 /* 354 * fBL 355 [T[`̽ßÌrbg}bv 356 * 357 * fBL 358 [ÌT[`ðø¦æs¤½ßÉCDæx²ÆÌ^XNL 359 [ 360 * É^XNªüÁÄ¢é©Ç¤©ð¦·rbg}bvðpӵĢéDrb 361 * g}bvðg¤±ÆÅCANZXÌñð¸ç·±ÆªÅ«éªC 362 * rbgì½ßª[ÀµÄ¢È¢vZbTÅCDæxÌiKªÈ¢ 363 * êÉÍCrbg}bvìÌI[o[wbh̽ßÉCtÉø¦ª¿ 364 * éÂ\«à éD 365 * 366 * Dæxª16iKŠ鱯ð¼èµÄ¢é½ßCuint16_t^ƵĢéD 326 * レディキューサーチのためのビットマップ 327 * 328 * レディキューのサーチを効率よく行うために,優先度ごとのタスクキュー 329 * にタスクが入っているかどうかを示すビットマップを用意している.ビッ 330 * トマップを使うことで,メモリアクセスの回数を減らすことができるが, 331 * ビット操作命令が充実していないプロセッサで,優先度の段階数が少ない 332 * 場合には,ビットマップ操作のオーバーヘッドのために,逆に効率が落ち 333 * る可能性もある. 334 * 335 * 優先度が16段階であることを仮定しているため,uint16_t型としている. 367 336 */ 368 337 extern uint16_t ready_primap; 369 338 370 339 /* 371 * gpµÄ¢È¢TCBÌXg340 * 使用していないTCBのリスト 372 341 */ 373 342 extern QUEUE free_tcb; 374 343 375 344 /* 376 * ^XNIDÌÅålikernel_cfg.cj345 * タスクIDの最大値(kernel_cfg.c) 377 346 */ 378 347 extern const ID tmax_tskid; … … 380 349 381 350 /* 382 * ^XNú»ubNÌGAikernel_cfg.cj351 * タスク初期化ブロックのエリア(kernel_cfg.c) 383 352 */ 384 353 extern const TINIB tinib_table[]; … … 386 355 387 356 /* 388 * ^XN¶¬e[uikernel_cfg.cj357 * タスク生成順序テーブル(kernel_cfg.c) 389 358 */ 390 359 extern const ID torder_table[]; 391 360 392 361 /* 393 * TCB ÌGAikernel_cfg.cj362 * TCBのエリア(kernel_cfg.c) 394 363 */ 395 364 extern TCB tcb_table[]; 396 365 397 366 /* 398 * ^XNÌ367 * タスクの数 399 368 */ 400 369 #define tnum_tsk ((uint_t)(tmax_tskid - TMIN_TSKID + 1)) … … 402 371 403 372 /* 404 * ^XNID©çTCBðæèo·½ßÌ}N373 * タスクIDからTCBを取り出すためのマクロ 405 374 */ 406 375 #define INDEX_TSK(tskid) ((uint_t)((tskid) - TMIN_TSKID)) … … 409 378 410 379 /* 411 * TCB ©ç^XNIDðæèo·½ßÌ}N380 * TCBからタスクIDを取り出すためのマクロ 412 381 */ 413 382 #define TSKID(p_tcb) ((ID)(((p_tcb) - tcb_table) + TMIN_TSKID)) 414 383 415 384 /* 416 * ^XNÇW 417 [Ìú» 385 * タスク管理モジュールの初期化 418 386 */ 419 387 extern void initialize_task(void); 420 388 421 389 /* 422 * ÅDæÊ^XNÌT[` 423 * 424 * fBL 425 [ÌÅDæÊÌ^XNðT[`µC»ÌTCBÖÌ|C^ 426 * ðÔ·DfBL 427 [ªóÌêÉÍC±ÌÖðÄÑoµÄÍÈçÈ¢D 390 * 最高優先順位タスクのサーチ 391 * 392 * レディキュー中の最高優先順位のタスクをサーチし,そのTCBへのポインタ 393 * を返す.レディキューが空の場合には,この関数を呼び出してはならない. 428 394 */ 429 395 extern TCB *search_schedtsk(void); 430 396 431 397 /* 432 * ÀsÅ«éóÔÖÌJÚ 433 * 434 * p_tcbÅwè³êé^XNðfBL 435 [É}ü·éDfBL 436 [É}ü 437 * µ½^XNÌDæxªCÅDæÊÌ^XNÌDæxæèà¢êÍC 438 * ÅDæÊÌ^XNðXVµCfBXpb`ÂóÔÅ êÎtrueðÔ 439 * ·D»¤ÅÈ¢êÍfalseðÔ·D 398 * 実行できる状態への遷移 399 * 400 * p_tcbで指定されるタスクをレディキューに挿入する.レディキューに挿入 401 * したタスクの優先度が,最高優先順位のタスクの優先度よりも高い場合は, 402 * 最高優先順位のタスクを更新し,ディスパッチ許可状態であればtrueを返 403 * す.そうでない場合はfalseを返す. 440 404 */ 441 405 extern bool_t make_runnable(TCB *p_tcb); 442 406 443 407 /* 444 * ÀsÅ«éóÔ©ç¼ÌóÔÖÌJÚ 445 * 446 * p_tcbÅwè³êé^XNðfBL 447 [©çí·éDp_tcbÅwèµ½ 448 * ^XNªÅDæÊÌ^XNÅ Á½êÉÍCÅDæÊÌ^XN 449 * ðÝèµÈ¨µCfBXpb`ÂóÔÅ êÎtrueðÔ·D»¤ÅÈ¢ 450 * êÍfalseðÔ·D^XNÌóÔÍXVµÈ¢D 408 * 実行できる状態から他の状態への遷移 409 * 410 * p_tcbで指定されるタスクをレディキューから削除する.p_tcbで指定した 411 * タスクが最高優先順位のタスクであった場合には,最高優先順位のタスク 412 * を設定しなおし,ディスパッチ許可状態であればtrueを返す.そうでない 413 * 場合はfalseを返す.タスクの状態は更新しない. 451 414 */ 452 415 extern bool_t make_non_runnable(TCB *p_tcb); 453 416 454 417 /* 455 * x~óÔÖÌJÚ456 * 457 * p_tcb Åwè³êé^XNÌóÔðx~óÔÆ·éDܽC^XNÌN®458 * Éú»·×«ÏÌú»ÆC^XNN®Ì½ßÌReLXgðÝ459 * è·éD418 * 休止状態への遷移 419 * 420 * p_tcbで指定されるタスクの状態を休止状態とする.また,タスクの起動 421 * 時に初期化すべき変数の初期化と,タスク起動のためのコンテキストを設 422 * 定する. 460 423 */ 461 424 extern void make_dormant(TCB *p_tcb); 462 425 463 426 /* 464 * x~óÔ©çÀsÅ«éóÔÖÌJÚ465 * 466 * p_tcb Åwè³êé^XNÌóÔðx~óÔ©çÀsÅ«éóÔÆ·éD467 * ÀsÅ«éóÔÉJÚµ½^XNÖÌfBXpb`ªKvÈêÍtrueC468 * »¤ÅÈ¢êÍfalseðÔ·D427 * 休止状態から実行できる状態への遷移 428 * 429 * p_tcbで指定されるタスクの状態を休止状態から実行できる状態とする. 430 * 実行できる状態に遷移したタスクへのディスパッチが必要な場合はtrue, 431 * そうでない場合はfalseを返す. 469 432 */ 470 433 extern bool_t make_active(TCB *p_tcb); 471 434 472 435 /* 473 * ^XNÌDæxÌÏX474 * 475 * p_tcb Åwè³êé^XNÌDæxðnewpriià\»jÉÏX·éDܽC476 * KvÈêÉÍÅDæÊÌ^XNðXVµCfBXpb`ÂóÔÅ477 * êÎtrueðÔ·D»¤ÅÈ¢êÍfalseðÔ·D436 * タスクの優先度の変更 437 * 438 * p_tcbで指定されるタスクの優先度をnewpri(内部表現)に変更する.また, 439 * 必要な場合には最高優先順位のタスクを更新し,ディスパッチ許可状態で 440 * あればtrueを返す.そうでない場合はfalseを返す. 478 441 */ 479 442 extern bool_t change_priority(TCB *p_tcb, uint_t newpri); 480 443 481 444 /* 482 * fBL 483 [Ìñ] 484 * 485 * fBL 486 [ÌCpriÅwè³êéDæxÌ^XNL 487 [ðñ]³¹éD 488 * ܽCKvÈêÉÍÅDæÊÌ^XNðÏXµCfBXpb`ªÛ 489 * ¯³êĢȯêÎtrueðÔ·D»¤ÅÈ¢êÍfalseðÔ·D 445 * レディキューの回転 446 * 447 * レディキュー中の,priで指定される優先度のタスクキューを回転させる. 448 * また,必要な場合には最高優先順位のタスクを変更し,ディスパッチが保 449 * 留されていなければtrueを返す.そうでない場合はfalseを返す. 490 450 */ 491 451 extern bool_t rotate_ready_queue(uint_t pri); 492 452 493 453 /* 494 * ^XNáO[`ÌÄoµ495 * 496 * ^XNáO[`ðÄÑo·DÄÑo·OÉCÀsóÔÌ^XNÌ497 * Û¯áOvöðNAµC^XNáOÖ~óÔɵCCPUbNðð498 * ·éD499 * 500 * ^XNáO[`©çßéÆCܸCPUbNóÔÉßµC»ÌÔ501 * ÉÛ¯áOvöª0ÅÈÈÁÄ¢êÎCÄÑ^XNáO[`ð502 * ÄÑo·DÛ¯áOvöª0ÌêÉÍCáOÂóÔɵÄÖ©503 * ç^[·éD504 * 505 * ±ÌÖÍCÀsóÔÌ^XNªC^XNáOÂóÔienatexª506 * true jÅCÛ¯áOvöª0ÅÈ¢itexptnª0ÅÈ¢jêÉÄÑo·±507 * ÆðzèµÄ¢éD±ÌÖÍCCPUbNóÔÅÄÑo³È¯êÎÈç508 * È¢D454 * タスク例外処理ルーチンの呼出し 455 * 456 * タスク例外処理ルーチンを呼び出す.呼び出す前に,実行状態のタスクの 457 * 保留例外要因をクリアし,タスク例外処理禁止状態にし,CPUロックを解 458 * 除する. 459 * 460 * タスク例外処理ルーチンから戻ると,まずCPUロック状態に戻し,その間 461 * に保留例外要因が0でなくなっていれば,再びタスク例外処理ルーチンを 462 * 呼び出す.保留例外要因が0の場合には,例外処理許可状態にして関数か 463 * らリターンする. 464 * 465 * この関数は,実行状態のタスクが,タスク例外処理許可状態(enatexが 466 * true)で,保留例外要因が0でない(texptnが0でない)場合に呼び出すこ 467 * とを想定している.この関数は,CPUロック状態で呼び出さなければなら 468 * ない. 509 469 */ 510 470 extern void call_texrtn(void); 511 471 512 472 /* 513 * ^XNáO[`ÌN®514 * 515 * ÀsóÔÌ^XNª^XNáO[`ÌN®ðð½µÄ¢êÎC516 * ^XNáO[`ðÄÑo·DCPUáO[`ðÄÑo·517 * ÍCêIÉCPUbNðð·éD518 * 519 * ±ÌÖÍCfBXpb`âÝnh^CPUáOnhÌoû520 * ©çÄÑo³ê鱯ðzèµÄ¢éD±ÌÖÍCCPUbNóÔ521 * ÅÄÑo³È¯êÎÈçÈ¢D522 * 523 * Àsø¦ðã°é½ßÉC±ÌÖð^[Qbg˶ÅLqµÄàæ¢D524 * »ÌêÉÍCOMIT_CALLTEXð}Nè`·éD473 * タスク例外処理ルーチンの起動 474 * 475 * 実行状態のタスクがタスク例外処理ルーチンの起動条件を満たしていれば, 476 * タスク例外処理ルーチンを呼び出す.CPU例外処理ルーチンを呼び出す時 477 * は,一時的にCPUロックを解除する. 478 * 479 * この関数は,ディスパッチャや割込みハンドラ/CPU例外ハンドラの出口 480 * 処理から呼び出されることを想定している.この関数は,CPUロック状態 481 * で呼び出さなければならない. 482 * 483 * 実行効率を上げるために,この関数をターゲット依存部で記述してもよい. 484 * その場合には,OMIT_CALLTEXをマクロ定義する. 525 485 */ 526 486 extern void calltex(void); -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.