任务按时间片伦实践
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;
}
转载于:https://blog.51cto.com/xubuntu/1869954