FreeRTOS api库函数之Semaphore / Mutexes(信号量/互斥量)

SemaphoreHandle_t xSemaphoreCreateBinary(void);

创建二进制信号量,并返回一个句柄,通过该句柄可以引用信号量。 在FreeRTOSConfig.h中,configSUPPORT_DYNAMIC_ALLOCATION必须设置为1,或者保留未定义(在这种情况下默认为1),以使此RTOS API函数可用。

每个二进制信号量都需要少量的RAM来保存信号量的状态。如果使用xSemaphoreCreateBinary()创建二进制信号量,则从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateBinaryStatic()创建二进制信号量,则 RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

信号量是在“空”状态下创建的,这意味着信号量必须首先使用xSemaphoreGive() API函数给出,然后才能使用xSemaphoreTake()函数获取(获取)。

二进制信号量和互斥量非常相似,但有一些细微差别:互斥量包括优先级继承机制,二进制信号量则不包含。这使得二进制信号量成为实现同步(任务之间或任务与中断之间)的更好选择,并且互斥信号是实现简单互斥的更好选择。

二进制信号量一旦获得就不需要返回,因此任务同步可以通过一个任务/中断连续“给出”信号量而另一个连续“获取”信号量来实现。xSemaphoreGiveFromISR()文档页面上的示例代码对此进行了演示。请注意,通常可以使用直接到任务通知以更有效的方式实现相同的功能。

如果具有更高优先级的另一个任务尝试获取相同的互斥锁,则可能会提升“获取”互斥锁的任务的优先级。拥有互斥锁的任务'继承'尝试“获取”相同互斥锁的任务的优先级。这意味着必须始终“返回”互斥锁 - 否则优先级较高的任务将永远无法获取互斥锁,优先级较低的任务将永远不会“删除”优先级。xSemaphoreTake()文档页面提供了用于实现互斥的互斥锁示例。

互斥锁和二进制信号量都由SemaphoreHandle_t类型的变量引用,并且可以在任何采用该类型参数的任务级API函数中使用。与互斥锁不同,二进制信号量可用于中断服务程序。

 

返回值:

空值  无法创建信号量,因为 可用的FreeRTOS堆不足。
任何其他价值  信号量成功创建。返回的值是一个句柄,通过该句柄可以引用信号量。
SemaphoreHandle_t xSemaphoreCreateBinaryStatic(
                          StaticSemaphore_t * pxSemaphoreBuffer);

创建二进制信号量,并返回一个句柄,通过该句柄可以引用信号量。 FreeRTOSConfig.h中的configSUPPORT_STATIC_ALLOCATION必须设置为1才能使此RTOS API函数可用。

每个二进制信号量都需要少量的RAM来保存信号量的状态。如果使用xSemaphoreCreateBinary()创建二进制信号量, 则从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateBinaryStatic()创建二进制信号量,则RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

信号量是在“空”状态下创建的,这意味着信号量必须首先使用xSemaphoreGive() API函数给出,然后才能使用xSemaphoreTake()函数获取(获取)。

二进制信号量和互斥量非常相似,但有一些细微差别:互斥量包括优先级继承机制,二进制信号量则不包含。这使得二进制信号量成为实现同步(任务之间或任务与中断之间)的更好选择,并且互斥信号是实现简单互斥的更好选择。

二进制信号量一旦获得就不需要返回,因此任务同步可以通过一个任务/中断连续“给出”信号量而另一个连续“获取”信号量来实现。xSemaphoreGiveFromISR()文档页面上的示例代码对此进行了演示。请注意,通常可以使用直接到任务通知以更有效的方式实现相同的功能。

如果具有更高优先级的另一个任务尝试获取相同的互斥锁,则可能会提升“获取”互斥锁的任务的优先级。拥有互斥锁的任务'继承'尝试“获取”相同互斥锁的任务的优先级。这意味着必须始终“返回”互斥锁 - 否则优先级较高的任务将永远无法获取互斥锁,优先级较低的任务将永远不会“删除”优先级。xSemaphoreTake()文档页面提供了用于实现互斥的互斥锁示例。

