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("当前是:& ...
最新文章
- 超越99.9%人类玩家,微软专业十段麻将AI论文细节首次公布
- 2021.4.11 字节跳动实习笔试题---情报解密
- 2017上半年软考 第七章 重要知识点
- centos普通用户修改文件权限_centos修改文件及文件夹权限
- 给终端装上宝可梦主题!小姐姐路过都爱上了!
- day41——多进程的消息队列、消息队列pipe
- python中函数和方法的区别
- 数平精准推荐 | OCR技术之数据篇
- Manager使用介绍
- HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
- Question of the Day: Microsoft | Database, Multiple Questions in One
- Linq to Oracle 使用教程(七)将数据库的存储过程映射到方法
- 如何让CSS动画中途停止并维持姿态
- [转载] 民兵葛二蛋——第31集
- 第一讲(3)osgearth编译
- 【学术相关】明尼苏达大学博导“约法十章”火了:没事不乱开会、合写论文不要催导师,复旦教授直呼值得学习...
- iMeta观点 | 短读长扩增子测序是否适用于微生物组功能的预测?
- 大数据分析图形绘制如何进行?
- 中国医学影像工作站市场趋势报告、技术动态创新及市场预测
- 揭秘!腾讯程序员告诉你当今最热门的5门编程语言