互斥信号量是 uC/OS 操作系统的一个内核对象,与多值信号量非常相似,但它是二值的,只能是 0 或 1,所以也叫二值信号量,主要用于保护资源。 如果想要使用互斥信号量,就必须事先使能互斥信号量。互斥信号量的使能位于“os_cfg.h”
/* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */#define OS_CFG_MUTEX_EN 1u //使能或禁用互斥信号量#define OS_CFG_MUTEX_DEL_EN 1u //使能或禁用 OSMutexDel() 函数 #define OS_CFG_MUTEX_PEND_ABORT_EN 1u //使能或禁用 OSMutexPendAbort() 函数
OSMutexCreate () 要使用 uC/OS 的互斥信号量必须先声明和创建互斥信号量,调用 OSMutexCreate () 函数可以创建一个多值信号量。OSMutexCreate () 函数的信息如下表所示 :
OSMutexCreate () 函数的定义位于“os_mutex.c”:
其中,调用了 OS_PendListInit() 函数初始化了互斥信号量的等待列表。每个互斥信号量都有一个等待列表,凡是等待该互斥信号量的的任务都会被插入到这个等待列表,方便高效管理。 OS_PendListInit() 函数的定义位于“os_core.c”:
OSMutexPost ()
OSMutexPost () 函数用于释放(发布,提交)互斥信号量。OSMutexPost () 函数的信息如下表所示。
OSMutexPost () 函数的定义也位于“os_mutex.c
在 OSMutexPost () 函数中,会调用 OS_Post() 函数发布内核对象。OS_Post() 函数是一个底层的发布函数,它不仅仅用来发布互斥信号量,还可以发布多值信号量、消息队列、事件标志组、任务消息队列和任务信号量。
OS_Post() 函数的定义位于“os_core.c”:
OSMutexPend ()
与 OSMutexPost () 互斥信号量释放函数相对应,OSMutexPend() 函数用于申请(等待,请求)获取一个互斥信号量。
OSMutexPend() 函数的定义也位于“os_mutex.c”:
OSMutexPend() 函数会调用一个更加底层的等待函数来执行当前任务对互斥信号量的等待,该函数就是 OS_Pend()。与 OS_Post() 函数一样,OS_Pend() 函数不仅仅用来等待互斥信号量,还可以等待多值信号量、消息队列、事件标志组、任务消息队列和任务信号量。
OS_Pend() 函数的定义位于“os_core.c”:
OSMutexPendAbort()
OSMutexPendAbort() 函 数 用 于 中 止 任 务 对 一 个 互 斥 信 号 量 的 等 待 。 要 使 用OSMutexPendAbort () 函 数 , 还 得 事 先 使 能 OS_CFG_MUTEX_PEND_ABORT_EN ( 位 于“os_cfg.h”)
#define OS_CFG_MUTEX_PEND_ABORT_EN 1u //使能或禁用 OSMutexPendAbort() 函数
OSMutexPendAbort() 函数的信息如下表所示:
OSMutexPendAbort() 函数的定义位于“os_mutex.c”:
OSMutexPendAbort() 函数会调用一个更加底层的中止等待函数来执行当前任务对多值 信号量的等待,该函数就是 OS_PendAbort()。OS_PendAbort() 函数不仅仅用来中止对多值信号量的等待,还可以中止对互斥信号量、消息队列、事件标志组、任务消息队列或任务信号量的等待。
OS_PendAbort() 函数的定义位于“os_core.c”:
OSMutexDel()
OSMutexDel() 函数用于删除一个互斥信号量。要使用 OSMutexDel() 函数,还得事先使能 OS_CFG_MUTEX_DEL_EN(位于“os_cfg.h”),
#define OS_CFG_MUTEX_DEL_EN 1u //使能或禁用 OSMutexDel() 函数
OSMutexDel() 函数的信息如下表所示:
OSMutexDel() 函数的定义位于“os_mutex.c”:
OSMutexDel() 函数会调用一个更加底层的删除等待对象的函数来执行对互斥信号量的删除,该函数就是 OS_PendObjDel ()。OS_PendObjDel () 函数不仅仅用来删除互斥信号量,还可以删除多值信号量、消息队列、事件标志组、任务消息队列或任务信号量。
OS_PendObjDel() 函数的定义位于“os_core.c”。