三十二、freertos任务通知-代替消息队列(任务邮箱)

/**
**************************************************************************************************/
#include <stdio.h>
#include <limits.h>//标准C库文件,定义了各种类型的范围
#include "board.h"
#include "led.h"
#include "key.h"
#include "uart.h"
//#include "tim_mrt.h"/*** System oscillator rate and clock rate on the CLKIN pin  ****/
/**/const uint32_t OscRateIn = MAIN_OSC_XTAL_FREQ_HZ;       /**/
/**/const uint32_t ExtRateIn = EXT_CLOCK_IN_FREQ_HZ;        /**///系统复位
#define System_restart  (LPC_SWM->PINENABLE0 = 0xffffffffUL) /**/
/**********************End**************************************/#include "FreeRTOSConfig.h"
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"//事件头文件
#include "queue.h"//队列头文件
#include "semphr.h"//信号量头文件
#include "timers.h"//软件定时器头文件#define TASK_STACK_SIZE 32//每个任务的栈大小
/**************************** 任务句柄 ********************************/static xTaskHandle Receive1_TaskHandle=NULL;
static xTaskHandle Receive2_TaskHandle=NULL;
static xTaskHandle Send_TaskHandle=NULL;//static xTimerHandle Timer_Handle[2]={NULL};
//static void vTimer_BackCall(void* parameter);
//static u32 Tim1_count=0,Tim2_count=0;/*************************** 宏定义 ************************************/
#define USE_CHAR 0 /* 测试字符串的时候配置为 1 ,测试变量配置为 0 *//* Sets up system hardware
*********************************************************************** @ 函数名  : BSP_Init* @ 功能说明: 板级外设初始化,所有板子上的初始化均可放在这个函数里面* @ 参数    :   * @ 返回值  : 无*********************************************************************/static void prvSetupHardware(void){SystemCoreClockUpdate();DEBUGINIT();led_Init() ;    Key_INIT();//   MRT_Init();DEBUGOUT("%u MHz\n",SystemCoreClock/1000000);Board_UARTPutSTR("build date: " __DATE__ " build time: " __TIME__ "\n");}/*********************************************************************** @ 函数名 : Receive1_Task* @ 功能说明: Receive1_Task 任务主体* @ 参数 :* @ 返回值 : 无********************************************************************/static void Receive1_Task(void* parameter){BaseType_t xReturn=pdTRUE;#if USE_CHARchar* r_char;#else uint32_t r_num;#endifwhile(1){//                xTaskNotifyWait//获取任务通知,没获取到就一直等待xReturn=xTaskNotifyWait(0x0, //进入函数的时候不清除任务 bitULONG_MAX, //退出函数的时候清除所有的 bit#if USE_CHAR(uint32_t*)&r_char,//保存任务通知值#else&r_num,//保存任务通知值#endifportMAX_DELAY);//阻塞时间if(pdTRUE ==xReturn){#if USE_CHARprintf("Receive1 的任务通知为 %s \n",r_char);#else printf("Receive1 的任务通知为 %d \n",r_num);#endif           Board_LED_Toggle(0);}}}/*********************************************************************** @ 函数名 : Receive2_Task* @ 功能说明: Receive2_Task 任务主体* @ 参数 :* @ 返回值 : 无********************************************************************/static void Receive2_Task(void* parameter){BaseType_t xReturn=pdTRUE;#if USE_CHARchar* r_char;#else uint32_t r_num;#endifwhile(1){//获取任务通知,没获取到就一直等待xReturn=xTaskNotifyWait(0x0, //进入函数的时候不清除任务 bitULONG_MAX, //退出函数的时候清除所有的 bit#if USE_CHAR(uint32_t*)&r_char,//保存任务通知值#else&r_num,//保存任务通知值#endifportMAX_DELAY);//阻塞时间if(pdTRUE ==xReturn){#if USE_CHARprintf("Receive2 的任务通知为 %s \n",r_char);#else printf("Receive2 的任务通知为 %d \n",r_num);#endif          Board_LED_Toggle(1);}}}/*********************************************************************** @ 函数名 :  Send_Task* @ 功能说明: 发送任务* @ 参数 :* @ 返回值 : 无********************************************************************/static void Send_Task(void* parameter){BaseType_t xReturn =pdPASS;#if USE_CHARchar test_str1[]="消息1";char test_str2[]="消息2";#elseu32 send1 =1;u32 send2 =2;
#endifu8 key2=0;while(1){u8 key=0;if(Scan_Key())vTaskDelay(20);else continue;if(!Scan_Key())continue;else{key=Scan_Key();key2=key;}while(Scan_Key()){};//等按键抬起if(key2){switch(key2){case 1:{/* K1键按下 */xReturn=xTaskNotify(Receive1_TaskHandle,/*任务句柄*/
#if USE_CHAR(u32)&test_str1,/*发送的数据最大4字节*/#elsesend1,/*发送的数据最大4字节*/
#endifeSetValueWithOverwrite);//覆盖当前通知if ( xReturn == pdPASS )printf("Receive1_Task_Handle 任务通知释放成功!\r\n");}break;case 2:{/* K2键按下 */xReturn=xTaskNotify(Receive2_TaskHandle,/*任务句柄*/
#if USE_CHAR(u32)&test_str2,/*发送的数据最大4字节*/#elsesend2,/*发送的数据最大4字节*/
#endifeSetValueWithOverwrite);//覆盖当前通知/* 此函数只会返回 pdPASS */if ( xReturn == pdPASS ){printf("Receive2_Task_Handle 任务通知释放成功! \r\n");}}break;case 3:{/* K3键按下*/}break;default:break;}key2=0;}}
}/************************************************************************ @ 函数名  : AppTaskCreate* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面* @ 参数    : 无  * @ 返回值  : 无**********************************************************************/static void AppTaskCreate(void){BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */taskENTER_CRITICAL();//进入临界区,禁止中断打断xReturn = xTaskCreate(Receive1_Task,"Receive1_Task",TASK_STACK_SIZE*4,NULL,2,&Receive1_TaskHandle);if (pdPASS == xReturn)printf("创建 Receive1_Task 任务成功!\r\n");xReturn = xTaskCreate(Receive2_Task,"Receive2_Task",TASK_STACK_SIZE*4,NULL,2,&Receive2_TaskHandle);if (pdPASS == xReturn)printf("创建 Receive2_Task 任务成功!\r\n");xReturn = xTaskCreate(Send_Task,"Send_Task",TASK_STACK_SIZE*4,NULL,1,&Send_TaskHandle);if (pdPASS == xReturn)printf("创建 Send_Task 任务成功!\r\n");taskEXIT_CRITICAL(); //退出临界区  }/*** @brief   main routine for blinky example* @return   Function should not exit.*/int main(void){prvSetupHardware();Board_UARTPutSTR("LPC824 FreeRTOS 任务代替消息队列(任务邮箱)\n");printf("按下 KEY1 或者 KEY2 向任务发送消息通知 \r\n");AppTaskCreate();vTaskStartScheduler();//任务调度/* Loop forever */while (1) {printf("FreeRTOS 运行失败\n\r");}}

任务通知代替消息队列。
实验现象:
key1按下发送消息通知给任务1,任务1收到通知后打印出来,改变LED1状态。
key2按下发送消息通知给任务2,任务2收到通知后打印出来,改变LED2状态。
使用函数:
发送 xTaskNotify();
接收 xTaskNotifyWait();

32 freertos任务通知-代替消息队列(任务邮箱)相关推荐

  1. 34 freertos任务通知--代替消息队列(任务邮箱)覆盖和非覆盖

    三十四. freertos任务通知–代替消息队列(任务邮箱)覆盖和非覆盖 /** *********************************************************** ...

  2. C语言 串口通知消息,编程模式·观察者模式、事件通知、消息队列三者区别

    观察者模式.事件通知.消息队列三者有类似,都有回调函数注册,通知调用的设计,容易混淆. 简述和区别 观察者模式:被观察对象状态改变,所有观察它的对象得到通知.也称订阅模式,英文Observer. 被观 ...

  3. 智能家居DIY连载教程(2)——在实际项目中运用消息队列与邮箱

    前言 千呼万唤始出来,智能家居 DIY 教程连载第二篇终于登场了!本文将重点给大家介绍如何将消息队列与邮箱运用到实际项目中去.一起来看看吧~ DIY 回顾上期: 1.智能家居DIY连载教程(1)--如 ...

  4. FreeRTOS任务通知 基于STM32

    文章目录 一.任务通知简介 二.任务通知的运作机制 三.任务通知的函数接口讲解 1. xTaskGenericNotify() 2.xTaskNotifyGive() 3.vTaskNotifyGiv ...

  5. FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列, 但是在FreeRTOS中任务间的通讯还有信号量,邮箱,事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 ..增 ...

  6. FreeRTOS — 消息队列

    以下内容转载自安富莱电子:http://forum.armfly.com/forum.php FreeRTOS 的一个重要的通信机制----消息队列,消息队列在实际项目中应用较多. 1.消息队列 1. ...

  7. ESP32使用freeRTOS的消息队列

    零. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对 ...

  8. 高并发架构系列:如何从0到1设计一个MQ消息队列

    消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...

  9. 消息队列—简介以及使用场景

    一. RabbitMQ 简介 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链 ...

最新文章

  1. Photoshop图层混合模式计算公式大全
  2. HTML知识点梳理1
  3. 太原工业学院单片机课程设计_我系举办2014年单片机应用技能竞赛开幕式
  4. Dijkstra算法——计算一个点到其他所有点的最短路径的算法
  5. IDEA 修改JavaWeb的访问路径
  6. linux推出超级用户_linux添加root权限用户
  7. java jdbc 链接pg_Java使用JDBC连接postgresql数据库示例
  8. c++ 23种设计模式_如何用一句话总结23种设计模式
  9. 10个大数据思维原理,你了解多少?
  10. Vue3加载本地assets图片
  11. 花音机器人_氧叔在“难红难在哪儿”系列中分析曾黎时提到:
  12. 雷电模拟器使用adb命令(采坑)
  13. hpe 服务器 稳定性6,将NAA ID与运行ESXi 6.7的HPE服务器上的物理驱动器托架位置相关联...
  14. day3-转自金角大王
  15. 数学之美笔录(1):统计语言模型
  16. matlab实现加减乘除、乘方、开平方、带括号和结果分析的GUI计算器
  17. 实现 RSA 算法之改进和优化(第三章)(老物)
  18. iOS一行代码让你的应用中UIScrollView的滑动与侧滑返回并存
  19. 杰理之配置工具说明【篇】
  20. AjaxPro.NET使用,方便的在客户端直接调用服务端方法

热门文章

  1. 我眼中的OpenTracing
  2. 51单片机-DS18B20单片
  3. 产品分析必看!抖音App产品及竞品分析(快手)报告(最完善的商业分析、资料截止2019年5月)
  4. 如何修改Word文档里面的显示比例
  5. python做流程管理平台_[译] Airflow: 一个工作流程管理平台
  6. 雪碧你变了!喝了20多年的雪碧不仅换包装了,连logo也换了
  7. intel 性能监控计数器PMC寄存器详解
  8. 浮点数与4个字节的转换
  9. Miracast开发4——-应用层rtsp协议
  10. pythongame安装_Python下安装Pygame包,制作自己的游戏