Commit b13825f4 by Enrico Pozzobon

f7 scripts for measuring ram utilization

parent 75c36bef
......@@ -8,17 +8,52 @@ import serial
import subprocess
RAM_SIZE = 0x50000
def eprint(*args, **kargs):
print(*args, file=sys.stderr, **kargs)
def flash():
def popen_jlink():
pipe = subprocess.PIPE
cmd = ['JLinkExe', 'flash.jlink']
p = subprocess.Popen(cmd,
stdout=sys.stderr, stdin=pipe)
stdout, stderr = p.communicate("")
cmd = ['JLinkExe']
cmd.extend(['-autoconnect', '1'])
cmd.extend(['-device', 'STM32F746ZG'])
cmd.extend(['-if', 'swd'])
cmd.extend(['-speed', '4000'])
return subprocess.Popen(cmd, stdout=sys.stderr, stdin=pipe)
def flash():
p = popen_jlink()
return p.communicate(("""
loadbin build/f7.bin 0x8000000
r
g
exit
""").encode('ascii'))
def fill_ram():
p = popen_jlink()
return p.communicate(("""
h
loadbin ram_pattern.bin 0x20000000
savebin ram_copy.bin 0x20000000 0x%x
r
g
exit
""" % RAM_SIZE).encode('ascii'))
def dump_ram():
p = popen_jlink()
return p.communicate(("""
h
savebin ram_dump.bin 0x20000000 0x%x
exit
""" % RAM_SIZE).encode('ascii'))
def get_serial():
import serial.tools.list_ports
......@@ -113,16 +148,10 @@ def main(argv):
uartp = UARTP(ser)
flash()
fill_ram()
eprint("Flashed")
time.sleep(0.1)
ser.setDTR(False) # IO0=HIGH
ser.setRTS(True) # EN=LOW, chip in reset
time.sleep(0.1)
ser.setDTR(False) # IO0=HIGH
ser.setRTS(False) # EN=HIGH, chip out of reset
time.sleep(1)
def stdin_read(n):
b = sys.stdin.buffer.read(n)
if len(b) != n:
......@@ -176,6 +205,37 @@ def main(argv):
raise Exception("Unacknowledged variable transfer")
eprint("Operation %c completed successfully" % action)
elif action in b"u":
dump_ram()
with open("ram_copy.bin", 'rb') as dump:
dump_a = dump.read()
with open("ram_dump.bin", 'rb') as dump:
dump_b = dump.read()
if len(dump_a) != RAM_SIZE or len(dump_b) != RAM_SIZE:
raise Exception("Wrong dump sizes: 0x%x, 0x%x" % (len(dump_a), len(dump_b)))
streaks = []
streak_beg = 0
streak_end = 0
for i in range(len(dump_a)):
if dump_a[i] == dump_b[i]:
streak_end = i
else:
if streak_end != streak_beg:
streaks.append((streak_beg, streak_end))
streak_beg = i
streak_end = i
for b, e in streaks:
eprint("equal bytes from 0x%x to 0x%x (length: %d)" % (b, e, e-b))
b, e = max(streaks, key=lambda a: a[1]-a[0])
eprint("longest equal bytes streak from 0x%x to 0x%x (length: %d)" % (b, e, e-b))
v = struct.pack("<II", 4, e-b)
sys.stdout.buffer.write(v)
sys.stdout.flush()
else:
raise Exception("Unknown action %c" % action)
......
......@@ -16,11 +16,7 @@ def main(argv):
for attempt in range(3):
print("beginning test %d of '%s' using test vectors '%s'" % (attempt, ' '.join(cmd), argv[1]))
try:
measurements = begin_measurement()
try:
test(argv[1], cmd)
finally:
end_measurement(measurements)
test(argv[1], cmd)
print("TEST SUCCESSFUL")
return 0
......@@ -115,6 +111,11 @@ def test(test_file, cmd):
if m != output:
raise Exception("output of encryption is different from expected ciphertext")
write(b'u')
output = obtain()
print(" untouched memory = %d" % struct.unpack("<I", output))
break
elif res is not None:
if res[1].lower() == 'count':
i = int(res[2], 10)
......@@ -133,43 +134,5 @@ def test(test_file, cmd):
else:
raise Exception("ERROR: unparsed line in test vectors file: '%s'" % line)
def begin_measurement():
import saleae
import time
sal = saleae.Saleae()
sal.set_active_channels([1, 2], [])
sal.set_sample_rate(sal.get_all_sample_rates()[0])
sal.set_capture_seconds(6000)
sal.capture_start()
time.sleep(1)
if sal.is_processing_complete():
raise Exception("Capture didn't start successfully")
return sal
def end_measurement(sal):
import time
if sal.is_processing_complete():
raise Exception("Capture finished before expected")
time.sleep(1)
sal.capture_stop();
time.sleep(.1)
for attempt in range(3):
if not sal.is_processing_complete():
print("Waiting for capture to complete...")
time.sleep(1)
continue
outfile = "measurement_%s.csv" % time.strftime("%Y%m%d-%H%M%S")
outfile = os.path.join("measurements", outfile)
if os.path.isfile(outfile):
os.unlink(outfile)
sal.export_data2(os.path.abspath(outfile))
print("Measurements written to '%s'" % outfile)
mdbfile = os.path.join("measurements", "measurements.txt")
mdbfile = open(mdbfile, "a")
mdbfile.write("%s > %s\n" % (' '.join(sys.argv), outfile))
mdbfile.close()
return 0
raise Exception("Capture didn't complete successfully")
if __name__ == "__main__":
sys.exit(main(sys.argv))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment