Esempio n. 1
0
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;
}
Esempio n. 2
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;
}