[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]Так это, там хранятся адреса конструкторов глобальных объектов.
В стартапе для их использования вот такое пишут
Код: Выделить всё
for(void(**fConstr)() = __preinit_array_start; fConstr < __preinit_array_end; (*fConstr++)());
for(void(**fConstr)() = __init_array_start; fConstr < __init_array_end; (*fConstr++)());