[Tinyos-2-commits] CVS: tinyos-2.x/tos/lib/safe/avr fail.c, NONE,
1.1
John Regehr
regehr at users.sourceforge.net
Fri Feb 8 16:50:03 PST 2008
Update of /cvsroot/tinyos/tinyos-2.x/tos/lib/safe/avr
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv19611
Added Files:
fail.c
Log Message:
safe tinyos failure handling routines for avr-based motes
--- NEW FILE: fail.c ---
#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 (const char* file, int flid, const char* func)
{
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(const char *check, const char *text,
const char* file, int line, const char* func)
{
// I don't think this has any meaning without FLID transformation
// FLID transformation stores FLID in line variable
deputy_fail_noreturn_fast(file, line, func);
}
void deputy_fail_noreturn(const char *check, const char *text,
const char* file, int line, const char* func)
{
// I don't think this has any meaning without FLID transformation
// FLID transformation stores FLID in line variable
deputy_fail_noreturn_fast(file, line, func);
}
More information about the Tinyos-2-commits
mailing list