调度器:
一方面,调度器可以看作是一个简单的操作系统,允许以周期性或(更少见)单次方式来调用任务
从底层的角度看,调度器可以看作是一个由许多不同任务共享的定时器中断服务程序,因此,只需要初始化一个定时器,而且改变定时的时候通常只需要改变一个函数。此外,无论需要运行1个、10个还是100个不同的任务,通常都可以使用同一个调度器完成。注意,这种“共用中断服务程序”与桌面操作系统提供的共用打印功能非常类似。
合作式调度器:
合作式调度器不但可靠而且可预测的主要原因是在任一时刻只有一个任务是活动的。
抢占式调度器:
混合式调度器:
这里面一个关键性问题就是如何解决不可重入函数:
a、修改或读取变量(尤其是用于任务间通信的全局变量)
b、操作单片机端口等硬件接口的代码(volatile类型修饰符的使用)
c、调用公共函数的代码,例如,如果同一个函数同时被多个任务调用
当然这里C的问题归根到底还是A的问题,只要这个函数是可重入函数,都肯定没有问题。
第一个问题的解决方法,最容易想到的是在开始访问共享资源的时候,禁止调度器。但这也是不能完全解决这个问题,因为你不能保证访问共享资源和禁止调度器之间不会发生中断,该中断恰好正要访问这个端口。
可以考虑在访问共享资源之前就禁止调度器,这样就可以解决这个问题,但一旦调度器停止,整个时基就停止了,如果这个端口访问很频繁,调度器不断的停止,对于整个系统的运行影响会非常的大。