邯郸网站制作,网站设计行业资讯,视频网站开发工具,注册二级建造师查询入口二值信号量
二值信号量的本质是一个队列长度为1的队列#xff0c;该队列就只有空和满两种情况#xff0c;这就是二值。
二值信号量通常用于互斥访问或任务同步#xff0c;与互斥信号量比较类似#xff0c;但是二值信号量有可能会导致优先级翻转的问题#xff0c;所以二值…二值信号量
二值信号量的本质是一个队列长度为1的队列该队列就只有空和满两种情况这就是二值。
二值信号量通常用于互斥访问或任务同步与互斥信号量比较类似但是二值信号量有可能会导致优先级翻转的问题所以二值信号量更适合用于同步。
SemaphoreHandle_t xSemaphoreCreateBinary( void );xSemaphoreTake( SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait );xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,signed BaseType_t *pxHigherPriorityTaskWoken)xSemaphoreGive( SemaphoreHandle_t xSemaphore );xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,signed BaseType_t *pxHigherPriorityTaskWoken)void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );重点在许多使用场景中使用直达任务通知要比使用二值信号量的速度更快内存效率更高。所以没有实例代码。
计数型信号量
计数型信号量相当于队列长度大于1的队列因此计数型信号量能够容纳多个资源这在计数型信号量被创建的时候确定的。
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount,UBaseType_t uxInitialCount);UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );其他接口与二值信号量的接口一致。重点在许多情况下任务通知可以提供计数信号量的轻量级替代方案。
互斥信号量互斥锁
互斥信号量其实就是一个拥有优先级继承的二值信号量在同步的应用中二值信号量最合适。互斥信号量适合那些需要互斥访问的应用中。
注意互斥信号量不能用于中断服务函数中原因如下
互斥信号量有任务优先级继承的机制但是中断不是任务没有任务优先级所以互斥信号量只能用于任务中。中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。
SemaphoreHandle_t xSemaphoreCreateMutex( void )xSemaphoreGive( SemaphoreHandle_t xSemaphore );xSemaphoreTake( SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait );SemaphoreHandle_t xSemaphore NULL;/* A task that creates a semaphore. */
void vATask( void * pvParameters )
{/* Create the semaphore to guard a shared resource. As we are usingthe semaphore for mutual exclusion we create a mutex semaphorerather than a binary semaphore. */xSemaphore xSemaphoreCreateMutex();
}/* A task that uses the semaphore. */
void vAnotherTask( void * pvParameters )
{/* ... Do other things. */if( xSemaphore ! NULL ){/* See if we can obtain the semaphore. If the semaphore is notavailable wait 10 ticks to see if it becomes free. */if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) pdTRUE ){/* We were able to obtain the semaphore and can now access theshared resource. *//* ... *//* We have finished accessing the shared resource. Release thesemaphore. */xSemaphoreGive( xSemaphore );}else{/* We could not obtain the semaphore and can therefore not accessthe shared resource safely. */}}
}递归互斥信号量递归互斥锁
xSemaphoreCreateMutex()用于创建非递归互斥锁。非递归互斥锁只能被一个任务 获取一次如果同一个任务想再次获取则会失败 因为当任务第一次释放互斥锁时互斥锁就一直 处于释放状态。
与非递归互斥锁相反递归互斥锁可以被同一个任务获取很多次 获取多少次就需要释放多少次 此时才会返回递归互斥锁。
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )xSemaphoreTakeRecursive( SemaphoreHandle_t xMutex,TickType_t xTicksToWait );xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )