Changeset 389 for azure_iot_hub/trunk/asp3_dcre/kernel/mutex.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/mutex.h
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-chdr
totext/x-chdr;charset=UTF-8
r388 r389 7 7 * Graduate School of Information Science, Nagoya Univ., JAPAN 8 8 * 9 * ä¸è¨èä½æ¨©è 10 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 11 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 12 * å¤ã»åé 13 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 14 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 15 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 16 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 17 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 18 * ç¨ã§ããå½¢ã§åé 19 å¸ããå ´åã«ã¯ï¼åé 20 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 21 * è 22 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 23 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 24 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 25 * ç¨ã§ããªãå½¢ã§åé 26 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 27 * ã¨ï¼ 28 * (a) åé 29 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 30 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 31 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 32 * (b) åé 33 å¸ã®å½¢æ 34 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 35 * å ±åãããã¨ï¼ 36 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 37 * 害ãããï¼ä¸è¨èä½æ¨©è 38 ããã³TOPPERSããã¸ã§ã¯ããå 39 責ãããã¨ï¼ 40 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 41 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 42 ããã³TOPPERSããã¸ã§ã¯ãã 43 * å 44 責ãããã¨ï¼ 9 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 14 * スコード中に含まれていること. 15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 18 * の無保証規定を掲載すること. 19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 21 * と. 22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 23 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 25 * 報告すること. 26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 30 * 免責すること. 45 31 * 46 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 47 ã 48 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 49 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 50 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 51 * ã®è²¬ä»»ãè² ããªãï¼ 32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 36 * の責任を負わない. 52 37 * 53 38 * $Id$ … … 55 40 56 41 /* 57 * ãã¥ã¼ããã¯ã¹æ©è½42 * ミューテックス機能 58 43 */ 59 44 … … 66 51 67 52 /* 68 * ãã¥ã¼ããã¯ã¹åæåãããã¯53 * ミューテックス初期化ブロック 69 54 * 70 * ãã®æ§é ä½ã¯ï¼åæã»éä¿¡ãªãã¸ã§ã¯ãã®åæåãããã¯ã®å 71 ±éé¨å 72 * ï¼WOBJINIBï¼ãæ¡å¼µï¼ãªãã¸ã§ã¯ãæåè¨èªã®ç¶æ¿ã«ç¸å½ï¼ãããã®ã§ï¼ 73 * æåã®ãã£ã¼ã«ããå 74 ±éã«ãªã£ã¦ããï¼ 55 * この構造体は,同期・通信オブジェクトの初期化ブロックの共通部分 56 * (WOBJINIB)を拡張(オブジェクト指向言語の継承に相当)したもので, 57 * 最初のフィールドが共通になっている. 75 58 */ 76 59 typedef struct mutex_initialization_block { 77 ATR mtxatr; /* ãã¥ã¼ããã¯ã¹å±æ§ */ 78 uint_t ceilpri; /* ãã¥ã¼ããã¯ã¹ã®ä¸éåªå 79 度ï¼å 80 é¨è¡¨ç¾ï¼*/ 60 ATR mtxatr; /* ミューテックス属性 */ 61 uint_t ceilpri; /* ミューテックスの上限優先度(内部表現)*/ 81 62 } MTXINIB; 82 63 83 64 /* 84 * ãã¥ã¼ããã¯ã¹ç®¡çãããã¯65 * ミューテックス管理ブロック 85 66 * 86 * ãã®æ§é ä½ã¯ï¼åæã»éä¿¡ãªãã¸ã§ã¯ãã®ç®¡çãããã¯ã®å 87 ±éé¨åï¼WOBJCBï¼ 88 * ãæ¡å¼µï¼ãªãã¸ã§ã¯ãæåè¨èªã®ç¶æ¿ã«ç¸å½ï¼ãããã®ã§ï¼æåã®2ã¤ã® 89 * ãã£ã¼ã«ããå 90 ±éã«ãªã£ã¦ããï¼ 67 * この構造体は,同期・通信オブジェクトの管理ブロックの共通部分(WOBJCB) 68 * を拡張(オブジェクト指向言語の継承に相当)したもので,最初の2つの 69 * フィールドが共通になっている. 91 70 */ 92 71 struct mutex_control_block { 93 QUEUE wait_queue; /* ãã¥ã¼ããã¯ã¹å¾ 94 ã¡ãã¥ã¼ */ 95 const MTXINIB *p_mtxinib; /* åæåãããã¯ã¸ã®ãã¤ã³ã¿ */ 96 TCB *p_loctsk; /* ãã¥ã¼ããã¯ã¹ãããã¯ãã¦ããã¿ã¹ã¯ */ 97 MTXCB *p_prevmtx; /* ãã®åã«ããã¯ãããã¥ã¼ããã¯ã¹ */ 72 QUEUE wait_queue; /* ミューテックス待ちキュー */ 73 const MTXINIB *p_mtxinib; /* 初期化ブロックへのポインタ */ 74 TCB *p_loctsk; /* ミューテックスをロックしているタスク */ 75 MTXCB *p_prevmtx; /* この前にロックしたミューテックス */ 98 76 }; 99 77 100 78 /* 101 * ãã¥ã¼ããã¯ã¹å¾ 102 ã¡æ 103 å ±ãããã¯ã®å®ç¾© 79 * ミューテックス待ち情報ブロックの定義 104 80 * 105 * ãã®æ§é ä½ã¯ï¼åæã»éä¿¡ãªãã¸ã§ã¯ãã®å¾ 106 ã¡æ 107 å ±ãããã¯ã®å 108 ±éé¨å 109 * ï¼WINFO_WOBJï¼ãæ¡å¼µï¼ãªãã¸ã§ã¯ãæåè¨èªã®ç¶æ¿ã«ç¸å½ï¼ãããã®ã§ï¼ 110 * ãã¹ã¦ã®ãã£ã¼ã«ããå 111 ±éã«ãªã£ã¦ããï¼ 81 * この構造体は,同期・通信オブジェクトの待ち情報ブロックの共通部分 82 * (WINFO_WOBJ)を拡張(オブジェクト指向言語の継承に相当)したもので, 83 * すべてのフィールドが共通になっている. 112 84 */ 113 85 typedef struct mutex_waiting_information { 114 WINFO winfo; /* æ¨æºã®å¾ 115 ã¡æ 116 å ±ããã㯠*/ 117 MTXCB *p_mtxcb; /* å¾ 118 ã£ã¦ãããã¥ã¼ããã¯ã¹ã®ç®¡çããã㯠*/ 86 WINFO winfo; /* 標準の待ち情報ブロック */ 87 MTXCB *p_mtxcb; /* 待っているミューテックスの管理ブロック */ 119 88 } WINFO_MTX; 120 89 121 90 /* 122 * 使ç¨ãã¦ããªããã¥ã¼ããã¯ã¹ç®¡çãããã¯ã®ãªã¹ã91 * 使用していないミューテックス管理ブロックのリスト 123 92 */ 124 93 extern QUEUE free_mtxcb; 125 94 126 95 /* 127 * ãã¥ã¼ããã¯ã¹IDã®æ大å¤ï¼kernel_cfg.cï¼96 * ミューテックスIDの最大値(kernel_cfg.c) 128 97 */ 129 98 extern const ID tmax_mtxid; … … 131 100 132 101 /* 133 * ãã¥ã¼ããã¯ã¹åæåãããã¯ã®ã¨ãªã¢ï¼kernel_cfg.cï¼102 * ミューテックス初期化ブロックのエリア(kernel_cfg.c) 134 103 */ 135 104 extern const MTXINIB mtxinib_table[]; … … 137 106 138 107 /* 139 * ãã¥ã¼ããã¯ã¹ç®¡çãããã¯ã®ã¨ãªã¢ï¼kernel_cfg.cï¼108 * ミューテックス管理ブロックのエリア(kernel_cfg.c) 140 109 */ 141 110 extern MTXCB mtxcb_table[]; 142 111 143 112 /* 144 * ãã¥ã¼ããã¯ã¹ç®¡çãããã¯ãããã¥ã¼ããã¯ã¹IDãåãåºãããã®ãã¯ã113 * ミューテックス管理ブロックからミューテックスIDを取り出すためのマクロ 145 114 */ 146 115 #define MTXID(p_mtxcb) ((ID)(((p_mtxcb) - mtxcb_table) + TMIN_MTXID)) 147 116 148 117 /* 149 * ãã¥ã¼ããã¯ã¹æ©è½ã®åæå118 * ミューテックス機能の初期化 150 119 */ 151 120 extern void initialize_mutex(void); 152 121 153 122 /* 154 * ä¸éåªå 155 度éåã®ãã§ã㯠123 * 上限優先度違反のチェック 156 124 * 157 * chg_priã®ä¸ã§ä¸éåªå 158 度éåã®ãã§ãã¯ãè¡ãããã«ç¨ããé¢æ°ã§ããï¼ 159 * p_tcbã§æå®ãããã¿ã¹ã¯ãããã¯ãã¦ããåªå 160 度ä¸éãã¥ã¼ããã¯ã¹ã¨ï¼ 161 * ããã¯ãå¾ 162 ã£ã¦ããåªå 163 度ä¸éãã¥ã¼ããã¯ã¹ã®ä¸ã§ï¼ä¸éåªå 164 度ã 165 * bpriorityãããä½ããã®ãããã°falseãï¼ããã§ãªããã°trueãè¿ãï¼ 125 * chg_priの中で上限優先度違反のチェックを行うために用いる関数であり, 126 * p_tcbで指定されるタスクがロックしている優先度上限ミューテックスと, 127 * ロックを待っている優先度上限ミューテックスの中で,上限優先度が 128 * bpriorityよりも低いものがあればfalseを,そうでなければtrueを返す. 166 129 */ 167 130 extern bool_t mutex_check_ceilpri(TCB *p_tcb, uint_t bpriority); 168 131 169 132 /* 170 * åªå 171 度ä¸éãã¥ã¼ããã¯ã¹ãããã¯ãã¦ãããã®ãã§ã㯠133 * 優先度上限ミューテックスをロックしているかのチェック 172 134 * 173 * p_tcbã§æå®ãããã¿ã¹ã¯ãåªå 174 度ä¸éãã¥ã¼ããã¯ã¹ãããã¯ãã¦ããã° 175 * trueï¼ããã§ãªããã°falseãè¿ãï¼ 135 * p_tcbで指定されるタスクが優先度上限ミューテックスをロックしていれば 136 * true,そうでなければfalseを返す. 176 137 */ 177 138 extern bool_t mutex_scan_ceilmtx(TCB *p_tcb); 178 139 179 140 /* 180 * ãã¥ã¼ããã¯ã¹ãããã¯è§£é¤ããå ´åã®ç¾å¨åªå 181 度å¤æ´å¦ç 141 * ミューテックスをロック解除した場合の現在優先度変更処理 182 142 * 183 * p_tcbã§æå®ãããã¿ã¹ã¯ãï¼p_mtxcbã§æå®ããããã¥ã¼ããã¯ã¹ããã 184 * ã¯è§£é¤ããéã®ç¾å¨åªå 185 度å¤æ´å¦çãè¡ãï¼ 143 * p_tcbで指定されるタスクが,p_mtxcbで指定されるミューテックスをロッ 144 * ク解除した際の現在優先度変更処理を行う. 186 145 */ 187 146 extern void mutex_drop_priority(TCB *p_tcb, MTXCB *p_mtxcb); 188 147 189 148 /* 190 * ãã¥ã¼ããã¯ã¹ã®ããã¯149 * ミューテックスのロック 191 150 * 192 * p_tcb ã§æå®ãããã¿ã¹ã¯ã«ï¼p_mtxcbã§æå®ããããã¥ã¼ããã¯ã¹ããã193 * ã¯ãããï¼151 * p_tcbで指定されるタスクに,p_mtxcbで指定されるミューテックスをロッ 152 * クさせる. 194 153 */ 195 154 extern void mutex_acquire(TCB *p_tcb, MTXCB *p_mtxcb); 196 155 197 156 /* 198 * ãã¥ã¼ããã¯ã¹ã®ããã¯è§£é¤157 * ミューテックスのロック解除 199 158 * 200 * p_mtxcbã§æå®ããããã¥ã¼ããã¯ã¹ãããã¯è§£é¤ããï¼ããã¯è§£é¤ãã 201 * ãã¥ã¼ããã¯ã¹ã«ï¼ããã¯å¾ 202 ã¡ç¶æ 203 ã®ã¿ã¹ã¯ãããå ´åã«ã¯ï¼ãã®ã¿ã¹ã¯ 204 * ã«ãã¥ã¼ããã¯ã¹ãããã¯ãããï¼ 159 * p_mtxcbで指定されるミューテックスをロック解除する.ロック解除した 160 * ミューテックスに,ロック待ち状態のタスクがある場合には,そのタスク 161 * にミューテックスをロックさせる. 205 162 */ 206 163 extern void mutex_release(MTXCB *p_mtxcb); 207 164 208 165 /* 209 * ã¿ã¹ã¯ãããã¯ãã¦ãããã¹ã¦ã®ãã¥ã¼ããã¯ã¹ã®ããã¯è§£é¤166 * タスクがロックしているすべてのミューテックスのロック解除 210 167 * 211 * p_tcbã§æå®ãããã¿ã¹ã¯ã«ï¼ãããããã¯ãã¦ãããã¹ã¦ã®ãã¥ã¼ãã㯠212 * ã¹ãããã¯è§£é¤ãããï¼ããã¯è§£é¤ãããã¥ã¼ããã¯ã¹ã«ï¼ããã¯å¾ 213 ã¡ç¶ 214 * æ 215 ã®ã¿ã¹ã¯ãããå ´åã«ã¯ï¼ãã®ã¿ã¹ã¯ã«ãã¥ã¼ããã¯ã¹ãããã¯ãããï¼ 168 * p_tcbで指定されるタスクに,それがロックしているすべてのミューテック 169 * スをロック解除させる.ロック解除したミューテックスに,ロック待ち状 170 * 態のタスクがある場合には,そのタスクにミューテックスをロックさせる. 216 171 * 217 * ãã®é¢æ°ã¯ï¼ã¿ã¹ã¯ã®çµäºæã«ä½¿ããããã®ã§ããããï¼p_tcbã§æå®ãã 218 * ãã¿ã¹ã¯ã®åªå 219 度ãå¤æ´ããå¦çã¯è¡ããªãï¼ãã ãï¼ãã®é¢æ°ã®ä¸ã§ä» 220 * ã®ã¿ã¹ã¯ã®åªå 221 度ãå¤åãï¼å®è¡ãã¹ãã¿ã¹ã¯ãå¤ãããã¨ãããï¼ãã® 222 * ããï¼ãã®é¢æ°ããæ»ã£ãå¾ã«ï¼ãã£ã¹ããããå¿ 223 è¦ãå¤å¥ãã¦ï¼å¿ 224 è¦ãª 225 * å ´åã«ã¯ãã£ã¹ããããè¡ããªããã°ãªããªãï¼ 172 * この関数は,タスクの終了時に使われるものであるため,p_tcbで指定され 173 * るタスクの優先度を変更する処理は行わない.ただし,この関数の中で他 174 * のタスクの優先度が変化し,実行すべきタスクが変わることがある.その 175 * ため,この関数から戻った後に,ディスパッチが必要か判別して,必要な 176 * 場合にはディスパッチを行わなければならない. 226 177 */ 227 178 extern void mutex_release_all(TCB *p_tcb);
Note:
See TracChangeset
for help on using the changeset viewer.