utc时间 单位换算_OSAL之时钟分析
OSAL的时钟实现在OSAL_CockBLE.c与OSAL_Clock.h两个文件中。OSAL支持完整的UTC(世界统一时间),以2000年1月1日00:00:00为时间起点,可以精确到年、月、日、时、分、秒的时间值。
1、定义UTC格式的结构:
typedef struct
{
uint8 seconds; // 0-59
uint8 minutes; // 0-59
uint8 hour; // 0-23
uint8 day; // 0-30
uint8 month; // 0-11
uint16 year; // 2000+
} UTCTimeStruct;
2、几个宏定义
闰年的判断:代码意义上的闰年是能被4整除且不能被100整除,或者能被400整除的年份。
#define IsLeapYear(yr) (!((yr) % 400) || (((yr) % 100) && !((yr) % 4)))
年份的天数:闰年有366天,非闰年则有365天。
#define YearLength(yr) (IsLeapYear(yr) ? 366 : 365)
UTC的起始年份:这里以2000年为起始年份。
#define BEGYEAR 2000 // UTC started at 00:00:00 January 1, 2000
一天的秒数:24小时*60分钟*60秒。
#define DAY 86400UL // 24 hours * 60 minutes * 60 seconds
用于计算的最大节拍:(MAXCALCTICKS * 5) + (max remainder) 必须小于等于65535(16位)。因为直接给OSAL时钟提供的硬件节拍为的单位为625us,即5/8ms,所以在计算的是为了将us单位的时间转换成ms单位的时钟需要才乘于5/8,即先乘于5再除以8,为了保证乘于5后的值小于65535,所以才定义了下面的最大节拍数。
#define MAXCALCTICKS ((uint16)(13105))
3、几个变量
保存UTC时间对应的秒数变量:UTCTime类型即uint32,能保存的年数为2^32/86400/365=136年左右,如果UTC以2000年为起点,则最长可以设置的时间为2136年。
UTCTime OSAL_timeSeconds = 0;
用于保存之前的硬件定时器节拍变量:
static uint16 previousLLTimerTick = 0;
用于保存每次更新后剩余的us级别的时间变量:
static uint16 remUsTicks = 0;
用于保存UTC时间对应的秒数变量:
static uint16 timeMSec = 0;
osalTimeUpdate()更新系统时间,同时给时钟与定时器用
1、获取上次调用到现在的时间间隔,即这次需要更新的时间
tmp = ll_McuPrecisionCount();
2、计算需要更新的时间
ticks625us = tmp - previousLLTimerTick;
previousLLTimerTick = tmp;
3、转化成ms单位
当ticks625us大于MAXCALCTICKS时,一直执行:
while ( ticks625us > MAXCALCTICKS )
{
ticks625us -= MAXCALCTICKS;//剩下ticks625us数
elapsedMSec += MAXCALCTICKS * 5 / 8;//转换成ms值
remUsTicks += MAXCALCTICKS * 5 % 8;//剩余的us值
}
当ticks625us的值小于MAXCALCTICKS时,则:
tmp = (ticks625us * 5) + remUsTicks;//计算上面剩下的时间(单位:ms)
elapsedMSec += tmp / 8;//计算最后的ms值
remUsTicks = tmp % 8;//剩余的us值,留给下次调用使用
5、更新OSAL时钟值与定时器值
osalClockUpdate( elapsedMSec );
osalTimerUpdate( elapsedMSec );
osalClockUpdate()更新时钟值
参数:
elapsedMSec-需要添加的时间(ms)
1、计算添加后的总秒数
timeMSec += elapsedMSec;
2、如果总秒数大于1000,则向分钟进位
if ( timeMSec >= 1000 )
{
OSAL_timeSeconds += timeMSec / 1000;
timeMSec = timeMSec % 1000;
}
osal_setClock()设置时钟值
参数:
newTime-新时间,如果是UTC时间,需要转换成ms单位
直接给UTC时间变量OSAL_timeSeconds赋值为要甚至的UTC时间:
OSAL_timeSeconds = newTime;
osal_getClock()获取当前时间
直接返回UTC时间变量OSAL_timeSeconds:
return ( OSAL_timeSeconds );
osal_ConvertUTCTime()将ms单位时间值转换成UTC时间值
参数:
tm-要保存的UTC格式结构体变量
secTime-从2000年1月1日00:00:00时间开始累计的秒数
1、计算在总天数:
uint32 day = secTime % DAY;
2、计算UTC时间的秒数:
tm->seconds = day % 60UL;
3、计算UTC时间分钟数:
tm->minutes = (day % 3600UL) / 60UL;
4、计算UTC时间的小时数:
tm->hour = day / 3600UL;
5、计算UTC时间的年份:
uint16 numDays = secTime / DAY;
tm->year = BEGYEAR;
while ( numDays >= YearLength( tm->year ) )
{
numDays -= YearLength( tm->year );
tm->year++;
}
6、计算UTC时间的月份:
tm->month = 0;
while ( numDays >= monthLength( IsLeapYear( tm->year ), tm->month ) )
{
numDays -= monthLength( IsLeapYear( tm->year ), tm->month );
tm->month++;
}
7、计算UTC时间的天数:
tm->day = numDays;
monthLength()计算月份的天数
参数:
lpyr-1表示闰年,0表示非闰年
1、mon=1,即二月,需要根据是否为闰年判断二月对应的天数。如果是闰年,则二月为28天,否则为29天。
if ( mon == 1 ) // feb
{
days = ( 28 + lpyr );
}
2、mon=0,2,4,6,7,9,11即一月、三月、五月、七月、八月、十月、十二月的天数为31天。
uint8 days = 31;
if ( mon > 6 ) // aug-dec
{
mon--;
}
3、mon=3,5,8,10即四月、六月、九月、十一月的天数为30天:
if ( mon & 1 )
{
days = 30;
}
osal_ConvertUTCSecs()将UTC时间转换成秒
参数:
tm-UTC时间对应的结构体变量
1、计算UTC时间的时分秒所对应的秒数:
seconds = (((tm->hour * 60UL) + tm->minutes) * 60UL) + tm->seconds;
2、计算UTC时间当前年份已经过去的天数:
int8 month = tm->month;
while ( --month >= 0 )
{
days += monthLength( IsLeapYear( tm->year ), month );
}
3、计算UTC时间之前年份的总天数:
uint16 year = tm->year;
while ( --year >= BEGYEAR )
{
days += YearLength( year );
}
4、计算UTC时间所对应的总秒数:
seconds += (days * DAY);
utc时间 单位换算_OSAL之时钟分析相关推荐
- utc时间 单位换算_数学基础知识点总结,常用单位换算长度、时间、面积等分类...
在所有的课程中间,数学贯穿了整个学习生涯,对于学生学习数学知识,要培养学生对数学应用价值的意识,能解决简单的实际问题.数学有助于学生理解现实生活中的数的意义,引导学生培养估算能力.下面就讲一下在实际教 ...
- utc时间 单位换算_c++ 时间类型详解 time_t
Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00 ...
- utc时间 单位换算_日期时间
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 使用time模块显示当前日期和时间 开发一个以多种格式显示当前时间和日期的程序.转换秒数为GMT时间.你要 ...
- utc时间 单位换算_一些时间的概念与区分(UTC、GMT、LT、TAI等)
UT - 世界时 Universal Time 世界时是最早的时间标准.在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104.以此标准形成的时间系统,称为世界时,即 UT1. 19 ...
- utc时间 单位换算_时间系统转换_北斗开放实验室
1. 下载包概述 BDT 采用国际单位制(SI)秒为基本单位连续累计,不闰秒,起始历元为 2006 年 1 月 1 日协调世界时(UTC) 00 时 00 分 00 秒,采用周和周内秒计数.BDT 通 ...
- 计算机系统中时间周期的单位,时间单位换算 (全),计算机单位换算大全
常用单位换算 长度单位换算 1千米=1000米 1米=10分米 1分米=10厘米 1米=100厘米 1厘米=10毫米 面积单位换算 1平方千米=100公顷 1公顷=10000平方米 1平方米=100平 ...
- 【计算理论】计算复杂性 ( 时间复杂度时间单位 : 步数 | 算法分析 | 算法复杂性分析 )
文章目录 一.时间复杂度时间单位 二.算法分析 三.算法复杂性分析 一.时间复杂度时间单位 图灵机计算时间 是根据 步数 进行定义的 , 图灵机走 111 步 , 时间加一 , 每一步的时间可能不一致 ...
- ms、s、min、h时间单位换算
一.背景 有一个延迟时间的字段数据,后端默认返回的是ms,但是返回的时候有可能数据量较大,所以需要前端根据后端返回的值去换算单位. 二.代码版本更迭 1. 第一版 思路: 根据后端返回的值和换算的临界 ...
- 微秒, 纳秒,毫秒, 时间单位换算
秒也是一个的时间单位,0.000 000 001 毫秒 = 1皮秒,0.000 001 毫秒 = 1纳秒,0.001 毫秒 = 1微秒,1毫秒等于0.001秒,60秒等于1分钟,60分钟等于1小时,2 ...
- java计算程序运行时间及时间单位换算
long startTime=System.currentTimeMillis(); for(int i=0;i<100;i++){ System.out.println("当前是:& ...
最新文章
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(添加均值、标准偏差)实战(dot plot)
- RASPBERRY PI 3 MODEL B 安装使用
- loading 遮罩demo
- java命令添加classpath_java和javac命令的classpath用法
- php导入csv wps乱码,《excel打开csv格式乱码》 WPS不兼容EXCEL打开后出现乱码怎么解决...
- 《二》Android 数据库 SQlite SQLiteOpenHelper
- MyEclipse 2016 安装/破解
- Android学习——写个小实例
- 8000份课程课后习题答案与大家分享~~
- android 比较全的android 源码合集 + 企业级应用分享,从业的积累(毕业设计集合版)
- rapidminer decision tree(决策树)手册
- 生物统计学(biostatistics)学习笔记(三)
- 解决 MDK 5 无法生成 .axf 文件的问题
- 使用Jacob将Excel转换PDF问题总结
- [转] Android Miracast投屏入门
- 示波器界面的中英文切换
- D-LINK DIR823PRO 路由器更新固件为openwrt-18.06.1 支持802.11s组建mesh
- 天津工业大学软件园 ubuntu电信网设置。
- 企业邮箱哪个好,公司邮箱品牌如何选择?
- win7 修改服务器属性,win7打印机服务器属性设置
热门文章
- 得力人脸识别考勤机密码设置_得力人脸识别考勤机使用与上传数据方法哪位清楚?...
- 智能优化算法——差分进化算法(Python实现)
- curl 命令测试post请求
- 【转】极品免费网站空间申请:000webhost.com免费1.5G美国空间PHP+MySQL
- 微信小程序 — 生成二维码功能
- Java 分页工具类
- Java中的Native方法实现(C++)
- mysql2014版本下载_Microsoft SQL Server 2014 Express
- 数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)
- 华为复制加密门禁卡_小米手机的NFC可以随便复制其它小区用的门禁卡吗?