互斥锁和二进制信号量都由SemaphoreHandle_t类型的变量引用,并且可以在任何采用该类型参数的任务级API函数中使用。与互斥锁不同,二进制信号量可用于中断服务程序。

 

参数:

pxSemaphoreBuffer  必须指向StaticSemaphore_t类型的变量,该变量将用于保存信号量的状态。

返回值:

空值  无法创建信号量,因为pxSemaphoreBuffer为NULL。
任何其他价值  信号量成功创建。返回的值是一个句柄,通过该句柄可以引用信号量。

 

 

vSemaphoreCreateBinary(SemaphoreHandle_t xSemaphore);

注意: vSemaphoreCreateBinary()宏保留在源代码中以确保向后兼容性,但不应在新设计中使用。请改用 xSemaphoreCreateBinary()函数。

此外,在许多情况下,使用直接任务通知 代替二进制信号量更快,内存效率更高 。

通过使用现有队列机制创建信号量的。队列长度为1,因为这是一个二进制信号量。数据大小为0,因为我们不想实际存储任何数据 - 我们只想知道队列是空还是满。

二进制信号量和互斥量非常相似,但有一些细微差别:互斥量包括优先级继承机制,二进制信号量则不包含。这使得二进制信号量成为实现同步(任务之间或任务与中断之间)的更好选择,并且互斥信号是实现简单互斥的更好选择。

二进制信号量一旦获得就不需要返回,因此任务同步可以通过一个任务/中断连续“给出”信号量而另一个连续“获取”信号量来实现。xSemaphoreGiveFromISR()文档页面上的示例代码对此进行了演示。

如果具有更高优先级的另一个任务尝试获取相同的互斥锁,则可能会提升“获取”互斥锁的任务的优先级。拥有互斥锁的任务'继承'尝试“获取”相同互斥锁的任务的优先级。这意味着必须始终“返回”互斥锁 - 否则优先级较高的任务将永远无法获取互斥锁,优先级较低的任务将永远不会“删除”优先级。xSemaphoreTake()文档页面提供了用于实现互斥的互斥锁示例。

互斥锁和二进制信号量都分配给SemaphoreHandle_t类型的变量,并且可以在任何采用此类型参数的API函数中使用。

 

参数:

xSemaphore 处理创建的信号量。应该是SemaphoreHandle_t类型。

 

SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount,
                                           UBaseType_t uxInitialCount);

创建计数信号量 并返回一个句柄,通过该句柄可以引用新创建的信号量。 在FreeRTOSConfig.h中,configSUPPORT_DYNAMIC_ALLOCATION必须设置为1,或者保留未定义(在这种情况下默认为1),以使此RTOS API函数可用。

每个计数信号量都需要少量的RAM来保存信号量的状态。如果使用xSemaphoreCreateCounting()创建计数信号量,则从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateCountingStatic()创建计数信号量, 那么RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

计数信号量通常用于两件事:

  1. 计算事件。

    在这种使用场景中,事件处理程序将在每次事件发生时“给出”信号量(递增信号量计数值),并且处理程序任务将在每次处理事件时“获取”信号量(递减信号量计数值)。因此,计数值是已发生事件数与已处理数之间的差值。在这种情况下,希望初始计数值为零。

    请注意,通常可以使用直接到任务通知以更有效的方式实现相同的功能。

     

  2. 资源管理。

    在此使用方案中,计数值指示可用资源的数量。要获得对资源的控制,任务必须首先获得信号量 - 递减信号量计数值。当计数值达到零时,没有空闲资源。当任务完成资源时,它'返回'信号量 - 增加信号量计数值。在这种情况下,希望初始计数值等于最大计数值,表明所有资源都是空闲的。

     

参数:

uxMaxCount  可以达到的最大计数值。当信号量达到此值时,就不能再“给定”。
uxInitialCount  创建信号量时分配给信号量的计数值。

返回:

如果成功创建了信号量,则返回信号量的句柄。如果无法创建信号量,因为无法分配保持信号量所需的RAM, 则返回NULL。

 

SemaphoreHandle_t xSemaphoreCreateCountingStatic(
                                 UBaseType_t uxMaxCount,
                                 UBaseType_t uxInitialCount
                                 StaticSemaphore_t * pxSemaphoreBuffer); );

创建计数信号量 并返回一个句柄,通过该句柄可以引用新创建的信号量。 FreeRTOSConfig.h中的configSUPPORT_STATIC_ALLOCATION必须设置为1才能使此RTOS API函数可用。

每个计数信号量都需要少量的RAM来保存信号量的状态。如果使用xSemaphoreCreateCounting()创建计数信号量, 则从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateCountingStatic()创建计数信号量,那么RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

计数信号量通常用于两件事:

  1. 计算事件。

    在这种使用场景中,事件处理程序将在每次事件发生时“给出”信号量(递增信号量计数值),并且处理程序任务将在每次处理事件时“获取”信号量(递减信号量计数值)。因此,计数值是已发生事件数与已处理数之间的差值。在这种情况下,希望初始计数值为零。

    请注意,通常可以使用直接到任务通知以更有效的方式实现相同的功能。

     

  2. 资源管理。

    在此使用方案中,计数值指示可用资源的数量。要获得对资源的控制,任务必须首先获得信号量 - 递减信号量计数值。当计数值达到零时,没有空闲资源。当任务完成资源时,它'返回'信号量 - 增加信号量计数值。在这种情况下,希望初始计数值等于最大计数值,表明所有资源都是空闲的。

     

参数:

uxMaxCount  可以达到的最大计数值。当信号量达到此值时,就不能再“给定”。
uxInitialCount  创建信号量时分配给信号量的计数值。
pxSemaphoreBuffer  必须指向StaticSemaphore_t类型的变量,然后用于保存信号量的数据结构。

返回:

如果成功创建了信号量,则返回信号量的句柄。如果pxSemaphoreBuffer为NULL,则返回NULL。

 

SemaphoreHandle_t xSemaphoreCreateMutex(void);

创建互斥锁,并返回一个句柄,通过该句柄可以引用创建的互斥锁。互斥锁不能用于中断服务程序。

在FreeRTOSConfig.h中,configSUPPORT_DYNAMIC_ALLOCATION必须设置为1,或者保留未定义(在这种情况下默认为1),以使此RTOS API函数可用。

每个互斥锁都需要少量的RAM来保存互斥锁的状态。如果使用xSemaphoreCreateMutex()创建互斥锁,则会从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateMutexStatic()创建互斥锁,则 RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

使用xSemaphoreTake()获取互斥锁,并使用xSemaphoreGive()给出。xSemaphoreTakeRecursive()和xSemaphoreGiveRecursive()只能用于使用xSemaphoreCreateRecursiveMutex()创建的互斥锁。

互斥二进制信号量非常相似,但有一些细微的差别:互斥量包括优先级继承机制,二进制信号量则不包含。这使得二进制信号量成为实现同步(任务之间或任务与中断之间)的更好选择,并且互斥信号是实现简单互斥的更好选择。

如果另一个优先级较高的任务尝试获取相同的互斥锁,则会暂时提升“获取”互斥锁的任务的优先级。拥有互斥锁的任务'继承'尝试“获取”相同互斥锁的任务的优先级。这意味着必须始终“返回”互斥锁 - 否则优先级较高的任务将永远无法获取互斥锁,优先级较低的任务将永远不会“删除”优先级。

xSemaphoreTake()文档页面 提供了用于实现互斥的互斥锁示例。

二进制信号量一旦获得就不需要返回,因此任务同步可以通过一个任务/中断连续“给出”信号量而另一个连续“获取”信号量来实现。xSemaphoreGiveFromISR()文档页面上的示例代码对此进行了演示。请注意,使用直接到任务通知可以更有效地实现相同的功能。

