がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

MCUXpresso SDK Shellの使い方

MCUXpresso SDK Shellはなんぞ?

組み込み用Shellのことです。

f:id:gsmcustomeffects:20190209061021p:plain
Shellの動作例
SDKに最初から組み込まれているので選択するだけで楽に使えますしprintfとのリンクもIDEがやってくれるので便利です。

使い道としては

  • 信号処理のパラメータの変更
  • 内部データのダンプ

などなど、色々登録しておくと便利に使えます。

サンプルを動かしてみよう

まずはサンプルを動かしてどういうものなのか把握する。

f:id:gsmcustomeffects:20190211011145p:plain
サンプルの選択

サンプルを読み込んでビルドしてデバッグまでやってください。
そしてTeratermを開いて以下のように設定する。

f:id:gsmcustomeffects:20190211012501p:plain
シリアルポートの設定

そのあとプログラムを進めるとこのようになります。

f:id:gsmcustomeffects:20190211012438p:plain
コマンドの入力

次にled 1 onと入力してみましょう。
するとボード上のLEDが光ります。

逆にled 1 offと打つと消えます。

コマンドの詳細が知りたい場合helpコマンドで確認することも可能です。

f:id:gsmcustomeffects:20190211012643p:plain
helpコマンドの確認

実際にコマンドを追加してみる。

実際に使うにはコマンドを登録したり関数を登録しないといけません。
そんなわけで次はコマンドの追加をやってみます。
現在公開されてるShellとSDKドキュメントの引数がなんか違うので注意してください

スキームを示すと

  • 関数のプロトタイプ宣言
  • 関数の実装
  • コマンドの定義
  • コマンドの追加

上記の四つをやってあげればいいということになります。

関数のプロトタイプ

関数のプロトタイプはサンプルと同じようにするだけです。
今回は"mycommand"というタスクを作ってみます。

static shell_status_t mycommand(shell_handle_t shellHandle, int32_t argc, char **argv);

タスクの実装

先ほど宣言した関数の中身を実装していきます。
サンプルなのでエラー処理とかは手抜きでやります。

static shell_status_t mycommand(shell_handle_t shellHandle, int32_t argc, char **argv){
	SHELL_Printf("mycommand[%d]\r\n",(int32_t)atoi(argv[1]));
	return kStatus_SHELL_Success;
}

mycommand arg1で受け取ったarg1を数値に変換して返すというやつですね(実際プログラム中で数値として使ってないので変換するだけ無駄ですね。)
これで関数部分はできました。

コマンドの定義

つぎにShellから呼び出す時のコマンドを定義してあげます。
名前は同じように"mycommand"でいいと思います。

コマンドの追加はSHELL_COMMAND_DEFINEというマクロが定義されているのでそれを使うことにします。

SHELL_COMMAND_DEFINE(mycommand,"\r\n\"mycommand arg1\"\r\n",mycommand,1);

SHELL_COMMAND_DEFINE詳細ですがこのようになっています。
f:id:gsmcustomeffects:20190214041323p:plain

shell_command_tという構造体にいろいろセットするためのマクロです。
shell_command_t構造体の中身はこのようになっています。

f:id:gsmcustomeffects:20190214041616p:plain

引数を整理すると

  1. Shellで呼び出すためのコマンド(char)
  2. helpコマンドで出てくる説明(char)
  3. コマンドにより呼ばれる関数(関数ポインタ)
  4. 引数の数(uint8_t)

という感じです。
最後のメンバのlinkはマクロでは0をセットしてるんですがよくわからなかったです。わかる方教えてください。

コマンドの追加

最後にコマンドの追加です。

SHELL_RegisterCommand(s_shellHandle, SHELL_COMMAND(mycommand));

単純に関数ポインタを渡せばいい

以上でコマンド追加は終わり

実際に動作させてみる

サンプルエクスポートでやっているならコンソール出力はUARTになっているはずなのでTaratermでボーレート115200でCOMをオープンする。

f:id:gsmcustomeffects:20190214043806p:plain
追加したコマンドの動作例

こんな感じにできていればOKだ。

あとは体裁整えるなりコマンドを色々実装していくといいだろう。

よくわかってないこと

ファイルがいろいろ分かれててUARTとのリンクがどこでつながれてるかがよくわかんない
IDEが生成するファイル構造だとserial managerってファイルとdebug consoleってファイルがあるのでどことどこがリンクされてるのか?が結構わかりにくい

下手にsemihost有効にすると動かなくなりそうだしprintf,scanfをfloatありにした場合どうなるのか?、UARTの番号変えるのどうしたらいいのか等。
疑問点はいろいろある。