STM32中的FreeRTOS-#3(二值信号量)

本文是FreeRTOS教程系列的第三篇,将介绍“二值信号量”的使用。信号量用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制(后面会有一节专门讲队列)实现的。在FreeRTOS中有4种类型的信号量:二值信号量;计数信号量;互斥锁递归二值信号量,顾名思义,是只有两个值,“0”和“1”的信号量。一个任务要么有信号量,有么没有信号量,没有第三种情况(比如有两个信号量)。引入信号量的原因是:某些情况下单纯依靠任务优先级进行任务调度,不能满足应用要求。假设有如下场景:一个低
摘要由CSDN通过智能技术生成

本文是FreeRTOS教程系列的第三篇,将介绍“二值信号量”的使用。

信号量用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制(后面会有一节专门讲队列)实现的。在FreeRTOS中有4种类型的信号量:

  • 二值信号量;
  • 计数信号量;
  • 互斥锁
  • 递归

二值信号量,顾名思义,是只有两个值,“0”和“1”的信号量。一个任务要么有信号量,有么没有信号量,没有第三种情况(比如有两个信号量)。引入信号量的原因是:某些情况下单纯依靠任务优先级进行任务调度,不能满足应用要求。假设有如下场景:一个低优先级任务(LTask)负责处理数据,得到的数据将被另一个高优先级任务(HTask)使用。根据任务调度规则,LTask随时可能被HTask抢断。一旦LTask中关键代码部分被抢断,HTask可能会拿到”半成品“数据,导致计算错误。但是如果LTask拥有信号量,执行完关键部分的代码才释放信号量。在此期间,HTask即使准备就绪,也必须等待LTask释放信号量以后才能抢断LTask,潜在的错误就可以避免。


CubeMX设置


首先在CubeMX中创建三个不同的任务,任务的属性设置如下
图1.创建任务

图1.创建任务

接着,创建一个二值信号量,如下图所示
在这里插入图片描述

图2.创建信号量

其余设置与前两节类似,不再赘述。


代码部分


在CubeMX中已经创建了三个不同的任务,下面实现任务内容

首先是中等优先级任务(MEDIUM Task

void StartMediumTask(void const *argument)
{
   
  /* USER CODE BEGIN StartMediumTask */
  /* Infinite loop */
  for (;;)
  {
   
    
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值