c語言實(shí)現(xiàn)任務(wù)調(diào)度器
素材來源:網(wǎng)絡(luò)素材
整理:技術(shù)讓夢(mèng)想更偉大 | 李肖遙
一、介紹
調(diào)度器是常用的一種編程框架,也是操作系統(tǒng)的拆分多任務(wù)的核心,比如單片機(jī)的裸機(jī)程序框架,網(wǎng)絡(luò)協(xié)議棧的框架如can網(wǎng)關(guān)、485網(wǎng)關(guān)等等,使用場(chǎng)合比較多,是做穩(wěn)定產(chǎn)品比較常用的編程技術(shù)
二、原理
1、超級(jí)循環(huán)
void main()
{
while(1)
{
task1();
task2();
...
}
}
123456789
2、時(shí)間片與時(shí)標(biāo)
1)我們把cpu執(zhí)行時(shí)間分成一段一段的,每一段時(shí)間稱為時(shí)間片 2)時(shí)間片的時(shí)間計(jì)時(shí)由定時(shí)器完成,把定時(shí)器定的時(shí)間成為時(shí)標(biāo)
3、調(diào)度算法介紹
1)時(shí)間片輪轉(zhuǎn)調(diào)度 2)強(qiáng)占試調(diào)度
4、注意事項(xiàng)
1)所有任務(wù)的執(zhí)行時(shí)間不能超過時(shí)標(biāo)的時(shí)間 2)任務(wù)中不能有任何阻塞,比如使用延時(shí)函數(shù) 3)任務(wù)中的延時(shí)或者長(zhǎng)時(shí)間任務(wù)利用狀態(tài)機(jī)拆分成多段
三、任務(wù)調(diào)度代碼實(shí)現(xiàn)
這里拿linux來測(cè)試 schduler.c
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 頭文件區(qū)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#include "scheduler.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 接口定義區(qū)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define MAX_TASKS 10
static volatile unsigned char cur_task_num = 0;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 變量定義區(qū)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static running_queue_def running_queue[MAX_TASKS] = {0};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函數(shù)定義區(qū)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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)(); //運(yùn)行函數(shù)
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
版權(quán)聲明:本文來源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請(qǐng)聯(lián)系我進(jìn)行刪除。
???????????????? END ???????????????
關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。
點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。
