improved support for MicaZ emulation - added variable watcher functionality
This commit is contained in:
parent
b909a62265
commit
be313dd97d
|
@ -0,0 +1,146 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009, Swedish Institute of Computer Science. 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.
|
||||||
|
*
|
||||||
|
* $Id: AvrMoteMemory.java,v 1.1 2009/11/12 12:49:34 joxe Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
package se.sics.cooja.avrmote;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import se.sics.cooja.AddressMemory;
|
||||||
|
import se.sics.cooja.MoteMemory;
|
||||||
|
import avrora.arch.avr.AVRProperties;
|
||||||
|
import avrora.core.SourceMapping;
|
||||||
|
import avrora.core.SourceMapping.Location;
|
||||||
|
import avrora.sim.AtmelInterpreter;
|
||||||
|
/**
|
||||||
|
* @author Joakim Eriksson
|
||||||
|
*/
|
||||||
|
public class AvrMoteMemory implements MoteMemory, AddressMemory {
|
||||||
|
private static Logger logger = Logger.getLogger(AvrMoteMemory.class);
|
||||||
|
|
||||||
|
private SourceMapping memoryMap;
|
||||||
|
private AtmelInterpreter interpreter;
|
||||||
|
private AVRProperties avrProperties;
|
||||||
|
|
||||||
|
public AvrMoteMemory(SourceMapping map, AVRProperties avrProperties, AtmelInterpreter interpreter) {
|
||||||
|
memoryMap = map;
|
||||||
|
this.interpreter = interpreter;
|
||||||
|
this.avrProperties = avrProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearMemory() {
|
||||||
|
logger.fatal("not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getMemorySegment(int address, int size) {
|
||||||
|
logger.fatal("getMemorySegment is not implemented");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTotalSize() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMemorySegment(int address, byte[] data) {
|
||||||
|
logger.fatal("setMemorySegment is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] getByteArray(String varName, int length)
|
||||||
|
throws UnknownVariableException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getByteValueOf(String varName) throws UnknownVariableException {
|
||||||
|
return (byte) getValueOf(varName, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getValueOf(String varName, int len) throws UnknownVariableException {
|
||||||
|
Location mem = memoryMap.getLocation(varName);
|
||||||
|
if (mem == null) throw new UnknownVariableException("Variable does not exist: " + varName);
|
||||||
|
|
||||||
|
System.out.println("Variable:" + varName + " in section: " + mem.section);
|
||||||
|
System.out.println("LMA: " + Integer.toHexString(mem.lma_addr));
|
||||||
|
System.out.println("VMA: " + Integer.toHexString(mem.vma_addr));
|
||||||
|
|
||||||
|
System.out.println("Data: " + interpreter.getDataByte(mem.lma_addr & 0xfffff));
|
||||||
|
System.out.println("Flash: " + interpreter.getFlashByte(mem.lma_addr & 0xfffff));
|
||||||
|
int data = 0;
|
||||||
|
if (mem.vma_addr > 0xfffff) {
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
data = (data << 8) + (interpreter.getDataByte((mem.vma_addr & 0xfffff) + i) & 0xff);
|
||||||
|
System.out.println("Read byte: " + interpreter.getDataByte((mem.vma_addr & 0xfffff) + i) +
|
||||||
|
" => " + data);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
data = (data << 8) + interpreter.getFlashByte(mem.vma_addr + i) & 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIntValueOf(String varName) throws UnknownVariableException {
|
||||||
|
return getValueOf(varName, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIntegerLength() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVariableAddress(String varName)
|
||||||
|
throws UnknownVariableException {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getVariableNames() {
|
||||||
|
ArrayList<String> symbols = new ArrayList<String>();
|
||||||
|
for (Iterator i = memoryMap.getIterator(); i.hasNext();) {
|
||||||
|
symbols.add(((Location) i.next()).name);
|
||||||
|
}
|
||||||
|
return symbols.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setByteArray(String varName, byte[] data)
|
||||||
|
throws UnknownVariableException {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setByteValueOf(String varName, byte newVal)
|
||||||
|
throws UnknownVariableException {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIntValueOf(String varName, int newVal)
|
||||||
|
throws UnknownVariableException {
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean variableExists(String varName) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,7 +26,7 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: MicaZMote.java,v 1.9 2009/10/30 09:42:50 fros4943 Exp $
|
* $Id: MicaZMote.java,v 1.10 2009/11/12 12:49:34 joxe Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja.avrmote;
|
package se.sics.cooja.avrmote;
|
||||||
|
@ -45,7 +45,10 @@ import se.sics.cooja.MoteMemory;
|
||||||
import se.sics.cooja.MoteType;
|
import se.sics.cooja.MoteType;
|
||||||
import se.sics.cooja.Simulation;
|
import se.sics.cooja.Simulation;
|
||||||
import se.sics.cooja.motes.AbstractEmulatedMote;
|
import se.sics.cooja.motes.AbstractEmulatedMote;
|
||||||
|
import se.sics.cooja.mspmote.MspMoteMemory;
|
||||||
|
import avrora.arch.avr.AVRProperties;
|
||||||
import avrora.core.LoadableProgram;
|
import avrora.core.LoadableProgram;
|
||||||
|
import avrora.sim.AtmelInterpreter;
|
||||||
import avrora.sim.Interpreter;
|
import avrora.sim.Interpreter;
|
||||||
import avrora.sim.Simulator;
|
import avrora.sim.Simulator;
|
||||||
import avrora.sim.State;
|
import avrora.sim.State;
|
||||||
|
@ -67,8 +70,9 @@ public class MicaZMote extends AbstractEmulatedMote implements Mote {
|
||||||
private Microcontroller myCpu = null;
|
private Microcontroller myCpu = null;
|
||||||
private MicaZ micaZ = null;
|
private MicaZ micaZ = null;
|
||||||
private LoadableProgram program = null;
|
private LoadableProgram program = null;
|
||||||
private Interpreter interpreter = null;
|
private AtmelInterpreter interpreter = null;
|
||||||
|
private AvrMoteMemory myMemory = null;
|
||||||
|
private AVRProperties avrProperties = null;
|
||||||
private MicaZMoteType myMoteType = null;
|
private MicaZMoteType myMoteType = null;
|
||||||
|
|
||||||
/* Stack monitoring variables */
|
/* Stack monitoring variables */
|
||||||
|
@ -144,9 +148,11 @@ public class MicaZMote extends AbstractEmulatedMote implements Mote {
|
||||||
PlatformFactory factory = new MicaZ.Factory();
|
PlatformFactory factory = new MicaZ.Factory();
|
||||||
micaZ = (MicaZ) factory.newPlatform(1, program.getProgram());
|
micaZ = (MicaZ) factory.newPlatform(1, program.getProgram());
|
||||||
myCpu = micaZ.getMicrocontroller();
|
myCpu = micaZ.getMicrocontroller();
|
||||||
|
avrProperties = (AVRProperties) myCpu.getProperties();
|
||||||
Simulator sim = myCpu.getSimulator();
|
Simulator sim = myCpu.getSimulator();
|
||||||
interpreter = sim.getInterpreter();
|
interpreter = (AtmelInterpreter) sim.getInterpreter();
|
||||||
// State state = interpreter.getState();
|
// State state = interpreter.getState();
|
||||||
|
myMemory = new AvrMoteMemory(program.getProgram().getSourceMapping(), avrProperties, interpreter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setState(State newState) {
|
public void setState(State newState) {
|
||||||
|
@ -267,12 +273,11 @@ public class MicaZMote extends AbstractEmulatedMote implements Mote {
|
||||||
}
|
}
|
||||||
|
|
||||||
public MoteMemory getMemory() {
|
public MoteMemory getMemory() {
|
||||||
/* TODO Implement */
|
return myMemory;
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMemory(MoteMemory memory) {
|
public void setMemory(MoteMemory memory) {
|
||||||
/* TODO Implement */
|
myMemory = (AvrMoteMemory) memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|
Loading…
Reference in a new issue