From: regehr Date: Sat, 16 Feb 2008 05:23:47 +0000 (+0000) Subject: Support for Safe TinyOS. X-Git-Tag: release_tinyos_2_1_0_0~538 X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=commitdiff_plain;h=25320105bc0d8613650cb9019e34453bc7396f82 Support for Safe TinyOS. --- diff --git a/tools/tinyos/ncc/ncc.in b/tools/tinyos/ncc/ncc.in index 4c8d908b..a70759d5 100644 --- a/tools/tinyos/ncc/ncc.in +++ b/tools/tinyos/ncc/ncc.in @@ -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) = @_;