0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32F407的FreeRTOS学习笔记(6)

CHANBAEK 来源: 实在太懒于是不想取名 作者: 电路小白 2023-11-08 11:00 次阅读

信号量(Semaphore)也被称为信号灯。有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量(来自百度百科)

简而言之,信号量就是在全局中表示共享资源状态的量。例如一个停车场,其中的车位就是共享资源。每当有车辆进进出出的时候,门口门卫总会统计出入车辆的数量,这就是信号量,我们可以通过信号量来获公共资源的信息(空余车位、已用车位)

而二进制信号量顾名思义只有0和1,例如电话亭的使用情况,当有人的时候其他人就无法使用电话亭。只有当电话亭空余的时候才能使用电话亭,而电话亭的使用状态则是二进制信号,电话亭本身则是共享资源。

在原本的裸机开发中我们通常会使用大量的标记符号并且在main函数中不断轮询该标记,这样子代码的逻辑就会异常复杂,而二进制信号量则可以代替这样子的作用,当任务在继续时二值信号量返回0,任务空闲时二进制信号量返回1,可以完美的替代如下这些标志变量。

图片

FreeRTOS中我们通常也会使用一个任务来专门轮询信号量,获得信号量的状态,实现信号量的同步。

除此之外我们的程序通常会有一个公共缓存区作为共享资源,每一个资源都可以使用公共缓存区的数据,即可以从中读取数据也可以写入数据。这个公共缓存区就像是停车场,车位有限,而我们则是根据信号量来控制这个停车场是否能够继续停下车辆。

图片

在FreeRTOS的介绍中我们可以看到,而二进制信号量的可以看作只有一个项目的队列,用队列的空和满来代表信息。

图片

图片

导入我们关于信号量的头文件“semphr.h”

关于二进制信号量的API文档中,创建一个二进制信号量首先需要将相对应的宏,即configSUPPORT_DYNAMIC_ALLOCATION打开,接着创建一个SemaphoreHandle_t 的信号量句柄来接收该创建函数的返回值。

LED_SemaphoreHandler = xSemaphoreCreateBinary();
  if(LED_SemaphoreHandler!=NULL)
  {
    printf("Semaphore Create Successfullyrn");
  }

接着我们在启动函数中写上该函数。这样子我们编译并烧录进我们的单片机

图片

串口助手上成功显示我们创建二进制信号量的信息。

#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
    #define xSemaphoreCreateBinary()    xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )
#endif

跳转之后发现,其实这个函数就是创建一个项目大小为1 的队列,因此二进制信号量的本质就是队列。

图片

在文档中找到获取信号量的函数,分别是xSemaphoreTake和xSemaphoreTakeFromISR,从名字中我们可以知道这两个函数分别是在普通函数与中断函数中获取信息量的。

图片

可以看到,用法还是非常的简单,返回值是pdTRUE和pdFALSE,是用来判断信号量是否有用,即队列是否有空余。其中的参数xTicksToWait则是用来设置等待时间,在等待时间内阻塞以试图获得信号量。

最后我们看看释放信号量的函数

图片

这个释放信号量,并不是说释放空间那种表示删除的意思,而是如最后表达的那样,发布信号量。简而言之其实也就是向队列中的项目发布数据。

所以正确的流程是:创建信号量,轮询检测信号量是否释放,释放信号量。

接下来检验一下我们的信号量。

我们先创建一个任务,轮询信号量并且一直等待信号量是否释放。如果检测到信号量则翻转LED

BaseType_t err;
  while(1)
  {
    if(LED_SemaphoreHandler!=NULL)
    {
      err = xSemaphoreTake(LED_SemaphoreHandler,portMAX_DELAY);//一直等待信号量
      if(err == pdTRUE)
      {
        HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);//LED翻转
      }
      else
      {
        printf("No Semaphorern");
      }      
    }
    vTaskDelay(10);
  }

接着编写按钮函数,如果按下按钮则释放一个信号量。

if(key==2)
    {
      if(LED_SemaphoreHandler!=NULL)
      {
        err = xSemaphoreGive(LED_SemaphoreHandler);
        printf("Give Semaphore Successrn");
      }
      else
      {
        printf("Give Semaphore Failrn");
      }
    }
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19724
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61347
  • 信号灯
    +关注

    关注

    2

    文章

    63

    浏览量

    13260
  • 信号量
    +关注

    关注

    0

    文章

    53

    浏览量

    8257
