|
|
|
/********************************
|
|
|
|
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)
|
|
|
|
*==============================================================
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef _TASK_H_
|
|
|
|
#define _TASK_H_
|
|
|
|
#include "../clib/type.h"
|
|
|
|
#include "../msp/time.h"
|
|
|
|
#include "task.h"
|
|
|
|
#include "tick.h"
|
|
|
|
|
|
|
|
typedef struct _ts_task
|
|
|
|
{
|
|
|
|
volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停
|
|
|
|
volatile UN_TYPE sh; //当前任务段
|
|
|
|
volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段
|
|
|
|
volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用
|
|
|
|
vU32 n;
|
|
|
|
}TS_task;
|
|
|
|
|
|
|
|
#define D_task_close 0
|
|
|
|
#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_init 0xf0
|
|
|
|
#define D_task_Tdelay 0xf1
|
|
|
|
#define D_task_Cdelay 0xf2
|
|
|
|
#define D_task_stop 0xf3
|
|
|
|
#define D_task_quit 0xf4
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>内部调用 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_gogogo(next) s->task.sh = next;
|
|
|
|
#define L2_task_en(onf) s->task.en = onf;
|
|
|
|
|
|
|
|
#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 (s_nos_tick.jiffies >= 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(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 + s_nos_tick.jiffies;
|
|
|
|
|
|
|
|
|
|
|
|
//>>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
|
|
|
|
|
|
|
|
#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) + s_nos_tick.jiffies; \
|
|
|
|
} \
|
|
|
|
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 L3_task_s_go(s,next) (s).task.sh = next;
|
|
|
|
#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_en(s,onf) (s).task.en = onf;
|
|
|
|
#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 TTSS_Task_init(); switch(s->task.sh)\
|
|
|
|
{\
|
|
|
|
case D_task_init:{\
|
|
|
|
|
|
|
|
#define TTSS_Task_step(step); break;}\
|
|
|
|
case (step):{
|
|
|
|
#define TTSS_Task_end(); break;}\
|
|
|
|
L2_task_switch_default_idelay();}
|
|
|
|
#define TTSS_Task_fun(step); break;}\
|
|
|
|
case (step):{
|
|
|
|
|
|
|
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
|
|
|
|
|
|
|
|
|
|
/// 放在任务节点?每delay时间欿执行以下功能 x必须在对应的任务里是独一无二瘿
|
|
|
|
#define TTSS_run_every_init(X,delay); (X) = s_nos_tick.t_10ms + delay;
|
|
|
|
#define TTSS_run_every(X,delay) if( (X) < s_nos_tick.t_10ms) { 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_times(X,n) for(X = 0;X < n;X ++)
|
|
|
|
#define TTSS_run_overflow(X,n) if(X++ > n)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////设定溢出时间 如果到了就进行执行某个操仿 和run-every的区别是执行一次,所以不需要再次初始化
|
|
|
|
#define TTSS_overtime_init(X,delay); (X) = s_nos_tick.jiffies + delay;
|
|
|
|
#define TTSS_overtime_get(X) if( (X) < s_nos_tick.jiffies) {
|
|
|
|
#define TTSS_overtime_end }
|
|
|
|
|
|
|
|
|
|
|
|
//////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
|
|
|
|
|
|
|
|
|
|
|
|
#define TTSS_Alarm_init(X,delay); (X) = s_nos_tick.jiffies + delay;
|
|
|
|
#define TTSS_Alarm_AT(X) ( (X) < s_nos_tick.jiffies)
|
|
|
|
|
|
|
|
#define TTSS_Alarm_arrives(X) if( (X) < s_nos_tick.jiffies) {
|
|
|
|
#define TTSS_Alarm_end }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern void L1_task_init(TS_task *s);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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)
|
|
|
|
*==============================================================
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|