You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

432 lines
11 KiB

1 year ago
/********************************
2013.7.23 add dictionary and task step by cc
:task
:task step
:sh ( struct handle)
sh_next
,sh_next执行完后执行sh_pre
***************************/
/*****************************************************
*==============================================================
* HISTORY
* Below this line, this part is controlled by TSTS. DO NOT MODIFY!!
(Task Step by Step Turn by Turn StructureTSTS
*==============================================================
20190217 and step01 delay_n添加括号保护
20190713 add TTSS_Cycle_every_init
202005103 add ; change :
20210102 add by cc
20210411 add by cc
////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备
#define TTSS_AreUok(overVal,timerx,printChar)
20220830_23642 CCmodify task handdle
///cc 2023/04/08--12:13:53 TS_task_val_ tst_v;////TTSS常用的全局变量
****************************************************************************/
#ifndef _TTSS_TASK_H_
#define _TTSS_TASK_H_
#include "TTSS_tick.h"
typedef struct
{
vU32 du32;
vU16 du16;
volatile UN_TYPE i; //当前任务段
}TS_task_val_;
extern TS_task_val_ tst_v;////TTSS常用的全局变量
typedef struct
{
vU32 n;
volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停
1 year ago
volatile UN_TYPE sh; //当前任务段
volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段
/// volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用
}TS_task;
//extern TS_task ts_task_stcadc;
#define D_task_close 0
extern TS_task ts_task_init;
extern void L1_task_init(TS_task *s);
1 year ago
#if 0
#define D_task_Tdelay 0x01
#define D_task_stop 0x04
#define D_task_Cdelay 0x09
#define D_task_init 0x10
#define D_task_quit 0xf0
1 year ago
#else
#define D_task_Tdelay 0xe1
#define D_task_stop 0xe4
#define D_task_Cdelay 0xe9
#define D_task_init 0xe0
#define D_task_quit 0xf0
#endif
#define TTS_for_add(i,start,len) for((i) = (start); (i) < (len); (i) ++){
#define TTS_for_add_end() }
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>内部调用 s->task
#define L2_task_delay_over() s->task.sh = s->task.sh_next
#define L2_task_go(next) s->task.sh = next
#define L2_task_en(onf) s->task.en = onf
#define L2_task_exit(next) s->task.sh = 0
#define L2_task_busy(s) (D_task_close != s.task.sh)
#define L2_task_free(s) (D_task_close == s.task.sh)
#define L2_task_go_father() s->task.sh = s->task.sh_pre
#define L2_task_go_son(fun,pre) s->task.sh = fun;s->task.sh_pre = pre
//>task 定时>>>>>>>>>>>>>>TTSS
/// D_task_Tdelay == task timer delay 需要额外有个定时单元 和time0定时器设置相关
/// Delay_cycle适用于 时间短的,其一次循环取决于主循环的时间,和Tdelay比,Cdelay长时间计时误差大
#define L2_task_switch_default_idelay(); \
case D_task_Tdelay:\
if (TTSS_GetTick() >= s->task.n)\
{\
L2_task_delay_over();\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
#if 0
#define L2_task_switch_default_idelay2(); \
case D_task_Tdelay:\
if (TTSS_GetTick() >= s->task.n)\
{\
L2_task_delay_over();\
}else\
{\
L2_time_beat_heart(D_TBH_ch0,3,'i');\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
//在等待的过程中设置间隔时间,定时调用funxx
//这样在等待的空闲时间可以定时显示一些心跳信息和
//执行心跳功能
#define L2_task_switch_fun_idelay(invent,ch) L2_task_switch_default_idelay()
#define L2_task_switch_fun_idelay0000(chhh,invent,funxx); \
case D_task_Tdelay:\
if (TTSS_GetTick() >= s->task.n)\
{\
L2_task_delay_over();\
}else\
{\
L2_time_beat_heart_fun(chhh,invent,funxx);\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
//在等待的过程中设置间隔时间,定时显示字符ch
//这样在等待的空闲时间可以定时显示一些待机信息ch
// 通过ch表明目前运行的阶段和心跳信息
#define L2_task_switch_flag_idelay(invent,ch) L2_task_switch_default_idelay()
#define L2_task_switch_flag_idelay000(invent,ch); \
case D_task_Tdelay:\
if (TTSS_GetTick() >= s->task.n)\
{\
L2_task_delay_over();\
}else\
{\
L2_time_beat_heart(D_TBH_ch0,invent,ch);\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
TTSS_Task_init, Highlight
TTSS_Task_step, Highlight
TTSS_Task_end, Highlight
L2_task_go, Highlight
L1_task_Tdelay, Highlight
L1_task_Cdelay, Highlight
L2_task_go, Highlight
#endif
//if(delay_n+s_time0.t_10ms > 655340)
//{s_time0.t_10ms = 0;}
//fix 201312 防止s_time0.t_10ms 溢出
// 但是有风险
//>>L2_task_delay一定要放在L2_task_go之后
#define L1_task_Tdelay(delay_n) s->task.sh_next = s->task.sh;\
s->task.sh = D_task_Tdelay;\
s->task.n = (delay_n) + TTSS_GetTick();
//>>L2_task_delay一定要放在L2_task_go之后
#define L1_task_Cdelay(delay_n) s->task.sh_next = s->task.sh;\
s->task.sh = D_task_Cdelay;\
s->task.n = (delay_n)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<内部调用 s->task
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 外部调用
#define L2_task_s_go_son(s,fun,pre) (s).task.sh = fun;(s).task.sh_pre = pre;
#define L3_task_s_time_start(s,delay) (s).task.n = delay+s_nos_tick.t_1s;
#define L3_task_s_go(s,next) (s).task.sh = next;
#define L3_task_s_en(s,onf) (s).task.en = onf;
//L1_task_goout(s_task_music.task,D_task_close);
#define L3_task_s_busy(s) (D_task_close != (s).task.sh)
#define L3_task_s_free(s) (D_task_close == (s).task.sh)
#define L3_task_s_step(s) ((s).task.sh)
#define D_task_uc unsigned char
#define D_task_ui unsigned int
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define TTSS_Task_init() switch(s->task.sh){\
case D_task_init
#define TTSS_Task_step(step) break;\
case (step)
#define TTSS_step01(step) break;case (step)
#define TTSS_step02(step) break;case (step)
#define TTSS_step03(step) break;case (step)
#define TTSS_step04(step) break;case (step)
#define TTSS_step05(step) break;case (step)
#define TTSS_step06(step) break;case (step)
#define TTSS_step07(step) break;case (step)
#define TTSS_step08(step) break;case (step)
#define TTSS_step09(step) break;case (step)
#define TTSS_step10(step) break;case (step)
#define TTSS_step11(step) break;case (step)
#define TTSS_step12(step) break;case (step)
#define TTSS_Task_end(); break;\
L2_task_switch_default_idelay();}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
extern void L1_task_reg_clear(TS_task *s);
#define L2_task_go_Tdelay(next,delay_n) do{ \
if(delay_n) \
{ \
s->task.sh_next = next;\
s->task.sh = D_task_Tdelay;\
s->task.n = (delay_n) + TTSS_GetTick(); \
} \
else \
{ \
s->task.sh = next; \
} \
}while(0)
#define L2_task_go_Cdelay(next,delay_n) do{ \
if(delay_n) \
{ \
s->task.sh_next = next;\
s->task.sh = D_task_Cdelay;\
s->task.n = (delay_n); \
} \
else \
{ \
s->task.sh = next; \
} \
}while(0)
#define L2_task_Tdelay_go(delay_n,next) do{ \
if(delay_n) \
{ \
s->task.sh_next = next;\
s->task.sh = D_task_Tdelay;\
s->task.n = (delay_n) + TTSS_GetTick(); \
} \
else \
{ \
s->task.sh = next; \
} \
}while(0)
#define L2_task_Cdelay_go(delay_n,next) do{ \
if(delay_n) \
{ \
s->task.sh_next = next;\
s->task.sh = D_task_Cdelay;\
s->task.n = (delay_n); \
} \
else \
{ \
s->task.sh = next; \
} \
}while(0)
////>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>>>>
#ifdef D_debug_task_test
typedef struct
{
TS_task task;
}TS_task_test_;
extern TS_task_test_ ts_task_test;
extern void L2_task_test_handle(TS_task_test_ *s);
extern void L2_task_test_init(void);
#else
#define L2_task_test_handle(x);
#define L2_task_test_init();
#endif//#ifdef D_debug_task_test
////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<<
////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<<
////设定溢出时间 如果到了就进行执行某个操作,
////和溢出时间到了就"一直"做事 适合中间任务需要间隔的情况 和wanttime有次数上的区别
#define TTSS_overtime_init(X,delay); (X) = TTSS_GetTick() + delay;
#define TTSS_overtime_get(X) if( (X) < TTSS_GetTick()) {
#define TTSS_overtime_end }
#define TTSS_overtime_daole(X) ( (X) <TTSS_GetTick() )
////设定闹钟,其特点是到了时间点执行一次即退出
////适合闹钟 以及特定动作时间溢出后执行一次的场景
//// 没有按键 超时1分钟 屏幕关闭
#define TTSS_wanttime_init(X,delay); TTSS_overtime_init(X,delay);
#define TTSS_wanttime_get(X) if(X)\
{\
if( (X) < TTSS_GetTick())\
{X = 0;\
#define TTSS_wanttime_end }\
}
/// 放在任务节点?每delay时间欿执行以下功能 x必须在对应的任务里是独一无二瘿
#define TTSS_run_every_init(X,delay); TTSS_overtime_init((X),delay);
#define TTSS_run_every(X,delay) if( (X) < TTSS_GetTick()) { TTSS_run_every_init(X,delay);
#define TTSS_run_every0(X,delay) if(0){
#define TTSS_run_every_end }
#define TTSS_Cycle_every_init(X); (X) = 0;
#define TTSS_Cycle_every(X,delay) if( X++ > delay) { TTSS_Cycle_every_init(X);
#define TTSS_Cycle_every0(X,delay) if(0){
#define TTSS_Cycle_every_end }
#define TTSS_run_timesX(X,n) for(X = 0;X < n;X ++)
#define TTSS_run_overflow(X,n) if(X++ > n)
#define TTSS_run_times(n) TTSS_run_timesX(tst_v.i,n)
//////are you ok ,使用任务变量 overVal(全局变量不可随意嵌套使用),
///// timerx: 问候的时间间隔
///// printChar 应答的内容(单字符,arccii字符可打印字符最佳)
////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备
#define TTSS_AreUok(overVal,timerx,printChar) \
TTSS_overtime_get(overVal) \
L1_uartD_uc(printChar); \
TTSS_overtime_init(overVal,timerx);\
TTSS_overtime_end
#endif//_TASK_H_
/*****************************************************
*==============================================================
* HISTORY
* Below this line, this part is controlled by TSTS. DO NOT MODIFY!!
(Task Step by Step Turn by Turn StructureTSTS
*==============================================================
****************************************************************************/