Форматирование информации о размерах секций (Cosmic)

29 Сентября 2011 К комментариям

Для получения информации размерах каждой секции кода я использовал 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

В ближайшее время причешу код и выложу исходник.


Categories: Полезняшки Tags: Cosmic

comments powered by Disqus