03_FreeRTOS 二进制信号量

03_FreeRTOS 二进制信号量

本文介绍:
二进制信号量的使用方法

  1. 简介信号量
    信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量:
  • 二进制信号量
  • 计数信号量
  • 互斥信号量
  • 递归信号量

Binary Semaphore之所以称为Binary信号量,是因为它存在(‘1’)或不存在(‘0’)。其中没有第三个条件。因此,任务要么具有信号量,要么根本没有。对于Task,我们可以创建一个条件,使其必须具有信号量才能执行自身。因此,如果Task没有信号量,则它别无选择,只能等待当前具有信号量的Task释放它。
假设关键部分正在运行“低优先级任务”。高优先级任务可以在任何时间抢占低优先级任务。但是,如果低优先级任务具有信号量,并且直到它退出关键部分才释放它,那么高优先级任务除了等待信号量之外别无选择,并且它不能抢占低优先级任务。

  1. 建立工程
    在上一篇基础上加上信号量,如下图,再更新工程即可。

  2. 通过1s发送一次信号量来开始任务。
    具体实现如下:
    3.1 Task1_Init每1s发送一次信号量

    /* USER CODE END Header_Task1_init */
    

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 */
}
  1. 输出
    osSemaphoreWait(BinarySem01Handle, osWaitForever);中,任务进入阻塞状态,等待1s,通过osSemaphoreRelease(BinarySem01Handle);来释放信号量,才能开始从等待这里运行。

Code下载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gkbytes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值