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

Posted

技术标签:

【中文标题】如何在 KEIL-RTX RTOS 环境中以固定时间片对循环调度中的任务进行优先级排序【英文标题】:How to prioritize a task in round robin scheduling with fixed time slice in KEIL-RTX RTOS environment 【发布时间】:2015-12-29 11:41:47 【问题描述】:

我的代码中存在这样一种情况,即所有任务都基于轮询(固定时间片为 50 毫秒)调度算法以相同的优先级运行。现在我想运行一个特定的任务,比如任务 A,恰好在 10 毫秒的时间内更新一些通信数据库。由于当前调度是基于轮询,固定时间片为 50 毫秒,因为任务 A 无法在 10 毫秒内准确调用。我没有得到任何解决方案来解决当前的问题。 请务必提供您宝贵的建议和意见。

提前致谢, 维杰·凯坦

【问题讨论】:

【参考方案1】:

不完全确定你在这里问什么。如果您不希望任务 A 运行时间超过 10 毫秒,并且您知道您将在不到 10 毫秒的时间内从您的通信函数中返回,您可以在任务 A 的开头花一些时间阅读,然后从任务 A 调用 osThreadYield()在您达到 10 毫秒(忙循环)之后。

如果您在任务 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

也可以直接调用create Task A,设置它的优先级为osPriorityRealtime,从Task B中yield,Task A中的第一个方法是osWait(10)。一旦您返回,将其优先级恢复为正常。

【讨论】:

以上是关于如何在 KEIL-RTX RTOS 环境中以固定时间片对循环调度中的任务进行优先级排序的主要内容,如果未能解决你的问题,请参考以下文章

页面滚动时,如何使所有列标题在 ag-grid 中以角度粘贴(固定)?

如何在 Pyspark 中以编程方式解析固定宽度的文本文件?

如何在 DataTables 的 FixedColumns 插件中以交互方式调整固定列的大小

在路线中以固定时间间隔确定中间纬度/经度

如何在 sublime text 中以当前文件目录打开 cmd

如何在div中以可变高度垂直居中内容?