at master 2.5 kB view raw
1/* 2Copyright 2011 Jun Wako <wakojun@gmail.com> 3Copyright 2021 Simon Arlott 4 5This program is free software: you can redistribute it and/or modify 6it under the terms of the GNU General Public License as published by 7the Free Software Foundation, either version 2 of the License, or 8(at your option) any later version. 9 10This program is distributed in the hope that it will be useful, 11but WITHOUT ANY WARRANTY; without even the implied warranty of 12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13GNU General Public License for more details. 14 15You should have received a copy of the GNU General Public License 16along with this program. If not, see <http://www.gnu.org/licenses/>. 17*/ 18 19#pragma once 20 21#if __has_include_next("_timer.h") 22# include_next "_timer.h" /* Include the platform's _timer.h */ 23#endif 24 25#include <stdint.h> 26 27#define TIMER_DIFF_8(a, b) (uint8_t)((a) - (b)) 28#define TIMER_DIFF_16(a, b) (uint16_t)((a) - (b)) 29#define TIMER_DIFF_32(a, b) (uint32_t)((a) - (b)) 30#define TIMER_DIFF_RAW(a, b) TIMER_DIFF_8(a, b) 31 32#ifdef __cplusplus 33extern "C" { 34#endif 35 36extern volatile uint32_t timer_count; 37 38void timer_init(void); 39void timer_clear(void); 40void timer_save(void); 41void timer_restore(void); 42uint16_t timer_read(void); 43uint32_t timer_read32(void); 44uint16_t timer_elapsed(uint16_t last); 45uint32_t timer_elapsed32(uint32_t last); 46 47// Utility functions to check if a future time has expired & autmatically handle time wrapping if checked / reset frequently (half of max value) 48#define timer_expired(current, future) ((uint16_t)(current - future) < UINT16_MAX / 2) 49#define timer_expired32(current, future) ((uint32_t)(current - future) < UINT32_MAX / 2) 50 51// Use an appropriate timer integer size based on architecture (16-bit will overflow sooner) 52#if FAST_TIMER_T_SIZE < 32 53# define TIMER_DIFF_FAST(a, b) TIMER_DIFF_16(a, b) 54# define timer_expired_fast(current, future) timer_expired(current, future) 55typedef uint16_t fast_timer_t; 56fast_timer_t inline timer_read_fast(void) { 57 return timer_read(); 58} 59fast_timer_t inline timer_elapsed_fast(fast_timer_t last) { 60 return timer_elapsed(last); 61} 62#else 63# define TIMER_DIFF_FAST(a, b) TIMER_DIFF_32(a, b) 64# define timer_expired_fast(current, future) timer_expired32(current, future) 65typedef uint32_t fast_timer_t; 66fast_timer_t inline timer_read_fast(void) { 67 return timer_read32(); 68} 69fast_timer_t inline timer_elapsed_fast(fast_timer_t last) { 70 return timer_elapsed32(last); 71} 72#endif 73 74#ifdef __cplusplus 75} 76#endif