After a lot of tweaking and twiddling with the timing of the ContikiMAC code and the mechanisms in the CC2420 driver, things seem to work somewhat stable now - knock on wood!
This commit is contained in:
parent
a637ddaf4e
commit
be117afe04
2 changed files with 45 additions and 37 deletions
|
@ -28,7 +28,7 @@
|
|||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
* @(#)$Id: cc2420.c,v 1.49 2010/04/03 16:01:00 adamdunkels Exp $
|
||||
* @(#)$Id: cc2420.c,v 1.50 2010/04/04 07:49:30 adamdunkels Exp $
|
||||
*/
|
||||
/*
|
||||
* This code is almost device independent and should be easy to port.
|
||||
|
@ -183,29 +183,31 @@ static uint8_t locked, lock_on, lock_off;
|
|||
static void
|
||||
on(void)
|
||||
{
|
||||
ENERGEST_ON(ENERGEST_TYPE_LISTEN);
|
||||
/* PRINTF("on\n");*/
|
||||
receive_on = 1;
|
||||
|
||||
ENABLE_FIFOP_INT();
|
||||
strobe(CC2420_SRXON);
|
||||
|
||||
ENERGEST_ON(ENERGEST_TYPE_LISTEN);
|
||||
leds_on(LEDS_GREEN);
|
||||
}
|
||||
static void
|
||||
off(void)
|
||||
{
|
||||
leds_on(LEDS_GREEN);
|
||||
/* PRINTF("off\n");*/
|
||||
receive_on = 0;
|
||||
|
||||
/* Wait for transmission to end before turning radio off. */
|
||||
while(status() & BV(CC2420_TX_ACTIVE));
|
||||
|
||||
flushrx();
|
||||
strobe(CC2420_SRFOFF);
|
||||
DISABLE_FIFOP_INT();
|
||||
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
|
||||
DISABLE_FIFOP_INT();
|
||||
leds_off(LEDS_GREEN);
|
||||
|
||||
if(!FIFOP_IS_1) {
|
||||
flushrx();
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define GET_LOCK() locked++
|
||||
|
@ -314,6 +316,8 @@ cc2420_init(void)
|
|||
cc2420_set_pan_addr(0xffff, 0x0000, NULL);
|
||||
cc2420_set_channel(26);
|
||||
|
||||
flushrx();
|
||||
|
||||
process_start(&cc2420_process, NULL);
|
||||
return 1;
|
||||
}
|
||||
|
@ -347,7 +351,7 @@ cc2420_transmit(unsigned short payload_len)
|
|||
* transmission starts.
|
||||
*/
|
||||
#ifdef TMOTE_SKY
|
||||
#define LOOP_20_SYMBOLS 400 /* 326us (msp430 @ 2.4576MHz) */
|
||||
#define LOOP_20_SYMBOLS 800 /* 326us (msp430 @ 2.4576MHz) */
|
||||
#elif __AVR__
|
||||
#define LOOP_20_SYMBOLS 500 /* XXX */
|
||||
#endif
|
||||
|
@ -708,16 +712,16 @@ cc2420_read(void *buf, unsigned short bufsize)
|
|||
len = AUX_LEN;
|
||||
}
|
||||
|
||||
/* Clean up in case of FIFO overflow! This happens for every full
|
||||
* length frame and is signaled by FIFOP = 1 and FIFO = 0.
|
||||
*/
|
||||
if(FIFOP_IS_1 && !FIFO_IS_1) {
|
||||
/* printf("cc2420_read: FIFOP_IS_1 1\n");*/
|
||||
flushrx();
|
||||
} else if(FIFOP_IS_1) {
|
||||
/* Another packet has been received and needs attention. */
|
||||
/* printf("attention\n");*/
|
||||
process_poll(&cc2420_process);
|
||||
if(FIFOP_IS_1) {
|
||||
if(!FIFO_IS_1) {
|
||||
/* Clean up in case of FIFO overflow! This happens for every
|
||||
* full length frame and is signaled by FIFOP = 1 and FIFO =
|
||||
* 0. */
|
||||
flushrx();
|
||||
} else {
|
||||
/* Another packet has been received and needs attention. */
|
||||
process_poll(&cc2420_process);
|
||||
}
|
||||
}
|
||||
|
||||
RELEASE_LOCK();
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
* $Id: contikimac.c,v 1.24 2010/04/03 13:28:30 adamdunkels Exp $
|
||||
* $Id: contikimac.c,v 1.25 2010/04/04 07:49:31 adamdunkels Exp $
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -115,12 +115,12 @@ struct announcement_msg {
|
|||
#define INTER_PACKET_INTERVAL RTIMER_ARCH_SECOND / 5000
|
||||
#define AFTER_ACK_DETECTECT_WAIT_TIME RTIMER_ARCH_SECOND / 1500
|
||||
|
||||
#define LISTEN_TIME_AFTER_PACKET_DETECTED RTIMER_ARCH_SECOND / 100
|
||||
#define LISTEN_TIME_AFTER_PACKET_DETECTED RTIMER_ARCH_SECOND / 80
|
||||
|
||||
#define SHORTEST_PACKET_SIZE 43
|
||||
|
||||
#define MAX_SILENCE_PERIODS 5
|
||||
#define MAX_NONACTIVITY_PERIODIC 30
|
||||
#define MAX_NONACTIVITY_PERIODIC 10
|
||||
|
||||
/* The cycle time for announcements. */
|
||||
#ifdef ANNOUNCEMENT_CONF_PERIOD
|
||||
|
@ -206,7 +206,7 @@ on(void)
|
|||
static void
|
||||
off(void)
|
||||
{
|
||||
if(contikimac_is_on && radio_is_on != 0 && is_streaming == 0 && is_snooping == 0) {
|
||||
if(contikimac_is_on && radio_is_on != 0 && is_streaming == 0/* && is_snooping == 0*/) {
|
||||
radio_is_on = 0;
|
||||
NETSTACK_RADIO.off();
|
||||
}
|
||||
|
@ -293,7 +293,7 @@ powercycle(struct rtimer *t, void *ptr)
|
|||
t0 = RTIMER_NOW();
|
||||
if(we_are_sending == 0) {
|
||||
powercycle_turn_radio_on();
|
||||
#if 1
|
||||
#if 0
|
||||
#if NURTIMER
|
||||
while(RTIMER_CLOCK_LT(t0, RTIMER_NOW(), t0 + CCA_CHECK_TIME));
|
||||
#else
|
||||
|
@ -312,7 +312,7 @@ powercycle(struct rtimer *t, void *ptr)
|
|||
}
|
||||
powercycle_turn_radio_off();
|
||||
}
|
||||
schedule_powercycle(t, CCA_SLEEP_TIME + CCA_CHECK_TIME);
|
||||
schedule_powercycle(t, CCA_SLEEP_TIME);
|
||||
PT_YIELD(&pt);
|
||||
}
|
||||
|
||||
|
@ -387,13 +387,13 @@ powercycle(struct rtimer *t, void *ptr)
|
|||
compower_accumulate(&compower_idle_activity);
|
||||
#endif /* CONTIKIMAC_CONF_COMPOWER */
|
||||
}
|
||||
} while(0 && (is_snooping) &&
|
||||
RTIMER_CLOCK_LT(RTIMER_NOW() - cycle_start, CYCLE_TIME - 8 * CHECK_TIME * CCA_COUNT_MAX));
|
||||
} while(is_snooping &&
|
||||
RTIMER_CLOCK_LT(RTIMER_NOW() - cycle_start, CYCLE_TIME - CHECK_TIME));
|
||||
|
||||
if(is_snooping) {
|
||||
leds_on(LEDS_RED);
|
||||
}
|
||||
if(RTIMER_CLOCK_LT(RTIMER_NOW() - cycle_start, CYCLE_TIME - 4)) {
|
||||
if(RTIMER_CLOCK_LT(RTIMER_NOW() - cycle_start, CYCLE_TIME)) {
|
||||
schedule_powercycle(t, CYCLE_TIME - (RTIMER_NOW() - cycle_start) + 1);
|
||||
/* printf("cycle_start 0x%02x now 0x%02x wait 0x%02x\n",
|
||||
cycle_start, RTIMER_NOW(), CYCLE_TIME - (RTIMER_NOW() - cycle_start));*/
|
||||
|
@ -537,6 +537,8 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr)
|
|||
}
|
||||
stream_until = RTIMER_NOW() + DEFAULT_STREAM_TIME;
|
||||
is_streaming = 1;
|
||||
} else {
|
||||
is_streaming = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -679,9 +681,9 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr)
|
|||
|
||||
watchdog_periodic();
|
||||
|
||||
/* if(is_known_receiver && !RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + MAX_PHASE_STROBE_TIME)) {
|
||||
if(is_known_receiver && !RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + MAX_PHASE_STROBE_TIME)) {
|
||||
break;
|
||||
}*/
|
||||
}
|
||||
|
||||
len = 0;
|
||||
|
||||
|
@ -691,9 +693,10 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr)
|
|||
{
|
||||
rtimer_clock_t wt;
|
||||
rtimer_clock_t now = RTIMER_NOW();
|
||||
|
||||
NETSTACK_RADIO.transmit(transmit_len);
|
||||
|
||||
int ret;
|
||||
|
||||
ret = NETSTACK_RADIO.transmit(transmit_len);
|
||||
|
||||
wt = RTIMER_NOW();
|
||||
#if NURTIMER
|
||||
while(RTIMER_CLOCK_LT(wt, RTIMER_NOW(), wt + INTER_PACKET_INTERVAL));
|
||||
|
@ -775,7 +778,7 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr)
|
|||
}
|
||||
|
||||
#if WITH_PHASE_OPTIMIZATION
|
||||
if(!first_transmission) {
|
||||
/* if(!first_transmission)*/ {
|
||||
|
||||
/* COOJA_DEBUG_PRINTF("first phase 0x%02x\n", encounter_time % CYCLE_TIME);*/
|
||||
|
||||
|
@ -1002,14 +1005,15 @@ init(void)
|
|||
static int
|
||||
turn_on(void)
|
||||
{
|
||||
contikimac_is_on = 1;
|
||||
if(contikimac_is_on == 0) {
|
||||
contikimac_is_on = 1;
|
||||
#if NURTIMER
|
||||
rtimer_schedule(&rt, CYCLE_TIME, 1);
|
||||
rtimer_schedule(&rt, CYCLE_TIME, 1);
|
||||
#else
|
||||
rtimer_set(&rt, RTIMER_NOW() + CYCLE_TIME, 1,
|
||||
(void (*)(struct rtimer *, void *))powercycle, NULL);
|
||||
rtimer_set(&rt, RTIMER_NOW() + CYCLE_TIME, 1,
|
||||
(void (*)(struct rtimer *, void *))powercycle, NULL);
|
||||
#endif
|
||||
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
|
Loading…
Reference in a new issue