TRZ1104A (10) Natural Tiny Shell (NT-Shell) を使ってみる (1)2012年12月02日 22時30分02秒

Interface 2013年1月号に「 FM3マイコンで試す!メモリ・ダンプ・モニタの作成」というのがあった。
さっそく私も試してみたくなった。

まず、Natural Tiny Shell (NT-Shell Version 0.2.0)をダウンロード。
ついでに Natural Tiny Monitor (NT-Monitor Version 0.2.0) もダウンロード。

次に、組み合わせるCPUを選ばなくてはならない。
FRK-FM3 (MB9BF618T)
CQ-LM3S3748
CQ-FRK-NXP-ARM (LPC2388)
SH7085
FRK-RX62N
FRK-SH2A (SH2A-7262)
TRZ1104A (LPC1114/301)
TRZ1002H (H8SX-1655)
AKI-SH2/7045F
BTC050 (SH-7045F)
CQ-STARM (STM32F103VBT6)
こうやって書き出してみるとずいぶんたくさん持っているものだ。 もちろんこれが全てではない。
この中では TRZ1104A が手ごろのような気がするのでこれで進める。
ベースのサンプルは code.bundle.lpc11xx.keil.zip の UART でいいだろう。
と、始めてみたものの uart.c の中に getchar に相当する関数がない。
putchar に相当する関数もないが、これは以前 printf のテストで作成したので問題ない。
最悪なのは UART バッファーが FIFO 形式になっていないことだ。この部分は修正しよう。
まずは UARTSendByte からだ。
int UARTSendByte(char c)
{
#if CONFIG_UART_ENABLE_TX_INTERRUPT==1
      /* Below flag is set inside the interrupt handler when THRE occurs. */
      while ( !(UARTTxEmpty & 0x01) );
      LPC_UART->THR = c;
      UARTTxEmpty = 0;	/* not empty in the THR until it shifts out */
#else
      while ( !(LPC_UART->LSR & LSR_THRE) );
      LPC_UART->THR = c;
#endif
      return 1;
}

次に UARTReceiveByte 。この部分はバッファーからキャラクタを取り出すだけにする。
int UARTReceiveByte(void)
{
  int chr;

  while (UARTfp == UARTlp) ;
  LPC_UART->IER = IER_THRE | IER_RLS;		/* Disable RBR */
  chr = UARTBuffer[UARTlp++];
  UARTlp %= BUFSIZE;
  UARTCount--;
  LPC_UART->IER = IER_THRE | IER_RLS | IER_RBR;	/* Re-enable RBR */
  return chr;
}

後は割り込みハンドラの部分だが、今日はここまでにしておこう。

参照: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)
    + 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

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

TRZ1104A (12) Natural Tiny Shell (NT-Shell) を使ってみる (3)2012年12月09日 21時25分34秒

NT-Shell が Freeze
UARTSend/UARTReceive をもう少ししっかりしたものにしたいと思って探していると microBuilder.eu の LPC1114 Code Base を見つけた。
これは以前使ってみたことがある。簡単なコマンドシェルが実装してあったのが記憶にある。
この中の uart.c が使えるはずだ。と思ってみてみると、現在のものとたいして変わらない。
却下!

次を探していると ELM-ChaN32ビットへの誘い を見つけた。
この中の mary_ball.zip に uart.c がある。
すばらしい!
これぞ私が求めていたものだ。

というわけで uart.c と NT-Shell を合体させて動かしてみる。
コマンドラインは編集できる。
しかし、Enter key を入力するとそのまま Freeze してしまう。
なぜ?

参照:CuBeatSystems
    32ビットへの誘い(ELM-ChaN)
    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

TRZ1104A (13) Natural Tiny Shell (NT-Shell) を使ってみる (4)2012年12月15日 12時16分20秒

NT-Shell に dump を追加
ELM-ChaN の uart.c と NT-Shell を合体させてうまく動かなかった原因は?
なんてことは無い単純な記述ミスだった。
  xdev_out(uart0_getc);	誤
  xdev_in(uart0_putc);	誤

  xdev_out(uart0_putc);	正
  xdev_in(uart0_getc);	正
こんな所を間違っているとは思わないのでてこずってしまった。
dump も実装してご覧の通り。

しかし、デバッグにここまでの機能は必要ないだろう。
と言いつつライブラリにする。
これで LPC1114 版 NT-Shell は終了としておこう。

参照:CuBeatSystems
    32ビットへの誘い(ELM-ChaN)
    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

