#pragma once #include #include #include typedef uint64_t systick_t; struct _systick_wait { systick_t target; }; typedef struct _systick_wait ST_WAIT; typedef void (*systick_handler)(systick_t ticks); extern volatile uint32_t _systick_secs; // system uptime in [s] extern volatile uint32_t _systick_sec_frac; extern volatile systick_t _systick_ticks; // system uptime in [us] extern systick_t _systick_us; // Systick Interval in [us] extern uint32_t _st_cycles_per_intervall __attribute__((weak)); void systick_init(systick_t systick_us); void systick(void); void systick_set_us(systick_t tickus); int systick_correct(int32_t correct); systick_t systick_ticks(void); uint32_t systick_secs(void); void systick_set_handler(systick_handler handler); void systick_set_handler_sec(systick_handler handler); void wait_ms(uint32_t ms); void wait_async_set(ST_WAIT* wait,systick_t us); uint8_t wait_async_test(ST_WAIT* wait); /* call_sys_ctx(...) Rufe Funktion nach Ă„ndern von SP auf CTX ST */ void call_sys_ctx(void (*proc)(void)); #if defined(__DEBUG_PLATFORM__) #define VECT(__vect) \ void _vect_##__vect(void); \ ISR(__vect){ \ rt_dbg->last_vect[3] = rt_dbg->last_vect[2]; \ rt_dbg->last_vect[2] = rt_dbg->last_vect[1]; \ rt_dbg->last_vect[1] = rt_dbg->last_vect[0]; \ rt_dbg->last_vect[0] = (int)__vect; \ call_sys_ctx( _vect_##__vect ); \ }; \ void _vect_##__vect(void) #else #define VECT(__vect) \ void _vect_##__vect(void); \ ISR(__vect){ \ call_sys_ctx( _vect_##__vect ); \ }; \ void _vect_##__vect(void) #endif #include