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

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

3天内不再提示

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

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

在数据结构中有一种很重要的数据结构叫做队列,其特点是数据先进先出。在FreeRTOS中也有一类队列,我们利用这类队列在FreeRTOS中实现任务与任务间的消息传递,所以也可以称之为消息队列。

队列是任务间通信的主要形式。它们可以用于在任务之间以及中断和任务之间发送消息。在大多数情况下,它们作为线程安全的 FIFO(先进先出)缓冲区使用,新数据被发送到队列的后面, 尽管数据也可以发送到前面。(拷贝自FreeRTOS开发者文档)

图片

队列通过这样子的结构在任务间单方向传递消息。

在FreeRTOS的API引用文档中我们可以看到队列的控制函数。

图片

我们在文档中找到队列创建函数(动态)

图片

首先我们需要在程序中包含入queue.h文件才能使用队列。

其次和之前几期的操作一样,我们需要在FreeRTOSConfig.h文件中需要配置相对应的宏以激活该创建队列的构造函数。

xQueueCreate的参数有两个,首先是uxQueueLength队列可同时容纳的最大项目数简而言之也就是:这个队列有多长。

其次是uxItemSize,顾名思义是每一个项目(每个小块块)能存储多少数据(字节)

最后要强调的是,这个函数的返回值是QueueHandle_t,即以句柄的形式返回,因此我们创建任务的时候也需要以句柄变量接收其返回值。

图片
图片

我们在启动函数中加入我们创建队列的函数,其长度为1,每个项目的大小为一个字节。

图片

我们接着在API引用文档中找到关于队列发送的函数(如上)。

发送的函数平平无奇,但是有几点需要注意;

首先是发布项目按副本排队而不是引用指针,指的是我们传入的数据是先拷贝的临时变量传入,而并非我们传入数据的地址,我想这样子是为了避免在接收端时对数据进行修改导致错误。

其次是该函数不能在中断函数中调用(有专门的函数是在中断中发布项目的)

函数参数中的第三项xTicksWait简单的理解就是可等待的最大时间,我们如果我们的队列已满则尝试等待,超过一定周期认为超时则项目发布失败。

我们在按钮检测任务中编写:按下按钮2时向队列中放入字符p(p初始值为‘a’),每按下这个按钮,p的值递增。

还有一个按钮3,按下按钮3则在队列中读取一则消息,并打印出来。

void Get_info(void * pvParameters)
{
  unsigned char p = 'a';
    unsigned char r;
  while(1)
  {

    unsigned char key = KEY_Scan(0);
    BaseType_t err;
    if(key==1)
    {
      memset(informationbuff,0,400);
      vTaskGetRunTimeStats(informationbuff);
      printf("%srn",informationbuff);
    }

    if(key==2)
    {
      printf("Key_2 Pressrn");
      if(KeyNumberHandler!=NULL)//队列句柄有效
      {

        err = xQueueSend(KeyNumberHandler,&p,10);
        p++;
        if(err!=pdTRUE)
        {
          printf("Send Fail rn");

        }
        else
        {
          printf("Send %c Successrn",p);

        }

      }
    }
    if(key==3)
    {
      printf("Key 3 Pressrn");
      if(KeyNumberHandler!=NULL)//队列句柄有效
      {

        xQueueReceive(KeyNumberHandler,&r,10);
        printf("Queue Receive:%c rn",r);
        r = '�';//清空
      }
    }
    vTaskDelay(10);
  }
}

我们在按钮检测任务中加入按钮2和按钮3的情况,并且定义了一个变量err来检测我们的队列是否添加成功,我们观察串口并看看打印情况。

可以看到,我们按下按钮2,成功将 ‘b’ 消息送入队列(我们是先p++再送入队列的)

图片

我们再继续按下按钮2,由于队列的长度为1,且队列的项目并没有出队列,因此串口会提示送入队列失败。

图片

此时p等于 ' c ',我们按下按钮3,让数据出队列,并且再按下一次按钮3读取是否有数据。

图片

可以看到,读取队列之后队列的内容将被释放,后续的内容将前进。之后我们再按下按钮2 ,此时就可以向队列中送入数据(我多按了一下)。

图片

除此之外,FreeRTOS中还有一个函数为xQueueOverwrite,传入参数除了没有阻塞时间之外和xQueueSend一样,它的作用为将消息送入队列,如果没有空间则覆盖最后一个空间,我们将按钮2中的函数换为该函数再试试。

图片

我们每次送入队列都成功,因为它会把队列的最后一个项目覆盖掉。

关于队列的介绍就到此啦,具体的API可以上FreeRTOS的官网查看参考文档。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • fifo
    +关注

    关注

    3

    文章

    369

    浏览量

    43069
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61349
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39900
  • 队列
    +关注

    关注

    1

    文章

    46

    浏览量

    10849
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    28985
收藏 人收藏

    评论

    相关推荐

    基于STM32F407FreeRTOS学习笔记(1)

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

    基于STM32F407FreeRTOS学习笔记(6)

    信号量(Semaphore)也被称为信号灯。有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量(来自百度百科)
    的头像 发表于 11-08 11:00 365次阅读
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(6)

    基于STM32F407FreeRTOS学习笔记(7)

    本期在二进制信号量的基础上介绍计数信号量
    的头像 发表于 11-08 11:04 293次阅读
    基于<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 354次阅读
    基于<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 419次阅读
    基于<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 335次阅读
    基于<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 467次阅读
    基于<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 435次阅读
    基于<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次下载