FreeRTOS之事件

2023-11-14

FreeRTOS之事件

声明:本人按照正点原子的FreeRTOS例程进行学习的,欢迎各位大佬指责和批评,谢谢!

一、事件定义

事件(事件集),与高数上的集合意义差不多,事件啊~~~其实是实现任务间通信的机制,主要用于实现多任务间的同步,但是事件类型通信只能是事件类型的通信没有数据传输

  1. 可以实现一对多,多对多的同步。
  2. 一个任务可以等待多个事件的发生。
  3. 任意一个事件发生时唤醒任务进行事件处理。
  4. 可以几个事件都发生后,再唤醒任务进行事件处理。
  5. 也可以是多个任务同步多个事件。
    而信号量却不一样,只能一对一的任务之间的同步。

举个例子:

此时事件组里有(事件1,事件2,事件3,事件4,···)

(事件1 & 事件2 & 事件3),其中全部事件发生了,才进行事件的处理
(事件1 | 事件2 | 事件3),其中一个事件发生了,才进行事件的处理

事件组存放在32位的EventBits_t类型中的变量中,其中低24个位用来实现事件标志组。每一位代表一个事件。任务是通过“逻辑与”或“逻辑或”建立关联的。

二、事件的特点

  1. 事件无排队性,也就是多次向多任务设置同一事件(如果任务还未来得及读取),等效于只设置一次
  2. 允许多个任务对同一事件进行读写操作
  3. 支持事件等待超时机制
  4. 在FreeRTOS中不要用全局变量,尽量使用API

三、事件控制宏定义

  1. 如果宏 configUSE_16_BIT_TICKS定义为1,那么变量uxEventBits就是16位的,其中有8个位用来存储事件组。
  2. 如果宏 configUSE_16_BIT_TICKS定义为0,那么变量uxEventBits就是32位的,其中有24个位用来存储事件组。

四、FreeRTOS是不允许不确定的操作在中断和临界段中发生的。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "beep.h"

#include "FreeRTOS.h"
#include "task.h"               //任务的
#include "queue.h"              //内存池的
#include "malloc.h"             //队列的
#include "semphr.h"             //信号量
#include "event_groups.h"       //事件组


#define START_TASK_PRIO             1           //任务优先级
#define START_STK_SIZE              256         //任务堆栈大小
TaskHandle_t StartTask_Handler;                 //任务句柄
void start_task(void *pvParameters);            //任务函数

#define LED_TASK_PRIO               2           //任务优先级
#define LED_STK_SIZE                128         //任务堆栈大小
TaskHandle_t LedTask_Handler;                   //任务句柄
void led_task(void *pvParameters);              //任务函数

#define TASK1_TASK_PRIO             3           //任务优先级
#define TASK1_STK_SIZE              256         //任务堆栈大小
TaskHandle_t Task1Task_Handler;                 //任务句柄
void task1_task(void *pvParameters);            //任务函数

#define TASK2_TASK_PRIO             4           //任务优先级
#define TASK2_STK_SIZE              128         //任务堆栈大小
TaskHandle_t Task2Task_Handler;                 //任务句柄
void task2_task(void *pvParameters);            //任务函数

/*事件的句柄*/
static EventGroupHandle_t Event_Handler = NULL;

#define EVENT1 (0x01 << 1)
#define EVENT2 (0x02 << 2)

