stm32平台为例的软件模拟时间,代替RTC调试

stm32平台为例的软件模拟时间,代替RTC调试

我们在开发项目的时候,如果用到RTC,如果真正等待RTC到达指定的时间,那调试时间就太长了。

比如每隔半个小时,存储一次数据,如果要观察10次存储的效果,那么就要等待5h,难道我们真等待5h,读取RTC数据不成?

这里借助软件,虚拟产生逐渐变化的时间,加速整个开发流程。

示例

#include <stdio.h>
#include <time.h>

/**
 * @brief 增加指定秒数到给定的起始日期并打印结果
 * 
 * @param start_date 起始日期
 * @param increment_seconds 增加的秒数
 */
void generate_dates(struct tm start_date, int increment_seconds) {
    // 增加时间
    start_date.tm_sec += increment_seconds;

    // 规范时间
    mktime(&start_date);

    // 打印结果
    printf("Updated date and time: %04d-%02d-%02d %02d:%02d:%02d\n", 
           start_date.tm_year + 1900, 
           start_date.tm_mon + 1, 
           start_date.tm_mday, 
           start_date.tm_hour, 
           start_date.tm_min, 
           start_date.tm_sec);
}

int main() {
    // 初始化时间
    struct tm start_date = {0};
    start_date.tm_year = 2023 - 1900; // 年份从1900开始算
    start_date.tm_mon = 6 - 1; // 月份从0开始算
    start_date.tm_mday = 10;
    start_date.tm_hour = 8;
    start_date.tm_min = 30;
    start_date.tm_sec = 0;

    int increment_seconds = 3600; // 每次增加一小时

    generate_dates(start_date, increment_seconds);

    return 0;
}

如果嫌弃每次增加秒数太麻烦,也可以设置分钟和小时的增加

void generate_dates(struct tm start_date, int increment_hours) {
        // 增加时间
        start_date.tm_hour += increment_hours;

        // 规范时间
        mktime(&start_date);
    }
}

void generate_dates(struct tm start_date, int increment_mins) {
        // 增加时间
        start_date.tm_min += increment_mins;

        // 规范时间
        mktime(&start_date);
    }
}

详细解释

struct tm

struct tm是一个结构体,用于表示时间信息。它定义在标准库头文件<time.h>中,包含了以下成员:

  • int tm_sec:秒数,范围是0到60(包含闰秒)。
  • int tm_min:分钟数,范围是0到59。
  • int tm_hour:小时数,范围是0到23。
  • int tm_mday:月份中的第几天,范围是1到31。
  • int tm_mon:月份,范围是0到11(0代表1月,11代表12月)。
  • int tm_year:自1900年以来的年份,比如2024年要用2024-1900表示。
  • int tm_wday:星期几,范围是0到6(0代表星期日)。
  • int tm_yday:一年中的第几天,范围是0到365。
  • int tm_isdst:是否为夏令时,正值表示夏令时,0表示非夏令时,负值表示信息不可用。

mktime

