嵌入式技术
一、介绍
调度器是常用的一种编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如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#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 "); 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#include void task1() { printf("task1 run "); } void task2() { printf("task2 run "); } 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
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !