EVENT事件调度(应用层级)操作注意事项

文章目录

    • 简要
    • 注意事项
    • API说明
      • 1、1毫秒计时驱动
      • 2、1秒计时驱动
      • 2、设置一个单位时间为1毫秒的周期性事件
      • 3、设置一个单位时间为1秒的周期性事件
      • 4、单次触发事件
      • 5、清除停止事件
      • 5、缓存事件触发标志
      • 6、获取事件状态
    • 示例
    • 源码

简要

  最大支持32个事件标志管理,倒计时精度为1毫秒的最大倒计时时间为4294967295毫秒,倒计时精度为1秒的最大倒计时时间为4294967295秒,可产生以下事件:

  • 立即触发事件
  • 单次超时事件
  • 循环周期性事件

注意事项

  • 内存访问一致性:主循环中获取事件标志或者调用事件触发和事件设置API都有可能导致读取的数据不一致,由于事件标志是4个字节长度,在事件标志读取和设置途中有可能在定时器中断中也会同时操作,这就导致在主循环中读取到的变量出现误差。所以会在相关函数入口和退出处控制控制所有中断开关。
  • __set_PRIMASK(1);关闭所有中断
  • __set_PRIMASK(0);打开所有中断

API说明

1、1毫秒计时驱动

void eventDriver(void);

调用setEvent(...)延时自动触发事件的倒计时就是在该API中执行,所以该函数需要放在一个周期为1毫秒的定时器中执行。

2、1秒计时驱动

void eventDriver1s(void);

调用setEvent1s(...)延时自动触发事件的倒计时就是在该API中执行,所以该函数需要放在一个周期为1秒的定时器中执行。
比如一些低功耗运行的场景,该定时器可以选择低功耗定时器

2、设置一个单位时间为1毫秒的周期性事件

void setEvent(uint32_t mask, bool first, bool reload, bool setCover, uint32_t timeOut_ms);

序号传参变量类型说明
1maskuint32_t需要设置的事件标志,一个事件占用一个bit内存
2firstbooltrue表示调用setEvent(...)后立即触发一次事件,false表示等待周期时间到了再触发产生事件
3reloadbooltrue表示周期性触发mask事件,false表示执行完第一次超时触发事件后,该事件就停止运行
4setCoverbooltrue表示重新计时,false表示不重新计时
5timeOut_msuint32_t0表示立即触发,无周期性事件,非0表示以时间做超时事件

3、设置一个单位时间为1秒的周期性事件

void setEvent1s(uint32_t mask, bool first, bool reload, bool setCover, uint32_t timeOut_s);

序号传参变量类型说明
1maskuint32_t需要设置的事件标志,一个事件占用一个bit内存
2firstbooltrue表示调用setEvent(...)后立即触发一次事件,false表示等待周期时间到了再触发产生事件
3reloadbooltrue表示周期性触发mask事件,false表示执行完第一次超时触发事件后,该事件就停止运行
4setCoverbooltrue表示重新计时,false表示不重新计时
5timeOut_suint32_t0表示立即触发,无周期性事件,非0表示以时间做超时事件

4、单次触发事件

void event_post(uint32_t mask);

执行后会立即触发该事件。

5、清除停止事件

void event_clear(uint32_t mask);

执行后会立即停止该事件的执行。

5、缓存事件触发标志

uint32_t event_pend(void);

该函数放在主循环中执行,会先把所有的事件标志缓存起来,供后续事件判断处理。

6、获取事件状态

uint32_t getEvent(uint32_t mask);

获取事件状态,返回值0表示该事件未触发,非0表示该事件已触发。

示例

#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include "eventUnit.h"

#define EVENT_TIME_CYCLE_10ms           0
#define EVENT_TIME_CYCLE_500ms          1

