电子商务网站建设读书笔记,男女做的那个视频网站,免费开挂的软件,wordpress 公司网站 模板 下载freertos信号量之二值信号量 简介例程 简介
FreeRTOS的二值信号量#xff08;Binary Semaphore#xff09;是用于实现进程间同步和临界资源保护的重要工具。以下是一些二值信号量的常用函数及其说明#xff1a;
1#xff09;xSemaphoreCreateBinary() 创建一个二值信号量… freertos信号量之二值信号量 简介例程 简介
FreeRTOS的二值信号量Binary Semaphore是用于实现进程间同步和临界资源保护的重要工具。以下是一些二值信号量的常用函数及其说明
1xSemaphoreCreateBinary() 创建一个二值信号量。该函数接受一个无符号整型参数用于指定信号量的初始值。如果初始值为0则表示信号量未被占用否则表示信号量已被占用。
2xSemaphoreTake(SemaphoreHandle_t xSemaphore, portTickType xBlockTime) 获取二值信号量。该函数会尝试获取信号量如果信号量可用则获取成功并立即返回否则如果信号量不可用函数会阻塞调用任务直到信号量可用或超时。xBlockTime参数指定阻塞时间单位为系统时钟节拍数。
3xSemaphoreGive(SemaphoreHandle_t xSemaphore) 释放二值信号量。该函数会将信号量的值置为1表示信号量可用。如果有任务正在等待该信号量则其中一个任务将被唤醒并继续执行。
4xSemaphoreGetCount(SemaphoreHandle_t xSemaphore) 获取二值信号量的当前值。该函数返回信号量的当前值即0或1。
5xSemaphoreDelete(SemaphoreHandle_t xSemaphore) 删除一个二值信号量。该函数会释放与信号量关联的资源并使信号量无效。
使用注意点 二值信号量只有两个状态0和1因此只能用于简单的同步和资源保护场景。 二值信号量不支持优先级继承因此不会出现优先级反转的问题。 在释放信号量时需要注意保证调用xSemaphoreGive()函数的代码能够正确执行否则可能导致信号量无法释放而引起死锁。
例程
#include FreeRTOS.h
#include task.h // 定义二值信号量的初始状态为0
static SemaphoreHandle_t binarySemaphore 0; void vATask( void * pvParameters )
{ portTickType xDelay; for( ;; ) { // 任务进入临界区保护临界资源 xSemaphoreTake( binarySemaphore, ( portTickType ) 0 ); // 等待信号量变为1 // 临界区代码保护临界资源 // ... // 释放信号量使信号量状态变为0允许其他任务或中断服务程序进入临界区 xSemaphoreGive( binarySemaphore ); // 延时一定时间后再次进入临界区 xDelay pdMS_TO_TICKS( 1000 ); // 延时1秒 portYIELD_WITHIN( xDelay ); }
} void vAnInterruptServiceRoutine( void )
{
// 中断服务程序中获取二值信号量保护中断服务程序的代码不被打断
xSemaphoreTakeFromISR( binarySemaphore, xHigherPriorityTaskWoken );
// 中断服务程序代码保护中断服务程序的代码不被打断
// ...
// 中断服务程序释放二值信号量允许任务进入临界区
xSemaphoreGiveFromISR( binarySemaphore, xHigherPriorityTaskWoken );
}在上述示例中任务vATask首先进入临界区并等待二值信号量。当二值信号量的状态为0时任务会阻塞等待。一旦任务进入临界区就可以执行保护临界资源的代码。当任务完成临界区代码后释放二值信号量使其状态变为0允许其他任务或中断服务程序进入临界区。
在中断服务程序中也可以使用二值信号量来保护中断服务程序的代码不被打断。当低优先级的中断发生时中断服务程序会获取二值信号量并快速处理少部分工作。一旦中断服务程序完成工作就会释放二值信号量允许高优先级的中断或任务进入临界区。