首页 > 代码库 > 调度器状态机的单片机上用的小系统
调度器状态机的单片机上用的小系统
任务按时间片伦实践
eg:
while(1)
{
if(task_delay[0]==0)
task1();
if(task_delay[1]==0)
task2();
}
void time0(void) interrupt1
{
for(i=0;i<task_max;i++)
{
if(task_delay[i])
task_delay[i]--;
}
此结构适用于每个任务时间在10ms以下
要是如18B20初始化那样长的时间可以分割成多个片段就可以了(状态机)
eg:
case 0:。。。
flag=1;
case 1:
flag=2;
系统按优先级实现
while(1)
{
for(i=0;i<max_task;i++)
{
if(task_delay[i]==0){run(task[i]);break;}
}
}
注意程序中的break!!!就是他使程序可以有优先级
void (* code task[])() = {task0,task1,task2,task3};//获得任务pc指针
void run(void (*ptask)())//指向函数的指针函数
{
(*ptask)();
}
使用时:run(task[i]);
#include<iostream> #include<unistd.h> #include<signal.h> #include<time.h> #include<sys/time.h> using namespace std; void hello1() { cout <<"hello1"<<endl; } void hello2() { cout <<"hello22"<<endl; } void hello3() { cout <<"hello333"<<endl; } int task_delay[3] = {10,50,100}; void (* task[])() = {hello1,hello2,hello3}; void run(void (*ptask)()) { (*ptask)(); } void timer(int signo){ for (int i = 0; i < 3; ++i) { if (task_delay[i]) { task_delay[i] --; } } signal(SIGALRM, timer); return; } int main(int argc, char *argv[]) { signal(SIGALRM, timer); struct itimerval value; value.it_value.tv_sec = 0; value.it_value.tv_usec = 10000; value.it_interval.tv_sec = 0; value.it_interval.tv_usec = 10000; setitimer(ITIMER_REAL, &value, &value); while (true) { if (! task_delay[0]) { run(task[0]); task_delay[0] = 10; } else if (! task_delay[1]) { run(task[1]); task_delay[1] = 50; } else if (! task_delay[2]) { run(task[2]); task_delay[2] = 100; } } return 0; }
本文出自 “勿造轮” 博客,请务必保留此出处http://xubuntu.blog.51cto.com/7426832/1869954
调度器状态机的单片机上用的小系统
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。