1分钟理解FreeRtos中的信号量知识
一、信号量本质
可以理解为一个计数器,任务每完成某个操作或者某个操作就绪的时候就可以给计数器自加,目的是告诉其他打算进一步操作的任务可以进行了(阻塞状态唤醒作用)。
二、作用与使用
1.作用
实现任务之间的同步
2.使用
创建信号量
二进制信号量 | 计数器信号量 | |
动态创建 | xSemaphoreCreateBinary 计数值初始值为 0 | xSemaphoreCreateCounting |
vSemaphoreCreateBinary (过时了) 计数值初始值为 1 | ||
静态创建 | xSemaphoreCreateBinaryStatic | xSemaphoreCreateCountingStatic |
操作信号量
在任务中使用 | 在 ISR 中使用 | |
give | xSemaphoreGive | xSemaphoreGiveFromISR |
take | xSemaphoreTake | xSemaphoreTakeFromISR |
3.示例
xSemCalc = xSemaphoreCreateCounting(10, 0);static SemaphoreHandle_t xSemCalc;void Task1Function(void * param)
{volatile int i = 0;while (1){for (i = 0; i < 10000000; i++)sum++;//printf("1");xSemaphoreGive(xSemCalc);vTaskDelete(NULL);}
}void Task2Function(void * param)
{while (1){xSemaphoreTake(xSemCalc, portMAX_DELAY);printf("sum = %d\r\n", sum);}
}