void MAIN_TIM_CALLBACK(uint8_t status, uint32_t param)
{
    static uint16_t timeCnt_1ms = 0;
    if(++ timeCnt_1ms == 5)
    {
        timeCnt_1ms = 0;
        eventDriver();
    }
}
void MAIN_TIM_1S_CALLBACK(uint8_t status, uint32_t param)
{
    eventDriver1s();
}
int main(void)
{
    myTim3_init(200, 0);
    myIrqCallback_mainTimCallback.thisCb = MAIN_TIM_CALLBACK;
    TIM3_callbackRegiste(&myIrqCallback_mainTimCallback);
    
    setEvent(EVENT_TIME_CYCLE_10ms, true, true, true, 10);
    setEvent(EVENT_TIME_CYCLE_500ms, true, true, true, 500);
    while(1)
    {
        event_pend();
        if (getEvent(EVENT_TIME_CYCLE_10ms))
        {
        }
        if (getEvent(EVENT_TIME_CYCLE_500ms))
        {
        }

    }
}

源码

eventUnit.h

#ifndef __EVENTUNIT_H
#define __EVENTUNIT_H
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
// #include "at32f423_clock.h"
#include "cmsis_armcc.h"

#define EVENT_INDEX_MAX 32
typedef struct
{
    bool reload;            //
    bool flag_1s;            //
    uint32_t count;          //
    uint32_t countSet;            //
}eventParams_ts;

void eventDriver(void);
void eventDriver1s(void);
void setEvent(uint32_t mask, bool first, bool reload, bool setCover, uint32_t timeOut_ms);
void setEvent1s(uint32_t mask, bool first, bool reload, bool setCover, uint32_t timeOut_s);
void event_post(uint32_t mask);
void event_clear(uint32_t mask);
uint32_t event_pend(void);
uint32_t getEvent(uint32_t mask);
#endif

eventUnit.c

#include "eventUnit.h"

volatile eventParams_ts eventParams[EVENT_INDEX_MAX];
volatile uint32_t timerEventMask;
uint32_t getEventMask;
bool eventDriverSta;

void eventDriver(void)
{
    int i;
    
    for ( i = 0; i < EVENT_INDEX_MAX; i++)
    {
        if (eventParams[i].flag_1s == false && eventParams[i].countSet)
        {
            if (++ eventParams[i].count >= eventParams[i].countSet - 1)
            {
                eventParams[i].count = 0;
                if (eventParams[i].reload == false)
                {
                eventParams[i].countSet = 0;
                }
                timerEventMask |= (1 << i);
            }
        }
    }
}
void eventDriver1s(void)
{
    int i;
    
    for ( i = 0; i < EVENT_INDEX_MAX; i++)
    {
        if (eventParams[i].flag_1s && eventParams[i].countSet)
        {
            if (++ eventParams[i].count >= eventParams[i].countSet - 1)
            {
                eventParams[i].count = 0;
                if (eventParams[i].reload == false)
                {
                eventParams[i].countSet = 0;
                }
                timerEventMask |= (1 << i);
            }
        }
    }
}
void setEvent(uint32_t mask, bool first, bool reload, bool setCover, uint32_t timeOut_ms)
{
    __set_PRIMASK(1);
    
    if (setCover)
    {
        eventParams[mask].count = 0;
    }
    eventParams[mask].countSet = timeOut_ms;
    eventParams[mask].flag_1s = false;
    eventParams[mask].reload = reload;
    if ((timeOut_ms == 0) || first)
    {
        timerEventMask |= (1 << mask);
    }

    __set_PRIMASK(0);//开总中断
}
void setEvent1s(uint32_t mask, bool first, bool reload, bool setCover, uint32_t timeOut_s)
{
    __set_PRIMASK(1);
    
    if (setCover)
    {
        eventParams[mask].count = 0;
    }
    eventParams[mask].countSet = timeOut_s;
    eventParams[mask].flag_1s = true;
    eventParams[mask].reload = reload;
    if ((timeOut_ms == 0) || first)
    {
        timerEventMask |= (1 << mask);
    }

    __set_PRIMASK(0);//开总中断
}
void event_post(uint32_t mask)
{
    __set_PRIMASK(1);
    eventParams[mask].countSet = 0;
    eventParams[mask].count = 0;
    eventParams[mask].reload = false;

    timerEventMask |= (1 << mask);
    __set_PRIMASK(0);//开总中断
}
void event_clear(uint32_t mask)
{
    __set_PRIMASK(1);
    eventParams[mask].countSet = 0;
    eventParams[mask].count = 0;
    eventParams[mask].reload = false;
    timerEventMask &= (~(1 << mask));
    __set_PRIMASK(0);//开总中断
}
uint32_t event_pend(void)
{
    uint32_t ret = 0;
    __set_PRIMASK(1);
    ret = timerEventMask;
    getEventMask = ret;
    timerEventMask = 0;
    __set_PRIMASK(0);//开总中断
    return ret;
}
uint32_t getEvent(uint32_t mask)
{
    return getEventMask & (1 << mask);
}




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot整合飞书向群组/指定个人发送消息/飞书登录

