/******************************** 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 Structure,简称TSTS) *============================================================== 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 ****************************************************************************/ #ifndef _TTSS_TASK_H_ #define _TTSS_TASK_H_ #include "TTSS_tick.h" typedef struct { vU32 n; /// volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停 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; #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 #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) delay) { TTSS_Cycle_every_init(X); #define TTSS_Cycle_every0(X,delay) if(0){ #define TTSS_Cycle_every_end } #define TTSS_run_times(X,n) for(X = 0;X < n;X ++) #define TTSS_run_overflow(X,n) if(X++ > n) //////are you ok ,使用任务变量 overVal(全局变量不可随意嵌套使用), ///// timerx: 问候的时间间隔 ///// printChar 应答的内容(单字符,arccii字符可打印字符最佳) ////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备 #define TTSS_AreUok(overVal,timerx,printChar) \ TTSS_overtime_get(overVal) \ L0_uart0_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 Structure,简称TSTS) *============================================================== ****************************************************************************/