贵州茅台酒股份有限公司网站,香奈儿网站建设,二级建造师考试科目,济宁房产网站建设FreeRTOS中的信号量是一种用于任务间同步的机制。它可以用来实现任务之间的互斥访问共享资源或者等待某个事件发生。 文章目录 信号量类型1. 二进制信号量#xff08;Binary Semaphore#xff09;#xff1a;2. 计数信号量#xff08;Counting Semaphore#xff09;… FreeRTOS中的信号量是一种用于任务间同步的机制。它可以用来实现任务之间的互斥访问共享资源或者等待某个事件发生。 文章目录 信号量类型1. 二进制信号量Binary Semaphore2. 计数信号量Counting Semaphore 信号量使用1. xSemaphoreCreateBinary()2. xSemaphoreCreateCounting()3. xSemaphoreCreateMutex()4. xSemaphoreTake()5. xSemaphoreGive() 示例代码块 信号量类型
FreeRTOS中的信号量有两种类型二进制信号量和计数信号量。
1. 二进制信号量Binary Semaphore
二进制信号量只有两种状态0和1。当一个任务获取到二进制信号量时它会将信号量的值减1如果信号量的值已经为0则任务会被阻塞直到有其他任务释放了该信号量。当一个任务释放二进制信号量时它会将信号量的值加1如果有其他任务正在等待该信号量则会唤醒其中一个等待的任务。
2. 计数信号量Counting Semaphore
计数信号量可以有多个状态取决于其初始值和每次操作的增减值。当一个任务获取到计数信号量时它会将信号量的值减去指定的增减值如果信号量的值已经为0则任务会被阻塞直到有其他任务释放了足够的信号量。当一个任务释放计数信号量时它会将信号量的值加上指定的增减值如果有其他任务正在等待该信号量则会唤醒其中一个等待的任务。
在FreeRTOS中使用信号量的步骤如下
创建一个信号量对象可以使用xSemaphoreCreateBinary()函数创建二进制信号量或者使用xSemaphoreCreateCounting()函数创建计数信号量。在任务中使用xSemaphoreTake()函数获取信号量在需要访问共享资源或者等待事件发生的地方调用该函数。在任务中使用xSemaphoreGive()函数释放信号量在完成对共享资源的访问或者事件发生后调用该函数。根据需要可以使用xSemaphoreTake()函数的阻塞时间参数来控制任务等待信号量的时间。
信号量使用
1. xSemaphoreCreateBinary() 原型 SemaphoreHandle_t xSemaphoreCreateBinary(void)作用创建一个二进制信号量。 参数无。 返回值返回一个指向信号量的句柄SemaphoreHandle_t。
2. xSemaphoreCreateCounting() 原型: SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount)作用创建一个计数信号量。 参数一个参数指定信号量的最大计数值。 返回值返回一个指向信号量的句柄SemaphoreHandle_t。
3. xSemaphoreCreateMutex()
原型
SemaphoreHandle_t xSemaphoreCreateMutex(void)作用创建一个互斥信号量。参数无。返回值返回一个指向信号量的句柄SemaphoreHandle_t。
4. xSemaphoreTake()
原型
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait)作用获取一个信号量。参数信号量的句柄SemaphoreHandle_t和可选的超时时间TickType_t。返回值如果获取成功则返回pdTRUE如果获取失败超时或其他原因则返回pdFALSE。
5. xSemaphoreGive()
原型
BaseType_t xSemaphoreGive(SemaphoreHandle_t xSemaphore)作用释放一个信号量。参数信号量的句柄SemaphoreHandle_t。返回值无。
示例代码块
#include FreeRTOS.h
#include task.h
#include semphr.h// 共享资源
int sharedResource 0;// 互斥信号量
SemaphoreHandle_t mutex;void task1(void *pvParameters)
{while (1) {// 获取互斥信号量xSemaphoreTake(mutex, portMAX_DELAY);// 访问共享资源sharedResource;// 释放互斥信号量xSemaphoreGive(mutex);vTaskDelay(pdMS_TO_TICKS(1000));}
}void task2(void *pvParameters)
{while (1) {// 获取互斥信号量xSemaphoreTake(mutex, portMAX_DELAY);// 访问共享资源sharedResource--;// 释放互斥信号量xSemaphoreGive(mutex);vTaskDelay(pdMS_TO_TICKS(1000));}
}int main(void)
{// 创建互斥信号量mutex xSemaphoreCreateMutex();// 创建任务xTaskCreate(task1, Task 1, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY 1, NULL);xTaskCreate(task2, Task 2, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY 1, NULL);// 启动调度器vTaskStartScheduler();return 0;
}在示例中使用了上述函数来创建互斥信号量xSemaphoreCreateMutex()获取互斥信号量xSemaphoreTake()释放互斥信号量xSemaphoreGive()。其中互斥信号量的句柄存储在全局变量mutex中。