Switched to jbboric's version of the rammap.

This commit is contained in:
M4x1m3
2020-01-04 20:49:54 +01:00
parent ae06bb0d81
commit bcda0d71e3
3 changed files with 85 additions and 52 deletions

11
apps/calculation/test.py Normal file
View File

@@ -0,0 +1,11 @@
import sys, tty
def command_line():
tty.setraw(sys.stdin)
while True:
char = sys.stdin.read(1)
if ord(char) == 3: # CTRL-C
break;
print(ord(char))
sys.stdout.write(u"\u001b[1000D") # Move all the way left
command_line();

View File

@@ -4,61 +4,86 @@ import re
import subprocess import subprocess
import sys import sys
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import random
from matplotlib.ticker import FormatStrFormatter from matplotlib.ticker import FormatStrFormatter
readelf_line_regex = re.compile("[0-9]+:\s+([0-9a-f]+)\s+([0-9]+)\s+[A-Z]+") def filter_set(data, pred):
def parse_line(line): result = {}
hex_start, dec_size = re.findall(readelf_line_regex, line)[0] for k,v in data.items():
return (int(hex_start, 16), int(dec_size)) if (pred(v)):
result[k] = v
return result
readelf_output = subprocess.check_output([ def pred_ram(symbol):
"arm-none-eabi-readelf", return (symbol[0] >= 0x20000000) and (symbol[0] <= 0x20040000)
"-W", # Don't limit line lenght
"-s", # Sizes
sys.argv[1]
]).decode('utf-8')
for line in readelf_output.splitlines(): def pred_size(symbol):
words = line.split() return (symbol[1] >= 64)
if not words:
continue
symbol = words[-1]
if symbol == "_ZN3Ion17staticStorageAreaE":
storage = parse_line(line)
if symbol == "_ZZN13AppsContainer19sharedAppsContainerEvE20appsContainerStorage":
container = parse_line(line)
if symbol == "_stack_start":
stack_start, _ = parse_line(line)
if symbol == "_stack_end":
stack_end, _ = parse_line(line)
if symbol == "_heap_start":
heap_start, _ = parse_line(line)
if symbol == "_heap_end":
heap_end, _ = parse_line(line)
stack_size = stack_start - stack_end # Stack grows downwards def load_symbols(filename):
stack = (stack_end, stack_size) nm_output = subprocess.check_output([
heap_size = heap_end - heap_start "arm-none-eabi-nm",
heap = (heap_start, heap_size) "--print-size",
filename
]).decode('utf-8').splitlines()
nm_symbol_regex = re.compile("^([0-9A-Fa-f]+) ([0-9A-Fa-f]+) (.) (.+)$")
nm_sizeless_regex = re.compile("^([0-9a-z]+) (.) (.+)$")
symbol_results = [ re.match(nm_symbol_regex, line).groups() for line in nm_output if re.match(nm_symbol_regex, line) ]
sizeless_results = [ re.match(nm_sizeless_regex, line).groups() for line in nm_output if re.match(nm_sizeless_regex, line) ]
results = {}
for result in symbol_results:
results[result[3]] = ((int(result[0],16),int(result[1],16),result[2],result[3]))
for result in sizeless_results:
results[result[2]] = ((int(result[0],16),0,result[1],result[2]))
# Fixup stack and heap
for i in (("_stack_start", "_stack_end", "_stack"), ("_heap_start", "_heap_end", "_heap")):
if i[0] in results and i[1] in results:
start = results[i[0]]
end = results[i[1]]
results[i[2]] = (min(start[0], end[0]), abs(end[0]-start[0]), start[2], i[2])
del results[i[0]]
del results[i[1]]
return results
def demangle_symbols(symbols):
symbol_names = []
for name in symbols.keys():
symbol_names.append(name)
symbols_encoded = "\n".join(symbol_names).encode('utf-8')
demangled_output = subprocess.check_output(["c++filt"], input=symbols_encoded).decode('utf-8').splitlines()
demangled_symbols = {}
cpt=0
for symbol in symbols.values():
demangled_symbols[demangled_output[cpt]] = (symbol[0], symbol[1], symbol[2], demangled_output[cpt])
cpt += 1
return demangled_symbols
def format_kb(i): def format_kb(i):
return ("%d KB" % (i/1024)) return ("%.3f KiB" % (i/1024))
fig,ax = plt.subplots() def plot_symbols(symbols, range_start, range_end):
fig,ax = plt.subplots()
cpt = 0
for symbol in symbols.values():
symbol_name = symbol[3].lstrip("_")
symbol_color=(random.uniform(0,1),random.uniform(0,1),random.uniform(0,1))
ax.broken_barh([(symbol[0], symbol[1])], (0, 1), color=symbol_color, label=symbol_name + " - " + format_kb(symbol[1]))
cpt += 1
ax.set_yticks([])
ax.set_xticks(list(range(range_start, range_end+1, int((range_end-range_start)/16))))
xlabels = map(lambda t: '0x%08X' % int(t), ax.get_xticks())
ax.set_xticklabels(xlabels);
ax.legend()
fig.set_size_inches(20, 2)
return fig
def plot(value, name, c): data=load_symbols(sys.argv[1])
ax.broken_barh([value], (0, 1), color=c, label=name + " - " + format_kb(value[1])) data=demangle_symbols(data)
data = filter_set(data, pred_ram)
data = filter_set(data, pred_size)
plot(container, "Container", "blue") fig=plot_symbols(data,0x20000000,0x20040000)
plot(storage, "Storage", "red")
plot(heap, "Heap", "pink")
plot(stack, "Stack", "green")
ax.set_yticks([]) fig.show()
ax.set_xticks(list(range(0x20000000,0x20040001,0x10000))) input()
xlabels = map(lambda t: '0x%08X' % int(t), ax.get_xticks())
ax.set_xticklabels(xlabels);
ax.legend()
fig.set_size_inches(20, 2)
fig.savefig(sys.argv[2])

