hsCH_Add_Task(AppTask1_Process,1,20,1); //20ms
/*
***************************************************************************************
*函数名称 : hsCH_Updata(void)
*功能说明 : 调度器的刷新函数,每个时标中断执行一次,在定时器中断中执行。
* 当刷新函数确定某个函数需要执行的时候,将RunMe加1,值得注意的是
* 刷新任务不执行任务函数,需要运行的任务有调度函数激活。
* 抢占式任务需要执行的话会立刻得到执行。
*形参 : 无。
*返回值 : 无。
***************************************************************************************
*/
void hsCH_Updata(void)
{
tByte index;
for(index = 0;index <hsCH_MAX_TASKS;index++)
{
if(hsCH_task_G[index].pTask) /* 检测是否有任务 */
{
// if((--hsCH_task_G[index].Delay) == 0) //(1)
if((hsCH_task_G[index].Delay) == 0)
{
if(hsCH_task_G[index].Co_op)
{
hsCH_task_G[index].RunMe += 1; /* 合作式任务需要运行则加1 */
}
else
{
(*hsCH_task_G[index].pTask)(); /* 抢占式任务立即执行 */
if(hsCH_task_G[index].Period == 0) /* 是否为周期性任务 */
{
hsCH_task_G[index].pTask = 0;
}
}
if(hsCH_task_G[index].Period)
{
hsCH_task_G[index].Delay = hsCH_task_G[index].Period;
}
}
else /* 任务还没有准备完毕 */
{
hsCH_task_G[index].Delay -= 1; //这样将Delay变量的自减(1ms),这样修改方便在每一个时标中都会减减,
}
}
}
}
/*
***************************************************************************************
*函数名称 : hsCH_Add_Task
*功能说明 : 添加任务。
*形参 : void(*pFunction)(),tWord Delay,tWorld PERIOD, tByte Co_op
*返回值 : 返回任务的ID(方便标记任务用于删除任务)
*使用说明 : Co_op 0表示抢占式任务,1表示合作式任务。
* (1) SCH_Add_Task(DOTASK,1000,0,1) 函数DOTASK ,1000个时标以后开始运行,只运
* 行一次。
* (2)SCH_Add_Task(DOTASK,0,1000,1) 每1000个时标周期性运行一次。
***************************************************************************************
*/
tByte hsCH_Add_Task(void(*pFunciton)(void),
tWord Delay,
tWord Period,
tByte Co_op)
{
tByte index = 0;
while((hsCH_task_G[index].pTask != 0) && (index < hsCH_MAX_TASKS))
{
index++;
}
if(index == hsCH_MAX_TASKS)
{
Error_code_G = ERROR_SCH_TOO_MANY_TASKS;
return hsCH_MAX_TASKS;
}
hsCH_task_G[index].pTask = pFunciton;
hsCH_task_G[index].Delay = Delay;
hsCH_task_G[index].Period = Period;
hsCH_task_G[index].Co_op = Co_op;
return index;
}
/*
***************************************************************************************
*函数名称 : hsCH_Add_Delete
*功能说明 : 删除任务。
*形参 : 任务号。
*返回值 : 是否成功删除任务。
***************************************************************************************
*/
tByte hsCH_Task_Delete(tByte index)
{
tByte ret;
if(hsCH_task_G[index].pTask == 0)
{
Error_code_G = ERROR_SCH_CANOT_DELETE_TASK;
ret = Error_code_G;
}
else
{
ret = RETURN_NORMOL;
}
hsCH_task_G[index].pTask = 0;
hsCH_task_G[index].Delay = 0;
hsCH_task_G[index].Period = 0;
hsCH_task_G[index].RunMe = 0;
return ret;
}
/*
***************************************************************************************
*函数名称 : hsCH_Dispatch_Tasks
*功能说明 : 在主函数中执行的调度函数
*形参 : 无。
*返回值 : 无。
***************************************************************************************
*/
void hsCH_Dispatch_Tasks(void)
{
tByte index;
for(index = 0;index < hsCH_MAX_TASKS;index++)
{
if((hsCH_task_G[index].RunMe > 0) && (hsCH_task_G[index].Co_op))
{
(*hsCH_task_G[index].pTask)();
hsCH_task_G[index].RunMe -= 1;
if(hsCH_task_G[index].Period == 0)
{
hsCH_Task_Delete(index);
}
}
}
}
/******************************************2*************************************************/
Tsk_Dly * get_tsk_dly_one(Tsk_Dly_Typedef which)
{
return &tsk_dly[which];
}
Tsk_Dly * get_tsk_dly_head(void)
{
return tsk_dly;
}
/************************************************************
* @brief
* @param tsk -
* ms -
* tsk_switch -
* @return none
* @time
* @note
void task_delay(Tsk_Dly_Typedef tsk,uint32_t ms,uint8_t tsk_switch)
{
if(TSK_S_ON == tsk_switch){
tsk_dly[tsk].tsk_switch = TSK_S_ON; //ON
tsk_dly[tsk].t_sum = ms; //
tsk_dly[tsk].t_pre = HAL_GetTick(); //当前时间
}else{
tsk_dly[tsk].tsk_switch = TSK_S_OFF;
}
}
/************************************************************
* @brief
* @param none
* @return none
* @time
* @note
**************************************************************/
void tsk_dly_handler(void)
{
uint8_t i;
uint32_t systicks;
for(i = 0;i < TskDlyAccnt;i++)
{
if(TSK_S_ON == tsk_dly[i].tsk_switch)
{
systicks = HAL_GetTick() - tsk_dly[i].t_pre;
if( systicks >= tsk_dly[i].t_sum )
{
tsk_dly[i].tsk_switch = TSK_S_OFF;
tsk_dly[i].dly_over = TSK_DLY_OVER; //
//MAIN_UART_SendString("TSK_DLY_OVER£¡\r\n");
//ptsk_dly_gprsReInit
}
}
}
}
if(TSK_S_OFF == ptsk_dly[tsk_gprs_conf]->tsk_switch)
{
if(TSK_DLY_OVER == ptsk_dly[tsk_gprs_conf]->dly_over)
{
}
else
task_delay(tsk_conf,60000,TSK_S_ON);//开启60s
}
else //延时中