//LCD刷屏时使用的颜色
int lcd_discolor[14] = {  WHITE, BLACK, BLUE,  BRED,
                          GRED,  GBLUE, RED,   MAGENTA,
                          GREEN, CYAN,  YELLOW, BROWN,
                          BRRED, GRAY
                       };

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
    delay_init(168);                    //初始化延时函数
    uart_init(115200);                  //初始化串口

    LED_Init();                         //初始化LED端口
    KEY_Init();
    BEEP_Init();
    LCD_Init();                         //初始化LCD
    my_mem_init(SRAMIN);                //初始化内存池


    POINT_COLOR = RED;
    LCD_ShowString(30, 10, 200, 16, 16, "ATK STM32F407");
    LCD_ShowString(30, 30, 200, 16, 16, "FreeRTOS 测试");
    LCD_ShowString(30, 50, 200, 16, 16, "任务状态查询");

    //创建开始任务
    xTaskCreate((TaskFunction_t)start_task,             //任务函数
                (const char *)"start_task",             //任务名称
                (uint16_t)START_STK_SIZE,               //任务堆栈大小
                (void *)NULL,                           //传递给任务函数的参数
                (UBaseType_t)START_TASK_PRIO,           //任务优先级
                (TaskHandle_t *)&StartTask_Handler);    //任务句柄
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区

    //创建事件
    Event_Handler = xEventGroupCreate();

    if (Event_Handler != NULL)
        printf("创建事假成功\r\n\n");

    //创建LED任务
    xTaskCreate((TaskFunction_t)led_task,
                (const char *)"led_task",
                (uint16_t)LED_STK_SIZE,
                (void *)NULL,
                (UBaseType_t)LED_TASK_PRIO,
                (TaskHandle_t *)&LedTask_Handler);
    printf("led0任务函数创建成功\r\n");

    //创建TASK1任务
    xTaskCreate((TaskFunction_t)task1_task,
                (const char *)"task1_task",
                (uint16_t)TASK1_STK_SIZE,
                (void *)NULL,
                (UBaseType_t)TASK1_TASK_PRIO,
                (TaskHandle_t *)&Task1Task_Handler);
    printf("task1任务函数创建成功\r\n");

    //创建TASK2任务
    xTaskCreate((TaskFunction_t)task2_task,
                (const char *)"task2_task",
                (uint16_t)TASK2_STK_SIZE,
                (void *)NULL,
                (UBaseType_t)TASK2_TASK_PRIO,
                (TaskHandle_t *)&Task2Task_Handler);
    printf("task2任务函数创建成功\r\n");

    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//led0任务函数,低优先级
void led_task(void *pvParameters)
{
    while (1)
    {
        LED0 = ! LED0;
        vTaskDelay(300);
    }
}
//task1任务函数,中优先级
void task1_task(void *pvParameters)
{
    EventBits_t r_event = pdPASS;
    while (1)
    {
        r_event = xEventGroupWaitBits(Event_Handler,      //事件的句柄
                            EVENT1 | EVENT2,    //感兴趣的事件
                            pdTRUE,             //退出时是否清除事件位
                            pdTRUE,             //是否满足所有事件
                            portMAX_DELAY);     //超时时间,一直等所有事件都满足
        if(((EVENT1|EVENT2) & r_event) == (EVENT1|EVENT2))
            printf("KEY1和KEY2都按下\r\n");
        else
            printf("事件错误\r\n");
        
    }
}
//task2任务函数,高优先级
void task2_task(void *pvParameters)
{
    EventBits_t r_event = pdPASS;
    while (1)
    {
        if(KEY_Scan(1)==KEY1_PRES)
        {
            xEventGroupSetBits(Event_Handler,EVENT1);
            
            if(r_event == pdTRUE)
              printf("KEY1按下,设置事件1\r\n");  
            
        }else if(KEY_Scan(1)==KEY2_PRES)
        {
            xEventGroupSetBits(Event_Handler,EVENT2);
            
            if(r_event == pdTRUE)
              printf("KEY2按下,设置事件2\r\n"); 
            
        }
        
        vTaskDelay(20);
    }
}

下面在串口调试助手上查看结果:
在这里插入图片描述
结束

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS之事件 的相关文章

  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • C++ freeRTOS任务,非静态成员函数的无效使用

    哪里有问题 void MyClass task void pvParameter while 1 this gt update void MyClass startTask xTaskCreate this gt task Task 204
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • Qt Creator + github copilot配置教程:AI编程新体验

    文章目录 前言 一 环境介绍 二 Copilot配置 1 安装nodejs 2 源码下载 方法a 代码克隆 方法b 直接下载源码包 3 路径配置 4 github copilot开通 三 安装Qt Creator 1 安装包下载 2 安装目
  • 五款实用的微信小程序(免费证件照)

    在这里给大家推荐几个平时常用的微信小程序 真心方便实用 绝对不是打广告 小米云证件照 目前很多证件照APP不是要收费 就是里面内置了许多广告 体验不佳 小米云证件照可以用三个词概况 免费 干净 无广告 懂的自然懂 扫描全能王 老牌的扫描工具
  • docker基础:联合文件系统

    首先docker的镜像是由一层一层的文件系统组成的 不同 Docker 容器就可以共享一些基础的文件系统层 同时再加上自己独有的改动层 大大提高了存储的效率 这个基础是联合文件系统 联合文件系统 UnionFS 是一种分层 轻量级并且高性能
  • 修改host方法

    打开路径 C Windows System32 drivers etc 将hosts文件拷贝出来修改之后放回去覆盖即可 想得到ip可以先ping一下那个域名 以下是一个例子 左边是ip 右边是域名 不用加 223 6 248 220 www
  • vue3+Element-plus el-select 下拉表格组件(2023-08-21 解决TSelectTable组件表单编辑回显设置defaultSelectVal 无效)

    2023 08 21 解决TSelectTable组件表单编辑回显设置defaultSelectVal 无效 2023 06 28 TSelectTable组件新增查询条件 效果如下 一 最终效果 二 代码示例
  • 【故障处理】EXP-00091 Exporting questionable statistics

    数据库平台 soalris10 数据库版本 9i 日期 2013 2 19 项目 关键字 1 Exp 00091 2 Exp 问题 使用exp导出时 出现错误 分析 oracle10g oerr exp 00091 00091 00000
  • Python报错No module named 'cv2'

    import cv2 Python运行过程中报错No module named cv2 Traceback most recent call last File Users congjam PycharmProjects Jam Test
  • python uwsgi_Python/WSGI应用快速入门

    Python WSGI应用快速入门 这个快速入门将会告诉你如何部署简单的WSGI应用和常见的web框架 这里 Python指的是CPython 对于PyPy 你需要使用特定的插件 PyPy插件 Jython支持正在开发中 注解 要遵循此快速
  • mysql表分区

    1 分表与表分区的区别 1 1 关于分表 分表是将一个大表分为几个或是多个小表 例如 table 1每天有1Kw的数据量 table 1随便时间的增长会越来越大 最终达到mysql表的极限 在这种比较极端的情况下 我们可以考虑对table
  • Android 路由框架ARouter源码解析

    作者 小马快跑 我们知道在使用ARouter时 需要在build config里配置 annotationProcessor com alibaba arouter compiler 1 2 2 并且知道annotationProcesso
  • freetype_4_使用freetype显示多行文字

    freetype 4 使用freetype显示多行文字 从左往右显示 1 先描绘一行文字 2 取出该行文字的最大高度 以此为基准算出下一行的位置 3 再描绘另一行文字 根据上一篇文章中代码修改主函数部分 int main int argv
  • Python自动化刷投票脚本开发,微信投票再也不需要发红包了

    前言 现在部分比赛为了推广赞助商或者比赛本身 需要参赛队伍进行网上拉票 甚至票数还会占一定比例的成绩 因此 刷票也就应运而生了 此次我们团队参加一个比赛 就需要网上投票决出前几名 作为一位技术人员 当然是得 解决 技术能解决的问题嘛 所以就
  • python-pymysql常用功能封装

    目录 简介 代码 测试 参考 简介 pymysql是一个客户端 本文进行一个简单封装 主要是结构化和批量操作 代码 import pymysql class MysqlCli def init self host user password
  • 《矩阵计算》chapter 01 在 Octave 中整理运行示例算法

    Algo1 算法1 1 1 点积 mc 1 1 1 algo dot product m function c mc 1 1 1 algo dot product x y c 0 for i 1 size x 1 c x i y i end
  • mybatis 查询数据表

    mybatis查询数据表 1 mybatis的环境搭建 2 创建实体类和dao的接口 2 1 实体类中的属性和数据库表的字段名称保持一致 3 创建Mybatis的主配置文件SqlMapConifg xml 4 创建配置文件IUserDao
  • 王者服务器维护8月25,王者荣耀8月25日英雄调整有哪些 8月25日英雄调整内容汇总...

    王者荣耀v1 20 1 37 安卓最新官方版 类型 角色扮演大小 471M语言 中文 评分 7 7 标签 立即下载 王者荣耀8月25日英雄调整内容汇总一览 王者荣耀体验服8月25日进行维护更新 一大波英雄技能都有很大的调整 宫本武藏又又又被
  • Kubernetes—minikube安装(笔记)

    minikube是本地的Kubernetes 致力于使Kubernetes易于学习和开发 安装过程来自官网 https minikube sigs k8s io docs start 安装kubectl 安装 curl LO https d
  • typora免费安装版教程,支持Windows、Mac、Linux

    大家好 我是可乐 本篇文章为大家介绍 Typora快捷键 Typora免费安装教程 Typora是一款简单易用的Markdown编辑器 目前 Typora 官方是不提供免费版下载了 需要一次性购买版权 支持正版的可以直接前往官网购买 89
  • STM32上使用JSON

    一 STM32工程中添加JSON 最近在一网2串项目 串口和网口之间可能需要定义一下简单的通信协议 而通信协议上则需要去定义一下通信的数据格式 上次听剑锋说要用Json来定义 目前查了下资料具体如何去应用还不 会 因为最新的KEIL上支持J
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型