Eddy_Em писал(а):Еще натыкался неоднократно на странность: с одними и теми же (за исключением архитектуры, понятное дело) флагами на F072 memcpy работал, а на F103 приводил к хардфолту. Вот, проверил на G070 - тоже memcpy к хардфолту приводит
Попробуй почитать доки и заменить memcpy() на memmove().
Eddy_Em писал(а):Вообще, самый идеал — совершенно не пользоваться libc
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352159#p4352159"]Бдыщ: не работает прошивка. Убираю -flto — работает![/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]А еще я вспомнил, почему --specs=nano.specs как-то комментировал: с этим делом у меня тоже прошивка не работала.[/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]на F072 memcpy работал, а на F103 приводил к хардфолту.[/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]Вот, проверил на G070 - тоже memcpy к хардфолту приводит, пришлось свой использовать.[/uquote][uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352182#p4352182"]Я вот с F303 возился: флоаты заработали, арифметические операции с ними — тоже, а вот sqrt — хрена с два![/uquote]
Прямо триллер какой-то. Может, что-то в консерватории подправить?
VladislavS, stm32f030f4p6 при -42 градуса отказывается работать, при -36 работает. Какой у этого хваленного stm температурный диапазон?
В гараже почте -50 аон на 80с31 запускается и работает.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4352308#p4352308"]stm32f030f4p6 при -42 градуса отказывается работать, при -36 работает.[/uquote]Ну, так и должно быть.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4352308#p4352308"]Какой у этого хваленного stm температурный диапазон?[/uquote]В даташит заглянуть не судьба?
[uquote="Dimon456",url="/forum/viewtopic.php?p=4352308#p4352308"]В гараже почте -50 аон на 80с31 запускается и работает.[/uquote]У нас G071 без кварца на -60 запускаются, если что. Да и по опыту других контроллеров - первым кварц отваливается. Внешнее тактирование обычно сильно ниже -50 позволяет работать.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352159#p4352159"]Послушал я тут советчиков и добавил -flto в опции компилятора. Но не проверил сразу. Бдыщ: не работает прошивка. Убираю -flto — работает!
Вот такие пироги. Странно, что у других все ОК с этой опцией.[/uquote]
У меня подобное наблюдалось и связано было с тем, что обработчики векторов прерываний с flto выбрасывались (они в стартапе вроде бы с "weak" объявлены, и из-за этого и выбрасывались). Решалось, если не ошибаюсь, компиляцией .S файлов (читай, стартапа) без этой опцией, а прочих (C-шников) - с ней.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Eddy_Em что-то с таблицей векторов там перемудрил, насколько я помню. Если классическое определение с использованием адресов обработчиков, то ничто не выкидывается ни при каком уровне оптимизации. Собственно, у него и .S файла то нет.
Спойлер
Так вот мой стартап. Честно стырил из opencm3 и переделал под G0.
Возможно, добавление атрибута "used" действительно поможет, ХЗ. Я вообще с этими дурацкими атрибутами стараюсь как можно меньше дела иметь. Я пользуюсь C89, лишь изредка втыкая фичи C99. То, что там позже наворотили — бред собачий!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
VladislavS, спасибо. Действительно, нужно было указать атрибут "used". Код стал примерно на килобайт меньше (6.5к → 5.5к), при этом все нормально работает.
Вообще не понимаю, как получается такая оптимизация...
P.S. Попробовал с предыдущим (где тупо UART): сначала размер упал с 1636Б до 1556Б, но USART не работал. Тут я вспомнил, что у меня переменные, меняющиеся в прерываниях, не были помечены волатильными. Размер увеличился до 1592Б, но при этом все работает!
Даже несчастный blink с 880Б на 8Б "похудел" (уж что там было оптимизировать — вообще не понимаю).
Для меня это — магия какая-то. Как и то, что на -O2 gcc не выкинул мои переменные, не помеченные волатильными. Я-то всю жизнь считал, что единственная возможность оптимизации — это указание -O с числом или s…
Добавлено after 15 minutes 31 second:
О, и memcpy заработало! И даже код стал на 4 байта меньше, чем с моим аналогом…
А вот в "сниппете" с гольным усартом использование memcpy, наоборот, увеличило код. Подозреваю, что в данном случае gcc инлайнит его. В общем, хрен поймешь, что там в этой -flto происходит.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352628#p4352628"]О, и memcpy заработало![/uquote]
Ничего себе, получается твой код и у других людей теперь работает!
Обновил версию компилятора с 10 на 12, теперь при компиляции получаю предупреждения: warning: _close is not implemented and will always fail и то же самое для seek, read, write.
Искал решение, если верно понял, дело в используемой библиотеке libc, на форумах и SO советовали выставить флаг --specs=nosys.specs, но не помогло. Кто-то сталкивался с таким?
P.S. С новым компилятором еще прошивка стала больше, тестовая моргалка диодом выросла с 300 байтов до 380, надеюсь, что из-за той же проблемы.
[uquote="azhel12",url="/forum/viewtopic.php?p=4352735#p4352735"]Искал решение, если верно понял, дело в используемой библиотеке libc, на форумах и SO советовали выставить флаг --specs=nosys.specs, но не помогло. Кто-то сталкивался с таким?[/uquote]
У меня такое наоборот появляется если --specs=nosys.specs добавить, стоит только --specs=nano.specs.
Добавлено after 1 hour 13 minutes 57 seconds:
[uquote="azhel12",url="/forum/viewtopic.php?p=4352735#p4352735"]С новым компилятором еще прошивка стала больше, тестовая моргалка диодом выросла с 300 байтов до 380, надеюсь, что из-за той же проблемы.[/uquote]
Проверил на халовском блинке, для gcc 10.3 и 12.2 получилось 728 и 752 байт. На C++ не проверить т.к. мои либы и на gcc 11 уже не скомпилируются... В любом случае не существенно, особенно учитывая, что простой переход с STM32F0 на G0 размер флеша удваивает или даже учетверяет, это те кто пишут на С для тинек выбирают компилятор по размеру генерируемого кода
Reflector, ну, у меня наоборот получилось. С тем же -flto абсолютно одинаковый "блинк" (который тупо мыргает, а если нажмешь кнопочку - морзянкой "SOS" отмигивает) на G0 вышел 872Б, а на F0 — 1136Б.
И да, чем старше версия gcc, тем жирней получается прошивка, как ни странно…
Добавлено after 1 minute 48 seconds:
[uquote="azhel12",url="/forum/viewtopic.php?p=4352735#p4352735"]warning: _close is not implemented and will always fail и то же самое для seek, read, write.[/uquote]
Это должно вылезать, лишь если "запрещенные" функции вроде printf использовать. А на простом "блинке" их же нет.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4352893#p4352893"]у меня наоборот получилось. С тем же -flto абсолютно одинаковый "блинк" (который тупо мыргает, а если нажмешь кнопочку - морзянкой "SOS" отмигивает) на G0 вышел 872Б, а на F0 — 1136Б.[/uquote]
Абсолютно одинаковый блинк не может быть настолько больше на мк с таким-же ядром, значит видимо флаги не одинаковые. Я вообще про то, что раньше были мелкие F0 с флешем 16/32KB, а теперь у таких же G0 его 16/32/64KB.
А что, у всех STM32, где есть RTC (скажем, тот огрызок, что у F103, таковым назвать язык не поворачивается), дата и время хранятся в таком покоцанном идиотском формате? Ладно б использовали чистый BCD, но там поля от 1 до 4 бит длиной! Может, в каких-то моделях есть вменяемые регистры RTC, чтобы можно было к ним сразу, как к полям структуры доступ иметь?
Начал ковыряться с RTC G070, замучился функции преобразования типов данных рисовать. И опять куча делений, блин!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4353202#p4353202"]А что, у всех STM32, где есть RTC (скажем, тот огрызок, что у F103, таковым назвать язык не поворачивается), дата и время хранятся в таком покоцанном идиотском формате?[/uquote]
У самых новых, STM32U5 и еще не анонсированном H5, есть binary mode помимо BCD.
Если что я так делал:
Спойлер
Вот и у меня примерно такая же огромная портянка получается, разве что деление на 10 через сдвиги, т.к. cortex-m0+
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