Browse Source

Add timer_save and _restore functions. (#23887)

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
Dasky 1 year ago
parent
commit
5c85271e48
3 changed files with 42 additions and 0 deletions
  1. 19 0
      platforms/avr/timer.c
  2. 21 0
      platforms/chibios/timer.c
  3. 2 0
      platforms/timer.h

+ 19 - 0
platforms/avr/timer.c

@@ -25,6 +25,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // counter resolution 1ms
 // NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
 volatile uint32_t timer_count;
+static uint32_t   saved_ms;
 
 /** \brief timer initialization
  *
@@ -78,6 +79,24 @@ inline void timer_clear(void) {
     }
 }
 
+/** \brief timer save
+ *
+ * Set saved_ms to current time.
+ */
+void timer_save(void) {
+    saved_ms = timer_read32();
+}
+
+/** \brief timer restore
+ *
+ * Set timer_count to saved_ms
+ */
+void timer_restore(void) {
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+        timer_count = saved_ms;
+    }
+}
+
 /** \brief timer read
  *
  * FIXME: needs doc

+ 21 - 0
platforms/chibios/timer.c

@@ -5,6 +5,7 @@
 static uint32_t ticks_offset = 0;
 static uint32_t last_ticks   = 0;
 static uint32_t ms_offset    = 0;
+static uint32_t saved_ms     = 0;
 #if CH_CFG_ST_RESOLUTION < 32
 static uint32_t last_systime = 0;
 static uint32_t overflow     = 0;
@@ -73,6 +74,26 @@ void timer_clear(void) {
     chSysUnlock();
 }
 
+__attribute__((weak)) void platform_timer_save_value(uint32_t value) {
+    saved_ms = value;
+}
+
+__attribute__((weak)) uint32_t platform_timer_restore_value(void) {
+    return saved_ms;
+}
+
+void timer_restore(void) {
+    chSysLock();
+    ticks_offset = get_system_time_ticks();
+    last_ticks   = 0;
+    ms_offset    = platform_timer_restore_value();
+    chSysUnlock();
+}
+
+void timer_save(void) {
+    platform_timer_save_value(timer_read32());
+}
+
 uint16_t timer_read(void) {
     return (uint16_t)timer_read32();
 }

+ 2 - 0
platforms/timer.h

@@ -38,6 +38,8 @@ extern volatile uint32_t timer_count;
 
 void     timer_init(void);
 void     timer_clear(void);
+void     timer_save(void);
+void     timer_restore(void);
 uint16_t timer_read(void);
 uint32_t timer_read32(void);
 uint16_t timer_elapsed(uint16_t last);