//*********************************************************************************** // Ver 1.0 // 2020.03.05 1、新建文件。 //*********************************************************************************** #ifndef __TASK__H #define __TASK__H //*********************************************************************************** //任务ID enum{ TASK_ID_100MS=0, TASK_ID_LED, TASK_ID_IAP, TMR1, TMR2, TMR3, TMR_YMODEM, TASK_ID_END, }; //事件标志 enum{ EVENT_ID_KEY1 = ((1UL)<<0), EVENT_ID_KEY2 = ((1UL)<<1), }; //*********************************************************************************** //定时器中断时间 #define TASK_TICK (1000) //1000次/s #ifdef __CORTEX_M #define TASK_TICK_MAX 0xffff #define TASK_TYPE INT16U #endif #ifdef __C51 #define TASK_TICK_MAX 0xffff #define TASK_TYPE INT16U #endif //软件延时 #ifdef __N79E81X__H #define TASK_TICK_VALUE (0xffff-(OSC_SYS_FREQ>>1)/TASK_TICK) #define DLY_1mSCycle ((OSC_SYS_FREQ/1000UL)/5) #else #define TASK_TICK_VALUE (0xffff-(OSC_SYS_FREQ)/TASK_TICK) #define DLY_1mSCycle ((OSC_SYS_FREQ/1000UL)/20) #endif //*********************************************************************************** //变量定义 extern volatile TASK_TYPE Timers[TASK_ID_END]; // //*********************************************************************************** //任务开始 #define TASK_Start() \ static TASK_TYPE _lc=0; \ switch(_lc) \ { \ case 0: \ while(1) { //任务结束 #define TASK_End() \ } \ break; \ default: \ break; \ } \ _lc=0; \ return(TASK_TICK_MAX); //任务挂起 #define TASK_Suspend(TaskId) Timers[TaskId] = TASK_TICK_MAX //恢复挂起任务 #define TASK_Resume(TaskId) Timers[TaskId] = 0 //退出任务 #define TASK_Exit(TaskId) do{ \ _lc=0U; \ Timers[TaskId]=TASK_TICK_MAX; \ }while(0) //任务状态 enum{ TASK_STA_IDLE = 0, TASK_STA_RUN = 1, TASK_STA_SUSPEND = 2, }; #define TASK_State(TaskId) ((Timers[TaskId] != TASK_TICK_MAX)?TASK_STA_RUN:TASK_STA_SUSPEND) //任务内延时等待函数 #define TASK_WaitX(Ticks) \ _lc=(TASK_TYPE)(__LINE__)%TASK_TICK_MAX+1; \ if(_lc) \ { \ return(Ticks); \ } \ break; \ case ((TASK_TYPE)(__LINE__)%TASK_TICK_MAX)+1: //运行任务 #define TASK_Run(TaskName,TaskId) do{ \ if(Timers[TaskId] == 0) \ { \ Timers[TaskId]=(TaskName)(); \ } \ }while(0); //运行任务,前面的任务优先保证执行 #define TASK_RunA(TaskName,TaskId) { \ if(Timers[TaskId] == 0) \ { \ Timers[TaskId]=(TaskName)(); \ continue; \ } \ } //呼叫子程序 #define TASK_Call(SubTaskName) do{ \ TASK_TYPE Currdt; \ _lc=(TASK_TYPE)(__LINE__)%TASK_TICK_MAX+1; \ return(0); \ if(_lc) \ { \ return(0U); \ } \ break; \ case (TASK_TYPE)(__LINE__)%TASK_TICK_MAX+1: \ Currdt=(SubTaskName)(); \ if(Currdt != TASK_TICK_MAX) \ { \ return(Currdt); \ } \ }while(0); //初始化任务 #define TASK_InitTasks() do{ \ INT8U i; \ for(i=TASK_ID_END; i>0; i--) \ { \ Timers[i-1]=0; \ } \ }while(0) //切换任务 #define TASK_Timers() do{ \ INT8U i; \ for(i=TASK_ID_END; i>0; i--) \ { \ if((Timers[i-1] != 0) && (Timers[i-1] != TASK_TICK_MAX)) \ { \ Timers[i-1]--; \ } \ } \ }while (0) //*********************************************************************************** //软定时器时基1ms #define TASK_TimerStart(Tx, xMs) Timers[Tx]=xMs #define TASK_TimerStop(Tx) Timers[Tx]=TASK_TICK_MAX //*********************************************************************************** //信号量 #define SEM TASK_TYPE //初始化信号量 #define TASK_InitSem(sem) sem=1; //发送信号量 #define TASK_SendSem(sem) do{ \ sem=0; \ }while(0); //等待信号量 #define TASK_WaitSem(sem) do{ \ TASK_WaitX(0); \ if(sem > 0) \ return(1); \ sem=1; \ }while(0); //等待信号量或定时器溢出,定时器ticks 最大为0xFFFE #define TASK_WaitSemX(sem,Ticks) do{ \ if (sem == 1) sem=Ticks + 1; \ TASK_WaitX(0); \ if(sem > 1) \ { \ sem--; \ return(1); \ sem=1; \ } \ }while(0); //*********************************************************************************** //事件标志,默认情况下为16位,支持16个事件标志 #define EVENT TASK_TYPE //初始化事件标志 #define TASK_InitEvent(event) event=TASK_TICK_MAX; //发送事件标志 #define TASK_SendEvent(event,event_id) do{ \ event &= ~(event_id); \ }while(0); //接收事件标志 #define TASK_RecvEvent(event,event_id) do{ \ TASK_WaitX(0); \ if(event & (event_id) != 0) return(1); \ event |= (event_id); \ }while(0); //查询事件标志,1=事件标志未发送,0=事件标志已经被发送 #define TASK_EventState(event,event_id) ((event & (event_id)) ? 1:0) //复位事件标志 #define TASK_ResetEvent(event,event_id) event |= (event_id) //*********************************************************************************** //任务调度器时钟,休眠时要关闭 #define TASK_Tick(NewState) do{ \ if(NewState == DISABLE) SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; \ else SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; \ }while(0) #define TASK_TickInit() SysTick_Config(OSC_SYS_FREQ / TASK_TICK) //********************************************************************************** extern volatile TASK_TYPE _Reg; //*********************************************************************************** extern void DELAY_Us(INT32U tUs); extern void DELAY_Ms(INT32U tMs); extern void TASK_Init(void); extern INT8U TASK_TimerState(INT8U Tx) ; #endif