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