Должен ли оптимизатор выкидывать из конечного кода неиспользуемые методы класса?

b707
Offline
Зарегистрирован: 26.05.2017

Столкнулся с такой ситуацией - беру пустой код ардуино, добавляю туда экземпляр своего класса - больше ничего. Никакого кода с участием этого экземпляра нет, только обьявление - но итоговая прошивка сразу увеличивается на 8к.

В связи с этим два вопроса:

1. разве по умолчанию оптимизатор не должен выкидывать из кода неиспользуемые методы класса?

2. если по умолчанию нет - есть ли какие-то способы заставить его это делать? Или не заставить - а скорее помочь определить, что данный код лишний и может быть выкинут....

 

Понятно, что задача с полностью лишним классом - надуманная. Но ситуации, когда из огромной библиотеки используется лишь пара методов -они же сплошь и рядом. я всегда думал. что это не страшно. мол все лишнее оптимизатор выкинет сам. Но тут весь класс лишний - а ничего не выкидывается.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Подпишусь

b707
Offline
Зарегистрирован: 26.05.2017

рассуждая дальше....

А с чего я взял, что ничего не выкидывается? - может, если бы не выкинулось, код бы вырос на 16к. А так всего на 8 - значит оптимизатор что мог - выкинул...

Интересно, это правильное предположение? И как все-таки помочь оптимизатору выкинуть побольше?

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Для начала, видимо, выяснить, а есть ли там вообще что выкидывать

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:
Для начала, видимо, выяснить, а есть ли там вообще что выкидывать

каким образом?

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

b707 пишет:
рассуждая дальше....

А с чего я взял, что ничего не выкидывается? - может, если бы не выкинулось, код бы вырос на 16к. А так всего на 8 - значит оптимизатор что мог - выкинул...

Интересно, это правильное предположение? И как все-таки помочь оптимизатору выкинуть побольше?

А в листинге что, в мап-файле? 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Вот тут я хз ))
Помнится, я экспериментировал со своей кнопочной библиотекой. Вроде бы создание одного экземпляра без единого вызова его методов увеличивало код на положенные 20 байт - ровно сколько он и весит

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

v258 20 байт в памяти переменных видимо, тут речь про память под код

 

Листинг надо бы изучить и с уровнем оптимизации ничего не химичили ???

rkit
Offline
Зарегистрирован: 23.11.2016

Оптимизатор не должен. Это делает компоновщик.

 

b707 пишет:

Никакого кода с участием этого экземпляра нет, только обьявление

Это уже минимум конструктор, деструктор, таблица виртуальных методов, и всё, от чего они зависят.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Komandir пишет:

v258 20 байт в памяти переменных видимо, тут речь про память под код

 

Листинг надо бы изучить и с уровнем оптимизации ничего не химичили ???

Уже не помню, нужно вечером проверить ))

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

с уровнем оптимизации ничего не химичили ???

химичил, конечно. Самый лучший результат с -0s. с остальными уровнями размер еще больше

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А код то будет ? Или так и будем гипотетически трещать ? Петрович - выходи !!!

b707
Offline
Зарегистрирован: 26.05.2017

rkit пишет:

b707 пишет:

Никакого кода с участием этого экземпляра нет, только обьявление

Это уже минимум конструктор, деструктор, таблица виртуальных методов, и всё, от чего они зависят.

виртуальных методов нет, статических тоже, класс ничему явно не наследует. Если конструктор полностью вычистить, размер занимаемого кода уменьшается незначительно.

Вообще такое впечатление, что компиляция класса подтягивает кучу системного кода ардуино. ну как если бы я использовал float - одно его упоминание в скетче увеливает размер на несколько кб. Я только не пойму. почему компоновщик его не выкидывает на этапе сборки.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Просто посмотрите на размер кода современных приложений на ББ - раньше у первых ББ размер жесткого диска был меньше чем некоторые современные программы и эти ББ при этом работали и содержали большое количество приложений.

Вся это оптимизация - фикция на бумаге в основном !!!

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

А код то будет ? Или так и будем гипотетически трещать ? Петрович - выходи !!!

а надо? :)))))

Класс - вот https://github.com/board707/DMD_STM32/tree/old-V1

Для определенности специально взял старую ветку проекта, потому что в ней еще не было никаких "наворотов" - ни наследования, ни виртуальных функций, ни шаблонов...

Код скетча чуть позже выложу. но он простеший. кроме создания экземпляра нет ничего.

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Ассемблер наше все !

Полный USB стек для COM порта на stm32 чуть больше 1000 байт.

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

Ассемблер наше все !

Полный USB стек для COM порта на stm32 чуть больше 1000 байт.

зачем мне USBстек. листинг я и без него могу посмотреть. И дизассемблер тоже. Знать бы что в нем искать... это ж будет килобайт сто-двести. наверно

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Ну если имена/реализация методов есть - значит ничего не обрезалось

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

Ну если имена/реализация методов есть - значит ничего не обрезалось

ок, гляну.

Но вопрос то был - почему так :) И как исправить это, если можно

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

Если конструктор полностью вычистить, размер занимаемого кода уменьшается незначительно.

Я только не пойму. почему компоновщик его не выкидывает на этапе сборки.

Конструктор инициализирует всех членов класса, то бишь всё равно вызывает кучу других конструкторов.

Не выкидывает потому что код float на avr запрограммирован на ассемблере и компиляции на уровне отдельных функций не подлежит.

b707
Offline
Зарегистрирован: 26.05.2017

код

#include <DMD_STM32.h> 

#define DMD_PIN_A PB1
#define DMD_PIN_B PB12
#define DMD_PIN_nOE PB1
#define DMD_PIN_SCLK PB10

SPIClass dmd_spi(2);
//DMD dmd(DMD_PIN_A, DMD_PIN_B, DMD_PIN_nOE, DMD_PIN_SCLK, 1, 1, dmd_spi );

void setup(void) {}
 
void loop(void){}

В таком виде размер прошивки 12 624 байт, если раскомментировать 9 строчку - 20708 байт.

Аддон Кларка, плата STM32F103C8

Ссылка на класс та же, что в сообщении 14

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

Листинг надо бы изучить и с уровнем оптимизации ничего не химичили ???

посмотрел мап файл - легче не стало, практически все методы класса там перечислены... это означает, что все они попали в конечный код? Ну как так-то?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

У мен нету вот этого всего.

b707 пишет:

Аддон Кларка, плата STM32F103C8

Так, что я только потеоретизировать могу.

А, кстати, как там насчёт LTO? Включено? Нет?

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

А, кстати, как там насчёт LTO? Включено? Нет?

выключено. При попытке включения сыпятся ошибки линковки.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

У мен нету вот этого всего.

b707 пишет:

Аддон Кларка, плата STM32F103C8

плата для сборки скетча не нужна, аддон вот https://github.com/rogerclarkmelbourne/Arduino_STM32

просто скачать и положить в каталог hardware установки Ардуино ИДЕ (но надо чтобы была установлена поддержка Дуе)

 

Это так, на случай если вдруг будет скучно и захотите попробовать :)

Datak
Offline
Зарегистрирован: 09.10.2014

b707, а какой размер получается если начать 9-ю строку cловом static?

b707
Offline
Зарегистрирован: 26.05.2017

Datak пишет:

b707, а какой размер получается если начать 9-ю строку cловом static?

такой же, 20708.

Да и с чего ему менятся?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

выключено. При попытке включения сыпятся ошибки линковки.

Вот с этого надо начинать

Пока не разберётесь, что там с линковкой, не будет понятно куда уходит память.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Вот с этого надо начинать

Пока не разберётесь, что там с линковкой, не будет понятно куда уходит память.

