/**
* Copyright (c) fengYL
*
* All rights reserved.
*/
#include "schedule_task.h"
#include <stdbool.h>
#include <stdlib.h>
#define MAX_TASK_NUM 20
typedef struct
{
uint8_t enable;
task_function_t function;
uint16_t period;
uint8_t priority;
uint8_t operated_flag;
uint8_t tick_old;
}task_t;
typedef struct
{
uint32_t tick;
task_t task[MAX_TASK_NUM];
uint8_t task_sequence_list[MAX_TASK_NUM];
uint8_t task_list_used;
task_function_t idle_function;
uint8_t idle_enable;
uint8_t setting_flag;
}schedule_t;
static schedule_t g_schedule;
inline void schedule_tick_process(void)
{
g_schedule.tick ++;
}
uint8_t task_create(task_function_t task_function, uint16_t time, uint8_t priority, task_handle_t * p_task_handle)
{
uint8_t i = 0;
uint16_t min_priority;
uint8_t min_num ;
uint8_t flag_selected[MAX_TASK_NUM];
if(g_schedule.setting_flag == 1)
{
return 3;
}
g_schedule.setting_flag = 1;
for(i = 0;i < MAX_TASK_NUM; i++)
{
flag_selected[i] = 0;
}
if(task_function == NULL)
{
g_schedule.setting_flag = 0;
return 1;
}
for(i = 0;i<MAX_TASK_NUM;i++)
{
if(g_schedule.task[i].enable == false)
{
break;
}
}
if(i == MAX_TASK_NUM)
{
g_schedule.setting_flag = 0;
return 2;
}
g_schedule.task[i].function = task_function;
g_schedule.task[i].period = time;
g_schedule.task[i].priority = priority;
*p_task_handle = i + 1;
g_schedule.task[i].enable = true;
for(i = 0;i<MAX_TASK_NUM;i++)
{
if(g_schedule.task[i].enable == true)
{
g_schedule.task_list_used = i + 1;
}
}
for(uint8_t j = 0;j<g_schedule.task_list_used;j++)
{
min_priority = 10000;
for(i = 0;i<g_schedule.task_list_used;i++)
{
if(flag_selected[i] == 0 && g_schedule.task[i].priority < min_priority)
{
min_priority = g_schedule.task[i].priority;
min_num = i;
}
}
g_schedule.task_sequence_list[j] = min_num;
flag_selected[min_num] = 1;
}
g_schedule.setting_flag = 0;
return 0;
}
uint8_t task_delete(task_handle_t * p_task_handle)
{
if(*p_task_handle == 0)
{
return 1;
}
else
{
g_schedule.task[*p_task_handle - 1].enable = false;
*p_task_handle = 0;
return 0;
}
}
uint8_t task_idle_add(task_function_t idle_function)
{
uint8_t i = 0;
if(idle_function == NULL)
{
return 1;
}
for(i = 0;i<MAX_TASK_NUM;i++)
{
if(g_schedule.task[i].enable == true && g_schedule.task[i].period == 0)
{
return 2;
}
}
g_schedule.idle_function = idle_function;
g_schedule.idle_enable = true;
return 0;
}
uint8_t task_idle_delete(void)
{
g_schedule.idle_enable = false;
return 0;
}
void schedule_task(void)
{
uint8_t i;
for(uint8_t j = 0;j<g_schedule.task_list_used;j++)
{
i = g_schedule.task_sequence_list[j];
if(g_schedule.task[i].enable == false)
{
continue;
}
if(g_schedule.task[i].period == 0)
{
g_schedule.task[i].function();
}
else
if(g_schedule.task[i].period == 1)
{
if((g_schedule.tick & 0xFF) != g_schedule.task[i].tick_old)
{
g_schedule.task[i].tick_old = g_schedule.tick;
g_schedule.task[i].function();
}
}
else
{
if((g_schedule.tick % g_schedule.task[i].period) < g_schedule.task[i].period - 1)
{
if(g_schedule.task[i].operated_flag == false)
{
g_schedule.task[i].function();
g_schedule.task[i].operated_flag = true;
}
}
else
{
g_schedule.task[i].operated_flag = false;
}
}
}
if(g_schedule.idle_enable == true)
{
g_schedule.idle_function();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于轮询的任务调度系统
共2个文件
h:1个
c:1个
1星 需积分: 47 20 下载量 123 浏览量
2017-12-19
15:26:50
上传
评论
收藏 2KB RAR 举报
温馨提示
基于轮询的任务调度系统,对于不用freertos的开发来说很适合。可以大大缩短开发周期,代码的结构也清晰
资源推荐
资源详情
资源评论
收起资源包目录
schedule_task.rar (2个子文件)
schedule_task.h 2KB
schedule_task.c 4KB
共 2 条
- 1
资源评论
- 掘金-我是哪吒2020-04-13没用什么都没有
fengyanl
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功