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:
		
							parent
							
								
									f486605bab
								
							
						
					
					
						commit
						5c85271e48
					
				
					 3 changed files with 42 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue