#include #include "mtask.h" #define MAX_TASK 7 void InitTask0( void(*Func)(void), void* a ) ; void InitTask1( void(*Func)(void), void* a ) ; void InitTask2( void(*Func)(void), void* a ) ; void InitTask3( void(*Func)(void), void* a ) ; void InitTask4( void(*Func)(void), void* a ) ; void InitTask5( void(*Func)(void), void* a ) ; void InitTask6( void(*Func)(void), void* a ) ; void InitMultiTask( void ) ; static void SetStackBoundString( int* a, int Number ) ; #define TASK0_NEED 0x100 #define TASK1_NEED 0x80 #define TASK2_NEED 0x80 #define TASK3_NEED 0x80 #define TASK4_NEED 0x80 #define TASK5_NEED 0x80 #define TASK6_NEED 0x100 //スタックのサイズは、要素の数を調整して決めること //スタックは、後ろから取られるので、StackHead が必要 int Stack0[ TASK0_NEED ]; int Stack1[ TASK1_NEED ]; int Stack2[ TASK2_NEED ]; int Stack3[ TASK3_NEED ]; int Stack4[ TASK4_NEED ]; int Stack5[ TASK5_NEED ]; int Stack6[ TASK6_NEED ]; static char TaskCondition[ MAX_TASK ] ; static void NullTask( void ) { for(;;) { SwitchTask() ; } } int* GetStack( int TaskNo ) { switch( TaskNo ) { case 0 : return( &Stack0[ TASK0_NEED ] ) ; case 1 : return( &Stack1[ TASK1_NEED ] ) ; case 2 : return( &Stack2[ TASK2_NEED ] ) ; case 3 : return( &Stack3[ TASK3_NEED ] ) ; case 4 : return( &Stack4[ TASK4_NEED ] ) ; case 5 : return( &Stack5[ TASK5_NEED ] ) ; case 6 : return( &Stack6[ TASK6_NEED ] ) ; } return( NULL ) ; } int* GetStackHead( int TaskNo ) { switch( TaskNo ) { case 0 : return( Stack0 ) ; case 1 : return( Stack1 ) ; case 2 : return( Stack2 ) ; case 3 : return( Stack3 ) ; case 4 : return( Stack4 ) ; case 5 : return( Stack5 ) ; case 6 : return( Stack6 ) ; } return( NULL ) ; } void KillTask( int TaskNo ) { int* Stack ; Stack = GetStack( TaskNo ) ; StartTask( TaskNo, NullTask ) ; TaskCondition[ TaskNo ] = 0 ; } void StartTaskWithStackClear( int TaskNo, void(*Func)(void) ) { int* Start ; int* Stack ; Start = GetStackHead( TaskNo ) ; Stack = GetStack( TaskNo ) ; for(; Start != Stack ; Start ++ ) { *Start = 0x5555 ; } SetStackBoundString( GetStackHead( TaskNo ), TaskNo ) ; if( Func == NULL ) { KillTask( TaskNo ) ; return ; } TaskCondition[ TaskNo ] = 1 ; switch( TaskNo ) { case 0 : InitTask0( Func, Stack ) ; break ; case 1 : InitTask1( Func, Stack ) ; break ; case 2 : InitTask2( Func, Stack ) ; break ; case 3 : InitTask3( Func, Stack ) ; break ; case 4 : InitTask4( Func, Stack ) ; break ; case 5 : InitTask5( Func, Stack ) ; break ; case 6 : InitTask6( Func, Stack ) ; break ; } } void StartTask( int TaskNo, void(*Func)(void) ) { int* Stack ; Stack = GetStack( TaskNo ) ; if( Func == NULL ) { KillTask( TaskNo ) ; return ; } TaskCondition[ TaskNo ] = 1 ; switch( TaskNo ) { case 0 : InitTask0( Func, Stack ) ; break ; case 1 : InitTask1( Func, Stack ) ; break ; case 2 : InitTask2( Func, Stack ) ; break ; case 3 : InitTask3( Func, Stack ) ; break ; case 4 : InitTask4( Func, Stack ) ; break ; case 5 : InitTask5( Func, Stack ) ; break ; case 6 : InitTask6( Func, Stack ) ; break ; } } void KillSystem( void ) { int i ; for( i = 0 ; i < MAX_TASK ; i ++ ) { KillTask( i ) ; } } /****************************************************************************** 機能要約 動いているようだが、今ひとつ納得が行かない関数なので使わないように 機能 引数 戻り値 注意 ******************************************************************************/ int GetMyTaskNo( void ) { int TaskNo ; TaskNo = SwitchTask() ; TaskNo &= 0xff ; //TaskNo -- ; if( TaskNo < 0 ) { TaskNo = MAX_TASK ; } return( TaskNo ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ int GetNumOfTask( void ) { return( MAX_TASK ) ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ static void SetStackBoundString( int* a, int Number ) { char* StackHead ; StackHead = ( char* )a ; strcpy( ( char* )StackHead, "StackArea( )CDEF0123456789ABCDEF" ) ; StackHead[ 10 ] = Number + '0' ; } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void InitMultiTaskSystem( void ) { int i ; int* Start ; int* End ; InitMultiTask() ; SetStackBoundString( GetStackHead( 0 ), 0 ) ; for( i = 1 ; i < MAX_TASK ; i ++ ) { Start = GetStackHead( i ) ; End = GetStack( i ) ; for(; Start != End ; Start ++ ) { *Start = 0x5555 ; } SetStackBoundString( GetStackHead( i ), i ) ; KillTask( i ) ; } } /****************************************************************************** 機能要約 機能 引数 戻り値 注意 ******************************************************************************/ void SleepInfinit( void ) { int TaskNo ; TaskNo = GetMyTaskNo() ; TaskCondition[ TaskNo ] = 0 ; for( ;; ) { SwitchTask() ; } return ; } long GetSp( void ) { asm( "mov.l sp,er0"); }