| 1 | /* |
|---|
| 2 | * TOPPERS/ASP Kernel |
|---|
| 3 | * Toyohashi Open Platform for Embedded Real-Time Systems/ |
|---|
| 4 | * Advanced Standard Profile Kernel |
|---|
| 5 | * |
|---|
| 6 | * Copyright (C) 2005-2012 by Embedded and Real-Time Systems Laboratory |
|---|
| 7 | * Graduate School of Information Science, Nagoya Univ., JAPAN |
|---|
| 8 | * |
|---|
| 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 | * ÌÈÀÕ€¹€ë€³€È¡¥ |
|---|
| 31 | * |
|---|
| 32 | * ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥ŸåµÃøºîž¢ŒÔ€ª |
|---|
| 33 | * €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ |
|---|
| 34 | * €ËÂЀ¹€ëŬ¹çÀ€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§ |
|---|
| 35 | * ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ |
|---|
| 36 | * €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥ |
|---|
| 37 | * |
|---|
| 38 | * @(#) $Id$ |
|---|
| 39 | */ |
|---|
| 40 | |
|---|
| 41 | /* |
|---|
| 42 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹µ¡Çœ |
|---|
| 43 | */ |
|---|
| 44 | |
|---|
| 45 | #ifndef TOPPERS_MUTEX_H |
|---|
| 46 | #define TOPPERS_MUTEX_H |
|---|
| 47 | |
|---|
| 48 | #include "wait.h" |
|---|
| 49 | |
|---|
| 50 | /* |
|---|
| 51 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹œéŽü²œ¥Ö¥í¥Ã¥¯ |
|---|
| 52 | * |
|---|
| 53 | * €³€Î¹œÂ€Â΀ϡ€Æ±Žü¡ŠÄÌ¿®¥ª¥Ö¥ž¥§¥¯¥È€ÎœéŽü²œ¥Ö¥í¥Ã¥¯€Î¶ŠÄÌÉôʬ |
|---|
| 54 | * ¡ÊWOBJINIB¡Ë€ò³ÈÄ¥¡Ê¥ª¥Ö¥ž¥§¥¯¥È»ØžþžÀžì€Î·ÑŸµ€ËÁêÅö¡Ë€·€¿€â€Î€Ç¡€ |
|---|
| 55 | * ºÇœé€Î¥Õ¥£¡Œ¥ë¥É€¬¶ŠÄ̀ˀʀÀƀ€€ë¡¥ |
|---|
| 56 | */ |
|---|
| 57 | typedef struct mutex_initialization_block { |
|---|
| 58 | ATR mtxatr; /* ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹Â°À */ |
|---|
| 59 | uint_t ceilpri; /* ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ÎŸåžÂÍ¥ÀèÅÙ¡ÊÆâÉôÉœžœ¡Ë*/ |
|---|
| 60 | } MTXINIB; |
|---|
| 61 | |
|---|
| 62 | /* |
|---|
| 63 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹ŽÉÍý¥Ö¥í¥Ã¥¯ |
|---|
| 64 | * |
|---|
| 65 | * €³€Î¹œÂ€Â΀ϡ€Æ±Žü¡ŠÄÌ¿®¥ª¥Ö¥ž¥§¥¯¥È€ÎŽÉÍý¥Ö¥í¥Ã¥¯€Î¶ŠÄÌÉôʬ¡ÊWOBJCB¡Ë |
|---|
| 66 | * €ò³ÈÄ¥¡Ê¥ª¥Ö¥ž¥§¥¯¥È»ØžþžÀžì€Î·ÑŸµ€ËÁêÅö¡Ë€·€¿€â€Î€Ç¡€ºÇœé€Î2€Ä€Î |
|---|
| 67 | * ¥Õ¥£¡Œ¥ë¥É€¬¶ŠÄ̀ˀʀÀƀ€€ë¡¥ |
|---|
| 68 | */ |
|---|
| 69 | typedef struct mutex_control_block { |
|---|
| 70 | QUEUE wait_queue; /* ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹ÂÔ€Á¥¥å¡Œ */ |
|---|
| 71 | const MTXINIB *p_mtxinib; /* œéŽü²œ¥Ö¥í¥Ã¥¯€Ø€Î¥Ý¥€¥ó¥¿ */ |
|---|
| 72 | TCB *p_loctsk; /* ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ò¥í¥Ã¥¯€·€Æ€€€ë¥¿¥¹¥¯ */ |
|---|
| 73 | QUEUE mutex_queue; /* ¥í¥Ã¥¯€·€Æ€€€ë¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€Î¥¥å¡Œ */ |
|---|
| 74 | } MTXCB; |
|---|
| 75 | |
|---|
| 76 | /* |
|---|
| 77 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹ÂÔ€ÁŸðÊó¥Ö¥í¥Ã¥¯€ÎÄêµÁ |
|---|
| 78 | * |
|---|
| 79 | * €³€Î¹œÂ€Â΀ϡ€Æ±Žü¡ŠÄÌ¿®¥ª¥Ö¥ž¥§¥¯¥È€ÎÂÔ€ÁŸðÊó¥Ö¥í¥Ã¥¯€Î¶ŠÄÌÉôʬ |
|---|
| 80 | * ¡ÊWINFO_WOBJ¡Ë€ò³ÈÄ¥¡Ê¥ª¥Ö¥ž¥§¥¯¥È»ØžþžÀžì€Î·ÑŸµ€ËÁêÅö¡Ë€·€¿€â€Î€Ç¡€ |
|---|
| 81 | * €¹€Ù€Æ€Î¥Õ¥£¡Œ¥ë¥É€¬¶ŠÄ̀ˀʀÀƀ€€ë¡¥ |
|---|
| 82 | */ |
|---|
| 83 | typedef struct mutex_waiting_information { |
|---|
| 84 | WINFO winfo; /* Éžœà€ÎÂÔ€ÁŸðÊó¥Ö¥í¥Ã¥¯ */ |
|---|
| 85 | MTXCB *p_mtxcb; /* ÂԀÀƀ€€ë¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ÎŽÉÍý¥Ö¥í¥Ã¥¯ */ |
|---|
| 86 | } WINFO_MTX; |
|---|
| 87 | |
|---|
| 88 | /* |
|---|
| 89 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹ID€ÎºÇÂçÃÍ¡Êkernel_cfg.c¡Ë |
|---|
| 90 | */ |
|---|
| 91 | extern const ID tmax_mtxid; |
|---|
| 92 | |
|---|
| 93 | /* |
|---|
| 94 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹œéŽü²œ¥Ö¥í¥Ã¥¯€Î¥š¥ê¥¢¡Êkernel_cfg.c¡Ë |
|---|
| 95 | */ |
|---|
| 96 | extern const MTXINIB mtxinib_table[]; |
|---|
| 97 | |
|---|
| 98 | /* |
|---|
| 99 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹ŽÉÍý¥Ö¥í¥Ã¥¯€Î¥š¥ê¥¢¡Êkernel_cfg.c¡Ë |
|---|
| 100 | */ |
|---|
| 101 | extern MTXCB mtxcb_table[]; |
|---|
| 102 | |
|---|
| 103 | /* |
|---|
| 104 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹ŽÉÍý¥Ö¥í¥Ã¥¯€«€é¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹ID€òŒè€êœÐ€¹€¿€á€Î¥Þ¥¯¥í |
|---|
| 105 | */ |
|---|
| 106 | #define MTXID(p_mtxcb) ((ID)(((p_mtxcb) - mtxcb_table) + TMIN_MTXID)) |
|---|
| 107 | |
|---|
| 108 | /* |
|---|
| 109 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹µ¡Çœ€ÎœéŽü²œ |
|---|
| 110 | */ |
|---|
| 111 | extern void initialize_mutex(void); |
|---|
| 112 | |
|---|
| 113 | /* |
|---|
| 114 | * ŸåžÂÍ¥ÀèÅÙ°ãÈ¿€Î¥Á¥§¥Ã¥¯ |
|---|
| 115 | * |
|---|
| 116 | * chg_pri€ÎÃæ€ÇŸåžÂÍ¥ÀèÅÙ°ãÈ¿€Î¥Á¥§¥Ã¥¯€ò¹Ô€Š€¿€á€ËÍÑ€€€ëŽØ¿ô€Ç€¢€ê¡€ |
|---|
| 117 | * p_tcb€Ç»ØÄꀵ€ì€ë¥¿¥¹¥¯€¬¥í¥Ã¥¯€·€Æ€€€ëÍ¥ÀèÅÙŸåžÂ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€È¡€ |
|---|
| 118 | * ¥í¥Ã¥¯€òÂԀÀƀ€€ëÍ¥ÀèÅÙŸåžÂ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ÎÃæ€Ç¡€ŸåžÂÍ¥ÀèÅÙ€¬ |
|---|
| 119 | * bpriority€è€ê€âÄ €â€Î€¬€¢€ì€Ðfalse€ò¡€€œ€Š€Ç€Ê€±€ì€Ðtrue€òÊÖ€¹¡¥ |
|---|
| 120 | */ |
|---|
| 121 | extern bool_t (*mtxhook_check_ceilpri)(TCB *p_tcb, uint_t bpriority); |
|---|
| 122 | extern bool_t mutex_check_ceilpri(TCB *p_tcb, uint_t bpriority); |
|---|
| 123 | |
|---|
| 124 | /* |
|---|
| 125 | * Í¥ÀèÅÙŸåžÂ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ò¥í¥Ã¥¯€·€Æ€€€ë€«€Î¥Á¥§¥Ã¥¯ |
|---|
| 126 | * |
|---|
| 127 | * p_tcb€Ç»ØÄꀵ€ì€ë¥¿¥¹¥¯€¬Í¥ÀèÅÙŸåžÂ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ò¥í¥Ã¥¯€·€Æ€€€ì€Ð |
|---|
| 128 | * true¡€€œ€Š€Ç€Ê€±€ì€Ðfalse€òÊÖ€¹¡¥ |
|---|
| 129 | */ |
|---|
| 130 | extern bool_t (*mtxhook_scan_ceilmtx)(TCB *p_tcb); |
|---|
| 131 | extern bool_t mutex_scan_ceilmtx(TCB *p_tcb); |
|---|
| 132 | |
|---|
| 133 | /* |
|---|
| 134 | * ¥¿¥¹¥¯€ÎžœºßÍ¥ÀèÅـη׻» |
|---|
| 135 | * |
|---|
| 136 | * p_tcb€Ç»ØÄꀵ€ì€ë¥¿¥¹¥¯€ÎžœºßÍ¥ÀèÅÙ¡Ê€ËÀßÄꀹ€Ù€Ã͡ˀò·×»»€¹€ë¡¥ |
|---|
| 137 | */ |
|---|
| 138 | extern uint_t mutex_calc_priority(TCB *p_tcb); |
|---|
| 139 | |
|---|
| 140 | /* |
|---|
| 141 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€Î¥í¥Ã¥¯²òœü |
|---|
| 142 | * |
|---|
| 143 | * p_mtxcb€Ç»ØÄꀵ€ì€ë¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ò¥í¥Ã¥¯²òœü€¹€ë¡¥¥í¥Ã¥¯²òœü€·€¿ |
|---|
| 144 | * ¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€Ë¡€¥í¥Ã¥¯ÂÔ€ÁŸõÂրΥ¿¥¹¥¯€¬€¢€ëŸì¹ç€Ë€Ï¡€€œ€Î¥¿¥¹¥¯ |
|---|
| 145 | * €Ë¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ò¥í¥Ã¥¯€µ€»€ë¡¥ |
|---|
| 146 | */ |
|---|
| 147 | extern bool_t mutex_release(MTXCB *p_mtxcb); |
|---|
| 148 | |
|---|
| 149 | /* |
|---|
| 150 | * ¥¿¥¹¥¯€¬¥í¥Ã¥¯€·€Æ€€€ë€¹€Ù€Æ€Î¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€Î¥í¥Ã¥¯²òœü |
|---|
| 151 | * |
|---|
| 152 | * p_tcb€Ç»ØÄꀵ€ì€ë¥¿¥¹¥¯€Ë¡€€œ€ì€¬¥í¥Ã¥¯€·€Æ€€€ë€¹€Ù€Æ€Î¥ß¥å¡Œ¥Æ¥Ã¥¯ |
|---|
| 153 | * ¥¹€ò¥í¥Ã¥¯²òœü€µ€»€ë¡¥¥í¥Ã¥¯²òœü€·€¿¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€Ë¡€¥í¥Ã¥¯ÂÔ€ÁŸõ |
|---|
| 154 | * ÂրΥ¿¥¹¥¯€¬€¢€ëŸì¹ç€Ë€Ï¡€€œ€Î¥¿¥¹¥¯€Ë¥ß¥å¡Œ¥Æ¥Ã¥¯¥¹€ò¥í¥Ã¥¯€µ€»€ë¡¥ |
|---|
| 155 | * |
|---|
| 156 | * €³€ÎŽØ¿ô€Ï¡€¥¿¥¹¥¯€ÎœªÎ»»þ€Ë»È€ï€ì€ë€â€Î€Ç€¢€ë€¿€á¡€p_tcb€Ç»ØÄꀵ€ì |
|---|
| 157 | * €ë¥¿¥¹¥¯€ÎÍ¥ÀèÅÙ€òÊѹ¹€¹€ëœèÍý€Ï¹Ô€ï€Ê€€¡¥€¿€À€·¡€€³€ÎŽØ¿ô€ÎÃæ€ÇŸ |
|---|
| 158 | * €Î¥¿¥¹¥¯€ÎÍ¥ÀèÅÙ€¬ÊѲœ€·¡€ŒÂ¹Ô€¹€Ù€¥¿¥¹¥¯€¬ÊÑ€ï€ë€³€È€¬€¢€ë¡¥€œ€Î |
|---|
| 159 | * €¿€á¡€€³€ÎŽØ¿ô€«€éÌá€Ã€¿žå€Ë¡€¥Ç¥£¥¹¥Ñ¥Ã¥Á€¬É¬Í×€«ÈœÊÌ€·€Æ¡€É¬Í×€Ê |
|---|
| 160 | * Ÿì¹ç€Ë€Ï¥Ç¥£¥¹¥Ñ¥Ã¥Á€ò¹Ô€ï€Ê€±€ì€Ð€Ê€é€Ê€€¡¥ |
|---|
| 161 | */ |
|---|
| 162 | extern bool_t (*mtxhook_release_all)(TCB *p_tcb); |
|---|
| 163 | extern bool_t mutex_release_all(TCB *p_tcb); |
|---|
| 164 | |
|---|
| 165 | #endif /* TOPPERS_MUTEX_H */ |
|---|