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
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
--- /dev/null
+
+#include "Timer.h"
+
+configuration SafeFailureHandlerC {
+}
+implementation {
+ components LedsC;
+ components SafeFailureHandlerP;
+ components BusyWaitMicroC as Wait;
+
+ SafeFailureHandlerP.Leds -> LedsC;
+ SafeFailureHandlerP.BusyWait -> Wait;
+}
--- /dev/null
+
+#include "Timer.h"
+
+module SafeFailureHandlerP {
+ uses {
+ interface Leds;
+ interface BusyWait<TMicro, uint16_t>;
+ }
+}
+implementation {
+
+ #ifndef asmlinkage
+ #define asmlinkage
+ #endif
+
+ #ifndef noreturn
+ #define noreturn __attribute__((noreturn))
+ #endif
+
+ void delay (int len)
+ {
+ volatile int x;
+ for (x=0; x<len; x++) {
+ call BusyWait.wait(2000);
+ }
+ }
+
+ void v_short_delay (void) { delay (10); }
+
+ void short_delay (void) { delay (80); }
+
+ void long_delay (void) { delay (800); }
+
+ void flicker (void)
+ {
+ int i;
+ for (i=0; i<20; i++) {
+ delay (20);
+ call Leds.led0Off();
+ call Leds.led1Off();
+ call Leds.led2Off();
+ delay (20);
+ call Leds.led0On();
+ call Leds.led1On();
+ call Leds.led2On();
+ }
+ call Leds.led0Off();
+ call Leds.led1Off();
+ call Leds.led2Off();
+ }
+
+ void roll (void)
+ {
+ int i;
+ for (i=0; i<10; i++) {
+ delay (30);
+ call Leds.led0On();
+ call Leds.led2Off();
+ delay (30);
+ call Leds.led1On();
+ call Leds.led0Off();
+ delay (30);
+ call Leds.led2On();
+ call Leds.led1Off();
+ }
+ call Leds.led2Off();
+ }
+
+ void separator (void)
+ {
+ call Leds.led0Off();
+ call Leds.led1Off();
+ call Leds.led2Off();
+ short_delay ();
+ call Leds.led0On();
+ call Leds.led1On();
+ call Leds.led2On();
+ v_short_delay ();
+ call Leds.led0Off();
+ call Leds.led1Off();
+ call Leds.led2Off();
+ short_delay ();
+ }
+
+ void display_b4 (int c)
+ {
+ switch (c) {
+ case 3:
+ call Leds.led2On();
+ case 2:
+ call Leds.led1On();
+ case 1:
+ call Leds.led0On();
+ case 0:
+ long_delay ();
+ break;
+ default:
+ flicker ();
+ }
+ separator ();
+ }
+
+ void display_int (const unsigned int x)
+ {
+ int i = 14;
+ do {
+ display_b4 (0x3 & (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);
+ }
+}
+++ /dev/null
-#undef SAFE_TINYOS
-
-#include <stdint.h>
-#include <avr/io.h>
-
-// #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<len; x++) {
- for (y=0; y<1000; y++) { }
- }
-}
-
-static void v_short_delay (void) { delay (10); }
-
-static void short_delay (void) { delay (80); }
-
-static void long_delay (void) { delay (800); }
-
-static void flicker (void)
-{
- int i;
- for (i=0; i<20; i++) {
- delay (20);
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
- delay (20);
- led_on_0 ();
- led_on_1 ();
- led_on_2 ();
- }
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
-}
-
-static void roll (void)
-{
- int i;
- for (i=0; i<10; i++) {
- delay (30);
- led_on_0 ();
- led_off_2 ();
- delay (30);
- led_on_1 ();
- led_off_0 ();
- delay (30);
- led_on_2 ();
- led_off_1 ();
- }
- led_off_2 ();
-}
-
-static void separator (void)
-{
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
- short_delay ();
- led_on_0 ();
- led_on_1 ();
- led_on_2 ();
- v_short_delay ();
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
- short_delay ();
-}
-
-static void display_b4 (int c)
-{
- switch (c) {
- case 3:
- led_on_2 ();
- case 2:
- led_on_1 ();
- case 1:
- led_on_0 ();
- case 0:
- long_delay ();
- break;
- default:
- flicker ();
- }
- separator ();
-}
-
-static void display_int (const unsigned int x)
-{
- int i = 14;
- do {
- display_b4 (0x3 & (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);
-}
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
+++ /dev/null
-#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<len; x++) {
- for (y=0; y<1000; y++) { }
- }
-}
-
-static void v_short_delay (void) { delay (10); }
-
-static void short_delay (void) { delay (80); }
-
-static void long_delay (void) { delay (800); }
-
-static void flicker (void)
-{
- int i;
- for (i=0; i<20; i++) {
- delay (20);
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
- delay (20);
- led_on_0 ();
- led_on_1 ();
- led_on_2 ();
- }
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
-}
-
-static void roll (void)
-{
- int i;
- for (i=0; i<10; i++) {
- delay (30);
- led_on_0 ();
- led_off_2 ();
- delay (30);
- led_on_1 ();
- led_off_0 ();
- delay (30);
- led_on_2 ();
- led_off_1 ();
- }
- led_off_2 ();
-}
-
-static void separator (void)
-{
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
- short_delay ();
- led_on_0 ();
- led_on_1 ();
- led_on_2 ();
- v_short_delay ();
- led_off_0 ();
- led_off_1 ();
- led_off_2 ();
- short_delay ();
-}
-
-static void display_b4 (int c)
-{
- switch (c) {
- case 3:
- led_on_2 ();
- case 2:
- led_on_1 ();
- case 1:
- led_on_0 ();
- case 0:
- long_delay ();
- break;
- default:
- flicker ();
- }
- separator ();
-}
-
-static void display_int (const unsigned int x)
-{
- int i = 14;
- do {
- display_b4 (0x3 & (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);
-}
implementation {
components PlatformC, RealMainP, TinySchedulerC;
+#ifdef SAFE_TINYOS
+ components SafeFailureHandlerC;
+#endif
+
RealMainP.Scheduler -> TinySchedulerC;
RealMainP.PlatformInit -> PlatformC;