TRZ1104A (14) Natural Tiny Monitor (NT-Monitor) を使う2012年12月17日 21時00分51秒

NT-Monitor の不具合対策

1.Scroll を実行するとコマンドラインに戻れない。
 ntmcmd_scroll.c の vtsend_reset() を削除する。
 CursorHome 程度にとどめておくのがよいだろう。
 (TeraTerm 以外を使っている人は問題ないかもしれない。しかし、TeraTerm を使う限り Reset を実行すると動かなくなる。)

2.Scroll を実行すると受信バッファが overflow してしまう。
 実害は無いので放置。
 (受信バッファを読み飛ばせばいいのか?)

3.Shell の機能 UP
 ntmconf.h の NTMCONF_USE_NTSHELL を 1 にして NT-Shell を組み込む。
 (prompt を指定したい場合は ntm.c の ntm_execute() の中に追加。)
    ntmshell_set_prompt(ntmshell, "SYSLAB>");

Shell も Monitor もいいが、やはり最初に実装したいのは printf かな?
数値が見えるのが一番ありがたい。


参照:CuBeatSystems
    32ビットへの誘い(ELM-ChaN)
    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

CQ-LM3S3748 (16) NT-Shell と NT-Monitor の実装2012年12月19日 20時29分17秒

画面右半分の表示が更新できない
NT-Shell と NT-Monitor を CQ-LM3S3748 に実装してみた。
こちらはシリアルが USB 仮想 COM PORT で FLASH ROM も大きいので余裕のはずだ。
使用するプロジェクトは以前使った物にする。

まず、メモリ情報を実装。

 



次に USBread/USBwrite

 


特に問題は無い。
バイナリでサイズは37k。まずまずか?
今回は Scroll Dump をハイパーターミナルでも試してみる。
おやおや、表示がおかしい。
画面右半分の表示が更新できない。(右上図)
本来全てのデータが FF でなければならない。
しかし、TeraTerm と違って vtsend_reset は受け付けてくれる。
一方 TeraTerm はというと画面表示に問題は無い。そして vtsend_reset も受け付ける。
さすがに USB だけあって画面の表示は高速にこなす。

それにしても VT100 をエミュレートするのって難しいのか?
どのターミナルを使ってもまともに表示できないことが多い。

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

環境:CQ-LM3S3748
    + SW-EK-LM3S3748-9453.exe (boards\ek-lm3s3748\usb_dev_cserial)
    + 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

FRK-FM3 (7) NT-Shell と NT-Monitor の実装 (1)2012年12月25日 22時10分44秒

FRK-FM3 virtual com port
最後はやはり FRK-FM3 だろう。
CQ出版社のタイトルどおり「FM3マイコンで試す」事にする。
これも手っ取り早く使うためには USB 仮想 COM PORT が便利だ。 ベースとなるサンプルは mb9bfxxx_usb_device_virtual_com_port-v11.zip にする。
startup_mb9bf61x.s と linker script は以前使用したもの
main.c に UsbClassCdc_Receive と UsbClassCdc_Send を追加する。
int UsbClassCdc_Receive(char *buf,int len, void *extobj)
{
    while(len){
        *buf=UsbClassCdc_ReceiveByte();
        buf++;
        len--;
    }
}
int UsbClassCdc_Send(const char *data,int size, void *extobj)
{
    while(size){
        UsbClassCdc_SendByte(*data);
        data++;
        size--;
    }
}

    :
    :


int main(void)
{
    :
    :

  ntm_execute(&(w.ntmshell), UsbClassCdc_Receive, UsbClassCdc_Send, (void *)&w);

    :
    :


コンパイル/ダウンロード/リセット
デバイスドライバを要求してくる。
mb9bfxxx_usb_device_virtual_com_port-v11\Windows Drivers を指定。
デバイスマネージャで見ると新しいポートが追加されている。

ターミナルを接続するとメッセージとプロンプトが表示される。
いい感じだ。
sb 0 [Enter]

動かない。
ラインエディタのようなものから抜け出してこない。
文字の出力はできているので read に相当する関数がうまく動けばよいのだが、今の所どこで引っかかっているのかわからない。

どうやらこのまま年を越しそうな予感がする。

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

環境:FRK-FM3 (MB9BF618T)
    + mb9bfxxx_usb_device_virtual_com_port-v11.zip
    + Natural Tiny Shell (NT-Shell Version 0.2.0)
    + Natural Tiny Monitor (NT-Monitor Version 0.2.0)
    + TeraTerm Version 4.69
    + FUJITSU USB DIRECT Programmer V01L07
    + 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