| CallableTask.h |
|---|
#ifndef _CALLABLESTACKENTRY
#define _CALLABLESTACKENTRY
#include "InterruptTask.h"
#include "common.h"
#include "CallStackEntry.h"
class CallableTask : public InterruptTask
{
// スタックはタスクに対して排他的である
protected:
CallStackEntry* stack; // 修正
/**
* 現在のパラメータを得る
* 戻り:直近のcallStateで渡されたパラメータを戻す
*/
public:
CallableTask();
Object getParameter ();
/**
* 状態を呼ぶ
*
* 入力:int callState: 入る次の状態
* 入力:Object parameter: 呼び出しパラメータ
* 入力:int returnState: returnState()が呼ばれたときに入る状態
*/
void callState ( int callState, Object parameter, int returnState );
void setState ( int callState, Object parameter, int returnState );
/**
* 状態を呼ぶ
*
* 入力:int callState: 入る次の状態
* 入力:int returnState: returnState()が呼ばれたときに入る状態
*/
void callState ( int callState, int returnState );
/**
* 一番最近のcallStateで指定された前の状態に戻る
* もし前の呼び出し無しで実行されたらばタスクが終了する
*/
void returnState ();
};
#endif
|
| CallableTask.cpp |
|---|
#include "CallableTask.h"
/**
* この型のタスクは呼び出し規約の基本的な状態をサポートする。
*
* タスクは他の状態を呼ぶことよって状態を変えることができる
* これらの状態は呼び出し状態に戻ることができる。パラメータはまだ
* 実装されていないがサブクラスは簡単にできる
*/
/**
* 現在のパラメータを得る
* 戻り:直近のcallStateで渡されたパラメータを戻す
*/
CallableTask::CallableTask()
{
stack = (CallStackEntry*)null;
}
Object CallableTask::getParameter () {
return ( stack == (CallStackEntry*)null ) ? (CallStackEntry*)null : (Object)(stack->parameter) ;
}
/**
* 状態を呼ぶ
*
* 入力:int callState: 入る次の状態
* 入力:Object parameter: 呼び出しパラメータ
* 入力:int returnState: returnState()が呼ばれたときに入る状態
*/
void CallableTask::callState ( int callState, Object parameter, int returnState ) {
setState ( callState, parameter, returnState );
}
void CallableTask::setState ( int callState, Object parameter, int returnState ) {
// 新しいスタックエントリーを加える
stack = CallStackEntry::getEntry ( returnState, stack, parameter ) ;
// 新しい状態を設定する
nextState ( callState ) ;
}
/**
* 状態を呼ぶ
*
* 入力:int callState: 入る次の状態
* 入力:int returnState: returnState()が呼ばれたときに入る状態
*/
void CallableTask::callState ( int callState, int returnState ) {
setState ( callState, (void*)null, returnState ) ;
}
/**
* 一番最近のcallStateで指定された前の状態に戻る
* もし前の呼び出し無しで実行されたらばタスクが終了する
*/
void CallableTask::returnState () {
CallStackEntry* oldEntry ;
if ( stack == (CallStackEntry*)null ) {
state = terminate ;
} else {
// Setup return state
state = stack->returnState ;
// スタックをPopする
oldEntry = stack ;
stack = oldEntry->nextEntry ;
// Free entry
oldEntry->free () ;
}
}
|
| CallStackEntry.h |
|---|
#ifndef _CALLSTACKENTRY
#define _CALLSTACKENTRY
#include "common.h"
/**
* CallableTaskスタックを実装するのに用いる
*/
class CallStackEntry {
protected:
static CallStackEntry* freeList;
CallStackEntry (){};
public:
void* parameter ;
int returnState ;
CallStackEntry* nextEntry ;
/**
* freeリストのエントリーを戻す
*/
void free ();
/**
* 用いていないスタックエントリーを返す
* フリーリストが空ならば新しいエントリーが作られる
*
* 入力:int returnState: 新しいエントリーに保存される
* 入力:CallStackEntry nextEntry:新しいエントリーに保存される
* 入力:Object parameter:新しいエントリーに保存される
*/
static CallStackEntry* getEntry
( int returnState
, CallStackEntry* nextEntry
, void* parameter);
};
#endif
|
| CallStackEntry.cpp |
|---|
#include "CallStackEntry.h"
#include "common.h"
/**
* freeリストのエントリーを戻す
*/
void CallStackEntry::free () {
nextEntry = freeList ;
freeList = this ;
}
/**
* 用いていないスタックエントリーを返す
* フリーリストが空ならば新しいエントリーが作られる
*
* 入力:int returnState: 新しいエントリーに保存される
* 入力:CallStackEntry nextEntry:新しいエントリーに保存される
* 入力:Object parameter:新しいエントリーに保存される
*/
CallStackEntry* CallStackEntry::getEntry
( int returnState
, CallStackEntry* nextEntry
, void* parameter)
{
CallStackEntry* result ;
if ( freeList == (CallStackEntry*)null ) {
result = new CallStackEntry () ;
} else {
result = freeList ;
freeList = result->nextEntry ;
}
// スタックリストにエントリーを加える
result->returnState = returnState ;
result->nextEntry = nextEntry ;
result->parameter = parameter ;
return result ;
}
CallStackEntry* CallStackEntry::freeList = (CallStackEntry*)null ;
|
| garbage collection |
|---|
|
OSのメモリ管理機能の一つ。プログラムが使用しなくなったメモリ領域や、プログラム間の隙間のメモリ領域を集めて、連続した利用可能なメモリ領域を増やす技術。これが不完全なOSは次第に利用可能なメモリが減ってゆくため、一定期間ごとに再起動を強いられることになる。Java言語の実行環境(JVM)は自身がガーベジコレクション機能を持っており、Javaプログラマがメモリ管理に気を使わなくてもいいようにしている。 「garbage」は「ごみ、がらくた」という意味。 |
| aCallStateParameter |
|---|
class aCallStateParameter extends Object {
public int bufferSize;
public byte buffer[20];
public boolean success;
}
|
| MutlitaskingTest4.h |
|---|
#include "CallableTask.h"
#include "common.h"
class MutlitaskingTest4 : public CallableTask
{
private:
static const int state1 = 1;
static const int state2 = 2;
static const int call1 = 10;
static const int call2 = 20;
static const int call3 = 30;
protected:
void execute ();
public:
MutlitaskingTest4();
};
|
| MultitaskingTest4.cpp |
|---|
#include "MultitaskingTest4.h"
void MutlitaskingTest4::execute ()
{
switch ( state ) {
case initialState:
pc.printf ( "Starting\n" ) ;
callState ( call1, (void*)"test base", state1 ) ;
break ;
case state1:
pc.printf ( "State 1\n" ) ;
callState ( call2, state2 );
break ;
case state2:
pc.printf ( "State 2\n" ) ;
nextState ( terminate ) ;
break ;
// --- Call 1 -----
case call1:
pc.printf ( "Enter call 1\n" ) ;
pc.printf ( "%s\n",(char*) getParameter ()) ;
pc.printf ( "Exit call 1\n" ) ;
returnState () ;
break ;
// --- Call 2 -----
case call2:
pc.printf ( "Entering call 2\n" ) ;
callState ( call1, (void*)"test 2", call3 ) ;
break ;
case call3:
pc.printf ( "Done with call 2\n" ) ;
returnState () ;
break ;
// ---- End of program ---
default: // 異常の状態を検知した場合終了する
pc.printf("異常の状態 state:%d\n", state);
case terminate:
pc.printf ( "All done\n" ) ;
stop () ;
break;
}
}
MutlitaskingTest4::MutlitaskingTest4()
{
state = initialState;
pc.printf("MutlitaskingTest4\n");
}
|
| main.cpp |
|---|
#include "mbed.h"
#include "MultitaskingTest4.h"
Serial pc(USBTX, USBRX); // tx, rx
int main()
{
pc.baud(115200);
MutlitaskingTest4 mt4 ;
Task::TaskManager () ;
pc.printf( "main End\n" ) ;
}
|
MutlitaskingTest4 Starting Enter call 1 test base Exit call 1 State 1 Entering call 2 Enter call 1 test 2 Exit call 1 Done with call 2 State 2 All done main End