我想实现一个基于优先级抢占式的多任务结构,打个比方,有5个任务,其中4个任务是顺序执行的,且每个任务要分配相同的执行时间,也就是步长相等,但是分配的时间可能在某任务执行完后有剩余,那么我希望能把每个固定步长中的剩余时间用于处理第五个任务,这样也就是说第五个任务希望用四个任务剩余的时间处理,这样就能提高cpu的使用效率,哪位大虾能帮帮忙给个方案阿,谢谢
本来想这么说的:把前4个任务设为相同的优先级,系统打开轮询调度,然后把第5个任务的优先级设得稍微低一点,这样前4个任务会进行轮询,而第5个会在系统空闲的时候进行运行。
但好像跟楼主的要求有点不同,楼主要求有点像分时调度的了。
如果合成一个任务的话,就相当于它们5个是单任务轮询的方式了,要自己分配时间
我是这么想了~
5个任务合成SWITCH的5个分支~然后用WATCHDOG和状态机判断SWITCH进哪个分支,这样似乎可以满足要求,不过好麻烦
轮询调度好像不行,我可能没说清楚,呵呵,不好意思阿,还有一个要求就是前四个任务要顺序执行,要是轮询调度,那么就不能保证顺序执行了,谢谢大家的关注,期待有高手出来帮助解决一下
能不能把4个任务合并一下,反正是要顺序执行的
最后弄成两个任务,第一个包含4个任务的,优先级高一点
第二个仅包含第五个任务的,优先级低一点
谢谢大家都关注,我还有一个问题,就是,使用时间片轮询的调度时候,如果设置的时间片长度过长以至于任务在这个时间片内不但能走完一遍而且时间还有剩余,那么这个剩余的时间中,会发生什么呢,是马上执行另一个同优先级的任务(应该也在等待时间片轮询),还是运行优先级低的任务?
在vxworks中,轮询只发生在同等优先级的任务,并且是可选的。而抢占式调度则是一直都存在的,只要是不同优先级的任务,就是抢占式调度。
所以,这种情况下,如果没有其他高优先级任务,会执行另一个同优先级的任务,只有等这些相对优先级高的任务都放弃CPU了后,才会轮到低优先级任务。如果有一个稍微高点的任务一直运行的话,低优先级任务是永远也不会运行的
使用时间片轮询的调度时候,如果设置的时间片长度过长以至于任务在这个时间片内不但能走完一遍而且时间还有剩余
如果当前正在执行的任务阻塞、延时或者退出了,那么立刻切换到同等优先级的其他任务执行
哦,是这样啊,谢谢大家,其实我昨天作了一个小实验也正是了大虾们的说法,可是出现了新问题,我设了3个同优先级的任务,轮询时间设为sysClkRateGet(),即一秒钟,每个任务都有一个循环,循环次数为100次,每次循环只打印出一行字符,如第一个任务运行后就打印出task1,第二个任务就打印出task2,第三个任务就打印出task3,我想通过这个实验看看任务在时间轮询的情况下是如何运行的,结果发现前一段连着打印出几十个task1,然后是连着几十个task2,然后是连着几十个task3,然后就是一个task1,接着一个task2,接着一个task3,依次循环,循环很多个,然后又是连着很多个task1,连着很多个task2,再连着很多个task1,我想问一下,难道系统不能准确地按照设置好的时间片来切换任务吗?
还有一个问题,呵呵,就是说系统默认的sysClkRateGet()是60ticks,那么也就是说只能精确到1/60秒,那么要想让tick更小,怎么改sysClkRateGet()的值?在哪里改?
还有一个问题,sysClkRateGet()与sysClkRateSet(),是什么关系啊,比如在一个应用程序里,在主程序的开头部分调用sysClkRateSet(100),然后程序的后面或者在自任务中调用sysClkRateGet(),那么sysClkRateGet()的返回值就是100了吗?
还有一个问题,sysClkRateGet()与sysClkRateSet(),是什么关系啊,比如在一个应用程序里,在主程序的开头部分调用sysClkRateSet(100),然后程序的后面或者在子任务中调用sysClkRateGet(),那么sysClkRateGet()的返回值就是100了吗?
read Tornado Online Manuals
1. 我想问一下,难道系统不能准确地按照设置好的时间片来切换任务吗?
楼主注意一下这句话:
如果当前正在执行的任务阻塞、延时或者退出了,那么立刻切换到同等优先级的其他任务执行循环打印时,打印一下用不了多少时间的了,也不会造成任务阻塞切换cpu的情况,所以会一直打印直到时间片用完
你在打印语句后加个taskDelay让出cpu就能看到你想要的结果了。
2. 还有一个问题,呵呵,就是说系统默认的sysClkRateGet()是60ticks,那么也就是说只能精确到1/60秒,那么要想让tick更小,怎么改sysClkRateGet()的值?在哪里改?sysClkRateGet()与sysClkRateSet(),是什么关系啊,比如在一个应用程序里,在主程序的开头部分调用sysClkRateSet(100),然后程序的后面或者在子任务中调用sysClkRateGet(),那么sysClkRateGet()的返回值就是100了吗?
通过sysClkRateSet(x)就可以改系统时钟的tick数了,即1s = x个tick,本函数的功能就是设置1s的tick数,相当于是写到vxworks的一个全局变量中去,通过sysClkRateGet则可以获取这个全局变量的值。所以如果你set(100)那么后面get就是100了。但是把tick设得太大不好,一个tick相当于一次中断,如果设得太大那么系统1s中内要浪费很多时间去处理tick中断。
谢谢楼上的大哥,不过你可能没看明白我的第一个问题,我的每个任务都是循环打印1000次的(对不起,昨天说成打印100次了),从理论上说要是单个时间片内就能完成一个任务,那么应该是先打印出1000个“task1”,再打印出1000“task2”,最后打印出1000个“task3”,但是如果单个时间片内不能完成任务,那么就要切换到其他同优先级的任务中去,可是我昨天的运行结果是“task1”,“task2”,“task3”,不规则的出现,有时候连着出几十个,有时候就出一个“task1”,接着出一个“task2”,,再接着出一个“task3”,这种顺序反复出现很多,然后又是出几十个“task1”,再出几十个“task2”,再出几十个“task3”,有时候还先出现几十个“task1”,然后是几十个“task3”,所以我有点糊涂了,呵呵
这样啊,可以用windview抓一下cpu的切换过程来看一下~
就会知道任务切换的原因了