[程序源码] 基于时间片论法的任务调度

[复制链接]
1580|2
 楼主| 大橙子疯 发表于 2022-4-22 23:55 | 显示全部楼层 |阅读模式
本帖最后由 大橙子疯 于 2022-4-22 23:56 编辑

1、前言

MCU 的三种任务调度:前后台顺序执行法、时间片论法和操作系统,下面介绍一个基于时间片论法的任务调度模块开源代码。
2、介绍

代码主要特点有:

  •         适用于裸机平台
  •         移植简单,三个核心函数,初始化、启动和任务调度管理
  •         可动态地添加/删除普通任务,也能添加/删除中断任务
  •         普通任务具备简单的调度优先级功能
  •         实现了简单的 MCU 负载率计算,根据负载率可参考评估系统的实时性和响应性

实现思路:

  •         通过1ms定时器中断服务函数进行任务调度计时和任务状态就绪切换
  •         普通任务在主循环中判断就绪状态并执行,而中断任务则在中断服务函数中判断就绪状态并执行
  •         普通任务在创建时会根据优先级在普通任务列表中进行排序,优先级越高的函数在列表中越靠前
  •         当正在执行的普通任务每次执行完毕后,都会重新从普通任务列表中从头开始判断状态并执行,从而实现调度优先级功能(并非抢占式)
  •         根据普通空闲任务运行次数和中断空闲任务运行次数得到 MCU 的负载率计算

3、代码示例
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]      创建新的任务调度
  3.   *
  4.   * [url=home.php?mod=space&uid=536309]@NOTE[/url]       任务函数不能被阻塞,尽量保证任务执行的时间小于 1ms,且调度周期一定要大于调度函数任务耗时
  5.   * @param[in]  pfnTask 回调任务函数
  6.   * @param[in]  time    调度周期, 单位ms.
  7.   * @param[in]  priority 调度优先级 5-250, 其他预留, 值越小, 优先级越高
  8.   */
  9. void cTASK_Creat(TaskRunCB pfnTask, uint16_t time, uint8_t priority)
  10. {
  11.     int i, j;

  12.     if (priority < 5)
  13.     {
  14.         priority = 5;
  15.     }

  16.     if (priority > 250)
  17.     {
  18.         priority = 250;
  19.     }

  20.     for (i = 0; i < CTASK_SUPPORT_NUM; i++)
  21.     {
  22.         if (sg_tTaskManage.task[i].priority < priority)
  23.         {
  24.             continue;
  25.         }

  26.         if (sg_tTaskManage.task[i].isUsed)
  27.         {
  28.             for (j = CTASK_SUPPORT_NUM - 1; j > i; j--)
  29.             {
  30.                 sg_tTaskManage.task[j] = sg_tTaskManage.task[j - 1];
  31.                 sg_tTaskManage.task[j - 1].isUsed = false;
  32.             }
  33.         }

  34.         sg_tTaskManage.task[i].isUsed = true;
  35.         sg_tTaskManage.task[i].isRunnig = false;
  36.         sg_tTaskManage.task[i].itvTime = time;
  37.         sg_tTaskManage.task[i].pfnTaskHook = pfnTask;
  38.         sg_tTaskManage.task[i].timer = time;
  39.         sg_tTaskManage.task[i].priority = priority;
  40.         break;
  41.     }
  42. }

4、下载链接
任务调度模块 :https://gitee.com/const-zpc/cTask






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zwsam 发表于 2022-6-27 11:29 | 显示全部楼层
ayb_ice 发表于 2022-11-24 09:58 | 显示全部楼层
不带优先级还好些,大家都是公平的分配MCU的时间,每个任务尽快使用MCU,尽快的释放MCU,这样在任务间传递信息极方便,这样发送消息方可以自己清除消息,相当于发一个只读的信息,相当于全局变量对外都是只读的,程序很可靠
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部