STM32でNUTTXを使ってみる

Task Scheduling Interfaces


前回 前々 回とTask Control Interfacesを紹介しました。
そこで、今回はTask Scheduling Interfacesによるスケジューリングポリシーの変更を紹介します。
Nuttxのスケジューリングポリシーは、.configで指定しますが、Task Scheduling Interfacesを使うと、実行時に変更することができます。

この動作を確認するためのサンプルアプリを公開しています。
こちらの手順でapps/examplesディレクトリに追加してくださ い。
以下の手順でサンプルアプリをファームに組み込みます。
$ make clean
$ make menuconfig

Application Configuration > Examples で以下のアプリを追加してください。


新規アプリを追加したらひたすらExitで抜けます。
最後に以下の画面で[.config]を上書きします。


新しい[.config]を使ってファームウェアをビルドし、新しいファームウェアをマイコンに書き込みます。
nshに接続するとtask_test3アプリが追加されています。




initの引数で実行すると、Inactive状態でmyTask1とmyTask2の2つのタスクが生成されます。
これらのタスクのスケジューリングポリシーはRRです。
nsh> task_test3 init
pid1=5 pid2=6
nsh> ps
  PID GROUP PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK   STACK COMMAND
    0     0   0 FIFO     Kthread N-- Ready              00000000 001000 Idle Task
    2     2 100 RR       Task    --- Running            00000000 002000 nsh_main
    5     5 100 RR       Task    --- Inactive           00000000 001984 myTask1 50000000 0
    6     6 100 RR       Task    --- Inactive           00000000 001984 myTask2 50000000 0
nsh>

initに続いてactivateの引数で実行すると、2つのタスクに実行権が与えられます。
スケジューリングポリシーはRRなので、myTask1とmyTask2は一定時間ごとに実行権を獲得します。
nsh> task_test3 activate
myTask1 start PID:5 loop:50000000 wait:0 system_timer:5279
myTask2 start PID:6 loop:50000000 wait:0 system_timer:5299
nsh> myTask1 end PID:5 system_timer:5808
myTask2 end PID:6 system_timer:5817



initに続いてfifoの引数で実行すると、2つのタスクのスケジューリングポリシーがFIFOに変わります。
nsh> task_test3 init
pid1=5 pid2=6
nsh> ps
  PID GROUP PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK   STACK COMMAND
    0     0   0 FIFO     Kthread N-- Ready              00000000 001000 Idle Task
    2     2 100 RR       Task    --- Running            00000000 002000 nsh_main
    5     5 100 RR       Task    --- Inactive           00000000 001984 myTask1 50000000 0
    6     6 100 RR       Task    --- Inactive           00000000 001984 myTask2 50000000 0
nsh> task_test3 fifo
nsh> ps
  PID GROUP PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK   STACK COMMAND
    0     0   0 FIFO     Kthread N-- Ready              00000000 001000 Idle Task
    2     2 100 RR       Task    --- Running            00000000 002000 nsh_main
    5     5 100 FIFO     Task    --- Inactive           00000000 001984 myTask1 50000000 0
    6     6 100 FIFO     Task    --- Inactive           00000000 001984 myTask2 50000000 0
nsh>

これに続けてactivateの引数で実行すると、2つのタスクに実行権が与えられます。
スケジューリングポリシーはFIFOなので、myTask1とmyTask2は順番に実行権を獲得します。
nsh> task_test3 activate
myTask1 start PID:5 loop:50000000 wait:0 system_timer:11718
myTask1 end PID:5 system_timer:11986
myTask2 start PID:6 loop:50000000 wait:0 system_timer:11987
myTask2 end PID:6 system_timer:12255



APIの使い方に間違いがあるかもしれません。
こ ちらのドキュメントで確認してください。

ファームの書き込み方法と、nshへの接続方法はこちらに紹介しています。
STM32F4 Discovery
STM32F3 Discovery
STM32F103RB Nucleo
STM32F103 BluePill/BlackPill
STM32F103 VEボード
STM32F407 VGボード

続く...