マルチタスク1

MultitaskingTest1



MultitaskingTest1.h
#ifndef _MULTTASKTEST
#define _MULTTASKTEST

#include "Task.h"

class MultitaskingTest1 : public Task
{
public:
  // execute()の状態
  int state1  ;
  int state2  ;
  char *name;
  MultitaskingTest1 ( char* name );
  void show ( char* text );

protected:
  virtual void execute ();
};

#endif
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 


MultitaskingTest1.cpp



MultitaskingTest1.cpp
#include "MultitaskingTest1.h"
extern Serial pc;

MultitaskingTest1::MultitaskingTest1 ( char* name ) {
    this->name = name ;
    state1 = 1;
    state2 = 2;
}

void MultitaskingTest1::show ( char* text ) {
    pc.printf ("%s : %s\n", name, text ) ;
}

void MultitaskingTest1::execute () {
    switch ( state ) {
      case 0:
        show ( "Initial state" ) ;
        nextState ( state1 ) ;
        break ;

      case 1:
        show ( "State 1" ) ;
        nextState ( state2 ) ;
        break ;

      case 2:
        show ( "State 2" ) ;
        stop () ;
        break ;

      default:    // 異常な状態を捕獲し停止するためにdefaultにする
        stop () ;
        break;
    } // switch
} //execute
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28
29 
30 
31 
32 
33 
34 
35 

メインプログラム



main.cpp
#include "mbed.h"
#include "MultitaskingTest1.h"

Serial pc(USBTX, USBRX); // tx, rx

int main()
{
  pc.baud(115200);
  new MultitaskingTest1 ( "Task 1" ) ;
  new MultitaskingTest1 ( "Task 2" ) ;
  new MultitaskingTest1 ( "Task 3" ) ;

  Task::TaskManager () ;
  pc.printf( "All done\n" ) ;
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 


コンストラクターはタスクの名前である一つのString型の引数を持っています。そのタスクは現在の状態を表示し、出力の一部としてタスク名を含めます。各々のタスクはタスクがスタートする初期化状態を含めて3つの状態を段階的に移動します。タスクは「State 2」を表示して終了します。

mainメソッドはタスクが作られるところであり、タスクマネージャーはそのタスクを実行します。3つのタスクがmainメソッドの最初で作られます。コンストラクターの引数は各々を識別する助けになります。タスクへの参照はそのタスクが他のタスクによって操作される時に限って必要になります。それは、そのコンストラクターがそのタスクをタスクマネージャーのアクティブリストに付け加えるからです。

アクティブリストの中のタスクはTask::TaskManagerメソッドが呼ばれたときに実行されます。各々のタスクのexecuteメソッドは全てのタスクが終了するまで呼ばれます。この場合、各々のタスクはメッセージウィンドウに次のようにメッセージをプリントします。

Task1:Initial state

各々のタスクからの出力は各々のタスクが一行の出力を生成した後でexecuteメソッドを出るので重なるでしょう。

TaskManagerメソッドはstate2で起こるような、全てのタスクが停止したときに戻ります。state2のアクションの順序はexecuteメソッドが完了するように実行するので無関係であることに注意してください。stopメソッドはアクティブリストから呼んでいるタスクを単純に削除します。これはexecuteメソッドが戻るまでタスクには影響を与えません。

実行結果
Task 3 : Initial state
Task 1 : Initial state
Task 2 : Initial state
Task 3 : State 1
Task 1 : State 1
Task 2 : State 1
Task 3 : State 2
Task 1 : State 2
Task 2 : State 2
All done