убрал ошибку линковки, собираю с -flto, стало 18656 байт. Уже хорошо, но все равно неиспользуемый класс отьедает 6к

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, надо смотреть что за класс. Может это и нормально, а может и нет, тут без самого класса не поймёшь. Экземпляр же объявлен, так? Значит конструктор, деструктор, аллокаторы/деаллокаторы, если есть. Что там за поля у него. Если нетривиальные, то опять же конструктор/деструктор. Что там со статическими методами. В общем, это реально смотреть надо.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Ну, надо смотреть что за класс.

класс на гитхабе, если будет время

https://github.com/board707/DMD_STM32/blob/old-V1/DMD_STM32.h

https://github.com/board707/DMD_STM32/blob/old-V1/DMD_STM32.cpp

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я понять не могу - у тебя в конструкторе много значений, а вроде выше используется только одно (значений «по умолчанию» я не увидел), как так? Что я пропустил?

DMD(byte _pin_A, byte _pin_B, byte _pin_nOE, byte _pin_SCLK, byte panelsWide, byte panelsHigh, SPIClass _spi );

 

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

Я понять не могу - у тебя в конструкторе много значений, а вроде выше используется только одно (значений «по умолчанию» я не увидел), как так? Что я пропустил?

DMD(byte _pin_A, byte _pin_B, byte _pin_nOE, byte _pin_SCLK, byte panelsWide, byte panelsHigh, SPIClass _spi );

 

строчку 8 и 9 не спутал?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну да, спутал ))) 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Может это поддержка spi так объемно подтягивается из аддона ?

b707
Offline
Зарегистрирован: 26.05.2017

расшифровка размера бинарника по секциям ( вывод программы arm-none-eabi-size):

С моим классом

  text    data     bss     dec     hex filename
 16024    1144    1568   18736    4930 dmd_size_test_04.ino.elf

Без него:

   text    data     bss     dec     hex filename
   8468    1144    1056   10668    29ac dmd_size_test_04.ino.elf

Видно, что в моем классе нет статических переменных.

 

Отмечу, и тот и другой код компилированы с -flto опцией. Вчера я этого не заметил, но как следует из цифр - LTO никак не влияет на вклад моего класса в размер кода - после включения LTO общий размер кода уменьшился. но разница за счет включения класса в код осталось прежней - порядка 8кбайт

b707
Offline
Зарегистрирован: 26.05.2017

Символьная таблица ELF файла прошивки, отсортированная по размеру:

C:\Users\Dmit\AppData\Local\Temp\arduino_build_732046>C:\Users\Dmit\AppData\Loca
l\Arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1/bin/arm-none-e
abi-nm --size-sort --print-size --radix=d dmd_size_test_04.ino.elf >tt

