/*
* @Author: Hobson
* @Date: 2021-02-28 19:24:12
* @LastEditTime: 2021-02-28 21:52:52
* @Description: 基于时间片的简单任务调度器
* @Version: V0.0.1
*/
#include "TimeSchedule.h"
#include "list.h"
#include <stdlib.h>
#include <assert.h>
struct time_task
{
uint32_t last_time; //上次执行时间
uint32_t interval; //执行间隔
void *para; //任务参数
void (*func)(void * arg); //任务函数
enum TIME_MODE flag; //执行模式
struct list_head time_node; //链表节点
};
/*初始化任务链表*/
LIST_HEAD(time_list);
/*插入任务到链表,按执行时间先后排列,依次递增*/
static inline void time_node_insert(time_task_t task)
{
time_task_t task_temp;
uint32_t next_time = task->last_time + task->interval;
/*查找插入位置*/
list_for_each_entry(task_temp, &time_list, time_node)
{
uint32_t next_time_temp = task_temp->interval + task_temp->last_time;
if (next_time < next_time_temp)
{
list_add_tail(&task->time_node, &task_temp->time_node);
return;
}
}
list_add_tail(&task->time_node, &time_list);
return;
}
/*查找待执行的任务*/
static inline time_task_t time_node_find(uint32_t curr_time)
{
time_task_t task_temp;
uint32_t next_time_temp;
/*获取链表头节点*/
task_temp = list_first_entry(&time_list, struct time_task, time_node);
next_time_temp = task_temp->interval + task_temp->last_time;
/*判断头节点是否到达执行时间*/
if (curr_time >= next_time_temp)
{
list_del(&task_temp->time_node);
return task_temp;
}
return NULL;
}
/*删除任务节点*/
static inline int time_node_del(time_task_t task)
{
time_task_t task_temp;
/*查找待删除的任务*/
list_for_each_entry(task_temp, &time_list, time_node)
{
if (task_temp == task)
{
list_del(&task_temp->time_node);
return 0;
}
}
/*未找到任务节点*/
return -1;
}
/*注册任务,创建结构体进行赋值*/
time_task_t time_task_register(uint32_t interval, void (*func)(void *arg), void *para, TIME_MODE flag)
{
assert(func);
time_task_t task = malloc(sizeof(struct time_task));
task->flag = flag;
task->func = func;
task->interval = interval;
task->para = para;
return task;
}
/*
* 计算下一次执行时间,将任务加入到待执行任务列表
* start_time 参数为任务第一次开始执行时间,即延迟多少ms后开始进行调度
*/
void time_task_start(time_task_t task, uint32_t start_time)
{
task->last_time = start_time + millis();
time_node_insert(task);
}
/*任务调度*/
void time_task_schedule(void)
{
time_task_t task;
uint32_t current_time = millis();
task = time_node_find(current_time); //查找待执行任务,将任务节点取出
if (task == NULL)
{
return;
}
/*更新执行时间,将任务节点重新插入*/
if(task->flag == TIME_PERIODIC_TRIG)
{
time_task_start(task,0);
}
task->func(task->para); //运行定时任务
if(task->flag == TIME_SINGLE_TRIG) //删除单次执行任务
{
free(task);
}
return;
}
/*删除任务*/
int time_task_delete(time_task_t task)
{
assert(task);
/*删除任务节点*/
time_node_del(task);
free(task);
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
人工智能-项目实践-嵌入式-一个精简的嵌入式操作系统 Ctrl_OS 一个事件触发的精简嵌入式操作系统 时间片轮询调度(TimeSchedule) TimeSchedule 是基于时间片运行的一个简单调度器实现。 支持单次任务,周期任务的创建和删除。
资源推荐
资源详情
资源评论
收起资源包目录
人工智能-项目实践-嵌入式-一个精简的嵌入式操作系统.zip (36个子文件)
Ctrl_OS-main
PollSchedlue
list.h 24KB
PollSchedule.c 2KB
PollSchedule.h 751B
Makefile 572B
msp.c 388B
main.c 2KB
EventTrigger
message.h 564B
list.h 24KB
EventScheduler.c 2KB
Makefile 679B
context.S 724B
task.h 1KB
task.c 2KB
main.c 1KB
doc
picture
协程任务调度.png 46KB
非典型技术宅.png 38KB
时间片轮询.png 4KB
基于时间片的任务调度(二).md 5KB
基于时间片的任务调度(一).md 5KB
coroutine
Makefile 673B
context.S 724B
task.h 666B
task.c 916B
main.c 1KB
TimeSchedule
list.h 24KB
Makefile 465B
TimeSchedule.h 747B
msp.c 388B
main.c 1KB
TimeSchedule.c 3KB
TaskSchedlue
list.h 24KB
Makefile 679B
context.S 724B
task.h 956B
task.c 2KB
main.c 1KB
共 36 条
- 1
资源评论
博士僧小星
- 粉丝: 1934
- 资源: 5894
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功