C语言 | 最简单的任务调度代码
来源:嵌入式大杂烩发布时间:2022-12-19984浏览
询问 AI
调度器是常用的一种编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如can网关、485网关等等,使用场合比较多,是做稳定产品比较常用的编程技术
voidmain()
{
while(1)
{
task1();
task2();
...
}
}
123456789
1)我们把cpu执行时间分成一段一段的,每一段时间称为时间片2)时间片的时间计时由定时器完成,把定时器定的时间成为时标
1)时间片轮转调度2)强占试调度
1)所有任务的执行时间不能超过时标的时间2)任务中不能有任何阻塞,比如使用延时函数3)任务中的延时或者长时间任务利用状态机拆分成多段
这里拿linux来测试schduler.c
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//头文件区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include<stdio.h>
#include"scheduler.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//接口定义区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#defineMAX_TASKS10
staticvolatileunsignedcharcur_task_num=0;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//变量定义区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
staticrunning_queue_defrunning_queue[MAX_TASKS]={0};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//函数定义区
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
intcreate_task(constvoid(*fun)(),unsignedshortperiod)
{
unsignedchari;
if(cur_task_num>=MAX_TASKS)
{
printf("overlimitmax_tasks\n");
return-1;
}
running_queue[i].fun=fun;
running_queue[i].period=period;
running_queue[i].cnt=0;
cur_task_num++;
return0;
}
intscheduler_run()
{
unsignedchari;
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();
}
}
return0;
}
schduler.h
#ifndef__SCHEDULER_H
#define__SCHEDULER_H
typedefstruct{
void(*fun)();//运行函数
unsignedshortperiod;//周期
unsignedshortcnt;
}running_queue_def;
intcreate_task(constvoid(*fun)(),unsignedshortperiod);
intscheduler_run();
#endif
main.c
#include"scheduler.h"
#include<unistd.h>
#include<stdio.h>
voidtask1()
{
printf("task1run\n");
}
voidtask2()
{
printf("task2run\n");
}
intmain()
{
create_task(task1,1000);
create_task(task2,2000);
while(1)
{
scheduler_run();
usleep(1000);
}
return0;
}
编译脚本
build.sh
echo"deletmain"
rm-rfmain
sleep1
gccmain.cscheduler.c-omain-w
echo"buildok"
./main

新闻来源:嵌入式大杂烩,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。