将互斥锁和二进制信号量的句柄分配给SemaphoreHandle_t类型的变量,并且可以在任何任务级别(与中断安全相对)API函数中使用,该函数接受该类型的参数。

 

返回:

 如果成功创建了互斥锁类型信号量,则返回创建的互斥锁的句柄。如果未创建互斥锁,因为无法分配保持互斥锁所需的内存, 则返回NULL。

 

 

SemaphoreHandle_t xSemaphoreCreateMutexStatic(
                            StaticSemaphore_t * pxMutexBuffer);

创建互斥锁,并返回一个句柄,通过该句柄可以引用创建的互斥锁。互斥锁不能用于中断服务程序。

FreeRTOSConfig.h中的configSUPPORT_STATIC_ALLOCATION必须设置为1才能使此RTOS API函数可用。

每个互斥锁都需要少量的RAM来保存互斥锁的状态。如果使用xSemaphoreCreateMutex()创建互斥锁,则会从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateMutexStatic()创建互斥锁,则RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

使用xSemaphoreTake()获取互斥锁,并使用xSemaphoreGive()给出。xSemaphoreTakeRecursive()和xSemaphoreGiveRecursive()只能用于使用xSemaphoreCreateResursiveMutex()创建的互斥锁。

互斥二进制信号量非常相似,但有一些细微的差别:互斥量包括优先级继承机制,二进制信号量则不包含。这使得二进制信号量成为实现同步(任务之间或任务与中断之间)的更好选择,并且互斥信号是实现简单互斥的更好选择。

如果另一个优先级较高的任务尝试获取相同的互斥锁,则会暂时提升“获取”互斥锁的任务的优先级。拥有互斥锁的任务'继承'尝试“获取”相同互斥锁的任务的优先级。这意味着必须始终“返回”互斥锁 - 否则优先级较高的任务将永远无法获取互斥锁,优先级较低的任务将永远不会“删除”优先级。

xSemaphoreTake()文档页面 提供了用于实现互斥的互斥锁示例。

二进制信号量一旦获得就不需要返回,因此任务同步可以通过一个任务/中断连续“给出”信号量而另一个连续“获取”信号量来实现。xSemaphoreGiveFromISR()文档页面上的示例代码对此进行了演示。请注意,使用直接到任务通知可以更有效地实现相同的功能。

将互斥锁和二进制信号量的句柄分配给SemaphoreHandle_t类型的变量,并且可以在任何任务级别(与中断安全相对)API函数中使用,该函数接受该类型的参数。

 

参数:

pxMutexBuffer  必须指向StaticSemaphore_t类型的变量,该变量将用于保存互斥锁类型信号量的状态。

返回:

 如果成功创建了互斥锁类型信号量,则返回创建的互斥锁的句柄。如果由于pxMutexBuffer为NULL而未创建互斥锁,则返回NULL。

 

 

SemaphoreHandle_t xSemaphoreCreateRecursiveMutex(void)

创建递归互斥锁,并返回一个句柄,通过该句柄可以引用互斥锁。递归互斥锁不能用于中断服务程序。 在FreeRTOSConfig.h中,configSUPPORT_DYNAMIC_ALLOCATION和configUSE_RECURSIVE_MUTEXES都必须设置为1才能使xSemaphoreCreateRecursiveMutex()可用(configSUPPORT_DYNAMIC_ALLOCATION也可以保留未定义,在这种情况下,它将默认为1)。

每个递归互斥锁都需要少量的RAM来保存递归互斥锁的状态。如果使用xSemaphoreCreateRecursiveMutex()创建互斥锁,则会 从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateRecursiveMutexStatic()创建递归互斥锁,则RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

使用xSemaphoreTakeRecursive()和分别使用xSemaphoreGiveRecursive() API函数给定(释放) 递归互斥锁(获取) 。不得使用xSemaphoreTake()和xSemaphoreGive()。

使用xSemaphoreCreateMutex()和xSemaphoreCreateMutexStatic()创建非递归互斥锁。非递归互斥锁只能被任务“捕获”一次。任务尝试获取已经存在的非递归互斥锁的任何尝试都将失败 - 并且在第一次任务'给出'互斥锁时,互斥锁将始终返回。

