diff --git a/cpu/cc2430/8051def.h b/cpu/cc2430/8051def.h index 3201cba6e..e8627ddc4 100644 --- a/cpu/cc2430/8051def.h +++ b/cpu/cc2430/8051def.h @@ -52,37 +52,25 @@ typedef unsigned short clock_time_t; #define CCIF #define CLIF +/* Single asm instruction without messing up syntax highlighting */ +#if defined(__SDCC_mcs51) || defined(SDCC_mcs51) +#define ASM(x) __asm \ + x \ + __endasm +#else +#define ASM(x) +#endif + /* Critical section management */ #define DISABLE_INTERRUPTS() do {EA = 0;} while(0) #define ENABLE_INTERRUPTS() do {EA = 1;} while(0) -#define ENTER_CRITICAL() \ -{ \ - __asm \ - push ACC \ - push IE \ - __endasm; \ -} \ - EA = 0; - -#define EXIT_CRITICAL() \ -{ \ - __asm \ - pop ACC \ - __endasm; \ - ACC &= 0x80; \ - IE |= ACC; \ - __asm \ - pop ACC \ - __endasm; \ -} - /* Macro for a soft reset. */ #define SOFT_RESET() do {((void (__code *) (void)) 0x0000) ();} while(0) /* We don't provide architecture-specific checksum calculations */ -#define UIP_ARCH_ADD32 0 -#define UIP_ARCH_CHKSUM 0 +#define UIP_ARCH_ADD32 0 +#define UIP_ARCH_CHKSUM 0 #define CC_CONF_ASSIGN_AGGREGATE(dest, src) \ memcpy(dest, src, sizeof(*dest)) diff --git a/cpu/cc2430/dev/clock.c b/cpu/cc2430/dev/clock.c index a748f2853..d34097c92 100644 --- a/cpu/cc2430/dev/clock.c +++ b/cpu/cc2430/dev/clock.c @@ -27,57 +27,46 @@ * SUCH DAMAGE. * * This file is part of the Contiki operating system. - * - * $Id: clock.c,v 1.1 2009/09/08 20:07:35 zdshelby Exp $ */ /** * \file - * Implementation of the clock functions for the 8051 CPU + * Implementation of the clock functions for the cc243x * \author - * Zach Shelby (zach@sensinode.com) + * Zach Shelby (zach@sensinode.com) - original + * George Oikonomou - */ - -/** - * TODO: Implement clock_fine() and clock_fine_max_ticks() using another timer? - */ - -#include /*for debug printf*/ #include "sys/clock.h" #include "sys/etimer.h" #include "cc2430_sfr.h" #include "sys/energest.h" -/*Sleep timer runs on the 32k RC osc. */ +/* Sleep timer runs on the 32k RC osc. */ /* One clock tick is 7.8 ms */ #define TICK_VAL (32768/128) /* 256 */ - +/*---------------------------------------------------------------------------*/ +#if CLOCK_CONF_STACK_FRIENDLY +volatile __bit sleep_flag; +#else +#endif +/*---------------------------------------------------------------------------*/ /* 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 */ -volatile __bit sleep_flag; -#endif -/*calculates seconds*/ -static volatile __data clock_time_t seconds = 0; - +static volatile __data clock_time_t count = 0; /* Uptime in ticks */ +static volatile __data clock_time_t seconds = 0; /* Uptime in secs */ /*---------------------------------------------------------------------------*/ /** - * One delay is about 0.6 us, so this function delays for len * 0.6 us + * Each iteration is ~1.0xy usec, so this function delays for roughly len usec */ void clock_delay(unsigned int len) { - unsigned int i; - for(i = 0; i< len; i++) { - __asm - nop - __endasm; + DISABLE_INTERRUPTS(); + while(len--) { + ASM(nop); ASM(nop); ASM(nop); + ASM(nop); ASM(nop); } + ENABLE_INTERRUPTS(); } /*---------------------------------------------------------------------------*/ /** @@ -92,7 +81,7 @@ clock_wait(int i) while(clock_time() - start < (clock_time_t)i); } /*---------------------------------------------------------------------------*/ -clock_time_t +CCIF clock_time_t clock_time(void) { return count; @@ -107,24 +96,24 @@ clock_seconds(void) void clock_init(void) { - CLKCON = OSC32K | TICKSPD2|TICKSPD1; /*tickspeed 500 kHz for timers[1-4]*/ - - /*Initialize tick value*/ - timer_value = ST0; /*sleep timer 0. low bits [7:0]*/ - timer_value += ((unsigned long int)ST1) << 8; /*middle bits [15:8]*/ - timer_value += ((unsigned long int)ST2) << 16; /*high bits [23:16]*/ - timer_value += TICK_VAL; /*init value 256*/ + CLKCON = OSC32K | TICKSPD2 | TICKSPD1; /* tickspeed 500 kHz for timers[1-4] */ + + /* Initialize tick value */ + timer_value = ST0; /* ST low bits [7:0] */ + timer_value += ((unsigned long int) ST1) << 8; /* middle bits [15:8] */ + timer_value += ((unsigned long int) ST2) << 16; /* high bits [23:16] */ + timer_value += TICK_VAL; /* Init value 256 */ ST2 = (unsigned char) (timer_value >> 16); ST1 = (unsigned char) (timer_value >> 8); ST0 = (unsigned char) timer_value; - IEN0 |= STIE; /*interrupt enable for sleep timers. STIE=Interrupt mask, CPU. */ + IEN0_STIE = 1; /* IEN0.STIE acknowledge Sleep Timer Interrupt */ } /*---------------------------------------------------------------------------*/ void -clock_ISR( void ) __interrupt (ST_VECTOR) +clock_ISR(void) __interrupt(ST_VECTOR) { - IEN0_EA = 0; /*interrupt disable*/ + DISABLE_INTERRUPTS(); ENERGEST_ON(ENERGEST_TYPE_IRQ); /* @@ -134,14 +123,13 @@ clock_ISR( void ) __interrupt (ST_VECTOR) */ SLEEP &= 0xFC; - /* When using the cooperative scheduler the timer 2 ISR is only - required to increment the RTOS tick count. */ - - /*Read value of the ST0,ST1,ST2 and then add TICK_VAL and write it back. - Next interrupt occurs after the current time + TICK_VAL*/ + /* + * Read value of the ST0:ST1:ST2, add TICK_VAL and write it back. + * Next interrupt occurs after the current time + TICK_VAL + */ timer_value = ST0; - timer_value += ((unsigned long int)ST1) << 8; - timer_value += ((unsigned long int)ST2) << 16; + timer_value += ((unsigned long int) ST1) << 8; + timer_value += ((unsigned long int) ST2) << 16; timer_value += TICK_VAL; ST2 = (unsigned char) (timer_value >> 16); ST1 = (unsigned char) (timer_value >> 8); @@ -161,17 +149,17 @@ clock_ISR( void ) __interrupt (ST_VECTOR) ++seconds; } -#if CLOCK_CONF_ACCURATE - if(etimer_pending() && - (etimer_next_expiration_time() - count - 1) > MAX_TICKS) { /*core/sys/etimer.c*/ +#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; /*IRCON.STIF=Sleep timer interrupt flag. This flag called this interrupt func, now reset it*/ + IRCON_STIF = 0; ENERGEST_OFF(ENERGEST_TYPE_IRQ); - IEN0_EA = 1; /*interrupt enable*/ + ENABLE_INTERRUPTS(); } /*---------------------------------------------------------------------------*/ diff --git a/cpu/cc253x/dev/clock.c b/cpu/cc253x/dev/clock.c index 6d9a5fdc1..66f24d56c 100644 --- a/cpu/cc253x/dev/clock.c +++ b/cpu/cc253x/dev/clock.c @@ -27,15 +27,14 @@ * SUCH DAMAGE. * * This file is part of the Contiki operating system. - * - * $Id: clock.c,v 1.1 2009/09/08 20:07:35 zdshelby Exp $ */ /** * \file - * Implementation of the clock functions for the 8051 CPU + * Implementation of the clock functions for the cc253x. + * Ported over from the cc243x original. * \author - * Zach Shelby (zach@sensinode.com) - original + * Zach Shelby (zach@sensinode.com) - original (cc243x) * George Oikonomou - - cc2530 port */ #include "sfr-bits.h" @@ -47,8 +46,11 @@ /* Sleep timer runs on the 32k RC osc. */ /* One clock tick is 7.8 ms */ #define TICK_VAL (32768/128) /* 256 */ - -#define MAX_TICKS (~((clock_time_t)0) / 2) +/*---------------------------------------------------------------------------*/ +#if CLOCK_CONF_STACK_FRIENDLY +volatile __bit sleep_flag; +#else +#endif /*---------------------------------------------------------------------------*/ /* Do NOT remove the absolute address and do NOT remove the initialiser here */ __xdata __at(0x0000) static unsigned long timer_value = 0; @@ -57,15 +59,16 @@ static volatile __data clock_time_t count = 0; /* Uptime in ticks */ static volatile __data clock_time_t seconds = 0; /* Uptime in secs */ /*---------------------------------------------------------------------------*/ /** - * One delay is about 0.6 us, so this function delays for len * 0.6 us + * Each iteration is ~1.0xy usec, so this function delays for roughly len usec */ void clock_delay(unsigned int len) { - unsigned int i; - for(i = 0; i< len; i++) { + DISABLE_INTERRUPTS(); + while(len--) { ASM(nop); } + ENABLE_INTERRUPTS(); } /*---------------------------------------------------------------------------*/ /** @@ -117,7 +120,7 @@ clock_init(void) CLKCONCMD |= CLKCONCMD_TICKSPD2 | CLKCONCMD_TICKSPD1; while(CLKCONSTA != CLKCONCMD); - /*Initialize tick value*/ + /* Initialize tick value */ timer_value = ST0; timer_value += ((unsigned long int) ST1) << 8; timer_value += ((unsigned long int) ST2) << 16; @@ -126,7 +129,7 @@ clock_init(void) ST1 = (unsigned char) (timer_value >> 8); ST0 = (unsigned char) timer_value; - STIE = 1; /* IEN0.STIE interrupt enable */ + STIE = 1; /* IEN0.STIE interrupt enable */ } /*---------------------------------------------------------------------------*/ void @@ -135,15 +138,6 @@ clock_isr(void) __interrupt(ST_VECTOR) DISABLE_INTERRUPTS(); ENERGEST_ON(ENERGEST_TYPE_IRQ); - /* - * If the Sleep timer throws an interrupt while we are powering down to - * PM1, we need to abort the power down. Clear SLEEP.MODE, this will signal - * main() to abort the PM1 transition - * - * On cc2430 this would be: - * SLEEPCMD &= 0xFC; - */ - /* * Read value of the ST0:ST1:ST2, add TICK_VAL and write it back. * Next interrupt occurs after the current time + TICK_VAL @@ -170,10 +164,14 @@ clock_isr(void) __interrupt(ST_VECTOR) ++seconds; } +#if CLOCK_CONF_STACK_FRIENDLY + sleep_flag = 1; +#else if(etimer_pending() && (etimer_next_expiration_time() - count - 1) > MAX_TICKS) { etimer_request_poll(); } +#endif STIF = 0; /* IRCON.STIF */ ENERGEST_OFF(ENERGEST_TYPE_IRQ); diff --git a/cpu/cc253x/dev/uart0.c b/cpu/cc253x/dev/uart0.c index ba7856e77..85d0402c7 100644 --- a/cpu/cc253x/dev/uart0.c +++ b/cpu/cc253x/dev/uart0.c @@ -60,7 +60,6 @@ uart0_init() UART0_RX_EN(); UART0_RX_INT(1); - U0DBUF = 0; } /*---------------------------------------------------------------------------*/ /* Write one byte over the UART. */ diff --git a/cpu/stm32w108/Makefile.stm32w108 b/cpu/stm32w108/Makefile.stm32w108 index c408f7c16..8c12ab882 100644 --- a/cpu/stm32w108/Makefile.stm32w108 +++ b/cpu/stm32w108/Makefile.stm32w108 @@ -23,7 +23,7 @@ CONTIKI_CPU_DIRS = . dev hal simplemac hal/micro/cortexm3 hal/micro/cortexm3/stm STM32W_C = leds-arch.c leds.c clock.c watchdog.c uart1.c uart1-putchar.c slip_uart1.c slip.c\ stm32w-radio.c stm32w_systick.c uip_arch.c rtimer-arch.c adc.c micro.c sleep.c \ - micro-common.c micro-common-internal.c clocks.c mfg-token.c nvm.c flash.c rand.c system-timer.c mpu.c + micro-common.c micro-common-internal.c clocks.c mfg-token.c nvm.c flash.c rand.c system-timer.c STM32W_S = spmr.s79 context-switch.s79 @@ -297,3 +297,12 @@ else login: $(SERIALDUMP) -b115200 -d10000 $(USBDEVPREFIX)$(firstword $(MOTES)) endif + +# a target that gives a user-friendly memory profile, taking into account the RAM +# that is statically occupied by the stack as defined in cpu/stm32w108/gnu.ld +RAM_SIZE = 8192 +FLASH_SIZE = 128*1024 +STACK_SIZE = 1280 +%.size: %.$(TARGET) + @size -A $< | egrep "data|bss" | awk '{s+=$$2} END {s=s+$(STACK_SIZE); f=$(RAM_SIZE)-s; printf "[RAM] used %6d, free %6d\n",s,f;}' + @size -A $< | egrep "text|isr_vector" | awk '{s+=$$2} END {f=$(FLASH_SIZE)-s; printf "[Flash] used %6d, free %6d\n",s,f;}' diff --git a/examples/cc2530dk/timer-test.c b/examples/cc2530dk/timer-test.c index 6843e4df3..65f641fc0 100644 --- a/examples/cc2530dk/timer-test.c +++ b/examples/cc2530dk/timer-test.c @@ -1,9 +1,7 @@ /** * \file * Tests related to clocks and timers - * - * This is clock_test.c plus a small addition by George Oikonomou - * (Loughborough University) in order to test the rtimer + * This is based on clock_test.c from the original sensinode port * * \author * Zach Shelby (Original) @@ -17,7 +15,6 @@ #include "dev/leds.h" #include - /*---------------------------------------------------------------------------*/ #define TEST_CLOCK_DELAY 1 #define TEST_RTIMER 1 @@ -27,7 +24,7 @@ static struct etimer et; #if TEST_CLOCK_DELAY -static clock_time_t start_count, end_count, diff; +static rtimer_clock_t start_count, end_count, diff; #endif #if TEST_CLOCK_SECONDS @@ -70,12 +67,13 @@ PROCESS_THREAD(clock_test_process, ev, data) #if TEST_CLOCK_DELAY printf("Clock delay test, (10,000 x i) cycles:\n"); i = 1; - while(i < 6) { - start_count = clock_time(); + while(i < 7) { + start_count = RTIMER_NOW(); clock_delay(10000 * i); - end_count = clock_time(); + end_count = RTIMER_NOW(); diff = end_count - start_count; - printf("Delayed %u = %u ticks = ~%u ms\n", 10000 * i, diff, diff * 8); + printf("Delayed %u = %u rtimer ticks = ~%u us\n", 10000 * i, diff, + diff * 64); i++; } #endif diff --git a/examples/sensinode/clock_test.c b/examples/sensinode/clock_test.c deleted file mode 100644 index 24d3c6417..000000000 --- a/examples/sensinode/clock_test.c +++ /dev/null @@ -1,67 +0,0 @@ -/** - * \file - * Tests related to clocks and timers - * \author - * Zach Shelby - */ - -#include "contiki.h" -#include "sys/clock.h" -#include "dev/bus.h" -#include "dev/leds.h" -#include /* For printf() */ -/*---------------------------------------------------------------------------*/ -PROCESS(clock_test_process, "Clock test process"); -AUTOSTART_PROCESSES(&clock_test_process); -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(clock_test_process, ev, data) -{ - static struct etimer et; - static clock_time_t count, start_count, end_count, diff; - static unsigned long sec; - static uint8_t i; - - PROCESS_BEGIN(); - - printf("Clock delay test (10 x (10,000xi) cycles):\n"); - i = 1; - while(i < 6) { - start_count = clock_time(); - clock_delay(10000*i); - end_count = clock_time(); - diff = end_count-start_count; - printf("Delayed %u = %u ticks = ~%u ms\n", 10000*i, diff, diff*8 ); - i++; - } - - printf("Clock tick and etimer test (10 x 1s):\n"); - i = 0; - while(i < 10) { - etimer_set(&et, CLOCK_SECOND); - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); - etimer_reset(&et); - - count = clock_time(); - printf("%u ticks\n", count); - - leds_toggle(LEDS_RED); - i++; - } - - printf("Clock seconds test (10 x 5s):\n"); - i = 0; - while(i < 10) { - etimer_set(&et, 5 * CLOCK_SECOND); - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); - etimer_reset(&et); - - sec = clock_seconds(); - printf("%u seconds\n", (uint16_t) sec); - - leds_toggle(LEDS_GREEN); - i++; - } - - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/sensinode/timer-test.c b/examples/sensinode/timer-test.c index 3afc53320..65f641fc0 100644 --- a/examples/sensinode/timer-test.c +++ b/examples/sensinode/timer-test.c @@ -1,9 +1,7 @@ /** * \file * Tests related to clocks and timers - * - * This is clock_test.c plus a small addition by George Oikonomou - * (Loughborough University)in order to test the rtimer + * This is based on clock_test.c from the original sensinode port * * \author * Zach Shelby (Original) @@ -23,59 +21,73 @@ #define TEST_ETIMER 1 #define TEST_CLOCK_SECONDS 1 /*---------------------------------------------------------------------------*/ +static struct etimer et; + +#if TEST_CLOCK_DELAY +static rtimer_clock_t start_count, end_count, diff; +#endif + +#if TEST_CLOCK_SECONDS +static unsigned long sec; +#endif + +#if TEST_ETIMER +static clock_time_t count; +#endif + +#if TEST_RTIMER +static struct rtimer rt; +rtimer_clock_t rt_now, rt_for; +static clock_time_t ct; +#endif + +static uint8_t i; +/*---------------------------------------------------------------------------*/ PROCESS(clock_test_process, "Clock test process"); AUTOSTART_PROCESSES(&clock_test_process); /*---------------------------------------------------------------------------*/ #if TEST_RTIMER void rt_callback(struct rtimer *t, void *ptr) { - printf("Task called at %u\n", RTIMER_NOW()); + rt_now = RTIMER_NOW(); + ct = clock_time(); + printf("Task called at %u (clock = %u)\n", rt_now, ct); } #endif /*---------------------------------------------------------------------------*/ PROCESS_THREAD(clock_test_process, ev, data) { - static struct etimer et; - -#if TEST_CLOCK_DELAY - static clock_time_t start_count, end_count, diff; -#endif -#if TEST_CLOCK_SECONDS - static unsigned long sec; -#endif -#if TEST_ETIMER - static clock_time_t count; -#endif -#if TEST_RTIMER - uint16_t rt_now, rt_for; - static struct rtimer rt; -#endif - static uint8_t i; PROCESS_BEGIN(); + etimer_set(&et, 2 * CLOCK_SECOND); + + PROCESS_YIELD(); + #if TEST_CLOCK_DELAY - printf("Clock delay test (10 x (10,000xi) cycles):\n"); + printf("Clock delay test, (10,000 x i) cycles:\n"); i = 1; - while(i < 6) { - start_count = clock_time(); + while(i < 7) { + start_count = RTIMER_NOW(); clock_delay(10000 * i); - end_count = clock_time(); + end_count = RTIMER_NOW(); diff = end_count - start_count; - printf("Delayed %u = %u ticks = ~%u ms\n", 10000 * i, diff, diff * 8); + printf("Delayed %u = %u rtimer ticks = ~%u us\n", 10000 * i, diff, + diff * 64); i++; } #endif #if TEST_RTIMER - printf("Rtimer Test (10 x 1s):\n"); + printf("Rtimer Test, 1 sec (%u rtimer ticks):\n", RTIMER_SECOND); i = 0; - while(i < 10) { + while(i < 5) { etimer_set(&et, 2*CLOCK_SECOND); - puts("======================="); + printf("=======================\n"); + ct = clock_time(); rt_now = RTIMER_NOW(); rt_for = rt_now + RTIMER_SECOND; - printf("%Now=%u - For=%u\n", rt_now, rt_for); + printf("Now=%u (clock = %u) - For=%u\n", rt_now, ct, rt_for); if (rtimer_set(&rt, rt_for, 1, (void (*)(struct rtimer *, void *))rt_callback, NULL) != RTIMER_OK) { printf("Error setting\n"); @@ -87,7 +99,7 @@ PROCESS_THREAD(clock_test_process, ev, data) #endif #if TEST_ETIMER - printf("Clock tick and etimer test (10 x 1s):\n"); + printf("Clock tick and etimer test, 1 sec (%u clock ticks):\n", CLOCK_SECOND); i = 0; while(i < 10) { etimer_set(&et, CLOCK_SECOND); @@ -103,7 +115,7 @@ PROCESS_THREAD(clock_test_process, ev, data) #endif #if TEST_CLOCK_SECONDS - printf("Clock seconds test (10 x 5s):\n"); + printf("Clock seconds test (5s):\n"); i = 0; while(i < 10) { etimer_set(&et, 5 * CLOCK_SECOND); @@ -111,13 +123,15 @@ PROCESS_THREAD(clock_test_process, ev, data) etimer_reset(&et); sec = clock_seconds(); - printf("%u seconds\n", (uint16_t) sec); + printf("%lu seconds\n", sec); leds_toggle(LEDS_GREEN); i++; } #endif + printf("Done!\n"); + PROCESS_END(); } /*---------------------------------------------------------------------------*/ diff --git a/platform/cc2530dk/contiki-conf.h b/platform/cc2530dk/contiki-conf.h index 647cb39b3..27d7317d5 100644 --- a/platform/cc2530dk/contiki-conf.h +++ b/platform/cc2530dk/contiki-conf.h @@ -10,6 +10,14 @@ #include "project-conf.h" #endif /* PROJECT_CONF_H */ +/* + * 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 + /* Energest Module */ #ifndef ENERGEST_CONF_ON #define ENERGEST_CONF_ON 0 diff --git a/platform/cc2530dk/contiki-main.c b/platform/cc2530dk/contiki-main.c index bbf469dff..63d42eaab 100644 --- a/platform/cc2530dk/contiki-main.c +++ b/platform/cc2530dk/contiki-main.c @@ -45,6 +45,10 @@ PROCESS_NAME(viztool_process); #define PUTCHAR(...) do {} while(0) #endif /*---------------------------------------------------------------------------*/ +#if CLOCK_CONF_STACK_FRIENDLY +extern volatile __bit sleep_flag; +#endif +/*---------------------------------------------------------------------------*/ extern rimeaddr_t rimeaddr_node_addr; static __data int r; static __data int len; @@ -252,6 +256,16 @@ main(void) do { /* Reset watchdog and handle polls and events */ watchdog_periodic(); + +#if CLOCK_CONF_STACK_FRIENDLY + if(sleep_flag) { + if(etimer_pending() && + (etimer_next_expiration_time() - clock_time() - 1) > MAX_TICKS) { + etimer_request_poll(); + } + sleep_flag = 0; + } +#endif r = process_run(); } while(r > 0); len = NETSTACK_RADIO.pending_packet(); diff --git a/platform/mb851/contiki-conf.h b/platform/mb851/contiki-conf.h index 902d8dbe5..06763b8f7 100644 --- a/platform/mb851/contiki-conf.h +++ b/platform/mb851/contiki-conf.h @@ -96,9 +96,16 @@ #define XMAC_CONF_ANNOUNCEMENTS 0 #define XMAC_CONF_COMPOWER 1 -/* Other */ +/* Other (RAM saving) */ #define ENERGEST_CONF_ON 0 #define QUEUEBUF_CONF_NUM 2 +#define QUEUEBUF_CONF_REF_NUM 0 +#define UIP_CONF_DS6_NBR_NBU 4 +#define UIP_CONF_DS6_ROUTE_NBU 4 +#define RPL_CONF_MAX_PARENTS_PER_DAG 4 +#define RPL_CONF_MAX_INSTANCES 1 +#define RPL_CONF_MAX_DAG_PER_INSTANCE 1 +#define PROCESS_CONF_NUMEVENTS 16 #if WITH_UIP6 @@ -129,11 +136,16 @@ #define UIP_CONF_MAX_LISTENPORTS 8 #define UIP_CONF_UDP_CONNS 4 -#include "net/sicslowpan.h" -#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_CONF_COMPRESSION_HC06 +#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 +#ifndef SICSLOWPAN_CONF_FRAG #define SICSLOWPAN_CONF_FRAG 1 +#endif /* SICSLOWPAN_CONF_FRAG */ +#ifndef SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS #define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2 +#endif /* SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS */ +#ifndef SICSLOWPAN_CONF_MAXAGE #define SICSLOWPAN_CONF_MAXAGE 2 +#endif /* SICSLOWPAN_CONF_MAXAGE */ #else /* WITH_UIP6 */ diff --git a/platform/mb851/contiki-main.c b/platform/mb851/contiki-main.c index ee09e2c91..fce0c640b 100644 --- a/platform/mb851/contiki-main.c +++ b/platform/mb851/contiki-main.c @@ -68,6 +68,9 @@ #include "net/rime/rime-udp.h" #include "net/uip.h" +#if WITH_UIP6 +#include "net/uip-ds6.h" +#endif /* WITH_UIP6 */ #define DEBUG 1 #if DEBUG @@ -100,8 +103,6 @@ set_rime_addr(void) uint8_t u8[8]; }eui64; - //rimeaddr_t lladdr; - int8u *stm32w_eui64 = ST_RadioGetEui64(); { int8u c; @@ -186,6 +187,32 @@ main(void) autostart_start(autostart_processes); + printf("Tentative link-local IPv6 address "); + { + uip_ds6_addr_t *lladdr; + int i; + lladdr = uip_ds6_get_link_local(-1); + for(i = 0; i < 7; ++i) { + printf("%02x%02x:", lladdr->ipaddr.u8[i * 2], + lladdr->ipaddr.u8[i * 2 + 1]); + } + printf("%02x%02x\n", lladdr->ipaddr.u8[14], lladdr->ipaddr.u8[15]); + } + + if(!UIP_CONF_IPV6_RPL) { + uip_ipaddr_t ipaddr; + int i; + uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); + uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr); + uip_ds6_addr_add(&ipaddr, 0, ADDR_TENTATIVE); + printf("Tentative global IPv6 address "); + for(i = 0; i < 7; ++i) { + printf("%02x%02x:", + ipaddr.u8[i * 2], ipaddr.u8[i * 2 + 1]); + } + printf("%02x%02x\n", + ipaddr.u8[7 * 2], ipaddr.u8[7 * 2 + 1]); + } watchdog_start(); @@ -262,11 +289,11 @@ void UsageFault_Handler(){ errcode = 7; //leds_on(LEDS_RED); //halReboot(); -}*/ +} void Default_Handler() { //errcode = 8; leds_on(LEDS_RED); halReboot(); -} +}*/ diff --git a/platform/mbxxx/contiki-conf.h b/platform/mbxxx/contiki-conf.h index e5aa9f3c7..e39be6c6a 100644 --- a/platform/mbxxx/contiki-conf.h +++ b/platform/mbxxx/contiki-conf.h @@ -96,9 +96,16 @@ #define XMAC_CONF_ANNOUNCEMENTS 0 #define XMAC_CONF_COMPOWER 1 -/* Other */ +/* Other (RAM saving) */ #define ENERGEST_CONF_ON 0 #define QUEUEBUF_CONF_NUM 2 +#define QUEUEBUF_CONF_REF_NUM 0 +#define UIP_CONF_DS6_NBR_NBU 4 +#define UIP_CONF_DS6_ROUTE_NBU 4 +#define RPL_CONF_MAX_PARENTS_PER_DAG 4 +#define RPL_CONF_MAX_INSTANCES 1 +#define RPL_CONF_MAX_DAG_PER_INSTANCE 1 +#define PROCESS_CONF_NUMEVENTS 16 #if WITH_UIP6 @@ -129,11 +136,16 @@ #define UIP_CONF_MAX_LISTENPORTS 8 #define UIP_CONF_UDP_CONNS 4 -#include "net/sicslowpan.h" -#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_CONF_COMPRESSION_HC06 +#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 +#ifndef SICSLOWPAN_CONF_FRAG #define SICSLOWPAN_CONF_FRAG 1 +#endif /* SICSLOWPAN_CONF_FRAG */ +#ifndef SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS #define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2 +#endif /* SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS */ +#ifndef SICSLOWPAN_CONF_MAXAGE #define SICSLOWPAN_CONF_MAXAGE 2 +#endif /* SICSLOWPAN_CONF_MAXAGE */ #else /* WITH_UIP6 */ diff --git a/platform/sensinode/contiki-conf.h b/platform/sensinode/contiki-conf.h index 278ba74de..2c812b7cc 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. */ @@ -27,7 +29,7 @@ #define ENERGEST_CONF_ON 0 #endif -/* Verbose Startup? Turning this off saves 700+ bytes of CODE in HOME */ +/* Verbose Startup? Turning this off reduces our footprint a fair bit */ #define STARTUP_CONF_VERBOSE 0 /* More CODE space savings by turning off process names */ @@ -35,9 +37,9 @@ /* * UARTs: 1=>Enabled, 0=>Disabled. Default: Both Disabled (see uart.h) - * Disabling UART0 saves ~200 bytes of CODE. - * Disabling UART1 saves ~500 bytes of CODE but also disables all debugging - * output. Should be used when nodes are meant to run on batteries + * Disabling UARTs reduces our CODE footprint + * Disabling UART1 also disables all debugging output. + * Should be used when nodes are meant to run on batteries * * On N740, by enabling UART1, you are also enabling an ugly hack which aims * to detect the USB connection during execution. It will then turn on/off 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;