收藏 人收藏

    评论

    相关推荐

    基于STM32F407FreeRTOS学习笔记(1)

    其实从很早之前就想学实时操作系统(RTOS)了,但是一直没有时间去学,以前使用STM32单片机一直停留在逻辑开发以及前后台系统,而真正被广泛使用的则是RTOS。
    的头像 发表于 11-07 11:37 414次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(1)

    基于STM32F407FreeRTOS学习笔记(2)

    上一期配置完FreeRTOS的环境后,这一期记录自己关于任务创建的学习过程。
    的头像 发表于 11-07 11:39 386次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(2)

    基于STM32F407FreeRTOS学习笔记(3)

    上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
    的头像 发表于 11-07 11:41 355次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(3)

    基于STM32F407FreeRTOS学习笔记(4)

    CPU工作的时候,各个任务运行会占用CPU的资源,在Windows系统中我们可以通过任务管理器来看各任务(进程)占用系统资源的情况。
    的头像 发表于 11-07 11:43 606次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(4)

    基于STM32F407FreeRTOS学习笔记(5)

    在数据结构中有一种很重要的数据结构叫做队列,其特点是数据先进先出。在FreeRTOS中也有一类队列,我们利用这类队列在FreeRTOS中实现任务与任务间的消息传递,所以也可以称之为消息队列。
    的头像 发表于 11-07 11:43 377次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(5)

    基于STM32F407FreeRTOS学习笔记(7)

    本期在二进制信号量的基础上介绍计数信号量
    的头像 发表于 11-08 11:04 291次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(7)

    基于STM32F407FreeRTOS学习笔记(8)

    前面几期我们介绍过队列、二进制信号量以及计数信号量。但是在使用二进制信号量的时候会有一种优先级反转问题的出现,简而言之就是低优先级任务因为无法及时释放信号量而导致等待信号量发生的高优先级任务迟迟无法进行。
    的头像 发表于 11-08 11:07 353次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(8)

    基于STM32F407FreeRTOS学习笔记(9)

    在嵌入式编程中,定时器是一个非常重要且强大的功能,用来帮我们定时性的调用中断服务函数来帮助我们处理程序。定时器通常是用硬件来实现的,例如STM32F407就有8个硬件定时器。
    的头像 发表于 11-08 11:08 416次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(9)

    基于STM32F407FreeRTOS学习笔记(10)

    在介绍二进制信号量时曾经讲过,二进制信号量可以代替我们裸机开发中的标志位来使用。在裸机开发中我们使用标志位来表示某个事件是否发生,并且其他程序利用标记位的状态来判断程序是否可以继续进行。但是这种大量使用标记位的情况会导致代码的逻辑异常的复杂。
    的头像 发表于 11-08 11:10 333次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(10)

    基于STM32F407FreeRTOS学习笔记(11)

    在前面的学习中例如信号量、队列中经常会出现提示:在许多情况下,“任务通知”可以提供二进制信号量的轻量级替代方案。
    的头像 发表于 11-13 17:23 465次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(11)

    基于STM32F407FreeRTOS学习笔记(12)

    在上一期内容中我们简单的介绍了任务通知的几个函数以及简单的使用了任务通知来实现两个信号之间的通信。
    的头像 发表于 11-13 17:27 434次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(12)

    STM32F407时钟配置学习

    STM32F407时钟配置学习
    发表于 08-04 07:14

    如何使用STM32F407去移植FreeRTOS

    如何使用STM32F407去移植FreeRTOS呢?有哪些操作步骤?
    发表于 10-21 09:45

    STM32F407 FreeRTOS开发指南

    参考资料:正点原子《littleVGL 开发指南》正点原子《STM32F407 FreeRTOS 开发指南》硬件平台:stm32f407开发板(或最小系统)、4.3寸TFTLCD以正点原子的例程为
    发表于 01-05 06:55

    STM32F407 FreeRTOS开发手册 V1.1

    STM32F407 FreeRTOS开发手册_V1.1PDF文件下载。
    发表于 07-31 11:16 44次下载