与非递归互斥锁相反,任务可以多次“获取”递归互斥锁,并且只有在保持任务“赋予”互斥锁“使用”互斥锁的次数相同的情况下才会返回递归互斥锁。

与非递归互斥锁一样,递归互斥锁实现优先级继承算法。如果另一个优先级较高的任务尝试获取相同的互斥锁,则会暂时提升“获取”互斥锁的任务的优先级。拥有互斥锁的任务'继承'尝试“获取”相同互斥锁的任务的优先级。这意味着必须始终“返回”互斥锁 - 否则优先级较高的任务将永远无法获取互斥锁,优先级较低的任务将永远不会“删除”优先级。

 

返回:

如果成功创建了递归互斥锁,则返回创建的互斥锁的句柄。如果未创建递归互斥锁,因为无法分配保持互斥锁所需的内存, 则返回NULL。

 

 

SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic(
                              StaticSemaphore_t * pxMutexBuffer)

创建递归互斥锁,并返回一个句柄,通过该句柄可以引用互斥锁。递归互斥锁不能用于中断服务程序。 在FreeRTOSConfig.h中,configUSE_RECURSIVE_MUTEXES和configSUPPORT_STATIC_ALLOCATION都必须设置为1才能使xSemaphoreCreateRecursiveMutexStatic()可用。

每个递归互斥锁都需要少量的RAM来保存递归互斥锁的状态。如果使用xSemaphoreCreateRecursiveMutex()创建互斥锁,则会 从FreeRTOS堆自动分配所需的RAM 。如果使用xSemaphoreCreateRecursiveMutexStatic()创建递归互斥锁,则RAM由应用程序编写者提供,这需要一个额外的参数,但允许在编译时静态分配RAM。有关详细信息,请参阅Static Vs Dynamic allocation页面。

使用xSemaphoreTakeRecursive()和分别使用xSemaphoreGiveRecursive() API函数给定(释放) 递归互斥锁(获取) 。不得使用xSemaphoreTake()和xSemaphoreGive()。

使用xSemaphoreCreateMutex()和xSemaphoreCreateMutexStatic()创建非递归互斥锁。非递归互斥锁只能被任务“捕获”一次。任务尝试获取已经存在的非递归互斥锁的任何尝试都将失败 - 并且在第一次任务'给出'互斥锁时,互斥锁将始终返回。

与非递归互斥锁相反,任务可以多次“获取”递归互斥锁,并且只有在保持任务“赋予”互斥锁“使用”互斥锁的次数相同的情况下才会返回递归互斥锁。

与非递归互斥锁一样,递归互斥锁实现优先级继承算法。如果另一个优先级较高的任务尝试获取相同的互斥锁,则会暂时提升“获取”互斥锁的任务的优先级。拥有互斥锁的任务'继承'尝试“获取”相同互斥锁的任务的优先级。这意味着必须始终“返回”互斥锁 - 否则优先级较高的任务将永远无法获取互斥锁,优先级较低的任务将永远不会“删除”优先级。

 

参数:

pxMutexBuffer  必须指向StaticSemaphore_t类型的变量,该变量将用于保存互斥锁类型信号量的状态。

返回:

 如果成功创建了递归互斥锁,则返回创建的互斥锁的句柄。如果由于pxMutexBuffer为NULL而未创建递归互斥锁,则返回NULL。

 

 

 

void vSemaphoreDelete(SemaphoreHandle_t xSemaphore);

删除信号量,包括互斥锁类型信号量和递归信号量。

不要删除在其上阻塞任务的信号量(处于阻塞状态的任务等待信号量变为可用)。

参数:

xSemaphore 信号量的句柄被删除。

 

 

 

TaskHandle_t xSemaphoreGetMutexHolder(SemaphoreHandle_t xMutex);

必须在FreeRTOSConfig.h中将INCLUDE_xSemaphoreGetMutexHolder设置为1才能使此功能可用。

