⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tos-storage-stm25p.in

📁 tinyos2.0版本驱动
💻 IN
字号:
#!@pathpython@# -*- python -*-# Copyright (c) 2005-2006 Arched Rock Corporation# All rights reserved.## Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions# are met:# - Redistributions of source code must retain the above copyright#   notice, this list of conditions and the following disclaimer.# - Redistributions in binary form must reproduce the above copyright#   notice, this list of conditions and the following disclaimer in the#   documentation and/or other materials provided with the#   distribution.# - Neither the name of the Arched Rock Corporation nor the names of#   its contributors may be used to endorse or promote products derived#   from this software without specific prior written permission.## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS# FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE# ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED# OF THE POSSIBILITY OF SUCH DAMAGE## Copyright (c) 2006-2007 Intel Corporation# All rights reserved.## This file is distributed under the terms in the attached INTEL-LICENSE     # file. If you do not find these files, copies can be found by writing to# Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, # 94704.  Attention:  Intel License Inquiry.# @author Jonathan Hui <jhui@archedrock.com># @author David Gay# @author Kevin Klues <klueska@cs.stanford.edu>## $Revision: 1.6 $# $Date: 2008/05/23 01:04:36 $#                                  from re import matchfrom sys import *from xml.dom import *from xml.dom.minidom import *from subprocess import Popen, PIPEfrom getopt import *import stringimport commands#New way of handling arguments........try:  opts, args = getopt(argv[1:], "t", [])except GetoptError, err:  print str(err) # will print something like "option -a not recognized"  stderr.write( "Usage: tos-storage-stm25p [-t] <platform directory>\n" )  if len( args ) == 1:  platformdir = args[0]  # This gives the whole string when there's no / in platformdir  platform = platformdir[platformdir.rfind( "/" ) + 1:]elif len( args ) == 0:  platformdir = ""  platform = ""else:  stderr.write( "Usage: tos-storage-stm25p [-t] <platform directory>\n" )  cthreads = Falsefor o, a in opts:  if o == "-t":    cthreads = True  else:    assert False, "unhandled option"def error_exit( s ):    stderr.write( "ERROR: " + s + "\n" )    exit( 2 )def expand_path( path ):  substrs = path.split( "%" )  path = substrs[0]  i = 1  while i < len( substrs ):    if substrs[i] == "":      # There was a %%, leading to a blank substring, and the next string      # should just be appended      path += "%"      i = i + 1      if i < len( substrs ):        path += substrs[i]    else:      # The first character of the string is the one that followed %      c = substrs[i][0]      if c == 'p':        sub = platform      elif c == 'P':        sub = platformdir      elif c == 'T':        sub = Popen( ["ncc", "-print-tosdir"], stdout=PIPE ).communicate( )[0]        sub = sub[:-1] # remove newline      else:        nfail( "unknown include-path substitution character " + c )      path += sub      path += substrs[i][1:]    i = i + 1  return pathNUM_SECTORS = 16SECTOR_SIZE = 65536volumes = {}volumeNames = []volumeSizes = []volumeOffsets = []volumeTypes = dict()volumeOptions = dict()freeSectors = NUM_SECTORS*[ True ]def volumeparse( file, fname, depth ):  if depth > 10:    error_exit( "include nesting too deep - check for cycles" )  try:    dom = parse( file )  except xml.parsers.expat.ExpatError:    error_exit( fname + " is not a valid input file" )  except IOError:    error_exit( "couldn't open file " + fname )  # extract information  for volume in dom.documentElement.getElementsByTagName( "volume" ):      name = volume.getAttribute( "name" )      size = volume.getAttribute( "size" )      base = volume.getAttribute( "base" )      type = string.lower(volume.getAttribute("type"))      isCircular = string.upper(volume.getAttribute("circular"))      if isCircular == "":          isCircular = "FALSE"            if name == "":          error_exit( "volume has no name" )      elif not match( "^[a-zA-Z0-9_]+$", name ):          error_exit( "volume has invalid name '%s'" % name )      elif volumes.has_key( name ):          error_exit( "duplicate volume definition '%s'" % name )      else:          volumes[ name ] = "blah"      if size == "":          error_exit( "volume '%s' has no size" % name )      try:          size = int( size )      except ValueError:          error_exit( "volume '%s' has invalid size" % name )      if base != "":          try:              base = int( base )          except ValueError:              error_exit( "volume '%s' has invalid base" % name )      if ( size & ( SECTOR_SIZE - 1 ) ) != 0:          error_exit( "size of volume '%s' is not a multiple of %d" % \                      ( name, SECTOR_SIZE ) )      if base != "" and ( base & ( SECTOR_SIZE - 1 ) ) != 0:          error_exit( "base of volume '%s' is not a multiple of %d" % \                      ( name, SECTOR_SIZE ) )      volumeNames.append( "VOLUME_" + name )      volumeSizes.append( size / SECTOR_SIZE )      volumeTypes["VOLUME_" + name] = type      volumeOptions["VOLUME_" + name] = isCircular            if base == "":          volumeOffsets.append( -1 )      else:          base = base / SECTOR_SIZE          size = size / SECTOR_SIZE          volumeOffsets.append( base )          for i in range( size ):              freeSectors[ i + base ] = False  for include in dom.documentElement.getElementsByTagName( "include" ):    included = include.firstChild    if included != None and included.nodeType == included.TEXT_NODE:      included = expand_path( included.data )      volumeparse( included, "(file %s)" % included, depth + 1 )    else:      error_exit( "invalid include directive " + fname )  dom.unlink( )volumeparse( stdin, "(standard input)", 0 )# allocate with first fit policyfor i in range( len( volumeOffsets ) ):    size = volumeSizes[ i ]    if volumeOffsets[ i ] == -1:        for j in range( NUM_SECTORS ):            if freeSectors[ j ]:                size -= 1                if size == 0:                    volumeOffsets[ i ] = j - ( volumeSizes[ i ] - 1 )                    break            else:                size = volumeSizes[ i ]        if volumeOffsets[ i ] == -1:            raise "Unable to satisfy allocation request."        else:            for j in range( volumeSizes[ i ] ):                freeSectors[ volumeOffsets[ i ] + j ] = False# output C fileprint "#ifndef __STORAGE_VOLUME_H__"print "#define __STORAGE_VOLUME_H__"print ""print "#include \"Stm25p.h\""print ""for i in range( len( volumeNames ) ):    print "#define %s %d" % ( volumeNames[ i ], i )print ""        print "static const stm25p_volume_info_t STM25P_VMAP[ %d ] = {" % \      len( volumeNames )for i in range( len( volumeNames ) ):    print "    { base : %d, size : %d }," % \          ( volumeOffsets[ i ], volumeSizes[ i ] )print "};"print ""print "#endif"# output nc file for threadsif cthreads == True:  outFile = open(commands.getstatusoutput("pwd")[1] + "/VolumeMapC.nc", "w")  outFile.write("#include \"StorageVolumes.h\" \n")  outFile.write("\n")  outFile.write("configuration VolumeMapC { \n")  outFile.write("  provides { \n")  outFile.write("    interface BlockRead[uint8_t volume_id]; \n")  outFile.write("    interface BlockWrite[uint8_t volume_id]; \n")  outFile.write("    interface LogRead[uint8_t volumeId]; \n")  outFile.write("    interface LogWrite[uint8_t volumeId]; \n")#   outFile.write("    interface Mount[uint8_t volumeId]; \n")#   outFile.write("    interface ConfigStorage[uint8_t volumeId]; \n")  outFile.write("  } \n")  outFile.write("} \n")  outFile.write("\n")  outFile.write("implementation { \n")  outFile.write("  components VolumeMapP; \n")  outFile.write("\n")  outFile.write("  BlockRead = VolumeMapP; \n")  outFile.write("  BlockWrite = VolumeMapP; \n")  outFile.write("  LogRead = VolumeMapP; \n")  outFile.write("  LogWrite = VolumeMapP; \n")  for i in range(len(volumeNames)):    if volumeTypes[volumeNames[i]] == "block":      outFile.write("\n")      outFile.write("  components new BlockStorageC(" + volumeNames[i] + ") as BlockStorageC_" + volumeNames[i] + "; \n")      outFile.write("  VolumeMapP.SubBlockRead[" + volumeNames[i] + "] -> BlockStorageC_" + volumeNames[i] + "; \n")      outFile.write("  VolumeMapP.SubBlockWrite[" + volumeNames[i] + "] -> BlockStorageC_" + volumeNames[i] + "; \n")      outFile.write("\n")          elif volumeTypes[volumeNames[i]] == "log":      outFile.write("\n")            outFile.write("  components new LogStorageC(" + volumeNames[i] + ", " + volumeOptions[volumeNames[i]] + ") as LogStorageC_" + volumeNames[i] + "; \n")      outFile.write("  VolumeMapP.SubLogRead[" + volumeNames[i] + "] -> LogStorageC_" + volumeNames[i] + "; \n")      outFile.write("  VolumeMapP.SubLogWrite[" + volumeNames[i] + "] -> LogStorageC_" + volumeNames[i] + "; \n")      outFile.write("\n")#     elif volumeTypes[volumeNames[i]] == "config":#       outFile.write("  components new ConfigStorageC(" + volumeNames[i] + ") as ConfigStorageC_" + volumeNames[i] + "; \n")#       outFile.write("  Mount[" + volumeNames[i] + "] = ConfigStorageC_" + volumeNames[i] + "; \n")#       outFile.write("  ConfigStorage[" + volumeNames[i] + "] = ConfigStorageC_" + volumeNames[i] + "; \n")  outFile.write("} \n")

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -