[core] Implement POSIX gettimeofday() and settimeofday()

This commit is contained in:
Kuba Szczodrzyński
2022-09-03 21:26:07 +02:00
parent 9b5013a694
commit 904af10914
6 changed files with 70 additions and 0 deletions

View File

@@ -77,6 +77,11 @@
#define LT_UART_DEFAULT_SERIAL LT_UART_DEFAULT_PORT
#endif
// Misc options
#ifndef LT_USE_TIME
#define LT_USE_TIME 0
#endif
// Per-module logging output - applies to all loglevels
#ifndef LT_DEBUG_ALL
#define LT_DEBUG_ALL 0

View File

@@ -41,6 +41,12 @@ void runPeriodicTasks() {
periodicTasks[0] = millis();
}
#endif
#if LT_USE_TIME
if (millis() - periodicTasks[1] > 10000) {
gettimeofday(NULL, NULL);
periodicTasks[1] = millis();
}
#endif
}
int main(void) {

View File

@@ -1,5 +1,7 @@
/* Copyright (c) Kuba Szczodrzyński 2022-05-16. */
#include <sys/time.h>
extern char *strdup(const char *);
extern int strcasecmp(const char *s1, const char *s2);
extern int strncasecmp(const char *s1, const char *s2, size_t n);

View File

@@ -0,0 +1,50 @@
/* Copyright (c) Kuba Szczodrzyński 2022-09-03. */
#include <Arduino.h>
#include <errno.h>
static uint32_t reset_epoch = 0; // epoch corresponding to millis() == 0
static uint32_t reset_millis = 0; // millis() when epoch reset was performed
int __wrap_gettimeofday(struct timeval *tv, void *tz) {
if (millis() < reset_millis) {
// the clock overflowed
reset_epoch += UINT32_MAX / 1000;
reset_millis = millis();
}
if (!tv) {
errno = EINVAL;
return -1;
}
unsigned long m = millis();
tv->tv_sec = reset_epoch + (m / 1000);
tv->tv_usec = (m % 1000) * 1000;
return 0;
}
int __wrap_settimeofday(const struct timeval *tv, const struct timezone *tz) {
if (!tv) {
errno = EINVAL;
return -1;
}
unsigned long m = millis();
reset_epoch = tv->tv_sec - (m / 1000);
reset_millis = m;
return 0;
}
int gettimeofday(struct timeval *tv, void *tz) {
return __wrap_gettimeofday(tv, tz);
}
int settimeofday(const struct timeval *tv, const struct timezone *tz) {
return __wrap_settimeofday(tv, tz);
}
int _gettimeofday(struct timeval *tv, void *tz) {
return __wrap_gettimeofday(tv, tz);
}
int _settimeofday(const struct timeval *tv, const struct timezone *tz) {
return __wrap_settimeofday(tv, tz);
}

View File

@@ -30,6 +30,9 @@ env.Append(
# wrappers from port/printf/
"-Wl,-wrap,putchar",
"-Wl,-wrap,puts",
# wrappers from posix/time.c
"-Wl,-wrap,gettimeofday",
"-Wl,-wrap,settimeofday",
],
)
# Arduino core uses __libc_init_array

View File

@@ -107,3 +107,7 @@ The meaning of most flags is as follows:
- `LT_ARD_HAS_MD5` - MD5 library implemented, `MD5Impl.h` available
- `LT_ARD_HAS_WIFI` - WiFi library implemented, `WiFiData.h` available
- `LT_HEAP_FUNC` - function name used to get available heap size (for `LT_HEAP_I()`)
### Misc options
- `LT_USE_TIME` - enables implementation of `gettimeofday()` and `settimeofday()`; checks for `millis()` overflows periodically