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

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

3天内不再提示

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

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

在上一期内容中我们简单的介绍了任务通知的几个函数以及简单的使用了任务通知来实现两个信号之间的通信

本期我们将利用任务通知来模拟三种方式的任务间通信。

信号量

在我们介绍信号量的文章中介绍过,信号分为二进制信号量和计数信号量。

接着我们使用任务通知来模拟这两项功能。

二进制信号量可以看作长度为1的队列,我们不关心其值为多少,只关心它的状态。

图片

图片

在直达任务通知中我们可以用xTaskNotifyGive来模拟二进制信号量的释放以及ulTaskNotifyTake()来模拟二进制信号量的读取。

在ulTaskNotifyTake()中需要注意的是,我们需要设置一个参数用来确定我们模拟的是二进制信号量还是计数信号量。

图片

image.png

代码测试

void Mid_Task(void * pvParameters)//参数为 void * pvParameters
{
  while(1)
  {
    if(KEY_Scan(0)==1)
    {
      printf("Key_Pressrn");
      xTaskNotifyGive(High_Handler);//传入任务函数句柄,模拟信号量释放
    }
  }
    vTaskDelay(10);
}


void High_Task(void * pvParameters)
{
  BaseType_t err;
  while(1)
  {
    err = ulTaskNotifyTake(pdFALSE,10);//读取后清零,模拟二进制信号量
    if(err == pdTRUE)
    {
      printf("Recieve Message!rn");
    }
    vTaskDelay(10);
  }
}

图片

模拟二进制信号量成功。

之后,我们将接收的函数中的pdFALSE修改为pdTRUE,这样子我们就可以模拟我们的计数信号量了。

这里就不作演示了,但是要注意的是,只用这样子的模拟二进制信号量也要注意优先级反转问题,关于优先级反转的问题可以参考公众号中的关于二进制信号量的文章。

事件组

合理的运用RTOS中的事件组可以很好的处理许多事件,在事件组的介绍中我们说过,我们常用的事件组可以做到24位事件位。而在直达任务通知中,我们也同样可以指定某些位的改变来实现事件组的效果。

图片

我们可以修改xTaskNotify中的eAction来将通知值作为事件组,修改特定位来实现事件位的效果。

代码测试

void Mid_Task(void * pvParameters)//参数为 void * pvParameters
{
  int i = 0; 
  while(1)
  {
    if(KEY_Scan(0)==1)
    {
      printf("Key_Press keynumber : 1rn");
      xTaskNotify( (TaskHandle_t) High_Handler,//目标任务句柄
                   (uint32_t) 0x04,//第二位 00000100
                   (eNotifyAction) eSetBits);//位设置模式,模拟事件组
    }
    if(KEY_Scan(0)==2)
    {
      printf("Key_Press keynumber : 2rn");
      xTaskNotify( (TaskHandle_t) High_Handler,//目标任务句柄
                   (uint32_t) 0x08,//第三位  00001000
                   (eNotifyAction) eSetBits);//位设置模式,模拟事件组
    }
  }
    vTaskDelay(10);
}


void High_Task(void * pvParameters)
{
  BaseType_t err;
  uint32_t number;//存放通知值
  uint32_t Value;  //模拟事件组
  while(1)
  {
     err =  xTaskNotifyWait( (uint32_t) 0x0000,//不清理
                             (uint32_t) 0xffff,//清理当前
                             (uint32_t*) &number,//接收任务值
                             (TickType_t) 10 );//等待事件
    Value = Value | number ; //获得事件位
    if((Value&(0x08+0x04)) == (0x08+0x04))
    {
      printf("KEY1 and KEY2 have Pressedrn"); 
      Value = 0;//事件组清零
    }
    vTaskDelay(10);
  }
}

图片

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

    关注

    2

    文章

    707

    浏览量

    41250
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61349
  • 信号量
    +关注

    关注

    0

    文章

    53

    浏览量

    8257
收藏 人收藏

    评论

    相关推荐

    基于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)

    stm32f407

    请问学习stm32f407哪个视频教程比较好?
    发表于 04-03 19:06

    STM32F407时钟配置学习

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

    FreeRTOS移植到STM32F407

    FreeRTOS,接下来我们就把FreeRTOS移植到我们所使用的平台上,我们使用的板子是STM32F407。02. 预备工作要移植FreeRTOS,肯定需要一个基础工程,基础工程越
    发表于 08-24 06:07

    如何使用STM32F407去移植FreeRTOS

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

    STM32F407 FreeRTOS开发指南

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

    STM32F407标准库学习

    STM32F407标准库学习笔记-AFIO- 头文件 gpio.h#define GPIO_PinSource0((uint8_t)0x00)#define GPIO_PinSource1
    发表于 01-24 06:42

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解
    发表于 11-23 18:06 70次下载
    【<b class='flag-5'>STM32F407</b>开发板用户手册】第13章 <b class='flag-5'>STM32F407</b>启动过程详解

    STM32F407标准库学习笔记-RCC

    STM32F407标准库学习笔记-RCC- rcc.htypedef struct{ uint32_t SYSCLK_Frequency; /*!< SYSCLK clock
    发表于 11-29 15:51 13次下载
    <b class='flag-5'>STM32F407</b>标准库<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>-RCC

    STM32F407标准库学习笔记-GPIO

    STM32F407标准库学习笔记-GPIO头文件 gpio.h枚举-列举同一寄存器的不同选项typedef enum{ GPIO_Low_Speed = 0x00, /*!<
    发表于 11-29 15:51 46次下载
    <b class='flag-5'>STM32F407</b>标准库<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>-GPIO

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统
    发表于 12-02 16:21 39次下载
    【<b class='flag-5'>STM32F407</b>开发板用户手册】第14章 <b class='flag-5'>STM32F407</b>的电源,复位和时钟系统

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作
    发表于 12-04 13:36 73次下载
    【<b class='flag-5'>STM32F407</b>开发板用户手册】第1章   初学<b class='flag-5'>STM32F407</b>的准备工作

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO
    发表于 12-05 15:21 32次下载
    【<b class='flag-5'>STM32F407</b>开发板用户手册】第19章 <b class='flag-5'>STM32F407</b>的GPIO应用之按键FIFO

    stm32f407原理图

    stm32f407原理图
    发表于 07-14 16:07 169次下载

    STM32F407 FreeRTOS开发手册 V1.1

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