时间片轮询法

一、前言

为了方便理解和查阅本人所需的知识,在此做笔记。知识点来源书本与网络,如有侵权,联系删除。

二、框架

1.任务结构

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

2.任务运行标志出来,此函数就相当于中断服务函数

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;           // 任务可以运行
            }
        }
   }
}

3.任务处理

void TaskProcess(void)
{
    uint8 i;

    for (i = 0; i < TASKS_MAX; i++)         // 逐个任务时间处理
    {
         if (TaskComps[i].Run)           // 时间不为0
        {
            if(NULL != TaskComps[i].TaskHook)
            {
             TaskComps[i].TaskHook();         // 运行任务
            }
             TaskComps[i].Run = 0;          // 标志清0
        }
    }  
}

4.任务列表

static TASK_COMPONENTS TaskComps[] =
{
    {0, 60, (uint32*)&TaskDisplayTime, TaskDisplayClock},            // 显示时钟
    {0, 20, 20, TaskKeySan},               // 按键扫描
    {0, 30, 30, TaskDispStatus},            // 显示工作状态

     // 这里添加你的任务。。。。

};

5.任务清单

typedef enum _TASK_LIST
{
    TAST_DISP_CLOCK,            // 显示时钟
    TAST_KEY_SAN,             // 按键扫描
    TASK_DISP_WS,             // 工作状态显示
     // 这里添加你的任务。。。。
     TASKS_MAX                                           // 总的可供分配的定时任务数目
} TASK_LIST;

6.中断

void TIM_IRQHandler (void)
{
   if ( TIM_GetITStatus( TIM, TIM_IT_Update) != RESET )     //确保是否产生了中断
      {
        TaskRemarks();
        TIM_ClearITPendingBit(TIM , TIM_IT_Update);         //清除中断标志
      }
}

7.主函数

int main(void)
{ 
    InitSys();                  // 初始化

    while (1)
    {
        TaskProcess();             // 任务处理
    }
}
posted @   「后进生」  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示