在网上看到高手理解的轮询任务-单片机

首先定义一个任务结构体

#define TASKS_MAX 3

// 任务结构
typedef struct _TASK_COMPONENTS
{
    uint8 Run;                 // 程序运行标记:0-不运行,1运行
    uint8 Timer;               // 计时器
    uint8 ItvTime;              // 任务运行间隔时间
    void (*TaskHook)(void);    // 要运行的任务函数

} TASK_COMPONENTS;       // 任务定义


//任务函数列表

void Task1()
{


}
void Task2()
{


}
void  Task3()
{


}

/**************************************************************************************
* Variable definition                            任务结构体
**************************************************************************************/
static TASK_COMPONENTS TaskComps[] = 
{
    {0, 60, 60, Task1},            // 显示时钟
    {0, 20, 20, Task2},               // 按键扫描
    {0, 30, 30, Task3},            // 显示工作状态
     // 这里添加你的任务。。。。
};


/**************************************************************************************
* FunctionName   : TaskRemarks()
* Description    : 任务标志处理    这个函数要放在定时器里。
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void TaskRemarks(void)
{
    uint8 i;
    for (i=0; i<TASKS_MAX; i++)          // 逐个任务时间处理
    {
         if (TaskComps[i].Timer)          // 时间不为0
        {
            TaskComps[i].Timer--;         // 减去一个节拍
            if (TaskComps[i].Timer == 0)       // 时间减完了
            {
                 TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢复计时器值,从新下一次
                 TaskComps[i].Run = 1;           // 任务可以运行
}
        }
   }
}


/**************************************************************************************
* FunctionName   : TaskProcess()
* Description    : 任务处理  放到main函数里去执行的。
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void TaskProcess(void)
{
    uint8 i;
    for (i=0; i<TASKS_MAX; i++)           // 逐个任务时间处理
    {
         if (TaskComps[i].Run)           // 时间不为0
        {
             TaskComps[i].TaskHook();         // 运行任务


             TaskComps[i].Run = 0;          // 标志清0
        }
    }   
}



上面的效果还不错。如果能把全局变量之间的冲突处理好。这个小型的系统是一个非常不错的选择。而且程序结构清晰,方便维护和移植。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值