TRZ1104A (11) Natural Tiny Shell (NT-Shell) を使ってみる (2) ― 2012年12月04日 21時01分40秒
NT-Shell を実装するためにドキュメントを読んでいると、必要なのは getchar/putchar に相当する関数ではなくて read/write に相当する関数であることがわかった。
さっそく UARTReceive を作成する。
UARTSend も若干修正。
callback はダミーにしておこう。
コンパイル・リンク・フラッシュライト
起動と同時にプロンプトが出てくる。
いいね~。
文字列を打ち込んでみる。
バックスペースで修正
ヒストリー機能も使ってみる
callback が printf だけなので今の所ここまでだ。
ただ不便なのは一度ヒストリー機能を使うとコマンドラインに文字列が残ってしまうことだ。DOS プロンプトのように何もない状態にすることができない。
さて、これだけじゃ面白くないので NT-Monitor も動かしてみる。
その前にメモリ情報を実装しておこう。残念ながらこれが有効なのは scroll だけだ。
立ち上がりは NT-Shell と同じだ。
HELP を見ると
使ってみると、ドキュメントにも書いてあるように Shell が弱い。NT-Shell と合体させるのがいいようだ。しかし、サイズは巨大になる。NT-Shell と NT-Monitor でフラッシュのほぼ全てが埋まってしまう。
もう一点、 Scroll を実行すると後はReset を実行するしかない。コマンドラインに戻れないのだ。これは深刻な問題なのでぜひ何とかしたい。
あ!、さらにもう一点ある。 Scroll を実行すると受信バッファがすぐに overflow してしまう。実害はないものの何とかしたいところだ。これは NT-Monitor の実装のせいもあるが UARTSend/UARTReceive の問題でもある。
そうそう、割り込みハンドラの部分を忘れていた。( uart.c )
参照: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
さっそく 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いろいろできるようだ。
使ってみると、ドキュメントにも書いてあるように 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: http://syslab.asablo.jp/blog/2012/12/04/6651700/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。