|
完全可以不用uCOS也能实现轮询,并且很好的调度好任务来的。
我说说我的做法吧:
首先,我会在主函数里设定各个子任务的轮询:
- int main()
- {
- init();
- while(1)
- {
- function1();
- function2();
- function3();
- ……
- }
- }
复制代码
接下来,在子任务里,我会要求每个子任务的执行时间不能超过某个限度,否则会影响其他任务的实现。
那么如果子任务需要耗时比较久怎么办?
简单,将子任务分解成多个片段,然后通过状态机来实现。
一次没有完成的任务放到下一个状态来完成。只要状态分得够细,那么多任务就不会相互冲突。
以function1为例,说说状态机的写法,以及实现延时的方式:
- void function1()
- {
- if(function1_delay);
- else
- switch(function1_state)
- {
- case 0:
- do_something_here_0();
- function1_state=1;
- function1_delay=1000;
- break;
- case 1:
- do_something_here_1();
- function1_state=2;
- function1_delay=300;
- break;
- case 2:
- ……
- default:
- break;
- }
- }
- #pragma vector=TIMER0_A0_VECTOR
- __interrupt void Timer_A (void)
- {
- if(function1_delay)function1_delay--;
- if(function2_delay)function2_delay--;
- if(function3_delay)function3_delay--;
- ……
- }
复制代码
只要将所有的子任务全部用状态机的形式来实现,然后主函数的轮询间隔足够短,轮询频率足够高,那么多任务是很容易实现的事情。
这其中的关键就在于写好每一个状态机。
与操作系统相比,这样的轮询方式优点在于没有保护现场的出入栈操作,提高了效率,缺点在于每个任务都变得比较抽象,很难理解使用状态机来编写子任务的意义。
还有一个缺点是没法调度任务的优先级,所有的任务都按照一定的次序进行,每个任务都会占用一定的时间片段来执行。
因此也不存在哪个任务优先级较高,阻塞其他任务进行的情况。
在这样的模式下,将时间片拆分得越短,任务的实时性就越好。 |
赞赏
-
2
查看全部赞赏
-
|