mirror of
https://github.com/rvtr/ctr_mcu.git
synced 2025-10-31 13:51:10 -04:00
逐次実行タスクの登録/削除を改良
登録順を守る git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@67 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
parent
e155ddaf0c
commit
bbac8f6f0f
@ -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 );
|
||||
}
|
||||
|
||||
@ -20,8 +20,6 @@ err renge_task_immed_add( task_immed );
|
||||
|
||||
void wait_ms( u8 );
|
||||
|
||||
u8 renge_set_jump( u8 tsk_id );
|
||||
|
||||
|
||||
|
||||
//******************************************************************************
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user