Расширенный размер кода во время миграции с доски Arduino Promini на доску Maple-Mini STM32.

Умероки
Чт 20 октября 2016 г., 10:04
Всем привет,
У меня есть проблема, и я не могу разобраться. У меня есть код на Arduino, написанный для Arduino-Promini. Длина кода составляет 30 КБ. Когда я перенес свой код из Arduino Pro-Mini в STM32 Maple-Mini мой размер кода, продлен до 100 КБ. Я хочу уменьшить размер кода, что до 64 КБ.
Может ли кто -нибудь предложить мне, что мне делать??

Даниэфф
Чт 20 октября 2016 г. 13:25
Найдите функции, которые занимают самое большое пространство: char mem[1024]; uint32_t flashStartAddress = (uint32_t)&_SPIFFS_start - 0x40200000; uint32_t begin = millis(); uint32_t elapsed = 0; p.println("Flash Mem Perf Test :"); for (int i = 0; i < 1024; i++) { ESP.flashRead(flashStartAddress, (uint32_t *)&mem, sizeof(mem) / sizeof(uint32_t)); flashStartAddress += sizeof(mem) / sizeof(uint32_t); } elapsed = millis() - begin; p.printf("\nelapsed time = %u \r\n", elapsed); p.printf("throughput = %u bytes/sec \r\n", 1024 * 1024 * 1000 / elapsed);

Умероки
Чт 20 октября 2016 г., 15:40
Спасибо Дениэль за твой ответ, ты можешь ли ты вести меня, куда написать эти строки
"ram-none-eabi-nm--print-размер.эльф "

ZMEMW16
Чт 20 октября 2016 г., 17:20
Умерокс написал:Спасибо Дениэль за твой ответ, ты можешь ли ты вести меня, куда написать эти строки
"ram-none-eabi-nm--print-размер.эльф "

Даниэфф
Чт 20 октября 2016 г. 18:07
Умерокс написал:Спасибо Дениэль за твой ответ, ты можешь ли ты вести меня, куда написать эти строки
"ram-none-eabi-nm--print-размер.эльф "

Rogerclark
Чт 20 октября 2016 г., 20:43
Почти наверняка в коде, который вы собираете, будет использовать новый оператор, или что -то еще, что означает, что линкер должен был привлечь огромное количество кода управления памятью.

Это все еще, вероятно, вписывается в чертеж, так как большинство из них на самом деле представляют собой 128 тыс. Флэш -устройства, хотя они продаются как 64K.

Таким образом, простое решение состоит в том, чтобы выбрать Generic STM32F103CB вместо C8


Более сложное решение - изменить код для использования статического экземпляра памяти.


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

Я не эксперт в библиотеках ARM GCC, и может быть меньшая LIB, с которой вы могли бы связать, а не тот, который мы обычно используем, но другие люди уже столкнулись с этой проблемой, и я не думаю, что решение - использовать Разное либера (хотя я не могу вспомнить, почему бы и нет)

Умероки
Пн 24 октября 2016 г. 12:26
Спасибо каждому за ваши предложения и помощь. Наконец я понял проблему.
Было две статические переменные, которые были инициализированы с помощью «micros () и переменной», которые вызывали удивительный прирост в размере кода. Исправляя их инициализацию, размер кода уменьшился до 38 КБ.
Надеюсь, это может помочь другим столкнуться с той же проблемой

Эдогальдо
Пн 24 октября 2016 г., 13:29
Умерокс написал:Спасибо каждому за ваши предложения и помощь. Наконец я понял проблему.
Было две статические переменные, которые были инициализированы с помощью «micros () и переменной», которые вызывали удивительный прирост в размере кода. Исправляя их инициализацию, размер кода уменьшился до 38 КБ.
Надеюсь, это может помочь другим столкнуться с той же проблемой

Умероки
Пн 24 октября 2016 г. 14:44
Образец:
void abc (void) {
uint8_t value_1 = 0;
Статическое без знака длинного значения_2 = micros (); // преступник
Статическое без знака длинное значение_3 = значение_1; // преступник

// заменен на
Статическое без знака длинное значение_2 = 0;
Статическое без знака длинное значение_3 = 0;
.
.
.
}

При использовании метода Даниэффа, был напечатан только размер кода функции. Поскольку статическая инициализация переменной могла бы включать некоторые другие внутренние библиотеки, которые не показали увеличенный размер ABC (). Затем я прокомментировал все вызванные функции и расстроены их один за другим и собирал код каждый раз, пока не пришел в FN, потребляющую большую память. Затем прошел через код FN и разобрал проблему

Rogerclark
Пн 24 октября 2016 г., 19:58
Пожалуйста, не обращайте внимания на мой пост (ниже), как указал Рик, код не в глобальном объеме

Глядя на код снова, возможно, код является лишь примером, а не реальным кодом, так как имена переменных кажутся странными.
я.не настоящие имена вещей.



Интересно, а также довольно странно.

Я не знал, что можно было бы вызвать функции для инициализации переменных в C.
Инициализация переменных в глобальном объеме всегда проблематична, потому что порядок, в котором вещи настройки не определены в спецификации C.

Призыв к Millis () был бы полной тратой времени, так как он будет нулевым
И это недопустимо, чтобы вызовать Millis () перед Main (), как и на большинстве процессоров, аппаратное обеспечение должно быть охвачено для работы с счетчиком Millis ().глин. PLL должны быть настроены, если у вашего MCU не будет выделенного аппаратного регистра Millisecond Counter.

Со статическими VARs прыгает ли размер кода, если вы просто исправляете проблему Millis ()?

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

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

ИМХО. Я был бы немного обеспокоен качеством используемого кода.

Я бы никогда не назначал переменную другой переменной в глобальной области. Если две переменные должны содержать одинаковое значение во время инициализации, я бы сделал #Define для этого значения (при условии, что оно не нулевое) и использую определение, чтобы инициировать оба VAR.

Также называть вещи как «переменная1» - это плохая практика.
И почему переменная1 не статична? (Относится к плохому именованию переменных, так как нет возможности узнать, глядя на имя переменной, именно то, для чего оно используется)

Рик Кимбалл
Пн 24 октября 2016 г., 21:28
Rogerclark написал: Инициализация переменных в глобальном объеме всегда проблематична, потому что порядок, в котором вещи настройки не определены в спецификации C.

Rogerclark
Пн 24 октября 2016 г., 21:49
Рик

Моя ошибка

Я думал, что код был в глобальном объеме

Я обновлю свой пост.

Я не должен публиковать публикацию перед первой чашкой кофе по утрам ;-)

Rogerclark
Пн 24 октября 2016 г., 21:57
Рик

Любая идея, когда компилятор фактически назначит переменную, которая вызывает Millis () ?

Это когда функция сначала называется или как часть Global Init.

Если его Global Init, то вызов Millis () будет проблематичным - и, вероятно, бессмысленным, поскольку он всегда будет нулевым

Рик Кимбалл
Вт 25 октября 2016 г. 12:17
Он подпадает под первое правило использования, которое я опубликовал выше

Умероки
Ср 26 октября 2016 г., 16:02
Глядя на код снова, возможно, код является лишь примером, а не реальным кодом, так как имена переменных кажутся странными.
я.не настоящие имена вещей.
Да, Роджер, вы правы, это всего лишь пример кода, который я упомянул, и имена переменных для примера Aswel.

Rogerclark
Ср 26 октября 2016 г. 8:11 вечера
Хорошо.

Спасибо.

VGA Space Invaders на Bluepill