diff options
| author | Bernard Xiong <[email protected]> | 2021-02-20 12:12:56 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-02-20 12:12:56 +0800 |
| commit | b204651517aa1840d778f2f6fcfdc40207cab753 (patch) | |
| tree | d9fc79f86a3d5de3d8d8a82c48da313a4976c9e4 /components/libc/compilers | |
| parent | e596921019839fdaf1c0c2c76a1aa13f4c083299 (diff) | |
| parent | 598aa86f750bdc96ffb427fc8507a426a99fc63f (diff) | |
Merge pull request #4333 from mysterywolf/pthread
[pthread][libc][time] 修改pthread与libc的时间函数若干问题
Diffstat (limited to 'components/libc/compilers')
| -rw-r--r-- | components/libc/compilers/armlibc/libc_syms.c | 7 | ||||
| -rw-r--r-- | components/libc/compilers/common/sys/time.h | 36 | ||||
| -rw-r--r-- | components/libc/compilers/common/time.c | 197 | ||||
| -rw-r--r-- | components/libc/compilers/common/unistd.c | 27 | ||||
| -rw-r--r-- | components/libc/compilers/newlib/libc_syms.c | 4 |
5 files changed, 258 insertions, 13 deletions
diff --git a/components/libc/compilers/armlibc/libc_syms.c b/components/libc/compilers/armlibc/libc_syms.c index 0e1c42d899..a2e8af17f1 100644 --- a/components/libc/compilers/armlibc/libc_syms.c +++ b/components/libc/compilers/armlibc/libc_syms.c @@ -10,8 +10,6 @@ #include <stdlib.h> #include <string.h> #include <ctype.h> -#include <time.h> - #include <rtm.h> /* some export routines for module */ @@ -35,11 +33,6 @@ RTM_EXPORT(memchr); RTM_EXPORT(toupper); RTM_EXPORT(atoi); -#ifdef RT_USING_RTC -RTM_EXPORT(localtime); -RTM_EXPORT(time); -#endif - /* import the full stdio for printf */ #if defined(RT_USING_MODULE) && defined(__MICROLIB) #error "[RT_USING_LIBC] Please use standard libc but not microlib." diff --git a/components/libc/compilers/common/sys/time.h b/components/libc/compilers/common/sys/time.h index 599b8b5262..e4d60d2d11 100644 --- a/components/libc/compilers/common/sys/time.h +++ b/components/libc/compilers/common/sys/time.h @@ -6,10 +6,12 @@ * Change Logs: * Date Author Notes * 2020-09-07 Meco Man combine gcc armcc iccarm + * 2021-02-12 Meco Man move all definitions located in <clock_time.h> to this file */ #ifndef _SYS_TIME_H_ #define _SYS_TIME_H_ +#include <rtconfig.h> #include <time.h> #ifdef __cplusplus @@ -53,6 +55,40 @@ time_t timegm(struct tm * const t); int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv, const struct timezone *tz); +#ifdef RT_USING_POSIX +#include <sys/types.h> +/* posix clock and timer */ +#define MILLISECOND_PER_SECOND 1000UL +#define MICROSECOND_PER_SECOND 1000000UL +#define NANOSECOND_PER_SECOND 1000000000UL + +#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND) +#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND) +#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND) + +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 1 +#endif + +#define CLOCK_CPUTIME_ID 2 + +#ifndef CLOCK_PROCESS_CPUTIME_ID +#define CLOCK_PROCESS_CPUTIME_ID CLOCK_CPUTIME_ID +#endif +#ifndef CLOCK_THREAD_CPUTIME_ID +#define CLOCK_THREAD_CPUTIME_ID CLOCK_CPUTIME_ID +#endif + +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC 4 +#endif + +int clock_getres (clockid_t clockid, struct timespec *res); +int clock_gettime (clockid_t clockid, struct timespec *tp); +int clock_settime (clockid_t clockid, const struct timespec *tp); +int clock_time_to_tick(const struct timespec *time); +#endif /* RT_USING_POSIX */ + #ifdef __cplusplus } #endif diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c index a980f742fb..c2fbd6f333 100644 --- a/components/libc/compilers/common/time.c +++ b/components/libc/compilers/common/time.c @@ -14,6 +14,9 @@ * 2021-02-11 Meco Man fix bug #3183 - align days[] and months[] to 4 bytes * add difftime() * 2021-02-12 Meco Man add errno + * 2012-12-08 Bernard <clock_time.c> fix the issue of _timevalue.tv_usec initialization, + * which found by Rob <[email protected]> + * 2021-02-12 Meco Man move all of the functions located in <clock_time.c> to this file */ #include <sys/time.h> @@ -26,7 +29,7 @@ #define SPD 24*60*60 /* days per month -- nonleap! */ -const short __spm[13] = +static const short __spm[13] = { 0, (31), @@ -97,12 +100,14 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r) r->tm_isdst = 0; return r; } +RTM_EXPORT(gmtime_r); struct tm* gmtime(const time_t* t) { static struct tm tmp; return gmtime_r(t, &tmp); } +RTM_EXPORT(gmtime); /*TODO: timezone */ struct tm* localtime_r(const time_t* t, struct tm* r) @@ -114,18 +119,21 @@ struct tm* localtime_r(const time_t* t, struct tm* r) local_tz = *t + utc_plus * 3600; return gmtime_r(&local_tz, r); } +RTM_EXPORT(localtime_r); struct tm* localtime(const time_t* t) { static struct tm tmp; return localtime_r(t, &tmp); } +RTM_EXPORT(localtime); /* TODO: timezone */ time_t mktime(struct tm * const t) { return timegm(t); } +RTM_EXPORT(mktime); char* asctime_r(const struct tm *t, char *buf) { @@ -147,28 +155,33 @@ char* asctime_r(const struct tm *t, char *buf) buf[24] = '\n'; return buf; } +RTM_EXPORT(asctime_r); char* asctime(const struct tm *timeptr) { static char buf[25]; return asctime_r(timeptr, buf); } +RTM_EXPORT(asctime); char *ctime_r (const time_t * tim_p, char * result) { struct tm tm; return asctime_r (localtime_r (tim_p, &tm), result); } +RTM_EXPORT(ctime_r); char* ctime(const time_t *tim_p) { return asctime (localtime (tim_p)); } +RTM_EXPORT(ctime); double difftime (time_t tim1, time_t tim2) { return (double)(tim1 - tim2); } +RTM_EXPORT(difftime); /** * Returns the current time. @@ -216,11 +229,13 @@ RT_WEAK time_t time(time_t *t) return time_now; } +RTM_EXPORT(time); RT_WEAK clock_t clock(void) { return rt_tick_get(); } +RTM_EXPORT(clock); int stime(const time_t *t) { @@ -246,6 +261,7 @@ int stime(const time_t *t) return -1; #endif /* RT_USING_RTC */ } +RTM_EXPORT(stime); time_t timegm(struct tm * const t) { @@ -320,6 +336,7 @@ time_t timegm(struct tm * const t) i = 60; return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec; } +RTM_EXPORT(timegm); /* TODO: timezone */ int gettimeofday(struct timeval *tv, struct timezone *tz) @@ -338,6 +355,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz) return -1; } } +RTM_EXPORT(gettimeofday); /* TODO: timezone */ int settimeofday(const struct timeval *tv, const struct timezone *tz) @@ -352,3 +370,180 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz) return -1; } } +RTM_EXPORT(settimeofday); + +#ifdef RT_USING_POSIX +static struct timeval _timevalue; +static int clock_time_system_init() +{ + time_t time; + rt_tick_t tick; + rt_device_t device; + + time = 0; + device = rt_device_find("rtc"); + if (device != RT_NULL) + { + /* get realtime seconds */ + rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time); + } + + /* get tick */ + tick = rt_tick_get(); + + _timevalue.tv_usec = (tick%RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK; + _timevalue.tv_sec = time - tick/RT_TICK_PER_SECOND - 1; + + return 0; +} +INIT_COMPONENT_EXPORT(clock_time_system_init); + +int clock_getres(clockid_t clockid, struct timespec *res) +{ + int ret = 0; + + if (res == RT_NULL) + { + rt_set_errno(EINVAL); + return -1; + } + + switch (clockid) + { + case CLOCK_REALTIME: + res->tv_sec = 0; + res->tv_nsec = NANOSECOND_PER_SECOND/RT_TICK_PER_SECOND; + break; + +#ifdef RT_USING_CPUTIME + case CLOCK_CPUTIME_ID: + res->tv_sec = 0; + res->tv_nsec = clock_cpu_getres(); + break; +#endif + + default: + ret = -1; + rt_set_errno(EINVAL); + break; + } + + return ret; +} +RTM_EXPORT(clock_getres); + +int clock_gettime(clockid_t clockid, struct timespec *tp) +{ + int ret = 0; + + if (tp == RT_NULL) + { + rt_set_errno(EINVAL); + return -1; + } + + switch (clockid) + { + case CLOCK_REALTIME: + { + /* get tick */ + int tick = rt_tick_get(); + + tp->tv_sec = _timevalue.tv_sec + tick / RT_TICK_PER_SECOND; + tp->tv_nsec = (_timevalue.tv_usec + (tick % RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK) * 1000; + } + break; + +#ifdef RT_USING_CPUTIME + case CLOCK_CPUTIME_ID: + { + float unit = 0; + long long cpu_tick; + + unit = clock_cpu_getres(); + cpu_tick = clock_cpu_gettime(); + + tp->tv_sec = ((int)(cpu_tick * unit)) / NANOSECOND_PER_SECOND; + tp->tv_nsec = ((int)(cpu_tick * unit)) % NANOSECOND_PER_SECOND; + } + break; +#endif + default: + rt_set_errno(EINVAL); + ret = -1; + } + + return ret; +} +RTM_EXPORT(clock_gettime); + +int clock_settime(clockid_t clockid, const struct timespec *tp) +{ + int second; + rt_tick_t tick; + rt_device_t device; + + if ((clockid != CLOCK_REALTIME) || (tp == RT_NULL)) + { + rt_set_errno(EINVAL); + + return -1; + } + + /* get second */ + second = tp->tv_sec; + /* get tick */ + tick = rt_tick_get(); + + /* update timevalue */ + _timevalue.tv_usec = MICROSECOND_PER_SECOND - (tick % RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK; + _timevalue.tv_sec = second - tick/RT_TICK_PER_SECOND - 1; + + /* update for RTC device */ + device = rt_device_find("rtc"); + if (device != RT_NULL) + { + /* set realtime seconds */ + rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &second); + } + else + return -1; + + return 0; +} +RTM_EXPORT(clock_settime); + +int clock_time_to_tick(const struct timespec *time) +{ + int tick; + int nsecond, second; + struct timespec tp; + + RT_ASSERT(time != RT_NULL); + + tick = RT_WAITING_FOREVER; + if (time != NULL) + { + /* get current tp */ + clock_gettime(CLOCK_REALTIME, &tp); + + if ((time->tv_nsec - tp.tv_nsec) < 0) + { + nsecond = NANOSECOND_PER_SECOND - (tp.tv_nsec - time->tv_nsec); + second = time->tv_sec - tp.tv_sec - 1; + } + else + { + nsecond = time->tv_nsec - tp.tv_nsec; + second = time->tv_sec - tp.tv_sec; + } + + tick = second * RT_TICK_PER_SECOND + nsecond * RT_TICK_PER_SECOND / NANOSECOND_PER_SECOND; + if (tick < 0) tick = 0; + } + + return tick; +} +RTM_EXPORT(clock_time_to_tick); + +#endif /* RT_USING_POSIX */ diff --git a/components/libc/compilers/common/unistd.c b/components/libc/compilers/common/unistd.c index df970b2b59..48e6beee4e 100644 --- a/components/libc/compilers/common/unistd.c +++ b/components/libc/compilers/common/unistd.c @@ -5,10 +5,13 @@ * * Change Logs: * Date Author Notes - * 2020-09-01 Meco Man First Version + * 2020-09-01 Meco Man first Version + * 2021-02-12 Meco Man move all functions located in <pthread_sleep.c> to this file */ #include <unistd.h> +#include <rtthread.h> +#include <rthw.h> #ifdef RT_USING_POSIX_TERMIOS #include "termios.h" @@ -18,9 +21,31 @@ int isatty(int fd) struct termios ts; return(tcgetattr(fd,&ts) != -1);/*true if no error (is a tty)*/ } +RTM_EXPORT(isatty); #endif char *ttyname(int fd) { return "/dev/tty0"; /*TODO: need to add more specific*/ } +RTM_EXPORT(ttyname); + +unsigned int sleep(unsigned int seconds) +{ + rt_tick_t delta_tick; + + delta_tick = rt_tick_get(); + rt_thread_delay(seconds * RT_TICK_PER_SECOND); + delta_tick = rt_tick_get() - delta_tick; + + return seconds - delta_tick/RT_TICK_PER_SECOND; +} +RTM_EXPORT(sleep); + +int usleep(useconds_t usec) +{ + rt_thread_mdelay(usec / 1000u); + rt_hw_us_delay(usec % 1000u); + return 0; +} +RTM_EXPORT(usleep); diff --git a/components/libc/compilers/newlib/libc_syms.c b/components/libc/compilers/newlib/libc_syms.c index b150c10fd6..4b0ee355f0 100644 --- a/components/libc/compilers/newlib/libc_syms.c +++ b/components/libc/compilers/newlib/libc_syms.c @@ -39,10 +39,6 @@ RTM_EXPORT(snprintf); RTM_EXPORT(fwrite); -#include <time.h> -RTM_EXPORT(localtime); -RTM_EXPORT(time); - #include <setjmp.h> RTM_EXPORT(longjmp); RTM_EXPORT(setjmp); |
