首页 > 代码库 > 调度器状态机的单片机上用的小系统

调度器状态机的单片机上用的小系统

任务按时间片伦实践

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

调度器状态机的单片机上用的小系统