mktime是一个标准库函数,用于将struct tm结构转换为time_t类型的日历时间(根据当前的本地时间设置规范化tm结构。如果时间信息不合理(比如,秒数为负值或超出范围),mktime会自动进行调整。

求取时间差

项目开发中,经常会用到求取两个时间点的时间差,对于这一点,借助struct tm和它自带的函数实现,是十分方便的。在自己的结构体定义时,就可以用struct tm来作为时间子结构。

#include <stdio.h>
#include <time.h>

int main() {
    struct tm timeinfo1 = {0};
    struct tm timeinfo2 = {0};

    // 初始化第一个时间变量:2023年7月10日08:30:00
    timeinfo1.tm_year = 2023 - 1900;
    timeinfo1.tm_mon = 6;
    timeinfo1.tm_mday = 10;
    timeinfo1.tm_hour = 8;
    timeinfo1.tm_min = 30;
    timeinfo1.tm_sec = 0;

    // 初始化第二个时间变量:2024年1月1日12:00:00
    timeinfo2.tm_year = 2024 - 1900;
    timeinfo2.tm_mon = 0;
    timeinfo2.tm_mday = 1;
    timeinfo2.tm_hour = 12;
    timeinfo2.tm_min = 0;
    timeinfo2.tm_sec = 0;

    // 将tm结构转换为time_t类型
    time_t time1 = mktime(&timeinfo1);
    time_t time2 = mktime(&timeinfo2);

    // 计算时间间隔
    double seconds_difference = difftime(time2, time1);
    double days_difference = seconds_difference / (60 * 60 * 24);

    printf("Difference in seconds: %.f\n", seconds_difference);
    printf("Difference in days: %.f\n", days_difference);

    return 0;
}

其他

  1. 看过这篇全部的内容,你会发现,这个功能吧,依附于time.h,这是c的库,也就是说只要支持c语言就可以使用。所以这个功能不限于stm32平台,比如FPGA的PS端也可以用。
  2. 你可能会想如何调用这个功能,才可以更加真实的反应现实情况。我这里提供一个思路,这个功能可以跟定时器结合在一起,让定时器每1s钟,调用函数来更新时间。
  3. 要我说写的这篇文章价值在哪里呢?在于推广,这个struct tm功能,初学者知道的不多。

在这里插入图片描述

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

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

相关文章

学习笔记之Java篇(0725)

p this 普通方法中&#xff0c;this总是指向调用该方法的对象。 构造方法中&#xff0c;this总是指向正要初始化的对象。 this&#xff08;&#xff09;调用必须重载的构造方法&#xff0c;避免相同地址初始化代码&#xff0c;但只能在构造方法中用&#xff0c;比企鹅必须位…

WordPress 后台开发技巧:向文章发布页右侧添加自定义菜单项

案例图片 这个案例向你介绍了如何在文章发布页的右侧边栏增加一个新的自定义菜单项。具体用它实现什么功能&#xff0c;就看你的需要了。 代码 function add_custom_menu_item() { add_meta_box(custom_menu_item, 这里是菜单项名称, display_custom_menu_item, post, side, …

梅卡曼德高精度 DLP 结构光焊接专用 3D 相机

精度高&#xff0c;抗环境光、抗反光&#xff0c;成像效果好 自研蓝光 DLP 投影技术及双目结构光 3D 成像算法&#xff0c;相 机精度高&#xff0c;抗环境光、抗反光性能优异。在实际场景中&#xff0c; 可对各类复杂焊接件、焊缝高质量成像。 超小体积&#xff0c;超强适…

在spyder中使用arcgis pro的包

历时2天终于搞定了 目标&#xff1a;在anconda中新建一个arcpyPro环境&#xff0c;配置arcgispro3.0中的arcpy 一、安装arcgispro3.0 如果安装完之后打开arcgispro3.0闪退&#xff0c;就去修改注册表&#xff08;在另一台电脑安装arcgispro遇到过&#xff09; 安装成功后可…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着科技的不断进步&#xff0c;智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化&#xff0c;安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态&#xff0c;从而提高应急响…

如何实现可视化、智能化、自动化的文件采集?一文了解

内部数据文件采集需求在多个行业中都非常重要&#xff0c;以下是一些涉及此场景需求的行业&#xff1a; 1.大数据行业&#xff1a;随着大数据的行业应用不断深入&#xff0c;物联网、智能家居、数字政务等领域的大数据技术应用逐渐成熟&#xff0c;数据采集的需求也将被逐步激…

GPU虚拟化和池化技术解读

GPU虚拟化到池化技术深度分析 在大型模型的推动下&#xff0c;GPU算力的需求日益增长。然而&#xff0c;企业常常受限于有限的GPU卡资源&#xff0c;即使采用虚拟化技术&#xff0c;也难以充分利用或持续使用这些资源。为解决GPU算力资源的不均衡问题&#xff0c;同时推动国产…

日本的便利店真的“无所不能”?!简直不要太方便了

众所周知&#xff0c;日本便利店可谓是日本人离不来的存在了&#xff01;真真是“要啥有啥”&#xff0c;可以说日本的便利店才是真正意义上的“便利”~ 那日本的便利店到底有什么与众不同呢&#xff1f;&#xff1f;今天小编来带大家盘点一下日本便利店的那些服务。 一、购票…

开源XDR-SIEM一体化平台 Wazuh (1)基础架构

简介 Wazuh平台提供了XDR和SIEM功能&#xff0c;保护云、容器和服务器工作负载。这些功能包括日志数据分析、入侵和恶意软件检测、文件完整性监控、配置评估、漏洞检测以及对法规遵从性的支持。详细信息可以参考Wazuh - Open Source XDR. Open Source SIEM.官方网站 Wazuh解决…

IEC104转MQTT网关轻松将IEC104设备数据传输到Zabbix、阿里云、华为云、亚马逊AWS、ThingsBoard、Ignition云平台

随着工业4.0的深入发展和物联网技术的广泛应用&#xff0c;IEC 104&#xff08;IEC 60870-5-104&#xff09;作为电力系统中的重要通信协议&#xff0c;正逐步与各种现代监控、管理和云平台实现深度融合。IEC104转MQTT网关BE113作为这一融合过程中的关键设备&#xff0c;其能够…

信息安全工程师题

防火墙安全策略有两种类型&#xff1a;白名单策略、黑名单策略白名单策略&#xff1a;只允许符合安全规则的包通过防火墙&#xff0c;其他通信包禁止黑名单策略&#xff1a;禁止与安全规则相冲突的包通过防火墙&#xff0c;其他通信包允许实现网络地址转换的方式主要有静态NAT、…

华清数据结构day5 24-7-22

1>使用栈&#xff0c;完成进制转换输入&#xff1a;一个整数&#xff0c;进制数输出&#xff1a;该数的对应的进制数 seqstack.h #ifndef SEQSTACK_H #define SEQSTACK_H #define MAX 10 #include"myhead.h" typedef int datatype;typedef struct {datatype *d…

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外&#xff0c;还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相&#xff0c;成为赛场上另一道亮丽的风景线。 在新时代的浪潮中&#xff0c;中国制造业坚…

算法 —— 暴力枚举

目录 循环枚举 P2241 统计方形&#xff08;数据加强版&#xff09; P2089 烤鸡 P1618 三连击&#xff08;升级版&#xff09; 子集枚举 P1036 [NOIP2002 普及组] 选数 P1157 组合的输出 排列枚举 P1706 全排列问题 P1088 [NOIP2004 普及组] 火星人 循环枚举 顾名思…

uniapp中@click或者@tap多层嵌套的问题解决方法

我们在开发页面的过程中。例如要设计一个九宫格的相册&#xff0c;并且加上删除上传图片和点击图片后预览图片大图的功能例如下图的演示功能。 点击图片后显示大图预览图片&#xff0c;点击x号后要删除掉当前的图片&#xff0c;那么我们设计的时候如果我们代码写成如下的格式 …

node和npm安装;electron、 electron-builder安装

1、node和npm安装 参考&#xff1a; https://blog.csdn.net/sw150811426/article/details/137147783 下载&#xff1a; https://nodejs.org/dist/v20.15.1/ 安装&#xff1a; 点击下载msi直接运行安装 安装完直接cmd打开可以&#xff0c;默认安装就已经添加了环境变量&…

bug诞生记——动态库加载错乱导致程序执行异常

大纲 背景问题发生问题猜测和分析过程是不是编译了本工程中的其他代码是不是有缓存是不是编译了非本工程的文件是不是调用了其他可执行文件查看CMakefiles分析源码检查正在运行程序的动态库 解决方案 这个案例发生在我研究ROS 2的测试Demo时发生的。 整体现象是&#xff1a;修改…

【Linux】进程信号 --- 信号处理

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

vue.js入门

目录 一. 框架概述 二. vue常用命令 2.1 插值表达式 2.2 v-text 2.3 v-html 2.4 v-on 2.5 v-model 2.6 v-show 2.7 v-if 2.8 v-else 2.9 v-bind 2.10 v-for 三. vue生命周期函数 目录 一. 框架概述 二. vue常用命令 2.1 插值表达式 2.2 v-text 2.3 v-html 2…

Chapter 5: 二叉树详解

在探索计算机科学和编程世界的旅途中&#xff0c;数据结构是构成程序骨干的重要组成部分。它们不仅仅是存储数据的容器&#xff0c;更是提高算法效率、优化资源使用的关键。在众多的数据结构中&#xff0c;二叉树以其独特的结构和灵活性&#xff0c;成为了实现高效算法和解决复…