Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Оптимизация в CubeIDE

Пн фев 20, 2023 14:13:57

Переношу один старый проект с avr( 10k CVAVR) на STM32F030 c 16кB. И четверти не перенес он уже ругается что region `FLASH' overflowed by 628 bytes. Нехватает флэш. Ткните носом где настройки оптимизации.

Re: Оптимизация в CubeIDE

Пн фев 20, 2023 14:42:58

https://yandex.ru/search/?text=STM32Cub ... _safe&lr=5
https://www.programmersought.com/article/28015767015/

Вы серьёзно ? Меньше минуты понадобилось для поиска. :facepalm:

Re: Оптимизация в CubeIDE

Пн фев 20, 2023 15:15:13

Ну так вы с с 8 бит или 16 бит переносите на 32мк, соответственно памяти у вас всяко е хватит.

Re: Оптимизация в CubeIDE

Пн фев 20, 2023 15:18:47

Смените настройку в IDE на STM32F030*6

Re: Оптимизация в CubeIDE

Пн фев 20, 2023 18:43:42

Переношу один старый проект с avr

Я очень сильно сомневаюсь что проект для avr написан без ассемблера, и с чётким разделением на слои: периферия/драйвер/системные функции/уровень юзера.
Потому как такие проекты портируются за один вечер, вне зависимости от размера.

Re: Оптимизация в CubeIDE

Вт фев 21, 2023 21:59:33

Не забыли включить оптимизацию в т. ч. LTO?
Надеюсь HAL не используете?

Re: Оптимизация в CubeIDE

Пн мар 27, 2023 14:48:06

Переношу один старый проект с avr

Я очень сильно сомневаюсь что проект для avr написан без ассемблера, и с чётким разделением на слои: периферия/драйвер/системные функции/уровень юзера.
Потому как такие проекты портируются за один вечер, вне зависимости от размера.

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

Re: Оптимизация в CubeIDE

Пн мар 27, 2023 17:18:40

А туториал есть

Это кошку можно к лотку приучить, а человека уже намного сложнее. Если человек привык гадить - то для него это норма.
Делить на слои проект одной страницы - очень сложно. В том плане что самого кода мало, функций мало, и буквально всё связано. Обычно в таких одностраничных проектах - махание ножками распределяется на половину функций. И эти функции невозможно перевести в категорию "железо", потому как они ещё и логику периферии выполняют, а сверху логику основного цикла. В таких случаях проще пристрелить уродца, и переписывать с нуля.

Для начала надо написать простые функции работы с уровнем железа. При использовании хала, или чего-то подобного - такой набор функций уже есть. Значит пишем уровень логики периферии - те самые функции, что работают через железо с внешними интерфейсами. Можно в один файл, а можно файл под каждый тип логики. Они в любом случае пересекаться не должны. Уже сейчас вместо нескольких тысяч переменных и функций от чистого cmsis и hall - поле видимости будет включать только ваши функции и ваши данные. По сути у вас уже получился уровень драйвера, например функции записи чтения флеша по i2c шине.

Следующий уровень - логика общего алгоритма, это ещё не главный цикл, но очень близко к нему. Например функция моргания светиком при успешном обновлении данных во внешней памяти, работа со звуком, работа с экраном, и так далее. Полностью автономные функции, которые могут выполнять по настоящему полезную работу, не мешая другим функциям!!!
Кстати, некоторые сложные интерфейсы дотягиваются до этого уровня. Как например usb, инетнет, ваяфая, и кан. Они реально сложные, и писать их с нуля нет смысла - проще использовать готовое.

Следующий уровень системный - то что объединяет и разделяет весь написанный бардак в иерархию уровней доступа. Потому как очень многие вещи должны выполняться в строгой последовательности, иначе фигня получится. Писать заново рутинные последовательности каждый раз - максимально глупо. К таким вещам относятся файловые системы на разных носителях, алгоритмы работы с файфаем, простым радио, им так далее. И опять - подобное проще взять уже готовое.

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

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

И ещё, подготовка железа выполняется в функции SystemInit(), которая должна вызываться раньше main(). Многие рутинные вещи обязательно нужно перенести именно туда, чтоб не отсвечивали.
Ответить