View File

@@ -20,11 +20,8 @@ $(eval $(call rule_for, \
with_local_version \ with_local_version \
)) ))
$(eval $(call rule_for, \ %_ram_map: %.$(EXE)
RAMSIZE, %_ram_map.png, %.$$(EXE), \ $(PYTHON) build/device/ram_map.py $(BUILD_DIR)/$<
$$(PYTHON) build/device/ram_map.py $$< $$@, \
with_local_version \
))
.PHONY: %_size .PHONY: %_size
%_size: $(BUILD_DIR)/%.$(EXE) %_size: $(BUILD_DIR)/%.$(EXE)
@@ -83,4 +80,4 @@ binpack: $(BUILD_DIR)/flasher.light.bin $(BUILD_DIR)/epsilon.onboarding.two_bina
cp $(BUILD_DIR)/flasher.light.bin $(BUILD_DIR)/binpack cp $(BUILD_DIR)/flasher.light.bin $(BUILD_DIR)/binpack
cp $(BUILD_DIR)/epsilon.onboarding.internal.bin $(BUILD_DIR)/epsilon.onboarding.external.bin $(BUILD_DIR)/binpack cp $(BUILD_DIR)/epsilon.onboarding.internal.bin $(BUILD_DIR)/epsilon.onboarding.external.bin $(BUILD_DIR)/binpack
cd $(BUILD_DIR) && for binary in flasher.light.bin epsilon.onboarding.internal.bin epsilon.onboarding.external.bin; do shasum -a 256 -b binpack/$${binary} > binpack/$${binary}.sha256;done cd $(BUILD_DIR) && for binary in flasher.light.bin epsilon.onboarding.internal.bin epsilon.onboarding.external.bin; do shasum -a 256 -b binpack/$${binary} > binpack/$${binary}.sha256;done
cd $(BUILD_DIR) && tar cvfz binpack-$(MODEL)-`git rev-parse HEAD | head -c 7`.tgz binpack/* cd $(BUILD_DIR) && tar cvfz binpack-$(MODEL)-`git rev-parse HEAD | head -c 7`.tgz binpack/*