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 | 以ä¸
|
---|