327|0

9

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

基于时间片论法的任务调度 [复制链接]

1、前言

通过嵌入式软件架构设计-任务调度了解到 MCU 的三种任务调度:前后台顺序执行法、时间片论法和操作系统,下面介绍一个基于时间片论法的任务调度模块开源代码。

2、介绍

代码主要特点有:

  • 适用于裸机平台

  • 移植简单,三个核心函数,初始化、启动和任务调度管理

  • 可动态地添加/删除普通任务,也能添加/删除中断任务

  • 普通任务具备简单的调度优先级功能

  • 实现了简单的 MCU 负载率计算,根据负载率可参考评估系统的实时性和响应性

实现思路:

  • 通过1ms定时器中断服务函数进行任务调度计时和任务状态就绪切换

  • 普通任务在主循环中判断就绪状态并执行,而中断任务则在中断服务函数中判断就绪状态并执行

  • 普通任务在创建时会根据优先级在普通任务列表中进行排序,优先级越高的函数在列表中越靠前

  • 当正在执行的普通任务每次执行完毕后,都会重新从普通任务列表中从头开始判断状态并执行,从而实现调度优先级功能(并非抢占式)

  • 根据普通空闲任务运行次数和中断空闲任务运行次数得到 MCU 的负载率计算

3、代码示例

源文件部分代码如下

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

    if (priority < 5)
    {
        priority = 5;
    }

    if (priority > 250)
    {
        priority = 250;
    }

    for (i = 0; i < CTASK_SUPPORT_NUM; i++)
    {
        if (sg_tTaskManage.task[i].priority < priority)
        {
            continue;
        }

        if (sg_tTaskManage.task[i].isUsed)
        {
            for (j = CTASK_SUPPORT_NUM - 1; j > i; j--)
            {
                sg_tTaskManage.task[j] = sg_tTaskManage.task[j - 1];
                sg_tTaskManage.task[j - 1].isUsed = false;
            }
        }

        sg_tTaskManage.task[i].isUsed = true;
        sg_tTaskManage.task[i].isRunnig = false;
        sg_tTaskManage.task[i].itvTime = time;
        sg_tTaskManage.task[i].pfnTaskHook = pfnTask;
        sg_tTaskManage.task[i].timer = time;
        sg_tTaskManage.task[i].priority = priority;
        break;
    }
}

头文件接口定义

/* Exported types ----------------------------------------------------------------------------------------------------*/

typedef void (*TaskRunCB)(void);

/* Exported constants ------------------------------------------------------------------------------------------------*/
/* Exported macro ----------------------------------------------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------------------------------------------------*/

extern void cTASK_Init(void);
extern void cTASK_Remarks(void);
extern void cTASK_Start(void);

extern void cTASK_Creat(TaskRunCB pfnTask, uint16_t time, uint8_t priority);
extern void cTASK_Destory(TaskRunCB pfnTask);

extern void cTASK_IsrCreat(TaskRunCB pfnTask, uint16_t time);
extern void cTASK_IsrDestory(TaskRunCB pfnTask);

extern uint8_t cTASK_GetLoadRate(void);
extern uint32_t cTASK_GetSysTimer(void);

 

4、下载链接

下载链接可复制

https://gitee.com/const-zpc/cTask

 

 

此帖出自信息发布论坛
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表