536872800 00000001 b _ZL15running_dmd_len.5336.4732
536872113 00000001 B _ZL7this_id.10842
536870988 00000001 d _ZN6wirish4priv9w_adc_smpE.5016
536872156 00000001 b _ZZL17scan_running_dmdsvE1i.5333.4783
536872144 00000001 B Data_Mul_MaxPacketSize
536872148 00000001 b line_dtr_rts.9560.4771
536872112 00000001 b transmitting.9523.5095
134230840 00000002 W __aeabi_idiv0
134230840 00000002 W __aeabi_ldiv0
134218260 00000002 T __cxa_pure_virtual
536871138 00000002 d _ZL8scan_int.5337.4711
536871908 00000002 d _ZN6wirish4priv9w_adc_preE.4891
536871128 00000002 D Device_Table
134229692 00000002 T main
134218524 00000002 T NOP_Process
536872812 00000002 b ResumeS.4723
536872124 00000002 B SaveRState
536872126 00000002 B SaveTState
536872084 00000002 b StatusInfo.5231
134234004 00000002 r usbVcomDescriptor_iManufacturer.9568.5229
134233992 00000002 r usbVcomDescriptor_iProduct.9569.5230
134234022 00000002 r usbVcomDescriptor_LangID.9567.5228
536873616 00000004 B __malloc_free_list
536873612 00000004 B __malloc_sbrk_start
536872048 00000004 D _impure_ptr
536872088 00000004 B _ZL10_spi1_this.6189
536872092 00000004 B _ZL10_spi2_this.6191
134234878 00000004 r _ZL18board_alt_spi_pins.6184.5066
536872116 00000004 B _ZL9this_devp.10843
536871712 00000004 d _ZN6wirish4privL8pll_dataE.7283.4954
134234748 00000004 R ADC1
536871124 00000004 D DMA1
536872152 00000004 b dma2Ch4_5.4723
536873620 00000004 B errno
134234164 00000004 R GPIOC
536872816 00000004 b pbreak.4444.6356.4670
536872128 00000004 B pInformation
536872120 00000004 B pProperty
536872132 00000004 B pUser_Standard_Requests
536872096 00000004 b rx_head.9526.5091
536872100 00000004 b rx_tail.9528.5092
536871148 00000004 D SPI1
134234028 00000004 R SPI2
536872136 00000004 B systick_uptime_millis
536872140 00000004 b systick_user_callback.8531.4547
536872820 00000004 b Timer1.4970
536872824 00000004 b Timer2.4972
536872828 00000004 B Timer3
536872832 00000004 B Timer4
536872104 00000004 b tx_head.9522.5093
536872108 00000004 b tx_tail.9521.5094
536871864 00000004 d USART1.4898
536871120 00000004 D USBLIB
134224012 00000006 W __irq_exti0
134224006 00000006 W __irq_exti1
134224000 00000006 W __irq_exti2
134223994 00000006 W __irq_exti3
134223988 00000006 W __irq_exti4
536871130 00000007 d line_coding.9557.4775
134223972 00000008 W __irq_exti15_10
134223980 00000008 W __irq_exti9_5
134234870 00000008 r _ZL10baud_rates.6183.5064
536872804 00000008 B _ZL12running_dmds.5334
134234882 00000008 r _ZL14board_spi_pins.6185.5065
134234117 00000008 r _ZL17bPixelLookupTable.5335.4782
536871868 00000008 d _ZN6wirish4priv15w_board_pll_cfgE.4929
536871876 00000008 D adc1
536871484 00000008 d adc2.4982
536870972 00000008 d Config_Descriptor.9438.5113
536870980 00000008 d Device_Descriptor.9501.5174
536871040 00000008 d dma1.7772.4455
536871900 00000008 D gpioa
536871460 00000008 D gpiob
536871468 00000008 D gpioc
536871476 00000008 d gpiod.4986
536870944 00000008 d reset_regs.4415.8322.5053
536871140 00000008 d spi1.8512.4739
536870964 00000008 D spi2.8514
536871912 00000008 D timer1
536871492 00000008 D timer2
536871528 00000008 D timer3
536871564 00000008 D timer4
134225326 00000010 T spi_tx_dma_disable
134232692 00000012 T __errno
134223936 00000012 W __irq_i2c1_er
134223960 00000012 W __irq_i2c1_ev
134223924 00000012 W __irq_i2c2_er
134223948 00000012 W __irq_i2c2_ev
134223684 00000012 W __irq_tim2
134223672 00000012 W __irq_tim3
134223660 00000012 W __irq_tim4
134219840 00000012 T _ZL17SPI1_DMA_callbackv.4942
134219852 00000012 T _ZL17SPI2_DMA_callbackv.4940
134225436 00000012 t _ZN8SPIClass18_spi1EventCallbackEv.4372
134225424 00000012 t _ZN8SPIClass18_spi2EventCallbackEv.4136
536870952 00000012 d enable_regs.4411.8321.5054
536871448 00000012 d enable_regs.4424.8324.4955
536873524 00000012 B usart1_rb.8913
536873512 00000012 B usart1_wb.8914
536873500 00000012 B usart2_rb.8915
536873488 00000012 B usart2_wb.8916
536873476 00000012 B usart3_rb.8917
536873464 00000012 B usart3_wb.8918
134224018 00000014 W __irq_dma1_channel7
134225312 00000014 T bb_peri_set_bit.8359
134224112 00000016 W __irq_dma1_channel1
134224096 00000016 W __irq_dma1_channel2
134224080 00000016 W __irq_dma1_channel3
134224064 00000016 W __irq_dma1_channel4
134224048 00000016 W __irq_dma1_channel5
134224032 00000016 W __irq_dma1_channel6
134224444 00000016 t _ZL12waitSpiTxEndP7spi_dev.5770.4511
134219488 00000016 T _ZN13HardwareTimer5pauseEv
134219178 00000016 T _ZN13HardwareTimer6resumeEv
134232188 00000016 T free
134232172 00000016 T malloc
134232780 00000016 T memset
134232560 00000016 T strlen
134224236 00000016 T usbGetInterfaceSetting.9326
536871104 00000016 d usblib.9132.4467
134221734 00000018 t _ZL11disable_pwmPK14stm32_pin_info.5773.4676
134219194 00000018 T _ZN13HardwareTimer7refreshEv
134232204 00000018 T memcpy
134234032 00000018 r usbVcomDescriptor_Device.9518.5191
134221972 00000020 T gpio_init
134234728 00000020 R masks.4420.8323
134223900 00000024 W __exc_systick
134223636 00000024 W __irq_usart1
134223612 00000024 W __irq_usart2
134223588 00000024 W __irq_usart3
134225128 00000024 T _ZN3DMD11clearScreenEh
134234752 00000024 R _ZTV3DMD
134218880 00000024 T dma_disable
134219984 00000024 T encoder_mode.isra.0.8699
536872836 00000024 b Serial1.4959
536872860 00000024 b Serial2.4964
536872884 00000024 b Serial3.4969
536870920 00000024 d String_Descriptor.9561.5222
134224356 00000024 t vcomGetSetLineCoding.9313.4044
134218320 00000026 T _ZN14HardwareSerial5flushEv
134218294 00000026 T set_this_dev.10706
134225648 00000028 T dma_irq_handler.7639
134219104 00000028 T timer_cc_enable.8646
134218756 00000030 T _ZN5Print5writeEPKc
134232528 00000032 T _sbrk_r
134218262 00000032 T _ZN5Print5writeEPKvm
134220280 00000032 T rcc_set_prescaler
134220312 00000032 t usbGetConfigDescriptor.9337.4337
134220344 00000032 t usbGetDeviceDescriptor.9340.4348
134218346 00000034 T _ZN14HardwareSerial4peekEv
134223864 00000036 W __irq_tim1_brk
134223828 00000036 W __irq_tim1_up
134219548 00000036 T _Z8pwmWriteht
134234128 00000036 r _ZTV14HardwareSerial.4477
134224200 00000036 T Standard_GetConfiguration
134218720 00000036 T Standard_GetInterface
134220376 00000038 T _ZN14HardwareSerial9availableEv
134229452 00000044 t _GLOBAL__sub_D_dmd_spi.4329.4034
134219504 00000044 T _Z12digitalWritehh
134225604 00000044 T dispatch_single_exti
134218836 00000044 T rcc_clk_enable
134219132 00000046 T pwm_mode.8680
134230744 00000048 T __gnu_ldivmod_helper
134230792 00000048 T __gnu_uldivmod_helper
134219440 00000048 T _ZL15dev_to_spi_pinsP7spi_dev.isra.9.5873
536870992 00000048 D Device_Property
134218786 00000050 T rcc_reset_dev
134218526 00000050 T usbGetStringDescriptor.9334
134223776 00000052 W __irq_tim1_trg_com
134224304 00000052 T usbDataSetup.9318
134224252 00000052 T usbNoDataSetup.9323
134225874 00000054 T _ZN3DMD13drawFilledBoxEiiiih
134221680 00000054 T disable_channel.8724
536871600 00000056 D i2c1.8128
536871656 00000056 D i2c2.8130
134219928 00000056 T SetDeviceAddress
134225254 00000058 T timer_oc_set_mode.8654
134219212 00000060 T _ZL19determine_baud_rateP7spi_devm.isra.8.5851
134224380 00000064 t dma_attach_interrupt.4445
134219864 00000064 T Post0_Process
134218458 00000066 t SetEPRxCount.4954
134234050 00000067 r usbVcomDescriptor_Config.9500.5165
134221500 00000068 T _ZN13HardwareTimerC1Eh
134221500 00000068 t _ZN13HardwareTimerC2Eh.4117
134218048 00000068 T usbInit.9316
134227946 00000070 T _sbrk
134224128 00000072 W __irq_adc
134232704 00000076 T __libc_init_array
134225528 00000076 T dispatch_extis
536873536 00000076 B dmd_spi
536872908 00000076 b SPI.4958
134228016 00000076 T start_c
134218380 00000078 T _ZN14HardwareSerial4readEv
134223696 00000080 W __irq_tim1_cc
134225448 00000080 T gpio_set_mode
134223500 00000088 T __error
134225336 00000088 t _ZN8SPIClass13EventCallbackEv.4374
134221412 00000088 T In0_Process
134234776 00000092 R rcc_dev_table
536871952 00000096 d impure_data
134225152 00000102 T dispatch_general.8677
134221568 00000112 T _i2c_irq_error_handler
536872672 00000128 b exti_channels.4724
134220868 00000132 T _ZL18adc_default_configP7adc_dev.6996
134232224 00000136 T _free_r
134227808 00000136 t _Z7pinModeh13WiringPinMode.4388
134218116 00000144 T _ZN14HardwareSerial5writeEh
134218576 00000144 T Standard_GetStatus
536871716 00000148 d usart1.8920.4925
536871152 00000148 d usart2.8922.4961
536871300 00000148 d usart3.8924.4966
134224460 00000156 T _ZN3DMD10writePixelEjjhh
134232360 00000168 T _malloc_r
134219272 00000168 T _ZN8SPIClassC1Em
134219272 00000168 t _ZN8SPIClassC2Em.4705
134227630 00000178 T usb_resume.9090
134229496 00000196 t _GLOBAL__I_65535_0_dmd_size_test_04.ino.cpp.o.12522.4194
134221000 00000196 T _ZL20timer_default_configP9timer_dev.6999
134225676 00000198 T _ZN3DMD8drawLineEiiiih
134218904 00000200 T usart_irq.8854
134221196 00000216 T DataStageIn.9680
134221752 00000220 T _ZN8SPIClass5beginEv
134217728 00000236 T __stm32_vector_table
134219584 00000256 t _ZN3DMD8latchDMAEv.4087
536872413 00000256 b vcomBufferRx.9527.4788
536872157 00000256 b vcomBufferTx.9525.4789
134220008 00000272 T Standard_ClearFeature
134228092 00000384 T _ZN3DMDC1Ehhhhhh8SPIClass
134228092 00000384 t _ZN3DMDC2Ehhhhhh8SPIClass.4362
134229694 00000398 t _Z7premainv.4516
134220414 00000454 t usbReset.9343.4034
536872984 00000480 B dmd
134224616 00000512 T _ZL17scan_running_dmdsv.4938
134234168 00000560 R PIN_MAP
134230092 00000596 T _ZN3DMD11stepMarqueeEiih
134225928 00000604 T _ZN3DMD4initEt
134231516 00000656 T __udivdi3
134230844 00000672 T __divdi3
134228476 00000976 T _i2c_irq_handler
134226532 00001098 T _ZN3DMD8drawCharEiihhh.constprop.47
134221992 00001508 W __irq_usb_lp_can_rx0

Тут я не вполне понимаю. Например, самый большой символ в коде - это вектор прерывания CAN_USB размером аж 1.5к. Зачем он тут? Поддержку USB я вообще выключил... а кана у меня в программе нет. Или векторы прерываний включаются в код всегда?

