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
|