Как стать автором
Обновить

Комментарии 19

Я как-то писал свой стартап для M3, и удалось обойтись полностью без ассемблера, всё на Си. Естественно, с интринсиками/макросами, скрывающими определённые ассемблерные команды. Ну и не без линкерной магии, само собой.

до кучи:

https://programmer.ink/think/stm32-startup-file-startup_stm32f40xx.s-detailed-explanation.html

STM32 startup file startup_stm32f40xx.s подробное объяснение

Опубликовано richza в Сб, 22 Янв. 2022 05: 33: 06 +0100

В этой статье подробно объяснен startup file построчно в соответствии с кодом.

А какой смысл в данной статье? Что она дает нового относительно других статей в инете?

1.       Перевод на русский язык, для тех, у кого английский на уровне технического;

2.       Разбор материала, по которому иногда возникают вопросы. Например, при работе с RTOS нужно понимать, где и как размещаются стек и куча, как они инициализируются;

3.       Удобно хранить ссылки на нужную информацию в одном месте, например на Хабре.

4.       Узкоспециализированные темы зачастую не относятся к категории «интересные». Любопытно то, что по таким темам публикации продолжают набирать число добавлений в закладки, Хабр присылает статистику. А значит, они полезны.  

Отлично, но в чем разница с аналогичными русскоязычными статьями, где написано ровно то же самое? Да и зачем программисту МК русскоязычная статья когда вся документация на английском?

Например, при работе с RTOS нужно понимать, где и как размещаются стек и куча, как они инициализируются;

Да, и про это десятки статей уже есть. И вообще странно, что кто-то пытается работать с RTOS, не зная о памяти МК.

Узкоспециализированные темы зачастую не относятся к категории «интересные».

Речь не об интересе, а о пользе материала. Да, перевод сделан неплохо и на это потрачено время. Но вот практического смысла я не вижу никакого. Причем вот тут явно переводилась статья этого же автора https://embeddy.ru/2018/01/31/startup-файл-для-cortex-m-в-arm-компиляторе/

Вот вы не смогли мимо пройти, чтобы аргументированно свой КГ/АМ не преподнести, а утверджаете, что не цепляет. Да еще как! В закладки, однозначно!

Да уж полезнее писать про клубнику и пельмени :) :)

Но вообще возможно было бы чуть пользительнее это самое в разрезе Миландр и НИИЭТ 35. Там документация и русскоязычная и далеко не такая обширная.

Для запуска ядра используется ассемблерный код

Может все-таки машинный код

По-моему, тут и так понятно, что отсутствует начало "Для написания программы...", то что ядро одни лишь байты хавает вполне себе очевидно.

Побуду немного занудой.

FPU_IRQHandler (Flash point Unit IRQ).
Flash point??? Это что-то новенькое.

Дело в том, что когда ядро CortexM4 стартует, оно сперва копирует первую запись таблицы векторов по адресу указателя стека (MSP – Main Stack Pointer).
Что такое "Адрес указателя стека" ? Какой адрес у регистра процессора?
Первое 32-битное значение из таблицы прерываний записывается в регистр MSP.

Сделал корректировку текста по вашим замечаниям: flash point - очевидно опечатка; "запись первого значения таблицы прерываний в регистр MSP", согласен, так будет понятнее.

Откровенно говоря, не пониманию, для чего писать стартап на асме.
С GCC идёт пример стартапа полностью на С, даже без вставок на асме. У себя в проектах давно использую написанный по его мотивам стартап. Заинтересовался вопросом, когда понадобилось реализовать обработчики прерываний для С++ в ООП-стиле, что логично и удобно разместить именно в стартапе.

А где выполняется инициализация переменных ОЗУ? По идее это до main() должно быть.

В SystemInit () не всегда включается тактирование, это есть в каких то семействах STM, но бывает и так что эта функция ничего не делает и все доп инициализации уже выполняются в main()

Думаю, что на ваш вопрос ответы есть тут:

"One of the purposes of SystemInit() in the CMSIS model is to initialize the clocks and memory subsystems BEFORE initializing the statics into them.

The GNU startup.s files don't do this, whereas Keil calls SystemInit before __main, and in this case __main is the code that initializes the statics and unpacks the load regions described by the linker before calling the user's main() function."

И тут:
"main is your main procedure form main.c file, once __main is an internal procedure created by Keil toolchain which is calling at the end your main, but before it is initializing all variables (copying variables from FLASH to proper positions in RAM). In gcc it is seen explicitly, in Keil you can see it within debug process."

Ещё и ARM-овый ASM, который по сути не доступен сейчас широкому кругу потребителей, только если Keil, и то кряченный, не говоря уж о *nix

приходите в гости... :-) все есть...

Да, вопрос действительно интересный.

Тут сказано:
"The NOINIT directive disables zero initialization for uninitialized static and global C variables. By default, the L166 Linker generates a zero initialization address table for sections with uninitialized static and global variables. The NOINIT directive suppresses this table".

А на этом ресурсе говорится следующее:
"NOINIT is an 'attribute' means that this section is uninitialized or initialized to zero."

В конечном счёте по умолчанию стек инициализируется нулями, но где это происходит?

осторожнее с векторами в таком видео. не все смогут это переварить...

для кортексов все таки не забываем +1 к адресу (это признак .thumb кода).. помоему f4 не имеет проблемы с зависанием, а вот f1 может и зависнуть без этих +1...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории