在这种特定情况下,RTOS中的互斥体

Mahmoud Hosseinipour

考虑以下代码:

/*----------------------------------------------------------------------------
 First Thread 
 *---------------------------------------------------------------------------*/
void Thread1 (void const *argument) 
{
    for (;;) 
    {
        osMutexWait(mutex, osWaitForever); 
                Thread1_Functions;
        osMutexRelease(mutex);  
    }
}

/*----------------------------------------------------------------------------
  Second Thread  
 *---------------------------------------------------------------------------*/
void Thread2 (void const *argument) 
{
    for(;;)
    {
        osMutexWait(mutex, osWaitForever);
                Thread2_Functions;
        osMutexRelease(mutex);
    }
}

据我所知RTOS's scheduling,RTOS为每个任务分配了一个特定的时间,在此时间结束后,它将切换到另一个任务。
然后在这个特定的时间里,在任务的无限循环内,可能循环重复几次直到任务的特定时间结束。
假设任务完成的时间少于其时间的一半,那么它就有时间再次完全运行此任务。在释放互斥锁后的最后一行,那么它将比task2之前第二次实现互斥锁,我是真的吗?
假设在Thread1_Functions第二次运行MCU时发生计时器计时,则任务2无法运行,因为任务1拥有互斥锁,RTOS再次运行任务1;如果计时器计时每次在计时器1中发生Thread1_Functions,那么task2没有机会运行,是吗?

克拉博姆

首先,让我清理一下您描述的调度方法。您说:“ RTOS为每个任务分配一个特定的时间,在此时间结束后,它将切换到另一个任务。” 这种调度方法通常称为“时间分片”。并且所有RTOS不一定总是使用此方法。时间分片可用于具有相同优先级的任务(或者,如果RTOS不支持任务优先级)。但是,如果任务具有不同的优先级,则调度程序将不使用时间片,而是根据任务优先级进行调度。

但是,假设您的示例中的两个任务具有相同的优先级,并且调度程序是时间分片的。

  1. Thread1运行并获取互斥量。
  2. 线程1的时间片到期,并且调度程序切换到线程2。
  3. Thread2尝试获取互斥锁,但由于Thread1已拥有该互斥锁而阻塞。
  4. 由于线程2被阻止,调度程序将切换回线程1。
  5. 线程1释放互斥量。

释放互斥锁后,调度程序应切换到任何等待该互斥锁的更高优先级的任务。但是,由于Thread2具有相同的优先级,因此我们假设调度程序未切换,并且Thread1在其时间段内继续运行。

  1. Thread1尝试再次获取互斥量。

在您的方案中,Thread1成功地再次获得了互斥锁,这可能导致Thread2永远无法运行。为了防止这种情况发生,互斥锁服务应优先考虑对互斥锁的请求。来自优先级较高的任务的互斥体请求将获得更高的优先级。来自同等优先级任务的互斥体请求应先到先得。换句话说,互斥锁服务应将优先级相同的任务的请求放入队列。请记住,Thread2已经对互斥量有一个挂起的请求(上面的步骤3)。因此,当Thread1尝试再次获取互斥量时(第6步),Thread1的请求应排在Thread2之前的请求之后。当Thread1对互斥锁的第二个请求在Thread2的请求之后排队时,调度程序应阻塞Thread1并切换到Thread2,将互斥锁交给Thread2。

更新:上面只是一个未指定的RTOS如何处理这种情况的想法,以避免Thread2饿死。在下面的评论中,您没有提到特定的RTOS。我不知道Keil RTX是否能像我上面描述的那样工作。现在我想知道您的问题到底是什么。

您是在问这种情况下Keil RTX会做什么吗?我不知道。您必须查看osMutexRelease()的代码,以查看它是否切换到具有相同优先级的任务。还要查看osMutexWait(),以了解它如何确定优先级相同的任务的优先级。

或者您是在说Keil RTX允许Thread2在这种情况下饿死,您是否正在询问如何解决它。要解决这种情况,您可以在释放互斥锁后调用osThreadYeild()。像这样:

void Thread1 (void const *argument) 
{
    for (;;) 
    {
        osMutexWait(mutex, osWaitForever); 
                Thread1_Functions;
        osMutexRelease(mutex); 
        osThreadYeild();  
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 python 中, input() 函数在这种特定情况下对我不起作用

来自分类Dev

为什么在这种特定情况下扫描仪输入显示错误?

来自分类Dev

在这种特定情况下如何使用break子句

来自分类Dev

在这种特定情况下,使用apt-get autoremove命令安全吗?

来自分类Dev

jQuery:在这种特定情况下,如何恢复点击事件的初始状态?

来自分类Dev

在这种特定情况下,更快的IO会导致结果变慢

来自分类Dev

在这种特定情况下,使用apt-get autoremove命令安全吗?

来自分类Dev

在这种特定情况下,如何修复损坏的包装?

来自分类Dev

后缀运算符在这种特定情况下(JAVA)如何工作?

来自分类Dev

在这种特定情况下,如何设计类以共享其方法声明?

来自分类Dev

在这种特定情况下,目录权限和文件权限之间的差异

来自分类Dev

在这种特定情况下 {xor} 的确切含义是什么?

来自分类Dev

在这种情况下如何访问特定的JSON数据?

来自分类Dev

在这种特定情况下,有没有更有效的方式来编写我的过滤器?

来自分类Dev

在sql server中的特定情况下除以零

来自分类Dev

在这种情况下,延迟在rxjs中如何工作?

来自分类Dev

特定情况下的时序图

来自分类Dev

在特定情况下替换字符

来自分类Dev

特定情况下的开关盒

来自分类Dev

特定情况下的分段错误

来自分类Dev

在这种情况下阅读JSON?

来自分类Dev

在这种情况下的GIT实施

来自分类Dev

在这种情况下解释输出

来自分类Dev

如何让Coq评估特定的Redex(或-为什么在这种情况下拒绝?)

来自分类Dev

删除网址中的尾部斜杠,但在htaccess中的某些特定情况下保留它

来自分类Dev

在特定情况下,Hibernate不会从带有子项的集合中删除对象

来自分类Dev

对于这种特定情况,Python中的继承与组合?

来自分类Dev

如何在Jest中测试这种特定情况

来自分类Dev

在特定情况下未调用Firebase onDataChange

Related 相关文章

  1. 1

    在 python 中, input() 函数在这种特定情况下对我不起作用

  2. 2

    为什么在这种特定情况下扫描仪输入显示错误?

  3. 3

    在这种特定情况下如何使用break子句

  4. 4

    在这种特定情况下,使用apt-get autoremove命令安全吗?

  5. 5

    jQuery:在这种特定情况下,如何恢复点击事件的初始状态?

  6. 6

    在这种特定情况下,更快的IO会导致结果变慢

  7. 7

    在这种特定情况下,使用apt-get autoremove命令安全吗?

  8. 8

    在这种特定情况下,如何修复损坏的包装?

  9. 9

    后缀运算符在这种特定情况下(JAVA)如何工作?

  10. 10

    在这种特定情况下,如何设计类以共享其方法声明?

  11. 11

    在这种特定情况下,目录权限和文件权限之间的差异

  12. 12

    在这种特定情况下 {xor} 的确切含义是什么?

  13. 13

    在这种情况下如何访问特定的JSON数据?

  14. 14

    在这种特定情况下,有没有更有效的方式来编写我的过滤器?

  15. 15

    在sql server中的特定情况下除以零

  16. 16

    在这种情况下,延迟在rxjs中如何工作?

  17. 17

    特定情况下的时序图

  18. 18

    在特定情况下替换字符

  19. 19

    特定情况下的开关盒

  20. 20

    特定情况下的分段错误

  21. 21

    在这种情况下阅读JSON?

  22. 22

    在这种情况下的GIT实施

  23. 23

    在这种情况下解释输出

  24. 24

    如何让Coq评估特定的Redex(或-为什么在这种情况下拒绝?)

  25. 25

    删除网址中的尾部斜杠,但在htaccess中的某些特定情况下保留它

  26. 26

    在特定情况下,Hibernate不会从带有子项的集合中删除对象

  27. 27

    对于这种特定情况,Python中的继承与组合?

  28. 28

    如何在Jest中测试这种特定情况

  29. 29

    在特定情况下未调用Firebase onDataChange

热门标签

归档