Springboot整合飞书向群组发送消息 飞书开放平台创建企业自建应用 添加应用能力-机器人 创建完成后&#xff0c;进入应用详情页&#xff0c;可以在首页看到 App Id 和 App Secret 在飞书pc端创建一群机器人 此处可以拿到该机器人的webhook地址,通过https的方式,也可以调用发送…

为什么说RK3562可以碾压PX30?

在如今的科技市场中&#xff0c;处理器的性能直接决定了设备的运行速度和用户体验。今天&#xff0c;我们将对比瑞芯微旗下的两款处理器&#xff1a;PX30与RK3562。RK3562比PX30的性价比究竟高在哪里&#xff1f; PX30 瑞芯微PX30是一款高性能的四核应用处理器&#xff0c;专…

Android单行字符串末尾省略号加icon,图标可点击

如图 设置仅显示单行字符串&#xff0c;末尾用省略号&#xff0c;加跟一个icon&#xff0c;icon可点击 tvName.text "test"val drawable ResourcesCompat.getDrawable(resources, R.mipmap.icon_edit, null)tvName.setCompoundDrawablesWithIntrinsicBounds(null,…

故障——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题纯数学&#xff0c;考察贝叶斯公式 AC_Code #include <bits/stdc.h> using namespace std; typedef pair<int,double> PI; bool cmp(PI a,PI b){if(a.second!b.second)return a.second>b.second;return a.first<b.first; } int main() {i…

在Leaflet中点对象使用SVG和Canvas两种模式的对比

目录 前言 一、关于SVG和Canvas 1、SVG知识 2、Canvas知识 3、优缺点 二、SVG和Canvas在Leaflet的使用 1、相关类图 2、Leaflet的默认展示方式 三、SVG和Canvas实例及性能对比 1、SVG模式及性能对比 2、Canvas优化 总结 前言 众所周知&#xff0c;在Leaflet当中&#…

vue3配置element-plus时间选择器中文显示

修改main.js import ElementPlus from element-plus import element-plus/dist/index.css // 引入中文包 import zhCn from "element-plus/es/locale/lang/zh-cn"; const app createApp(App) app.use(ElementPlus,{ locale: zhCn, }) //挂载 app.mount(#app)

白盒测试:覆盖测试及测试用例设计

白盒测试&#xff1a;覆盖测试及测试用例设计 一、实验目的 1、掌握白盒测试的概念。 2、掌握逻辑覆盖法。 二、实验任务 某工资计算程序功能如下&#xff1a;若雇员月工作小时超过40小时&#xff0c;则超过部分按原小时工资的1.5倍的加班工资来计算。若雇员月工作小时超过…

数据库系统理论——关系数据库

文章目录 一、关系&#xff08;数据结构&#xff09;1、概述2、名词解释3、关系模式、关系数据库、关系数据库模式4、基本关系的性质 二、关系操作&#xff08;数据操作&#xff09;三、关系的完整性1、实体完整性2 、参照完整性3、用户自定义的完整性 四、关系代数五、习题 前…

Twitch赠送暗区突围测试资格 超简单暗区突围测试资格领取教程

作为直播界的领航者&#xff0c;Twitch平台不仅是全球游戏文化直播的中心舞台&#xff0c;更是频繁联袂各路游戏大作&#xff0c;为粉丝们奉上别具匠心的互动盛宴&#xff0c;让观赛的同时解锁诱人的游戏内惊喜。正值《暗区突围》PC版测试的热潮涌动&#xff0c;Twitch乘势加强…

详细分析McCabe环路复杂度(附例题)

