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. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(添加均值、标准偏差)实战(dot plot)
  2. RASPBERRY PI 3 MODEL B 安装使用
  3. loading 遮罩demo
  4. java命令添加classpath_java和javac命令的classpath用法
  5. php导入csv wps乱码,《excel打开csv格式乱码》 WPS不兼容EXCEL打开后出现乱码怎么解决...
  6. 《二》Android 数据库 SQlite SQLiteOpenHelper
  7. MyEclipse 2016 安装/破解
  8. Android学习——写个小实例
  9. 8000份课程课后习题答案与大家分享~~
  10. android 比较全的android 源码合集 + 企业级应用分享,从业的积累(毕业设计集合版)
  11. rapidminer decision tree(决策树)手册
  12. 生物统计学(biostatistics)学习笔记(三)
  13. 解决 MDK 5 无法生成 .axf 文件的问题
  14. 使用Jacob将Excel转换PDF问题总结
  15. [转] Android Miracast投屏入门
  16. 示波器界面的中英文切换
  17. D-LINK DIR823PRO 路由器更新固件为openwrt-18.06.1 支持802.11s组建mesh
  18. 天津工业大学软件园 ubuntu电信网设置。
  19. 企业邮箱哪个好,公司邮箱品牌如何选择?
  20. win7 修改服务器属性,win7打印机服务器属性设置

热门文章

  1. 得力人脸识别考勤机密码设置_得力人脸识别考勤机使用与上传数据方法哪位清楚?...
  2. 智能优化算法——差分进化算法(Python实现)
  3. curl 命令测试post请求
  4. 【转】极品免费网站空间申请:000webhost.com免费1.5G美国空间PHP+MySQL
  5. 微信小程序 — 生成二维码功能
  6. Java 分页工具类
  7. Java中的Native方法实现(C++)
  8. mysql2014版本下载_Microsoft SQL Server 2014 Express
  9. 数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)
  10. 华为复制加密门禁卡_小米手机的NFC可以随便复制其它小区用的门禁卡吗?