[136] | 1 | TOPPERS Confidential
|
---|
| 2 | TOPPERSããã¸ã§ã¯ã ãã£ã¹ã«ãã·ã§ã³ã¡ã¢
|
---|
| 3 | ãªã¼ãã©ã³ãã³ãã©ã«é¢ããè¨è¨ã¡ã¢
|
---|
| 4 |
|
---|
| 5 | ä½æè
|
---|
| 6 | : é«ç°åºç« ï¼åå¤å±å¤§å¦ï¼
|
---|
| 7 | æçµæ´æ°: 2014å¹´9æ28æ¥
|
---|
| 8 |
|
---|
| 9 | âã¡ã¢ã®ä½ç½®ä»ã
|
---|
| 10 |
|
---|
| 11 | ãã®ããã¥ã¡ã³ãã¯ï¼TOPPERS/ASPã«ã¼ãã«ã®ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µã«é¢
|
---|
| 12 | ããè¨è¨ã¡ã¢ã§ããï¼
|
---|
| 13 |
|
---|
| 14 | âãã¼ã¿åã¨å®æ°ã®å®ç¾©
|
---|
| 15 |
|
---|
| 16 | ããã»ããµæéã表ç¾ãããã¼ã¿åOVRTIMã®å®ç¾©ãï¼kernel.hã«å«ããï¼
|
---|
| 17 |
|
---|
| 18 | ----------------------------------------
|
---|
| 19 | typedef ulong_t OVRTIM; /* ããã»ããµæé */
|
---|
| 20 | ----------------------------------------
|
---|
| 21 |
|
---|
| 22 | ããã»ããµæéã«æå®ã§ããæ大å¤ã¯ï¼ã¿ã¼ã²ããä¾åé¨ï¼target_kernel.hã¾
|
---|
| 23 | ãã¯ããããã¤ã³ã¯ã«ã¼ãããããã¡ã¤ã«ï¼ã§å®ç¾©ãããã®ã¨ãããï¼ããã©
|
---|
| 24 | ã«ãã®å®ç¾©ãkernel.hã«å«ããï¼
|
---|
| 25 |
|
---|
| 26 | ----------------------------------------
|
---|
| 27 | #ifndef TMAX_OVRTIM
|
---|
| 28 | #define TMAX_OVRTIM ULONG_MAX
|
---|
| 29 | #endif /* TMAX_OVRTIM */
|
---|
| 30 | ----------------------------------------
|
---|
| 31 |
|
---|
| 32 | ã¾ãï¼ãªã¼ãã©ã³ãã³ãã©ã®ãã¼ã¿åOVRHDRã®å®ç¾©ãï¼kernel.hã«å«ããï¼
|
---|
| 33 |
|
---|
| 34 | ----------------------------------------
|
---|
| 35 | typedef void (*OVRHDR)(ID tskid, intptr_t exinf);
|
---|
| 36 | ----------------------------------------
|
---|
| 37 |
|
---|
| 38 | ãã®ä»ã«ï¼ãªã¼ãã©ã³ãã³ãã©æ©è½ã®ãµã¼ãã¹ã³ã¼ã«ã®å®£è¨ã¨é¢é£ããå®æ°ã®
|
---|
| 39 | å®ç¾©ãï¼kernelã«å«ããï¼
|
---|
| 40 |
|
---|
| 41 | âç¨ãããã¼ãã¦ã§ã¢è³æºã¨ãµãã¼ãã§ããªãå ´åã®æªç½®
|
---|
| 42 |
|
---|
| 43 | ãªã¼ãã©ã³ãã³ãã©ãå®ç¾ããã«ï¼ã¿ã¤ã ãã£ãã¯ã®å²è¾¼ã¿ãçºçãããã®ã¨
|
---|
| 44 | ã¯å¥ã®ã¿ã¤ãï¼ä»¥ä¸ï¼ããããªã¼ãã©ã³ã¿ã¤ãã¨å¼ã¶ï¼ãç¨ããï¼ãã®ããï¼
|
---|
| 45 | ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼ãªã¼ãã©ã³ãã³ãã©ããµãã¼ãã§ããªãå ´åãèãã
|
---|
| 46 | ããï¼ã¾ãï¼ãªã¼ãã©ã³ãã³ãã©ããµãã¼ããããã¨ã§ï¼ã¿ã¹ã¯åæãã«ãã
|
---|
| 47 | ããªã¼ãããããåé¡ã«ãªãå ´åãèããããï¼
|
---|
| 48 |
|
---|
| 49 | ããã§ï¼ãªã¼ãã©ã³ãã³ãã©ããµãã¼ãã§ããå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã«
|
---|
| 50 | ããã¦ï¼TOPPERS_TARGET_SUPPORT_OVRHDRããã¯ãå®ç¾©ãããã®ã¨ããï¼
|
---|
| 51 |
|
---|
| 52 | ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µã®kernel.hã§ã¯ï¼TOPPERS_TARGET_SUPPORT_OVRHDR
|
---|
| 53 | ããã¯ãå®ç¾©ããã¦ããã°ï¼TOPPERS_SUPPORT_OVRHDRãå®ç¾©ããï¼
|
---|
| 54 |
|
---|
| 55 | ----------------------------------------
|
---|
| 56 | #ifdef TOPPERS_TARGET_SUPPORT_OVRHDR
|
---|
| 57 | #define TOPPERS_SUPPORT_OVRHDR /* ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µ */
|
---|
| 58 | #endif /* TOPPERS_TARGET_SUPPORT_OVRHDR */
|
---|
| 59 | ----------------------------------------
|
---|
| 60 |
|
---|
| 61 | ãªã¼ãã©ã³ãã³ãã©æ©è½ã¯ï¼TOPPERS_SUPPORT_OVRHDRãå®ç¾©ããã¦ããå ´åã®
|
---|
| 62 | ã¿çµã¿è¾¼ãï¼ããã«ããï¼ãªã¼ãã©ã³ãã³ãã©æ©è½æ¡å¼µã使ç¨ãï¼ã¿ã¼ã²ãã
|
---|
| 63 | ä¾åé¨ããªã¼ãã©ã³ãã³ãã©ããµãã¼ããã¦ããå ´åã®ã¿ï¼ãªã¼ãã©ã³ãã³ã
|
---|
| 64 | ã©æ©è½ãçµã¿è¾¼ã¾ãããã¨ã«ãªãï¼
|
---|
| 65 |
|
---|
| 66 | âãªã¼ãã©ã³ãã³ãã©ã«é¢é£ãããã¼ã¿æ§é
|
---|
| 67 |
|
---|
| 68 | ãªã¼ãã©ã³ãã³ãã©ãå®è£
|
---|
| 69 | ããããã«ï¼TCBã«ï¼æ®ãããã»ããµæéã表ããã£ã¼
|
---|
| 70 | ã«ãleftotmãè¨ããï¼task.hï¼ï¼
|
---|
| 71 |
|
---|
| 72 | ----------------------------------------
|
---|
| 73 | typedef struct task_control_block {
|
---|
| 74 | ...
|
---|
| 75 | OVRTIM leftotm; /* æ®ãããã»ããµæé */
|
---|
| 76 | ...
|
---|
| 77 | } TCB;
|
---|
| 78 | ----------------------------------------
|
---|
| 79 |
|
---|
| 80 | ãªã¼ãã©ã³ãã³ãã©ãåä½ãã¦ããªãç¶æ
|
---|
| 81 | ã®æã¯ï¼leftotmã0ã«è¨å®ãããã¨
|
---|
| 82 | ã¨ãï¼make_dormantã®ä¸ã§0ã«åæåããï¼task.cï¼ï¼
|
---|
| 83 |
|
---|
| 84 | ----------------------------------------
|
---|
| 85 | void
|
---|
| 86 | make_dormant(TCB *p_tcb)
|
---|
| 87 | {
|
---|
| 88 | ...
|
---|
| 89 | p_tcb->leftotm = 0U;
|
---|
| 90 | ...
|
---|
| 91 | }
|
---|
| 92 | ----------------------------------------
|
---|
| 93 |
|
---|
| 94 | ãªã¼ãã©ã³ãã³ãã©ã«å¯¾ãã¦ã¯ï¼ç®¡çãããã¯ã¯å¿
|
---|
| 95 | è¦ãªãï¼DEF_OVRã§å®ç¾©ãã
|
---|
| 96 | æ
|
---|
| 97 | å ±ãæ ¼ç´ããåæåãããã¯ã®ã¿ãç¨æããï¼åæåãããã¯ãï¼åä¸ã®è¦
|
---|
| 98 | ç´ ã§ååã§ããï¼é
|
---|
| 99 | åã§ããå¿
|
---|
| 100 | è¦ã¯ãªãï¼overrun.hï¼ï¼
|
---|
| 101 |
|
---|
| 102 | ----------------------------------------
|
---|
| 103 | typedef struct overrun_handler_initialization_block {
|
---|
| 104 | ATR ovratr; /* ãªã¼ãã©ã³ãã³ãã©å±æ§ */
|
---|
| 105 | OVRHDR ovrhdr; /* ãªã¼ãã©ã³ãã³ãã©ã®èµ·åçªå° */
|
---|
| 106 | } OVRINIB;
|
---|
| 107 | ----------------------------------------
|
---|
| 108 | extern const OVRINIB ovrinib;
|
---|
| 109 | ----------------------------------------
|
---|
| 110 |
|
---|
| 111 | ãªã¼ãã©ã³ã¿ã¤ããåä½ä¸ãã示ããã©ã°ã¨ãã¦ï¼boot_tåã®å¤æ°
|
---|
| 112 | ovrtimer_flagãç¨æããï¼overrun.hï¼overrun.cï¼ï¼
|
---|
| 113 |
|
---|
| 114 | ----------------------------------------
|
---|
| 115 | extern boot_t ovrtimer_flag;
|
---|
| 116 | ----------------------------------------
|
---|
| 117 |
|
---|
| 118 | ã·ã³ã°ã«ããã»ããµã®å ´åã«ã¯ï¼ãªã¼ãã©ã³ã¿ã¤ããåä½ä¸ãã¯ï¼æ¬¡ã®æ¹æ³ã§
|
---|
| 119 | å¤å¥ãããã¨ãã§ããï¼
|
---|
| 120 |
|
---|
| 121 | ã¿ã¹ã¯ã³ã³ããã¹ãã§ã¯ï¼(p_runtsk->leftotm > 0U)ã®æã®ã¿åä½ãã¦ããï¼
|
---|
| 122 | éã¿ã¹ã¯ã³ã³ããã¹ãã§ã¯ï¼åä½ãã¦ããªãï¼
|
---|
| 123 |
|
---|
| 124 | ãã®ããï¼ãã®ãã©ã°ãç¨ããªãå®è£
|
---|
| 125 | ãå¯è½ã§ãããï¼ãã«ãããã»ããµã¸ã®
|
---|
| 126 | æ¡å¼µæ§ãã¿ã¼ã²ããä¾åæ§ãä¸ããããã«ï¼ãããç¨ããå®è£
|
---|
| 127 | ã¨ãã¦ããï¼å®
|
---|
| 128 | éï¼Mac OS Xã¿ã¼ã²ããä¾åé¨ã§ã¯ï¼ãããæ´»ç¨ãã¦ããï¼ï¼
|
---|
| 129 |
|
---|
| 130 | âæ®ãããã»ããµæéã®ä¿åï¼å¾©å¸°å¦çã®å
|
---|
| 131 | 容
|
---|
| 132 |
|
---|
| 133 | ãã£ã¹ãããã£ããã³å²è¾¼ã¿å¦çï¼CPUä¾å¤å¦çã®åºå
|
---|
| 134 | ¥å£ã§ï¼ã¿ã¹ã¯ã®æ®ããã
|
---|
| 135 | ã»ããµæéãä¿åï¼å¾©å¸°ããå¿
|
---|
| 136 | è¦ãããï¼å
|
---|
| 137 | ·ä½çã«ã¯ï¼ä»¥ä¸ã®ãããªå¦çãå¿
|
---|
| 138 |
|
---|
| 139 | è¦ã§ããï¼
|
---|
| 140 |
|
---|
| 141 | (a) dispatchã¸ã®å
|
---|
| 142 | ¥å£
|
---|
| 143 |
|
---|
| 144 | ovrtimer_flagãtrueã§ããã°ï¼ã¾ãã¯ï¼p_runtsk->leftotmã0ã§ãªããã°ï¼ï¼
|
---|
| 145 | ãªã¼ãã©ã³ã¿ã¤ããåæ¢ããï¼æ®ãããã»ããµæéãp_runtsk->leftotmã«æ ¼ç´
|
---|
| 146 | ããï¼æ®ãããã»ããµæéã0ï¼ã¾ãã¯ããæªæºï¼ã«ãªã£ã¦ããå ´åã«ã¯ï¼
|
---|
| 147 | p_runtsk->leftotmã«1ãæ ¼ç´ããï¼
|
---|
| 148 |
|
---|
| 149 | (b) dispatchããã®åºå£
|
---|
| 150 |
|
---|
| 151 | ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ã®å¼åºãåã«ï¼p_runtsk->leftotmã0ã§ãªããã°ï¼æ®
|
---|
| 152 | ãããã»ããµæéãp_runtsk->leftotmã¨ãã¦ãªã¼ãã©ã³ã¿ã¤ããåä½éå§ããï¼
|
---|
| 153 |
|
---|
| 154 | (c) å²è¾¼ã¿å¦çï¼CPUä¾å¤å¦çã®å
|
---|
| 155 | ¥å£
|
---|
| 156 |
|
---|
| 157 | ovrtimer_flagãtrueã§ããã°ï¼ãªã¼ãã©ã³ã¿ã¤ããåæ¢ããï¼æ®ãããã»ããµ
|
---|
| 158 | æéãp_runtsk->leftotmã«æ ¼ç´ããï¼æ®ãããã»ããµæéã0ï¼ã¾ãã¯ããæª
|
---|
| 159 | æºï¼ã«ãªã£ã¦ããå ´åã«ã¯ï¼p_runtsk->leftotmã«1ãæ ¼ç´ããï¼
|
---|
| 160 |
|
---|
| 161 | ãã®å¦çã¯ï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ããã¹ã¦ç¦æ¢ããç¶æ
|
---|
| 162 | ã§è¡ãå¿
|
---|
| 163 | è¦ãããï¼
|
---|
| 164 | å²è¾¼ã¿ï¼CPUä¾å¤çºçç´å¾ã«ãã¹ã¦ã®å²è¾¼ã¿ãç¦æ¢ãããªãããã»ããµã§ã¯ï¼å²
|
---|
| 165 | è¾¼ã¿ãç¦æ¢ããå¾ã«ãã®å¦çãè¡ãå¿
|
---|
| 166 | è¦ãããï¼
|
---|
| 167 |
|
---|
| 168 | (d) å²è¾¼ã¿å¦çï¼CPUä¾å¤å¦çã®åºå£
|
---|
| 169 |
|
---|
| 170 | ã¿ã¹ã¯ã³ã³ããã¹ãã«æ»ãå ´åã«ï¼p_runtsk->leftotmã0ã§ãªããã°ï¼æ®ãã
|
---|
| 171 | ãã»ããµæéãp_runtsk->leftotmã¨ãã¦ãªã¼ãã©ã³ã¿ã¤ããåä½éå§ããï¼
|
---|
| 172 |
|
---|
| 173 | (e) ã¿ã¹ã¯ã®çµäºæ
|
---|
| 174 |
|
---|
| 175 | ovrtimer_flagãtrueã§ããã°ï¼ã¾ãã¯ï¼p_runtsk->leftotmã0ã§ãªããã°ï¼ï¼
|
---|
| 176 | ãªã¼ãã©ã³ã¿ã¤ããåæ¢ãããï¼æ®ãããã»ããµæéãp_runtsk->leftotmã«æ ¼
|
---|
| 177 | ç´ããå¿
|
---|
| 178 | è¦ã¯ãªãï¼make_dormantã§0ãæ ¼ç´ãããï¼ï¼
|
---|
| 179 |
|
---|
| 180 | (f) ã¿ã¹ã¯ã®å®è¡éå§æ
|
---|
| 181 |
|
---|
| 182 | p_runtsk->leftotmã0ã§ãªããã°ï¼æ®ãããã»ããµæéãp_runtsk->leftotmã¨
|
---|
| 183 | ãã¦ãªã¼ãã©ã³ã¿ã¤ããåä½éå§ããï¼
|
---|
| 184 |
|
---|
| 185 | âã¿ã¼ã²ããä¾åé¨ã®ã¤ã³ã¿ãã§ã¼ã¹
|
---|
| 186 |
|
---|
| 187 | ãªã¼ãã©ã³ãã³ãã©æ©è½ã®ã¿ã¼ã²ããä¾åé¨ã§ã¯ï¼ãªã¼ãã©ã³ãã³ãã©ç¨ã®ã¿
|
---|
| 188 | ã¤ãï¼ä»¥ä¸ï¼ãªã¼ãã©ã³ã¿ã¤ãã¨å¼ã¶ï¼ãæä½ããããã®æ©è½ãæä¾ããï¼
|
---|
| 189 |
|
---|
| 190 | ã¾ãï¼æ¬¡ã®å®æ°ããã¯ãå®ç¾©ããï¼
|
---|
| 191 |
|
---|
| 192 | (1) TMAX_OVRTIM
|
---|
| 193 |
|
---|
| 194 | ããã»ããµæéã¨ãã¦ãªã¼ãã©ã³ãã³ãã©ç¨ã¿ã¤ãã«è¨å®ã§ããæ大ã®å¤ï¼å
|
---|
| 195 | ä½ã¯ãã¤ã¯ãç§ã¨ããï¼ã¿ã¼ã²ããä¾åé¨ã§å®ç¾©ããªãå ´åã«ã¯ï¼kernel.hã§
|
---|
| 196 | ULONG_MAXã«å®ç¾©ããï¼
|
---|
| 197 |
|
---|
| 198 | ã¾ãï¼æ¬¡ã®5ã¤ã®é¢æ°ãç¨æããï¼
|
---|
| 199 |
|
---|
| 200 | (1) void target_ovrtimer_initialize(intptr_t exinf)
|
---|
| 201 |
|
---|
| 202 | ãªã¼ãã©ã³ã¿ã¤ãã®åæåå¦çãè¡ãï¼ã¿ã¤ãã®åä½éå§ã¯è¡ããªãï¼
|
---|
| 203 |
|
---|
| 204 | ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼åæåã«ã¼ãã³ã¨
|
---|
| 205 | ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼
|
---|
| 206 |
|
---|
| 207 | (2) void target_ovrtimer_terminate(intptr_t exinf)
|
---|
| 208 |
|
---|
| 209 | ãªã¼ãã©ã³ã¿ã¤ãã®åæ¢å¦çãè¡ãï¼
|
---|
| 210 |
|
---|
| 211 | ãã®é¢æ°ã¯ï¼target_timer.cfgä¸ã«è¨è¿°ããéçAPIã«ããï¼çµäºå¦çã«ã¼ãã³
|
---|
| 212 | ã¨ãã¦ã«ã¼ãã«ã«ç»é²ãããã¨ãæ³å®ãã¦ããï¼
|
---|
| 213 |
|
---|
| 214 | (3) void target_ovrtimer_start(OVRTIM ovrtim)
|
---|
| 215 |
|
---|
| 216 | ãªã¼ãã©ã³ã¿ã¤ããï¼ovrtimã§æå®ããæéãçµéãããå²è¾¼ã¿ãçºçããã
|
---|
| 217 | ãã«è¨å®ãï¼åä½éå§ããï¼ovrtimã®åä½ã¯ãã¤ã¯ãç§ã¨ããï¼
|
---|
| 218 |
|
---|
| 219 | (4) OVRTIM target_ovrtimer_stop(void)
|
---|
| 220 |
|
---|
| 221 | ãªã¼ãã©ã³ã¿ã¤ããåæ¢ãï¼ã¿ã¤ãã®æ®ãæéãèªã¿åºãï¼ããæ®ãæéã
|
---|
| 222 | 0ï¼ã¾ãã¯ããæªæºï¼ã«ãªã£ã¦ããå ´åã«ã¯ï¼1ãè¿ãï¼ã¾ãï¼ãªã¼ãã©ã³ã¿ã¤
|
---|
| 223 | ãããã®å²è¾¼ã¿ãã¯ãªã¢ããï¼
|
---|
| 224 |
|
---|
| 225 | (5) OVRTIM target_ovrtimer_get_current(void)
|
---|
| 226 |
|
---|
| 227 | ãªã¼ãã©ã³ã¿ã¤ãã®æ®ãæéãèªã¿åºãï¼ããæ®ãæéã0ï¼ã¾ãã¯ããæªæºï¼
|
---|
| 228 | ã«ãªã£ã¦ããå ´åã«ã¯ï¼0ãè¿ãï¼ãªã¼ãã©ã³ã¿ã¤ãããã®å²è¾¼ã¿ã¯ã¯ãªã¢ããª
|
---|
| 229 | ãï¼
|
---|
| 230 |
|
---|
| 231 | âæ®ãããã»ããµæéã®ä¿åï¼å¾©å¸°ã®å®è£
|
---|
| 232 | ï¼ã¿ã¼ã²ããéä¾åé¨ï¼
|
---|
| 233 |
|
---|
| 234 | åè¨ã®å¦çå
|
---|
| 235 | 容ã®ä¸ã§ï¼(a)ã¨(c)ã¯ï¼å¼åºãæ¡ä»¶ãéãã ãã§å¦çå
|
---|
| 236 | 容ã¯åä¸
|
---|
| 237 | ã§ããããï¼ãããå®ç¾ããé¢æ°ovrtimer_stopãã¿ã¼ã²ããéä¾åé¨ã«è¨ãï¼
|
---|
| 238 | ã¿ã¼ã²ããä¾åé¨ã®è©²å½ç®æããå¼ã³åºãããã«ããï¼
|
---|
| 239 |
|
---|
| 240 | ----------------------------------------
|
---|
| 241 | void
|
---|
| 242 | ovrtimer_stop(void)
|
---|
| 243 | {
|
---|
| 244 | if (ovrtimer_flag) {
|
---|
| 245 | assert(p_runtsk->leftotm > 0U);
|
---|
| 246 | p_runtsk->leftotm = target_ovrtimer_stop();
|
---|
| 247 | ovrtimer_flag = false;
|
---|
| 248 | }
|
---|
| 249 | }
|
---|
| 250 | ----------------------------------------
|
---|
| 251 |
|
---|
| 252 | ã¾ã(b),(d),(f)ãï¼å¼åºãæ¡ä»¶ãéãã ãã§å¦çå
|
---|
| 253 | 容ã¯åä¸ã§ããããï¼ãã
|
---|
| 254 | ãå®ç¾ããé¢æ°ovrtimer_startãã¿ã¼ã²ããéä¾åé¨ã«è¨ãï¼ã¿ã¼ã²ããä¾å
|
---|
| 255 | é¨ã®è©²å½ç®æããå¼ã³åºãããã«ããï¼
|
---|
| 256 |
|
---|
| 257 | ----------------------------------------
|
---|
| 258 | void
|
---|
| 259 | ovrtimer_start(void)
|
---|
| 260 | {
|
---|
| 261 | if (p_runtsk->leftotm > 0U) {
|
---|
| 262 | target_ovrtimer_start(p_runtsk->leftotm);
|
---|
| 263 | ovrtimer_flag = true;
|
---|
| 264 | }
|
---|
| 265 | }
|
---|
| 266 | ----------------------------------------
|
---|
| 267 |
|
---|
| 268 | (e)ã¯ï¼æ®ãããã»ããµæéãp_runtsk->leftotmã«æ ¼ç´ããå¿
|
---|
| 269 | è¦ã¯ãªãç¹ã§
|
---|
| 270 | (a),(c)ã¨å¦çå
|
---|
| 271 | 容ãç°ãªããï¼p_runtsk->leftotmã¯make_dormantã§0ã«åæå
|
---|
| 272 | ãããããï¼make_dormantãå¼ã³åºãåã§ããã°ï¼ovrtimer_stopãæµç¨ããã
|
---|
| 273 | ã¨ãã§ããï¼ããã§ï¼ext_tskã«æ¬¡ã®ä¿®æ£ãå ããï¼task_manage.cï¼ï¼
|
---|
| 274 |
|
---|
| 275 | ----------------------------------------
|
---|
| 276 | ER
|
---|
| 277 | ext_tsk(void)
|
---|
| 278 | {
|
---|
| 279 | ...
|
---|
| 280 | (void) make_non_runnable(p_runtsk);
|
---|
| 281 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 282 | | ovrtimer_stop();
|
---|
| 283 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 284 | make_dormant(p_runtsk);
|
---|
| 285 | ...
|
---|
| 286 | }
|
---|
| 287 | ----------------------------------------
|
---|
| 288 |
|
---|
| 289 | âæ®ãããã»ããµæéã®ä¿åï¼å¾©å¸°ã®å®è£
|
---|
| 290 | ï¼ã¿ã¼ã²ããä¾åé¨ï¼
|
---|
| 291 |
|
---|
| 292 | (a) dispatchã¸ã®å
|
---|
| 293 | ¥å£
|
---|
| 294 |
|
---|
| 295 | ----------------------------------------
|
---|
| 296 | void
|
---|
| 297 | dispatch(void)
|
---|
| 298 | {
|
---|
| 299 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 300 | | ovrtimer_stop(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åæ¢ */
|
---|
| 301 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 302 | ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã
|
---|
| 303 | ...
|
---|
| 304 | }
|
---|
| 305 | ----------------------------------------
|
---|
| 306 |
|
---|
| 307 | (b) dispatchããã®åºå£
|
---|
| 308 |
|
---|
| 309 | ----------------------------------------
|
---|
| 310 | void
|
---|
| 311 | dispatch(void)
|
---|
| 312 | {
|
---|
| 313 | ...
|
---|
| 314 |
|
---|
| 315 | dispatch_r:
|
---|
| 316 | ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã
|
---|
| 317 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 318 | | ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§ */
|
---|
| 319 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 320 | calltex(); ⦠(*b)
|
---|
| 321 | }
|
---|
| 322 | ----------------------------------------
|
---|
| 323 |
|
---|
| 324 | (c) å²è¾¼ã¿å¦çï¼CPUä¾å¤å¦çã®å
|
---|
| 325 | ¥å£
|
---|
| 326 |
|
---|
| 327 | å²è¾¼ã¿å¦çï¼CPUä¾å¤å¦çã®å
|
---|
| 328 | ¥å£ã¯æ¬¡ã®éãã«ä¿®æ£ããï¼
|
---|
| 329 |
|
---|
| 330 | ----------------------------------------
|
---|
| 331 | void
|
---|
| 332 | <å²è¾¼ã¿ã®åºå
|
---|
| 333 | ¥å£å¦ç>(void)
|
---|
| 334 | {
|
---|
| 335 | ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã
|
---|
| 336 | if (ã¿ã¹ã¯ã³ã³ããã¹ãã§å²è¾¼ã¿çºç) {
|
---|
| 337 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 338 | | ï¼å°ãªãã¨ãï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ
|
---|
| 339 | ã«ãã
|
---|
| 340 | | ovrtimer_stop(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åæ¢ */
|
---|
| 341 | | ï¼å¿
|
---|
| 342 | è¦ãªãï¼å
|
---|
| 343 | ã®ç¶æ
|
---|
| 344 | ã«æ»ã
|
---|
| 345 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 346 | ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæãï¼
|
---|
| 347 | éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã
|
---|
| 348 | }
|
---|
| 349 | ...
|
---|
| 350 | }
|
---|
| 351 | ----------------------------------------
|
---|
| 352 | void
|
---|
| 353 | <CPUä¾å¤ã®åºå
|
---|
| 354 | ¥å£å¦ç>(void)
|
---|
| 355 | {
|
---|
| 356 | ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ã«ä¿åãã
|
---|
| 357 | if (ã¿ã¹ã¯ã³ã³ããã¹ãã§CPUä¾å¤çºç) {
|
---|
| 358 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 359 | | ï¼å°ãªãã¨ãï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ
|
---|
| 360 | ã«ãã
|
---|
| 361 | | ovrtimer_stop(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åæ¢ */
|
---|
| 362 | | ï¼å¿
|
---|
| 363 | è¦ãªãï¼å
|
---|
| 364 | ã®ç¶æ
|
---|
| 365 | ã«æ»ã
|
---|
| 366 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 367 | ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæãï¼
|
---|
| 368 | éã¿ã¹ã¯ã³ã³ããã¹ãã«åãæãã
|
---|
| 369 | }
|
---|
| 370 | ...
|
---|
| 371 | }
|
---|
| 372 | ----------------------------------------
|
---|
| 373 |
|
---|
| 374 | (d) å²è¾¼ã¿å¦çï¼CPUä¾å¤å¦çã®åºå£
|
---|
| 375 |
|
---|
| 376 | å²è¾¼ã¿å¦çï¼CPUä¾å¤å¦çã®åºå£ã¯æ¬¡ã®éãã«ä¿®æ£ããï¼
|
---|
| 377 |
|
---|
| 378 | ----------------------------------------
|
---|
| 379 | void
|
---|
| 380 | <å²è¾¼ã¿ã®åºå
|
---|
| 381 | ¥å£å¦ç>(void)
|
---|
| 382 | {
|
---|
| 383 | ...
|
---|
| 384 |
|
---|
| 385 | ret_int_r:
|
---|
| 386 | ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã
|
---|
| 387 | }
|
---|
| 388 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 389 | | ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§ */
|
---|
| 390 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 391 | calltex(); ⦠(*b)
|
---|
| 392 | }
|
---|
| 393 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 394 | | else {
|
---|
| 395 | | ï¼å°ãªãã¨ãï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ
|
---|
| 396 | ã«ãã
|
---|
| 397 | | ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§ */
|
---|
| 398 | | }
|
---|
| 399 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 400 | }
|
---|
| 401 | ...
|
---|
| 402 | }
|
---|
| 403 | ----------------------------------------
|
---|
| 404 | void
|
---|
| 405 | <CPUä¾å¤ã®åºå
|
---|
| 406 | ¥å£å¦ç>(void)
|
---|
| 407 | {
|
---|
| 408 | ...
|
---|
| 409 |
|
---|
| 410 | ret_exc_r:
|
---|
| 411 | ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãé¤ããã¹ã¦ã®ã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã
|
---|
| 412 | }
|
---|
| 413 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 414 | | ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§ */
|
---|
| 415 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 416 | calltex(); ⦠(*b)
|
---|
| 417 | }
|
---|
| 418 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 419 | | else {
|
---|
| 420 | | ï¼å°ãªãã¨ãï¼ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããç¶æ
|
---|
| 421 | ã«ãã
|
---|
| 422 | | ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§ */
|
---|
| 423 | | }
|
---|
| 424 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 425 | }
|
---|
| 426 | CPUä¾å¤å¦çããã®ãªã¿ã¼ã³ã§ï¼CPUããã¯ç¶æ
|
---|
| 427 | ï¼ããã¯è§£é¤ç¶æ
|
---|
| 428 | ã
|
---|
| 429 | CPUä¾å¤çºçæã®ç¶æ
|
---|
| 430 | ã«æ»ãããã«æºåãã
|
---|
| 431 | ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãã¹ã¿ãã¯ãã復帰ãã
|
---|
| 432 | CPUä¾å¤å¦çããã®ãªã¿ã¼ã³
|
---|
| 433 | }
|
---|
| 434 | ----------------------------------------
|
---|
| 435 |
|
---|
| 436 | (e) ã¿ã¹ã¯ã®çµäºæ
|
---|
| 437 |
|
---|
| 438 | ã¿ã¼ã²ããéä¾åé¨ã®ext_tskã§å¯¾å¿ããï¼
|
---|
| 439 |
|
---|
| 440 | (f) ã¿ã¹ã¯ã®å®è¡éå§æ
|
---|
| 441 |
|
---|
| 442 | ----------------------------------------
|
---|
| 443 | void
|
---|
| 444 | activate_context(TCB *p_tcb)
|
---|
| 445 | {
|
---|
| 446 | ...
|
---|
| 447 |
|
---|
| 448 | start_r:
|
---|
| 449 | |#ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 450 | | ovrtimer_start(); /* ãªã¼ãã©ã³ã¿ã¤ãã®åä½éå§ */
|
---|
| 451 | |#endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 452 | CPUããã¯è§£é¤ç¶æ
|
---|
| 453 | ã«ãã
|
---|
| 454 | èªã¿ã¹ã¯ï¼p_runtskï¼ã®èµ·åçªå°ãï¼æ¡å¼µæ
|
---|
| 455 | å ±ããã©ã¡ã¼ã¿ã¨ãã¦å¼ã³åºã
|
---|
| 456 | ext_tskã«åå²ãã ... (*c)
|
---|
| 457 | }
|
---|
| 458 | ----------------------------------------
|
---|
| 459 |
|
---|
| 460 | âãªã¼ãã©ã³ãã³ãã©ã®å¼åºãã®å®è£
|
---|
| 461 |
|
---|
| 462 |
|
---|
| 463 | ãªã¼ãã©ã³ã¿ã¤ããæºäºãï¼å²è¾¼ã¿ãçºçããå ´åã«ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã®
|
---|
| 464 | å²è¾¼ã¿ãã³ãã©ï¼ã¾ãã¯ï¼å²è¾¼ã¿ãµã¼ãã¹ã«ã¼ãã³ï¼ããï¼ã¿ã¼ã²ããéä¾å
|
---|
| 465 | é¨ã®call_ovrhdrãå¼ã³åºãï¼
|
---|
| 466 |
|
---|
| 467 | ããã§ï¼ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ãã³ãã©ã®èµ·åã¨ï¼sta_ovrï¼stp_ovrã®å¼åº
|
---|
| 468 | ãã®ç«¶åã®åé¡ãããï¼å
|
---|
| 469 | ·ä½ä¾ã¨ãã¦ï¼ãªã¼ãã©ã³ã¿ã¤ããæºäºããç´å¾ã«ï¼
|
---|
| 470 | ä»ã®é«åªå
|
---|
| 471 | 度ã®å²è¾¼ã¿ãçºçãï¼ãã®å¦çä¸ã§ãªã¼ãã©ã³ãã³ãã©ãååä½é
|
---|
| 472 | å§ï¼æ®ãããã»ããµã¯æ´æ°ãããï¼ãããå ´åãåæ¢ãããå ´åãåé¡ã«ãªãï¼
|
---|
| 473 | ãã®å ´åï¼ãªã¼ãã©ã³ã¿ã¤ãå²è¾¼ã¿ãã³ãã©ã®ä¸ã§ï¼ãªã¼ãã©ã³ãã³ãã©ãå¼
|
---|
| 474 | ã³åºããªãããã«ãã¹ãã§ããï¼
|
---|
| 475 |
|
---|
| 476 | ã¿ã¼ã²ããéä¾åé¨ã®call_ovrhdrã®å®è£
|
---|
| 477 | ã¯æ¬¡ã®éãï¼
|
---|
| 478 |
|
---|
| 479 | ----------------------------------------
|
---|
| 480 | void
|
---|
| 481 | call_ovrhdr(void)
|
---|
| 482 | {
|
---|
| 483 | assert(sense_context());
|
---|
| 484 | assert(!sense_lock());
|
---|
| 485 | assert(ovrinib.ovrhdr != NULL);
|
---|
| 486 |
|
---|
| 487 | i_lock_cpu();
|
---|
| 488 | if (p_runtsk!= NULL && p_runtsk->leftotm == 1U) {
|
---|
| 489 | p_runtsk->leftotm = 0U;
|
---|
| 490 | i_unlock_cpu();
|
---|
| 491 |
|
---|
| 492 | LOG_OVR_ENTER(p_runtsk);
|
---|
| 493 | ((OVRHDR)(ovrinib.ovrhdr))(TSKID(p_runtsk), p_runtsk->p_tinib->exinf);
|
---|
| 494 | LOG_OVR_LEAVE(p_runtsk);
|
---|
| 495 | }
|
---|
| 496 | else {
|
---|
| 497 | /*
|
---|
| 498 | * ãã®ã«ã¼ãã³ãå¼ã³åºãããåã«ï¼ãªã¼ãã©ã³ãã³ãã©ã®èµ·åã
|
---|
| 499 | * ãã£ã³ã»ã«ãããå ´å
|
---|
| 500 | */
|
---|
| 501 | i_unlock_cpu();
|
---|
| 502 | }
|
---|
| 503 | }
|
---|
| 504 | ----------------------------------------
|
---|
| 505 |
|
---|
| 506 | p_runtskãNULLã®å ´åãèæ
|
---|
| 507 | ®ãã¦ããã®ã¯ï¼ã¹ããªã¢ã¹å²è¾¼ã¿ã«å¯¾ããããã¹
|
---|
| 508 | ãæ§ã確ä¿ããããã§ããï¼
|
---|
| 509 |
|
---|
| 510 | ãªã¼ãã©ã³ãã³ãã©ã®å¼åºãå¾ã«ï¼å¼åºãåã®ç¶æ
|
---|
| 511 | ï¼CPUããã¯ï¼å²è¾¼ã¿åªå
|
---|
| 512 | 度
|
---|
| 513 | ãã¹ã¯ï¼ã«æ»ããªãã®ã¯ï¼ãã®ã«ã¼ãã³ããã®ãªã¿ã¼ã³å¾ã«ï¼å²è¾¼ã¿åºå£å¦ç
|
---|
| 514 | ã§å
|
---|
| 515 | ã®ç¶æ
|
---|
| 516 | ã«æ»ãããã§ããï¼
|
---|
| 517 |
|
---|
| 518 | call_ovrhdrã¯ï¼å²è¾¼ã¿ãã³ãã©ããï¼ã¾ãã¯ï¼å²è¾¼ã¿ãã³ãã©ã¨ãã¦ï¼å¼ã³åº
|
---|
| 519 | ãããããï¼ãã®ã«ã¼ãã³ã«æ¥ãã¾ã§ã«ï¼ovrtimer_stopãå¼ã°ãã¦ããï¼ããª
|
---|
| 520 | ãã¡ï¼ãªã¼ãã©ã³ã¿ã¤ããåæ¢ãã¦ããï¼ï¼
|
---|
| 521 |
|
---|
| 522 | å²è¾¼ã¿ãã³ãã©ã®è¨å®ã¯ï¼ä»¥ä¸ã®ãããªéçAPIãï¼target_timer.hä¸ã«è¨è¿°ã
|
---|
| 523 | ããã¨ã§è¡ããã®ã¨ããï¼ã¿ã¼ã²ããã®äºæ
|
---|
| 524 | ã§å¤æ´ãã¦ããï¼ï¼
|
---|
| 525 |
|
---|
| 526 | ----------------------------------------
|
---|
| 527 | #ifdef TOPPERS_SUPPORT_OVRHDR
|
---|
| 528 | ATT_INI({ TA_NULL, 0, target_ovrtimer_initialize });
|
---|
| 529 | ATT_TER({ TA_NULL, 0, target_ovrtimer_terminate });
|
---|
| 530 | CFG_INT(INTNO_OVRTIMER, { TA_ENAINT | INTATR_OVRTIMER, INTPRI_OVRTIMER });
|
---|
| 531 | DEF_INH(INHNO_OVRTIMER, { TA_NULL, target_ovrtimer_handler });
|
---|
| 532 | #endif /* TOPPERS_SUPPORT_OVRHDR */
|
---|
| 533 | ----------------------------------------
|
---|
| 534 |
|
---|
| 535 | ãããã®éçAPIä¸ã®ï¼INHNO_OVRTIMERï¼INTNO_OVRTIMERï¼INTPRI_OVRTIMERï¼
|
---|
| 536 | INTATR_OVRTIMERã®4ã¤ã®å®æ°ã¯ï¼target_timer.hä¸ã§å®ç¾©ããï¼
|
---|
| 537 |
|
---|
| 538 | âãªã¼ããããã®ä½æ¸æ¹æ³
|
---|
| 539 |
|
---|
| 540 | 以ä¸ã§èª¬æããæ¹æ³ã§ã¯ï¼ã¿ã¼ã²ããä¾åé¨ã®ã¢ã»ã³ããªè¨èªã§è¨è¿°ãããã¨
|
---|
| 541 | ãæ³å®ããã³ã¼ãããï¼ã¿ã¼ã²ããéä¾åé¨ã®ovrtimer_startã¨
|
---|
| 542 | ovrtimer_stopãå¼ã³åºãã¦ãããï¼ãããã®é¢æ°ã¯çããã®ã§ï¼ã¢ã»ã³ããªè¨
|
---|
| 543 | èªã®ä¸ã«å±éããæ¹ãå¹çãããï¼ãããã®é¢æ°ãã¢ã»ã³ããªè¨èªã®ä¸ã«å±é
|
---|
| 544 | ããå ´åã«ã¯ï¼ããããï¼OMIT_OVRTIMER_STARTã¨OMIT_OVRTIMER_STOPããã¯ã
|
---|
| 545 | å®ç¾©ããï¼
|
---|
| 546 |
|
---|
| 547 | âãã«ãããã»ããµå¯¾å¿ã«ã¼ãã«ã¸ã®å¯¾å¿ã«é¢ããã¡ã¢
|
---|
| 548 |
|
---|
| 549 | ãã«ãããã»ããµå¯¾å¿ã«ã¼ãã«ã«ããã¦ï¼sta_ovrï¼ista_ovrï¼stp_ovrï¼
|
---|
| 550 | istp_ovrãï¼å¼ã³åºããå¦çåä½ã¨ç°ãªãããã»ããµã«å²ãä»ããããã¿ã¹ã¯
|
---|
| 551 | ã対象ã«çºè¡ããå ´åã®å®è£
|
---|
| 552 | ã¯å·¥å¤«ãè¦ããï¼
|
---|
| 553 |
|
---|
| 554 | åºæ¬çã«ã¯ï¼å¯¾è±¡ã¿ã¹ã¯ãå²ãä»ããããããã»ããµã«å¯¾ãã¦ããã»ããµéå²
|
---|
| 555 | è¾¼ã¿ãããããã¨ã«ãã£ã¦ï¼å¯¾è±¡ã¿ã¹ã¯ã®ãªã¼ãã©ã³ãã³ãã©ã®åä½ãéå§ï¼
|
---|
| 556 | åæ¢ããããã¨ãå¿
|
---|
| 557 | è¦ã§ãããï¼å²è¾¼ã¿ã®å
|
---|
| 558 | ¥å£å¦çã§å¼ã³åºãovrtimer_stopã§ï¼
|
---|
| 559 | ovrtimer_flagã¨(p_runtsk->leftotm > 0U)ãä¸è²«ããªããªãããï¼å·¥å¤«ãè¦ã
|
---|
| 560 | ããã®ã¨æãããï¼
|
---|
| 561 |
|
---|
| 562 | 以ä¸
|
---|