03_FreeRTOS 二进制信号量
本文介绍:
二进制信号量的使用方法
- 简介信号量
信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量:
Binary Semaphore之所以称为Binary信号量,是因为它存在(‘1’)或不存在(‘0’)。其中没有第三个条件。因此,任务要么具有信号量,要么根本没有。对于Task,我们可以创建一个条件,使其必须具有信号量才能执行自身。因此,如果Task没有信号量,则它别无选择,只能等待当前具有信号量的Task释放它。
假设关键部分正在运行“低优先级任务”。高优先级任务可以在任何时间抢占低优先级任务。但是,如果低优先级任务具有信号量,并且直到它退出关键部分才释放它,那么高优先级任务除了等待信号量之外别无选择,并且它不能抢占低优先级任务。
-
建立工程
在上一篇基础上加上信号量,如下图,再更新工程即可。
-
通过1s发送一次信号量来开始任务。
具体实现如下:
3.1 Task1_Init
每1s发送一次信号量
void Task1_init(void const * argument)
{
/* USER CODE BEGIN 5 /
/ Infinite loop /
for(;😉
{
osDelay(1000);
osSemaphoreRelease(BinarySem01Handle);//释放信号量
printf(“semaphore released by Task1\n”);
}
/ USER CODE END 5 */
}
```
3.2 `Task2_Init`等待信号量,然后通过uart1 printf一些提示信息
/* USER CODE END Header_Task2_init */
void Task2_init(void const * argument)
{
/* USER CODE BEGIN Task2_init */
/* Infinite loop */
for(;;)
{
printf("waiting for semaphore\n");
osSemaphoreWait(BinarySem01Handle, osWaitForever);
printf("semaphore acquired by Task2\n");
}
/* USER CODE END Task2_init */
}
- 输出
在osSemaphoreWait(BinarySem01Handle, osWaitForever);
中,任务进入阻塞状态,等待1s,通过osSemaphoreRelease(BinarySem01Handle);来释放信号量,才能开始从等待这里运行。
Code下载地址
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)