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