123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- ********************************************************************************
- **
- ** \file ./boot/startup/src/time.c
- **
- ** \version $Id: time.c 6426 2016-03-22 05:49:59Z liuwei $
- **
- ** \brief ARM1176 RealView libc function retargeting.
- **
- ** This files general (compiler independent) time specific retargets.
- **
- ** \attention THIS SAMPLE CODE IS PROVIDED AS IS. FUJITSU MICROELECTRONICS
- ** ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR
- ** OMMISSIONS.
- **
- ** (C) Copyright 2006-2010 by Fujitsu Microelectronics Europe GmbH
- ** (C) Copyright 2010 by Fujitsu Semiconductor Europe GmbH
- **
- ********************************************************************************
- **
- ** \note The following LINT statements have been suppressed:
- **
- **
- *****************************************************************************
- */
- #include <rtthread.h>
- #include <sys/time.h>
- #include <time.h>
- #include "internal.h"
- /* Checks if a type is signed or unsigned */
- /*lint -emacro((506), IS_SIGNED) */
- /*lint -e(961) */
- #define IS_SIGNED(type) (((type) -1) < 0)
- /* Calculates maximum positive value for given scalar type with respect */
- /*lint -e(961) */
- #define POSITIVE_MAX_OF_TYPE(type) \
- ((type) (IS_SIGNED(type) ? \
- ((1LL << ((sizeof(type) * 8) - 1)) - 1) : \
- (-1)))
- /* Precalculate maximum type positive type values */
- #define Int64TMax (9223372036854775807LL)
- static const clock_t ClockTMax = (POSITIVE_MAX_OF_TYPE(clock_t));
- #if defined(__arm__) && !defined(__GNUC__) /* RVCT v3- */
- static const time_t TimeTMax = (POSITIVE_MAX_OF_TYPE(time_t) - 1);
- #else
- static const time_t TimeTMax = (POSITIVE_MAX_OF_TYPE(time_t));
- #endif
- static int64_t systemTimeBase = 0LL;
- static int32_t get_system_time( time_t *time )
- {
- int32_t rc = 0;
- uint64_t ts = rt_tick_get()/1000; //seconed
- /* check input parameter */
- if (time == NULL) {
- rc = -1;
- }
- /* check for time overflow */
- else if ((ts > Int64TMax) || /* pre-check downcast precision loss */
- ((int64_t) ts > ((int64_t) TimeTMax - systemTimeBase))) {
- rc = -1;
- }
- else {
- *time = (time_t) (systemTimeBase + (int64_t) ts);
- }
- return (rc);
- }
- /*
- ********************************************************************************
- ** \brief Retarget implementation of the stdc library function.
- **
- ** This is the standard C library clock() function from time.h.
- **
- ** This function returns the implementation's best approximation to the
- ** processor time used by the program since program invocation.
- **
- ** \return Returns elapsed processor time used by program. The time in seconds
- ** is the value returned divided by the value of the macro CLOCKS_PER_SEC.
- ** The value ((clock_t) -1) is returned if the processor time used is
- ** not available or invalid.
- ********************************************************************************
- */
- clock_t clock(void)
- {
- clock_t c;
- if (get_system_time((time_t*)&c) != 0) {
- c = (clock_t) -1;
- }
- return (c);
- }
- /*
- ********************************************************************************
- ** \brief Retarget implementation of the stdc library function.
- **
- ** This is the standard C library time() function from time.h.
- **
- ** This function returns an approximation of the current calendar time.
- **
- ** \param timer Return value resource for time_t. If timer is not a
- ** NULL pointer, the return value is also assigned to the time_t*.
- **
- ** \return Returns current calendar time, which represents the number of seconds
- ** elapsed since 00:00:00 on January 1, 1970, Coordinated Universal Time.
- ** (This date is sometimes referred to as the epoch.)
- ** The value ((time_t) -1) is returned if the calendar time is not available.
- ********************************************************************************
- */
- time_t time(time_t * timer)
- {
- time_t tv;
- if (get_system_time(&tv) != 0) {
- tv = (time_t) -1;
- }
- if (timer) {
- *timer = tv;
- }
- return (tv);
- }
- int gettimeofday(struct timeval *tp, void *tzvp)
- {
- time_t tvl;
- get_system_time(&tvl);
- tp->tv_sec = tvl;
- tp->tv_usec = (rt_tick_get()%1000) * 1000;
- return (0);
- }
- int settimeofday(const struct timeval *tv, const struct timezone *tz)
- {
- if(tv )
- systemTimeBase = tv->tv_sec + tv->tv_usec/1000000 - rt_tick_get()/1000;
- return 0;
- }
|