Changeset 389 for azure_iot_hub/trunk/asp3_dcre/kernel/mutex.c
- 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.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;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 55 #ifndef LOG_ACRE_MTX_ENTER … … 133 118 134 119 /* 135 * ãã¥ã¼ããã¯ã¹ã®æ°120 * ミューテックスの数 136 121 */ 137 122 #define tnum_mtx ((uint_t)(tmax_mtxid - TMIN_MTXID + 1)) … … 139 124 140 125 /* 141 * ãã¥ã¼ããã¯ã¹IDãããã¥ã¼ããã¯ã¹ç®¡çãããã¯ãåãåºãããã®ãã¯ã126 * ミューテックスIDからミューテックス管理ブロックを取り出すためのマクロ 142 127 */ 143 128 #define INDEX_MTX(mtxid) ((uint_t)((mtxid) - TMIN_MTXID)) … … 145 130 146 131 /* 147 * ãã¥ã¼ããã¯ã¹ã®ãããã³ã«ãå¤æãããã¯ã132 * ミューテックスのプロトコルを判断するマクロ 148 133 */ 149 134 #define MTXPROTO_MASK 0x03U … … 154 139 155 140 /* 156 * 使ç¨ãã¦ããªããã¥ã¼ããã¯ã¹ç®¡çãããã¯ã®ãªã¹ã141 * 使用していないミューテックス管理ブロックのリスト 157 142 */ 158 143 QUEUE free_mtxcb; 159 144 160 145 /* 161 * ãã¥ã¼ããã¯ã¹æ©è½ã®åæå146 * ミューテックス機能の初期化 162 147 */ 163 148 void … … 191 176 192 177 /* 193 * ä¸éåªå 194 度éåã®ãã§ã㯠178 * 上限優先度違反のチェック 195 179 */ 196 180 #ifdef TOPPERS_mtxchk … … 202 186 203 187 /* 204 * ã¿ã¹ã¯ãããã¯ãã¦ããåªå 205 度ä¸éãã¥ã¼ããã¯ã¹ã®ä¸ã§ï¼ä¸éåªå 206 207 * 度ãbpriorityãããä½ããã®ãããã°ï¼falseãè¿ãï¼ 188 * タスクがロックしている優先度上限ミューテックスの中で,上限優先 189 * 度がbpriorityよりも低いものがあれば,falseを返す. 208 190 */ 209 191 p_mtxcb = p_tcb->p_lastmtx; … … 216 198 217 199 /* 218 * ã¿ã¹ã¯ãåªå 219 度ä¸éãã¥ã¼ããã¯ã¹ã®ããã¯ãå¾ 220 ã£ã¦ããå ´åã«ï¼ã 221 * ã®ä¸éåªå 222 度ãbpriorityãããä½ãããã°ï¼falseãè¿ãï¼ 200 * タスクが優先度上限ミューテックスのロックを待っている場合に,そ 201 * の上限優先度がbpriorityよりも低くければ,falseを返す. 223 202 */ 224 203 if (TSTAT_WAIT_MTX(p_tcb->tstat)) { … … 230 209 231 210 /* 232 * ãããã®æ¡ä»¶ã«ãå½ã¦ã¯ã¾ããªããã°trueãè¿ãï¼211 * いずれの条件にも当てはまらなければtrueを返す. 233 212 */ 234 213 return(true); … … 238 217 239 218 /* 240 * åªå 241 度ä¸éãã¥ã¼ããã¯ã¹ãããã¯ãã¦ãããã®ãã§ã㯠219 * 優先度上限ミューテックスをロックしているかのチェック 242 220 */ 243 221 #ifdef TOPPERS_mtxscan … … 261 239 262 240 /* 263 * ã¿ã¹ã¯ã®ç¾å¨åªå 264 度ã®è¨ç® 241 * タスクの現在優先度の計算 265 242 * 266 * p_tcbã§æå®ãããã¿ã¹ã¯ã®ç¾å¨åªå 267 度ï¼ã«è¨å®ãã¹ãå¤ï¼ãè¨ç®ããï¼ 243 * p_tcbで指定されるタスクの現在優先度(に設定すべき値)を計算する. 268 244 */ 269 245 Inline uint_t … … 285 261 286 262 /* 287 * ãã¥ã¼ããã¯ã¹ã解æ¾ããå ´åã®ç¾å¨åªå 288 度å¤æ´å¦ç 263 * ミューテックスを解放した場合の現在優先度変更処理 289 264 */ 290 265 #ifdef TOPPERS_mtxdrop … … 307 282 308 283 /* 309 * ãã¥ã¼ããã¯ã¹ã®ããã¯284 * ミューテックスのロック 310 285 */ 311 286 #ifdef TOPPERS_mtxacq … … 326 301 327 302 /* 328 * ãã¥ã¼ããã¯ã¹ã®ããã¯è§£é¤303 * ミューテックスのロック解除 329 304 */ 330 305 #ifdef TOPPERS_mtxrel … … 340 315 else { 341 316 /* 342 * ãã¥ã¼ããã¯ã¹å¾ 343 ã¡ãã¥ã¼ã®å 344 é ã¿ã¹ã¯ï¼p_tcbï¼ã«ï¼ãã¥ã¼ãã 345 * ã¯ã¹ãããã¯ãããï¼ 317 * ミューテックス待ちキューの先頭タスク(p_tcb)に,ミューテッ 318 * クスをロックさせる. 346 319 */ 347 320 p_tcb = (TCB *) queue_delete_next(&(p_mtxcb->wait_queue)); … … 364 337 365 338 /* 366 * ã¿ã¹ã¯ãããã¯ãã¦ãããã¹ã¦ã®ãã¥ã¼ããã¯ã¹ã®ããã¯è§£é¤339 * タスクがロックしているすべてのミューテックスのロック解除 367 340 */ 368 341 #ifdef TOPPERS_mtxrela … … 382 355 383 356 /* 384 * ãã¥ã¼ããã¯ã¹ã®çæï¼»NGKI2022ï¼½357 * ミューテックスの生成[NGKI2022] 385 358 */ 386 359 #ifdef TOPPERS_acre_mtx … … 396 369 397 370 LOG_ACRE_MTX_ENTER(pk_cmtx); 398 CHECK_TSKCTX_UNL(); /* ï¼»NGKI2023][NGKI2024ï¼½*/371 CHECK_TSKCTX_UNL(); /*[NGKI2023][NGKI2024]*/ 399 372 400 373 mtxatr = pk_cmtx->mtxatr; … … 402 375 403 376 if (mtxatr == TA_CEILING) { 404 CHECK_PAR(VALID_TPRI(ceilpri)); /* ï¼»NGKI2037ï¼½*/405 } 406 else { 407 CHECK_RSATR(mtxatr, TA_TPRI); /* ï¼»NGKI2025ï¼½*/377 CHECK_PAR(VALID_TPRI(ceilpri)); /*[NGKI2037]*/ 378 } 379 else { 380 CHECK_RSATR(mtxatr, TA_TPRI); /*[NGKI2025]*/ 408 381 } 409 382 410 383 lock_cpu(); 411 384 if (tnum_mtx == 0 || queue_empty(&free_mtxcb)) { 412 ercd = E_NOID; /* ï¼»NGKI2031ï¼½*/385 ercd = E_NOID; /*[NGKI2031]*/ 413 386 } 414 387 else { … … 419 392 420 393 queue_initialize(&(p_mtxcb->wait_queue)); 421 p_mtxcb->p_loctsk = NULL; /* ï¼»NGKI2033ï¼½*/394 p_mtxcb->p_loctsk = NULL; /*[NGKI2033]*/ 422 395 ercd = MTXID(p_mtxcb); 423 396 } … … 432 405 433 406 /* 434 * ãã¥ã¼ããã¯ã¹ã®åé¤ï¼»NGKI2056ï¼½407 * ミューテックスの削除[NGKI2056] 435 408 */ 436 409 #ifdef TOPPERS_del_mtx … … 445 418 446 419 LOG_DEL_MTX_ENTER(mtxid); 447 CHECK_TSKCTX_UNL(); /* ï¼»NGKI2057][NGKI2058ï¼½*/448 CHECK_ID(VALID_MTXID(mtxid)); /* ï¼»NGKI2059ï¼½*/420 CHECK_TSKCTX_UNL(); /*[NGKI2057][NGKI2058]*/ 421 CHECK_ID(VALID_MTXID(mtxid)); /*[NGKI2059]*/ 449 422 p_mtxcb = get_mtxcb(mtxid); 450 423 451 424 lock_cpu(); 452 425 if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { 453 ercd = E_NOEXS; /* ï¼»NGKI2060ï¼½*/426 ercd = E_NOEXS; /*[NGKI2060]*/ 454 427 } 455 428 else if (mtxid <= tmax_smtxid) { 456 ercd = E_OBJ; /* ï¼»NGKI2062ï¼½*/457 } 458 else { 459 init_wait_queue(&(p_mtxcb->wait_queue)); /* ï¼»NGKI2065ï¼½*/429 ercd = E_OBJ; /*[NGKI2062]*/ 430 } 431 else { 432 init_wait_queue(&(p_mtxcb->wait_queue)); /*[NGKI2065]*/ 460 433 p_loctsk = p_mtxcb->p_loctsk; 461 434 if (p_loctsk != NULL) { 462 435 /* 463 * p_loctskãããã¯ãã¦ãããã¥ã¼ããã¯ã¹ã®ãªã¹ããã対象 464 * ãã¥ã¼ã¯ã¹ãåé¤ãï¼å¿ 465 è¦ãªå ´åã«ã¯p_loctskã®ç¾å¨åªå 466 度 467 * ãå¤æ´ããï¼»NGKI2064ï¼½ï¼ 436 * p_loctskがロックしているミューテックスのリストから対象 437 * ミュークスを削除し,必要な場合にはp_loctskの現在優先度 438 * を変更する[NGKI2064]. 468 439 */ 469 440 pp_prevmtx = &(p_loctsk->p_lastmtx); … … 478 449 } 479 450 p_mtxinib = (MTXINIB *)(p_mtxcb->p_mtxinib); 480 p_mtxinib->mtxatr = TA_NOEXS; /* ï¼»NGKI2063ï¼½*/451 p_mtxinib->mtxatr = TA_NOEXS; /*[NGKI2063]*/ 481 452 queue_insert_prev(&free_mtxcb, &(p_mtxcb->wait_queue)); 482 453 if (p_runtsk != p_schedtsk) { … … 495 466 496 467 /* 497 * ãã¥ã¼ããã¯ã¹ã®ããã¯468 * ミューテックスのロック 498 469 */ 499 470 #ifdef TOPPERS_loc_mtx … … 525 496 mutex_acquire(p_runtsk, p_mtxcb); 526 497 /* 527 * åªå 528 度ä¸éãã¥ã¼ããã¯ã¹ãããã¯ããå ´åï¼p_runtskã®åªå 529 度 530 * ãä¸ããå¯è½æ§ããããï¼ãã£ã¹ããããå¿ 531 è¦ã«ãªããã¨ã¯ãªãï¼ 498 * 優先度上限ミューテックスをロックした場合,p_runtskの優先度 499 * が上がる可能性があるが,ディスパッチが必要になることはない. 532 500 */ 533 501 assert(p_runtsk == p_schedtsk); … … 553 521 554 522 /* 555 * ãã¥ã¼ããã¯ã¹ã®ããã¯ï¼ãã¼ãªã³ã°ï¼523 * ミューテックスのロック(ポーリング) 556 524 */ 557 525 #ifdef TOPPERS_ploc_mtx … … 579 547 mutex_acquire(p_runtsk, p_mtxcb); 580 548 /* 581 * åªå 582 度ä¸éãã¥ã¼ããã¯ã¹ãããã¯ããå ´åï¼p_runtskã®åªå 583 度 584 * ãä¸ããå¯è½æ§ããããï¼ãã£ã¹ããããå¿ 585 è¦ã«ãªããã¨ã¯ãªãï¼ 549 * 優先度上限ミューテックスをロックした場合,p_runtskの優先度 550 * が上がる可能性があるが,ディスパッチが必要になることはない. 586 551 */ 587 552 assert(p_runtsk == p_schedtsk); … … 604 569 605 570 /* 606 * ãã¥ã¼ããã¯ã¹ã®ããã¯ï¼ã¿ã¤ã ã¢ã¦ãããï¼571 * ミューテックスのロック(タイムアウトあり) 607 572 */ 608 573 #ifdef TOPPERS_tloc_mtx … … 636 601 mutex_acquire(p_runtsk, p_mtxcb); 637 602 /* 638 * åªå 639 度ä¸éãã¥ã¼ããã¯ã¹ãããã¯ããå ´åï¼p_runtskã®åªå 640 度 641 * ãä¸ããå¯è½æ§ããããï¼ãã£ã¹ããããå¿ 642 è¦ã«ãªããã¨ã¯ãªãï¼ 603 * 優先度上限ミューテックスをロックした場合,p_runtskの優先度 604 * が上がる可能性があるが,ディスパッチが必要になることはない. 643 605 */ 644 606 assert(p_runtsk == p_schedtsk); … … 668 630 669 631 /* 670 * ãã¥ã¼ããã¯ã¹ã®ããã¯è§£é¤632 * ミューテックスのロック解除 671 633 */ 672 634 #ifdef TOPPERS_unl_mtx … … 709 671 710 672 /* 711 * ãã¥ã¼ããã¯ã¹ã®ååæå673 * ミューテックスの再初期化 712 674 */ 713 675 #ifdef TOPPERS_ini_mtx … … 759 721 760 722 /* 761 * ãã¥ã¼ããã¯ã¹ã®ç¶æ 762 åç 763 § 723 * ミューテックスの状態参照 764 724 */ 765 725 #ifdef TOPPERS_ref_mtx
Note:
See TracChangeset
for help on using the changeset viewer.