Да и вообще если внимательно посмотреть - в списке всего тр-четыре раза всплывают функции моего класса, остальное все - системные вызовы. Значит сделать ничего нельзя?

GarryC
Offline
Зарегистрирован: 08.08.2016

А где такой же файл, но без экземпляра класса?

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

А где такой же файл, но без экземпляра класса?

536872097 00000001 b _ZL15running_dmd_len.5274.5242
536872794 00000001 B _ZL7this_id.10780
536871004 00000001 d _ZN6wirish4priv9w_adc_smpE.5013
536872096 00000001 b _ZZL17scan_running_dmdsvE1i.5271.5244
536872764 00000001 B Data_Mul_MaxPacketSize
536872086 00000001 b line_dtr_rts.9498.5231
536872784 00000001 b transmitting.9461.4532
134218424 00000002 T __cxa_pure_virtual
536871908 00000002 d _ZN6wirish4priv9w_adc_preE.4795
536871100 00000002 D Device_Table
134225224 00000002 T main
134218688 00000002 T NOP_Process
536872792 00000002 b ResumeS.4463
536872744 00000002 B SaveRState
536872746 00000002 B SaveTState
536872084 00000002 b StatusInfo.5230
134227060 00000002 r usbVcomDescriptor_iManufacturer.9506.5228
134227048 00000002 r usbVcomDescriptor_iProduct.9507.5229
134227078 00000002 r usbVcomDescriptor_LangID.9505.5227
536872048 00000004 D _impure_ptr
536872088 00000004 b _ZL10_spi1_this.6127.5011
536872092 00000004 b _ZL10_spi2_this.6129.5012
536872796 00000004 B _ZL9this_devp.10781
536871712 00000004 d _ZN6wirish4privL8pll_dataE.7221.4858
134227228 00000004 R ADC1
536871096 00000004 D DMA1
134227204 00000004 R GPIOC
536872788 00000004 b pbreak.4444.6294.4451
536872748 00000004 B pInformation
536872740 00000004 B pProperty
536872752 00000004 B pUser_Standard_Requests
536872768 00000004 b rx_head.9464.4528
536872772 00000004 b rx_tail.9466.4529
536871008 00000004 d SPI1.5033
536872756 00000004 B systick_uptime_millis
536872760 00000004 b systick_user_callback.8469.4547
536872800 00000004 b Timer1.4873
536872804 00000004 b Timer2.4875
536872808 00000004 b Timer3.4876
536872812 00000004 b Timer4.4877
536872776 00000004 b tx_head.9460.4530
536872780 00000004 b tx_tail.9459.4531
536871864 00000004 d USART1.4802
536871092 00000004 D USBLIB
134222748 00000006 W __irq_exti0
134222742 00000006 W __irq_exti1
134222736 00000006 W __irq_exti2
134222730 00000006 W __irq_exti3
134222724 00000006 W __irq_exti4
536870960 00000007 d line_coding.9495.5233
134222708 00000008 W __irq_exti15_10
134222716 00000008 W __irq_exti9_5
134227326 00000008 r _ZL10baud_rates.6121.5208
536871868 00000008 d _ZN6wirish4priv15w_board_pll_cfgE.4833
536871876 00000008 D adc1
536871484 00000008 d adc2.4885
536870920 00000008 d Config_Descriptor.9376.5091
536870928 00000008 d Device_Descriptor.9439.5180
536871012 00000008 d dma1.7710.4455
536871900 00000008 d gpioa.4886
536871460 00000008 d gpiob.4887
536871468 00000008 D gpioc
536871476 00000008 d gpiod.4889
536870968 00000008 d reset_regs.4415.8260.5088
536870996 00000008 d spi1.8450.5052
536870988 00000008 d spi2.8452.5207
536871912 00000008 D timer1
536871492 00000008 D timer2
536871528 00000008 D timer3
536871564 00000008 D timer4
134225764 00000012 T __errno
134222672 00000012 W __irq_i2c1_er
134222696 00000012 W __irq_i2c1_ev
134222660 00000012 W __irq_i2c2_er
134222684 00000012 W __irq_i2c2_ev
134222420 00000012 W __irq_tim2
134222408 00000012 W __irq_tim3
134222396 00000012 W __irq_tim4
536870976 00000012 d enable_regs.4411.8259.5089
536871448 00000012 d enable_regs.4424.8262.4859
536873024 00000012 B usart1_rb.8851
536873012 00000012 B usart1_wb.8852
536873000 00000012 B usart2_rb.8853
536872988 00000012 B usart2_wb.8854
536872976 00000012 B usart3_rb.8855
536872964 00000012 B usart3_wb.8856
134222754 00000014 W __irq_dma1_channel7
134222848 00000016 W __irq_dma1_channel1
134222832 00000016 W __irq_dma1_channel2
134222816 00000016 W __irq_dma1_channel3
134222800 00000016 W __irq_dma1_channel4
134222784 00000016 W __irq_dma1_channel5
134222768 00000016 W __irq_dma1_channel6
134225624 00000016 T strlen
134218956 00000016 T usbGetInterfaceSetting.9264
536871076 00000016 d usblib.9070.4467
134227082 00000018 r usbVcomDescriptor_Device.9456.5197
134220400 00000020 T gpio_init
134227208 00000020 R masks.4420.8261
134222636 00000024 W __exc_systick
134222372 00000024 W __irq_usart1
134222348 00000024 W __irq_usart2
134222324 00000024 W __irq_usart3
536872816 00000024 b Serial1.4862
536872840 00000024 b Serial2.4867
536872864 00000024 b Serial3.4872
536870936 00000024 d String_Descriptor.9499.5221
134219076 00000024 t vcomGetSetLineCoding.9251.4936
134218484 00000026 T _ZN14HardwareSerial5flushEv
134218458 00000026 T set_this_dev.10644
134220372 00000028 T dma_irq_handler.7577
134219100 00000030 T _ZN5Print5writeEPKc
134218426 00000032 T _ZN5Print5writeEPKvm
134220420 00000032 T rcc_set_prescaler
134218048 00000032 T usbGetConfigDescriptor.9275
134218080 00000032 T usbGetDeviceDescriptor.9278
134218510 00000034 T _ZN14HardwareSerial4peekEv
134222600 00000036 W __irq_tim1_brk
134222564 00000036 W __irq_tim1_up
134227168 00000036 r _ZTV14HardwareSerial.4285
134218920 00000036 T Standard_GetConfiguration
134218884 00000036 T Standard_GetInterface
134218112 00000038 T _ZN14HardwareSerial9availableEv
134220328 00000044 T dispatch_single_exti
134219292 00000044 T rcc_clk_enable
536871104 00000048 D Device_Property
134219244 00000048 T rcc_reset_dev
134218690 00000050 T usbGetStringDescriptor.9272
134222512 00000052 W __irq_tim1_trg_com
134219024 00000052 T usbDataSetup.9256
134218972 00000052 T usbNoDataSetup.9261
536871600 00000056 D i2c1.8066
536871656 00000056 D i2c2.8068
134220096 00000056 T SetDeviceAddress
134218150 00000062 t _ZL19determine_baud_rateP7spi_devm.isra.8.5789.4785
134220032 00000064 T Post0_Process
134218622 00000066 t SetEPRxCount.4905
134227100 00000067 r usbVcomDescriptor_Config.9438.5143
134224996 00000068 T _ZN13HardwareTimerC1Eh
134224996 00000068 t _ZN13HardwareTimerC2Eh.4199
134218212 00000068 T usbInit.9254
134223390 00000070 T _sbrk
134222864 00000072 W __irq_adc
134220254 00000074 T dispatch_extis
134225776 00000076 T __libc_init_array
536873036 00000076 b dmd_spi.4860
536872888 00000076 b SPI.4861
134223460 00000076 T start_c
134218544 00000078 T _ZN14HardwareSerial4readEv
134222432 00000080 W __irq_tim1_cc
134224908 00000088 T In0_Process
134222232 00000092 T __error
134227232 00000092 R rcc_dev_table
536871952 00000096 d impure_data
134220152 00000102 T dispatch_general.8615
134219130 00000114 T _i2c_irq_error_handler
536872612 00000128 b exti_channels.5028
134219336 00000132 T _ZL18adc_default_configP7adc_dev.6934
134218280 00000144 T _ZN14HardwareSerial5writeEh
134218740 00000144 T Standard_GetStatus
536871716 00000148 d usart1.8858.4829
536871152 00000148 d usart2.8860.4864
536871300 00000148 d usart3.8862.4869
134225064 00000160 t _GLOBAL__I_65535_0_dmd_size_test_04.ino.cpp.o.12460.4194
134219864 00000168 T _ZN8SPIClassC1Em
134219864 00000168 t _ZN8SPIClassC2Em.4666
134224512 00000180 T usb_resume.9028
134219468 00000196 T _ZL20timer_default_configP9timer_dev.6937
134219664 00000200 T usart_irq.8792
134224692 00000216 T DataStageIn.9618
134217728 00000236 T __stm32_vector_table
536872354 00000256 b vcomBufferRx.9465.5240
536872098 00000256 b vcomBufferTx.9463.5241
134220452 00000272 T Standard_ClearFeature
134225226 00000398 t _Z7premainv.4324
134222936 00000452 t usbReset.9281.4119
134223536 00000976 T _i2c_irq_handler
134220724 00001508 W __irq_usb_lp_can_rx0

 

