利用Makefile实现avr-size -C的效果
2016-01-03 by StavrosGNU工具链里的size大家应该都用过, 它可以显示elf/obj/exe/dll等可执行文件里各个段的大小, 非常方便. 加-A和-B参数分别是按sysv和berkeley格式显示, 默认带-B参数.
avr-gcc里的avr-size则又增加了一个-C的选项, 可以显示单片机flash和ram的占用比例, 需要同时用--mcu参数指定avr单片机的型号, 效果是这样的:
avr-size -C --mcu=attiny26 main.elf
AVR Memory Usage
----------------
Device: attiny26
Program: 1316 bytes (64.3% Full)
(.text + .data + .bootloader)
Data: 23 bytes (18.0% Full)
(.data + .bss + .noinit)
是不是很方便? 可惜arm-gcc里的size并没有这个选项, 于是从avr转到stm32之后, 常常会感觉到不方便.
后来发现, 只要在Makefile里all目标后面加上几行, 也能达到同样目的. 需要你的工具链里有sed和bc, sed用来从size的结果里截取包含数据的第二行, bc则用来作浮点运算.
@arr=(`$(TRGT)size $(PROJECT)_rom.elf | sed -n '2p'`); \
let flash=($${arr[0]}+$${arr[1]}); \
let mem=($${arr[1]}+$${arr[2]}); \
let flash_size=$(subst K,,$(FLASH_SIZE))*1024; \
let mem_size=$(subst K,,$(MEM_SIZE))*1024; \
flash_usage=`echo "scale=1;($$flash*100/$$flash_size)" | bc`; \
mem_usage=`echo "scale=1;($$mem*100/$$mem_size)" | bc`; \
echo "Flash: $$flash / $$flash_size bytes, $$flash_usage% Full (.text + .data)"; \
echo "SRAM: $$mem / $$mem_size bytes, $$mem_usage% Full (.data + .bss)"
效果如下:
arm-none-eabi-size main_rom.elf
text data bss dec hex filename
34928 2212 5316 42456 a5d8 main_rom.elf
Flash: 37140 / 65536 bytes, 56.6% Full (.text + .data)
SRAM: 7528 / 8192 bytes, 91.8% Full (.data + .bss)