通过回调函数注册定时器触发事件

article/2025/7/22 11:58:50

1、说明

      使用回调函数,注册定时器触发事件的模式,提高定时器中断的可操作性,那如何实现呢?

2、.h文件

下面是定时器句柄的声明

3、.c文件

3.1、静态定时器句柄头

3.2、定时器回调函数处理

下面的函数是放在1ms的中断中的,不断执行;注意中断中不宜挂载过多的定时器句柄

3.3、注册定时器句柄

3.4、删除注册的句柄

3.5、启动xxx定时器句柄

3.6、暂停xxx定时器句柄

4、定时器中断函数

1ms定时器中断中,就放定时器回调处理的函数即可

5、应用说明

1、注册定时器句柄

2、启动定时器句柄

3、根据实际需要,删除 or 暂停 某个定时器句柄,之后再重新注册 or 启动

6、源码

//1ms定时器中断

void timer_interrupt_1ms(void)

{

   timerCallbackHandle_1ms();

}


 

typedef void (*pCallback)(void);  //回调函数指针类型

typedef enum{

    IDLE = 0,

    ONGOING

}E_STATE;

typedef struct TimerHandle_st{

   const char *name;    //名字

   uint32_t cnt;        //累积值

   uint32_t upperCnt;   //目标值

   E_STATE state;       //运行状态

   pCallback callback;  //回调函数

   struct TimerHandle_st *pNext;  //指向下一个 TimerHandle_st

}TimerHandle_st;


 

//初始化一个静态的定时器句柄头

static TimerHandle_st *pTimerHandle = NULL;

//1ms 定时器回调处理

void timerCallbackHandle_1ms(void)

{

   TimerHandle_st *pTHd = pTimerHandle;

   

   while(pTHd != NULL)

   {

      if(pTHd->callback != NULL && pTHd->state == ONGOING)

      {

         //定时到了

         if(pTHd->cnt >= pTHd->upperCnt)

         {

            pTHd->cnt = 0;     //重装载计数值

            pTHd->callback();  //执行回调函数

         }

         else

         {

            pTHd->cnt++;

         }

         

         pTHd = pTHd->pNext;  //遍历下一个 TimerHandle_st

      }

   }

}

//注册定时器句柄

bool timerHandleRegister(const char *name, pCallback *p, uint32_t upperCnt)

{

   TimerHandle_st *pTHd = pTimerHandle;

   

   //首次注册,头部 TimerHandle_st

   if(pTHd == NULL)

   {

      pTHd = (TimerHandle_st *)malloc(sizeof(TimerHandle_st));

      if(pTHd == NULL)

      {

         return false;

      }

      pTHd->name = name;

      pTHd->cnt = 0;

      pTHd->upperCnt = upperCnt;

      pTHd->state = IDLE;

      pTHd->callback = p;

      pTHd->pNext = NULL;

   }

   else

   {

      while(pTHd != NULL)

      {

         if(pTHd->pNext == NULL)

         {

            pTHd->pNext = (TimerHandle_st *)malloc(sizeof(TimerHandle_st));

            if(pTHd->pNext == NULL)

            {

               return false;

            }

            pTHd->pNext.name = name;

            pTHd->pNext.cnt = 0;

            pTHd->pNext.upperCnt = upperCnt;

            pTHd->pNext.state = IDLE;

            pTHd->pNext.callback = p;

            pTHd->pNext.pNext = NULL;

            break;

         }

         

         pTHd = pTHd->pNext;

      }

   }

   return true;

}

//通过 name 删除注册的句柄

bool timerHandleDelete(const char *name)

{

   TimerHandle_st *pTHd = pTimerHandle;

   TimerHandle_st *preTHd = pTHd;

   while(pTHd != NULL)

   {

      if(strncmp(pTHd->name, name, strlen(pTHd->name)) == 0)

      {

         preTHd->pNext = pTHd->pNext; //上一个句柄连接到下一个句柄

         free(pTHd);

         return true;

      }

      preTHd = pTHd;  //记录当前句柄

      pTHd = pTHd->pNext;  //跳转下一个句柄

   }

   return false;

}

//通过 name 启动xxx定时器句柄

bool timerHandleStart(const char *name)

{

   TimerHandle_st *pTHd = pTimerHandle;

   while(pTHd != NULL)

   {

      if(strncmp(pTHd->name, name, strlen(pTHd->name)) == 0)

      {

         pTHd->state = ONGOING;

         return true;

      }

     

      pTHd = pTHd->pNext;  //跳转下一个句柄

   }

   return false;

}

//通过 name 暂停xxx定时器句柄

bool timerHandleStop(const char *name)

{

   TimerHandle_st *pTHd = pTimerHandle;

   while(pTHd != NULL)

   {

      if(strncmp(pTHd->name, name, strlen(pTHd->name)) == 0)

      {

         pTHd->state = IDLE;

         return true;

      }

     

      pTHd = pTHd->pNext;  //跳转下一个句柄

   }

   return false;

}


http://www.hkcw.cn/article/xxIAcEqAbd.shtml

相关文章

Visual Studio+SQL Server数据挖掘

这里写自定义目录标题 工具准备安装Visual studio 2017安装SQL Server安装SQL Server Management Studio安装analysis service SSMS连接sql serverVisual studio新建项目数据源数据源视图挖掘结构部署模型设置挖掘预测 部署易错点 工具准备 Visual studio 2017 analysis servi…

大模型-attention汇总解析之-MHA

一、MHA(Multi-Head Attention) 1.1 MHA 原理 MHA(Multi-Head Attention)称为多头注意力,开山之作所提出的一种 Attention 计算形式,它是当前主流 LLM 的基础工作。在数学原理上,多头注意力 MHA 等价于多个独立的单头…