b707
Offline
Зарегистрирован: 26.05.2017

продолжаем наблюдение

Заменил ARM-GCC тулчейн с древней версии 4.8.3(такая встроена в Ардуино ИДЕ для поддержки Дуе и более новой нет) на более свежую 9.2.1, как сам же писал  вот тут

Итог

 "Пустой скетч" всего 6720 байт

 Мой код с классом - 13544 байт

Причина такого влияния на размер кода, как пишут - более продвинутая поддержка LTO в новых версиях тулчейна.

По сравнению с началом разница огромная - "выиграли" в размере уже более 7к. НО!

Разница между "пустым" скетчем и кодом с классом в результате всех усилий почти не изменилась! - было 8к, теперь чуть менее 7к

Поэтому вопрос из заголовка остается актуальным - как помочь линкеру удалить неиспользуемые методы?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

скорее всего, компилятор, когда встречает обьявление класса, сразу неявно вставляет туда RTL поддержки для классов

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

DetSimen пишет:

скорее всего, компилятор, когда встречает обьявление класса, сразу неявно вставляет туда RTL поддержки для классов

ИМХО поддержка классов идет на уровне компилятора и RTL для этого в явном виде не существует

GarryC
Offline
Зарегистрирован: 08.08.2016

Беглый взгляд на два листинга показывает, что Ваш класс подтащил за собой библиотеку работы с памятью (malloc ...), библиотеку вычислений повышенной точности (__udivdiv3 ..) и, наверное, что то еще кроме самого себя. 

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

как помочь линкеру удалить неиспользуемые методы?


Удалить их самому

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

Беглый взгляд на два листинга показывает, что Ваш класс подтащил за собой библиотеку работы с памятью (malloc ...),

=== да. это верно, она мне нужна

Цитата:
библиотеку вычислений повышенной точности (__udivdiv3 ..)  

=== а вот вычислений у меня нет, надо будет разобраться. откуда оно... может какой-то из системных модулей тащит

GarryC
Offline
Зарегистрирован: 08.08.2016

Не помню, как в GCC, но в IAR можно было получить у линкера перечень перекрестных ссылок, из него ясно, что тащит за собой Ваш класс, и вроде даже где именно тащит, в какой функции.

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

Не помню, как в GCC, но в IAR можно было получить у линкера перечень перекрестных ссылок, из него ясно, что тащит за собой Ваш класс, и вроде даже где именно тащит, в какой функции.

Спасибо, тут это делает строчка

arm-none-eabi-objdump -x dmd_size_test_04.ino.elf 

результат


dmd_size_test_04.ino.elf:     file format elf32-littlearm
dmd_size_test_04.ino.elf
architecture: armv7, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0800270d

Program Header:
0x70000001 off    0x00012d48 vaddr 0x08002d48 paddr 0x08002d48 align 2**2
         filesz 0x00000008 memsz 0x00000008 flags r--
    LOAD off    0x00010000 vaddr 0x08000000 paddr 0x08000000 align 2**16
         filesz 0x00002d50 memsz 0x00002d50 flags rwx
    LOAD off    0x00020000 vaddr 0x20000000 paddr 0x08002d50 align 2**16
         filesz 0x00000408 memsz 0x00000408 flags rw-
    LOAD off    0x00023158 vaddr 0x08003158 paddr 0x08003158 align 2**16
         filesz 0x00000390 memsz 0x00000390 flags r--
    LOAD off    0x00030408 vaddr 0x20000408 paddr 0x20000408 align 2**16
         filesz 0x00000000 memsz 0x00000598 flags rw-
private flags = 5000200: [Version5 EABI] [soft-float ABI]

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00002d44  08000000  08000000  00010000  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .text.align   00000004  08002d44  08002d44  00012d44  2**0
                  ALLOC, CODE
  2 .ARM.exidx    00000008  08002d48  08002d48  00012d48  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .data         00000408  20000000  08002d50  00020000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  4 .rodata       00000390  08003158  08003158  00023158  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .bss          00000598  20000408  20000408  00030408  2**2
                  ALLOC
  6 .debug_aranges 00000060  00000000  00000000  000234e8  2**3
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_info   00000072  00000000  00000000  00023548  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_abbrev 0000003c  00000000  00000000  000235ba  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_line   000001f5  00000000  00000000  000235f6  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_frame  0000030c  00000000  00000000  000237ec  2**2
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_str    00000164  00000000  00000000  00023af8  2**0
                  CONTENTS, READONLY, DEBUGGING
 12 .comment      00000066  00000000  00000000  00023c5c  2**0
                  CONTENTS, READONLY
 13 .ARM.attributes 00000029  00000000  00000000  00023cc2  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
