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之时钟分析相关推荐

  1. utc时间 单位换算_数学基础知识点总结,常用单位换算长度、时间、面积等分类...

    在所有的课程中间,数学贯穿了整个学习生涯,对于学生学习数学知识,要培养学生对数学应用价值的意识,能解决简单的实际问题.数学有助于学生理解现实生活中的数的意义,引导学生培养估算能力.下面就讲一下在实际教 ...

  2. utc时间 单位换算_c++ 时间类型详解 time_t

    Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00 ...

  3. utc时间 单位换算_日期时间

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 使用time模块显示当前日期和时间 开发一个以多种格式显示当前时间和日期的程序.转换秒数为GMT时间.你要 ...

  4. utc时间 单位换算_一些时间的概念与区分(UTC、GMT、LT、TAI等)

    UT - 世界时 Universal Time 世界时是最早的时间标准.在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104.以此标准形成的时间系统,称为世界时,即 UT1. 19 ...

  5. utc时间 单位换算_时间系统转换_北斗开放实验室

    1. 下载包概述 BDT 采用国际单位制(SI)秒为基本单位连续累计,不闰秒,起始历元为 2006 年 1 月 1 日协调世界时(UTC) 00 时 00 分 00 秒,采用周和周内秒计数.BDT 通 ...

  6. 计算机系统中时间周期的单位,时间单位换算 (全),计算机单位换算大全

    常用单位换算 长度单位换算 1千米=1000米 1米=10分米 1分米=10厘米 1米=100厘米 1厘米=10毫米 面积单位换算 1平方千米=100公顷 1公顷=10000平方米 1平方米=100平 ...

  7. 【计算理论】计算复杂性 ( 时间复杂度时间单位 : 步数 | 算法分析 | 算法复杂性分析 )

    文章目录 一.时间复杂度时间单位 二.算法分析 三.算法复杂性分析 一.时间复杂度时间单位 图灵机计算时间 是根据 步数 进行定义的 , 图灵机走 111 步 , 时间加一 , 每一步的时间可能不一致 ...

  8. ms、s、min、h时间单位换算

    一.背景 有一个延迟时间的字段数据,后端默认返回的是ms,但是返回的时候有可能数据量较大,所以需要前端根据后端返回的值去换算单位. 二.代码版本更迭 1. 第一版 思路: 根据后端返回的值和换算的临界 ...

  9. 微秒, 纳秒,毫秒, 时间单位换算

    秒也是一个的时间单位,0.000 000 001 毫秒 = 1皮秒,0.000 001 毫秒 = 1纳秒,0.001 毫秒 = 1微秒,1毫秒等于0.001秒,60秒等于1分钟,60分钟等于1小时,2 ...

  10. java计算程序运行时间及时间单位换算

    long startTime=System.currentTimeMillis(); for(int i=0;i<100;i++){ System.out.println("当前是:& ...

最新文章

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

热门文章

  1. 用戶故事 vs 用例
  2. LitJson使用中的一些问题
  3. u-boot-2012.04.01 移植笔记
  4. SpreadJS 15.1 CN 与 SpreadJS 15.1 EN
  5. C#中的IntPtr
  6. Oracle JDBC 驱动
  7. python导入鸢尾花数据集_python KNN算法实现鸢尾花数据集分类
  8. 2022全新二开影视源码app源码完整版
  9. pdf格式文件转换成mobi
  10. 山体滑坡动画用什么软件制作_做施工动画是用什么软件来做