Массивный размер эскиза

C_D
Втюргал 07 июля 2015 г., 4:35 утра
Я начал перемещать свой проект с 8-битного Arduino на STM32Duino. Когда я компилируюсь для STM32, размер эскиза поражается, и я не могу понять, почему. Я изменил свои определения булавки на целые числа (вместо PA0 и т. Д.) поэтому он будет компилироваться как для 8-битного AVR, так и для STM32:

8-битный AVR: наброски 3780 байтов и глобальные переменные 237 байтов
STM32DUINO: наброски 73 520 байтов и глобальные переменные 6456 байтов

Вот пример чтения, скомпилированный для тех же двух досок:
8-битный AVR: 3506 байт, глобальные переменные используют 188 байтов
STM32Duino: эскиз 17 828 байтов и глобальные переменные используют 4224

Таким образом, для 8-битного AVR моя программа лишь незначительно больше, чем ReadAsciistring, что имеет смысл, они делают очень похожие вещи. Но затем на STM32 мой код выходит в 4 раза больше, чем ReadAsciistring. Я не использую какие -либо дополнительные библиотеки, все мой код - это последовательное сообщение, прочитать некоторые входы АЦП и отвечать значениями добавления, это не очень технические вещи.

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

Я действительно не хочу публиковать весь проект (это около 300 строк), но у кого -нибудь есть идеи о том, где я должен искать это?

victor_pv
Втюл 07 июля 2015 г. 5:04
C_D написал:
Я действительно не хочу публиковать весь проект (это около 300 строк), но у кого -нибудь есть идеи о том, где я должен искать это?

Rogerclark
Втюж 07 июля 2015 г. 5:31 утра
На данный момент может быть собрано много вещей в том, что вы можете не хотеть.

Если вы используете загрузчик, есть серийный USB -материал (как это должно куда -нибудь идти, я.E либо загрузчик эскиза, общее количество взятого пространства было бы таким же)

Но все платы имеют несколько аппаратных последовательных портов, минимум 3 серийных серийных.

Я подозреваю, что библиотеки для некоторых вещей больше, чем на AVR, я знаю, что двойной тип переменной правильно поддерживается (типы AVR удваиваются назад к плаву), и AVR принимает множество ярлыков, чтобы уменьшить размер кода, что делает его большим Меньше стандартного компилятора C / линкера.

Однако, если разместить код где -нибудь, мы могли бы посмотреть

Mrburnette
Втюж 07 июля 2015 12:27
C_D написал:Я начал перемещать свой проект с 8-битного Arduino на STM32Duino. Когда я компилируюсь для STM32, размер эскиза поражается, и я не могу понять, почему. Я изменил свои определения булавки на целые числа (вместо PA0 и т. Д.) поэтому он будет компилироваться как для 8-битного AVR, так и для STM32:

C_D
Втюргал 07 июля 2015 г., 19:46
Что ж, мой F103C8T6 предназначен только для того, чтобы иметь 64 тыс. Флэш, поэтому набросок 73K слишком большой. Я собираю * большинство * C8T6, на самом деле отправляются с 128 тыс. Флэш -. Почему пример чтения 17K (который является разумным размером), а мой эскиз - 73K?

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

Martinayotte
Втюл 07 июля 2015 г., 8:19 вечера
Предложение Виктора о рассмотрении полученного файла карты, посмотрите на все функции в адресах в регионе 0x80000000, а следующим номером является размер, полученные на этой функции или символе.
Я смотрю на один из моих эскизов и увидел, что «cxa_demangle» от gcclibcxx довольно большой. (Я постараюсь выяснить это)

C_D
Втюл 07 июля 2015 г., 8:21 вечера
Видимо, использование «нового» - плохая идея?

Минимальный пример:
// Write a magic flag into the RTC register 10 to ensure we reboot // into persistent bootloader mode bkp_init(); bkp_enable_writes(); bkp_write(10, 0x424C); bkp_disable_writes();

Rogerclark
Втюж 07 июля 2015 г., 21:37
Я не уверен, почему вы объявите байтовый массив, используя новый.

То, что вы просите компилятора сделать, - это две совершенно разные вещи.

Использование «нового» вы просите компилятора создать массив или объекты типа байта, а не массив байтов

Я подозреваю, что компилятор AVR просто не соответствует стандартам и позволяет вам делать такие вещи, не делая то, что должен делать стандартный компилятор C ++ ANSI.

Я понятия не имею, почему объект байта занимает так много места, вероятно, Рик был бы человеком, чтобы посоветовать по этому поводу. Возможно, это потому, что внутренне компилятор использует Malloc, и есть минимальный размер распределения.

Martinayotte
Втюж 07 июля 2015 г., 21:38
Фактически это действительно странно !

Рик Кимбалл
Вторник 07 июля 2015 г., 22:27
C_D написал:Видимо, использование «нового» - плохая идея?

C_D
Втюргал 07 июля 2015 11:23
8-битный Arduino не новым по-разному? Я могу использовать новое прекрасно на 8-битных Arduinos без этой проблемы.
extern "C" void <__irq_handler_name>(void) { //optimized code here }

Rogerclark
Втюж 07 июля 2015 г., 23:49
Учебник, с которым вы связаны не для встроенных устройств, его общий C++

Есть много вещей, которые может сделать C ++, но вы должны избегать на встроенных устройствах.

эн.глин. Использование Malloc и т. Д. Обычно не рекомендуется, потому что минимальный размер блока распределения часто довольно большой в встроенных терминах, а также может привести к фрагментации памяти.

C_D
Ср. 8 июля 2015 г. 12:06
Что является совершенно справедливой точкой :)

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

Я предполагаю, что мое основное наблюдение заключается в том, что оно, по-видимому, работает в 8-битной среде Arduino, а не в 32-битной. Я очень рад, что не использую функцию, просто заинтересованным в том, почему она работает по -разному на разных платформах.

