Fixed wrong first cycle_start
The first time that powercycle() runs, cycle_start is incremented by CHECK_TIME twice which causes the second cycle to be late. This commit fixes this.
This commit is contained in:
parent
0313a429e2
commit
ac6a1c5255
|
@ -289,9 +289,15 @@ off(void)
|
|||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static volatile rtimer_clock_t cycle_start;
|
||||
static void powercycle_wrapper(struct rtimer *t, void *ptr);
|
||||
static char powercycle(struct rtimer *t, void *ptr);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static volatile rtimer_clock_t cycle_start;
|
||||
#if SYNC_CYCLE_STARTS
|
||||
static volatile rtimer_clock_t sync_cycle_start;
|
||||
static volatile uint8_t sync_cycle_phase;
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
schedule_powercycle(struct rtimer *t, rtimer_clock_t time)
|
||||
{
|
||||
|
@ -365,13 +371,34 @@ powercycle_wrapper(struct rtimer *t, void *ptr)
|
|||
powercycle(t, ptr);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
advance_cycle_start(void)
|
||||
{
|
||||
#if SYNC_CYCLE_STARTS
|
||||
|
||||
/* Compute cycle start when RTIMER_ARCH_SECOND is not a multiple
|
||||
of CHANNEL_CHECK_RATE */
|
||||
if(sync_cycle_phase++ == NETSTACK_RDC_CHANNEL_CHECK_RATE) {
|
||||
sync_cycle_phase = 0;
|
||||
sync_cycle_start += RTIMER_ARCH_SECOND;
|
||||
cycle_start = sync_cycle_start;
|
||||
} else if( (RTIMER_ARCH_SECOND * NETSTACK_RDC_CHANNEL_CHECK_RATE) > 65535) {
|
||||
uint32_t phase_time = sync_cycle_phase*RTIMER_ARCH_SECOND;
|
||||
|
||||
cycle_start = sync_cycle_start + phase_time/NETSTACK_RDC_CHANNEL_CHECK_RATE;
|
||||
} else {
|
||||
unsigned phase_time = sync_cycle_phase*RTIMER_ARCH_SECOND;
|
||||
|
||||
cycle_start = sync_cycle_start + phase_time/NETSTACK_RDC_CHANNEL_CHECK_RATE;
|
||||
}
|
||||
#endif
|
||||
|
||||
cycle_start += CYCLE_TIME;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static char
|
||||
powercycle(struct rtimer *t, void *ptr)
|
||||
{
|
||||
#if SYNC_CYCLE_STARTS
|
||||
static volatile rtimer_clock_t sync_cycle_start;
|
||||
static volatile uint8_t sync_cycle_phase;
|
||||
#endif
|
||||
|
||||
PT_BEGIN(&pt);
|
||||
|
||||
|
@ -385,24 +412,6 @@ powercycle(struct rtimer *t, void *ptr)
|
|||
static uint8_t packet_seen;
|
||||
static uint8_t count;
|
||||
|
||||
#if SYNC_CYCLE_STARTS
|
||||
/* Compute cycle start when RTIMER_ARCH_SECOND is not a multiple
|
||||
of CHANNEL_CHECK_RATE */
|
||||
if(sync_cycle_phase++ == NETSTACK_RDC_CHANNEL_CHECK_RATE) {
|
||||
sync_cycle_phase = 0;
|
||||
sync_cycle_start += RTIMER_ARCH_SECOND;
|
||||
cycle_start = sync_cycle_start;
|
||||
} else {
|
||||
#if (RTIMER_ARCH_SECOND * NETSTACK_RDC_CHANNEL_CHECK_RATE) > 65535
|
||||
cycle_start = sync_cycle_start + ((unsigned long)(sync_cycle_phase*RTIMER_ARCH_SECOND))/NETSTACK_RDC_CHANNEL_CHECK_RATE;
|
||||
#else
|
||||
cycle_start = sync_cycle_start + (sync_cycle_phase*RTIMER_ARCH_SECOND)/NETSTACK_RDC_CHANNEL_CHECK_RATE;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
cycle_start += CYCLE_TIME;
|
||||
#endif
|
||||
|
||||
packet_seen = 0;
|
||||
|
||||
for(count = 0; count < CCA_COUNT_MAX; ++count) {
|
||||
|
@ -483,22 +492,25 @@ powercycle(struct rtimer *t, void *ptr)
|
|||
}
|
||||
}
|
||||
|
||||
if(RTIMER_CLOCK_LT(RTIMER_NOW() - cycle_start, CYCLE_TIME - CHECK_TIME * 4)) {
|
||||
advance_cycle_start();
|
||||
|
||||
if(RTIMER_CLOCK_LT(RTIMER_NOW() , cycle_start - CHECK_TIME * 4)) {
|
||||
/* Schedule the next powercycle interrupt, or sleep the mcu
|
||||
until then. Sleeping will not exit from this interrupt, so
|
||||
ensure an occasional wake cycle or foreground processing will
|
||||
be blocked until a packet is detected */
|
||||
#if RDC_CONF_MCU_SLEEP
|
||||
|
||||
static uint8_t sleepcycle;
|
||||
if((sleepcycle++ < 16) && !we_are_sending && !radio_is_on) {
|
||||
rtimer_arch_sleep(CYCLE_TIME - (RTIMER_NOW() - cycle_start));
|
||||
rtimer_arch_sleep(RTIMER_NOW() - cycle_start);
|
||||
} else {
|
||||
sleepcycle = 0;
|
||||
schedule_powercycle_fixed(t, CYCLE_TIME + cycle_start);
|
||||
schedule_powercycle_fixed(t, cycle_start);
|
||||
PT_YIELD(&pt);
|
||||
}
|
||||
#else
|
||||
schedule_powercycle_fixed(t, CYCLE_TIME + cycle_start);
|
||||
schedule_powercycle_fixed(t, cycle_start);
|
||||
PT_YIELD(&pt);
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue