/* * メインタスク */ void main_task(VP_INT exinf) { int len; char buf[256]; const char cmnd[] = "RVAL\r"; unsigned char chr; vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf); Initialize(); while(1) { SIO_FlashBuffer(); strcpy(buf, cmnd); len = SIO_Write((unsigned char*)buf, sizeof(cmnd)); // Send Command chr = 0; while(chr != '\r') { len = SIO_ReadForever((unsigned char*)buf, 1); chr = buf[0]; tslp_tsk(100); } tslp_tsk(100); } syslog(LOG_NOTICE, "Sample program ends."); kernel_exit(); }
/* * モニタタスク */ void monitor(VP_INT exinf) { INT no, point; B c; /* モニタで使用するデータの初期化 */ mon_portid = mon_default_portid = (ID)exinf; mon_datatype = DATA_BYTE; mon_logmask = LOG_NOTICE; mon_lowmask = LOG_EMERG; current_tskid = MONTASK; mon_infile = stdin; if(mon_portid != CONSOLE_PORTID) syscall(serial_opn_por(mon_portid)); #ifdef NEED_MONITOR if(!need_monitor()) ext_tsk(); #endif /* NEED_MONITOR */ _setup_stdio(&mon_portid); #ifdef MONITOR_DELAY dly_tsk(MONITOR_DELAY); #endif /* MONITOR_DELAY */ #if defined(LOGTASK) && (LOGTASK_PRIORITY <= MONITOR_PRIORITY) chg_pri(LOGTASK, MONITOR_PRIORITY+1); dly_tsk(50); printf("change log task priority %d to %d !\n", LOGTASK_PRIORITY, MONITOR_PRIORITY+1); #endif printf(banner, (TMONITOR_PRVER >> 12) & 0x0f, (TMONITOR_PRVER >> 4) & 0xff, TMONITOR_PRVER & 0x0f); vmsk_log(LOG_UPTO(mon_logmask), LOG_UPTO(mon_lowmask)); syscall(serial_ctl_por(mon_portid, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* モニタのメインのデスパッチ */ do{ prompt(current_tskid); c = monitor_getstring(mon_command, &point); no = dispatch_command(mon_command, &point); putecho('\n'); if(no >= 0) mon_dispatch[no].func(&mon_command[point]); fflush(NULL); }while(c != KEY_EXT); printf("exit monitor !!\n"); }
/* * メインタスク */ void main_task(VP_INT exinf) { char c; ID tskid = TASK1; volatile UW i; INT tskno = 1; ER_UINT ercd; PRI tskpri; SYSTIM stime1, stime2; #ifndef OMIT_VGET_TIM SYSUTIM utime1, utime2; #endif /* OMIT_VGET_TIM */ vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int)exinf); syscall(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 */ task_loop = LOOP_REF; get_tim(&stime1); for (i = 0; i < task_loop; i++); get_tim(&stime2); task_loop = LOOP_REF * 400 / (stime2 - stime1); tex_loop = task_loop / 5; /* * タスクの起動 */ act_tsk(TASK1); act_tsk(TASK2); act_tsk(TASK3); /* * メインループ */ do { syscall(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); syscall(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); syscall(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); syscall(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); chg_pri(tskid, HIGH_PRIORITY); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); chg_pri(tskid, MID_PRIORITY); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); chg_pri(tskid, LOW_PRIORITY); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); syscall(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); syscall(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); syscall(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); syscall(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); syscall(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); syscall(rsm_tsk(tskid)); break; case 'M': syslog(LOG_INFO, "#frsm_tsk(%d)", tskno); syscall(frsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno); syscall(ras_tex(tskid, 0x0001)); break; case 'X': syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno); syscall(ras_tex(tskid, 0x0002)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); rot_rdq(HIGH_PRIORITY); rot_rdq(MID_PRIORITY); rot_rdq(LOW_PRIORITY); break; case 'c': sta_cyc(CYCHDR1); break; case 'C': stp_cyc(CYCHDR1); break; #ifndef OMIT_VGET_TIM case 'V': syscall(vxget_tim(&utime1)); syscall(vxget_tim(&utime2)); syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d", (UINT) utime1, (UINT) utime2); break; #endif /* OMIT_VGET_TIM */ case 'v': vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)); break; case 'q': vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); break; default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); kernel_exit(); }
/* * ログコマンド */ static UW log_command(B *command) { T_TPRM loglist; T_PCHK *p; INT point=0; B cmd=-1; UW value1, value2; UW tcount, ttime; UW type, address; int no, count; count = sizeof(mon_log) / sizeof(struct SUBCOMMAND_TABLE); if(command[point]){ for(no = 0 ; no < count ; no++){ if(compare_word(mon_log[no].subcommand, command, 0)){ skip_word(command, &point); cmd = mon_log[no].type; break; } } } switch(cmd){ case MONLOG_MODE: /* ロギングモード設定 */ if(!get_value(command, &point, &value1, DEC_BASE)) value1 = mon_logmask; if(!get_value(command, &point, &value2, DEC_BASE)) value2 = mon_lowmask; if(value1 <= LOG_DEBUG) mon_logmask = value1; if(value2 <= LOG_DEBUG) mon_lowmask = value2; vmsk_log(LOG_UPTO(mon_logmask), LOG_UPTO(mon_lowmask)); printf(" set logmask=%s lowmask=%s !\n", (VP_INT)log_mode[mon_logmask], (VP_INT)log_mode[mon_lowmask]); break; case MONLOG_TASK: /* タスクモニタ設定 */ if(!get_value(command, &point, &value1, DEC_BASE)) value1 = 0; if(value1 < 100) value1 = 0; value2 = 0; do{ count = get_tsklog(&loglist); if(value2 == 0){ /* はじめの1回 */ value2 =loglist.currtime; printf("-- time --"); for(no = 1 ; no <= NUM_LOG_DISP ; no++) printf(" --id=%04u --", no); printf(" -- others -- -vacancy-\n"); } value2 += value1; if(value1 == 0) printf("%010lu\n", (unsigned long)loglist.pervtime); printf("%010lu", (unsigned long)loglist.currtime); tcount = ttime = 0; for(no = 1 ; no <= count ; no++){ if(no <= NUM_LOG_DISP){ printf(" %04u %05lu.%01u", loglist.tlog[no].runcount, (unsigned long)(loglist.tlog[no].runtimes/10), (int)(loglist.tlog[no].runtimes%10)); } else{ tcount += loglist.tlog[no].runcount; ttime += loglist.tlog[no].runtimes; } } printf(" %04u %05lu.%01u", (int)tcount, (unsigned long)(ttime/10), (int)(ttime%10)); printf(" %07lu.%01u\n", (unsigned long)(loglist.tlog[0].runtimes/10), (int)(loglist.tlog[0].runtimes%10)); if(value1){ tslp_tsk(value2 - loglist.currtime); if(monitor_break()) value1 = 0; } }while(value1); break; case MONLOG_PORT: /* ポートモニタ設定 */ value2 = NUM_PCHK-1; if(get_value(command, &point, &value1, DEC_BASE)){ if((p = get_device_log(value1)) != 0){ value2 = value1; if(!get_value(command, &point, &type, DEC_BASE)){ if(p->logtype == 0) printf(" %02u %1u OFF =", (int)value1, (int)p->logtype); else printf(" %02u %1u %s =", (int)value1, (int)p->logtype, (VP_INT)log_mode[p->logtype]); command = mon_command; monitor_getstring(command, &point); if(!get_value(command, &point, &type, DEC_BASE)) type = 0; putchar('\n'); } if(type >= LOG_DEBUG) type = 0; p->logtype = type; if(!get_value(command, &point, &address, HEX_BASE)){ if(p->logtype == 0) printf(" %02d OFF %08lx =", (int)value1, (unsigned long)p->portaddress); else printf(" %02d %s %08lx =", (int)value1, (VP_INT)log_mode[p->logtype], (unsigned long)p->portaddress); command = mon_command; monitor_getstring(command, &point); address = p->portaddress; get_value(command, &point, &address, HEX_BASE); putchar('\n'); } p->portaddress = address; } } else value1 = 0; while(value1 <= value2){ if((p = get_device_log(value1)) != 0){ if(p->logtype > 0) printf(" %02d %s port=%08lx\n", (int)value1, (VP_INT)log_mode[p->logtype], (unsigned long)p->portaddress); else printf(" %02d OFF port=%08lx\n", (int)value1, (unsigned long)p->portaddress); } else break; value1++; } break; default: break; } return 0; }