#include <kernel.h>
#include <t_syslog.h>
#include <t_stdlib.h>
#include "syssvc/serial.h"
#include "syssvc/syslog.h"
#include "kernel_cfg.h"
#include "sample1.h"
マクロ定義 | |
#define | SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr)) |
関数 | |
Inline void | svc_perror (const char *file, int_t line, const char *expr, ER ercd) |
void | task (intptr_t exinf) |
void | tex_routine (TEXPTN texptn, intptr_t exinf) |
void | cyclic_handler (intptr_t exinf) |
void | alarm_handler (intptr_t exinf) |
void | main_task (intptr_t exinf) |
変数 | |
char_t | message [3] |
ulong_t | task_loop |
ulong_t | tex_loop |
#define SVC_PERROR | ( | expr | ) | svc_perror(__FILE__, __LINE__, #expr, (expr)) |
void alarm_handler | ( | intptr_t | exinf | ) |
参照先 HIGH_PRIORITY, irot_rdq(), LOW_PRIORITY, MID_PRIORITY, と SVC_PERROR.
00271 { 00272 SVC_PERROR(irot_rdq(HIGH_PRIORITY)); 00273 SVC_PERROR(irot_rdq(MID_PRIORITY)); 00274 SVC_PERROR(irot_rdq(LOW_PRIORITY)); 00275 }
void cyclic_handler | ( | intptr_t | exinf | ) |
参照先 HIGH_PRIORITY, irot_rdq(), LOW_PRIORITY, MID_PRIORITY, と SVC_PERROR.
00258 { 00259 SVC_PERROR(irot_rdq(HIGH_PRIORITY)); 00260 SVC_PERROR(irot_rdq(MID_PRIORITY)); 00261 SVC_PERROR(irot_rdq(LOW_PRIORITY)); 00262 }
void main_task | ( | intptr_t | exinf | ) |
参照先 act_tsk(), assert, can_act(), can_wup(), chg_pri(), E_OBJ, ext_ker(), get_pri(), get_tim(), get_utm(), HIGH_PRIORITY, IOCTL_CRLF, IOCTL_FCRCV, IOCTL_FCSND, itron_strerror(), loc_cpu(), LOG_EMERG, LOG_ERROR, LOG_INFO, LOG_NOTICE, LOG_UPTO, LOOP_REF, LOW_PRIORITY, MERCD, message, MID_PRIORITY, ras_tex(), rel_wai(), rot_rdq(), rsm_tsk(), SERCD, serial_ctl_por(), serial_opn_por(), serial_rea_dat(), sta_alm(), sta_cyc(), stp_alm(), stp_cyc(), sus_tsk(), SVC_PERROR, syslog(), syslog_msk_log(), task_loop, TASK_PORTID, ter_tsk(), tex_loop, unl_cpu(), と wup_tsk().
00281 { 00282 char_t c; 00283 ID tskid = TASK1; 00284 volatile ulong_t i; 00285 int_t tskno = 1; 00286 ER_UINT ercd; 00287 PRI tskpri; 00288 SYSTIM stime1, stime2; 00289 #ifdef TOPPERS_SUPPORT_GET_UTM 00290 SYSUTM utime1, utime2; 00291 #endif /* TOPPERS_SUPPORT_GET_UTM */ 00292 00293 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); 00294 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); 00295 00296 /* 00297 * シリアルポートの初期化 00298 * 00299 * システムログタスクと同じシリアルポートを使う場合など,シリアル 00300 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は 00301 * ない. 00302 */ 00303 ercd = serial_opn_por(TASK_PORTID); 00304 if (ercd < 0 && MERCD(ercd) != E_OBJ) { 00305 syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", 00306 itron_strerror(ercd), SERCD(ercd)); 00307 } 00308 SVC_PERROR(serial_ctl_por(TASK_PORTID, 00309 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); 00310 00311 /* 00312 * ループ回数の設定 00313 * 00314 * TASK_LOOPがマクロ定義されている場合,測定せずに,TASK_LOOPに定 00315 * 義された値を,タスク内でのループ回数とする. 00316 * 00317 * MEASURE_TWICEがマクロ定義されている場合,1回目の測定結果を捨て 00318 * て,2回目の測定結果を使う.1回目の測定は長めの時間が出るため. 00319 */ 00320 #ifdef TASK_LOOP 00321 task_loop = TASK_LOOP; 00322 #else /* TASK_LOOP */ 00323 00324 #ifdef MEASURE_TWICE 00325 task_loop = LOOP_REF; 00326 SVC_PERROR(get_tim(&stime1)); 00327 for (i = 0; i < task_loop; i++); 00328 SVC_PERROR(get_tim(&stime2)); 00329 #endif /* MEASURE_TWICE */ 00330 00331 task_loop = LOOP_REF; 00332 SVC_PERROR(get_tim(&stime1)); 00333 for (i = 0; i < task_loop; i++); 00334 SVC_PERROR(get_tim(&stime2)); 00335 task_loop = LOOP_REF * 400UL / (stime2 - stime1); 00336 00337 #endif /* TASK_LOOP */ 00338 tex_loop = task_loop / 5; 00339 00340 /* 00341 * タスクの起動 00342 */ 00343 SVC_PERROR(act_tsk(TASK1)); 00344 SVC_PERROR(act_tsk(TASK2)); 00345 SVC_PERROR(act_tsk(TASK3)); 00346 00347 /* 00348 * メインループ 00349 */ 00350 do { 00351 SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); 00352 switch (c) { 00353 case 'e': 00354 case 's': 00355 case 'S': 00356 case 'd': 00357 case 'y': 00358 case 'Y': 00359 case 'z': 00360 case 'Z': 00361 message[tskno-1] = c; 00362 break; 00363 case '1': 00364 tskno = 1; 00365 tskid = TASK1; 00366 break; 00367 case '2': 00368 tskno = 2; 00369 tskid = TASK2; 00370 break; 00371 case '3': 00372 tskno = 3; 00373 tskid = TASK3; 00374 break; 00375 case 'a': 00376 syslog(LOG_INFO, "#act_tsk(%d)", tskno); 00377 SVC_PERROR(act_tsk(tskid)); 00378 break; 00379 case 'A': 00380 syslog(LOG_INFO, "#can_act(%d)", tskno); 00381 SVC_PERROR(ercd = can_act(tskid)); 00382 if (ercd >= 0) { 00383 syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); 00384 } 00385 break; 00386 case 't': 00387 syslog(LOG_INFO, "#ter_tsk(%d)", tskno); 00388 SVC_PERROR(ter_tsk(tskid)); 00389 break; 00390 case '>': 00391 syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); 00392 SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); 00393 break; 00394 case '=': 00395 syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); 00396 SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); 00397 break; 00398 case '<': 00399 syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); 00400 SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); 00401 break; 00402 case 'G': 00403 syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); 00404 SVC_PERROR(ercd = get_pri(tskid, &tskpri)); 00405 if (ercd >= 0) { 00406 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); 00407 } 00408 break; 00409 case 'w': 00410 syslog(LOG_INFO, "#wup_tsk(%d)", tskno); 00411 SVC_PERROR(wup_tsk(tskid)); 00412 break; 00413 case 'W': 00414 syslog(LOG_INFO, "#can_wup(%d)", tskno); 00415 SVC_PERROR(ercd = can_wup(tskid)); 00416 if (ercd >= 0) { 00417 syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); 00418 } 00419 break; 00420 case 'l': 00421 syslog(LOG_INFO, "#rel_wai(%d)", tskno); 00422 SVC_PERROR(rel_wai(tskid)); 00423 break; 00424 case 'u': 00425 syslog(LOG_INFO, "#sus_tsk(%d)", tskno); 00426 SVC_PERROR(sus_tsk(tskid)); 00427 break; 00428 case 'm': 00429 syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); 00430 SVC_PERROR(rsm_tsk(tskid)); 00431 break; 00432 case 'x': 00433 syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno); 00434 SVC_PERROR(ras_tex(tskid, 0x0001U)); 00435 break; 00436 case 'X': 00437 syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno); 00438 SVC_PERROR(ras_tex(tskid, 0x0002U)); 00439 break; 00440 case 'r': 00441 syslog(LOG_INFO, "#rot_rdq(three priorities)"); 00442 SVC_PERROR(rot_rdq(HIGH_PRIORITY)); 00443 SVC_PERROR(rot_rdq(MID_PRIORITY)); 00444 SVC_PERROR(rot_rdq(LOW_PRIORITY)); 00445 break; 00446 case 'c': 00447 syslog(LOG_INFO, "#sta_cyc(1)"); 00448 SVC_PERROR(sta_cyc(CYCHDR1)); 00449 break; 00450 case 'C': 00451 syslog(LOG_INFO, "#stp_cyc(1)"); 00452 SVC_PERROR(stp_cyc(CYCHDR1)); 00453 break; 00454 case 'b': 00455 syslog(LOG_INFO, "#sta_alm(1, 5000)"); 00456 SVC_PERROR(sta_alm(ALMHDR1, 5000)); 00457 break; 00458 case 'B': 00459 syslog(LOG_INFO, "#stp_alm(1)"); 00460 SVC_PERROR(stp_alm(ALMHDR1)); 00461 break; 00462 case 'V': 00463 #ifdef TOPPERS_SUPPORT_GET_UTM 00464 SVC_PERROR(get_utm(&utime1)); 00465 SVC_PERROR(get_utm(&utime2)); 00466 syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld", 00467 (ulong_t) utime1, (ulong_t) utime2); 00468 #else /* TOPPERS_SUPPORT_GET_UTM */ 00469 syslog(LOG_NOTICE, "get_utm is not supported."); 00470 #endif /* TOPPERS_SUPPORT_GET_UTM */ 00471 break; 00472 case 'v': 00473 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), 00474 LOG_UPTO(LOG_EMERG))); 00475 break; 00476 case 'q': 00477 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), 00478 LOG_UPTO(LOG_EMERG))); 00479 break; 00480 #ifdef BIT_KERNEL 00481 case ' ': 00482 SVC_PERROR(loc_cpu()); 00483 { 00484 extern ER bit_kernel(void); 00485 00486 SVC_PERROR(ercd = bit_kernel()); 00487 if (ercd >= 0) { 00488 syslog(LOG_NOTICE, "bit_kernel passed."); 00489 } 00490 } 00491 SVC_PERROR(unl_cpu()); 00492 break; 00493 #endif /* BIT_KERNEL */ 00494 default: 00495 break; 00496 } 00497 } while (c != '\003' && c != 'Q'); 00498 00499 syslog(LOG_NOTICE, "Sample program ends."); 00500 SVC_PERROR(ext_ker()); 00501 assert(0); 00502 }
void task | ( | intptr_t | exinf | ) |
参照先 assert, dis_tex(), dly_tsk(), ena_tex(), ext_tsk(), loc_cpu(), LOG_INFO, LOG_NOTICE, message, RAISE_CPU_EXCEPTION, slp_tsk(), SVC_PERROR, syslog(), task_loop, tslp_tsk(), と unl_cpu().
参照元 makeoffset().
00140 { 00141 volatile ulong_t i; 00142 int_t n = 0; 00143 int_t tskno = (int_t) exinf; 00144 const char *graph[] = { "|", " +", " *" }; 00145 char_t c; 00146 00147 SVC_PERROR(ena_tex()); 00148 while (1) { 00149 syslog(LOG_NOTICE, "task%d is running (%03d). %s", 00150 tskno, ++n, graph[tskno-1]); 00151 for (i = 0; i < task_loop; i++); 00152 c = message[tskno-1]; 00153 message[tskno-1] = 0; 00154 switch (c) { 00155 case 'e': 00156 syslog(LOG_INFO, "#%d#ext_tsk()", tskno); 00157 SVC_PERROR(ext_tsk()); 00158 assert(0); 00159 case 's': 00160 syslog(LOG_INFO, "#%d#slp_tsk()", tskno); 00161 SVC_PERROR(slp_tsk()); 00162 break; 00163 case 'S': 00164 syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno); 00165 SVC_PERROR(tslp_tsk(10000)); 00166 break; 00167 case 'd': 00168 syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno); 00169 SVC_PERROR(dly_tsk(10000)); 00170 break; 00171 case 'y': 00172 syslog(LOG_INFO, "#%d#dis_tex()", tskno); 00173 SVC_PERROR(dis_tex()); 00174 break; 00175 case 'Y': 00176 syslog(LOG_INFO, "#%d#ena_tex()", tskno); 00177 SVC_PERROR(ena_tex()); 00178 break; 00179 #ifdef CPUEXC1 00180 case 'z': 00181 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); 00182 RAISE_CPU_EXCEPTION; 00183 break; 00184 case 'Z': 00185 SVC_PERROR(loc_cpu()); 00186 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno); 00187 RAISE_CPU_EXCEPTION; 00188 SVC_PERROR(unl_cpu()); 00189 break; 00190 #endif /* CPUEXC1 */ 00191 default: 00192 break; 00193 } 00194 } 00195 }
void tex_routine | ( | TEXPTN | texptn, | |
intptr_t | exinf | |||
) |
参照先 assert, ext_tsk(), LOG_INFO, LOG_NOTICE, SVC_PERROR, syslog(), と tex_loop.
00201 { 00202 volatile ulong_t i; 00203 int_t tskno = (int_t) exinf; 00204 00205 syslog(LOG_NOTICE, "task%d receives exception 0x%04x.", tskno, texptn); 00206 for (i = 0; i < tex_loop; i++); 00207 00208 if ((texptn & 0x8000U) != 0U) { 00209 syslog(LOG_INFO, "#%d#ext_tsk()", tskno); 00210 SVC_PERROR(ext_tsk()); 00211 assert(0); 00212 } 00213 }
Copyright © 2008 by Kijineko Inc.