From 479b961d393ab20c62bd6234b054d53469dda645 Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Sat, 22 Oct 2016 20:15:26 +0300 Subject: [PATCH] zephyr: Implement utime module. This provides time and sleep together with the usual ticks_us/_ms/_diff and sleep_us/ms family. We also provide access to Zephyr's high precision timer as ticks_cpu(). Signed-off-by: Daniel Thompson --- zephyr/Makefile | 1 + zephyr/modutime.c | 66 +++++++++++++++++++++++++++++++++++++++++++ zephyr/mpconfigport.h | 13 +++++++++ zephyr/mphalport.h | 27 +++++++++++++++++- 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 zephyr/modutime.c diff --git a/zephyr/Makefile b/zephyr/Makefile index 9682dc5ccf..bf0d9c959f 100644 --- a/zephyr/Makefile +++ b/zephyr/Makefile @@ -34,6 +34,7 @@ INC += -I$(ZEPHYR_BASE)/net/ip/contiki/os SRC_C = main.c \ help.c \ + modutime.c \ uart_core.c \ lib/utils/stdout_helpers.c \ lib/utils/printf.c \ diff --git a/zephyr/modutime.c b/zephyr/modutime.c new file mode 100644 index 0000000000..b18d6b837c --- /dev/null +++ b/zephyr/modutime.c @@ -0,0 +1,66 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2013, 2014 Damien P. George + * Copyright (c) 2016 Linaro Limited + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/mpconfig.h" +#if MICROPY_PY_UTIME + +#include + +#include "py/runtime.h" +#include "py/smallint.h" +#include "py/mphal.h" +#include "extmod/utime_mphal.h" + +STATIC mp_obj_t mod_time_time(void) { + /* The absense of FP support is deliberate. The Zephyr port uses + * single precision floats so the fraction component will start to + * lose precision on devices with a long uptime. + */ + return mp_obj_new_int(sys_tick_get() / sys_clock_ticks_per_sec); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_time_time_obj, mod_time_time); + +STATIC const mp_rom_map_elem_t mp_module_time_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) }, + { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) }, + { MP_ROM_QSTR(MP_QSTR_sleep_ms), MP_ROM_PTR(&mp_utime_sleep_ms_obj) }, + { MP_ROM_QSTR(MP_QSTR_sleep_us), MP_ROM_PTR(&mp_utime_sleep_us_obj) }, + { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&mod_time_time_obj) }, + { MP_ROM_QSTR(MP_QSTR_ticks_ms), MP_ROM_PTR(&mp_utime_ticks_ms_obj) }, + { MP_ROM_QSTR(MP_QSTR_ticks_us), MP_ROM_PTR(&mp_utime_ticks_us_obj) }, + { MP_ROM_QSTR(MP_QSTR_ticks_cpu), MP_ROM_PTR(&mp_utime_ticks_cpu_obj) }, + { MP_ROM_QSTR(MP_QSTR_ticks_diff), MP_ROM_PTR(&mp_utime_ticks_diff_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(mp_module_time_globals, mp_module_time_globals_table); + +const mp_obj_module_t mp_module_time = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&mp_module_time_globals, +}; + +#endif // MICROPY_PY_UTIME diff --git a/zephyr/mpconfigport.h b/zephyr/mpconfigport.h index 1654e79b8c..327719459d 100644 --- a/zephyr/mpconfigport.h +++ b/zephyr/mpconfigport.h @@ -54,6 +54,8 @@ #define MICROPY_PY_IO (0) #define MICROPY_PY_MICROPYTHON_MEM_INFO (1) #define MICROPY_PY_STRUCT (0) +#define MICROPY_PY_UTIME (1) +#define MICROPY_PY_UTIME_MP_HAL (1) #define MICROPY_PY_SYS_MODULES (0) #define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_LONGLONG) #define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) @@ -77,6 +79,17 @@ typedef long mp_off_t; mp_obj_t mp_kbd_exception; \ const char *readline_hist[8]; +extern const struct _mp_obj_module_t mp_module_time; + +#if MICROPY_PY_UTIME +#define MICROPY_PY_UTIME_DEF { MP_ROM_QSTR(MP_QSTR_utime), MP_ROM_PTR(&mp_module_time) }, +#else +#define MICROPY_PY_UTIME_DEF +#endif + +#define MICROPY_PORT_BUILTIN_MODULES \ + MICROPY_PY_UTIME_DEF \ + // extra built in names to add to the global namespace #define MICROPY_PORT_BUILTINS \ { MP_OBJ_NEW_QSTR(MP_QSTR_help), (mp_obj_t)&mp_builtin_help_obj }, \ diff --git a/zephyr/mphalport.h b/zephyr/mphalport.h index 1bb64e0002..594bdd6d07 100644 --- a/zephyr/mphalport.h +++ b/zephyr/mphalport.h @@ -1 +1,26 @@ -static inline mp_uint_t mp_hal_ticks_ms(void) { return 0; } +#include + +static inline mp_uint_t mp_hal_ticks_us(void) { + return sys_tick_get() * sys_clock_us_per_tick; +} + +static inline mp_uint_t mp_hal_ticks_ms(void) { + int64_t us = sys_tick_get() * sys_clock_us_per_tick; + mp_int_t ms = us / 1000; + return ms; +} + +static inline mp_uint_t mp_hal_ticks_cpu(void) { + // ticks_cpu() is defined as using the highest-resolution timing source + // in the system. This is usually a CPU clock, but doesn't have to be, + // here we just use Zephyr hi-res timer. + return sys_cycle_get_32(); +} + +static inline void mp_hal_delay_us(mp_uint_t delay) { + task_sleep(USEC(delay)); +} + +static inline void mp_hal_delay_ms(mp_uint_t delay) { + task_sleep(MSEC(delay)); +}