uc/os-ii互斥型信号量

这篇博客介绍了μC/OS-Ⅱ操作系统中互斥信号量(Mutex)的概念,用于解决优先级反转问题。Mutex通过优先级继承机制保护共享资源,防止高优先级任务被低优先级任务阻塞。文中详细阐述了Mutex的组成,包括标志、优先级继承优先级、任务指针和等待任务列表。同时,讲解了创建、删除、获取和释放Mutex的相关函数OSMutexCreate()、OSMutexDel()、OSMutexPend()和OSMutexPost()的工作流程,以及如何处理优先级提升和任务切换。
摘要由CSDN通过智能技术生成

互斥信号量(Mutual Exclusion Semaphores)也称为Mutex,用于实现对共享资源的独占处理,互斥信号量也是一个二值信号量,利用它可以降解优先级反转问题。
当高优先级任务需要使用某个共享资源,而恰巧该共享资源又被一个低优先级任务占用时,优先级反转问题就会发生。为了降解优先级反转,内核就必须支持优先级继承,将低优先级任务的优先级提升到高于高优先级任务的优先级,直到低优先级任务处理完毕共享资源。

  • 互斥信号量只能提供给任务使用,因为互斥信号量是用来处理共享资源的

  • µC/OS-Ⅱ的互斥信号量由四个元素组成:1个标志,指示Mutex是否可用(0xFF或其它);1个优先级继承优先级PIP,一旦有高优先级任务需要Mutex,内核就会将PIP赋给占用Mutex的任务;1个指向占有该Mutex的任务指针;1个Mutex等待任务列表。

  • µC/OS-Ⅱ提供了六种对互斥信号量进行管理的函数,函数所属文件是OS_MUTEX.C。
    这里写图片描述

  • OSMutexCreate()函数的主要工作过程是:首先进行运行条件检查;其次检查PIP优先级是否被占用;再次检查是否有可用的事件控制块;最后当上述条件都满足后,进行Mutex的建立。此时,因为已经取走了一个空闲ECB,所以要调整空闲ECB链表指针,使其指向下一个空闲ECB。紧接着将ECB设置成Mutex类型,且保存PIP并将Mutex设置为有效状态。当等待任务列表初始化完毕后,返回ECB指针。其中,值得注意的是:这里的事件计数器 OSEventCt与信号量的不同,其高8位保存PIP,低8位在没有任务占用时为0xFF,有任务占用时,用于保存占用任务的优先级。这样做的目的是为了减少数据量,避免OS_EVENT数据结构的额外开销。
    图示为OSMutexCreate()函数返回前的ECB数据结构:
    这里写图片描述

  • OSMutexDel()函数主要工作过程是:首先进行运行条件检查,若不满足,则返回空指针和错误代码;其次按删除条件选择参数opt进行删除,删除后还需要将Mutex的ECB指针交还给空闲ECB链表;如果占有Mutex的任务被提升过优先级,还需调用OSMutex_RdyAtPrio(ptcb, prio);恢复原来的优先级。

OS_EVENT  *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
{
    BOOLEAN    tasks_waiting;
    OS_EVENT  *pevent_return;
    INT8U      pip;                                        /* Priority inheritance priority            */
    INT8U      prio;
    OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0
    if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
        return (pevent);
    }
    if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
        *perr = OS_ERR_PEVENT_NULL;
        return (pevent);
    }
#endif
    if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
        *perr = OS_ERR_EVENT_TYPE;
        return (pevent);
    }
    if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
        *perr = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR             */
        return (pevent);
    }
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on mutex        */
        tasks_waiting = OS_TRUE;                           /* Yes                                      */
    } else {
        tasks_waiting = OS_FALSE;                          /* No                                       */
    }
    switch (opt) {
        case OS_DEL_NO_PEND:                               /* DELETE MUTEX ONLY IF NO TASK WAITING --- */
             if (tasks_waiting == OS_FALSE) {
#
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值