三十七、 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//每个任务的栈大小#define KEY1_EVENT (0x01 << 0)//设置事件掩码的位 0
#define KEY2_EVENT (0x01 << 1)//设置事件掩码的位 1static xTaskHandle LED_TaskHandle=NULL;
static xTaskHandle KEY_TaskHandle=NULL;/*************************** 宏定义 ************************************/
#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");}/*********************************************************************** @ 函数名 :  * @ 功能说明:  发送通知,代替释放信号量* @ 参数 :* @ 返回值 : 无********************************************************************/
static void LED_Task(void* parameter)
{BaseType_t xReturn=pdTRUE;u32 r_event=0;//接收事件u32 last_event=0;//保存事件while(1){/*获取一个任务通知,没有获取到一直等待 */xReturn=xTaskNotifyWait(0x0,//进入函数的时候不清除任务 bit0xFFFFF,//退出函数的时候清除所有的 bitR&r_event,//保存任务通知值portMAX_DELAY);//没获取到则一直等待/* 此函数只会返回 pdPASS */if(pdTRUE ==xReturn){last_event |= r_event;if(last_event ==(KEY1_EVENT|KEY2_EVENT) ){last_event = 0; /* 上一次的事件清零 */printf ( "Key1 与 Key2 都按下\n");Board_LED_Toggle(1);}else /* 否则就更新事件 */last_event = r_event; /* 更新上一次触发的事件 */}          //      vTaskDelay(200);}
}/*********************************************************************** @ 函数名 :   * @ 功能说明: 发送任务* @ 参数 :* @ 返回值 : 无********************************************************************/
static void KEY_Task(void* parameter)
{//  BaseType_t xReturn =pdPASS;u8 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键按下 */printf ( "KEY1 被按下\n" );/* 触发一个事件 1 */xTaskNotify( (xTaskHandle)LED_TaskHandle,(uint32_t)KEY1_EVENT, //要触发的事件(eNotifyAction)eSetBits//设置任务通知值中的位/*eNoAction = 0,通知任务而不更新其通知值。*eSetBits, 设置任务通知值中的位。* eIncrement, 增加任务的通知值。* eSetvaluewithoverwrite,覆盖当前通知* eSetValueWithoutoverwrite 不覆盖当前通知*/);Board_LED_Toggle(6);}break;case 2:{/* K2键按下 */printf ( "KEY2 被按下\n" );/* 触发一个事件 2 */xTaskNotify( (xTaskHandle)LED_TaskHandle,(uint32_t)KEY2_EVENT, //要触发的事件(eNotifyAction)eSetBits//设置任务通知值中的位/*eNoAction = 0,通知任务而不更新其通知值。*eSetBits, 设置任务通知值中的位。* eIncrement, 增加任务的通知值。* eSetvaluewithoverwrite,覆盖当前通知* eSetValueWithoutoverwrite 不覆盖当前通知*/);Board_LED_Toggle(5);}break;case 3:{/* K3键按下*/}break;default:break;}key2=0;}}
}/************************************************************************ @ 函数名  : AppTaskCreate* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面* @ 参数    : 无  * @ 返回值  : 无**********************************************************************/
static void AppTaskCreate(void)
{BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */taskENTER_CRITICAL();//进入临界区,禁止中断打断xReturn = xTaskCreate(LED_Task,"Give_Task",TASK_STACK_SIZE*4,NULL,1,&LED_TaskHandle);if (pdPASS == xReturn)printf("创建 Receive1_Task 任务成功!\r\n");xReturn = xTaskCreate(KEY_Task,"KEY_Task",TASK_STACK_SIZE*5,NULL,1,&KEY_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("车位默认值为 0 个,按下 KEY1 申请车位,每5秒自动释放1个车位 \r\n");AppTaskCreate();vTaskStartScheduler();//任务调度/* Loop forever */while (1) {printf("FreeRTOS 运行失败\n\r");}}

任务通知代替事件标志组

/* BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait );
参数:ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取反值进行按位与运算,当此参数为 Oxfffff 或者 ULONG_MAX 的时候就会将任务通知值清零。ulBits ToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将任务通知值与此参数的取反值进行按位与运算,当此参数为 0xfffff 或者 ULONG MAX 的时候就会将任务通知值清零。
pulNotification Value:此参数用来保存任务通知值。
xTickToWait:阻塞时间。
返回值: pdTRUE:获取到了任务通知。 pdFALSE:任务通知获取失败。
原型:
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction );
参数:  eNoAction = 0,通知任务而不更新其通知值。eSetBits, 设置任务通知值中的位。eIncrement, 增加任务的通知值。eSetvaluewithoverwrite,覆盖当前通知eSetValueWithoutoverwrite 不覆盖当前通知
返回:pdFAIL:当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 pdFAIL。
pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。

实验现象:
key按键任务里面,当KEY1和KEY2都按下后,LED任务打印出来。
LED任务接收。

使用函数:
发送 xTaskNotify();
接收 xTaskNotifyWait();

37 freertos任务通知-代替事件组相关推荐

  1. freeRtos学习笔记 (5)事件组

    freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...

  2. FreeRTOS任务通知 基于STM32

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

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

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

  4. 35 freertos任务通知-代替二值信号量

    三十五. freertos任务通知-代替二值信号量 /** ********************************************************************** ...

  5. 32 freertos任务通知-代替消息队列(任务邮箱)

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

  6. Qt中的消息通知和事件发送

    Qt 中的信号和槽机制.事件机制是其具有特色的两大机制.利用这两种机制可以轻松地实现需要的消息通知和事件通知. 1.信号和槽机制 充分使用 Qt 库中已经定义和实现好的对象的信号和槽函数,如按钮的 c ...

  7. FreeRTOS任务通知

    从v8.2.0版本开始,FreeRTOS新增了任务通知这个功能,可以使用任务通知来代替信号量.消息队列.事件标志组等这些东西,使用任务通知的话效率会更高. 任务通知在FreeRTOS是一个可选的选项, ...

  8. 1、野火freertos学习笔记

    野火freertos学习笔记 1.任务 1.1 栈 1.2 任务的切换 taskYIELD(); 1.3 临界段 2.空闲任务 3.任务优先级 4.任务延时的表现 5.时间片 5.1抢占式.协做式 6 ...

  9. 【ESP32+freeRTOS学习笔记-开篇前言】

    目录 前言的前言 RTOS的选择 开发与实践环境 参考资料 笔记的形式 专题文章的链接(持续更新中......) 前言的前言 单片机的开发,也有两年多了,之前一直是做一些简单应用,因此以裸机开发的方式 ...

最新文章

  1. JAVA——HttpClient封装工具类
  2. 表格行内编辑增删改查
  3. Vue项目目录结构注解附assets与static目录的区别
  4. vlf 用法_什么是SQL虚拟日志文件(又名SQL Server VLF)?
  5. Clos Network
  6. linux两个进程相同的地址,在虚拟内存中,两个不同的进程可以具有相同的地址吗?...
  7. Jzoj3902 游戏
  8. 2015年3月计算机二级vb题库,2015年计算机二级vb机试试题
  9. NMAP 端口扫描工具下载 + 安装
  10. python爬取起点中文网小说_爬虫实战——起点中文网小说的爬取
  11. 7张图告诉你成功者与失败者的行为差别
  12. xp系统从u盘启动计算机,联想xp系统如何设置U盘启动_联想xp通过bios设置U盘启动的步骤...
  13. matlab冲激函数的傅里叶变换,利用MATLAB对正弦,矩形脉冲函数进行傅里叶变换
  14. 2020.8.8List、Set集合练习
  15. 滴滴笔试毕业旅行——回溯法(dfs)
  16. CTF pyc之stegosaurus隐写
  17. 在线IP到地理位置解析的API接口,IP到地理位置、所属组织名、AS号、域名反查
  18. 玩转iOSARkit以及3D模型
  19. 极化码:基于单项式码的极化码部分序(Partial Order)表示
  20. es+ik+kibana的简单使用

热门文章

  1. 如何修改Word页面的显示大小
  2. 在Excel中画条形图和折线图的二组合图!
  3. C/C++ 通过域名获取服务器真实IP地址
  4. js 16进制字符串 转 ArrayBuffer
  5. 【ABP框架系列学习】模块系统之插件示例开发
  6. 【AD小知识】阻焊层和助焊层的区别
  7. 《安富莱嵌入式周报》第260期:2022.04.04--2022.04.10
  8. 【眼动仪】Tobii 卸载问题
  9. Android电话拨打流程源码分析
  10. ubuntu下安装摄像头