N32L406 移植MultiTimer教程 mdk5

news2025/2/25 2:58:43

MultiTimer

首先感谢开源作者

开源地址;

github.com https://github.com/0x1abin/MultiTimer

简介

MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更优雅更便捷地管理程序的时间触发时序。

移植方法

  1. 配置系统时间基准接口,安装定时器驱动
uint64_t platform_ticks_get_interface(void) {
		return get_sys_tick();
}

multi_timer_install_ticks(platform_ticks_get_interface);
  1. 实例化一个定时器对象;
multi_timer_t g_timer1_;
  1. 设置定时时间,超时回调处理函数, 用户上下指针,启动定时器;
void fun_multi_timer_callback(multi_timer_t* timer, void* user_data)
{
   
    //添加这一行代码,定时器就是一个周期定时器
    multi_timer_start(&g_timer1_, 1000, fun_multi_timer_callback , NULL);
}
 multi_timer_start(&g_timer1_, 1000, fun_multi_timer_callback , NULL);
  1. 在主循环调用定时器后台处理函数
int main(int argc, char *argv[])
{
 
  while (1) {
  
    multi_timer_yield();
  }
}

功能限制

1.定时器的时钟频率直接影响定时器的精确度,尽可能采用1ms/5ms/10ms这几个精度较高的tick;

2.定时器的回调函数内不应执行耗时操作,否则可能因占用过长的时间,导致其他定时器无法正常超时;

3.由于定时器的回调函数是在 multi_timer_yield 内执行的,需要注意栈空间的使用不能过大,否则可能会导致栈溢出

移植步骤

0.复制代码值工程目录middle下

在这里插入图片描述

1.添加代码

在这里插入图片描述

2.添加头文件

…\middle\multi_timer

在这里插入图片描述

3.设置获取系统的时间戳回调

  //配置一个时间戳给MutiTimer
  multi_timer_install_ticks(get_sys_tick);

4.创建一个定时器

static multi_timer_t g_timer1_;

5.调用multi_timer_yield

这里使用了一个线程来调用multi_timer_yield,这样就提高了实时性

void fun_multi_timer_callback(multi_timer_t* timer, void* user_data)
{
   led_on_blink(OUT_LED0);
    //添加这一行代码,定时器就是一个周期定时器
    multi_timer_start(&g_timer1_, 1000, fun_multi_timer_callback , NULL);
}
 

static  void  AppTaskStart (void *p_arg)
{
	
	multi_timer_start(&g_timer1_, 1000, fun_multi_timer_callback , NULL);
    while (1) 
    {
       
        vTaskDelay(5/portTICK_RATE_MS);//5ms调用一次
		multi_timer_yield();
    }
}

1.如果是主函数内部调用multi_timer_yield可以执行一些稍微有点耗时操作的代码,但是可能因占用过长的时间,导致其他定时器无法正常超时

2.硬件实施期中断中调用multi_timer_yield函数,定时器的回调函数内不应执行耗时操作,否则可能因占用过长的时间,导致其他定时器无法正常超时;

3.实现线程的方式(线程优先级降低),基本不用考虑耗时问题,至少不会影响到其他线程

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

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

相关文章

C++学习笔记之指针高阶

数组名 数组名字是数组的首元素地址。 一个指针变量保存了数组元素的地址。我们就称之为数组元素指针,及数组指针。 数组指针的本质是指针,指向数组中的某个元素的地址。 由于数组名可以代表数组收元素地址,数组元素是可以通过 数组名[下标] 的格式访问, 那么可以定义一…

红酒行业新动态:抢先了解未来趋势

在风起云涌的红酒市场中,每一次变革都如同飓风般席卷整个行业。今日,我们一同探讨红酒行业的新动态,特别是定制红酒领域的未来趋势。让我们以洒派红酒(Bold & Generous)为引,洞察行业前沿,预…

60、redis安装和部署

一、关系型数据库与非关系型数据库 1.1、关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0…

2024-07学习笔记

1.${}取值 在这些属性源中,命令行参数和JVM系统属性拥有最高的优先级,它们可以覆盖在Properties文件中定义的属性。而操作系统环境变量和Properties文件的优先级相对较低,但是Spring会根据配置的不同情况进行属性的合并和覆盖,最终…

QUARKUS初体验

