FREERTOS 函数
semphr. h
xSemaphoreTake(
xSemaphoreHandle xSemaphore,
portTickType xBlockTime
)
用于获取信号量的宏。信号量必须已经通过调用vSemaphoreCreateBinary(), xSemaphoreCreateMutex() 或 xSemaphoreCreateCounting()来创建。 这个宏不能在服务中断程序中调用。如果有必要,可以调用xQueueReceiveFromISR() 来在中断服务程序中获取信号量,虽然这并不是一种正规的操作。 xSemaphoreTake() 是一个全功能任务间通讯API, xSemaphoreAltTake() 是其等价的替代API 。这两个版本均需要同样的参数并返回同样的值。Parameters:xSemaphore
将被获得的信号量句柄,此信号量必须已经被创建
xBlockTime
等待信号量可用的时钟滴答次数,可以使用 portTICK_RATE_MS宏来转换为实际的时间 。当为0时可以用于 对信号量进行轮询(poll the semaphore) 如果INCLUDE_vTaskSuspend置位“1”,则指定xBlockTime为 portMAX_DELAY会导致任务阻塞时间不确定(不会超时)
返回:如果成功获取信号量则返回pdTRUE,如果xBlockTime超时而信号量还未可用则返回pdFALSE。 应用范例: xSemaphoreHandle xSemaphore = NULL;
// A task that creates a semaphore. void vATask( void * pvParameters ) { // 创建一个信号量用于标识一个共享资源。 // 因为我们使用信号量来互斥,因此创建互斥锁信号量而不是二元信号量 xSemaphore = xSemaphoreCreateMutex(); }
//使用信号量的任务 void vAnotherTask( void * pvParameters ) { // ... 完成其他事情
if( xSemaphore != NULL ) { // 查看是否可以获得信号量,如果信号量不可用,则用10个时钟滴答来查看信号量是否可用 if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE ) { //已经能够获得信号量并且现在可以访问共享资源
// ...
// 完成共享资源访问,释放信号量 xSemaphoreGive( xSemaphore ); } else { //无法获取信号量,因此无法安全地访问共享资源 } } }