use new sys_time for rotorcrafts on stm32

SYS_TIME_RESOLUTION is now in seconds
renamed tics to ticks
renamed SYS_TIME_TICS to CPU_TICKS
This commit is contained in:
Felix Ruess
2012-01-05 18:39:23 +01:00
parent 3af19fd77d
commit 810a3c45a9
8 changed files with 104 additions and 45 deletions
+16
View File
@@ -73,6 +73,22 @@ test_led.srcs += $(SRC_AIRBORNE)/mcu.c \
test_led.CFLAGS += -DUSE_LED
test_led.srcs += $(SRC_ARCH)/led_hw.c
#
# test sys_time
#
test_sys_time.ARCHDIR = $(ARCH)
test_sys_time.CFLAGS += -I$(SRC_LISA) -I$(ARCH) -DPERIPHERALS_AUTO_INIT
test_sys_time.CFLAGS += -DBOARD_CONFIG=$(BOARD_CFG)
test_sys_time.srcs += $(SRC_AIRBORNE)/mcu.c \
$(SRC_ARCH)/mcu_arch.c \
test/mcu_periph/test_sys_time.c \
mcu_periph/sys_time.c \
$(SRC_ARCH)/mcu_periph/sys_time_arch.c \
$(SRC_ARCH)/stm32_exceptions.c \
$(SRC_ARCH)/stm32_vector_table.c
test_sys_time.CFLAGS += -DUSE_LED -DUSE_SYS_TIME -DSYS_TIME_LED=1 -DLED_RED=2 -DLED_BLUE=3
test_sys_time.srcs += $(SRC_ARCH)/led_hw.c
#
# test uart
#
@@ -25,19 +25,24 @@
#include "stm32_vector_table.h"
#ifdef SYS_TIME_LED
#include "subsystems/led.h"
#include "led.h"
#endif
void sys_time_init( void ) {
/* Generate SysTick interrupt every SYS_TIME_RESOLUTION AHB_CLK */
(void)SysTick_Config(SYS_TIME_RESOLUTION);
/* Set SysTick handler priority */
/* Generate SysTick interrupt every SYS_TIME_RESOLUTION_CPU_TICKS
* The timer interrupt is activated on the transition from 1 to 0,
* therefore it activates every n+1 clock ticks.
*/
if (SysTick_Config(SYS_TIME_RESOLUTION_CPU_TICKS-1))
while(1); /* if reload of value is impossible, go into endless loop */
/* Set SysTick handler priority */
NVIC_SetPriority(SysTick_IRQn, 0x0);
sys_time.nb_sec = 0;
sys_time.nb_sec_rem = 0;
sys_time.nb_tic = 0;
sys_time.nb_tick = 0;
for (unsigned int i=0; i<SYS_TIME_NB_TIMER; i++) {
sys_time.timer[i].in_use = FALSE;
@@ -50,17 +55,17 @@ void sys_time_init( void ) {
}
// FIXME : nb_tic rollover ???
// FIXME : nb_tick rollover ???
//
// 97 days at 512hz
// 12 hours at 100khz
//
void sys_tick_irq_handler(void) {
sys_time.nb_tic++;
sys_time.nb_sec_rem += SYS_TIME_RESOLUTION;
if (sys_time.nb_sec_rem >= SYS_TIME_TICS_PER_SEC) {
sys_time.nb_sec_rem -= SYS_TIME_TICS_PER_SEC;
sys_time.nb_tick++;
sys_time.nb_sec_rem += SYS_TIME_RESOLUTION_CPU_TICKS;
if (sys_time.nb_sec_rem >= CPU_TICKS_PER_SEC) {
sys_time.nb_sec_rem -= CPU_TICKS_PER_SEC;
sys_time.nb_sec++;
#ifdef SYS_TIME_LED
LED_TOGGLE(SYS_TIME_LED);
@@ -68,7 +73,7 @@ void sys_tick_irq_handler(void) {
}
for (unsigned int i=0; i<SYS_TIME_NB_TIMER; i++) {
if (sys_time.timer[i].in_use &&
sys_time.nb_tic >= sys_time.timer[i].end_time) {
sys_time.nb_tick >= sys_time.timer[i].end_time) {
sys_time.timer[i].end_time += sys_time.timer[i].duration;
sys_time.timer[i].elapsed = TRUE;
if (sys_time.timer[i].cb) sys_time.timer[i].cb(i);
@@ -1,5 +1,4 @@
/*
* Paparazzi $Id$
*
* Copyright (C) 2009-2010 The Paparazzi Team
*
@@ -27,8 +26,8 @@
*
*/
#ifndef SYS_TIME_HW_H
#define SYS_TIME_HW_H
#ifndef SYS_TIME_ARCH_H
#define SYS_TIME_ARCH_H
#include "mcu_periph/sys_time.h"
@@ -36,14 +35,22 @@
#include <stm32/rcc.h>
#include "std.h"
#define InitSysTimePeriodic()
extern void sys_tick_irq_handler(void);
#define SYS_TIME_TICS_OF_SEC(s) (uint32_t)((s) * AHB_CLK + 0.5)
#define SYS_TIME_SIGNED_TICS_OF_SEC(s) (int32_t)((s) * AHB_CLK + 0.5)
#define CPU_TICKS_OF_SEC(s) (uint32_t)((s) * AHB_CLK + 0.5)
#define CPU_SIGNED_TICKS_OF_SEC(s) (int32_t)((s) * AHB_CLK + 0.5)
#define SysTimeTimerStart(_t) { _t = sys_time.nb_tic; }
#define SysTimeTimer(_t) (sys_time.nb_tic - (_t)))
#define SysTimeTimerStop(_t) { _t = (sys_time.nb_tic - (_t)); }
#define SEC_OF_CPU_TICKS(t) ((t) / AHB_CLK)
#define MSEC_OF_CPU_TICKS(t) ((t) / (AHB_CLK/1000))
#define USEC_OF_CPU_TICKS(t) ((t) / (AHB_CLK/1000000))
#define GET_CUR_TIME_USEC() (sys_time.nb_sec * 1000000 + \
USEC_OF_CPU_TICKS(sys_time.nb_sec_rem) + \
USEC_OF_CPU_TICKS(SysTick->LOAD - SysTick->VAL))
#define SysTimeTimerStart(_t) { _t = GET_CUR_TIME_USEC(); }
#define SysTimeTimer(_t) ( GET_CUR_TIME_USEC() - (_t))
#define SysTimeTimerStop(_t) { _t = ( GET_CUR_TIME_USEC() - (_t)); }
/** Busy wait, in microseconds */
@@ -52,4 +59,4 @@ static inline void sys_time_usleep(uint32_t us) {
}
#endif /* SYS_TIME_HW_H */
#endif /* SYS_TIME_ARCH_H */
+3 -2
View File
@@ -75,7 +75,7 @@ int main( void ) {
main_init();
while(1) {
if (sys_time_periodic())
if (sys_time_check_and_ack_timer(0))
main_periodic();
main_event();
}
@@ -87,7 +87,8 @@ STATIC_INLINE void main_init( void ) {
mcu_init();
sys_time_init();
sys_time_register_timer(SYS_TIME_TIMER_S(1./512.), NULL);
electrical_init();
actuators_init();
+2
View File
@@ -25,6 +25,7 @@
#include "mcu.h"
#ifdef PERIPHERALS_AUTO_INIT
#include "mcu_periph/sys_time.h"
#ifdef USE_LED
#include "led.h"
#endif
@@ -58,6 +59,7 @@ void mcu_init(void) {
mcu_arch_init();
#ifdef PERIPHERALS_AUTO_INIT
sys_time_init();
#ifdef USE_LED
led_init();
#endif
+1 -1
View File
@@ -7,7 +7,7 @@ struct sys_time sys_time;
uint8_t sys_time_register_timer(uint32_t duration, sys_time_cb cb) {
uint32_t start_time = sys_time.nb_tic;
uint32_t start_time = sys_time.nb_tick;
for (int i = 0; i< SYS_TIME_NB_TIMER; i++) {
if (!sys_time.timer[i].in_use) {
sys_time.timer[i].cb = cb;
+36 -13
View File
@@ -31,12 +31,13 @@
#define SYS_TIME_H
#include <inttypes.h>
#include <stdlib.h>
#include "std.h"
#include BOARD_CONFIG
#ifndef SYS_TIME_NB_TIMER
#define SYS_TIME_NB_TIMER 5
#define SYS_TIME_NB_TIMER 5
#endif
typedef void (*sys_time_cb) (uint8_t id);
@@ -45,19 +46,23 @@ struct sys_time_timer {
bool_t in_use;
sys_time_cb cb;
volatile bool_t elapsed;
uint32_t end_time;
uint32_t duration;
uint32_t end_time; ///< in SYS_TICKS
uint32_t duration; ///< in SYS_TICKS
};
struct sys_time {
uint32_t nb_sec;
uint32_t nb_sec_rem;
uint32_t nb_tic;
uint32_t nb_sec; ///< full seconds since startup
uint32_t nb_sec_rem; ///< remainder of second in CPU_TICKS
uint32_t nb_tick; ///< in SYS_TICKS with SYS_TIME_RESOLUTION
struct sys_time_timer timer[SYS_TIME_NB_TIMER];
};
extern struct sys_time sys_time;
//FIXME temporary hack
#define cpu_time_sec sys_time.nb_sec
#define cpu_time_ticks sys_time.nb_sec_rem
extern void sys_time_init(void);
extern uint8_t sys_time_register_timer(uint32_t duration, sys_time_cb cb);
extern void sys_time_cancel_timer(uint8_t id);
@@ -71,18 +76,36 @@ static inline bool_t sys_time_check_and_ack_timer( uint8_t id ) {
return FALSE;
}
#define GET_CUR_TIME_FLOAT() ((float)sys_time.nb_sec + SEC_OF_CPU_TICKS((float)sys_time.nb_sec_rem))
/* CPU clock */
#define CPU_TICKS_OF_USEC(us) CPU_TICKS_OF_SEC((us) * 1e-6)
#define CPU_TICKS_OF_NSEC(ns) CPU_TICKS_OF_SEC((ns) * 1e-9)
#define CPU_SIGNED_TICKS_OF_USEC(us) CPU_SIGNED_TICKS_OF_SEC((us) * 1e-6)
#define CPU_SIGNED_TICKS_OF_NSEC(us) CPU_SIGNED_TICKS_OF_SEC((us) * 1e-9)
#define CPU_TICKS_PER_SEC CPU_TICKS_OF_SEC( 1.)
/* paparazzi sys_time timers */
#ifndef SYS_TIME_RESOLUTION
#define SYS_TIME_RESOLUTION SYS_TIME_TICS_OF_SEC( 1./1048576.)
#define SYS_TIME_RESOLUTION ( 1./1024. )
#endif
#define SYS_TIME_RESOLUTION_CPU_TICKS CPU_TICKS_OF_SEC(SYS_TIME_RESOLUTION)
#define SYS_TIME_TIMER_S(_s) (SYS_TIME_TICS_OF_SEC(_s)/SYS_TIME_RESOLUTION)
#define SYS_TIME_TIMER_S(_s) ((_s)/SYS_TIME_RESOLUTION)
#define SYS_TIME_TICS_OF_USEC(us) SYS_TIME_TICS_OF_SEC((us) * 1e-6)
#define SYS_TIME_TICS_OF_NSEC(ns) SYS_TIME_TICS_OF_SEC((ns) * 1e-9)
#define SYS_TIME_SIGNED_TICS_OF_USEC(us) SYS_TIME_SIGNED_TICS_OF_SEC((us) * 1e-6)
#define SYS_TIME_SIGNED_TICS_OF_NSEC(us) SYS_TIME_SIGNED_TICS_OF_SEC((us) * 1e-9)
#define SYS_TIME_TICKS_OF_SEC(s) (uint32_t)((s) / SYS_TIME_RESOLUTION + 0.5)
#define SYS_TIME_TICKS_OF_USEC(us) SYS_TIME_TICKS_OF_SEC((us) * 1e-6)
#define SYS_TIME_TICKS_OF_NSEC(ns) SYS_TIME_TICKS_OF_SEC((ns) * 1e-9)
#define SEC_OF_SYS_TIME_TICKS(t) ((t) * SYS_TIME_RESOLUTION)
#define USEC_OF_SYS_TIME_TICKS(t) ((t) * SYS_TIME_RESOLUTION / 1e-6)
#define NSEC_OF_SYS_TIME_TICKS(t) ((t) * SYS_TIME_RESOLUTION / 1e-9)
#define USEC_OF_SEC(sec) ((sec) * 1e6)
#define SYS_TIME_TICS_PER_SEC SYS_TIME_TICS_OF_SEC( 1.)
#include "mcu_periph/sys_time_arch.h"
@@ -1,6 +1,7 @@
#include "std_pprz.h"
#include "std.h"
#include "mcu.h"
#include "subsystems/led.h"
#include "led.h"
#include "mcu_periph/sys_time.h"
static inline void main_periodic_02( void );
static inline void main_periodic_03( void );
@@ -8,9 +9,8 @@ static inline void main_periodic_05( uint8_t id );
static inline void main_event( void );
int main(void) {
mcu_init();
led_init();
unsigned int tmr_02 = sys_time_register_timer(SYS_TIME_TIMER_S(0.2), NULL);
unsigned int tmr_03 = sys_time_register_timer(SYS_TIME_TIMER_S(0.3), NULL);
sys_time_register_timer(SYS_TIME_TIMER_S(0.5), main_periodic_05);
@@ -26,25 +26,30 @@ int main(void) {
return 0;
}
/*
Called from main loop polling
/*
Called from main loop polling
*/
static inline void main_periodic_02( void ) {
#ifdef LED_GREEN
LED_TOGGLE(LED_GREEN);
#endif
}
static inline void main_periodic_03( void ) {
#ifdef LED_BLUE
LED_TOGGLE(LED_BLUE);
#endif
}
/*
/*
Called from the systime interrupt handler
*/
static inline void main_periodic_05( uint8_t id ) {
#ifdef LED_RED
LED_TOGGLE(LED_RED);
#endif
}
static inline void main_event( void ) {
}