Зачем stm32 требует самостоятельно настраивать startup.s ?
Re: Зачем stm32 требует самостоятельно настраивать startup.s
"Говорят, в Москве кур доЯт". ... Есть стандартный SWD-интерфейс отладки и загрузки, зачем мучиться с UART-загрузчиком? Загрузчики через иные интерфейсы нужны для перепрошивки или первичной заливки в готовые устройства.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]Я же не знаю как оно в реальности запускается[/uquote]Точно так же как в AVR. Включаете питание и код начинает выполняться с Reset_Handler.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]возможно в линкере указывается куда МК (операционная система) должна разместить секции программы после её запуска.[/uquote]Не придумывайте, какая ещё операционная система? Всё то же самое как в AVR.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]На деле МК размещает секции по адресам в адресном пространстве, желательно чтобы МК размещал секции в ОЗУ, так как во-первых ОЗУ быстрей FLASH'a, а значит скорость программы возрастает,[/uquote]Это заблуждение. К флэш у контроллера широкая шина с предвыборкой и кэшами. При расположении кода во флэш, а данных в SRAM программа работает частенько даже быстрее чем чисто из SRAM.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]а во-вторых FLASH имеет ограниченный ресурс на число записей. То есть МК с размещением секций в ОЗУ проживёт дольше.[/uquote]Как вы себе это представляете? Вот включили вы питания контроллера, флэш девственно чистая (экономите ресурс). Откуда код и данные появятся в ОЗУ? В ОЗУ размещаются переменные (нулевые занулением, ненулевые копированием из флэш в стартапе), а во флэш лежит код. Лежит себе, положенный туда один раз при программировании.
Экономят флэш когда занимаются постоянно отладкой. Тогда с помощью отладчика (ST-Link, J-Link и др.) загружают код в SRAM. Тогда флэш и правда не используется. Именно при таком сценарии использования нужен скрипт линкера с перенаправленными в SRAM секциями. Для штатной прошивки, которая должна работать в контроллере при включении питания это всё не работает.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]Но видимо указание линкеру разместить секцию в >RAM, ещё не является гарантией что она будет находится именно в ОЗУ ..? Так как нельзя сказать точно на какое устройство отражается кусок адресного пространства.[/uquote]У контроллера в документации написано по каким адресам какая память находится. У вашего контроллера по адресу 0x08000000 всегда флэш, а по адресу 0x20000000 всегда SRAM. Так устроен чип. Если сказано разместить в SRAM (0x20000000), то ничем иным это не будет.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]В коде стартапа секция данных копируется по адресу (не факт что ОЗУ),[/uquote]Подумайте и ответьте на два вопроса. Откуда копируется секция данных? Куда кроме ОЗУ она может копироваться?
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]Возможно сам МК и размещает секции в адресном пространстве, может у него есть какие-то внутренние механизмы?[/uquote]Сам МК ничего поместить не может. Есть три основных механизма загрузки кода:
1. Программа программатором прошивается во флэш и лежит там постоянно. При включении питания из него и стартует.
2. Отладчиком программа загружается в SRAM и работает оттуда до выключения питания.
3. С помощью перемычки в МК запускается программа-загрузчик, находящаяся в системной памяти. Эта программа-загрузчик позволяет прошить флэш через UART, USB и т.д. без программатора. После прошивки перемычка снимается и работает всё как в п.1.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]В коде целый файл sbrk.c под подготовку кучи, + в .map-файле heap'a навалено. Вроде оно всё не мешает, но когда этого всего "не мешает" - много, оно как-то начинает мешать.[/uquote]Поверьте, проблема не в скрипте линкера, а в том что пример своего блинка вы на какой-то помойке нашли. Оставьте в проекте скрипт, который я выкладывал и больше в него не заглядывайте. Поверьте, там проблем нет.
Когда вы работали с Ардуино, то "под капотом" было всё то же самое. Просто IDE всё от вас прятала и дурные мысли не приходили.
Совет - создайте чистый проект руками. В него включите:
1. Стартап файл.
2. Линкерскрипт.
3. Заголовочный файл от вашего микроконтроллера.
4. Папку CMSIS. Заголовочные файлы из неё понадобятся для пункта 3.
5. Один файл программы с функцией SystemInit. В ней включите тактирование GPIO-порта, на котором висит диод.
6. Второй файл программы, в котором в main мигайте себе светодиодом.
Так и разберётесь как что работает, и с "лишним" бороться не надо будет.
Добавлено after 15 minutes 38 seconds:
[uquote="ddr4",url="/forum/viewtopic.php?p=4279220#p4279220"]Возможно это сложно понять, но мне не хочется видеть лишнего кода при вхождении в новую тему.[/uquote]Ну так не собирайте его на всяких помойках. Самому, конечно, трудно с нуля проект сделать. Но можно же на форуме попросить. Минимальный проект без всякого мусора. IDE нормальную используйте, с нормальной отладкой. Тогда никакие симуляторы не понадобятся.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279220#p4279220"]Пока не знаю, хотел сначала с эмулятором поиграться, а после уже через uart-ttl через сериал. Говорят в F4 есть встроенный загрузчик он это позволяет.[/uquote]ST-Link самый дорогой $3. Зажали и будете без отладки через загрузчик шить? Ну-ну. Чем тогда это от ардуины будет отличаться?
[uquote="ddr4",url="/forum/viewtopic.php?p=4279220#p4279220"]Иначе всё в 2 кБ не впихнуть.[/uquote]А чё, прикольно. Купить контроллер с 256к на борту и впихнуть всё в 2к. Занятная цель.
Добавлено after 20 minutes 10 seconds:
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4279216#p4279216"]С секциями init_array - даже у меня вопросы имеются.[/uquote]Так это, там хранятся адреса конструкторов глобальных объектов.
В стартапе для их использования вот такое пишут
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]возможно в линкере указывается куда МК (операционная система) должна разместить секции программы после её запуска.[/uquote]Не придумывайте, какая ещё операционная система? Всё то же самое как в AVR.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]На деле МК размещает секции по адресам в адресном пространстве, желательно чтобы МК размещал секции в ОЗУ, так как во-первых ОЗУ быстрей FLASH'a, а значит скорость программы возрастает,[/uquote]Это заблуждение. К флэш у контроллера широкая шина с предвыборкой и кэшами. При расположении кода во флэш, а данных в SRAM программа работает частенько даже быстрее чем чисто из SRAM.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]а во-вторых FLASH имеет ограниченный ресурс на число записей. То есть МК с размещением секций в ОЗУ проживёт дольше.[/uquote]Как вы себе это представляете? Вот включили вы питания контроллера, флэш девственно чистая (экономите ресурс). Откуда код и данные появятся в ОЗУ? В ОЗУ размещаются переменные (нулевые занулением, ненулевые копированием из флэш в стартапе), а во флэш лежит код. Лежит себе, положенный туда один раз при программировании.
Экономят флэш когда занимаются постоянно отладкой. Тогда с помощью отладчика (ST-Link, J-Link и др.) загружают код в SRAM. Тогда флэш и правда не используется. Именно при таком сценарии использования нужен скрипт линкера с перенаправленными в SRAM секциями. Для штатной прошивки, которая должна работать в контроллере при включении питания это всё не работает.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]Но видимо указание линкеру разместить секцию в >RAM, ещё не является гарантией что она будет находится именно в ОЗУ ..? Так как нельзя сказать точно на какое устройство отражается кусок адресного пространства.[/uquote]У контроллера в документации написано по каким адресам какая память находится. У вашего контроллера по адресу 0x08000000 всегда флэш, а по адресу 0x20000000 всегда SRAM. Так устроен чип. Если сказано разместить в SRAM (0x20000000), то ничем иным это не будет.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]В коде стартапа секция данных копируется по адресу (не факт что ОЗУ),[/uquote]Подумайте и ответьте на два вопроса. Откуда копируется секция данных? Куда кроме ОЗУ она может копироваться?
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]Возможно сам МК и размещает секции в адресном пространстве, может у него есть какие-то внутренние механизмы?[/uquote]Сам МК ничего поместить не может. Есть три основных механизма загрузки кода:
1. Программа программатором прошивается во флэш и лежит там постоянно. При включении питания из него и стартует.
2. Отладчиком программа загружается в SRAM и работает оттуда до выключения питания.
3. С помощью перемычки в МК запускается программа-загрузчик, находящаяся в системной памяти. Эта программа-загрузчик позволяет прошить флэш через UART, USB и т.д. без программатора. После прошивки перемычка снимается и работает всё как в п.1.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279205#p4279205"]В коде целый файл sbrk.c под подготовку кучи, + в .map-файле heap'a навалено. Вроде оно всё не мешает, но когда этого всего "не мешает" - много, оно как-то начинает мешать.[/uquote]Поверьте, проблема не в скрипте линкера, а в том что пример своего блинка вы на какой-то помойке нашли. Оставьте в проекте скрипт, который я выкладывал и больше в него не заглядывайте. Поверьте, там проблем нет.
Когда вы работали с Ардуино, то "под капотом" было всё то же самое. Просто IDE всё от вас прятала и дурные мысли не приходили.
Совет - создайте чистый проект руками. В него включите:
1. Стартап файл.
2. Линкерскрипт.
3. Заголовочный файл от вашего микроконтроллера.
4. Папку CMSIS. Заголовочные файлы из неё понадобятся для пункта 3.
5. Один файл программы с функцией SystemInit. В ней включите тактирование GPIO-порта, на котором висит диод.
6. Второй файл программы, в котором в main мигайте себе светодиодом.
Так и разберётесь как что работает, и с "лишним" бороться не надо будет.
Добавлено after 15 minutes 38 seconds:
[uquote="ddr4",url="/forum/viewtopic.php?p=4279220#p4279220"]Возможно это сложно понять, но мне не хочется видеть лишнего кода при вхождении в новую тему.[/uquote]Ну так не собирайте его на всяких помойках. Самому, конечно, трудно с нуля проект сделать. Но можно же на форуме попросить. Минимальный проект без всякого мусора. IDE нормальную используйте, с нормальной отладкой. Тогда никакие симуляторы не понадобятся.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279220#p4279220"]Пока не знаю, хотел сначала с эмулятором поиграться, а после уже через uart-ttl через сериал. Говорят в F4 есть встроенный загрузчик он это позволяет.[/uquote]ST-Link самый дорогой $3. Зажали и будете без отладки через загрузчик шить? Ну-ну. Чем тогда это от ардуины будет отличаться?
[uquote="ddr4",url="/forum/viewtopic.php?p=4279220#p4279220"]Иначе всё в 2 кБ не впихнуть.[/uquote]А чё, прикольно. Купить контроллер с 256к на борту и впихнуть всё в 2к. Занятная цель.
Добавлено after 20 minutes 10 seconds:
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4279216#p4279216"]С секциями init_array - даже у меня вопросы имеются.[/uquote]Так это, там хранятся адреса конструкторов глобальных объектов.
В стартапе для их использования вот такое пишут
Код: Выделить всё
for(void(**fConstr)() = __preinit_array_start; fConstr < __preinit_array_end; (*fConstr++)());
for(void(**fConstr)() = __init_array_start; fConstr < __init_array_end; (*fConstr++)());
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Размещает компилятор, а не МК.ddr4 писал(а):На деле МК размещает секции по адресам в адресном пространстве
МК в стартапе может скопировать что-то из флеша в ОЗУ, но к размещению секций это отношения не имеет.
В теории да но на практике, обычно скорость выполнения из флеша примерно такая же как из ОЗУ. Учтите что ОЗУ намного меньше чем флеша. Размещать в нем код без необходимости обычно не имеет смысла.ddr4 писал(а):желательно чтобы МК размещал секции в ОЗУ, так как во-первых ОЗУ быстрей FLASH'a, а значит скорость программы возрастает
Как это влияет на работу прошивки? Релизную все равно нужно шить во флеш потому что ОЗУ хранит данные только пока есть питание. А отладочные прошивки можно грузить в ОЗУ. В IDE выбираете цель сборки Debug RAM или подобную (зависит от IDE), компилируете и заливаете в МК.ddr4 писал(а):во-вторых FLASH имеет ограниченный ресурс на число записей.
Вы прошиваете МК 1500 раз за день? У флеша гарантированный ресурс перезаписи около 10 тысяч.ddr4 писал(а):То есть МК с размещением секций в ОЗУ проживёт дольше.
В МК переменные могут быть еще где-то кроме ОЗУ?ddr4 писал(а):В коде стартапа секция данных копируется по адресу (не факт что ОЗУ)
Дизассемблируйте прошивку и посмотрите как она устроена. Посмотрите map файл. Запустите отладку и по шагам проследите как выполняется программа, что и куда пишет/копирует и т. д.ddr4 писал(а):Остальные секции возможно размещает сам МК, может у него есть какие-то внутренние механизмы?
Нормально создавайте проект не добавляя то что не требуется.ddr4 писал(а):В коде целый файл sbrk.c под подготовку кучи, + в .map-файле heap'a навалено.
Вроде что-то связанное в объектами плюсов, но могу ошибаться.AVI-crak писал(а):С секциями init_array - даже у меня вопросы имеются.
Библиотеки HAL/LL/SPL/CMSIS в файлах проекта и там тысячи строк кода. Будете вручную выпиливать все что не используется?ddr4 писал(а):Во-первых библиотека на то и библиотека что скрывает от её пользователя всю реализацию, например это стандартная библиотека и она прикомпиливается при сборке и лежит в библах/компилятора, а не в файлах проекта.
А сколько подобного кода было ардуине, о котором вы похоже даже не знали.
А если флеша хватает?ddr4 писал(а):Когда флеша не хватает, то из библиотеки берётся одна функция, без подключения хедера зависимого от других хедеров. Иногда это экономит и память и флеш.
Откуда столько заблуждений? Видимо негативное влияние ардуины!
Отладчик освойте (купите ST-Link если его нет). Многие вопросы отпадут, потому что когда видно как работает программа что и где находится, не приходится догадываться о работе МК.ddr4 писал(а):Пока не знаю, хотел сначала с эмулятором поиграться, а после уже через uart-ttl через сериал.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="Мурик",url="/forum/viewtopic.php?p=4279268#p4279268"]В МК переменные могут быть еще где-то кроме ОЗУ?[/uquote]Ну, как вам сказать... Да! В IAR для AVR можно переменные в EEPROM размещать.
Код: Выделить всё
__eeprom int x;
int main()
{
x++;
// LDI R20, LOW(`x`)
// LDI R21, (`x`) >> 8
// RCALL __eeget16_16
// SUBI R16, 255
// SBCI R17, 255
// LDI R20, LOW(`x`)
// LDI R21, (`x`) >> 8
// RCALL __eeput16_16
}
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="Up2805",url="/forum/viewtopic.php?p=4279222#p4279222"]"Говорят, в Москве кур доЯт". ... Есть стандартный SWD-интерфейс отладки и загрузки, зачем мучиться с UART-загрузчиком? Загрузчики через иные интерфейсы нужны для перепрошивки или первичной заливки в готовые устройства.[/uquote]Наверное есть, но у меня нет SWD-программатора, есть только usb-ttl. Если можно просто прошить меня это устраивает. Дебаг на работающей плате мне не особо нужен, в AVR мне это не потребовалось. Там отлаживаю на коде для компа, или перепрошивкой с выводом значений printf().
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Подумайте и ответьте на два вопроса. Откуда копируется секция данных? Куда кроме ОЗУ она может копироваться?[/uquote]Из флеша во флеш, этакий недокументированый swap. С одной стороны это бессмыслено, так как данные копируются из флеша во флеш. Но если это убьёт МК быстрей производитель только порадуется, а виноват программист, - незачем было указывать размещение во флеш). Таким образом мы ограничивает МК не только по числу перезаписей, но и по числу включений. Это я опять выдумываю).
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Сам МК ничего поместить не может. Есть три основных механизма загрузки кода:
1. Программа программатором прошивается во флэш и лежит там постоянно. При включении питания из него и стартует.
2. Отладчиком программа загружается в SRAM и работает оттуда до выключения питания.[/uquote]
А зачем отладчик загружает программу в SRAM, если флеш настолько хорош? И почему так не делают в рабочем режиме, если только не из экономии RAM?
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Поверьте, проблема не в скрипте линкера, а в том что пример своего блинка вы на какой-то помойке нашли. Оставьте в проекте скрипт, который я выкладывал и больше в него не заглядывайте. Поверьте, там проблем нет.
Когда вы работали с Ардуино, то "под капотом" было всё то же самое. Просто IDE всё от вас прятала и дурные мысли не приходили.[/uquote]
Я в vim'e писал, в том числе простой makefile с компиляцией каждого файла. Но вот avr-gcc действительно скрывало многое, что просто gcc для stm32f4 не скрывает.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Совет - создайте чистый проект руками. В него включите:
1. Стартап файл.
2. Линкерскрипт.
3. Заголовочный файл от вашего микроконтроллера.
4. Папку CMSIS. Заголовочные файлы из неё понадобятся для пункта 3.
5. Один файл программы с функцией SystemInit. В ней включите тактирование GPIO-порта, на котором висит диод.
6. Второй файл программы, в котором в main мигайте себе светодиодом.
Так и разберётесь как что работает, и с "лишним" бороться не надо будет.[/uquote] Спасибо, примерно это я сейчас и пытаюсь сделать.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Ну так не собирайте его на всяких помойках. Самому, конечно, трудно с нуля проект сделать. Но можно же на форуме попросить. Минимальный проект без всякого мусора. IDE нормальную используйте, с нормальной отладкой. Тогда никакие симуляторы не понадобятся.[/uquote]
Впринципе всё понятно, можно и на Эклипсе жить, отладчик gdb и printf(), если дойду до Хеллоу Ворлда.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]ST-Link самый дорогой $3. Зажали и будете без отладки через загрузчик шить? Ну-ну. Чем тогда это от ардуины будет отличаться?[/uquote]
Я и ожидал что работа с stm32 от Ардуины ничем принципиально отличаться не будет. Тем более что больший размер памяти упрощают алгоритмы, и приводит к уменьшению кода. А я и ардуину не отлаживал на чипе, только на компе куски кода и через printf(), с этим можно жить.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]А чё, прикольно. Купить контроллер с 256к на борту и впихнуть всё в 2к. Занятная цель.
[/uquote]
Цель была упростить код, который на ардуине впритык расходует 2 кБ RAM, что приводит к усложнению алгоритмов. А хотелось их упростить, так как 64 кБ RAM на stm32 должны были развязать руки. Но не всё так просто оказалось)
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Подумайте и ответьте на два вопроса. Откуда копируется секция данных? Куда кроме ОЗУ она может копироваться?[/uquote]Из флеша во флеш, этакий недокументированый swap. С одной стороны это бессмыслено, так как данные копируются из флеша во флеш. Но если это убьёт МК быстрей производитель только порадуется, а виноват программист, - незачем было указывать размещение во флеш). Таким образом мы ограничивает МК не только по числу перезаписей, но и по числу включений. Это я опять выдумываю).
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Сам МК ничего поместить не может. Есть три основных механизма загрузки кода:
1. Программа программатором прошивается во флэш и лежит там постоянно. При включении питания из него и стартует.
2. Отладчиком программа загружается в SRAM и работает оттуда до выключения питания.[/uquote]
А зачем отладчик загружает программу в SRAM, если флеш настолько хорош? И почему так не делают в рабочем режиме, если только не из экономии RAM?
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Поверьте, проблема не в скрипте линкера, а в том что пример своего блинка вы на какой-то помойке нашли. Оставьте в проекте скрипт, который я выкладывал и больше в него не заглядывайте. Поверьте, там проблем нет.
Когда вы работали с Ардуино, то "под капотом" было всё то же самое. Просто IDE всё от вас прятала и дурные мысли не приходили.[/uquote]
Я в vim'e писал, в том числе простой makefile с компиляцией каждого файла. Но вот avr-gcc действительно скрывало многое, что просто gcc для stm32f4 не скрывает.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Совет - создайте чистый проект руками. В него включите:
1. Стартап файл.
2. Линкерскрипт.
3. Заголовочный файл от вашего микроконтроллера.
4. Папку CMSIS. Заголовочные файлы из неё понадобятся для пункта 3.
5. Один файл программы с функцией SystemInit. В ней включите тактирование GPIO-порта, на котором висит диод.
6. Второй файл программы, в котором в main мигайте себе светодиодом.
Так и разберётесь как что работает, и с "лишним" бороться не надо будет.[/uquote] Спасибо, примерно это я сейчас и пытаюсь сделать.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]Ну так не собирайте его на всяких помойках. Самому, конечно, трудно с нуля проект сделать. Но можно же на форуме попросить. Минимальный проект без всякого мусора. IDE нормальную используйте, с нормальной отладкой. Тогда никакие симуляторы не понадобятся.[/uquote]
Впринципе всё понятно, можно и на Эклипсе жить, отладчик gdb и printf(), если дойду до Хеллоу Ворлда.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]ST-Link самый дорогой $3. Зажали и будете без отладки через загрузчик шить? Ну-ну. Чем тогда это от ардуины будет отличаться?[/uquote]
Я и ожидал что работа с stm32 от Ардуины ничем принципиально отличаться не будет. Тем более что больший размер памяти упрощают алгоритмы, и приводит к уменьшению кода. А я и ардуину не отлаживал на чипе, только на компе куски кода и через printf(), с этим можно жить.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4279223#p4279223"]А чё, прикольно. Купить контроллер с 256к на борту и впихнуть всё в 2к. Занятная цель.
Цель была упростить код, который на ардуине впритык расходует 2 кБ RAM, что приводит к усложнению алгоритмов. А хотелось их упростить, так как 64 кБ RAM на stm32 должны были развязать руки. Но не всё так просто оказалось)
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Ну мы тут обсуждаем STM32.VladislavS писал(а):В IAR для AVR можно переменные в EEPROM размещать.
И это не совсем переменная. Это скрытая запись в энергонезависимую память.
С таким же успехом можно разрешить запись во флеш и записывать вызовом FLASH_ProgramByte() или подобной.
ST-Link продается на каждом углу и стоит около 150 рублей.ddr4 писал(а):меня нет SWD-программатора
Спойлер
Это не отладка, а много зря потеряного времени!ddr4 писал(а):Там отлаживаю на коде для компа, или перепрошивкой с выводом значений printf().
Вот смотрите просмотр регистров под отладчиком. Как это сделаете на printf()?
Спойлер
Смысл?ddr4 писал(а):Из флеша во флеш, этакий недокументированый swap.
Если не потанцевать с бубном не разблокировав запись во флеш, и не стерев страницы, записать ничего не получится.ddr4 писал(а):незачем было указывать размещение во флеш)
Ага!ddr4 писал(а):Это я опять выдумываю).
Загружает если это явно заданно. Обычно применяется для отладки чтобы флеш не протирать.ddr4 писал(а):А зачем отладчик загружает программу в SRAM, если флеш настолько хорош?
Нет смысла. Программа нормально из флеша выполняется (в AVR разве не также?).ddr4 писал(а):И почему так не делают в рабочем режиме, если только не из экономии RAM?
Это вы все усложняете начав изучение не с той стороны.ddr4 писал(а):Но не всё так просто оказалось)
Последний раз редактировалось Мурик Сб авг 27, 2022 20:14:55, всего редактировалось 2 раза.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Я и ожидал что stm32 от Ардуины ничем принципиально отличатся не будет.
Странное ожидание. Лет пять назад вас за такие слова помидорами бы закидали
Исполнение не из флеша может быть нужно в очень старших семействах STM32 с выделенной специальной областью SRAM (ITCM RAM), в которую загружаются некоторые небольшие части кода. Своего рода кэш второго уровня.
Так же исполнение из SRAM может использоваться при перепрошивке флеша в готовом устройстве. Однако, оно небезопасно при неожиданном прекращении питания во время перепрошивки - опасность окирпичивания.
Исполнение из общей SRAM чревато снижением скорости, потому как SRAM однопортовая и если нет второго отдельного блока SRAM с отдельным портом, обращения к SRAM будут делиться между исполняемым кодом и данными.
Последний раз редактировалось Up2805 Сб авг 27, 2022 20:24:46, всего редактировалось 2 раза.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]Это я опять выдумываю).[/uquote]Такое выдумать можно только под воздействием чего-то запрещённого. 
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]А зачем отладчик загружает программу в SRAM, если флеш настолько хорош?[/uquote]Во-первых, это просто быстрее. Время цикла изменения кода и проверки как он работает очень важно при профессиональной работе. Во-вторых, та самая экономия ресурса флэш. При профессиональном использовании макетные платы могут годами использоваться на столе программиста.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]И почему так не делают в рабочем режиме, если только не из экономии RAM?[/uquote]А как вы себе это представляете? К каждому серийному изделию по программатору и программисту запускающему его в коробку класть?
А экономия RAM и флэш вообще бессмысленная вещь до тех пор пока код помещается в микроконтроллер и работает с необходимой скоростью. Конечно, когда пишешь какие-то библиотеки или тот же стартап, то надо писать оптимально, ибо использоваться будет в разных проектах и это не станет узким местом в будущем. Но если надо на F4 написать мигалку светодиодом, то нет никакого смысла тратить время на "утаптывание" кода. Спасть лучше от осознания, что прошивка занимает всего 1 кБ из 1 МБ я точно не буду.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]А я и ардуину не отлаживал на чипе, только на компе куски кода и через printf(), с этим можно жить.[/uquote]Одно дело когда подруцгому никак, то довольствуешься тем что есть. Но когда есть возможность отладки, это совершенно другой стиль разработки.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]Но не всё так просто оказалось[/uquote]Ерунда, всё реально. Было бы желание.
Добавлено after 8 minutes 48 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=4279302#p4279302"]И это не совсем переменная. Это скрытая запись в энергонезависимую память.[/uquote]В терминах языка программирования, на котором написан код, это именно переменная и есть. Я могу с ней работать как с любой другой - присваивать значения, копировать, выполнять арифметические операции, передавать значения в функции и т.д. Во что это компилируется вообще не имеет никакого значения. Например, при копировании структур или массивов компилятор частенько вызывает незаметно для программиста функцию memcpy. Вы же не отказываете из-за этого им в праве называться переменными?
[uquote="Мурик",url="/forum/viewtopic.php?p=4279302#p4279302"]С таким же успехом можно разрешить запись во флеш и записывать вызовом FLASH_ProgramByte() или подобной.
[/uquote]А вот это совсем другое. Если бы компилятор сделал всё это незаметно для программиста, как в приведённом мной примере, то да. А так НЕТ!
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]А зачем отладчик загружает программу в SRAM, если флеш настолько хорош?[/uquote]Во-первых, это просто быстрее. Время цикла изменения кода и проверки как он работает очень важно при профессиональной работе. Во-вторых, та самая экономия ресурса флэш. При профессиональном использовании макетные платы могут годами использоваться на столе программиста.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]И почему так не делают в рабочем режиме, если только не из экономии RAM?[/uquote]А как вы себе это представляете? К каждому серийному изделию по программатору и программисту запускающему его в коробку класть?
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]А я и ардуину не отлаживал на чипе, только на компе куски кода и через printf(), с этим можно жить.[/uquote]Одно дело когда подруцгому никак, то довольствуешься тем что есть. Но когда есть возможность отладки, это совершенно другой стиль разработки.
[uquote="ddr4",url="/forum/viewtopic.php?p=4279288#p4279288"]Но не всё так просто оказалось[/uquote]Ерунда, всё реально. Было бы желание.
Добавлено after 8 minutes 48 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=4279302#p4279302"]И это не совсем переменная. Это скрытая запись в энергонезависимую память.[/uquote]В терминах языка программирования, на котором написан код, это именно переменная и есть. Я могу с ней работать как с любой другой - присваивать значения, копировать, выполнять арифметические операции, передавать значения в функции и т.д. Во что это компилируется вообще не имеет никакого значения. Например, при копировании структур или массивов компилятор частенько вызывает незаметно для программиста функцию memcpy. Вы же не отказываете из-за этого им в праве называться переменными?
[uquote="Мурик",url="/forum/viewtopic.php?p=4279302#p4279302"]С таким же успехом можно разрешить запись во флеш и записывать вызовом FLASH_ProgramByte() или подобной.
- AVI-crak
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
- Контактная информация:
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Вот только сейчас додумался как правильно сформировать запрос для гугла, и за 5 минут узнал всё что хотел.VladislavS писал(а):С секциями init_array - даже у меня вопросы имеются.
Так это, там хранятся адреса конструкторов глобальных объектов.
И таки да, всё связанное с С++, С#, всем тем зоопарком что выше. К функции SystemInit() вообще ни как не относится. Даже сами авторы GCC считают _array некрасивым, уродливым решением. Но ничего лучше предложить не могут.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4279316#p4279316"]И таки да, всё связанное с С++, С#, всем тем зоопарком что выше.[/uquote]Намекаю второй раз уже в этой теме. В GCC конструкторы могут быть не только в С++, но и в православном С. Как бы странно это не звучало.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Намекаете что в проекте могут быть вперемешку *.c и *.cpp файлы или о чем-то другом?
В описании языка Си не встречал упоминаний о конструкторах в структурах или о классах.
В описании языка Си не встречал упоминаний о конструкторах в структурах или о классах.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Это расширение GCC, стандарт С такого не предусматривает. Тык!
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Тогда понятно.
В GCC есть много чего не входящего в стандарт, например вложенные функции.
В GCC есть много чего не входящего в стандарт, например вложенные функции.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Однако, стартап написан для GCC и должен поддерживать все его возможности. Просто так выкинуть из стартапа вызов конструкторов из-за того что вы не используете С++ можно только из-за великой жадности.
- AVI-crak
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
- Контактная информация:
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Спасибо, я уже наступил на эту лепёшку. Мне всегда подобный код казался странным и непонятным. После глубоко_копания в разные стороны - ощущение укрепилось, мне этого не надо.VladislavS писал(а):Намекаю второй раз уже в этой теме. В GCC конструкторы могут быть не только в С++, но и в православном С.
Гораздо проще работать с памятью явно и прямо здесь, а не ожидать что память выделится магическим образом через вызов функции из исполняемого файла в другом каталоге проекта.
Ну да, С++ у меня не очень, точнее вообще никак.
Я уже неоднократно замечал - человек не в состоянии принять и понять информацию, если она имеет базовый конфликт с его опытом.Мурик писал(а):ddr4 писал(а):
Там отлаживаю на коде для компа, или перепрошивкой с выводом значений printf().
Это не отладка, а много зря потеряного времени!
Вот смотрите просмотр регистров под отладчиком. Как это сделаете на printf()?
Кхм, думаю если ему показать левую колонку видимых функций и переменных - он вообще ничего не поймёт. Как например я не понимаю, откуда аурдинщики берут имена функций: без встроенной подсказки, без автоматического дополнения, без динамической фильтрации типов, без той самой левой колонки любой нормальной IDE. Наверное по старинке, из бумажной книжки.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4279359#p4279359"]Как например я не понимаю, откуда аурдинщики берут имена функций:[/uquote]Копипастят друг у друга... Ардуина, кмк, сильна сообществом.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4279359#p4279359"]Я уже неоднократно замечал - человек не в состоянии принять и понять информацию, если она имеет базовый конфликт с его опытом.[/uquote]Да именно так. Так как большинство ожидает от STM32 уровня программирования даже не Ардуино-IDE, а хотя бы AVR (avr-gcc), но нет, в STM всё намного хуже. И когда после AVR человек пытается использовать STM, он получает отрицательные эмоции во-первых от настройки стартапа, которого в AVR нет. И утешает себя ну мол ладно, стартап переварю и дальше всё пойдёт. Но тут бах и - HAL. И первая реакция, ну ладно, в AVR тоже были библиотеки абстракций, и здесь я избавлюсь от HAL. И чел пытается смотреть примеры без HAL, а там тоже какой-то ужас, и получает ещё отрицательных эмоций с попыткой разбить BluePill об стену
. После чего говорит, ну ладно буду использовать этот ужасный HAL. Берёт пример с hal-uart - print "Hello World" ковыряется в библиотеке включая нужные дефайны. Запускает и ..... облом
. Копаясь в куче ошибок компилятора
... понимает. Что в этом примере "Hello World" - другая версия HAL и тут терпению приходит конец, как и BluePill'у
.
И после таких приключений
, кто-то пишет ещё один отрицательный отзыв о STM32, что это ужас-ужас. (и это отзывы не Арудинщиков начального уровня ).
Что вы уже "неоднократно замечали".
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4279359#p4279359"]Кхм, думаю если ему показать левую колонку видимых функций и переменных - он вообще ничего не поймёт. Как например я не понимаю, откуда аурдинщики берут имена функций: без встроенной подсказки, без автоматического дополнения, без динамической фильтрации типов, без той самой левой колонки любой нормальной IDE. Наверное по старинке, из бумажной книжки.[/uquote]
В AVR для выполнения реальной задачи оперируют 10 функциями в 2-3 файлах, а в STM32 чтобы вывести строку "Hello World" надо оперировать 100 функций расположенной в двух библиотеках. И тогда потребуется IDE не для того чтобы удобно писать код, а для того чтобы исследовать код библиотек, стартапав и прочего. И вот когда вы с этим разберётесь (с помощью IDE - которую вам тоже придётся изучить) - добро пожаловать в STM32.
И какое сообщество может быть у STM32 с такими граблями?
Цены на AVR подтверждают всё вышесказанное. )
И после таких приключений
Что вы уже "неоднократно замечали".
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4279359#p4279359"]Кхм, думаю если ему показать левую колонку видимых функций и переменных - он вообще ничего не поймёт. Как например я не понимаю, откуда аурдинщики берут имена функций: без встроенной подсказки, без автоматического дополнения, без динамической фильтрации типов, без той самой левой колонки любой нормальной IDE. Наверное по старинке, из бумажной книжки.[/uquote]
В AVR для выполнения реальной задачи оперируют 10 функциями в 2-3 файлах, а в STM32 чтобы вывести строку "Hello World" надо оперировать 100 функций расположенной в двух библиотеках. И тогда потребуется IDE не для того чтобы удобно писать код, а для того чтобы исследовать код библиотек, стартапав и прочего. И вот когда вы с этим разберётесь (с помощью IDE - которую вам тоже придётся изучить) - добро пожаловать в STM32.
И какое сообщество может быть у STM32 с такими граблями?
Цены на AVR подтверждают всё вышесказанное. )
Re: Зачем stm32 требует самостоятельно настраивать startup.s
[uquote="ddr4",url="/forum/viewtopic.php?p=4279507#p4279507"]И чел пытается смотреть примеры без HAL, а там тоже какой-то ужас, и получает ещё отрицательных эмоций с попыткой разбить BluePill об стену
.[/uquote]
Ой, а можно посмотреть эти "ужасные" примеры? Просто как раз пишу на CMSIS и оч. любопытно чего вы такого ужасного там нашли?
Ой, а можно посмотреть эти "ужасные" примеры? Просто как раз пишу на CMSIS и оч. любопытно чего вы такого ужасного там нашли?
Re: Зачем stm32 требует самостоятельно настраивать startup.s
А что ужасного в STM32? Это просто гораздо более мощный микроконтроллер с гораздо более высоким порогом вхождения, для более умных и опытных программистов. Документация - да, на порядок объемнее. Про стартап линкерскрипт уже сто раз объяснили. Автор вопроса либо тупит, либо капризничает. Ну да, STM32 гораздо сложнее, это вы ещё не видели системы тактирования в каком-нибудь STM32H743. Но это просто совершенно иной уровень. Если программист не тянет мозгом, то незачем и начинать. А то как в басне про обезьяну и очки.
Автору - не волокешь, не хватает соображаловки, мозги не проворачивают объем информации - просто не лезь в эти дебри, сдохнешь. STM не виноват, что он сложный. Виноват программист, недостаточно подготовленный и не понимающий. А ведь есть и гораздо более сложные системы, для весьма подготовленных специалистов.
Автору - не волокешь, не хватает соображаловки, мозги не проворачивают объем информации - просто не лезь в эти дебри, сдохнешь. STM не виноват, что он сложный. Виноват программист, недостаточно подготовленный и не понимающий. А ведь есть и гораздо более сложные системы, для весьма подготовленных специалистов.
Последний раз редактировалось MLX90640 Вс авг 28, 2022 12:05:21, всего редактировалось 1 раз.
Re: Зачем stm32 требует самостоятельно настраивать startup.s
Это не так. Нет необходимости на начальном этапе разбираться со стартапом и скриптом линкера. Они добавляются в проект при его создании в IDE.ddr4 писал(а):но нет, в STM всё намного хуже.
Ваша задача, создать проект и писать код. Но вы решили все усложнить.
Смотрите, проект создается и все сразу готово к компиляции прошивки без необходимости править стартап и скрипт линкера.
Спойлер

Зачем вы полезли его настраивать?ddr4 писал(а):И когда после AVR человек пытается использовать STM, он получает отрицательные эмоции во-первых от настройки стартапа
В этом нет необходимости. Сами себе создали сложности!
Можно писать без HAL. Это одна из библиотек и никто не заставляет ее использовать.ddr4 писал(а):Но тут бах и - HAL.