简单任务列表的程序

本文详细介绍了嵌入式实时操作系统中的任务调度机制,包括抢占式和合作式任务的添加、执行、删除流程,以及定时器中断处理和任务周期性执行的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 //延时中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值