Rogerclark
Ср. 8 июля 2015 г. 12:12
@C_d

Я не уверен, есть ли определенный список различий между компиляторами AVR и ARM.

Возможно, его стоит отправить в должную часть Arduino.Форум CC, так как это будет иметь те же «проблемы», поскольку мы используем точно такой же компилятор, что и Due (именно поэтому вам необходимо установить Due от диспетчера плат - как компилятор ARM больше не установлен по умолчанию)

И, конечно же. Я подозреваю, что люди покупают ноль в качестве замены для проверенного и протестированного ООН, будет на несколько сюрпризов.

Рик Кимбалл
Ср. 8 июля 2015 г. 12:39
C_D написал:Я очень рад, что не использую функцию, просто заинтересованным в том, почему она работает по -разному на разных платформах.

C_D
Ср. 8 июля 2015 г. 12:57 утра
Я понимаю. Спасибо, что разъяснили, что. Я ценю, что вы, ребята, нашли время, чтобы ответить на подобные вопросы : D

Rogerclark
Ср. 8 июля 2015 г. 1:00
Рик

Компилятор Keil лучше. Я слышал, что это более оптимизировано, чем GCC

Mrburnette
Ср. 8 июля 2015 г., 13:02
Рик Кимбалл написал:C_D написал:Я очень рад, что не использую функцию, просто заинтересованным в том, почему она работает по -разному на разных платформах.

Mrburnette
Ср. 8 июля 2015 г. 13:11
C_D написал:Видимо, использование «нового» - плохая идея?
<...>

Рик Кимбалл
Ср. 8 июля 2015 г., 14:00
Rogerclark написал:Рик

Компилятор Keil лучше. Я слышал, что это более оптимизировано, чем GCC

Mrburnette
Чт, 09 июля 2015 г. 1:31
Рик Кимбалл написал: <...>
У меня нет опыта с Кейлом, и вряд ли я когда -либо буду. Когда я хочу сделать что -то маленькое, я стараюсь убедиться, что он не использует никаких вещей Libc.

-рик

Pykowiec
Пт 16 октября 2015 г. 14:13
Привет,

На Ардуино есть такая же проблема. Линкер генерирует массовый двоичный файл, когда использовались новые и удаления.

Поместите код в верхней части эскиза.

void * operator new (size_t size) {return malloc (size); }
void * operator new (size_t size, void * ptr) {return ptr; }
оператор void delete (void * ptr) {free (ptr); }

Теперь размер эскиза должен по нормальным размерам.

Mrburnette
Пт 16 октября 2015 г. 15:35
Pykowiec написал:<...>

Рик Кимбалл
Ср 21 октября 2015 г. 18:46
Рик Кимбалл написал:Rogerclark написал:Рик

Компилятор Keil лучше. Я слышал, что это более оптимизировано, чем GCC

Rogerclark
Ср 21 октября 2015 г., 19:28
Рик,

Спасибо за ссылку на бесплатную копию Keil. Я возьму копию, на случай, если они передумают ее бесплатно.

Мне это не нужно сейчас, но вы никогда не знаете в будущем .....

Редактировать.

Я загрузил установщик, но страница, которую вы получаете при загрузке, имеет текст об их ограничениях на демонстрационную и оценку программного обеспечения.

Я не уверен, что это только потому, что этот текст всегда находится на этой странице, или эта версия Keil действительно просто копия оценки.

Вам также нужно зарегистрироваться в MDK, чтобы получить код активации, я.E вы не можете просто ввести код, который находится на первой странице, на которую вы попали.

Так...

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

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

Арпрос
Пн, 16 апреля 2018 г., 17:21
Кстати, просто чтобы обновить эту старую ветку, в какой-то момент ядро ​​на основе Libmaple значительно улучшилось в связи с новый оператор. Это все еще не так эффективно память, как Malloc () или распределение времени компиляции, но гораздо лучше-теперь есть только 3K Flash и 1K штраф. Тем не менее я стараюсь избегать новый в моем коде.
uint _delay=2000; //gpio_reg_map *gpiob_regs; register __IO uint32 *gpiob_bsrr asm ("r8"); void setup() { // put your setup code here, to run once: Serial.begin(115200); pinMode(LED_BUILTIN,OUTPUT); pinMode(PB2,INPUT); pinMode(PB3,INPUT); pinMode(PB4,OUTPUT); //gpiob_regs=GPIOB->regs; gpiob_bsrr=&(GPIOB->regs->BSRR); //enable EXTI2 as RISING on PB2 bb_peri_set_bit(&EXTI_BASE->RTSR, 2, 1); // rising exti_select(EXTI2, EXTI_PB); bb_peri_set_bit(&EXTI_BASE->IMR, 2, 1); nvic_irq_set_priority(NVIC_EXTI2, 0xE); //enable EXTI3 as FALLING on PB3 bb_peri_set_bit(&EXTI_BASE->FTSR, 3, 1); // falling exti_select(EXTI3, EXTI_PB); bb_peri_set_bit(&EXTI_BASE->IMR, 3, 1); nvic_irq_set_priority(NVIC_EXTI3, 0xE); nvic_irq_enable(NVIC_EXTI2); nvic_irq_enable(NVIC_EXTI3); } void loop() { // put your main code here, to run repeatedly: Serial.println("It's working"); delay(_delay); } extern "C" void __irq_exti2(void) { //gpiob_regs->BSRR=0x10; *gpiob_bsrr=0x100000; } extern "C" void __irq_exti3(void) { //gpiob_regs->BSRR=0x100000; *gpiob_bsrr=0x10; }

Проблемы со Stlink

STM32Duino - Вопросы архитектуры