返回包含函数参数指定的互斥锁的任务的句柄(如果有)。

可以可靠地使用xSemaphoreGetMutexHolder()来确定调用任务是否是互斥锁持有者,但如果互斥锁由调用任务以外的任何任务持有,则无法可靠地使用。这是因为互斥锁持有者可能在调用函数的调用任务和测试函数返回值的调用任务之间发生变化。

在FreeRTOSConfig.h中,必须将configUSE_MUTEXES设置为1才能使xSemaphoreGetMutexHolder()可用。

 

参数:

xMutex 被查询的互斥锁的句柄。

返回:

包含xMutex参数指定的互斥锁的任务句柄。如果在xMutex参数中传递的信号量不是互斥锁类型信号量,或者互斥锁可用且因此未被任何任务保留,则返回NULL。

 

 

UBaseType_t uxSemaphoreGetCount(SemaphoreHandle_t xSemaphore);
	

返回信号量的计数。

 

参数:

xSemaphore  被查询的信号量的句柄。

返回:

如果信号量是计数信号量,则返回信号量当前计数值。如果信号量是二进制信号量,那么如果信号量可用则返回1,如果信号量不可用则返回0。

 

 

 

xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait);

获取信号量。之前必须通过调用xSemaphoreCreateBinary(),xSemaphoreCreateMutex()或xSemaphoreCreateCounting()来创建信号量。

不得从ISR调用此宏。如果需要,xQueueReceiveFromISR()可用于从中断中获取信号量,尽管这不是正常操作。信号量使用队列作为其底层机制,因此函数在某种程度上是可互操作的。

 

参数:

xSemaphore 正在获取信号量的句柄 - 在创建信号量时获得。
xTicksToWait 等待信号量变为可用的时间。宏portTICK_PERIOD_MS可用于将其转换为实时。块时间为零可用于轮询信号量。

如果INCLUDE_vTaskSuspend设置为“1”,则将块时间指定为portMAX_DELAY将导致任务无限期地阻塞(没有超时)。

返回:

如果获得了信号量,则为pdTRUE。如果xTicksToWait过期而信号量不可用,则为pdFALSE。

 

 

 

xSemaphoreTakeFromISR ( SemaphoreHandle_t xSemaphore, 签署了BaseType_t * pxHigherPriorityTaskWoken )

可以从ISR调用 的xSemaphoreTake()版本。与xSemaphoreTake()不同,xSemaphoreTakeFromISR()不允许指定块时间。

 

参数:

xSemaphore 信号量被“吸收”。信号量由SemaphoreHandle_t类型的变量引用,必须在使用之前显式创建。
pxHigherPriorityTaskWoken 有可能(尽管不太可能,并且依赖于信号量类型)信号量将在其上阻塞一个或多个任务以等待提供信号量。调用xSemaphoreTakeFromISR()将使一个被阻塞的任务等待让信号量离开阻塞状态。如果调用API函数导致任务离开阻塞状态,并且未阻塞任务的优先级等于或高于当前正在执行的任务(被中断的任务),则在内部,API函数将* pxHigherPriorityTaskWoken设置为pdTRUE。

如果xSemaphoreTakeFromISR()将* pxHigherPriorityTaskWoken设置为pdTRUE,则应在退出中断之前执行上下文切换。这将确保中断直接返回到最高优先级的就绪状态任务。该机制与xQueueReceiveFromISR()函数中使用的机制相同,读者可以参考xQueueReceiveFromISR()文档以获得进一步的解释。

从FreeRTOS V7.3.0开始,pxHigherPriorityTaskWoken是一个可选参数,可以设置为NULL。

返回:

如果成功获取了信号量,则为pdTRUE。如果信号量未成功获取,则为pdFALSE,因为它不可用。

 

 

 

xSemaphoreTakeRecursive(SemaphoreHandle_t xMutex, TickType_t xTicksToWait);

以递归方式获取或“获取”互斥类型信号量。必须先使用对xSemaphoreCreateRecursiveMutex()的调用创建互斥锁;

