词条 | xSemaphoreTake |
释义 | 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 { //无法获取信号量,因此无法安全地访问共享资源 } } } |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。