调度器状态机的单片机上用的小系统
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调度器状态机的单片机上用的小系统相关的知识,希望对你有一定的参考价值。
任务按时间片伦实践
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
以上是关于调度器状态机的单片机上用的小系统的主要内容,如果未能解决你的问题,请参考以下文章