Hi3861 OpenHarmony嵌入式应用入门--LiteOS Event

news2024/12/26 11:44:57

CMSIS 2.0接口使用事件标志是实时操作系统(RTOS)中一种重要的同步机制。事件标志是一种轻量级的同步原语,用于任务间或中断服务程序(ISR)之间的通信。 每个事件标志对象可以包含多个标志位,通常最多为31个(因为第31位通常保留)。

注意事项

在使用事件标志时,需要注意避免竞态条件,确保在多任务环境中正确同步。

osEventFlagsWait函数支持超时机制,可以根据需要设置合适的超时时间。

可以在中断服务程序(ISR)中安全地调用与事件标志相关的函数,但需要注意中断嵌套和优先级问题。

通过CMSIS 2.0接口的事件标志功能,开发人员可以更加灵活地实现任务间的同步和通信,提高系统的效率和稳定性。

EventFlags API分析

osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)

描述:

osEventFlagsNew函数创建了一个新的事件标志对象,用于跨线程发送事件,并返回事件标志对象标识符的指针,或者在出现错误时返回NULL。可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。

注意 :不能在中断服务调用该函数。

参数:

参数名

描述

attr

事件标志属性;空:默认值.

uint32_t osEventFlagsSet(osEventFlagsId_t ef_id,uint32_t flags)

描述:

osEventFlagsSet函数在一个由参数ef_id指定的事件标记对象中设置由参数flags指定的事件标记。

注意 :不能在中断服务调用该函数。

参数:

参数名

描述

ef_id

事件标志由osEventFlagsNew获得的ID 。

flags

指定设置的标志。

uint32_t osEventFlagsWait(osEventFlagsId_t ef_id,uint32_t flags,uint32_t options,uint32_t timeout)

描述:

osEventFlagsWait函数挂起当前运行线程,直到设置了由参数ef_id指定的事件对象中的任何或所有由参数flags指定的事件标志。当这些事件标志被设置,函数立即返回。否则,线程将被置于阻塞状态。

注意 :如果参数timeout设置为0,可以从中断服务例程调用。

参数:

参数名

描述

ef_id

事件标志由osEventFlagsNew获得的ID。

flags

指定要等待的标志。

options

指定标记选项。

timeout

超时时间,0表示不超时。

代码编写

修改D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#    http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. 

import("//build/lite/config/component/lite_component.gni")

lite_component("demo") {
  features = [
    #"base_00_helloworld:base_helloworld_example",
    #"base_01_led:base_led_example",
    #"base_02_loopkey:base_loopkey_example",
    #"base_03_irqkey:base_irqkey_example",
    #"base_04_adc:base_adc_example",
    #"base_05_pwm:base_pwm_example",
    #"base_06_ssd1306:base_ssd1306_example",
    #"kernel_01_task:kernel_task_example",
    #"kernel_02_timer:kernel_timer_example",
    "kernel_03_event:kernel_event_example",
  ]
}

创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_03_event文件夹

文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_03_event\kernel_event_example.c文件D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_03_event\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. 

static_library("kernel_event_example") {
    sources = [
        "kernel_event_example.c",
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/kal/cmsis",

    ]
}
/*
 * Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

osThreadId_t Task1_ID; //  任务1 ID
osThreadId_t Task2_ID; //  任务2 ID
osEventFlagsId_t event_ID;  // 事件 ID
uint32_t event1_Flags = 0x00000001U;  // 事件掩码 每一位代表一个事件
uint32_t event2_Flags = 0x00000002U;  // 事件掩码 每一位代表一个事件
uint32_t event3_Flags = 0x00000004U;  // 事件掩码 每一位代表一个事件
#define TASK_STACK_SIZE 1024
#define TASK_DELAY_TIME 1 // s

/**
 * 注意: 任务延时不能使用osDelay,这个函数延时有问题
 */

/**
 * @description: 任务1 用于发送事件
 * @param {*}
 * @return {*}
 */
void Task1(void)
{
    while (1) {
        printf("enter Task 1.......\n");
        osEventFlagsSet(event_ID, event1_Flags);        // 设置事件标记
        printf("send eventFlag1.......\n");
        sleep(TASK_DELAY_TIME); // 1秒
        osEventFlagsSet(event_ID, event2_Flags);        // 设置事件标记
        printf("send eventFlag2.......\n");
        sleep(TASK_DELAY_TIME); // 1秒
        osEventFlagsSet(event_ID, event3_Flags);        // 设置事件标记
        printf("send eventFlag3.......\n");
        sleep(TASK_DELAY_TIME); // 1秒
    }
}
/**
 * @description: 任务2 用于接受事件
 * @param {*}
 * @return {*}
 */
void Task2(void)
{
    uint32_t flags = 0;
    while (1) {
        // 永远等待事件标记触发,当接收到 event1_Flags 和 event2_Flags 和 event3_Flags时才会执行printf函数
        // osFlagsWaitAll :全部事件标志位接收到    osFlagsWaitAny: 任意一个事件标志位接收到
        // 当只有一个事件的时候,事件的类型选择哪个都可以
        flags = osEventFlagsWait(event_ID,  event1_Flags | event2_Flags | event3_Flags, osFlagsWaitAll, osWaitForever);
        printf("receive event is OK\n");        // 事件已经标记
    }
}
/**
 * @description: 初始化并创建任务
 * @param {*}
 * @return {*}
 */
static void kernel_event_example(void)
{
    printf("Enter kernel_event_example()!\n");

    event_ID = osEventFlagsNew(NULL);       // 创建事件
    if (event_ID != NULL) {
        printf("ID = %d, Create event_ID is OK!\n", event_ID);
    }

    osThreadAttr_t taskOptions;
    taskOptions.name = "Task1";              // 任务的名字
    taskOptions.attr_bits = 0;               // 属性位
    taskOptions.cb_mem = NULL;               // 堆空间地址
    taskOptions.cb_size = 0;                 // 堆空间大小
    taskOptions.stack_mem = NULL;            // 栈空间地址
    taskOptions.stack_size = TASK_STACK_SIZE;           // 栈空间大小 单位:字节
    taskOptions.priority = osPriorityNormal; // 任务的优先级

    Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &taskOptions);      // 创建任务1
    if (Task1_ID != NULL) {
        printf("ID = %d, Create Task1_ID is OK!\n", Task1_ID);
    }

    taskOptions.name = "Task2";              // 任务的名字
    Task2_ID = osThreadNew((osThreadFunc_t)Task2, NULL, &taskOptions);      // 创建任务2
    if (Task2_ID != NULL) {
        printf("ID = %d, Create Task2_ID is OK!\n", Task2_ID);
    }
}
SYS_RUN(kernel_event_example);

使用build,编译成功后,使用upload进行烧录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1857266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW高精度电能质量监测系统

LabVIEW和研华采集卡的高精度电能质量监测系统利用虚拟仪器技术&#xff0c;实时监测电能质量的关键指标&#xff0c;如三相电压、频率和谐波。通过提高监测精度和效率&#xff0c;改善电网的电能质量。系 一、系统背景 电能作为现代社会的关键能源&#xff0c;其质量直接影响…

MySQl配置环境变量

配置环境变量 (a)添加一个系统变量,变量名:CATALINA-HOME,变量值:MySql在自己电脑当中的安装路径,注意:5.7版本需要配置的路径是MySQL.Sever5.7的文件夹路径。 (b)在Path变量的结尾添加一个英文分号,之后把上面添加的路径导入进去(%CATALINA-HOME%)在这个结尾处添加\bin. (2)登…

Python爬虫项目集:豆瓣电影排行榜top250

关于整理日常练习的一些爬虫小练习&#xff0c;可用作学习使用。 爬取项目以学习为主&#xff0c;尽可能使用更多的模块进行练习&#xff0c;而不是最优解。 爬虫概要 示例python 库爬取模块request解析模块BeautifulSoup存储类型list&#xff08;方便存入数据库&#xff09…

GPT+网络安全,新时代风口如何把握?

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; 前言 IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。此外&#…

应用图扑 HT for Web 搭建拓扑关系图

拓扑结构在计算机网络设计和通信领域中非常重要&#xff0c;因为它描述了网络中的设备&#xff08;即“点”&#xff09;如何相互连接&#xff08;即通过“线”&#xff09;。这种结构不仅涉及物理布局&#xff0c;即物理拓扑&#xff0c;还可以涉及逻辑或虚拟的连接方式&#…

iOS Swift5 视频播放

文章目录 1.截图2.代码3.导入本地文件 1.截图 2.代码 import UIKit import AVKit import AVFoundationclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()view.backgroundColor .white// 创建按钮let button UIButton(type: .syste…

【数据结构】程序填空题

假设顺序表的长度为 n 【插入操作】若在位序 1 处插入元素&#xff0c;则需要移动&#xff08;n&#xff09;个元素若在位序 n1 处插入元素&#xff0c;则需要移动&#xff08;0&#xff09;个元素若在位序 i (1≤i≤n1) 处插入元素&#xff0c;则需要移动&#xff08;n-i1&…

stm32学习笔记---EXTI外部中断(理论部分)

目录 STM32的中断 NVIC的基本结构 中断的优先级 优先级分组 EXTI&#xff08;Extern Interrupt&#xff09;外部中断 支持的触发方式 支持的GPIO口 外部中断占用的通道 外部中断的触发响应方式 外部中断的基本结构 GPIO口的外设 AFIO中断引脚选择 EXTI边沿检测及控…

HCIP-数通 V1.0 培训教材总结01

HCIP-数通 V1.0 培训教材总结01 01 认识网络设备框式设备及其硬件模块盒式设备框式、盒式设备的区别网络设备逻辑架构网络设备对报文的处理流程 01 认识网络设备 框式设备及其硬件模块 S12700E-8 &#xff08;S-switch&#xff0c;交换机) &#xff08;8&#xff0c;业务槽位…

构建LangChain应用程序的示例代码:38、自主RAG的概念及其实现方法,使用LangChain和OpenAI工具从头开始构建一个结合检索和生成的系统

# 安装必要的库 ! pip install langchain_community tiktoken langchain-openai langchainhub chromadb langchain langgraph自主RAG (Self-RAG) 自主RAG是最近的一篇论文&#xff0c;介绍了一种用于主动RAG的有趣方法。 该框架训练单个任意的语言模型&#xff08;如LLaMA2-7…

u盘sd卡格式化怎么恢复,3种恢复方法教学

u盘sd卡格式化怎么恢复&#xff0c;这是许多人在误操作后最关心的问题。我们会详细介绍五种有效的恢复方法&#xff0c;并且提供恢复原理的教学视频&#xff0c;帮助您轻松找回U盘和SD卡上被格式化的数据。 一. 数据存储与恢复的原理 1. U盘、移动硬盘、硬盘以及固态盘存储数据…

pgAdmin后台命令执行漏洞(CVE-2023-5002)

​ 我们可以看到针对于漏洞 CVE-2022-4223&#xff0c;官方做了一定的修复措施。 web\pgadmin\misc_init_.py#validate_binary_path ​ 首先是添加了 login_required​ 进行权限校验。在 Flask 框架中&#xff0c;login_required​ 装饰器通常与 Flask-Login 扩展一起使用。…

职场新宠:ONLYOFFICE——办公协作的得力助手

&#x1f3a0;前言 在快节奏的职场环境中&#xff0c;高效、便捷的办公软件成为每一位职场人士不可或缺的工作伙伴。当我们谈论职场办公软件时&#xff0c;许多人首先会想到Microsoft Office、wps等老牌软件。 然而&#xff0c;有一款宝藏的办公软件ONLYOFFICE&#xff0c;凭…

盘点延迟任务的11种实现方式

延迟任务在我们日常生活中比较常见&#xff0c;比如订单支付超时取消订单功能&#xff0c;又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式&#xff0c;这些方式并没有绝对的好坏之分&#xff0c;只是适用场景的不大相同。 1、Dela…

scapy修改TCP标志位

文章目录 TCP标志位scapy修改标志位设置标志位清除标志位示例 TCP标志位 TCP报文段结构如图所示 下面介绍一些重要的标志位&#xff1a; URG (Urgent): 紧急指针&#xff08;Urgent Pointer&#xff09;有效。当URG标志位设置为1时&#xff0c;表示TCP报文段中有紧急数据需要处…

用JavaScript实现了一个简单的图像坐标点标注工具

这段代码实现了一个简单的图像标注工具&#xff0c;允许用户在加载的图像上进行点选标注&#xff0c;并且通过右键确认一个点序列来形成一个多边形。 标注效果如下 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

景区智慧公厕系统作用:公厕管理轻松了,游客体验提高了

在快节奏的现代生活中&#xff0c;旅游已成为人们放松心情、探索世界的重要方式。而对于景区来说&#xff0c;提供优质的公共服务设施&#xff0c;尤其是公厕&#xff0c;是提升游客满意度和整体旅游体验的关键。然而&#xff0c;传统公厕管理方式往往难以满足日益增长的游客需…

Tomcat简介与安装

目录 一、Tomcat 简介 1、Tomcat好帮手---JDK 2、安装Tomcat & JDK 1、系统环境说明 2 、安装JDK 3、安装Tomcat 二、Tomcat目录介绍 1、tomcat主目录介绍 2、webapps目录介绍 3、Tomcat配置介绍&#xff08;conf&#xff09; 4、Tomcat的管理 5、tomcat 配置管…

【全资料】信息化建设全套资料获取(原件+实际项目参考)

软件开发从需求调研到项目验收需要一系列文档的支持&#xff0c;这些文档在项目的各个阶段发挥着重要的作用。本文将详细介绍这些文档及其作用。 一、需求调研 在软件开发的前期&#xff0c;进行需求调研是非常重要的。需求调研的主要目的是了解用户需求&#xff0c;包括功能需…

博图随机生成俄罗斯方块程序

一、程序结构 1.定义基础数据&#xff0c;俄罗斯方块图形共19中&#xff0c;使用WORD编码存储在数组内 2.添加随机生成int数值的FC函数块&#xff0c;生成1-19 的随机数 3.查找数组内图形显示在HMI画面上 二、程序 1.生成1-19 的随机数&#xff0c;并显示当前图形样式 2.生成按…