ucosii任务切换一问
时间:12-12
整理:3721RD
点击:
近日研究了一下ucosii,主要是多任务切换一块,看到一篇文章有这样的话
"一个任务可以不显式的调用这些可以导致放弃CPU使用权的API(OSTimeDly()),但那样多任务性能会大大降低,因为此时仅仅依靠时钟机制在进行任务切换。一个好的任务应该在完成一些操作主动放弃使用权,好东西要大家分享嘛!"
问题来了:如果设计的任务A的优先级是5, 任务B的优先级是6, 两个任务都设置成无限死循环方式, 我研究了systick的中断, 仍然是先执行OS_SchedNew()找出优先级最高的中断, 然后OSIntCtxSw()切换之, 那么优先级为6的任务B将永远不能得到执行, 而不是像那篇文章里说的那样可以仅仅依靠时钟机制任务切换, 对吗?
如果想要实现任务A和任务B不显式的调用放弃CPU的API(为了集成进其他系统的兼容性),又能自动的让A,B并行执行,在ucos下有什么解决办法呢?
谢谢!
"一个任务可以不显式的调用这些可以导致放弃CPU使用权的API(OSTimeDly()),但那样多任务性能会大大降低,因为此时仅仅依靠时钟机制在进行任务切换。一个好的任务应该在完成一些操作主动放弃使用权,好东西要大家分享嘛!"
问题来了:如果设计的任务A的优先级是5, 任务B的优先级是6, 两个任务都设置成无限死循环方式, 我研究了systick的中断, 仍然是先执行OS_SchedNew()找出优先级最高的中断, 然后OSIntCtxSw()切换之, 那么优先级为6的任务B将永远不能得到执行, 而不是像那篇文章里说的那样可以仅仅依靠时钟机制任务切换, 对吗?
如果想要实现任务A和任务B不显式的调用放弃CPU的API(为了集成进其他系统的兼容性),又能自动的让A,B并行执行,在ucos下有什么解决办法呢?
谢谢!
可以新建一个任务定时轮换ab任务的优先级
谢谢,这个方案我也想过,但感觉纯时间片切割还是有点生硬
一般的前后台处理循环比如说是
for(;;)
{
...
task_a_proc();
task_b_proc();
...
}
task_a和task_b的循环执行是你一次,我一次的,我觉得这种执行对各种条件的处理是最连续的,比较有利
比如说task_b的执行条件是难得来一次的,大多数执行都是判断了就出去了,比如执行n毫秒,
task_a是其他的处理,时间要长一点,比如m毫秒
上面那种处理,两个任务的执行时间就是n:m分配的
但如果搞纯时间片切割执行时间就是1:1了,感觉不太好
能不能用ucos任务并行也实现两个任务很自然的你循环一次我循环一次呢?
任务最好别空循环死等条件发生,rtos中的任务应该设计成事件驱动的,将事件执行的条件设为信号量一类的,平时任务处于等待信号量的休眠状态。
一定不能按照前后台系统的方式来写rtos程序,否则你这个rtos上的就毫无意义了。
如果是想方便移植的话,可以在写任务函数的时候就按照操作系统的模式,用状态机控制住任务的流程,把状态变迁函数更换成系统api就可以实现从裸机到操作系统的移植并且不损失效率