/* * task.c * * Created on: 2023-4-20 * Author: xukaiming */ #include "task.h" typedef struct mytask { uint8_t cActive; // >0:活动,1:初始化后立即启动 uint8_t cTaskMode; // 任务工作方式 uint8_t cType; // 任务类型 uint8_t reserve1; int32_t lLastTime; int32_t lPeriod; // 活动周期,uint=1mS void (*TaskProc)(void); // 任务处理子程序 }TASK_DATA,*PTASK_DATA; enum TIMER_MODE { TIMER_MODE_TIMER = 0, TIMER_MODE_ONCEROUTINE, TIMER_MODE_CYCROUTINE }; // define timer data struct typedef struct mytimer { uint8_t cUse; int8_t *TimerID; uint8_t cMode; // timer work mode uint8_t reserve1; int32_t lPeriod; // timer period, unit=10ms. int32_t lLastTime; // timer count for reload void (*routine)(void * Param1); // user's timer routine void *Param1; }TIMER_DATA,*PTIMER_DATA; // function prototype static void TaskTimer(void); static void TaskBlinLed(void); static TASK_DATA TaskDb[]={ {1, TASK_MODE_PERIOD, TASK_TIMER,0, 10L, 10L, TaskTimer} , {1, TASK_MODE_PERIOD, TASK_BLINK,0, 100L, 100L, TaskBlinLed}, }; static TIMER_DATA TimerData[MAX_TIMER]; static uint32_t TMP1msCount = 0; //1ms到标志,控制多任务处理的时间隔为1ms static void TaskBlinLed(void) { static int i = 0; i=(++i)%10; if(i==0) { GPIO_Set_Output_Data_Bits(PD12_LED1_PIN, Bit_SET); } else { GPIO_Set_Output_Data_Bits(PD12_LED1_PIN, Bit_RESET); } } static void idle(void) { } void TaskProc(void) { uint32_t i = 0; while(1) { if(!TMP1msCount) //保证1ms扫描一次 { idle(); } else { for(i=0;icUse) continue; if((--(pt->lLastTime))<=0) { switch(pt->cMode) { case TIMER_MODE_TIMER: // timer only pt->cUse=0; break; case TIMER_MODE_CYCROUTINE: // cyclely routine pt->lLastTime+=pt->lPeriod; pt->routine(pt->Param1); // start user's routine break; case TIMER_MODE_ONCEROUTINE: // timer routine once pt->cUse=0; //防止在routine里stoptimer后启动timer造成错误停止 pt->routine(pt->Param1); // start user routine break; default: pt->cUse=0; break; } } } } void Task_SysTick_Handler(void) { TMP1msCount++; }