在FreeRTOSConfig.h中,configUSE_RECURSIVE_MUTEXES必须设置为1才能使此宏可用。

不得在使用xSemaphoreCreateMutex()创建的互斥锁上使用此宏。

递归使用的互斥锁可由所有者重复“捕获”。在所有者为每个成功的“take”请求调用xSemaphoreGiveRecursive()之前,互斥锁不会再次可用。例如,如果任务成功“获取”相同的互斥锁5次,那么互斥锁将无法用于任何其他任务,直到它还将“互斥锁”正好“返回”五次。

 

参数:

xMutex 获取互斥锁的句柄。这是xSemaphoreCreateRecursiveMutex()返回的句柄。
xTicksToWait 等待信号量变为可用的时间。宏portTICK_PERIOD_MS可用于将其转换为实时。块时间为零可用于轮询信号量。如果任务已拥有信号量,则无论xTicksToWait的值是什么,xSemaphoreTakeRecursive()都将立即返回。

返回:

如果获得了信号量,则为pdTRUE。如果xTicksToWait过期而信号量不可用,则为pdFALSE。

 

 

 

xSemaphoreGive(SemaphoreHandle_t xSemaphore);

发布信号量。之前必须通过调用xSemaphoreCreateBinary(),xSemaphoreCreateMutex()或xSemaphoreCreateCounting()来创建信号量。

不得在ISR中使用此功能。有关可以从ISR使用的替代方法,请参阅xSemaphoreGiveFromISR()。

此宏也不能用于使用xSemaphoreCreateRecursiveMutex()创建的信号量。

 

 

参数:

xSemaphore 释放信号量的句柄。这是创建信号量时返回的句柄。

返回:

如果信号量被释放,则为pdTRUE。如果发生错误,请输入pdFALSE。信号量使用队列实现。如果队列上没有空间来发布消息,则会发生错误 - 表示未首先正确获取信号量。

 

 

xSemaphoreGiveRecursive(SemaphoreHandle_t xMutex)

以递归方式释放或“给出”互斥类型信号量。必须先使用对xSemaphoreCreateRecursiveMutex()的调用创建互斥锁;

在FreeRTOSConfig.h中,configUSE_RECURSIVE_MUTEXES必须设置为1才能使此宏可用。

不得在使用xSemaphoreCreateMutex()创建的互斥锁上使用此宏。

递归使用的互斥锁可由所有者重复“捕获”。在所有者为每个成功的“take”请求调用xSemaphoreGiveRecursive()之前,互斥锁不会再次可用。例如,如果任务成功“获取”相同的互斥锁5次,那么互斥锁将无法用于任何其他任务,直到它还将“互斥锁”正好“返回”五次。

 

参数:

xMutex 释放或“给定”互斥锁的句柄。这是xSemaphoreCreateRecursiveMutex()返回的句柄。

 

 

 

xSemaphoreGiveFromISR ( SemaphoreHandle_t xSemaphore, 签署了BaseType_t * pxHigherPriorityTaskWoken )

发布信号量。之前必须通过调用xSemaphoreCreateBinary()或xSemaphoreCreateCounting()来创建信号量。

互斥类型信号量(使用对xSemaphoreCreateMutex()的调用创建的信号量)不得与此宏一起使用。

该宏可以在ISR中使用。

 

参数:

xSemaphore 释放信号量的句柄。这是创建信号量时返回的句柄。
pxHigherPriorityTaskWoken 如果给予信号量导致任务解除阻塞,则xSemaphoreGiveFromISR()将* pxHigherPriorityTaskWoken设置为pdTRUE,并且未阻塞任务的优先级高于当前正在运行的任务。如果xSemaphoreGiveFromISR()将此值设置为pdTRUE,则应在退出中断之前请求上下文切换。

从FreeRTOS V7.3.0开始,pxHigherPriorityTaskWoken是一个可选参数,可以设置为NULL。

返回:

如果成功给出了信号量,则为pdTRUE,否则为errQUEUE_FULL。

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值