Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c语言实现任务调度器

c语言实现任务调度器

作者头像
李肖遥
发布于 2022-12-22 02:53:13
发布于 2022-12-22 02:53:13
68800
代码可运行
举报
运行总次数:0
代码可运行

素材来源:网络素材

整理:技术让梦想更伟大 | 李肖遥

一、介绍

调度器是常用的一种编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如can网关、485网关等等,使用场合比较多,是做稳定产品比较常用的编程技术

二、原理

1、超级循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void main()
{
 while(1)
 {
  task1();
  task2();
  ...
 }
}
123456789

2、时间片与时标

1)我们把cpu执行时间分成一段一段的,每一段时间称为时间片 2)时间片的时间计时由定时器完成,把定时器定的时间成为时标

3、调度算法介绍

1)时间片轮转调度 2)强占试调度

4、注意事项

1)所有任务的执行时间不能超过时标的时间 2)任务中不能有任何阻塞,比如使用延时函数 3)任务中的延时或者长时间任务利用状态机拆分成多段

三、任务调度代码实现

这里拿linux来测试 schduler.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//        头文件区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo "delet main"
rm -rf main
sleep 1

gcc main.c scheduler.c -o main  -w

echo "build ok "
./main

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术让梦想更伟大 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FreeRTOS源码探析之——任务调度相关
FreeRTOS可以运行多任务,在于其内核的任务调度功能,本篇介绍任务调度的基本思路与部分源码分析。
xxpcb
2020/12/16
1.5K0
FreeRTOS源码探析之——任务调度相关
【SmartOS】轻量级多任务调度系统
SmartOS是一个完全由新生命团队设计的嵌入式操作系统,主要应用于智能家居、物联网、工业自动化控制等领域。 ARM Cortex-M系列微处理器几乎全都做成单核心,对于业务逻辑较复杂的物联网就显得难以使用,因此SmartOS设计了两个多任务调度系统: 1,多线程调度,重量级,逼近PC操作系统多线程用法。使用上需要特别小心,要合理分配每一个线程的栈空间大小,任务越多越容易出问题 2,大循环,轻量级。每个任务注册一个函数指针,然后由主线程轮询各个任务函数,轮流执行 本文主要讲解第二种,轻量级多任务调度系统
大石头
2018/01/09
1.6K2
Linux Kernel调度器的过去,现在和未来
Linux Kernel Development 一书中,关于 Linux 的进程调度器并没有讲解的很全面,只是提到了 CFS 调度器的基本思想和一些实现细节;并没有 Linux 早期的调度器介绍,以及最近这些年新增的在内核源码树外维护的调度器思想。所以在经过一番搜寻后,看到了这篇论文 A complete guide to Linux process scheduling,对 Linux 的调度器历史进行了回顾,并且相对细致地讲解了 CFS 调度器。整体来说,虽然比较啰嗦,但是对于想要知道更多细节的我来说非常适合,所以就有了翻译它的冲动。当然,在学习过程也参考了其它论文。下面开启学习之旅吧,如有任何问题,欢迎指正~
刘盼
2020/04/20
2.7K0
Linux Kernel调度器的过去,现在和未来
韦东山freeRTOS系列教程之【第三章】任务管理
使用FreeRTOS时,我们可以在application中创建多个任务(task),有些文档把任务也称为线程(thread)。
韦东山
2021/12/08
1.2K0
韦东山freeRTOS系列教程之【第三章】任务管理
调度器及CFS调度器
调度:就是按照某种调度的算法设计,从进程的就绪队列中选择进程分配CPU,主要是协调进程对CPU等相关资源的使用。
laputa
2022/11/21
1.1K0
简单的51单片机多任务操作系统(C51)
在网上看到这段代码,所以自己尝试了,可以跑起来,但是没有精确的定时功能,仅仅是任务的调度而已。
用户4645519
2020/09/07
2K0
简单的51单片机多任务操作系统(C51)
一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现
折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火。无奈之下自己撸了一个简单的任务调度器,结果只花了不到 2天时间,而且感觉非常简单好用,代码量也不多,扩展性很好。
老钱
2019/05/14
1.5K0
一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现
pc上用C语言模拟51多任务的案例程序
#include <stdio.h> #include <stdlib.h> //任务槽个数.在本例中并未考虑任务换入换出,所以实际运行的任务有多少个, //就定义多少个任务槽,不可多定义或少定义 #define MAX_TASKS 5 //任务的栈指针 unsigned char *task_sp[MAX_TASKS]; //最大栈深.最低不得少于2个,保守值为12. //预估方法:以2为基数,每增加一层函数调用,加2字节. //如果其间可能发生中断,则还要再加上中断需要的栈深. //减小栈深的方
用户4645519
2020/09/07
4250
任务调度线程池
在『任务调度线程池』功能加入之前,可以使用 java.util.Timer 来实现定时功能,Timer 的优点在于简单易用,但 由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个 任务的延迟或异常都将会影响到之后的任务。
一个风轻云淡
2024/01/02
2790
FreeRTOS-Qemu 实现三任务同步通信机制以及API信息
---- 1. 本次作业的考察要点: 作业地址:https://github.com/HustWolfzzb/STM32F429DiscoveryFreeRTOS_9Git/GCC/GDB/QEMU等工具的使用。 FreeRTOS多任务同步和通信机制的掌握。 ---- 2. 编程作业: 在github上,Fork例程项目(https://github.com/cbhust/STM32F429DiscoveryFreeRTOS_9.git) 到自己的个人账号。 clone项目到本地电脑的Ubuntu虚拟机
用户1687088
2018/05/07
3.4K1
FreeRTOS-Qemu 实现三任务同步通信机制以及API信息
实时任务调度与通信协议在嵌入式开发中的应用
在嵌入式系统中,实时任务调度是确保系统响应性和稳定性的关键方面之一。不同的任务调度策略可以影响系统的性能和实时性。本文将深入探讨两种常见的实时任务调度策略:固定优先级调度和循环时间片调度,并提供相应的代码示例。
一键难忘
2023/12/09
2550
spring任务调度scheduled_golang 任务调度
除了TaskExecutor抽象之外,Spring 3.0还引用了任务调度接口 TaskScheduler,它提供了多种方法来调度将来某个时间点要运行的任务。
全栈程序员站长
2022/11/07
2K0
spring任务调度scheduled_golang 任务调度
Linux内核调度分析(进程调度)
本文是《Linux内核设计与实现》第四章的阅读笔记,代码则是摘自最新的4.6版本linux源码(github),转载请注明出处。
Marky Lumin
2018/01/23
15.2K0
Linux进程调度器的设计--Linux进程的管理与调度(十七)
调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换.
233333
2018/12/04
3.7K0
Linux进程调度器的设计--Linux进程的管理与调度(十七)
操作系统CPU调度策略---07
当进程1执行陷入阻塞时,需要进行进程调度,此时有进程2和进程3都处于就绪态,问: 应该选择哪个进程进行切换?
大忽悠爱学习
2022/08/23
8310
操作系统CPU调度策略---07
【Reinforcement Learning】强化学习下的多级反馈队列(MFQ)算法
在强化学习(Reinforcement Learning, RL)相关背景下,多级反馈队列(Multilevel Feedback Queue, MFQ)算法可以作为调度问题的求解框架,用于优化资源分配和任务调度策略。在这种情况下,MFQ的概念和机制可以被调整为一种面向学习的形式,其中调度策略通过强化学习算法来动态优化。
不去幼儿园
2024/12/03
2340
【Reinforcement Learning】强化学习下的多级反馈队列(MFQ)算法
linux内核调度算法(1)–快速找到最高优先级进程
为什么要了解内核的调度策略呢?呵呵,因为它值得我们学习,不算是废话吧。内核调度程序很先进很强大,管理你的Linux上跑的大量的乱七八糟的进程,同时还保持着对用户操作的高灵敏响应,如果可能,为什么不把这种思想放到自己的应用程序里呢?或者,有没有可能更好的实现自己的应用,使得操作系统能够以自己的意志来分配资源给自己的进程?
陶辉
2019/06/21
2.6K0
【STM32F429】第13章 任务调度—抢占式,时间片和合作式
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99514 第13章 任务调度—抢占式,时间片和合作式 本章教
Simon223
2021/06/24
4490
Linux调度原理介绍和应用(前篇)
提示:公众号展示代码会自动折行,建议横屏阅读 摘要 本文(有码慎入)主要介绍Linux任务调度相关的发展历史和基本原理。多年以来,内核界的黑客们一直着力于寻找既能满足高负载后台任务资源充分利用,又能满足桌面系统良好交互性的调度方法,尽管截至到目前为止仍然没有一个完美的解决方案。本文希望通过介绍调度算法的发展历程,因为任务调度本身不是一个局限于操作系统的话题,包括数据库,程序语言实现等,都会与调度相关。本文在介绍过程中,会引用Linux的代码实现作为说明,同时阐述其中的一些趣闻轶事。 调度实体 进程任务通常包
腾讯数据库技术
2018/07/26
1.4K0
运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践
    我们一直都相信这样一种说法:协程是比多线程更高效的一种并发工作方式,它完全由程序本身所控制,也就是在用户态执行,协程避免了像线程切换那样产生的上下文切换,在性能方面得到了很大的提升。毫无疑问,这是颠扑不破的业界共识,是放之四海而皆准的真理。
用户9127725
2022/08/08
4860
运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践
推荐阅读
相关推荐
FreeRTOS源码探析之——任务调度相关
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验