Ucos系统时钟节拍详解

我们以前在将这个操作系统在进行多任务切换的时候,说过这样的概念操作系统怎么进行多任务切换呢?

  首先它把这个时间进行分片,就是划分为11片的,比如说这个时间都以10毫秒划分为1个片,在第一个10毫秒中执行一个任务,在第二个10毫秒中执行另外一个任务,在第三个10毫秒中执行另外一个任务,这样的话,我们就进行了一个多任务的切换,多任务在切换的过程中,必须要使用的一个就是时钟节拍,时钟节拍实际上是一个定时器,这个定时器它定时的来切换我们的各个任务,比如这个任务执行10毫秒,那操作系统怎么知道执行10毫秒的时间有没有到达,或者说当这个任务主动放弃CPU的时候,那操作系统怎么知道你主动放弃了CPU,所以,在这里就要用到时钟节拍了。

  时钟节拍实际上就是一个硬件定时器,就是由硬件给我们提供一个定时器,它定时一定的时间,比如说,我们定时1毫秒,那也就是说每隔1毫秒我来检查一下当前的这个任务状态,那比如说,在某一个时钟节拍中,我发现这个任务它的定时时间到了,它的执行时间到了,那我就让它执行下一个任务,把这个任务的执行权剥夺掉,然后执行下一个任务,或者说,在某一个时钟节拍中这个任务主动放弃了CPU,那这个时候,我也去执行下一个任务,这就是我们时钟节拍的作用。一个操作系统必须要有一个时钟节拍,为什么呢?

  因为这个时间,还有任务状态的判断都与这个时钟节拍有关系。那接下来这个问题出现了,我们使用到的这个时钟节拍,并且我们知道时钟节拍是由硬件定时器提供的,那这个定时时间多长比较合适呢?我们定时1毫秒,还是10毫秒,还是100毫秒好,一般来说,我们来看看定时1毫秒和100毫秒有什么不同。

  首先我们来看看定时1毫秒,定时1毫秒也就是说,每隔1毫秒,我们的CPU会来检查一下各个任务的状态,那CPU在检查这个任务的状态的时候,那我们可以看看,它在检查这个任务的状态的时候执行的代码对于我们任务来说,它是一个无用功,因为你在检查任务的状态的时候,这样的代码对于我们任务来说根本没有任何作用,所以说,我们可以看到,当你1毫秒中断一次,也就是每秒钟检查1000次,而我这个100毫秒,每秒钟只检查10次,那也就是说,你检查1000次,和检查10次,显然检查1000次做的无用功显然要远远大于检查10次,那我们从这可以看到,检查时间越短,那CPU做的无用功也就越多。

  但是,我们看一下另外一个问题,假设我还是1毫秒进行一次时钟节拍,定时器定时1毫秒,假设在这个时刻,这个任务放弃了执行权,也就是说这个任务说,我不需要执行了,那从它放弃到我们CPU发现了这个最大时间间隔是1毫秒,为什么呢?

  因为我们定时器定时的时间是1毫秒,那对于定时100毫秒呢,我们看一下,从这个任务放弃CPU使用,到操作系统发现了它的最大时间是100毫秒,那很显然,这个1毫秒要比100毫秒的实时性要好,所以我们可以看到如果定时器定时的时间越短,它的实时性越好,但是CPU做的无用功越多,同样,定时的时间越长,虽然CPU做的无用功越少,但是,它的实时性越差。那对于一个系统,我们的时钟节拍设置为多少合适呢?

一般来说,我们设置的时钟节拍在10-100毫秒之间是比较好的,当然,随着我们CPU时钟的提高,比如我们说我们这个CPU跑的时钟频率比较高,都跑到了100M,比如128M400M这样的频率,那这个时候,我们可以设置到1000赫兹,就是1毫秒这样的时间,一般来说,设置为1毫秒已经是实时性比较好了,那如果你设置为微秒级的话,那这个时候,CPU做的无用功就相当相当多了,那这个时候,我们的实时性也不会提升到多好。所以,一般来说,我们设置的时钟节拍在10-100毫秒之间。当然如果CPU的频率比较高,你可以设置到1000赫兹。

 

原文链接:http://www.maiziedu.com/wiki/iot/ucosclock/

 

你可能感兴趣的:(Ucos系统时钟节拍详解)