int command_main(int argc, char *argv[]) { char *p; int size; long prev_time; send_use(SERIAL_DEFAULT_DEVICE); while (1) { send_write("command> "); /* プロンプト表示 */ /* コンソールからの受信文字列を受け取る */ kz_recv(MSGBOX_ID_CONSINPUT, &size, &p); if (p == NULL) { send_write("expired.\n"); continue; } p[size] = '\0'; if (!strncmp(p, "echo", 4)) { /* echoコマンド */ send_write(p + 4); /* echoに続く文字列を出力する */ send_write("\n"); } else if (!strncmp(p, "timer", 5)) { /* timerコマンド */ send_write("timer start.\n"); send_start(1000); } else if (!strncmp(p, "ping", 4)) { /* pingコマンド */ send_write("ping start.\n"); send_icmp(); } else if (!strncmp(p, "tftp", 4)) { /* tftpコマンド */ send_write("tftp start.\n"); send_tftp(); } else if (!strncmp(p, "debug", 5)) { /* デバッガ起動 */ set_debug_traps(); force_break(); } else if (!strncmp(p, "call", 4)) { /* ダミー関数の呼び出し */ send_write(func(p + 4)); } else if (!strncmp(p, "get", 3)) { /* get */ prev_time = get_time(); putxval(prev_time, 8); puts("\n"); } else { send_write("unknown.\n"); } kz_kmfree(p); } return 0; }
/* * 以下は割込みハンドラから呼ばれる割込み処理であり,非同期で * 呼ばれるので,ライブラリ関数などを呼び出す場合には注意が必要. * 基本として,以下のいずれかに当てはまる関数しか呼び出してはいけない. * ・再入可能である. * ・スレッドから呼ばれることは無い関数である. * ・スレッドから呼ばれることがあるが,割込み禁止で呼び出している. * また非コンテキスト状態で呼ばれるため,システム・コールは利用してはいけない. * (サービス・コールを利用すること) */ static int consdrv_intrproc(struct consreg *cons) { unsigned char c; char *p; if (serial_is_recv_enable(cons->index)) { /* 受信割込み */ c = serial_recv_byte(cons->index); if (c == 0x03) { force_break(); return 0; } if (c == '\r') /* 改行コード変換(\r→\n) */ c = '\n'; send_string(cons, &c, 1); /* エコーバック処理 */ if (cons->id) { if (c != '\n') { /* 改行でないなら,受信バッファにバッファリングする */ cons->recv_buf[cons->recv_len++] = c; } else { /* * Enterが押されたら,バッファの内容を * コマンド処理スレッドに通知する. * (割込みハンドラなので,サービス・コールを利用する) */ p = kx_kmalloc(CONS_BUFFER_SIZE); memcpy(p, cons->recv_buf, cons->recv_len); kx_send(MSGBOX_ID_CONSINPUT, cons->recv_len, p); cons->recv_len = 0; } } } if (serial_is_send_enable(cons->index)) { /* 送信割込み */ if (!cons->id || !cons->send_len) { /* 送信データが無いならば,送信処理終了 */ serial_intr_send_disable(cons->index); } else { /* 送信データがあるならば,引続き送信する */ send_char(cons); } } return 0; }