历年上海交通大学计算机保研上机真题

2025上海交通大学计算机保研上机真题 2024上海交通大学计算机保研上机真题 2023上海交通大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school String Match 题目描述 Finding all occurrences of a pattern in a text is a problem that arises freq…

DeepSeek-R1-0528-Qwen3-8B 本地ollama离线运行使用和llamafactory lora微调

参考: https://huggingface.co/deepseek-ai/DeepSeek-R1-0528-Qwen3-8B 量化版本: https://huggingface.co/unsloth/DeepSeek-R1-0528-Qwen3-8B-GGUF https://docs.unsloth.ai/basics/deepseek-r1-0528-how-to-run-locally 1、ollama运行 升级ollama版本到0.9.0 支持直接…

数字人革新教育:开启智慧教学新时代

随着人工智能技术的迅猛发展,数字人正在逐步走进教育领域,成为传统教学模式的颠覆者。广州深声科技有限公司(以下简称“深声科技”)凭借其在智能语音、数字人及多模态交互等核心技术上的深厚积累,推出了一系列创新性产…

Linux操作系统之进程(四):命令行参数与环境变量

目录 前言: 什么是命令行参数 什么是环境变量 认识环境变量 PATH环境变量 HOME USER OLDPWD 本地变量 本地变量与环境变量的差异 核心要点回顾 结语: 前言: 大家好,今天给大家带来的是一个非常简单,但也十…

IDA dumpdex经典脚本(记录)

一个dumpdex的IDA插件 毕业了,暂时用不着了,存起来 import idaapi import structdef dumpdex(start, len, target):rawdex idaapi.dbg_read_memory(start, len)fd open(target, wb)fd.write(rawdex)fd.close()def getdexlen(start):pos start 0x20mem idaapi.dbg_read_mem…

第2期:APM32微控制器键盘PCB设计实战教程

第2期:APM32微控制器键盘PCB设计实战教程 一、APM32小系统介绍 使用apm32键盘小系统开源工程操作 APM32是一款与STM32兼容的微控制器,可以直接替代STM32进行使用。本教程基于之前开源的APM32小系统,链接将放在录播评论区中供大家参考。 1…

Redis的安装与使用

网址:Spring Data Redis 安装包:Releases tporadowski/redis GitHub 解压后 在安装目录中打开cmd 打开服务(注意:每次客户端连接都有先打开服务!!!) 按ctrlC退出服务 客户端连接…

Redis 难懂命令-- ZINTERSTORE

**背景:**学习的过程中 常用的redis命令都能快速通过官方文档理解 但是还是有一些比较难懂的命令 **目的:**写博客记录一下(当然也可以使用AI搜索) 在Redis中,ZINTERSTORE 是一个用于计算多个有序集合(So…

7.atlas安装

1.服务器规划 软件版本参考: https://cloud.google.com/dataproc/docs/concepts/versioning/dataproc-release-2.2?hlzh-cn 由于hive3.1.3不完全支持jdk8,所以将hive的版本调整成4.0.1。这个版本没有验证过,需要读者自己抉择。 所有的软件都安装再/op…

RabbitMQ和MQTT区别与应用

RabbitMQ与MQTT深度解析:协议、代理、差异与应用场景 I. 引言 消息队列与物联网通信的重要性 在现代分布式系统和物联网(IoT)生态中,高效、可靠的通信机制是构建稳健、可扩展应用的核心。消息队列(Message Queues&am…

【技能篇】RabbitMQ消息中间件面试专题

1. RabbitMQ 中的 broker 是指什么?cluster 又是指什么? 2. 什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布…

[3D GISMesh]三角网格模型中的孔洞修补算法

📐 三维网格模型空洞修复技术详解 三维网格模型在扫描、重建或传输过程中常因遮挡、噪声或数据丢失产生空洞(即边界非闭合区域),影响模型的完整性与可用性。空洞修复(Hole Filling)是计算机图形学和几何处…

基于Spring Boot+Vue 网上书城管理系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

[ctfshow web入门] web81

信息收集 新增过滤:,伪协议都有:,这意味着伪协议不能用了 if(isset($_GET[file])){$file $_GET[file];$file str_replace("php", "???", $file);$file str_replace("data", "???", $file);$file st…

2025年应用心理学与社会环境国际会议(ICAPSE 2025)

2025年应用心理学与社会环境国际会议(ICAPSE 2025) 2025 International Conference on Applied Psychology and Social Environment 一、大会信息 会议简称:ICAPSE 2025 大会地点:中国北京 审稿通知:投稿后2-3日内通…

Windows 11 家庭版 安装Docker教程

Windows 家庭版需要通过脚本手动安装 Hyper-V 一、前置检查 1、查看系统 快捷键【winR】,输入“control” 【控制面板】—>【系统和安全】—>【系统】 2、确认虚拟化 【任务管理器】—【性能】 二、安装Hyper-V 1、创建并运行安装脚本 在桌面新建一个 .…

Redis 数据恢复的月光宝盒,闪回到任意指定时间

在数据库的运维工作中,DBA 应该选择哪一种方案,确保 Redis 数据库崩溃后可以对数据进行回档,恢复业务运行? 一般情况下,DBA 可以通过 Redis 原生的持久化机制,如 RDB 快照持久化或者 AOF 日志持久化的方案…

鸿蒙 HarmonyOS - SideBarContainer 组件自学指南

在日常开发中,如果你有类似「左侧导航 右侧内容」的布局需求,比如后台管理界面、文件管理器、设置页等,​​SideBarContainer​​ 是非常值得掌握的组件。它自带侧边栏和主内容区的分离机制,还支持折叠、拖拽、控制按钮和多种显示…