From ce17fa131cbcca5b27995c718acb5b7c2b3c5e7c Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Mon, 2 Apr 2012 16:49:07 +0100 Subject: [PATCH] Stack-friendly cc243x clock ISR enabled by default This new approach (CLOCK_CONF_ACCURATE=0) was not as inaccurate as originally thought. In fact, it has pretty much the same accuracy as the old, stack-hungry version. * Renamed the define from CLOCK_CONF_ACCURATE (1: old) to CLOCK_CONF_STACK_FRIENDLY (1: new) to stop implying that one is more accurate than the other. * Using CLOCK_CONF_STACK_FRIENDLY by default. --- cpu/cc2430/dev/clock.c | 17 +++++++---------- platform/sensinode/contiki-conf.h | 10 ++++++---- platform/sensinode/contiki-sensinode-main.c | 10 +++------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/cpu/cc2430/dev/clock.c b/cpu/cc2430/dev/clock.c index fa902c0e3..b81bb4985 100644 --- a/cpu/cc2430/dev/clock.c +++ b/cpu/cc2430/dev/clock.c @@ -47,15 +47,12 @@ /* Used in sleep timer interrupt for calculating the next interrupt time */ static unsigned long timer_value; -/*starts calculating the ticks right after reset*/ -#if CLOCK_CONF_ACCURATE -static volatile __data clock_time_t count = 0; -#else -volatile __data clock_time_t count = 0; -/* accurate clock is stack hungry */ +#if CLOCK_CONF_STACK_FRIENDLY volatile __bit sleep_flag; +#else #endif -/*calculates seconds*/ + +static volatile __data clock_time_t count = 0; /* Uptime in ticks */ static volatile __data clock_time_t seconds = 0; /* Uptime in secs */ /*---------------------------------------------------------------------------*/ /** @@ -152,13 +149,13 @@ clock_ISR(void) __interrupt(ST_VECTOR) ++seconds; } -#if CLOCK_CONF_ACCURATE +#if CLOCK_CONF_STACK_FRIENDLY + sleep_flag = 1; +#else if(etimer_pending() && (etimer_next_expiration_time() - count - 1) > MAX_TICKS) { etimer_request_poll(); } -#else - sleep_flag = 1; #endif IRCON_STIF = 0; diff --git a/platform/sensinode/contiki-conf.h b/platform/sensinode/contiki-conf.h index 278ba74de..2c5494cee 100644 --- a/platform/sensinode/contiki-conf.h +++ b/platform/sensinode/contiki-conf.h @@ -10,10 +10,12 @@ #include "project-conf.h" #endif /* PROJECT_CONF_H */ -/* The clock ISR is stack-hungry and may cause crashes. - * Define this as 0 if you are suffering from frequent stack overflows */ -#ifndef CLOCK_CONF_ACCURATE -#define CLOCK_CONF_ACCURATE 1 +/* + * Define this as 1 to poll the etimer process from within main instead of from + * the clock ISR. This reduces the ISR's stack usage and may prevent crashes. + */ +#ifndef CLOCK_CONF_STACK_FRIENDLY +#define CLOCK_CONF_STACK_FRIENDLY 1 #endif /* Memory filesystem RAM size. */ diff --git a/platform/sensinode/contiki-sensinode-main.c b/platform/sensinode/contiki-sensinode-main.c index 66d2d0e75..24862336a 100644 --- a/platform/sensinode/contiki-sensinode-main.c +++ b/platform/sensinode/contiki-sensinode-main.c @@ -54,10 +54,7 @@ static __data int len; #define PUTCHAR(...) do {} while(0) #endif - -#if !CLOCK_CONF_ACCURATE -extern volatile __data clock_time_t count; -/* accurate clock is stack hungry */ +#if CLOCK_CONF_STACK_FRIENDLY extern volatile __bit sleep_flag; #endif @@ -294,11 +291,10 @@ main(void) /* Reset watchdog and handle polls and events */ watchdog_periodic(); - /**/ -#if !CLOCK_CONF_ACCURATE +#if CLOCK_CONF_STACK_FRIENDLY if(sleep_flag) { if(etimer_pending() && - (etimer_next_expiration_time() - count - 1) > MAX_TICKS) { /*core/sys/etimer.c*/ + (etimer_next_expiration_time() - clock_time() - 1) > MAX_TICKS) { etimer_request_poll(); } sleep_flag = 0;