22.2.4 函数xSemaphoreTake
函数原型:
复制代码
xSemaphoreTake( SemaphoreHandle_t xSemaphore, /* 信号量句柄 */
TickType_t xTicksToWait ); /* 等待信号量可用的最大等待时间 */
函数描述:
函数xSemaphoreTake用于在任务代码中获取信号量。
(1)第1个参数是信号量句柄。
(2)第2个参数是没有信号量可用时,等待信号量可用的最大等待时间,单位系统时钟节拍。
(3)返回值,如果创建成功会获取信号量返回pdTRUE,否则返回pdFALSE。
使用这个函数要注意以下问题:
1. 此函数是用于任务代码中调用的,故不可以在中断服务程序中调用此函数,中断服务程序使用的是xSemaphoreTakeFromISR。
2. 如果消息队列为空且第2个参数为0,那么此函数会立即返回。
3. 如果用户将FreeRTOSConfig.h文件中的宏定义INCLUDE_vTaskSuspend配置为1且第2个参数配置为portMAX_DELAY,那么此函数会永久等待直到信号量可用。
使用举例:
复制代码
static SemaphoreHandle_t xSemaphore = NULL;
/*
*********************************************************************************************************
* 函 数 名: vTaskMsgPro
* 功能说明: 使用函数xSemaphoreTake接收定时器中断发送的同步信号
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
static void vTaskMsgPro(void *pvParameters)
{
BaseType_t xResult;
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300); /* 设置最大等待时间为300ms */
while(1)
{
xResult = xSemaphoreTake(xSemaphore, (TickType_t)xMaxBlockTime);
if(xResult == pdTRUE)
{
/* 接收到同步信号 */
printf("接收到同步信号rn");
}
else
{
/* 超时 */
bsp_LedToggle(1);
bsp_LedToggle(4);
}
}
}
22.2.4 函数xSemaphoreTake
函数原型:
复制代码
xSemaphoreTake( SemaphoreHandle_t xSemaphore, /* 信号量句柄 */
TickType_t xTicksToWait ); /* 等待信号量可用的最大等待时间 */
函数描述:
函数xSemaphoreTake用于在任务代码中获取信号量。
(1)第1个参数是信号量句柄。
(2)第2个参数是没有信号量可用时,等待信号量可用的最大等待时间,单位系统时钟节拍。
(3)返回值,如果创建成功会获取信号量返回pdTRUE,否则返回pdFALSE。
使用这个函数要注意以下问题:
1. 此函数是用于任务代码中调用的,故不可以在中断服务程序中调用此函数,中断服务程序使用的是xSemaphoreTakeFromISR。
2. 如果消息队列为空且第2个参数为0,那么此函数会立即返回。
3. 如果用户将FreeRTOSConfig.h文件中的宏定义INCLUDE_vTaskSuspend配置为1且第2个参数配置为portMAX_DELAY,那么此函数会永久等待直到信号量可用。
使用举例:
复制代码
static SemaphoreHandle_t xSemaphore = NULL;
/*
*********************************************************************************************************
* 函 数 名: vTaskMsgPro
* 功能说明: 使用函数xSemaphoreTake接收定时器中断发送的同步信号
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
static void vTaskMsgPro(void *pvParameters)
{
BaseType_t xResult;
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300); /* 设置最大等待时间为300ms */
while(1)
{
xResult = xSemaphoreTake(xSemaphore, (TickType_t)xMaxBlockTime);
if(xResult == pdTRUE)
{
/* 接收到同步信号 */
printf("接收到同步信号rn");
}
else
{
/* 超时 */
bsp_LedToggle(1);
bsp_LedToggle(4);
}
}
}
举报