From: regehr Date: Sat, 6 Sep 2008 21:22:33 +0000 (+0000) Subject: switch to failure handlers written in nesC X-Git-Tag: rc_6_tinyos_2_1_1~625 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=ff7711f4ee4bbd41c597c9af63e6fec34690f9f1 switch to failure handlers written in nesC --- diff --git a/support/make/avr/avr.rules b/support/make/avr/avr.rules index 03b089ff..708a4ab6 100644 --- a/support/make/avr/avr.rules +++ b/support/make/avr/avr.rules @@ -24,7 +24,7 @@ endef HELP += $(AVR_HELP) ifdef MAKE_DEPUTY_FLAG - NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib ' $(TOSDIR)/lib/safe/avr/fail.c + NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -I$(TOSDIR)/lib/safe -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib ' else NCC_SAFE_TINYOS_FLAGS = endif diff --git a/support/make/msp/msp.rules b/support/make/msp/msp.rules index 04b09077..18d9affd 100644 --- a/support/make/msp/msp.rules +++ b/support/make/msp/msp.rules @@ -23,7 +23,7 @@ endef HELP += $(MSP_HELP) ifdef MAKE_DEPUTY_FLAG - NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib ' $(TOSDIR)/lib/safe/msp430/fail.c + NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -I$(TOSDIR)/lib/safe -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib ' else NCC_SAFE_TINYOS_FLAGS = endif diff --git a/tos/lib/safe/SafeFailureHandlerC.nc b/tos/lib/safe/SafeFailureHandlerC.nc new file mode 100644 index 00000000..ea8dd852 --- /dev/null +++ b/tos/lib/safe/SafeFailureHandlerC.nc @@ -0,0 +1,13 @@ + +#include "Timer.h" + +configuration SafeFailureHandlerC { +} +implementation { + components LedsC; + components SafeFailureHandlerP; + components BusyWaitMicroC as Wait; + + SafeFailureHandlerP.Leds -> LedsC; + SafeFailureHandlerP.BusyWait -> Wait; +} diff --git a/tos/lib/safe/SafeFailureHandlerP.nc b/tos/lib/safe/SafeFailureHandlerP.nc new file mode 100644 index 00000000..74d6892e --- /dev/null +++ b/tos/lib/safe/SafeFailureHandlerP.nc @@ -0,0 +1,140 @@ + +#include "Timer.h" + +module SafeFailureHandlerP { + uses { + interface Leds; + interface BusyWait; + } +} +implementation { + + #ifndef asmlinkage + #define asmlinkage + #endif + + #ifndef noreturn + #define noreturn __attribute__((noreturn)) + #endif + + void delay (int len) + { + volatile int x; + for (x=0; x> i)); + i -= 2; + } while (i >= 0); + } + + void display_int_flid (const unsigned int x) + { + roll (); + display_int (x); + roll (); + } + + asmlinkage noreturn + void deputy_fail_noreturn_fast (int flid) @C() @spontaneous() + { + atomic { + while(1) { + display_int_flid(flid); + } + } + } + + asmlinkage + void deputy_fail_mayreturn(int flid) @C() @spontaneous() + { + deputy_fail_noreturn_fast(flid); + } + + asmlinkage noreturn + void deputy_fail_noreturn(int flid) @C() @spontaneous() + { + deputy_fail_noreturn_fast(flid); + } +} diff --git a/tos/lib/safe/avr/fail.c b/tos/lib/safe/avr/fail.c deleted file mode 100644 index 32e57865..00000000 --- a/tos/lib/safe/avr/fail.c +++ /dev/null @@ -1,184 +0,0 @@ -#undef SAFE_TINYOS - -#include -#include - -// #define SIMPLE_FAIL - -#ifndef SIMPLE_FAIL - -static void led_off_0 (void) -{ - *(volatile unsigned char *)59U |= 1 << 0; -} - -static void led_off_1 (void) { - *(volatile unsigned char *)59U |= 1 << 1; -} - -static void led_off_2 (void) { - *(volatile unsigned char *)59U |= 1 << 2; -} - -static void led_on_0 (void) { - *(volatile unsigned char *)59U &= ~(1 << 0); -} - -static void led_on_1 (void) { - *(volatile unsigned char *)59U &= ~(1 << 1); -} - -static void led_on_2 (void) { - *(volatile unsigned char *)59U &= ~(1 << 2); -} - -static void delay (int len) -{ - volatile int x, y; - for (x=0; x> i)); - i -= 2; - } while (i >= 0); -} - -static void display_int_flid (const unsigned int x) -{ - roll (); - display_int (x); - roll (); -} - -#endif // ndef SIMPLE_FAIL - -static inline void load_to_z_and_break (int value) -{ - asm volatile ("movw %0, %1" "\n\t" - "break" "\n\t" - : "=z"(value) : "r" (value)); -} - -void deputy_fail_noreturn_fast (int flid) -{ - asm volatile ("cli"); - load_to_z_and_break (flid); - PORTA |= 7; - -#ifdef SIMPLE_FAIL - - while (1) { - int i; - PORTA ^= 7; - for (i = 0; i < 10; i++) { - uint16_t dt = 50000; - /* loop takes 8 cycles. this is 1uS if running on an internal 8MHz - clock, and 1.09uS if running on the external crystal. */ - asm volatile ( - "1: sbiw %0,1\n" - " adiw %0,1\n" - " sbiw %0,1\n" - " brne 1b" : "+w" (dt)); - } - } - -#else - - while (1) { - display_int_flid (flid); - } - -#endif - -} - -void deputy_fail_mayreturn(int flid) -{ - deputy_fail_noreturn_fast(flid); -} - -void deputy_fail_noreturn(int flid) -{ - deputy_fail_noreturn_fast(flid); -} diff --git a/tos/lib/safe/include/deputy/checks.h b/tos/lib/safe/include/deputy/checks.h index 61f935d9..f0582b86 100644 --- a/tos/lib/safe/include/deputy/checks.h +++ b/tos/lib/safe/include/deputy/checks.h @@ -50,7 +50,7 @@ extern asmlinkage noreturn void deputy_fail_noreturn(__LOCATION__FORMALS); extern asmlinkage noreturn -void deputy_fail_noreturn_fast(void); +void deputy_fail_noreturn_fast(__LOCATION__FORMALS); /* Search for a NULL starting at e and return its index */ extern asmlinkage diff --git a/tos/lib/safe/msp430/fail.c b/tos/lib/safe/msp430/fail.c deleted file mode 100644 index a1125c9d..00000000 --- a/tos/lib/safe/msp430/fail.c +++ /dev/null @@ -1,152 +0,0 @@ -#undef SAFE_TINYOS - -static void led_off_0 (void) { - __asm__ volatile ("bis.b #16, &0x0031"); // telos - __asm__ volatile ("bis.b #1, &0x001D"); // shimmer -} - -static void led_off_1 (void) { - __asm__ volatile ("bis.b #32, &0x0031"); // telos - __asm__ volatile ("bis.b #2, &0x001D"); // shimmer -} - -static void led_off_2 (void) { - __asm__ volatile ("bis.b #64, &0x0031"); // telos - __asm__ volatile ("bis.b #4, &0x001D"); // shimmer -} - -static void led_on_0 (void) { - __asm__ volatile ("bic.b #16, &0x0031"); // telos - __asm__ volatile ("bic.b #1, &0x001D"); // shimmer -} - -static void led_on_1 (void) { - __asm__ volatile ("bic.b #32, &0x0031"); // telos - __asm__ volatile ("bic.b #2, &0x001D"); // shimmer -} - -static void led_on_2 (void) { - __asm__ volatile ("bic.b #64, &0x0031"); // telos - __asm__ volatile ("bic.b #4, &0x001D"); // shimmer -} - -static void delay (int len) -{ - volatile int x, y; - for (x=0; x> i)); - i -= 2; - } while (i >= 0); -} - -static void display_int_flid (const unsigned int x) -{ - roll (); - display_int (x); - roll (); -} - -// Not sure how to do this in Telosb without looking it up -void deputy_fail_noreturn_fast (int flid) -{ - // disable interrupts - // set LEDS to output - - while (1) { - display_int_flid (flid); - } - -} - -void deputy_fail_mayreturn(int flid) -{ - deputy_fail_noreturn_fast(flid); -} - -void deputy_fail_noreturn(int flid) -{ - deputy_fail_noreturn_fast(flid); -} diff --git a/tos/system/MainC.nc b/tos/system/MainC.nc index 9f61d0ec..a6caac44 100644 --- a/tos/system/MainC.nc +++ b/tos/system/MainC.nc @@ -49,6 +49,10 @@ configuration MainC { implementation { components PlatformC, RealMainP, TinySchedulerC; +#ifdef SAFE_TINYOS + components SafeFailureHandlerC; +#endif + RealMainP.Scheduler -> TinySchedulerC; RealMainP.PlatformInit -> PlatformC;