1 | /*
|
---|
2 | * TOPPERS/SSP Kernel
|
---|
3 | * Smallest Set Profile Kernel
|
---|
4 | *
|
---|
5 | *
|
---|
6 | * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
|
---|
7 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
8 | * Copyright (C) 2010-2012 by Meika Sugimoto
|
---|
9 | * Copyright (C) 2014,2015 by Naoki Saito
|
---|
10 | * Nagoya Municipal Industrial Research Institute, JAPAN
|
---|
11 | *
|
---|
12 | * ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF
|
---|
13 | * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü
|
---|
14 | * ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD
|
---|
15 | * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì
|
---|
16 | * \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[
|
---|
17 | * XR[hÉÜÜêĢ鱯D
|
---|
18 | * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg
|
---|
19 | * pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL
|
---|
20 | gip
|
---|
21 | * Ò}j
|
---|
22 | AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL
|
---|
23 | * Ì³ÛØKèðfÚ·é±ÆD
|
---|
24 | * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg
|
---|
25 | * pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·±
|
---|
26 | * ÆD
|
---|
27 | * (a) Äzzɺ¤hL
|
---|
28 | gipÒ}j
|
---|
29 | AÈÇjÉCãLÌ
|
---|
30 | * ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD
|
---|
31 | * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ
|
---|
32 | * ñ·é±ÆD
|
---|
33 | * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹
|
---|
34 | * Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD
|
---|
35 | * ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé
|
---|
36 | * RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð
|
---|
37 | * ÆÓ·é±ÆD
|
---|
38 | *
|
---|
39 | * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨
|
---|
40 | * æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI
|
---|
41 | * ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF
|
---|
42 | * AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»
|
---|
43 | * ÌÓCðíÈ¢D
|
---|
44 | *
|
---|
45 | */
|
---|
46 |
|
---|
47 | /*
|
---|
48 | * TOPPERS/SSPÌTvvO
|
---|
49 | *
|
---|
50 | * SSPJ[lÌî{IÈ®ìðmF·é½ßÌTvvOD
|
---|
51 | *
|
---|
52 | * vOÌTv:
|
---|
53 | *
|
---|
54 | * [UC^tF[Xðó¯ÂC^XNÆC3ÂÌÀsÀs³êé
|
---|
55 | * ^XNÆÅ\¬³êéD^XNID¨æÑDæxÝèÍȺÌÊèD
|
---|
56 | * (^XNID) (N®Dæx) (ÀsDæx)
|
---|
57 | * MAIN_TASK MAIN_PRIORITY (¶É¯¶)
|
---|
58 | * TASK1 TASK1_PRIORITY (¶É¯¶)
|
---|
59 | * TASK2 TASK2_PRIORITY (¶É¯¶)
|
---|
60 | * TASK3 TASK3_PRIORITY TASK3_EXEPRIORITY
|
---|
61 | *
|
---|
62 | * ܽCN®üúª2bÌüúnhiüúnhID: CYC1j¨æÑ
|
---|
63 | * C^XNN®pÌüúnh(üúnhID: MAIN_CYC)ðp¢éD
|
---|
64 | *
|
---|
65 | * ÀsÀs³êé^XNÍCtask_loopñó[vðÀs·éxÉC^XNª
|
---|
66 | * ÀsŠ鱯ð çí·bZ[Wð\¦·éDó[vðÀs·é
|
---|
67 | * ÌÍCó[vȵÅbZ[WðoÍ·éÆC½ÊÌbZ[WªoÍ
|
---|
68 | * ³êCvOÌ®ìªmFµ¸çÈé½ßÅ éDܽCá¬ÈV
|
---|
69 | * A|[gðp¢ÄbZ[WðoÍ·éêÉC·×ÄÌbZ[W
|
---|
70 | * ªoÍū鿤ÉCbZ[WÌÊð§À·éÆ¢¤Rà éD
|
---|
71 | *
|
---|
72 | * üúnh(CYC1)ÍCN®µ½±Æð¦·bZ[Wð\¦·éD
|
---|
73 | * vOÌN®¼ãÍCüúnh(CYC1)Íâ~óÔÉÈÁÄ¢éD
|
---|
74 | *
|
---|
75 | * C^XNÍCüúnh(MAIN_CYC)©ç100~b²ÆÉN®³êC
|
---|
76 | * VAI/O|[g©ç̶üÍðs¢Cüͳê½
|
---|
77 | * ¶Éε½ðÀs·éDüͳ꽶ÆÌÖWÍÌÊèD
|
---|
78 | * 'Q'ªüͳêéÆCvOðI¹·éD
|
---|
79 | *
|
---|
80 | * '1' : ÎÛ^XNðTASK1ÉØè·¦éiúÝèjD
|
---|
81 | * '2' : ÎÛ^XNðTASK2ÉØè·¦éD
|
---|
82 | * '3' : ÎÛ^XNðTASK3ÉØè·¦éD
|
---|
83 | * 'a' : ÎÛ^XNðact_tskÉæèN®·éD
|
---|
84 | * 'e' : ÎÛ^XNðÖÌ^[ÉæèI¹³¹éD
|
---|
85 | * 'c' : üúnhð®ìJn³¹éD
|
---|
86 | * 'C' : üúnhð®ìâ~³¹éD
|
---|
87 | * 'b' : A[nhð5bãÉN®·é椮ìJn³¹éD
|
---|
88 | * 'B' : A[nhð®ìâ~³¹éD
|
---|
89 | * 'z' : ÎÛ^XNÉCPUáOð¶³¹éi^XNðI¹³¹éjD
|
---|
90 | * 's' : CxgtO(ID:FLG1)ÉY^XNÉÖA·érbgðZbg·éD
|
---|
91 | * 'l' : ·×ÄÌ^XNÖA·éCxgtO(ID:FLG1)ÌrbgðNA·éD
|
---|
92 | * 'p' : |[OÅCxgtO(FLG1)ðÒÂD
|
---|
93 | * 'd' : |[OÅf[^L
|
---|
94 | [(ID:DTQ1)Öf[^ðM·éD
|
---|
95 | * 'r' : |[OÅf[^L
|
---|
96 | [(ID:DTQ1)©çf[^ðóM·éD
|
---|
97 | */
|
---|
98 |
|
---|
99 | #include <kernel.h>
|
---|
100 | #include <sil.h>
|
---|
101 | #include <t_syslog.h>
|
---|
102 | #include "kernel_cfg.h"
|
---|
103 | #include "syssvc/serial.h"
|
---|
104 | #include "syssvc/logtask.h"
|
---|
105 |
|
---|
106 | #include "sample1.h"
|
---|
107 |
|
---|
108 |
|
---|
109 | /*
|
---|
110 | * VXeT[rXÌG[nhO
|
---|
111 | */
|
---|
112 | #define SVC(expression) \
|
---|
113 | if((expression) < 0) \
|
---|
114 | { \
|
---|
115 | syslog(LOG_NOTICE , "Error at %s : %d caused by %s." , \
|
---|
116 | __FILE__ , __LINE__ , #expression); \
|
---|
117 | }
|
---|
118 |
|
---|
119 | /*
|
---|
120 | * ÀñÀs³êé^XNÖÌbZ[WÌæ
|
---|
121 | */
|
---|
122 | char message[3];
|
---|
123 |
|
---|
124 | /*
|
---|
125 | * [vñ
|
---|
126 | */
|
---|
127 | ulong_t task_loop; /* ^XNàÅÌ[vñ */
|
---|
128 |
|
---|
129 | void init_task(intptr_t exinf)
|
---|
130 | {
|
---|
131 | #ifndef TASK_LOOP
|
---|
132 | volatile ulong_t i;
|
---|
133 | SYSTIM stime1, stime2;
|
---|
134 | #endif /* TASK_LOOP */
|
---|
135 |
|
---|
136 | /* VA|[gÌI[v */
|
---|
137 | SVC(serial_opn_por(TASK_PORTID));
|
---|
138 | SVC(serial_ctl_por(TASK_PORTID , IOCTL_CRLF));
|
---|
139 |
|
---|
140 | /* O^XNÌú» */
|
---|
141 | logtask_initialize(LOGTASK_PORTID);
|
---|
142 |
|
---|
143 | /* N®bZ[WÌoÍ */
|
---|
144 | syslog(LOG_INFO , "Sample program starts.");
|
---|
145 |
|
---|
146 | /* üúnhÌN® */
|
---|
147 | SVC(sta_cyc(MAIN_CYC));
|
---|
148 |
|
---|
149 | /*
|
---|
150 | * [vñÌÝè
|
---|
151 | *
|
---|
152 | * TASK_LOOPª}Nè`³êÄ¢éêCªè¹¸ÉCTASK_LOOPÉè
|
---|
153 | * `³ê½lðC^XNàÅÌ[vñÆ·éD
|
---|
154 | *
|
---|
155 | * MEASURE_TWICEª}Nè`³êÄ¢éêC1ñÚ̪èÊðÌÄ
|
---|
156 | * ÄC2ñÚ̪èÊðg¤D1ñÚ̪èÍ·ßÌÔªoé½ßD
|
---|
157 | */
|
---|
158 | #ifdef TASK_LOOP
|
---|
159 | task_loop = TASK_LOOP;
|
---|
160 | #else /* TASK_LOOP */
|
---|
161 |
|
---|
162 | task_loop = LOOP_REF;
|
---|
163 | SVC(get_tim(&stime1));
|
---|
164 | for (i = 0; i < task_loop; i++) {
|
---|
165 | /* Ô©¹¬Ì½ßÌ[vÅ èC±±ÅͽàµÈ¢ */
|
---|
166 | }
|
---|
167 | SVC(get_tim(&stime2));
|
---|
168 | task_loop = LOOP_REF * 400UL / (stime2 - stime1);
|
---|
169 |
|
---|
170 | #endif /* TASK_LOOP */
|
---|
171 |
|
---|
172 | }
|
---|
173 |
|
---|
174 |
|
---|
175 | void main_task(intptr_t exinf)
|
---|
176 | {
|
---|
177 | static ID tskid = TASK1;
|
---|
178 | static uint_t tskno = 1;
|
---|
179 | char c;
|
---|
180 |
|
---|
181 |
|
---|
182 | /* VA|[g©ç̶óM */
|
---|
183 | if(serial_rea_dat(TASK_PORTID , &c , 1) > 0)
|
---|
184 | {
|
---|
185 | switch(c)
|
---|
186 | {
|
---|
187 | case 'e':
|
---|
188 | case 's':
|
---|
189 | case 'l':
|
---|
190 | case 'p':
|
---|
191 | case 'd':
|
---|
192 | case 'r':
|
---|
193 | case 'z':
|
---|
194 | message[tskno-1] = c;
|
---|
195 | break;
|
---|
196 | case '1':
|
---|
197 | tskid = TASK1;
|
---|
198 | tskno = 1;
|
---|
199 | break;
|
---|
200 | case '2':
|
---|
201 | tskid = TASK2;
|
---|
202 | tskno = 2;
|
---|
203 | break;
|
---|
204 | case '3':
|
---|
205 | tskid = TASK3;
|
---|
206 | tskno = 3;
|
---|
207 | break;
|
---|
208 | case 'a':
|
---|
209 | syslog(LOG_INFO, "#act_tsk(%d)", tskno);
|
---|
210 | SVC(act_tsk(tskid));
|
---|
211 | break;
|
---|
212 | case 'b':
|
---|
213 | syslog(LOG_INFO, "#sta_alm(1, 5000)");
|
---|
214 | SVC(sta_alm(ALM1 , 5000));
|
---|
215 | break;
|
---|
216 | case 'B':
|
---|
217 | syslog(LOG_INFO, "#stp_alm(1)");
|
---|
218 | SVC(stp_alm(ALM1));
|
---|
219 | break;
|
---|
220 | case 'c':
|
---|
221 | syslog(LOG_INFO, "sta_cyc(1)");
|
---|
222 | SVC(sta_cyc(CYC1));
|
---|
223 | break;
|
---|
224 | case 'C':
|
---|
225 | syslog(LOG_INFO, "stp_cyc(1)");
|
---|
226 | SVC(stp_cyc(CYC1));
|
---|
227 | break;
|
---|
228 | case 'Q':
|
---|
229 | syslog(LOG_NOTICE, "Sample program ends.");
|
---|
230 | SVC(ext_ker());
|
---|
231 | break;
|
---|
232 | default:
|
---|
233 | /* G[\¦ */
|
---|
234 | syslog(LOG_INFO , "Unknown command.");
|
---|
235 | break;
|
---|
236 | }
|
---|
237 | }
|
---|
238 | }
|
---|
239 |
|
---|
240 |
|
---|
241 | void task(intptr_t exinf)
|
---|
242 | {
|
---|
243 | /* exinfÍ^XNÔ */
|
---|
244 | uint_t tskno = (uint_t)exinf;
|
---|
245 | int_t n = 0;
|
---|
246 | char command;
|
---|
247 | volatile ulong_t i;
|
---|
248 | const char *graph[] = { "|", " +", " *" };
|
---|
249 | bool_t cont = true;
|
---|
250 | FLGPTN pattern;
|
---|
251 | const FLGPTN flgptn[] = { 0x00000001U, 0x00000002U, 0x00000004U };
|
---|
252 | const FLGPTN allptn = 0x00000007U;
|
---|
253 | intptr_t dtqdata;
|
---|
254 |
|
---|
255 | do
|
---|
256 | {
|
---|
257 | for (i = 0; i < task_loop; i++) {
|
---|
258 | /* Ô©¹¬Ì½ßÌ[vÅ èC±±ÅͽàµÈ¢ */
|
---|
259 | }
|
---|
260 |
|
---|
261 | /* ^XNÔÌ\¦ */
|
---|
262 | syslog(LOG_NOTICE, "task%d is running (%03d). %s",
|
---|
263 | tskno, ++n, graph[tskno-1]);
|
---|
264 |
|
---|
265 | /* R}hæ¾CbZ[WÌæðNA */
|
---|
266 | command = message[tskno - 1];
|
---|
267 | message[tskno - 1] = 0;
|
---|
268 |
|
---|
269 | switch(command)
|
---|
270 | {
|
---|
271 | case 'e':
|
---|
272 | cont = false;
|
---|
273 | syslog(LOG_INFO, "#%d#terminate task", tskno);
|
---|
274 | break;
|
---|
275 | case 's':
|
---|
276 | SVC(set_flg(FLG1 , flgptn[tskno - 1]));
|
---|
277 | syslog(LOG_INFO, "#%d#set_flg(flgid=%d , mask=%d)",
|
---|
278 | tskno , FLG1 , flgptn[tskno - 1]);
|
---|
279 | break;
|
---|
280 | case 'l':
|
---|
281 | SVC(clr_flg(FLG1 , ~allptn));
|
---|
282 | syslog(LOG_INFO, "#%d#clr_flg(flgid=%d)", tskno , FLG1);
|
---|
283 | break;
|
---|
284 | case 'p':
|
---|
285 | SVC(pol_flg(FLG1 , allptn , TWF_ORW , &pattern));
|
---|
286 | syslog(LOG_INFO, "#%d#pol_flg(flgid=%d , value=%u)", tskno , FLG1 , pattern);
|
---|
287 | break;
|
---|
288 | case 'd':
|
---|
289 | SVC(psnd_dtq(DTQ1 , (intptr_t)tskno));
|
---|
290 | syslog(LOG_INFO, "#%d#snd_dtq(dtqid=%d , value=%u)", tskno , DTQ1 , tskno);
|
---|
291 | break;
|
---|
292 | case 'r':
|
---|
293 | SVC(prcv_dtq(DTQ1 , (intptr_t *)(&dtqdata)));
|
---|
294 | syslog(LOG_INFO, "#%d#rcv_dtq(dtqid=%d , value=%u)", tskno , DTQ1 , dtqdata);
|
---|
295 | break;
|
---|
296 | #ifdef CPUEXC1
|
---|
297 | case 'z':
|
---|
298 | syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
|
---|
299 | RAISE_CPU_EXCEPTION;
|
---|
300 | break;
|
---|
301 | #endif /* CPUEXC1 */
|
---|
302 | default:
|
---|
303 | break;
|
---|
304 | }
|
---|
305 | }while(cont == true);
|
---|
306 | }
|
---|
307 |
|
---|
308 |
|
---|
309 | void alarm_handler(intptr_t exinf)
|
---|
310 | {
|
---|
311 | ID tskid = (ID)exinf;
|
---|
312 |
|
---|
313 | syslog(LOG_INFO , "Alarm handler is raised.");
|
---|
314 | SVC(iact_tsk(tskid));
|
---|
315 | }
|
---|
316 |
|
---|
317 | void main_task_cychdr(intptr_t exinf)
|
---|
318 | {
|
---|
319 | ID tskid = (ID)exinf;
|
---|
320 |
|
---|
321 | (void)iact_tsk(tskid);
|
---|
322 | }
|
---|
323 |
|
---|
324 | void cyclic_handler(intptr_t exinf)
|
---|
325 | {
|
---|
326 | syslog(LOG_INFO , "Cyclic handler is raised.");
|
---|
327 | }
|
---|
328 |
|
---|
329 | #ifdef CPUEXC1
|
---|
330 | void exc_handler(void *p_excinf)
|
---|
331 | {
|
---|
332 | syslog(LOG_INFO , "CPU exception handler.");
|
---|
333 | syslog(LOG_INFO , "Kernel exit.");
|
---|
334 |
|
---|
335 | (void)ext_ker();
|
---|
336 | }
|
---|
337 | #endif /* CPUEXC1 */
|
---|
338 |
|
---|