1、前言
通过[嵌入式软件架构设计-任务调度]了解到 MCU 的三种任务调度:前后台顺序执行法、时间片论法和操作系统,下面介绍一个基于时间片论法的任务调度模块开源代码。
2、介绍
代码主要特点有:
- 适用于裸机平台
- 移植简单,三个核心函数,初始化、启动和任务调度管理
- 可动态地添加/删除普通任务,也能添加/删除中断任务
- 普通任务具备简单的调度优先级功能
- 实现了简单的 MCU 负载率计算,根据负载率可参考评估系统的实时性和响应性
实现思路:
- 通过1ms定时器中断服务函数进行任务调度计时和任务状态就绪切换
- 普通任务在主循环中判断就绪状态并执行,而中断任务则在中断服务函数中判断就绪状态并执行
- 普通任务在创建时会根据优先级在普通任务列表中进行排序,优先级越高的函数在列表中越靠前
- 当正在执行的普通任务每次执行完毕后,都会重新从普通任务列表中从头开始判断状态并执行,从而实现调度优先级功能(并非抢占式)
- 根据普通空闲任务运行次数和中断空闲任务运行次数得到 MCU 的负载率计算
3、代码示例
源文件部分代码如下
/**
* @brief 创建新的任务调度
*
* @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
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
mcu
+关注
关注
146文章
17127浏览量
350997 -
操作系统
+关注
关注
37文章
6807浏览量
123285 -
开源代码
+关注
关注
0文章
36浏览量
2939
发布评论请先 登录
相关推荐
FreeRTOS如何使用delay作为系统延时、任务调度
请教一个问题,最近在学习使用FreeRTOS,想像原子一样在delay.c里添加RTOS的系统支持,即使用tick时钟作延时。现在有几个问题:1、在启动任务调度器前,如果调用了delay_ms
发表于 06-10 04:37
DSO138学习型示波器的开源代码
DLO-138是针对DSO138学习型示波器的开源代码,如果你希望对138软件进行修改(或者增加通道),那么基于这个工程应该是不错的。步骤:1 准备工作下载开源代码DLO-138:安装arduino1.8.5(高版本可能支持stm32有问题)下载Arduino_STM32
发表于 08-06 09:23
你了解RT-Thread中的启动任务调度时机吗
中断?仔细阅读跟踪代码发现,在切换到第一个任务时候,使用的api是rt_hw_context_switch_to,阅读其源代码,可以发现在最后一句,通过恢复PC LR跳转到目标任务,于
发表于 02-14 16:09
μC/OS-II 任务调度机制的改进
介绍μC/OS-II 任务调度机制,并提出一种改进方法,使μC/OS-II变成一个兼备实时与分时任务调度机制的操作系统; 论述改进后系统的特点和要注意的问题,给出部分
发表于 04-15 11:21
•14次下载
【开源鸿蒙】下载OpenHarmony 4.1 Release源代码
本文介绍了如何下载开源鸿蒙(OpenHarmony)操作系统 4.1 Release版本的源代码,该方法同样可以用于下载OpenHarmony最新开发版本(master分支)或者4.0 Release、3.2 Release等发布版本的
评论