Fiddled more with the timing: the phase seems stable now at least. Still bugs left though...

This commit is contained in:
adamdunkels 2010-04-04 12:28:29 +00:00
parent 1fa81eac59
commit 7d6ff0289e

View file

@ -28,7 +28,7 @@
*
* This file is part of the Contiki operating system.
*
* $Id: contikimac.c,v 1.25 2010/04/04 07:49:31 adamdunkels Exp $
* $Id: contikimac.c,v 1.26 2010/04/04 12:28:29 adamdunkels Exp $
*/
/**
@ -51,7 +51,7 @@
#include "sys/pt.h"
#include "sys/rtimer.h"
/*#include "cooja-debug.h"*/
#include "cooja-debug.h"
#include "contiki-conf.h"
#ifdef EXPERIMENT_SETUP
@ -212,7 +212,7 @@ off(void)
}
}
/*---------------------------------------------------------------------------*/
static rtimer_clock_t cycle_start;
static volatile rtimer_clock_t cycle_start;
static char powercycle(struct rtimer *t, void *ptr);
static void
schedule_powercycle(struct rtimer *t, rtimer_clock_t time)
@ -221,16 +221,8 @@ schedule_powercycle(struct rtimer *t, rtimer_clock_t time)
if(contikimac_is_on) {
if(RTIMER_CLOCK_LT(RTIMER_TIME(t) + time, RTIMER_NOW())) {
time = RTIMER_NOW() - RTIMER_TIME(t);
}
while(RTIMER_TIME(t) + time == RTIMER_NOW() ||
RTIMER_TIME(t) + time == RTIMER_NOW() + 1 ||
RTIMER_TIME(t) + time == RTIMER_NOW() + 2 ||
RTIMER_TIME(t) + time == RTIMER_NOW() + 3 ||
RTIMER_TIME(t) + time == RTIMER_NOW() + 4) {
time++;
if(RTIMER_CLOCK_LT(RTIMER_TIME(t) + time, RTIMER_NOW() + 1)) {
time = RTIMER_NOW() - RTIMER_TIME(t) + 1;
}
#if NURTIMER
@ -245,6 +237,28 @@ schedule_powercycle(struct rtimer *t, rtimer_clock_t time)
}
}
static void
schedule_powercycle_fixed(struct rtimer *t, rtimer_clock_t fixed_time)
{
int r;
if(contikimac_is_on) {
if(RTIMER_CLOCK_LT(fixed_time, RTIMER_NOW() + 1)) {
fixed_time = RTIMER_NOW() + 1;
}
#if NURTIMER
r = rtimer_reschedule(t, RTIMER_TIME(t) - time, 1);
#else
r = rtimer_set(t, fixed_time, 1,
(void (*)(struct rtimer *, void *))powercycle, NULL);
#endif
if(r != RTIMER_OK) {
printf("schedule_powercycle: could not set rtimer\n");
}
}
}
static void
powercycle_turn_radio_off(void)
{
if(we_are_sending == 0) {
@ -261,12 +275,18 @@ powercycle_turn_radio_on(void)
static char
powercycle(struct rtimer *t, void *ptr)
{
rtimer_clock_t start;
PT_BEGIN(&pt);
if(is_streaming) {
start = RTIMER_NOW();
while(1) {
static uint8_t packet_seen;
static rtimer_clock_t t0;
static uint8_t count;
cycle_start = RTIMER_NOW();
if(WITH_STREAMING && is_streaming) {
#if NURTIMER
if(!RTIMER_CLOCK_LT(start, RTIMER_NOW(), stream_until))
if(!RTIMER_CLOCK_LT(cycle_start, RTIMER_NOW(), stream_until))
#else
if(!RTIMER_CLOCK_LT(RTIMER_NOW(), stream_until))
#endif
@ -277,15 +297,6 @@ powercycle(struct rtimer *t, void *ptr)
}
}
PT_BEGIN(&pt);
while(1) {
static uint8_t packet_seen;
static rtimer_clock_t t0;
static uint8_t count;
cycle_start = RTIMER_NOW();
packet_seen = 0;
do {
@ -313,6 +324,7 @@ powercycle(struct rtimer *t, void *ptr)
powercycle_turn_radio_off();
}
schedule_powercycle(t, CCA_SLEEP_TIME);
// COOJA_DEBUG_STR("yield\n");
PT_YIELD(&pt);
}
@ -394,7 +406,8 @@ powercycle(struct rtimer *t, void *ptr)
leds_on(LEDS_RED);
}
if(RTIMER_CLOCK_LT(RTIMER_NOW() - cycle_start, CYCLE_TIME)) {
schedule_powercycle(t, CYCLE_TIME - (RTIMER_NOW() - cycle_start) + 1);
/* schedule_powercycle(t, CYCLE_TIME - (RTIMER_NOW() - cycle_start));*/
schedule_powercycle_fixed(t, CYCLE_TIME + cycle_start);
/* printf("cycle_start 0x%02x now 0x%02x wait 0x%02x\n",
cycle_start, RTIMER_NOW(), CYCLE_TIME - (RTIMER_NOW() - cycle_start));*/
PT_YIELD(&pt);
@ -962,6 +975,7 @@ cycle_announcement(void *ptr)
static void
listen_callback(int periods)
{
printf("Snoop\n");
is_snooping = periods + 1;
}
#endif /* CONTIKIMAC_CONF_ANNOUNCEMENTS */
@ -1047,6 +1061,9 @@ const struct rdc_driver contikimac_driver = {
uint16_t
contikimac_debug_print(void)
{
static rtimer_clock_t one_cycle_start;
printf("Drift %d\n", (one_cycle_start - cycle_start) % CYCLE_TIME);
one_cycle_start = cycle_start;
return 0;
}
/*---------------------------------------------------------------------------*/