08000000 l    d  .text	00000000 .text
08002d44 l    d  .text.align	00000000 .text.align
08002d48 l    d  .ARM.exidx	00000000 .ARM.exidx
20000000 l    d  .data	00000000 .data
08003158 l    d  .rodata	00000000 .rodata
20000408 l    d  .bss	00000000 .bss
00000000 l    d  .debug_aranges	00000000 .debug_aranges
00000000 l    d  .debug_info	00000000 .debug_info
00000000 l    d  .debug_abbrev	00000000 .debug_abbrev
00000000 l    d  .debug_line	00000000 .debug_line
00000000 l    d  .debug_frame	00000000 .debug_frame
00000000 l    d  .debug_str	00000000 .debug_str
00000000 l    d  .comment	00000000 .comment
00000000 l    d  .ARM.attributes	00000000 .ARM.attributes
00000000 l    df *ABS*	00000000 crtstuff.c
08002d18 l     O .text	00000000 __EH_FRAME_BEGIN__
080000ec l     F .text	00000000 __do_global_dtors_aux
20000408 l     O .bss	00000000 completed.8911
08002d3c l     O .text	00000000 __do_global_dtors_aux_fini_array_entry
08000110 l     F .text	00000000 frame_dummy
2000040c l     O .bss	00000000 object.8916
08002d28 l     O .text	00000000 __frame_dummy_init_array_entry
00000000 l    df *ABS*	00000000 
0800012c l     F .text	0000003c SetEPRxCount.constprop.0
08000168 l     F .text	00000070 _i2c_irq_error_handler
080001d8 l     F .text	000003b6 _i2c_irq_handler
0800058e l     F .text	0000002a _Z12digitalWritehh
080005b8 l     F .text	00000024 _Z8pwmWriteht
080005dc l     F .text	00000020 _ZN5Print5writeEPKvm
08002070 l     F .text	00000014 set_this_dev
08002084 l     F .text	00000040 _ZN13HardwareTimerC2Eh
08002084 l     F .text	00000040 _ZN13HardwareTimerC1Eh
080005fc l     F .text	0000001a _ZN14HardwareSerial5flushEv
08000616 l     F .text	0000009c _ZN14HardwareSerial5writeEh
080006b2 l     F .text	00000022 _ZN14HardwareSerial4peekEv
080006d4 l     F .text	00000026 _ZN14HardwareSerial9availableEv
080006fa l     F .text	00000050 _ZN14HardwareSerial4readEv
0800074a l     F .text	00000002 NOP_Process
0800074c l     F .text	00000030 SetDeviceAddress
0800077c l     F .text	0000000e Post0_Process
0800078a l     F .text	00000006 DataStageIn
08000790 l     F .text	00000006 In0_Process
08000796 l     F .text	00000006 Standard_ClearFeature
0800079c l     F .text	00000014 Standard_GetStatus
080007b0 l     F .text	0000000c Standard_GetInterface
080007bc l     F .text	0000000c Standard_GetConfiguration
080007c8 l     F .text	00000006 usbGetStringDescriptor
080007ce l     F .text	00000006 usbGetConfigDescriptor
080007d4 l     F .text	00000006 usbGetDeviceDescriptor
080007da l     F .text	00000014 usbGetInterfaceSetting
080007ee l     F .text	00000006 usbNoDataSetup
080007f4 l     F .text	00000006 usbDataSetup
080007fa l     F .text	0000000e vcomGetSetLineCoding
08000808 l     F .text	00000006 usbInit
0800080e l     F .text	00000022 usb_set_ep_rx_stat.lto_priv.0
0800080e l     F .text	00000022 usb_set_ep_rx_stat.lto_priv.1
08000830 l     F .text	00000006 usbReset
08000836 l     F .text	000000b6 usb_resume
080008ec l     F .text	000000c4 usart_irq
080009b0 l     F .text	00000066 dispatch_general
08000a16 l     F .text	0000001e nvic_irq_enable.lto_priv.0
08000a16 l     F .text	0000001e nvic_irq_enable.lto_priv.1
08000a34 l     F .text	0000000c bb_perip.lto_priv.1
08000a34 l     F .text	0000000c bb_perip.lto_priv.2
08000a34 l     F .text	0000000c bb_perip.lto_priv.3
08000a40 l     F .text	0000000a bb_peri_set_bit.lto_priv.0
08000a40 l     F .text	0000000a bb_peri_set_bit.lto_priv.1
08000a40 l     F .text	0000000a bb_peri_set_bit.lto_priv.2
08000a4a l     F .text	0000000a spi_tx_dma_disable
08000a54 l     F .text	00000034 rcc_do_reset_dev.constprop.0
080020c4 l     F .text	00000024 rcc_set_prescaler
08000a88 l     F .text	00000024 rcc_clk_enable
08000aac l     F .text	00000012 spi_init
08000aac l     F .text	00000012 gpio_init
08000abe l     F .text	0000004e gpio_set_mode
08000b0c l     F .text	00000050 dispatch_extis
08000b5c l     F .text	00000030 dispatch_single_exti
08000b8c l     F .text	00000016 dma_disable
08000ba2 l     F .text	0000002e dma_attach_interrupt
08000bd0 l     F .text	0000001a dma_irq_handler
080020e8 l     F .text	000000bc _ZL20timer_default_configP9timer_dev
080021a4 l     F .text	0000007c _ZL18adc_default_configP7adc_dev
08000bea l     F .text	0000002e _ZL15dev_to_spi_pinsP7spi_dev.isra.0
08000c18 l     F .text	00000044 _ZL19determine_baud_rateP7spi_devm.isra.0
08002220 l     F .text	00000088 _ZN8SPIClassC2Em
08002220 l     F .text	00000088 _ZN8SPIClassC1Em
08000c5c l     F .text	00000010 _ZL12waitSpiTxEndP7spi_dev
08000c6c l     F .text	0000005c _ZN8SPIClass13EventCallbackEv
08000cc8 l     F .text	0000000c _ZN8SPIClass18_spi2EventCallbackEv
08000cd4 l     F .text	0000000c _ZN8SPIClass18_spi1EventCallbackEv
08000ce0 l     F .text	000000fa _ZN3DMD8latchDMAEv
08000dda l     F .text	000000d0 _ZN3DMD8drawLineEiiiih
08000eaa l     F .text	00000038 _ZN3DMD13drawFilledBoxEiiiih
08000ee2 l     F .text	000000a6 _ZN3DMD10writePixelEjjhh
08000f88 l     F .text	00000204 _ZL17scan_running_dmdsv
08001198 l     F .text	0000000c _ZL17SPI1_DMA_callbackv
0800118c l     F .text	0000000c _ZL17SPI2_DMA_callbackv
080022a8 l     F .text	0000009c _Z7pinModeh13WiringPinMode
080011a4 l     F .text	00000032 _ZL11disable_pwmPK14stm32_pin_info
080011d6 l     F .text	000000ce _ZN8SPIClass5beginEv
080012a4 l     F .text	00000268 _ZN3DMD4initEt
0800150c l     F .text	000003f6 _ZN3DMD8drawCharEiihhh.constprop.0
08001902 l     F .text	00000256 _ZN3DMD11stepMarqueeEiih
08001b58 l     F .text	00000020 _ZN5Print5writeEPKc
08001b78 l     F .text	0000001a _ZN3DMD11clearScreenEh
08002344 l     F .text	0000022c _GLOBAL__I_65535_0_dmd_size_test_04.ino.cpp.o.7405
08002572 l     F .text	00000176 _Z7premainv
080026e8 l     F .text	00000024 _GLOBAL__sub_D_dmd_spi
08003158 l     O .rodata	00000230 PIN_MAP
200002ec l     O .data	00000008 gpioa
20000030 l     O .data	00000024 timer2
2000030c l     O .data	00000018 adc1
20000054 l     O .data	00000024 timer3
20000008 l     O .data	00000028 timer1
200002f4 l     O .data	00000008 gpiob
20000078 l     O .data	00000024 timer4
200002fc l     O .data	00000008 gpioc
08003388 l     O .rodata	0000005c rcc_dev_table
080033e4 l     O .rodata	00000014 masks.4505
080033f8 l     O .rodata	00000080 exti_channels
08003478 l     O .rodata	00000008 _ZL17bPixelLookupTable
08003480 l     O .rodata	00000009 CSWTCH.6
08003489 l     O .rodata	00000009 CSWTCH.5
08003494 l     O .rodata	00000024 _ZTV14HardwareSerial
080034b8 l     O .rodata	00000018 _ZTV3DMD
2000009c l     O .data	00000007 line_coding
200000a4 l     O .data	00000010 usblib
200000b4 l     O .data	00000008 reset_regs.4500
200000bc l     O .data	0000000c enable_regs.4496
200000c8 l     O .data	00000008 spi1
200000d0 l     O .data	00000040 dma1
20000110 l     O .data	00000008 spi2
20000118 l     O .data	00000002 _ZL8scan_int
2000011c l     O .data	00000094 usart1
20000760 l     O .bss	0000000c usart1_rb
20000754 l     O .bss	0000000c usart1_wb
200001b0 l     O .data	00000094 usart2
20000748 l     O .bss	0000000c usart2_rb
2000073c l     O .bss	0000000c usart2_wb
20000244 l     O .data	00000094 usart3
20000730 l     O .bss	0000000c usart3_rb
20000724 l     O .bss	0000000c usart3_wb
200002d8 l     O .data	0000000c enable_regs.4509
200002e4 l     O .data	00000008 _ZN6wirish4priv15w_board_pll_cfgE
2000039c l     O .data	00000004 _ZN6wirish4privL8pll_dataE
20000304 l     O .data	00000008 gpiod
20000324 l     O .data	00000008 adc2
2000032c l     O .data	00000038 i2c2
20000364 l     O .data	00000038 i2c1
20000424 l     O .bss	00000004 systick_uptime_millis
20000428 l     O .bss	00000001 _ZL7this_id
2000042c l     O .bss	00000004 _ZL9this_devp
20000430 l     O .bss	00000002 StatusInfo
20000432 l     O .bss	00000002 ResumeS
20000434 l     O .bss	00000004 dma2Ch4_5
20000438 l     O .bss	00000004 _ZL10_spi1_this
2000043c l     O .bss	00000004 _ZL10_spi2_this
20000440 l     O .bss	00000001 _ZZL17scan_running_dmdsvE1i
20000444 l     O .bss	00000008 _ZL12running_dmds
2000044c l     O .bss	00000001 _ZL15running_dmd_len
20000450 l     O .bss	00000004 Timer4
20000454 l     O .bss	00000004 Timer3
20000458 l     O .bss	00000004 Timer1
2000045c l     O .bss	00000004 Timer2
20000460 l     O .bss	00000018 Serial1
20000478 l     O .bss	00000018 Serial2
20000490 l     O .bss	00000018 Serial3
200004a8 l     O .bss	0000004c SPI
200004f4 l     O .bss	0000004c dmd_spi
20000540 l     O .bss	000001e0 dmd
20000720 l     O .bss	00000002 SaveRState
20000722 l     O .bss	00000002 SaveTState
2000076c l     O .bss	00000004 pbreak.4664
20000770 l     O .bss	00000100 vcomBufferRx
20000870 l     O .bss	00000100 vcomBufferTx
20000970 l     O .bss	00000001 transmitting
20000974 l     O .bss	00000004 tx_tail
20000978 l     O .bss	00000004 tx_head
2000097c l     O .bss	00000004 rx_tail
20000980 l     O .bss	00000004 rx_head
20000984 l     O .bss	00000001 line_dtr_rts
080034d0 l     O .rodata	00000008 _ZL14board_spi_pins
080034d8 l     O .rodata	00000004 _ZL18board_alt_spi_pins
080034dc l     O .rodata	00000008 _ZL10baud_rates
00000000 l    df *ABS*	00000000 C:\Users\Dmit\AppData\Local\Temp\arduino_build_926675\core\wirish\start.S.o
00000000 l    df *ABS*	00000000 exc.S.o
08002734 l     F .text	00000000 __default_exc
0800276c l       .text	00000000 NVIC_CCR
08002770 l       .text	00000000 SYSTICK_CSR
08002760 l       .text	00000000 CPSR_MASK
08002768 l       .text	00000000 TARGET_PC
08002764 l       .text	00000000 EXC_RETURN
00000000 l    df *ABS*	00000000 isrs.S.o
00000000 l    df *ABS*	00000000 errno.c
00000000 l    df *ABS*	00000000 init.c
00000000 l    df *ABS*	00000000 memset.c
00000000 l    df *ABS*	00000000 malloc.c
00000000 l    df *ABS*	00000000 memcpy-stub.c
00000000 l    df *ABS*	00000000 nano-mallocr.c
00000000 l    df *ABS*	00000000 nano-mallocr.c
00000000 l    df *ABS*	00000000 sbrkr.c
00000000 l    df *ABS*	00000000 lib_a-strlen.o
00000000 l    df *ABS*	00000000 mlock.c
00000000 l    df *ABS*	00000000 lock.c
00000000 l    df *ABS*	00000000 _aeabi_ldivmod.o
00000000 l    df *ABS*	00000000 libgcc2.c
00000000 l    df *ABS*	00000000 _dvmd_tls.o
00000000 l    df *ABS*	00000000 c:/users/dmit/appdata/local/arduino15/packages/arduino/tools/arm-none-eabi-gcc/gcc-9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/thumb/v7-m/nofp/crti.o
00000000 l    df *ABS*	00000000 c:/users/dmit/appdata/local/arduino15/packages/arduino/tools/arm-none-eabi-gcc/gcc-9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/thumb/v7-m/nofp/crtn.o
00000000 l    df *ABS*	00000000 impure.c
200003a4 l     O .data	00000060 impure_data
00000000 l    df *ABS*	00000000 reent.c
08002728 g     F .text	00000000 __exc_memmanage
08002774  w    F .text	00000000 __stm32reservedexception9
08000000 g     O .text	000000ec __stm32_vector_table
08001da0 g     F .text	00000018 __irq_usart2
08001f60 g     F .text	0000000c __irq_dma1_channel3
20000000 g       .data	00000000 __data_start__
08001ed0 g     F .text	0000000c __irq_i2c2_er
20000994 g     O .bss	00000001 __lock___atexit_recursive_mutex
08001edc g     F .text	0000000c __irq_i2c1_er
00000000         *UND*	00000000 __irq_sdio
00000000         *UND*	00000000 __irq_fsmc
00000000         *UND*	00000000 __irq_tim6
080029a0 g     F .text	0000000c __malloc_unlock
08001b92 g     F .text	0000018e __irq_usb_lp_can_rx0
20000995 g     O .bss	00000001 __lock___arc4random_mutex
08002d50 g       .ARM.exidx	00000000 __exidx_end
08001df4 g     F .text	00000050 __irq_tim1_cc
08002778 g     F .text	0000000c __errno
08002d48 g       .text.align	00000000 __text_end__
08001f3c g     F .text	0000000c __irq_dma1_channel6
08000000 g       .text	00000000 __text_start__
20000990 g     O .bss	00000004 errno
08001de8 g     F .text	0000000c __irq_tim2
00000000         *UND*	00000000 __irq_uart5
08002774  w    F .text	00000000 __exc_debug_monitor
08001f78 g     F .text	0000000c __irq_dma1_channel1
00000000         *UND*	00000000 __irq_adc3
080027fc g     F .text	0000001c memcpy
00000000         *UND*	00000000 __irq_dma2_channel2
08002774  w    F .text	00000000 __exc_svc
08002d44 g       .text	00000000 __fini_array_end
080027dc g     F .text	00000010 malloc
20000408 g       .bss	00000000 __bss_start__
08001f54 g     F .text	0000000c __irq_dma1_channel4
08001f84 g     F .text	00000058 __irq_adc
08001dd0 g     F .text	0000000c __irq_tim4
00000000         *UND*	00000000 __irq_tim8_brk
08002a50 g     F .text	000002c4 .hidden __udivmoddi4
08002964 g     F .text	00000020 _sbrk_r
08001f2e g     F .text	0000000e __irq_dma1_channel7
08001f28 g     F .text	00000006 __irq_exti0
08002730 g     F .text	00000000 __exc_usagefault
08002774  w    F .text	00000000 __irq_can_rx1
08002d48 g       .text.align	00000000 __exidx_start
20000996 g     O .bss	00000001 __lock___env_recursive_mutex
20000997 g     O .bss	00000001 __lock___sinit_recursive_mutex
08002784 g     F .text	00000048 __libc_init_array
08002028 g     F .text	00000048 start_c
08001fde g     F .text	0000004a _sbrk
08002d18 g     F .text	00000000 _init
08002774  w    F .text	00000000 __irq_spi2
20000998 g     O .bss	00000001 __lock___malloc_recursive_mutex
08002774  w    F .text	00000000 __irq_can_sce
00000000         *UND*	00000000 __irq_tim8_up
200009a0 g       .bss	00000000 _lm_heap_start
080029ae g     F .text	00000002 __retarget_lock_release_recursive
08001f1c g     F .text	00000006 __irq_exti2
08001ec0 g     F .text	00000010 __exc_systick
20000408 g       .data	00000000 __data_end__
200009a0 g       .bss	00000000 __bss_end__
08001e78 g     F .text	00000024 __irq_tim1_up
00000000         *UND*	00000000 __irq_uart4
08002818 g     F .text	00000098 _free_r
080034e4 g       .rodata	00000000 _lm_rom_img_cfgp
08001f16 g     F .text	00000006 __irq_exti3
08001d20 g     F .text	00000068 __error
08001f08 g     F .text	00000008 __irq_exti9_5
0800272c g     F .text	00000000 __exc_busfault
00000000         *UND*	00000000 __irq_dma2_channel4_5
08002774  w    F .text	00000000 __irq_pvd
08002774  w    F .text	00000000 __irq_tamper
08002774 g     F .text	00000000 __default_handler
08002774  w    F .text	00000000 __irq_wwdg
08002d14  w    F .text	00000002 .hidden __aeabi_ldiv0
08002774  w    F .text	00000000 __stm32reservedexception10
08002774  w    F .text	00000000 __irq_flash
08002994 g     F .text	0000000c __malloc_lock
08002d3c g       .text	00000000 __fini_array_start
08001ee8 g     F .text	0000000c __irq_i2c2_ev
080029ac g     F .text	00000002 __retarget_lock_acquire_recursive
080027cc g     F .text	00000010 memset
08002570 g     F .text	00000002 main
20005000 g       .text	00000000 __msp_init
08002d30 g       .text	00000000 __init_array_end
080028b0 g     F .text	000000b4 _malloc_r
08001e9c g     F .text	00000024 __irq_tim1_brk
0800270c g     F .text	00000000 __exc_reset
08001f6c g     F .text	0000000c __irq_dma1_channel2
00000000         *UND*	00000000 __irq_tim8_trg_com
08001db8 g     F .text	00000018 __irq_usart1
08001f48 g     F .text	0000000c __irq_dma1_channel5
08002774  w    F .text	00000000 __stm32reservedexception13
08002724 g     F .text	00000000 __exc_hardfault
08002d30 g     F .text	00000000 _fini
08002774  w    F .text	00000000 __irq_rtc
00000000         *UND*	00000000 __irq_tim5
08002774  w    F .text	00000000 __irq_spi1
08001e44 g     F .text	00000034 __irq_tim1_trg_com
200003a0 g     O .data	00000004 _impure_ptr
08002d24 g       .text	00000000 __preinit_array_end
08002774  w    F .text	00000000 __stm32reservedexception7
08002774  w    F .text	00000000 __irq_usb_hp_can_tx
00000000         *UND*	00000000 __irq_tim8_cc
08001f00 g     F .text	00000008 __irq_exti15_10
08001f10 g     F .text	00000006 __irq_exti4
08002720 g     F .text	00000000 __exc_nmi
00000000         *UND*	00000000 __irq_dma2_channel3
00000000         *UND*	00000000 __irq_tim7
08002774  w    F .text	00000000 __irq_rtcalarm
200009a0 g       .bss	00000000 _end
20000999 g     O .bss	00000001 __lock___at_quick_exit_mutex
00000000         *UND*	00000000 __irq_spi3
08002774  w    F .text	00000000 __stm32reservedexception8
00000000         *UND*	00000000 __irq_dma2_channel1
08002d14  w    F .text	00000002 .hidden __aeabi_idiv0
08002d24 g       .text	00000000 __init_array_start
08002774  w    F .text	00000000 __exc_pendsv
08001ef4 g     F .text	0000000c __irq_i2c1_ev
08001fdc  w    F .text	00000002 _exit
08002774  w    F .text	00000000 __irq_usbwakeup
2000099a g     O .bss	00000001 __lock___dd_hash_mutex
2000099b g     O .bss	00000001 __lock___tz_mutex
08002984 g     F .text	00000010 strlen
0800270c g     F .text	00000000 __start__
2000098c g     O .bss	00000004 __malloc_sbrk_start
08001f22 g     F .text	00000006 __irq_exti1
08002774  w    F .text	00000000 __irq_rcc
08001ddc g     F .text	0000000c __irq_tim3
20000988 g     O .bss	00000004 __malloc_free_list
08001d88 g     F .text	00000018 __irq_usart3
08002d24 g       .text	00000000 __preinit_array_start
080029b0 g     F .text	00000000 .hidden __aeabi_ldivmod
28008158 g       .rodata	00000000 _lm_heap_end
2000099c g     O .bss	00000001 __lock___sfp_recursive_mutex
080027ec g     F .text	00000010 free


 