目录 前言1. 基本知识2. 例题 前言 该知识点常出在408或者软考中&#xff0c;对此此文重点讲讲理论知识以及例题 对于例题平时看到也会更新 1. 基本知识 McCabe环路复杂度是一种用于衡量软件代码复杂性的指标&#xff0c;主要是通过计算代码中的控制流图中的环路数量来衡量…

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征&#xff1a;产业链条长、多业态并存 运营环境&#xff1a;数据交互和共享风险高 IT建设过程&#xff1a;数据复杂、历史包袱重 数据质量&#xff1a;数据可信和一致化…

逆向中webpack需要补充的模块很多怎么办

如下面这种典型的形式 进入i找到加载器 找到加载器所在函数r,在 return e[a].call(c.exports, c, c.exports, r),打上断点。 在控制台打印e,会发现它总共有的模块&#xff0c;这些模块需要我们在别的webpack中复制&#xff0c;有时很多&#xff0c;很麻烦。 我们可以注入代码在…

es6语法总结

【1】语法 &#xff08;1&#xff09;声明变量(let-var-const) 变量提升&#xff1a; 是JavaScript引擎在代码执行前将变量的声明部分提升到作用域顶部的行为。尽管变量的声明被提升了&#xff0c;变量的赋值&#xff08;即初始化&#xff09;仍然保留在原来的位置。因此&…

紫外激光打标机适合在哪些材料表面进行标记

紫外激光打标机适合在多种材料表面进行标记&#xff0c;特别是那些对热敏感或者需要高精度、高清晰度标记的材料。以下是一些常见的适用材料&#xff1a; 1. 塑料&#xff1a;紫外激光打标机在塑料材料上表现尤为出色&#xff0c;因为紫外激光的短波长和高能量密度使得它能够在…

基于树莓派的六足机器人方案设计+源代码+工程内容说明

文章目录 源代码下载地址项目介绍项目内容说明简单预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目内容说明 hardware为项目相关硬件设计 机械结构为六足机器人的3d建模工程&#xff0c;包括本体和云台遥控器在ESP32最小开发板上集成了MPU605…

ChatGPT DALL-E绘图,制作各种表情包,实现穿衣风格的自由切换

DALL-E绘图功能探索&#xff1a; 1、保持人物形象一致&#xff0c;适配更多的表情、动作 2、改变穿衣风格 3、小女孩的不同年龄段展示 4、不同社交平台的个性头像创作 如果不会写代码&#xff0c;可以问GPT。使用地址&#xff1a;我的GPT4 视频&#xff0c;B站会发&#…

茅台申购,多平台签到与通知 | 使用极空间NAS部署一个神级脚本『DailyCheckIn』

茅台申购&#xff0c;多平台签到与通知 | 使用极空间NAS部署一个神级脚本『DailyCheckIn』 哈喽小伙伴们好&#xff0c;我是Stark-C~&#xff0c;今天为大家分享一个极空间上非常实用且好玩的项目。 小伙伴们都知道&#xff0c;目前很多平台为了促进用户的活跃度和黏性&#…

ENVI拓展工具资源去哪里找

ENVI拓展工具资源去哪里找&#xff1f; 文章目录 ENVI拓展工具资源去哪里找&#xff1f;前言网站&#xff08;链接见文末&#xff09;ENVI应用商店&#xff08;App Store&#xff09;ENVI官方提供第三方制作自己制作 总结参考 前言 ENVI 拓展工具是指 ENVI 软件的扩展功能或插…

WordPress插件:链接自动识别转为超链接

WordPress插件&#xff1a;链接自动识别转为超链接 <?phpfunction open_links_in_new_tab() {add_filter(the_content, make_clickable);function autoblank($text) {$return str_replace(<a, <a target"_blank", $text);return $return;}add_filter(th…

海外市场成 ISV 新掘金地?生成式 AI 如何加速业务创新实践?Zilliz 有话说

期望了解 Zilliz 最新动态&#xff1f;想要与 Zilliz 线下探讨 AI 时代向量数据库的全球化布局思考及典型实践&#xff1f; 机会来啦&#xff01;5 月 10 日&#xff0c;Zilliz 将闪现亚马逊云科技的两场活动现场&#xff08;苏州、西安&#xff09;&#xff0c;与大家共话行业…
最新文章