#!/usr/bin/env ruby
require 'pp'
D = Struct.new(:sec, :size, :name)
target = ARGV.shift
sram = `arm-none-eabi-objdump -t '#{target}'`.chomp.split(/\n/).
select {|l| /\.bss|\.data/ =~ l }.
map {|l|
sec, size0 = *l.split(/\t/)
size, name = *size0.split(/\s+/) if size0
D.new(sec, size.to_i(16), name)
}
total = sram.map {|i| i.size }.reduce {|r,i| r + i}
sram.sort_by {|i|
i.size
}.each { |i|
puts "% 3d%% % 10d %s" % [i.size.to_f / total * 100, i.size, i.name]
}
puts "total: %d bytes" % total
こういうのを書いて
$ foo build/ch.elf
と実行すると
... 0% 124 SD1 0% 132 USBD1 1% 192 dump_buffer 1% 208 ch_idle_thread_wa 2% 384 SDU1 2% 384 rx_buffer 4% 640 waThread2 6% 960 waThread1 7% 1064 impure_data 10% 1616 measured 10% 1616 trace_index 13% 2048 spi_buffer 30% 4552 current_props total: 15081 bytes
こういう感じである程度わかる。