Refactor clock code with optional interrupt optimizing.
Put periodic radio calibration on conditional.
This commit is contained in:
parent
14246ef811
commit
0b2d3d1615
|
@ -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
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue