c语言实现任务调度器

article/2025/9/5 1:25:56

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

二、原理
1、超级循环

void main()
{while(1){task1();task2();...}
}

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_Htypedef 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 1gcc main.c scheduler.c -o main  -wecho "build ok "
./main

在这里插入图片描述
四、网络协议栈中的调度器示例
//待更新


http://chatgpt.dhexx.cn/article/PdM58GG6.shtml

相关文章

C语言定时1分钟程序,C语言操作时间函数,实现定时执行某个任务小程序

时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下。 时间概述 由上图可知:通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calendar时间,即从1970年1月1日的UTC时间从0时0分0妙算起到现在所经过的秒数。而该时间也用于…

vivado 2018.2官方下载

前几天想装vivado&#xff0c;奈何学长给的文件安装出了点问题&#xff0c;百度网盘下载20g又太慢&#xff0c;去官网看了一下&#xff0c;发现官网的安装器挺小的。 下载地址&#xff1a;https://china.xilinx.com/support/download.html 需要再注册一下就好。 之后的安装步骤…

vivado2021.1安装

首先需要在官网注册一个账号&#xff0c;安装软件时需要使用。 账号注册连接&#xff1a;xilink账号注册 vivado下载链接 xilink官网下载(使用官网下载需要注册账号&#xff0c;下载免费&#xff09; vivado阿里云盘下载 vivado licence阿里云盘下载 官网下载选择此项 下载完成…

Vivado 2020.1 开放下载,中文资料随贴奉送

Vivado 2020.1 开放下载了&#xff01;&#xff01; 以下都是重点&#xff01; 新 功能 Vivado 2020.1 新增以下功能&#xff1a; 能够将完整的图像或选定的产品作为 Web 安装程序的一部分增强的地址映射&#xff0c;用于实时错误高亮显示和交叉探测Report QoR Suggestions 功能…

vivado/vitis2020.2安装下载教程(适用于2019后版本)

1.解压安装包到当前文件夹。 2.右击以管理员身份运行。 3.提示下载最新的版本&#xff0c;不要下载&#xff0c;点击【Continue】&#xff0c;如果没弹出来这个就不管&#xff0c;然后点击【next】。 4.选择安装工具&#xff0c;选择安装完全体【vitis】&#xff0c;继续…

FPGA开发软件(vivado + modelsim)环境搭建(附详细安装步骤+软件下载)

本文详细介绍了vivado软件和modelsim软件的安装&#xff0c;以及vivado中配置modelsim仿真设置&#xff0c;每一步都加文字说明和图片。 一、软件安装包下载 1、vivado vivado版本很多&#xff0c;目前最新的已更新到vivado2022.2&#xff0c;版本越高&#xff0c;安装包越大&…

基于Vivado的程序下载

Vivado下bit文件下载步骤 将电源、下载器与板卡连接&#xff0c;打开Vivado工程&#xff0c;参考《基于TcL脚本生成Vivado工程及编译》文档编译工程&#xff0c;生成对应的bit文件。 打开板卡电源开关&#xff0c;找到右下角的”Open Hardware Manager”展开&#xff0c;右击…

Vivado® ML Editions 2022.2 最新更新(附下载链接)

本文由 AMD Vivado ML Editions 产品营销经理 Snehal Ullagaddi 撰写 AMD XILINX 近期全新推出了 Vivado ML Editions 2022.2 版给工具集带来了多项重大改进与增强功能。 主要亮点 推出电源设计管理器&#xff1a; 电源设计管理器 (PDM) 是全新的下一代功耗评估平台&#xff…

Vivado全版本下载分享

Vivado是由Xilinx公司开发的一款用于FPGA设计和开发的综合设计环境。它包括了高层次综合&#xff08;HLS&#xff09;、逻辑设计、约束管理、IP核管理、仿真、综合、实现和调试等功能&#xff0c;支持面向最新FPGA器件的设计。 这里分享一下Vivado的电脑安装配置推荐&#xff…

Vivado2019.2下载(官网百度云)与安装(手把手)

龙芯杯对于vivado版本的要求&#xff1a; Vivado Design Suite HL WebPACK™ 版是革命性设计套件的免费版本。我们用它&#xff0c;能满足龙芯杯的需要&#xff0c;而且不用license 区别如下&#xff1a; 下载地址 记得创建xilinx账号或者登陆&#xff01;&#xff01;&#…

Vivado2018.3的下载安装

文章目录 一、下载二、安装过程三、参考资料 一、下载 Vivado 官网下载地址&#xff1a;https://www.xilinx.com/support/download.html百度网盘地址&#xff1a;https://pan.baidu.com/s/1j1lkZJrTDNJB-2dCI0et_g &#xff08;提取码&#xff1a;s2lg &#xff09; 说明&…

XILINX VIVADO2018.2官方下载全教程记录.

毕设涉及FPGA&#xff0c;准备记录一下准备过程。 首先是Vivado的下载过程。 1.进入赛灵思下载官网。(https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html) 2.注册用户&#xff08;已有账号跳过&#xff09;…

官网下载 Vivado

1、使用 谷歌浏览器 点击如下链接进入下载界面 https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html 2、下一步&#xff0c;登陆你的XILINX账号&#xff0c;然后就可以下载了

Vivado官网下载

https://www.xilinx.com/support/download.html &#xff08;需要注册一个AMD账号&#xff0c;之后即可免费下载&#xff09; 下载成功后开始安装&#xff1a; 默认配置即可&#xff0c;50多G

VIVADO下载过程以及【卡在optimize disk usage】的解决办法

VIVADO下载过程以及【卡在optimize disk usage】的解决办法 一. 前言二.VIVADO下载步骤三 .可能遇到的问题 一. 前言 首先说明的是vivado下载并不难&#xff0c;只是因为它的软件包过于庞大&#xff0c;多达40多个G&#xff0c;耗时较长。因为官网对软件包的下载限制&#xff…

vivado及ISE各版本软件下载方法、链接及详细步骤,官方网页下载

本文介绍的下载方法为官方下载方法&#xff0c;使用浏览器下载&#xff0c;可使用迅雷加速下载 若需要网盘下载参照其他博主文章 官方下载需要注册AMD账号&#xff0c;使用QQ邮箱即可。 1、下载链接 Downloads (xilinx.com) 2、版本选择 左边选择需要下载的vivado软件版本…

vivado下载步骤

1.去xilinx官网 https://china.xilinx.com/support/download.html 2.点击对应版本链接往下翻&#xff0c;直到找到20G文件链接。 3.填写弹出的表格&#xff08;注意&#xff1a;最后一项&#xff0c;学生&#xff09;。 4.等待下载完成。

Vivado2018.3手把手详细下载

Vivado2018.3手把手详细下载 很多人在下载vivado的时候很头疼&#xff0c;牛马哥也是一样&#xff0c;下载了巨久。所有这里带大家手把手下载。 1、官网下载安装包 ​ 先找到vivado官网&#xff0c;注册xilinx的账号&#xff0c;在他们的产品里面找到vivado。因为我们要下载的…

华为云服务器安全组设置

默认设置安全组为Sys-WebServer 常规操作 如果你想放行某个端口&#xff0c;在修改安全组规则--> 修改入方向规则---> 添加规则&#xff0c;增加入口IP即可 自定义安全组 但是如果你有一个mysql&#xff0c;需要增加白名单限制N个IP才能访问登录&#xff0c;一个个添加…

华为云服务器单机搭建redis服务,实现远程连接

1、快速安装redis 购买云服务器后&#xff0c;安装宝塔界面&#xff0c;Centos为例&#xff0c;链接&#xff1a;宝塔面板下载&#xff0c;免费全能的服务器运维软件 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…