FreeRTOS笔记-信号量

  1. 信号量
    1. 信号量基本使用方法
    2. 使用信号量实现同步
    3. 使用信号量实现互斥锁

信号量

信号量基本使用方法

信号量句柄定义

1
SemaphoreHandle_t Semaphore_Handle_1;

信号量创建,前面句柄创建,第一个变量为信号量的最大容量,第二个为初始数值

1
Semaphore_Handle_1 = xSemaphoreCreateCounting(10, 0);	

信号量添加,添加完成后,信号量的数值加1

1
xSemaphoreGive(Semaphore_Handle_1);

信号量读取,即信号量减少,使用portMAX_DELAY后,在读取到才继续运行

1
xSemaphoreTake(Semaphore_Handle_1, portMAX_DELAY);

使用信号量实现同步

同步:即在信号量give后,就能进行take,实现任务的同步,例如在计算完成后才进行take后续的任务,两个任务就实现了同步。

实验现象:当不通过信号量来进行输出时,并没有及时地对结果进行输出,说明任务没有进行同步,在任务调度中可能错过信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Task2Function(void * param)
{
int sum;
while (1)
{
flag = 0;
xSemaphoreTake(Semaphore_Handle_1, portMAX_DELAY)
printf("task2 is running\r\n");
vTaskDelay(1);
}
}

void Task3Function(void * param)
{

while(1)
{
if(flag = 1)
printf("task3 is running\r\n");
vTaskDelay(1);
}
}

使用信号量实现互斥锁

互斥:两个任务不能同时进行,即对功能运行的完整性进行保证,避免冲突
创建二进制信号量,初始值为0

1
Semaphore_Handle_USART1 = xSemaphoreCreateBinary();

给二进制信号量赋1,标志着该临界资源空闲可以使用,例为串口1的使用

1
xSemaphoreGive(Semaphore_Handle_USART1);

如下是互斥锁的使用,两个任务使用一个串口,而不会导致输出过程相互冲突。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Task2Function(void * param)
{
int sum;
while (1)
{
xSemaphoreTake(Semaphore_Handle_USART1, portMAX_DELAY);
printf("task2 is running\r\n");
xSemaphoreGive(Semaphore_Handle_USART1);
vTaskDelay(1);
}
}

void Task3Function(void * param)
{

while(1)
{
xSemaphoreTake(Semaphore_Handle_USART1, portMAX_DELAY);
printf("task3 is running\r\n");
xSemaphoreGive(Semaphore_Handle_USART1);
vTaskDelay(1);
}
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com

💰

×

Help us with donation

相册 动态菜单1