diff --git a/trunk/renge/renge.c b/trunk/renge/renge.c index 1659293..7939011 100644 --- a/trunk/renge/renge.c +++ b/trunk/renge/renge.c @@ -25,7 +25,7 @@ bit renge_task_interval_run_force; u8 system_time; -extern const task_info tasks[]; + #include "..\bsr_system.h" extern system_status_ system_status; @@ -38,8 +38,13 @@ static void renge_task_immed_del(); +//****************************************************************************** +task_status_immed ( *tasks_immed[ TASK_IMMED_RUN_LIST_MAX ] )(); + + + /****************************************************************************** - 初期化。 + 初期化 ・タスクシステムの動的部分の初期化 ・インターバルタイマ *****************************************************************************/ @@ -72,16 +77,14 @@ void renge_interval(){ そのうち、逐次起動と混ぜるかもしれない。 *****************************************************************************/ err renge_task_interval_run(){ - task_info *current_task; + u8 i; // インターバル起動 if( renge_flg_interval == 1 ){ renge_flg_interval = 0; - for( current_task = &tasks[0]; - current_task != &tasks[TSK_LAST]; - current_task += 1 ) + for( i = 0; i != TSK_LAST; i += 1 ) { - current_task -> task(); + tasks[ i ](); } } return( ERR_SUCCESS ); @@ -100,174 +103,146 @@ err renge_task_interval_run(){     それ以外 次のタイミングでまた実行 *****************************************************************************/ -#define IMMED_RSV_TASKS_NUM 10 -task_immed tasks_immed[ IMMED_RSV_TASKS_NUM ]; // タスクへのポインタの配列 -u8 task_immed_index = 0; - /************************************** **************************************/ void renge_task_immed_init(){ - /* - グローバルなメモリはスタートアップルーチンで0に初期化される -u8 i; - -for( i = 0; i < IMMED_RSV_TASKS_NUM; i++ ){ - tasks_immed[ i ] = (void *)0; - } - task_immed_index = 0; - */ -} - - - -/************************************** - 本当にクリティカルなタイミングだと -タスクの順番が入れ替わるけど滅多に起きないであろう事、 -多くの場合は順番が入れ替わっても問題ないので -割り込み禁止を最小にすることを最優先 -(immedの否定...) -割り込み禁止 36us → - **************************************/ -err renge_task_immed_add( task_immed new_task ){ u8 i; - u8 place; - // 末尾の連続した空き領域の先頭でかつ、 - // 重複登録を避ける - for( i = place = 0; i < IMMED_RSV_TASKS_NUM; i += 1 ) - { - if( tasks_immed[ i ] != ( void * )0 ) - { - place = i+1; // 最近見つけた、タスクリストの最後尾 - } - if( tasks_immed[ i ] == new_task ) // 重複登録 - { - // while(1){ - NOP(); // アサートで止めたい - // } - return( ERR_ERR ); - } - } + for( i = 0; i < TASK_IMMED_RUN_LIST_MAX; i++ ){ + tasks_immed[ i ] = TSK_IMM_EMPTY_; + } +} - if( place > IMMED_RSV_TASKS_NUM ) - { // タスク登録しすぎ(無いはず - // while(1){ - NOP(); // アサートで止めたい - // - return( ERR_ERR ); - } - else - { - DI(); - DBG_LED_WIFI_2_on; - // もたもたしているうちに割り込み等から割り込まれるのを考慮 - // 滅多にないはずだが - for( ; place < IMMED_RSV_TASKS_NUM; place += 1 ) - { - if( tasks_immed[ place ] == ( void * )0 ) - { - tasks_immed[ place ] = new_task; - DBG_LED_WIFI_2_off; - EI(); - return( ERR_SUCCESS ); - } - } - // 割り込まれてタスク登録できなくなった - DBG_LED_WIFI_2_off; - EI(); - return( ERR_ERR ); - } + + +/************************************** + 逐次実行タスクの登録 + 割り込み禁止 36us → + **************************************/ +err renge_task_immed_add( task_status* new_task ){ + u8 i; + + // リストの空きの先頭に登録 + // 削除したばかりのタスクは、削除マークとなり、空きとは明示的に区別される + // 重複登録を避ける + for( i = 0; i < TASK_IMMED_RUN_LIST_MAX; i += 1 ) + { + if( tasks_immed[ i ] != TSK_IMM_EMPTY_ ) + { + // 空きではなかった + if( tasks_immed[ i ] == new_task ) + { + // 重複登録はしない + NOP(); + return( ERR_ERR ); + } + } + else + { + // 空きを見つけた + DI(); + DBG_LED_WIFI_2_on; + // もたもたしているうちに割り込み等から割り込まれるのを考慮 + // 滅多にないはずだが + for( ; i < TASK_IMMED_RUN_LIST_MAX; i += 1 ) + { + if( tasks_immed[ i ] == TSK_IMM_EMPTY_ ) + { + tasks_immed[ i ] = new_task; + DBG_LED_WIFI_2_off; + EI(); + return( ERR_SUCCESS ); + } + } + // 割り込まれてタスク登録できなくなった + DBG_LED_WIFI_2_off; + EI(); + return( ERR_ERR ); + } + } + // タスク登録しすぎ(無いはず + NOP(); // デバッガで捕まえるため + return( ERR_ERR ); } /************************************** + 逐次実行タスクの実行 **************************************/ err renge_task_immed_run(){ - u8 task_id; - u8 last_task; + u8 list_id; + u8 last_task_id; do{ - last_task = 0xFF; + last_task_id = 0xFF; - for( task_id = 0; task_id < IMMED_RSV_TASKS_NUM; task_id += 1 ){ - if( tasks_immed[ task_id ] != 0 ){ - if( tasks_immed[ task_id ]() == ERR_FINISED ){ - tasks_immed[ task_id ] = (void*)0; - last_task = task_id; + for( list_id = 0; list_id < TASK_IMMED_RUN_LIST_MAX; list_id += 1 ){ + if( tasks_immed[ list_id ] != TSK_IMM_EMPTY_ ){ + if( tasks_immed[ list_id ] == TSK_IMM_DELETED_ ) + { + NOP(); + // タスク管理の不備 + // 存在しないタスクを実行しようとした + // タスクの削除後の処理がまずい + // 予期しないタイミングで immed_run が呼ばれた + } + else + { + if( tasks_immed[ list_id ]() == ERR_SUCCESS ) + { + tasks_immed[ list_id ] = TSK_IMM_DELETED_; + } + last_task_id = list_id; } } } // タスク削除 { - if( last_task != 0xFF ) + if( last_task_id != 0xFF ) { u8 i,j; // リスト前詰め - i = 0; - j = 1; - for( ; j < IMMED_RSV_TASKS_NUM; j++) + i = 0; // 前詰め後リストの最後尾 + j = 0; // リストの後ろの方のタスクを探す + + for( ; j < TASK_IMMED_RUN_LIST_MAX; j++) +// for( ; j <= last_task_id; j++) // 間で割り込まれたときに困る { DI(); - DBG_LED_WIFI_2_on; - if( tasks_immed[ i ] == (void *)0 ) + DBG_LED_WIFI_2_on; + if( tasks_immed[ i ] == TSK_IMM_DELETED_ ) { - if( tasks_immed[ j ] != (void *)0 ) + tasks_immed[ i ] = TSK_IMM_EMPTY_; + } + if( tasks_immed[ i ] == TSK_IMM_EMPTY_ ) + { + // 前詰めできるスペースを見つけた + if(( tasks_immed[ j ] != TSK_IMM_EMPTY_ ) + && ( tasks_immed[ j ] != TSK_IMM_DELETED_ )) { + // 探索隊が前詰めすべきタスクを見つけた tasks_immed[ i ] = tasks_immed[ j ]; - tasks_immed[ j ] = (void *)0; + tasks_immed[ j ] = TSK_IMM_EMPTY_; i += 1; } } else { + // 実行すべきタスクが滞留することになった i += 1; } - DBG_LED_WIFI_2_off; + DBG_LED_WIFI_2_off; EI(); - if( last_task < i ) - { - break; - } } } } } - while( last_task != 0xFF ); // タスクが残っていたら再実行 - - - -#if 0 - for( task_id = 0; task_id < IMMED_RSV_TASKS_NUM; task_id += 1 ){ - if( tasks_immed[ task_id ] == 0 ){ - break; - } - if( tasks_immed[ task_id ]() == ERR_FINISED ){ - DI(); - renge_task_immed_del( task_id ); - EI(); - } - } - // 整合性チェック - { - u8 j; - u8 k = 0; - for( j = 0; j < ( IMMED_RSV_TASKS_NUM -1); j += 1 ){ - if( tasks_immed[ j ] != 0 ){ - k += 1; - } - } - if( k != task_immed_index ){ - while(1){ - NOP(); - } - } - } -#endif + while( last_task_id != 0xFF ); // タスクが残っていたら再実行 return( ERR_SUCCESS ); } diff --git a/trunk/renge/renge.h b/trunk/renge/renge.h index 5f23bdd..2c1b5bc 100644 --- a/trunk/renge/renge.h +++ b/trunk/renge/renge.h @@ -20,8 +20,6 @@ err renge_task_immed_add( task_immed ); void wait_ms( u8 ); -u8 renge_set_jump( u8 tsk_id ); - //****************************************************************************** diff --git a/trunk/renge/renge_defs.h b/trunk/renge/renge_defs.h index 4a05eff..559cd1f 100644 --- a/trunk/renge/renge_defs.h +++ b/trunk/renge/renge_defs.h @@ -24,38 +24,12 @@ typedef unsigned char err; //*/ -// ***************************************************************************** +// ************************************ #define SYS_INTERVAL_TICK 1.953 - - -//****************************************************************************** - -typedef u8 task_rv; -typedef task_rv renge_task; // 気分の問題 - -typedef u8 task_interval; -typedef task_interval ( *p_task )(); // p_taskという、task_interval型の関数へのポインタ - - typedef enum{ - INTERVAL, - I2CM_END, - I2C_M_FREE - }dispatch_type; - - typedef struct{ - p_task task; - }task_info; - -/************************************** - 逐一起動のタスクリスト - 廃止になるかもしれないが - *************************************/ -typedef u8 task_status_immed; -typedef task_status_immed (*task_immed)(); - +// ************************************ typedef enum{ ERR_SUCCESS = 0, ERR_ERR @@ -67,4 +41,19 @@ typedef enum{ ERR_CONTINUE }IMMED_TASK_ERR; + + +/************************************** + インターバル起動 + *************************************/ +typedef void task_status; + + +/************************************** + 逐一起動のタスクリスト + 廃止になるかもしれないが + *************************************/ +typedef IMMED_TASK_ERR task_status_immed; + + #endif diff --git a/trunk/renge/renge_task_immediate.h b/trunk/renge/renge_task_immediate.h index 253528e..1093031 100644 --- a/trunk/renge/renge_task_immediate.h +++ b/trunk/renge/renge_task_immediate.h @@ -1,20 +1,24 @@ #ifndef __tasks__ #define __tasks__ - #include "renge_defs.h" +// ************************************* +#define TASK_IMMED_RUN_LIST_MAX 8 -/***************************************************************************** - 逐一起動タスク - 手動で追記 - *****************************************************************************/ +extern task_status_immed do_command( ); extern task_status_immed ntr_pmic_comm(); -extern task_status_immed tsk_cbk_accero(); -extern task_status_immed do_command(); - extern task_status_immed acc_read(); extern task_status_immed acc_write(); +//extern task_status_immed acc_hosu_set(); + + + +// ************************************* +#define TSK_IMM_EMPTY_ ( void * )( 0x0000 ) +#define TSK_IMM_DELETED_ ( void * )( 0x0001 ) + + #endif diff --git a/trunk/renge/renge_task_intval.h b/trunk/renge/renge_task_intval.h index 465e24f..393d1a5 100644 --- a/trunk/renge/renge_task_intval.h +++ b/trunk/renge/renge_task_intval.h @@ -6,7 +6,7 @@ #include "renge_defs.h" enum { - TSK_SW, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_CAM, TSK_MISC_STAT, TSK_DEBUG, TSK_DEBUG2, TSK_SYS, TSK_LAST + TSK_SW, TSK_ADC, TSK_BATT, TSK_LED_POW, TSK_LED_WIFI, TSK_LED_CAM, TSK_MISC_STAT, TSK_DEBUG, TSK_DEBUG2, TSK_SYS, TSK_LAST }; extern void tsk_sw(); @@ -20,7 +20,7 @@ extern void tsk_debug(); extern void tsk_debug2(); extern void tsk_sys(); -static const task_info tasks[ TSK_LAST ] = { +static const task_status ( *tasks[ TSK_LAST ] )() = { tsk_sw, tsk_adc, tsk_batt, @@ -31,7 +31,6 @@ static const task_info tasks[ TSK_LAST ] = { tsk_debug, tsk_debug2, tsk_sys, - };