首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 光电技术

OSAL之时钟分析

嵌入式 | 发布时间:2017-10-04 | 人气: | #评论# |本文关键字:OSAL,时钟
摘要:OSAL 的时钟实现在 OSAL_CockBLE.c 与 OSAL_Clock.h 两个文件中。 OSAL 支持完整的 UTC( 世界统一时间 ) ,以 2000 年 1 月 1 日 00:00:00 为时间起点,可以精确到年、月、日、时、分、秒的时间值。

OSAL的时钟实现在OSAL_CockBLE.cOSAL_Clock.h两个文件中。OSAL支持完整的UTC(世界统一时间),以20001100: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年左右,如果UTC2000年为起点,则最长可以设置的时间为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-20001100: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表示非闰年

1mon=1,即二月,需要根据是否为闰年判断二月对应的天数。如果是闰年,则二月为28天,否则为29天。

if ( mon == 1 ) // feb{  days = ( 28 + lpyr );}

2mon=0,2,4,6,7,9,11即一月、三月、五月、七月、八月、十月、十二月的天数为31天。

uint8 days = 31;if ( mon > 6 ) // aug-dec{  mon--;}

3mon=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);

责任编辑:电气自动化网

热门文章

首页 | 资讯 | 应用 | 高压 | 设计 | 行业 | 低压 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。