с "-O3", и он даже работал, но прошивка весила 8 КБ вместо 7 КБ
Так и должно быть, вызовы заменяются инлайном, что в некоторых случаях, позволяет повысить быстродействие. Никакого криминала тут нет.
JackSmith писал(а):
на сайте arm рекомендуют использовать "-O2", вместо "прогрессивного -O3", да?
Да вроде нет? Только для Отладки, рекомендуется более низкий уровень оптимизации (то что я выше писал), для работы можно использовать любой, подходящий под задачу. Не надо демонизировать -O3. Реальных причин для этого нет. Особенно на МК, особенно в real-time приложениях.
Цитата:
-O3
Maximum optimization. When debugging is enabled, this option typically gives a poor debug view. Arm recommends debugging at lower optimization levels.
_________________ При решение наиболее сложных задач, большинство, как правило, ошибается...
Отладка на всем, что отлично от None - работает, но специфисиссськи, и нужно переключить режим "шагания" на Instrucrion Stepping Mode, хотя это не всегда помогает в отладке. И вообще, я не говорил об отладке при включенной оптимизации. Я говорил о том, что без оптимизации получается весьма медленный код из-за того, что генерируется он "топорно" - что написано, то и делается, без всяких там сокращений. Отсюда и родился миф, что якобы написание на ассемблере дает лучший код, нежели на С/С++. Поэтому, рабочий код очень желательно включать на оптимизацию, иначе он будет тормознутым. Конечно, для этого надо знать, как правильно писать, чтобы оптимизация не повыбрасывала всю ту писанину, которую вы так гордо писали
PS. Кстати, мало кто знает, но разным файлам и разным функциям можно назначать разные уровни отладки. Это прописывается через флаги компилятора и атрибуты ф-ций.
Последний раз редактировалось КотПротон Пн авг 11, 2025 14:39:48, всего редактировалось 2 раз(а).
Отладка возможна на всех уровнях оптимизации, другое дело, что можно, например, удивиться невозможности поставить breakpoint - это место может исчезнуть в результате оптимизации. Да и вообще, мне кажется странным отлаживание в одном уровне, а затем его изменить и получить иную версию кода.
breakpoint ставится, но в локальных переменных при трассировке пишет "optimized out"
Правильно. Эти переменные могут не сохраняться в ОЗУ и находиться в регистрах ядра. Исключаются лишние операции записи в ОЗУ и обратного их считывания оттудава.
uint32_t interval = WAIT; Причем, WAIT - это, судя по виду, константа. А константы - они оптимизируются и помещаются внутрь параметров инструкций. А вон она - строчка 29 справа, с movw r6, #3000 - компилятор посчитал константные выражения и поместил их сразу в параметр инструкции.
Напишите перед объявлением переменной (обоих переменных) volatile и еще раз посмотрите.
самая частая проблема - "Памагите, я включил оптимизацию и на выходе получил 0 кБ кода, хотя там было написано 300 строк!" Так что нечего на зеркало то пенять А то крик то подняли, ай-ой, фуфло, константные выражения в функции оптимизатор выкинул, ой-ой, что такое Всё норм, посоны, не истерите. Всё нормальдос. Если продолжает работать, значит, всё норм. Хуже было бы, если бы из тыщщи строк он оставил 0 строк. Это говорило бы о том, что погромисътъ был пьян:)
Так я и говорю - перед объявлением обеих переменных напишите volatile. С другой стороны, если после оптимизации всё работает как надо без сбоев, то значит, всё в порядке, не кричите. Переменная была оптимизирована и помещена в параметры инструкции movw. Можете проийтись по отладке в режиме Instruction Step Mode (по ассемблерному листингу) и посмотреть, что происходит с переменной.
Нет, volatile показывает вашу любимую переменную, чтобы вы могли наслаждаться созерцанием её. А еще, volatile - способ вернуть неожиданно исчезнувшие из бинарника 500 строк важного кода, которые вы так старательно писали, а негодяй-оптимизатор посчитал ваши труды никчемной тратой пространства на флеше
А у вас инит I2C зависит от дисплея. Нелогично. Либо писать один и тот же инит I2C и в дисплее, и во всех остальных устройствах, либо обращаться к иниту дисплея, чтобы настроить I2C, либо просто вынести инит I2C за пределы модуля дисплея..
на самом деле ничего страшного не будет, если инициализация дисплея будет включать инициализацию I2C модуля и связанные GPIO. даже если на шине более чем одно устройство.
ичего страшного не будет, если инициализация дисплея будет включать инициализацию I2C модуля и связанные GPIO
Ничего страшного для тех, кто пишет как бох на душу положит Но для тех, кто думает разумом, это сигнал к исправлению неверной структуры программы.
Показываю на гипотетическом примере: на одной шине I2C висит дисплей и датчик температуры. Инит I2C и инит его пинов написан только в функции инита дисплея:
Код:
void InitDisplay() { InitI2CPins(); InitI2C();
WriteI2C(0xAA); }
void InitSensor() { WriteI2C(0xBB); }
Хорошо. А теперь запускаем:
Код:
int main(void) { InitSensor(); InitDisplay();
Ога? Ога. Обычный кодописатель впихнет InitI2CPins(); InitI2C(); и в функцию InitSensor(). На всякий случай. Думающий программист прикинет возможные последствия - дублирование кода, лишние логические связи, и просто вынесет фукнции инита за пределы функций инита дисплея и сенсора. Всё просто, если мыслить думать!
Думающий программист прикинет возможные последствия - дублирование кода, лишние логические связи, и просто вынесет фукнции инита за пределы функций инита дисплея и сенсора.
поздравляю, вы открыли распределительный закон из второго класса
Just_Fluffy писал(а):
JackSmith писал(а):
Значит далее в данном программном блоке данная переменная не используется, программный код обходится и без нее без потери функционала
КотПротон, девчонка шарит лучше тебя. надеюсь тебе стыдно?
я написал, что переменная была оптимизирована и перенесена в параметр инструкции movw r6, #3000, и даже показал, где она находится. Если вы не шарите в ассемблерном тексте и слабо понимаете написанное, то это исключительно ваша личная беда.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения