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