b707
Offline
Зарегистрирован: 26.05.2017

после перерыва вновь вернулся к изысканиям насчет размера кода.

Напомню суть - разбираюсь, как в аддоне Кларка для СТМ избавится от включения в код  неиспользуемых функций и процедур.

Например - из листинга в #38 видно, что самой большой секцией в коде является вектор __irq_usb_lp_can_rx0.  Это тем более обидно, что в коде CAN и USB не используется, USB-загрузчик отключен (загрузка через St-link) 

Похоже, что аддон Кларка тянет USBlib в код по умолчанию Все дефайны типа STM32_MCU_HAS_USB выключил - и все равно вижу в логе сборки, что usb-lib компилируется.

Вопрос - как ее убрать? Она точно влияет на код. Попробовал тупо заменить вектор __irq_usb_lp_can_rx0 на заглушку - код сразу уменьшился более чем на 1к

 

 

PS оптимизация с опцией -0s, LTO включено

b707
Offline
Зарегистрирован: 26.05.2017

b707 пишет:

Похоже, что аддон Кларка тянет USBlib в код по умолчанию

Вопрос - как ее убрать? Она точно влияет на код. Попробовал тупо заменить вектор __irq_usb_lp_can_rx0 на заглушку - код сразу уменьшился более чем на 1к

