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

stm32平台为例的软件模拟时间,代替RTC调试
stm32平台为例的软件模拟时间,代替RTC调试 我们在开发项目的时候,如果用到RTC,如果真正等待RTC到达指定的时间,那调试时间就太长了。 比如每隔半个小时,存储一次数据,如果要观察10次存储的效果࿰…...
《设计模式之美》读书笔记2
从Linux学习应对大型复杂项目的方法: 1、封装与抽象:封装了不同类型设备的访问细节,抽象为统一的文件访问方式,更高层的代码就能基于统一的访问方式,来访问底层不同类型的设备。这样做的好处是,隔离底层设备…...
C++ STL set_difference 用法
一:功能 给定两个集合A,B;计算集合的差集,即计算出那些只包含在A中而不包含在B中的元素。 二:用法 #include <vector> #include <algorithm> #include <iostream>int main() {std::vector<int&…...

【基础算法总结】优先级队列
优先级队列 1.最后一块石头的重量2.数据流中的第 K 大元素4.前K个高频单词4.数据流的中位数 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1…...

python-绝对值排序(赛氪OJ)
[题目描述] 输入 n 个整数,按照绝对值从大到小排序后输出。保证所有整数的绝对值不同。输入格式: 输入数据有多组,每组占一行,每行的第一个数字为 n ,接着是 n 个整数, n0 表示输入数据的结束,不做处理。输…...

成功者的几个好习惯,你具备了几个
每个人都想成为自己领域的佼佼者,然而,成功并非偶然,它往往与一系列良好的习惯紧密相连。这些习惯如同灯塔,指引着成功者在波涛汹涌的大海中稳健前行。 一、设定明确目标 没有明确的目标,就如同航海没有指南针&#…...

centos中zabbix安装、卸载及遇到的问题
目录 Zabbix简介Zabbix5.0和Zabbix7.0的区别监控能力方面模板和 API 方面性能、速度方面 centos7安装Zabbix(5.0)安装zabbix遇到的问题卸载Zabbix Zabbix简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参…...
php编译安装
一、基础环境准备 # php使用www用户 useradd -s /sbin/nologin -M www二、下载php包 # 下载地址 https://www.php.net/downloads wget https://www.php.net/distributions/php-8.3.9.tar.gz三、配置编译安装 编译安装之前需要处理必要的依赖,在编译配置安装&…...
[K8S] K8S资源控制器Controller Manager(4)
文章目录 1. 常见的Pod控制器及含义2. Replication Controller控制器2.1 部署ReplicaSet 3. Deployment3.1部署Deployment3.2 运行Deployment3.3 镜像更新方式3.4 Deployment扩容3.5 滚动更新3.6 金丝雀发布(灰度发布)3.7 Deployment版本回退3.8 Deployment 更新策略 4. Daemon…...

C#,.NET常见算法
1.递归算法 1.1.C#递归算法计算阶乘的方法 using System;namespace C_Sharp_Example {public class Program{/// <summary>/// 阶乘:一个正整数的阶乘Factorial是所有小于以及等于该数的正整数的积,0的阶乘是1,n的阶乘是n࿰…...

KubeSphere介绍及一键安装k8s
KubeSphere介绍 官网地址:https://kubesphere.io/zh/ KubeSphere愿景是打造一个以 Kubernetes 为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成࿰…...
Spring 系列
SpringBoot 实体类(Entity)层 实体类(Entity)通常属于模型层(Model Layer)或领域层(Domain Layer)。它们代表应用程序中的核心业务数据结构,与数据库表结构紧密对应。在…...

基于opencv[python]的人脸检测
1 图片爬虫 这里的代码转载自:http://t.csdnimg.cn/T4R4F # 获取图片数据 import os.path import fake_useragent import requests from lxml import etree# UA伪装 head {"User-Agent": fake_useragent.UserAgent().random}pic_name 0 def request_pic…...

配置SSH公钥互信
目录 第一台主机:servera(172.25.250.101) 第一步:查看 . ssh目录下面是否为空 第二步:输入命令ssh-keygen 第三步: 再看查看一下. ssh目录 第四步: 输入命令 ssh-copy-id root172.25.250…...
WEB渗透Web突破篇-SQL注入(MSSQL)
注释符 -- 注释 /* 注释 */用户 SELECT CURRENT_USER SELECT user_name(); SELECT system_user; SELECT user;版本 SELECT version主机名 SELECT HOST_NAME() SELECT hostname;列数据库 SELECT name FROM master..sysdatabases; SELECT DB_NAME(N); — for N 0, 1, 2, ……...

DAY15
数组 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知 我们看到嵌套循环,应该马上就可以得到这个算法的…...

pytest结合allure-pytest插件生成测试报告
目录 一、安装allure-pytest插件 二、下载allure 三、生成allure报告 四、效果展示 一、安装allure-pytest插件 二、下载allure 下载之后解压,解压之后还要配置环境变量(把allure目录下bin目录配置到系统变量的path路径),下…...
详细解析用户提交咨询
上一篇文章中写到了使用Server-Sent Events (SSE),并获取message里面的内容。 本篇文章主要是写,具体该如何实现的具体代码,代码见下方,可直接拿 async submitConsult() {this.scrollToBottom();if (!this.$checkLogin()) return;…...

UDP/TCP协议解析
我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》࿱…...

力扣94题(java语言)
题目 思路 使用一个栈来模拟递归的过程,以非递归的方式完成中序遍历(使用栈可以避免递归调用的空间消耗)。 遍历顺序步骤: 遍历左子树访问根节点遍历右子树 package algorithm_leetcode;import java.util.ArrayList; import java.util.List; import…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...