信号量的主要目的有两个:共享资源访问。 与任务同步。
FreeRTOS中信号量分为如下几种:
1、二值信号量
2、计数型信号量
3、互斥信号量
4、递归互斥信号量
2.计数型信号量
创建计数型信号量:
释放计数型信号量:
获取计数型信号量:
实验
讲信号量初始值设为0xSemaphoreCreateCounting( 255, 10 );
task1_task任务通过按键释放信号量,Dataprocess_task每隔2s获取信号量
task1_task任务函数
//task1_task函数
void task1_task(void *pvParameters)
{
u8 key;
while(1)
{
key = KEY_Scan(0);
if(key == WKUP_PRES)//发送信号量
{
if(CountSemahore != NULL)
xSemaphoreGive(CountSemahore);
}
LED0 = ~LED0;
vTaskDelay(10);
}
}
Dataprocess任务函数
获取当前信号量值semavalue = uxSemaphoreGetCount(CountSemahore);
void Dataprocess_task(void *pvParameters)
{
UBaseType_t semavalue;
u8 count = 0;
while(1)
{
count++;
if(BinarySemaphore != NULL)
{
xSemaphoreTake(CountSemahore, portMAX_DELAY);//获取信号量,死等
semavalue = uxSemaphoreGetCount(CountSemahore);
printf("semavalue = %d\r\n", (int)semavalue);
}
LED1 = !LED1;
vTaskDelay(2000);
}
}
实验现象
每按下一次信号量就加1,每隔两秒信号量就自动减1