TRZ1104A (11) Natural Tiny Shell (NT-Shell) を使ってみる (2)2012年12月04日 21時01分40秒

NT-Shell
NT-Shell を実装するためにドキュメントを読んでいると、必要なのは getchar/putchar に相当する関数ではなくて read/write に相当する関数であることがわかった。
さっそく UARTReceive を作成する。
int UARTReceive(char *buf, int cnt, void *extobj)
{
    int i;

    for (i = 0; i < cnt; i++)
        buf[i] = UARTReceiveByte();
    return 0;
}


UARTSend も若干修正。
int UARTSend(const char *BufferPtr, int Length, void *extobj)
{
  while ( Length != 0 ) {
    /* THRE status, contain valid data */
#if !TX_INTERRUPT
    while ( !(LPC_UART->LSR & LSR_THRE) );
    LPC_UART->THR = *BufferPtr;
#else
    /* Below flag is set inside the interrupt handler when THRE occurs. */
    while ( !(UARTTxEmpty & 0x01) );
    LPC_UART->THR = *BufferPtr;
    UARTTxEmpty = 0;	/* not empty in the THR until it shifts out */
#endif
    BufferPtr++;
    Length--;
  }
  return 0;
}


callback はダミーにしておこう。
static int func_callback(const char *text, void *extobj)
{
    xprintf("%s\r\n",text);
    return 0;
}


コンパイル・リンク・フラッシュライト
起動と同時にプロンプトが出てくる。
いいね~。

文字列を打ち込んでみる。
バックスペースで修正
ヒストリー機能も使ってみる
callback が printf だけなので今の所ここまでだ。
ただ不便なのは一度ヒストリー機能を使うとコマンドラインに文字列が残ってしまうことだ。DOS プロンプトのように何もない状態にすることができない。

さて、これだけじゃ面白くないので NT-Monitor も動かしてみる。
その前にメモリ情報を実装しておこう。残念ながらこれが有効なのは scroll だけだ。

 


立ち上がりは NT-Shell と同じだ。
HELP を見ると
(Debug commands)
 Read    : RB|RW|RL [ADDR]
 Write   : WB|WW|WL [ADDR] [DATA]
 Dump    : DB|DW|DL [ADDR] (LEN)
 Fill    : FB|FW|FL [ADDR] [LEN] [DATA|TYPE]  (TYPE: inc, dec, rand, bitwalk)
 Copy    : CB|CW|CL [ADDR-SRC] [ADDR-DES] [LEN]
 Verify  : VB|VW|VL [ADDR-SRC] [ADDR-SRC] [LEN]
 Scroll  : SB|SW|SL (ADDR)
(Number formats)
 Binary      : b01010101 or 01010101b
 Octal       : o01234567 or 01234567o
 Decimal     : d12345678 or 12345678d
 Hexadecimal : h1234ABCD or 1234ABCDh
いろいろできるようだ。

NT-Monitor
使ってみると、ドキュメントにも書いてあるように Shell が弱い。NT-Shell と合体させるのがいいようだ。しかし、サイズは巨大になる。NT-Shell と NT-Monitor でフラッシュのほぼ全てが埋まってしまう。

もう一点、 Scroll を実行すると後はReset を実行するしかない。コマンドラインに戻れないのだ。これは深刻な問題なのでぜひ何とかしたい。

あ!、さらにもう一点ある。 Scroll を実行すると受信バッファがすぐに overflow してしまう。実害はないものの何とかしたいところだ。これは NT-Monitor の実装のせいもあるが UARTSend/UARTReceive の問題でもある。


そうそう、割り込みハンドラの部分を忘れていた。( uart.c )
volatile int32_t  UARTfp;
volatile int32_t  UARTlp;

void UART_IRQHandler(void)
{
    :
    :

  {
    /* Receive Data Available */
    UARTBuffer[UARTfp++] = LPC_UART->RBR;
    UARTfp %= BUFSIZE;
    if (UARTfp == UARTlp)
        GPIOSetValue( LED_PORT, LED_BIT, LED_ON );	/* buffer overflow */
    if((UARTCount = (UARTfp - UARTlp)) < 0)
        UARTCount += BUFSIZE;
  }

    :
    :
オーバーフローすると LED が点灯する。


参照:CuBeatSystems
    CQ出版社インターフェース2013年1月号P174「FM3マイコンで試す! メモリ・ダンプ・モニタの作成」

環境:TRZ1104A (LPC1114/301)
    + code.bundle.lpc11xx.keil.zip (V1.04)
    + Natural Tiny Shell (NT-Shell Version 0.2.0)
    + Natural Tiny Monitor (NT-Monitor Version 0.2.0)
    + TeraTerm Version 4.69
    + Keil MDK-ARM V4.53
    + GCC Sourcery CodeBench Lite 2012.09-63
    + KPIT Cummins GNU-Archive Editor v1.1
    + KPIT Cummins GNU-Map Viewer v1.0

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
このブログのタイトルは?(syslab と記入してください)

コメント:

トラックバック

このエントリのトラックバックURL: http://syslab.asablo.jp/blog/2012/12/04/6651700/tb