[cooja] Added MemoryLayout class to represent basic information about

motes memory such as word size or endianess
This commit is contained in:
Enrico Joerns 2014-04-11 10:13:35 +02:00
parent c6f8a2d558
commit 579f0a9a93
4 changed files with 196 additions and 0 deletions

View file

@ -53,6 +53,8 @@ import avrora.sim.mcu.AtmelMicrocontroller;
import avrora.sim.mcu.EEPROM;
import avrora.sim.platform.MicaZ;
import avrora.sim.platform.PlatformFactory;
import java.nio.ByteOrder;
import org.contikios.cooja.mote.memory.MemoryLayout;
/**
* @author Joakim Eriksson, Fredrik Osterlind
@ -143,6 +145,7 @@ public class MicaZMote extends AbstractEmulatedMote implements Mote {
avrProperties = (AVRProperties) myCpu.getProperties();
Simulator sim = myCpu.getSimulator();
interpreter = (AtmelInterpreter) sim.getInterpreter();
new MemoryLayout(ByteOrder.LITTLE_ENDIAN, MemoryLayout.ARCH_8BIT, 2);
// State state = interpreter.getState();
myMemory = new AvrMoteMemory(program.getProgram().getSourceMapping(), avrProperties, interpreter);
}

View file

@ -34,6 +34,7 @@ import java.awt.Component;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
@ -51,6 +52,7 @@ import org.contikios.cooja.Simulation;
import org.contikios.cooja.Watchpoint;
import org.contikios.cooja.WatchpointMote;
import org.contikios.cooja.interfaces.IPAddress;
import org.contikios.cooja.mote.memory.MemoryLayout;
import org.contikios.cooja.motes.AbstractEmulatedMote;
import org.contikios.cooja.mspmote.interfaces.Msp802154Radio;
import org.contikios.cooja.mspmote.interfaces.MspSerial;
@ -105,6 +107,7 @@ public abstract class MspMote extends AbstractEmulatedMote implements Mote, Watc
public MspMote(MspMoteType moteType, Simulation simulation) {
this.simulation = simulation;
myMoteType = moteType;
new MemoryLayout(ByteOrder.LITTLE_ENDIAN, MemoryLayout.ARCH_16BIT, 2);
/* Schedule us immediately */
requestImmediateWakeup();

View file

@ -0,0 +1,188 @@
/*
* Copyright (c) 2014, TU Braunschweig
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE OR 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.
*/
package org.contikios.cooja.mote.memory;
import java.nio.ByteOrder;
/**
* Holds memory layout informations such as endianess, wordsize, C int size.
*
* @author Enrico Jorns
*/
public class MemoryLayout {
/** 8 bit memory architecture */
public static final int ARCH_8BIT = 1;
/** 16 bit memory architecture */
public static final int ARCH_16BIT = 2;
/** 32 bit memory architecture */
public static final int ARCH_32BIT = 4;
/** 64 bit memory architecture */
public static final int ARCH_64BIT = 8;
/**
* Size of data types in bytes.
*/
public enum DataType {
BYTE(1),
CHAR(1),
SHORT(2),
INT(4),
LONG(8),
LONGLONG(8),
INT8(1),
INT16(2),
INT32(4),
INT64(8),
FLOAT(4),
DOUBLE(8),
POINTER(4);
private int size;
DataType(int size) {
this.size = size;
}
public void setSize(int size) {
this.size = size;
}
public int getSize() {
return this.size;
}
}
public final ByteOrder order;
public final int addrSize;
public final int intSize;
public final int WORD_SIZE;
private boolean aligned = true;
/**
* Creates new MemoryLayout instance.
*
* @param order either ByteOrder.BIG_ENDIAN, or ByteOrder.LITTLE_ENDIAN
* @param wordsize should be one of ARCH_8BIT, ARCH_16BIT, ARCH_32BIT,
* ARCH_64BIT
* @param sizeofInt
*/
public MemoryLayout(ByteOrder order, int wordsize, int sizeofInt) {
this(order, wordsize, sizeofInt, wordsize);
}
/**
* Creates new MemoryLayout instance.
*
* @param order either ByteOrder.BIG_ENDIAN, or ByteOrder.LITTLE_ENDIAN
* @param wordsize should be one of ARCH_8BIT, ARCH_16BIT, ARCH_32BIT,
* ARCH_64BIT
* @param sizeofPointer
* @param sizeofInt
*/
public MemoryLayout(ByteOrder order, int wordsize, int sizeofInt, int sizeofPointer) {
this.order = order;
this.WORD_SIZE = wordsize;
this.intSize = sizeofInt;
this.addrSize = sizeofPointer;
DataType.INT.setSize(this.intSize);
DataType.POINTER.setSize(this.addrSize);
}
/**
* Returns the MemoryLayout for the running jvm.
*
* @return MemoryLayout for the running jvm.
*/
public static MemoryLayout getNative() {
return new MemoryLayout(
ByteOrder.nativeOrder(),
Integer.parseInt(System.getProperty("sun.arch.data.model")) / 8,
Integer.SIZE / 8);
}
/**
* Enable/Disable data alignment.
*
* Determines whether data alignemnt is used for packing structs.
* Default is enabled.
*
* @param aligned true to enable data alignment, false to disable
*/
public void setAligned(boolean aligned) {
this.aligned = aligned;
}
/**
* Returns true if data is aligned.
*
* @return if aligned
*/
public boolean isAligned() {
return aligned;
}
/**
* Returns number of padding bytes between two data types.
*
* @param currType
* @param nextType
* @return
*/
public int getPaddingBytesFor(DataType currType, DataType nextType) {
/* No padding bytes for unaligned memory */
if (!isAligned()) {
return 0;
}
/* get size of next element in structure */
int nextsize = nextType.getSize();
/* limit padding to word size */
nextsize = nextsize > WORD_SIZE ? WORD_SIZE : nextsize;
System.out.println("Nextsize: " + nextsize);
/* calc padding */
int pad = nextsize - currType.getSize();
return pad;
}
/**
* Returns information string for this MemoryLayout.
*
* @return String that shows Endianess and word size.
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
return sb.append("MemoryLayout: ")
.append("Endianess: ").append(order)
.append(", WORD_SIZE: ").append(WORD_SIZE)
.toString();
}
}

View file

@ -47,6 +47,7 @@ import org.contikios.cooja.Simulation;
import org.contikios.cooja.interfaces.ApplicationRadio;
import org.contikios.cooja.interfaces.ApplicationSerialPort;
import org.contikios.cooja.interfaces.Radio;
import org.contikios.cooja.mote.memory.MemoryLayout;
/**
* Abstract application mote.
@ -89,6 +90,7 @@ public abstract class AbstractApplicationMote extends AbstractWakeupMote impleme
public AbstractApplicationMote(MoteType moteType, Simulation sim) {
setSimulation(sim);
this.moteType = moteType;
MemoryLayout.getNative();
this.memory = new SectionMoteMemory(new HashMap<String, Integer>(), 0);
this.moteInterfaces = new MoteInterfaceHandler(this, moteType.getMoteInterfaceClasses());
this.moteInterfaces.getRadio().addObserver(radioDataObserver);