From 8926fd02f0d436c2922dd96e08945963eb06c5ba Mon Sep 17 00:00:00 2001
From: Rahix <rahix@rahix.de>
Date: Wed, 13 Nov 2019 15:31:33 +0100
Subject: [PATCH] feat(utime): Implement ticks_ms() and ticks_us()

Implement the hal functions necessary for utime.ticks_ms() and
utime.ticks_us().  This enables much more accurate measurements of time
taken in Pycardium (useful for profiling).

Please note that the tick counter will reset whenever a new app is
loaded.

Signed-off-by: Rahix <rahix@rahix.de>
---
 Documentation/pycardium/utime.rst | 14 ++++++++++++++
 pycardium/modules/utime.c         |  2 ++
 pycardium/mphalport.c             |  7 ++++++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/Documentation/pycardium/utime.rst b/Documentation/pycardium/utime.rst
index 30af11ef..b28d7b11 100644
--- a/Documentation/pycardium/utime.rst
+++ b/Documentation/pycardium/utime.rst
@@ -45,6 +45,20 @@ alarm.
 
    .. versionadded:: 1.11
 
+.. py:function:: ticks_ms()
+
+   Return processor ticks (converted to milliseconds) since Pycardium startup.
+
+   This function should be the preferred method for timing and profiling
+   because it does not need an API call and thus is very fast.
+
+.. py:function:: ticks_us()
+
+   Return processor ticks (converted to microseconds) since Pycardium startup.
+
+   This function should be the preferred method for timing and profiling
+   because it does not need an API call and thus is very fast.
+
 .. py:function:: unix_time()
 
    Return the current unix time as seconds since the epoch.
diff --git a/pycardium/modules/utime.c b/pycardium/modules/utime.c
index f6fd365b..d2970820 100644
--- a/pycardium/modules/utime.c
+++ b/pycardium/modules/utime.c
@@ -202,6 +202,8 @@ static const mp_rom_map_elem_t time_module_globals_table[] = {
 	{ 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_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_alarm), MP_ROM_PTR(&time_alarm_obj) },
 #if 0
 	/* TODO: Implement those */
diff --git a/pycardium/mphalport.c b/pycardium/mphalport.c
index 3e0c6de1..95954bba 100644
--- a/pycardium/mphalport.c
+++ b/pycardium/mphalport.c
@@ -271,7 +271,12 @@ void mp_hal_delay_us(mp_uint_t us)
 
 mp_uint_t mp_hal_ticks_ms(void)
 {
-	return 0;
+	return (mp_uint_t)(systick_get_us() / 1000);
+}
+
+mp_uint_t mp_hal_ticks_us(void)
+{
+	return (mp_uint_t)systick_get_us();
 }
 
 /******************************************************************************
-- 
GitLab