1

以下是关于 xSemaphoreTake() 函数的 FreeRTOS api-reference http://www.freertos.org/a00122.html的摘录:

// See if we can obtain the semaphore. If the semaphore is not available
// wait 10 ticks to see if it becomes free.
if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
{
// We were able to obtain the semaphore and can now access the
// shared resource.

我的问题是:我是否已经在这里有了信号量,或者我是否必须 xSemaphoreTake( xSemaphore, (portTickType) 10 )像这样显式调用:

// We have finished accessing the shared resource. Release the
// semaphore.
xSemaphoreGive( xSemaphore );
}
4

3 回答 3

4

作为您链接到的示例,在 if (...) 正文中采用信号量。如果您从该示例中复制粘贴,则由您来确保您的程序中同时具有 xSemaphoreTake 和 xSemaphoreGive。

于 2013-01-04T21:30:57.960 回答
0

当您调用 xSemaphoreTake() 时,您不知道您是否拥有 xSemaphore 信号量。如果它是空闲的,您的代码将继续执行,如果它会在 10 个滴答声内空闲,您的代码将继续执行,而 OS 调度程序不会让您失望(这是您的调用中指定的超时),如果 xSemaphore 在指定的超时后不可用,您的任务将进入阻塞状态,并执行下一个具有更高优先级的就绪任务。

您对同一信号量的显式调用 xSemaphoreGive 在这里将是一个严重的错误,如果您不拥有它,那么释放它是没有意义的。

于 2013-03-13T14:50:29.517 回答
0

我的问题是:我是否已经在这里有了信号量,或者我必须调用 xSemaphoreTake( xSemaphore, (portTickType) 10 ),例如:

是的,如果您输入 if 语句的主体,您就有信号量。如果在阻塞时间(在您的情况下为 10 个滴答声)之后信号量不可用(或在持续时间内给出),则 xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) 返回 pdFALSE。

于 2015-02-17T05:42:28.857 回答