单片机步伐架构-时间片轮询架构

打印 上一主题 下一主题

主题 639|帖子 639|积分 1917

1定时器复用阐明

   (1)首先定义使命数、使命定时初值(使命轮询时间=定时初值*定时器中断时间)、使命定时计数器;
  (2)在定时器中断服务函数中添加【复用函数】。
  1. #define TASK_NUM 3             //  这里定义的任务数为3,表示有三个任务会使用此定时器定时。
  2. uint16_t TaskCount[TASK_NUM] ; //  这里为三个任务定义三个变量来存放定时值
  3. uint8_t  TaskMark[TASK_NUM];   //  同样对应三个标志位,0--表示时间没到,1--表示定时时间到。
  4. /**************************************************************************************
  5. * FunctionName   : TimerInterrupt()
  6. * Description    : 定时中断服务函数
  7. * EntryParameter : None
  8. * ReturnValue    : None
  9. **************************************************************************************/
  10. void TimerInterrupt(void)
  11. {
  12.     uint8_t i;
  13.     for (i=0; i<TASKS_NUM; i++)
  14.     {
  15.         if (TaskCount[i])
  16.         {
  17.               TaskCount[i]--;
  18.               if (TaskCount[i] == 0)
  19.               {
  20.                     TaskMark[i] = 0x01;
  21.               }
  22.         }
  23.    }
  24. }
复制代码
2时间片轮询架构

   时间片轮询架构构成:【一个结构体+两个函数】
  2.1一个使命结构体

  1. /**************************************************************************************
  2. * FunctionName   : TaskStruct
  3. * Description    : 任务结构体
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. * attention      : 它包含了一个任务所需要的所有信息;
  7. *               1:运行状态标志位:0-不运行;1-运行。  
  8. *               2:计数器TimerCountdown--                                                                                               
  9. *               3:计数器数值填充器,预设的初值:TimerInitialValue(任务运行间隔时间)  
  10. *               4:任务对应的函数指针  
  11. **************************************************************************************/
  12. typedef struct TaskComponents
  13. {
  14.     uint8_t Run;               // 程序运行的标记:0-不运行、1-运行
  15.     uint8_t TimerCountdown;    // 计数器
  16.     uint8_t TimerInitialValue; // 任务运行间隔时间
  17.     void (*Task_hand)();       // 要运行的任务函数
  18. }TaskComponents;               // 任务定义
复制代码
2.2两个函数

  1. /**************************************************************************************
  2. * FunctionName   : TaskRemarks()
  3. * Description    : 任务标志处理
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. * attention      : 这个函数是用来更新每个任务的计数器以及它们的运行标志位的,
  7.                    它是写在单片机的定时器中断服务函数中的。
  8. **************************************************************************************/
  9. void TaskRemarks(void)
  10. {
  11.     uint8_t i;
  12.     for (i = 0; i < TaskMax; i++)                    // 逐个任务时间处理
  13.     {
  14.         if(TaskComps[i].TimerCountdown)              // 时间不为0
  15.         {
  16.             TaskComps[i].TimerCountdown--;           // 减去一个节拍
  17.             if (TaskComps[i].TimerCountdown == 0)    // 时间减完了
  18.             {
  19.                 // 恢复计时器值,重新下一次
  20.                 TaskComps[i].TimerCountdown= TaskComps[i].TimerInitialValue;
  21.                 TaskComps[i].Run = 1;       // 任务可以运行
  22.             }
  23.         }
  24.     }
  25. }
  26. /**************************************************************************************
  27. * FunctionName   : TaskProcess()
  28. * Description    : 任务处理--->判断什么时候该执行那一个任务
  29. * EntryParameter : None
  30. * ReturnValue    : None
  31. * * attention    : 放在mian的while(1)即可
  32. **************************************************************************************/
  33. void TaskProcess(void)
  34. {
  35.     uint8_t i;
  36.     for (i = 0; i < TaskMax; i++)       // 逐个任务时间处理
  37.     {
  38.         if (TaskComps[i].Run)           // 时间不为0
  39.         {
  40.             TaskComps[i].TaskHank();    // 运行任务
  41.             TaskComps[i].Run = 0;       // 标志清0
  42.         }
  43.     }
  44. }
复制代码
3实现步调

3.1定义使命结构体

  1. /**************************************************************************************
  2. * FunctionName   : TaskStruct
  3. * Description    : 任务结构体
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. * attention      : 它包含了一个任务所需要的所有信息;
  7. *               1:运行状态标志位:0-不运行;1-运行。  
  8. *               2:计数器TimerCountdown--                                                                                               
  9. *               3:计数器数值填充器,预设的初值:TimerInitialValue(任务运行间隔时间)  
  10. *               4:任务对应的函数指针  
  11. **************************************************************************************/
  12. typedef struct TaskComponents
  13. {
  14.     uint8_t Run;               // 程序运行的标记:0-不运行、1-运行
  15.     uint8_t TimerCountdown;    // 计数器
  16.     uint8_t TimerInitialValue; // 任务运行间隔时间
  17.     void (*Task_hand)();       // 要运行的任务函数
  18. }TaskComponents;               // 任务定义
