如何在KEIL-RTX RTOS环境中使用固定时间片对循环调度中的任务进行优先级排序

时间:2015-12-29 11:41:47

标签: embedded rtos round-robin

我的代码中有一种情况,其中所有任务都基于循环(具有50ms的固定时间片)调度算法以相同的优先级运行。现在我想运行一个特定任务说任务A,确切地在10ms的时间段内更新一些通信db。因为,当前调度基于具有50ms的固定时间片的循环,因为任务A不能在10ms内被完全调用。我没有得到任何解决方案来应对当前的问题。 请提供您宝贵的建议&建议。

提前致谢, 维杰凯坦

1 个答案:

答案 0 :(得分:0)

不完全确定你在这里问的是什么。如果您不希望任务A运行时间超过10毫秒,并且您知道将从少于此的通信功能返回,则可以在任务A的开头读取时间,并从任务A调用osThreadYield()在你达到10ms(繁忙循环)之后。

如果你在任务B的某个地方,并且需要在10毫秒内调用任务A,它会变得有点复杂,因为你不知道什么线程可以在那时抢占你的任务B.您可以尝试的是,在任务B中,保留对任务A的处理。然后,当您准备等待10毫秒时,请执行以下操作:

 osThreadId id;
 id = osThreadGetId ();  // id for the currently running thread
 osThreadSetPriority(id, osPriorityRealtime); // Make sure we get back here quickly
 osWait(10);             // Wait 10ms
 osThreadSetPriority(id, osPriorityNormal);   // Go back to normal
 // If you need to create Task A, do so here, otherwise you can
 // use osSignalSet here and osSignalWait in Task A

您也可以直接调用创建任务A,将其优先级设置为osPriorityRealtime,从任务B获得,并使任务A中的第一个方法为osWait(10)。一旦您返回,请将其优先级恢复正常。