Embedded KEIL-RTX RTOS环境下固定时间片循环调度中任务优先级的确定

Embedded KEIL-RTX RTOS环境下固定时间片循环调度中任务优先级的确定,embedded,rtos,round-robin,Embedded,Rtos,Round Robin,在我的代码中有一种情况,所有任务都以相同的优先级运行,基于循环调度(固定时间片为50ms)调度算法。现在我想在10毫秒的时间内运行一个特定的任务,比如任务A,来更新一些通信数据库。因为,当前的调度是基于固定时间片为50ms的循环调度,因为任务A不能在10ms内准确调用。我找不到任何解决目前问题的办法。 请提供您宝贵的建议和建议 提前感谢,, 维杰·凯坦(Vijay Khaitan)不太清楚你在问什么。如果您不希望任务A的运行时间超过10毫秒,并且您知道您将在不到10毫秒的时间内从通信函数返回,那

在我的代码中有一种情况,所有任务都以相同的优先级运行,基于循环调度(固定时间片为50ms)调度算法。现在我想在10毫秒的时间内运行一个特定的任务,比如任务A,来更新一些通信数据库。因为,当前的调度是基于固定时间片为50ms的循环调度,因为任务A不能在10ms内准确调用。我找不到任何解决目前问题的办法。 请提供您宝贵的建议和建议

提前感谢,,
维杰·凯坦(Vijay Khaitan)

不太清楚你在问什么。如果您不希望任务A的运行时间超过10毫秒,并且您知道您将在不到10毫秒的时间内从通信函数返回,那么您可以在任务A的开头花一点时间阅读,并在达到10毫秒(忙循环)后从任务A调用osThreadYield()

如果您在任务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
您还可以直接调用createtask A,将其优先级设置为osPriorityRealtime,从Task B获得收益,并使Task A中的第一个方法为osWait(10)。一旦返回,将其优先级设置回正常