Add timer_save and _restore functions. (#23887)

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
This commit is contained in:
Dasky 2024-10-25 18:10:17 +01:00 committed by GitHub
parent f486605bab
commit 5c85271e48
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 42 additions and 0 deletions

View File

@ -25,6 +25,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// counter resolution 1ms // counter resolution 1ms
// NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }} // NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
volatile uint32_t timer_count; volatile uint32_t timer_count;
static uint32_t saved_ms;
/** \brief timer initialization /** \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 /** \brief timer read
* *
* FIXME: needs doc * FIXME: needs doc

View File

@ -5,6 +5,7 @@
static uint32_t ticks_offset = 0; static uint32_t ticks_offset = 0;
static uint32_t last_ticks = 0; static uint32_t last_ticks = 0;
static uint32_t ms_offset = 0; static uint32_t ms_offset = 0;
static uint32_t saved_ms = 0;
#if CH_CFG_ST_RESOLUTION < 32 #if CH_CFG_ST_RESOLUTION < 32
static uint32_t last_systime = 0; static uint32_t last_systime = 0;
static uint32_t overflow = 0; static uint32_t overflow = 0;
@ -73,6 +74,26 @@ void timer_clear(void) {
chSysUnlock(); 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) { uint16_t timer_read(void) {
return (uint16_t)timer_read32(); return (uint16_t)timer_read32();
} }

View File

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