From 0b2d3d16155d3462059137538d64ffbfe6a8b25f Mon Sep 17 00:00:00 2001 From: dak664 Date: Sun, 13 Mar 2011 13:07:32 -0400 Subject: [PATCH] Refactor clock code with optional interrupt optimizing. Put periodic radio calibration on conditional. --- cpu/avr/dev/clock.c | 152 ++++++++++++++++++++++++++------ cpu/avr/radio/rf230bb/rf230bb.c | 7 +- 2 files changed, 132 insertions(+), 27 deletions(-) diff --git a/cpu/avr/dev/clock.c b/cpu/avr/dev/clock.c index ad1711828..14a1671fb 100644 --- a/cpu/avr/dev/clock.c +++ b/cpu/avr/dev/clock.c @@ -15,12 +15,23 @@ long sleepseconds; #if RF230BB && WEBSERVER #define RADIOSTATS 1 #endif + #if RADIOSTATS static volatile uint8_t rcount; volatile unsigned long radioontime; extern uint8_t RF230_receive_on; #endif +/* Set RADIOCALIBRATE for periodic calibration of the PLL during extended radio on time. + * The data sheet suggests every 5 minutes if the temperature is fluctuating. + * Using an eight bit counter gives 256 second calibrations. + * Actual calibration is done by the driver on the next transmit request. + */ +#if RADIOCALIBRATE +extern volatile uint8_t rf230_calibrate; +static uint8_t calibrate_interval; +#endif + /* CLOCK_SECOND is the number of ticks per second. It is defined through CONF_CLOCK_SECOND in the contiki-conf.h for each platform. @@ -46,48 +57,49 @@ void clock_adjust_seconds(uint8_t howmany) { #endif } /*---------------------------------------------------------------------------*/ -/* These routines increment the second counters. - * Calling these avoids the interrupt overhead of pushing many registers on the stack. - */ -static void increment_seconds(void) __attribute__ ((noinline)); -static void increment_seconds(void) -{ - seconds++; -} -#if RADIOSTATS -extern volatile uint8_t rf230_calibrate; -static void increment_radioontime(void) __attribute__ ((noinline)); -static void increment_radioontime(void) -{ -static uint8_t calibrate_interval; - radioontime++; - if (++calibrate_interval==0) { - rf230_calibrate=1; - } -} -#endif -/*---------------------------------------------------------------------------*/ //SIGNAL(SIG_OUTPUT_COMPARE0) ISR(AVR_OUTPUT_COMPARE_INT) { count++; if(++scount == CLOCK_SECOND) { scount = 0; - increment_seconds(); -// seconds++; + seconds++; } +#if RADIOCALIBRATE + if (++calibrate_interval==0) { + rf230_calibrate=1; + } +#endif #if RADIOSTATS if (RF230_receive_on) { if (++rcount == CLOCK_SECOND) { rcount=0; - increment_radioontime(); - // radioontime++; + radioontime++; } - } #endif + +#if 1 +/* gcc will save all registers on the stack if an external routine is called */ if(etimer_pending()) { etimer_request_poll(); } +#else +/* doing this locally saves 9 pushes and 9 pops, but these etimer.c and process.c variables have to lose the static qualifier */ + extern struct etimer *timerlist; + extern volatile unsigned char poll_requested; + +#define PROCESS_STATE_NONE 0 +#define PROCESS_STATE_RUNNING 1 +#define PROCESS_STATE_CALLED 2 + + if (timerlist) { + if(etimer_process.state == PROCESS_STATE_RUNNING || + etimer_process.state == PROCESS_STATE_CALLED) { + etimer_process.needspoll = 1; + poll_requested = 1; + } + } +#endif } /*---------------------------------------------------------------------------*/ @@ -153,3 +165,91 @@ clock_seconds(void) } while(tmp != seconds); return tmp; } + +#if 1 +/* Useful for diagnosing unknown interrupts that reset the mcu. + * Currently set up for 12mega128rfa1. + * For other mcus, enable all and then disable the conflicts. + */ +static volatile uint8_t x; +ISR( _VECTOR(0)) {while (1) x++;} +ISR( _VECTOR(1)) {while (1) x++;} +ISR( _VECTOR(2)) {while (1) x++;} +ISR( _VECTOR(3)) {while (1) x++;} +ISR( _VECTOR(4)) {while (1) x++;} +ISR( _VECTOR(5)) {while (1) x++;} +ISR( _VECTOR(6)) {while (1) x++;} +ISR( _VECTOR(7)) {while (1) x++;} +ISR( _VECTOR(8)) {while (1) x++;} +ISR( _VECTOR(9)) {while (1) x++;} +ISR( _VECTOR(10)) {while (1) x++;} +ISR( _VECTOR(11)) {while (1) x++;} +ISR( _VECTOR(12)) {while (1) x++;} +ISR( _VECTOR(13)) {while (1) x++;} +ISR( _VECTOR(14)) {while (1) x++;} +ISR( _VECTOR(15)) {while (1) x++;} +ISR( _VECTOR(16)) {while (1) x++;} +ISR( _VECTOR(17)) {while (1) x++;} +ISR( _VECTOR(18)) {while (1) x++;} +ISR( _VECTOR(19)) {while (1) x++;} +//ISR( _VECTOR(20)) {while (1) x++;} +//ISR( _VECTOR(21)) {while (1) x++;} +ISR( _VECTOR(22)) {while (1) x++;} +ISR( _VECTOR(23)) {while (1) x++;} +ISR( _VECTOR(24)) {while (1) x++;} +//ISR( _VECTOR(25)) {while (1) x++;} +ISR( _VECTOR(26)) {while (1) x++;} +//ISR( _VECTOR(27)) {while (1) x++;} +ISR( _VECTOR(28)) {while (1) x++;} +ISR( _VECTOR(29)) {while (1) x++;} +ISR( _VECTOR(30)) {while (1) x++;} +ISR( _VECTOR(31)) {while (1) x++;} +//ISR( _VECTOR(32)) {while (1) x++;} +ISR( _VECTOR(33)) {while (1) x++;} +ISR( _VECTOR(34)) {while (1) x++;} +ISR( _VECTOR(35)) {while (1) x++;} +//ISR( _VECTOR(36)) {while (1) x++;} +ISR( _VECTOR(37)) {while (1) x++;} +//ISR( _VECTOR(38)) {while (1) x++;} +ISR( _VECTOR(39)) {while (1) x++;} +ISR( _VECTOR(40)) {while (1) x++;} +ISR( _VECTOR(41)) {while (1) x++;} +ISR( _VECTOR(42)) {while (1) x++;} +ISR( _VECTOR(43)) {while (1) x++;} +ISR( _VECTOR(44)) {while (1) x++;} +ISR( _VECTOR(45)) {while (1) x++;} +ISR( _VECTOR(46)) {while (1) x++;} +ISR( _VECTOR(47)) {while (1) x++;} +ISR( _VECTOR(48)) {while (1) x++;} +ISR( _VECTOR(49)) {while (1) x++;} +ISR( _VECTOR(50)) {while (1) x++;} +ISR( _VECTOR(51)) {while (1) x++;} +ISR( _VECTOR(52)) {while (1) x++;} +ISR( _VECTOR(53)) {while (1) x++;} +ISR( _VECTOR(54)) {while (1) x++;} +ISR( _VECTOR(55)) {while (1) x++;} +ISR( _VECTOR(56)) {while (1) x++;} +//ISR( _VECTOR(57)) {while (1) x++;} +//ISR( _VECTOR(58)) {while (1) x++;} +//ISR( _VECTOR(59)) {while (1) x++;} +//ISR( _VECTOR(60)) {while (1) x++;} +ISR( _VECTOR(61)) {while (1) x++;} +ISR( _VECTOR(62)) {while (1) x++;} +ISR( _VECTOR(63)) {while (1) x++;} +ISR( _VECTOR(64)) {while (1) x++;} +ISR( _VECTOR(65)) {while (1) x++;} +ISR( _VECTOR(66)) {while (1) x++;} +ISR( _VECTOR(67)) {while (1) x++;} +ISR( _VECTOR(68)) {while (1) x++;} +ISR( _VECTOR(69)) {while (1) x++;} +ISR( _VECTOR(70)) {while (1) x++;} +ISR( _VECTOR(71)) {while (1) x++;} +ISR( _VECTOR(72)) {while (1) x++;} +ISR( _VECTOR(73)) {while (1) x++;} +ISR( _VECTOR(74)) {while (1) x++;} +ISR( _VECTOR(75)) {while (1) x++;} +ISR( _VECTOR(76)) {while (1) x++;} +ISR( _VECTOR(77)) {while (1) x++;} +ISR( _VECTOR(78)) {while (1) x++;} +ISR( _VECTOR(79)) {while (1) x++;} +#endif \ No newline at end of file diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index b937a0bbd..19aa8b253 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -148,9 +148,12 @@ struct timestamp { #if RADIOSTATS uint16_t RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail; #endif + +#if RADIOCALIBRATE /* Set in clock.c every 256 seconds */ uint8_t rf230_calibrate; -uint8_t rf230_calibrated; //debugging +uint8_t rf230_calibrated; //for debugging, prints from main loop when calibration occurs +#endif /* Track flow through driver, see contiki-raven-main.c for example of use */ //#define DEBUGFLOWSIZE 64 @@ -758,6 +761,7 @@ rf230_transmit(unsigned short payload_len) // delay_us(TIME_SLEEP_TO_TRX_OFF); RF230_sleeping=0; } else { +#if RADIOCALIBRATE /* If on, do periodic calibration. See clock.c */ if (rf230_calibrate) { hal_subregister_write(SR_PLL_CF_START,1); //takes 80us max @@ -766,6 +770,7 @@ rf230_transmit(unsigned short payload_len) rf230_calibrated=1; delay_us(80); //? } +#endif } /* Wait for any previous operation or state transition to finish */