c语言实现任务调度器
李肖遥
共 4141字,需浏览 9分钟
· 2022-12-22
素材来源:网络素材
整理:技术让梦想更伟大 | 李肖遥
一、介绍
调度器是常用的一种编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如can网关、485网关等等,使用场合比较多,是做稳定产品比较常用的编程技术
二、原理
1、超级循环
void main()
{
while(1)
{
task1();
task2();
...
}
}
123456789
2、时间片与时标
1)我们把cpu执行时间分成一段一段的,每一段时间称为时间片 2)时间片的时间计时由定时器完成,把定时器定的时间成为时标
3、调度算法介绍
1)时间片轮转调度 2)强占试调度
4、注意事项
1)所有任务的执行时间不能超过时标的时间 2)任务中不能有任何阻塞,比如使用延时函数 3)任务中的延时或者长时间任务利用状态机拆分成多段
三、任务调度代码实现
这里拿linux来测试 schduler.c
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 头文件区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include "scheduler.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 接口定义区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define MAX_TASKS 10
static volatile unsigned char cur_task_num = 0;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 变量定义区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static running_queue_def running_queue[MAX_TASKS] = {0};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数定义区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int create_task(const void (*fun)(), unsigned short period)
{
unsigned char i;
if(cur_task_num >= MAX_TASKS)
{
printf("over limit max_tasks\n");
return -1;
}
running_queue[i].fun = fun;
running_queue[i].period = period;
running_queue[i].cnt = 0;
cur_task_num++;
return 0;
}
int scheduler_run()
{
unsigned char i;
for(i = 0; i < cur_task_num; i++)
{
if(running_queue[i].cnt > 0)
{
running_queue[i].cnt--;
}
else
{
running_queue[i].cnt = running_queue[i].period;
running_queue[i].fun();
}
}
return 0;
}
schduler.h
#ifndef __SCHEDULER_H
#define __SCHEDULER_H
typedef struct {
void (*fun)(); //运行函数
unsigned short period;//周期
unsigned short cnt;
}running_queue_def;
int create_task(const void (*fun)(), unsigned short period);
int scheduler_run();
#endif
main.c
#include "scheduler.h"
#include <unistd.h>
#include <stdio.h>
void task1()
{
printf("task1 run\n");
}
void task2()
{
printf("task2 run\n");
}
int main()
{
create_task(task1, 1000);
create_task(task2, 2000);
while(1)
{
scheduler_run();
usleep(1000);
}
return 0;
}
编译脚本
build.sh
echo "delet main"
rm -rf main
sleep 1
gcc main.c scheduler.c -o main -w
echo "build ok "
./main
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
评论
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
中国人民大学《大语言模型》书籍中文版开放下载!还配套代码工具库~
大语言模型综述文章《A Survey of Large Language Models》团队终于出书啦!而且是中文版——《大语言模型》!这本书整理呈现了大模型技术框架和路线图,是一本非常好的入门书籍。🧿🧿🧿
此外,官方不仅发布了电子版 PDF 下载链接,还提供了配套资源。点赞 👍图书下载 → [大
机器学习算法与Python实战
0
15种时间序列预测方法总结(包含多种方法代码实现)
向AI转型的程序员都关注了这个号👇👇👇在这篇文章中,我们将深入探讨时间序列预测的基本概念和方法。我们将首先介绍单元预测和多元预测的概念,然后详细介绍各种深度学习和传统机器学习方法如何应用于时间序列预测,包括循环神经网络(RNN)、一维卷积神经网络(1D-CNN)、Transformer、自回归模型(
机器学习AI算法工程
0
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
PyPy为什么能让Python比C还快?一文了解内在机制
我的小册:(小白零基础用Python量化股票分析小册) ,原价299,限时特价2杯咖啡,满100人涨10元。来源:机器之心「如果想让代码运行得更快,您应该使用 PyPy。」—— Python 之父 Guido van Rossum对于研究人员来说,迅速把想法代码化并查看其是否行得通至关重要。Pyth
菜鸟学Python
0
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0