1.什么是QUARKUS? Quarkus是 Red Hat为GraalVM 和 HotSpot 量身定制用程序。特点是启动超快,内存极低,并且在容器编排平台(如Kubernetes)中提供了近乎即时的向上扩展和高密度的内存利用率。并且基于GraalVM&#xff0…

【YashanDB知识库】如何远程连接、使用YashanDB?

问题现象 在各个项目实施中,我们经常遇到客户、开发人员需要连接和使用YashanDB但不知如何操作的问题,本文旨在介绍远程连接、使用YashanDB的几种方式。 问题的风险及影响 无风险 问题影响的版本 历史版本~23.2 问题发生原因 无 解决方法及规避方…

Pytorch基础:Tensor的连续性

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中,一个连续的张量指的是张量中各数据元素在底层的存储顺序与其在张量中的位置一致。这意味着每一个元素的地址可以通过下面的线性映射公式来…

MySQL8--用户与权限管理

原文网址:MySQL8--用户与权限管理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍MySQL8的用户与权限的管理,包括:用户的创建与删除、授权与撤销权限等。 为什么要管理用户与权限? 目的是保证数据库的安全性,只授…

TCP/IP协议——使用Socket套接字实现

目录 Socket 使用Socket实现TCP客户端和服务器的过程 使用Socket搭建TCP服务器 线程优化 向客户端发送消息 连接的断开 客户端主动断开 服务端主动断开 服务器完整的程序 使用Socket编写客户端程序连接TCP服务器 Socket Socket是一种网络通信协议,它允许…

不再担心数据丢失:用rsync打造你的自动化备份解决方案

在现代IT环境中,数据备份是一项至关重要的任务。无论是个人文件还是企业数据,都需要有可靠的备份机制来防止数据丢失。今天,我们将介绍一种高效的备份方案:使用rsync实现自动化备份目录。 什么是rsync? rsync 是一个开…

vscode+cmake+msvc+vcpkg的入门使用

一.环境安装 1.下载vscode并安装: Download Visual Studio Code - Mac, Linux, Windows 2.安装完成后,安装C和cmake 相关工具,如图。 3.vcpkg的下载和安装 克隆vcpkg的仓库到本地:https://github.com/microsoft/vcpkg.git,运行bo…

《学会 SpringMVC 系列 · 基础篇》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

deeplapv3 动机

语义分割是计算机视觉领域中重要的任务之一,语义分割的目的是为图像中的每个像素分配标签。相比于传统方法,以深度学习为基础的全卷积网络极大地提高了语义分割算法的性能。 在语义分割网络中,常用到如下2种结构: 空间金字塔池化…

C++STL简介(三)

目录 1.vector的模拟实现 1.1begin() 1.2end() 1.3打印信息 1.4 reserve() 1.5 size() 1.6 capacity() 1.7 push_back() 1.8[ ] 1.9 pop_back() 1.10 insert&…

【涵子来信】——AI革新:1.新时代是便捷的,要会用

各位读者朋友们: 我们现在AI时代的十字路口,AI是为生活带来便利的,我们要会使用AI。今天这篇文章来讲述一下AI的正确使用。 一、 AI的使用 1.1.便捷之中要会辨别 AI是带来强大的,利用好可以给生活带来便捷。 像之前WWDC24宣传…

SAP 字符串关键字找程序

关键字查询程序 : RPR_ABAP_SOURCE_SCAN或RS_ABAP_SOURCE_SCAN

Python网络爬虫:基础与实战!附淘宝抢购源码

Python网络爬虫是一个强大的工具,用于从互联网上自动抓取和提取数据。下面我将为你概述Python网络爬虫的基础知识和一些实战技巧。 Python网络爬虫基础 1. HTTP请求与响应 网络爬虫的核心是发送HTTP请求到目标网站并接收响应。Python中的requests库是处理HTTP请求…

C语言——运算符及表达式

C语言——运算符及表达式 运算符运算符的分类(自增运算符)、--(自减运算符)赋值运算符逗号运算符(顺序求值运算符) 表达式 运算符 运算符的分类 C语言的运算符范围很宽,除了控制语句和输入输出…

从数据血缘谈一谈如何实现数据管理的“自治理”

数据治理是企业数据管理的核心,它通过系统性的管理行为,确保数据的完整性、准确性、安全性、合规性和价值最大化。数据治理有助于提高数据质量和可用性,减少数据管理的风险,增强企业对数据的信任,从而提升业务效率和竞…