Форматирование информации о размерах секций (Cosmic)
Для получения информации размерах каждой секции кода я использовал COSMIC Software Object Inspector (входит в состав компилятора), утилита проста в использовании:
usage: cobj [options] files
-d output data flows
-h output header
-i display info section
-n output sections
-o* result file name
-r output reloc flows
-s output symbol table
-v display file addresses
-x output debug symbols
Однако формат вывода информации, скажем прямо плохой :
sections:
.const: hilo code, at address 0x8080
34 data bytes (0x0022)
.text: hilo code, at address 0x80a5
2422 data bytes (0x0976)
.eeprom: no attribute, at address 0x1000
0 data bytes (0x0000)
.bsct: no attribute, at address 0x0
0 data bytes (0x0000)
.ubsct: bss hilo zpage, at address 0x0
10 reserved bytes (0x000a)
.bit: no attribute, at address 0xa
0 data bytes (0x0000)
.data: no attribute, at address 0x100
0 data bytes (0x0000)
.erase_in_ram: hilo code, at address 0x100
0 data bytes (0x0000)
.bss: bss hilo, at address 0x100
72 reserved bytes (0x0048)
.info.: no attribute, at address 0x0
3966 data bytes (0x0f7e)
.const: hilo code, at address 0x8000
128 data bytes (0x0080)
.init: hilo code, at address 0x80a2
3 data bytes (0x0003)
Информации много, восприятие плохое.
В Linux есть замечательный потоковый редактор sed, его (и ещё некоторые утилиты) успешно портировали в Windows.
Рассказывать как работает редактор не буду, в сети очень много записей о нём.
Указанный выше пакет утилит я распаковал в директорию: C:/Tools/GnuWin32/
Прописал его в майкфайле: GNU_PATH = C:/Tools/GnuWin32/
Изменил вызов:
size:
@$(CROSS)cobj -n target/target.sm8
на
size:
@echo '-----------------------------------------------------------'
@$(CROSS)cobj -n target/target.sm8 | $(GNU_PATH)sed -f $(GNU_PATH)script | $(GNU_PATH)sort
Создал в директории C:/Tools/GnuWin32/ файл script с командами для редактора:
# File: script
# Date: 28.09.2011
# Denis Zheleznjakov @ ZiBlog.ru
# убираем первые две строки
1,3d
# удаляем первод строки у каждой втрой строки
N
s/n/ /g
# форматируем начальный адрес секции
s/(0x(.)[ ])/0x0002/g
s/(0x(..)[ ])/0x002/g
s/(0x(...)[ ])/0x02/g
# убираем лишнее
s/hilo code//g
s/, at address//g
s/no attribute//g
s/bss hilo zpage//g
s/bss hilo//g
s/hilo//g
s/(init)//g
s/zpage//g
s/bytes//g
s/reserved//g
s/ data//g
s/([ ][ ]*)/ /g
# изменяем порядок
s/(.([a-z:_.]*)[ ])(0x([a-z0-9]*)[ ])([0-9]*[ ])[(](0x[a-z0-9]*)[)]/3 6 5 2/g
# убираем остаток
s/://g
/info/d
s/([ ]([0-9]{1})[ ])/ 2/g
s/([ ]([0-9]{2})[ ])/ 2/g
s/([ ]([0-9]{3})[ ])/ 2/g
s/([ ]([0-9]{4})[ ])/ 2/g
s/([ ]([0-9]{5})[ ])/ 2/g
s/([ ]([0-9]{6})[ ])/ 2/g
s/([ ]([0-9]{7})[ ])/ 2/g
/[ ][0][ ]/d
В результате на выходе получим:
-----------------------------------------------------------
0x0000 0x000a 10 ubsct
0x0100 0x0048 72 bss
0x8000 0x0080 128 const
0x8080 0x0022 34 const
0x80a2 0x0003 3 init
0x80a5 0x0976 2422 text
Примечание: [начальный адрес секции] [размер] [размер] [имя секции]
По моему мнению более информативно
Код и подход не оптимален, планирую изменить позже для суммирования размеров секций по типу памяти (ОЗУ, Флешь, EEPROM).
Для суммировать по секциям хотел использовать awk, но сходу не смог понять как преобразовать шестнадцатеричный формат в десятичный. Поэтому пришлось прибегнуть к написанию своей программки на C#.
В результате после всех манипуляций имеем вот такую выходную информацию:
-----------------------------------------------------------
FLASH: 2587 byte
RAM: 82 byte
EEPROM: 0 byte
В ближайшее время причешу код и выложу исходник.
comments powered by Disqus