отвечаю сам себе.

Хоть я жутко ленивый, но в выходные выполнил тупую работу - методично заменил все функции и методы USBlib на пустые заглушки. Результат - размер прошивки не изменился.

Вывод1 - работа была лишней, компилятор с линкером отлично справляются с выкидыванием неиспользуемых функций из кода. А то, что их компиляция видна в логе - ничего не значит, они только компилируются. но в итоговый бинарник не попадают.

Однако у векторов прерывания поведение другое. Как уже писал выше, замена вектора __irq_usb_lp_can_rx0 на пустышку дала уменьшение размера кода на 1к. Тоже самое когда почистил вектора __irq_i2c и __irq_i2c_error(в точных названиях могу наврать, пишу по памяти) - выиграл суммарно еще 1к.

Вывод2 - оптимизатор не удаляет вектора прерываний из кода, да если они ни разу не вызываются в программе.

Хотелось бы услышать мнение старших, мои предположения верные?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

Вывод2 - оптимизатор не удаляет вектора прерываний из кода, да если они ни разу не вызываются в программе.

Дак он и не может предсказать, будут ли они вызываться, поэтому оставляет все, на всякий случай.  Прерывания на то и прерывания, что в явном виде ниоткуда не вызываются. 

b707
Offline
Зарегистрирован: 26.05.2017

Спасибо.

не знаю, стоит ли возиться и добавлять в вектора прерываний директивы условной компиляции, чтобы их можно было "выключать", когда они не используются? Или это криво и костыльно?

Цель - ширше задействовать для проектов плату STM32F103C6, у которой флеш 32К вместо 64к/128к у блюпила