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…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...