复制代码
3.2初始化使命结构体

   初始化:{步伐运行标记,计数器,使命运行隔断,使命函数}
  1. #define InitStatus 0
  2. static TaskComponents TaskComps[] =
  3. {
  4.     {InitStatus, 60, 60, TaskDisplayClock},    // 显示时钟
  5.     {InitStatus, 20, 20, TaskKeySan},          // 按键扫描
  6.     {InitStatus, 30, 30, TaskDispStatus},      // 显示工作状态
  7.     // 这里继续添加任务。。。。
  8. };
复制代码
3.3定义使命清单&使命数目--->枚举范例

  1. // 任务清单
  2. typedef enum TaskList
  3. {
  4.     TaskDisplayClock,    // 显示时钟
  5.     TaskKeySan,          // 按键扫描
  6.     TaskDispStatus,      // 显示工作状态
  7.     // 这里继续添加任务。。。。
  8.     TaskMax              // 总的可供分配的定时任务数目
  9. }TaskList;
复制代码
3.4编写定时器中断函数&使命处理函数

  1. /**************************************************************************************
  2. * FunctionName   : TaskRemarks()
  3. * Description    : 任务标志处理
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. * attention      : 这个函数是用来更新每个任务的计数器以及它们的运行标志位的,
  7.                    它是写在单片机的定时器中断服务函数中的。
  8. **************************************************************************************/
  9. void TaskRemarks(void)
  10. {
  11.     uint8_t i;
  12.     for (i = 0; i < TaskMax; i++)                    // 逐个任务时间处理
  13.     {
  14.         if(TaskComps[i].TimerCountdown)              // 时间不为0
  15.         {
  16.             TaskComps[i].TimerCountdown--;           // 减去一个节拍
  17.             if (TaskComps[i].TimerCountdown == 0)    // 时间减完了
  18.             {
  19.                 // 恢复计时器值,重新下一次
  20.                 TaskComps[i].TimerCountdown= TaskComps[i].TimerInitialValue;
  21.                 TaskComps[i].Run = 1;       // 任务可以运行
  22.             }
  23.         }
  24.     }
  25. }
  26. /**************************************************************************************
  27. * FunctionName   : TaskProcess()
  28. * Description    : 任务处理--->判断什么时候该执行那一个任务
  29. * EntryParameter : None
  30. * ReturnValue    : None
  31. * * attention    : 放在mian的while(1)即可
  32. **************************************************************************************/
  33. void TaskProcess(void)
  34. {
  35.     uint8_t i;
  36.     for (i = 0; i < TaskMax; i++)       // 逐个任务时间处理
  37.     {
  38.         if (TaskComps[i].Run)           // 时间不为0
  39.         {
  40.             TaskComps[i].TaskHank();    // 运行任务
  41.             TaskComps[i].Run = 0;       // 标志清0
  42.         }
  43.     }
  44. }/*************************************************************************************** FunctionName   : Timer1Callback()* Description    : 定时中断服务函数,回调函数* ReturnValue    : None**************************************************************************************/static void Timer1Callback(void){        TaskRemarks();}
复制代码
3.5编写main函数

   (1)初始化函数在While(1)外;
  (2)使命处理函数在While(1)里。
  1. timer_1_enable(32768/10,Timer1Callback);
复制代码
  参数32768表示1S,这里32768/10表示100ms。在实际操纵中,中断的时间可以缩短一些,但是不能太短,频繁的中断服从也会低的。
  1. /**************************************************************************************
  2. * FunctionName   : main()
  3. * Description    : 主函数
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. int main___(void)
  8. {
  9.     InitSys();                  // 初始化-打开定时器
  10.     //这里用的是100ms中断一次来做实验
  11.     timer_1_enable(32768/10,Timer1Callback);
  12.     while (1)
  13.     {
  14.         TaskProcess();          // 任务处理
  15.     }
  16. }
复制代码
3.6编写使命函数

  1. /**************************************************************************************
  2. * FunctionName   : TaskDisplayClock()
  3. * Description    : 显示任务
  4. * EntryParameter : None
  5. * ReturnValue    : None
  6. **************************************************************************************/
  7. void TaskDisplayClock(void)
  8. {
  9.     printf("完成任务:TaskDisplayClock()");
  10. }
  11. /**************************************************************************************
  12. * FunctionName   : TaskKeySan()
  13. * Description    : 扫描任务
  14. * EntryParameter : None
  15. * ReturnValue    : None
  16. **************************************************************************************/
  17. void TaskKeySan(void)
  18. {
  19.     printf("完成任务:TaskKeySan()");
  20. }
  21. /**************************************************************************************
  22. * FunctionName   : TaskDispStatus()
  23. * Description    : 工作状态显示
  24. * EntryParameter : None
  25. * ReturnValue    : None
  26. **************************************************************************************/
  27. void TaskDispStatus(void)
  28. {
  29.     printf("完成任务:TaskDispStatus()");
  30. }
  31. // 这里添加其他任务。。。。。。。。。
复制代码
参考文献

单片机步伐架构(一)时间片轮询架构_单片机时间触发器步伐架构-CSDN博客
单片机的步伐架构——时间片轮询【学习条记】_单片机 时间片轮询架构-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表