>

利用Makefile实现avr-size -C的效果

2016-01-03 by Stavros

GNU工具链里的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)