]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Support for Safe TinyOS.
authorregehr <regehr>
Sat, 16 Feb 2008 05:23:47 +0000 (05:23 +0000)
committerregehr <regehr>
Sat, 16 Feb 2008 05:23:47 +0000 (05:23 +0000)
tools/tinyos/ncc/ncc.in

index 4c8d908b3f35bc6723db2753451acf928b4a07a3..a70759d540cb7cc22a0d13a07548ff4887e556c5 100644 (file)
@@ -26,6 +26,9 @@ else {
     $platform = "platforms";
 }
 
+my $exeflag=0;
+my $libs = "";
+
 # Have fun with the arguments
 
 for ($i = 0; $i <= $#ARGV; $i++) {
@@ -79,10 +82,26 @@ for ($i = 0; $i <= $#ARGV; $i++) {
            $strip = 1;
            push @includes, $file;
        }
+        elsif (/^-safe$/) {
+            $safe = 1;
+            $strip = 1;
+        }
+       elsif (/^-fnesc-cfile=(.*)/){
+           $appfilename=$1;
+       }
+       elsif (/^-o$/){
+           $exeflag=1;
+       }
+        elsif (/^-l/) {
+            $libs = $libs . " " . $_;
+        } 
        elsif (/^--version$/) {
            $print_version = 1;
        }
-    } 
+    } elsif ($exeflag) {
+       $exefilename =$_;
+       $exeflag=0;
+    }
 
     push @new_args, $_ if !$strip;
 }
@@ -120,6 +139,70 @@ if (!defined $target) {
     }
 }
 
+my $cpp;
+my $deputyasmexe;
+my $gcc;
+
+my $safe_home = $ENV{'TOSDIR'}."/lib/safe";
+push @new_args, "-fnesc-include=${safe_home}/include/annots_stage1";
+push @new_args, "-fnesc-genprefix=#include \"${safe_home}/include/annots_stage2.h\"";
+
+if ($safe) {
+
+    if (($target eq "mica2") or ($target eq "micaz")) {
+       $mcu = "avr";
+    } elsif ($target eq "telosb") {
+       $mcu = "msp430";
+    } else {
+       print STDERR "Safe TinyOS does not (yet) support the ${target} target.\n";
+       print STDERR "Supported targets: ";
+       print STDERR "mica2, micaz, telosb\n";
+       exit 2;
+    }
+
+    my $deputy_include = $ENV{'DEPUTY_HOME'}."/include";
+
+    push @new_args, "-DSAFE_TINYOS";
+    push @new_args, "-conly";
+    push @new_args, "-fnesc-deputy";
+
+    if (!defined $appfilename) {
+       $appfilename="build/${target}/app.c";
+    }
+    if (!defined $exefilename) {
+       $exefilename="build/${target}/main.exe";
+    }
+
+    $appfilename =~ m/^((.*\/)?)[^\/]+$/;
+    my $directory = $1;
+
+    # Might be useful to keep this app.c somewhere...
+    # This could probably be avoided by using the deputy script 
+    # instead of the executable directly...
+    $cpp = "${mcu}-gcc -E -DSAFE_TINYOS $appfilename -o ${directory}deputy-in.c -I${safe_home}/include"; 
+    
+    # Not worrying about racing protection, for now...
+    # --checksnescatomic racing.txt 
+    $deputyasmexe = "deputy-${mcu} --FLIDs --out ${directory}deputy-out.c ${directory}deputy-in.c";
+    
+    $failfile = "${TOSDIR}/lib/safe/${mcu}/fail.c";
+
+    my $gccflags;
+    if (($target eq "mica2") or ($target eq "micaz")) {
+       $gccflags = ("-mmcu=atmega128 -Os -fdollars-in-identifiers " .
+                   "-finline-limit=1000000 -Winline " .
+                   "--param inline-unit-growth=1000000 " .
+                   "--param large-function-growth=1000000");
+    }
+    elsif($target eq "telosb"){
+       $gccflags = "-Os -mdisable-hwmul -mmcu=msp430x1611";
+    }
+    
+    $gcc = ("${mcu}-gcc $gccflags -I${deputy_include} ${directory}deputy-out.c " .
+           "$failfile -o $exefilename $libs");
+
+}
+
 if (!defined $scheduler && !$is_tos_1) {
        $scheduler = "TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask";
 }
@@ -250,9 +333,26 @@ foreach $idir (@includes) {
 
 print STDERR join(' ', @new_args), "\n" if $verbose;
 
-exec @new_args;
-print STDERR "Couldn't execute nescc\n";
-exit 2;
+if ($safe) {
+    # nescc runs and puts in annotations like COUNT etc... 
+    system(@new_args)==0 or die "Couldn't execute nescc\n";
+
+    # cpp changes annotations into attributes for deputy
+    print STDERR "${cpp}\n" if $verbose;
+    system($cpp)==0 or die "gcc preprocess error!\n";
+
+    # deputy inserts the checks
+    print STDERR "${deputyasmexe}\n" if $verbose;
+    system($deputyasmexe)==0 or die "deputy error!\n";
+
+    print STDERR "${gcc}\n" if $verbose;
+    system($gcc)==0 or die "cil error!\n";
+
+} else {
+    exec @new_args;
+    print STDERR "Couldn't execute nescc\n";
+    exit 2;
+}
 
 sub extractarg {
     local ($i) = @_;