Полная версия этой страницы:
Старт STM32
Immortal_Buka
May 5 2015, 08:25
Подскажите, пожалуйста, где можно прочитать пошагово, и с комментариями про процесс загрузки до начала выполнения осн. функции, т.б. в обработчике Reset_Handler, особенно вот эта libc_init_array() функция.
Из вполне доступного, можно это почитать:
GCC: статические конструкторы
esaulenka
May 5 2015, 10:55
Это надо читать в описании библиотек, прилагаемых к используемому компилятору.
STM там, или EFM - разницы никакой.
Где почитать это про GCC - самому интересно, собирал информацию по кусочкам, помогает гугл и stackoverflow.
Можно задавать более конкретные вопросы, народ тут (или на соседнем подфоруме про opensource средства разработки) на них отвечает.
Immortal_Buka
May 6 2015, 04:52
в стартаповом ассемблерном файле у нас
Код
bl SystemInit
bl __libc_init_array
bl main
Чему libc_init_array не нужен для сисинита, но нужен для мэйна?
esaulenka
May 6 2015, 05:23
ek74 давал же ссылку, где расписывается, как работают конструкторы для статических объектов.
И пока в SystemInit ничего подобного нет (а в примерах STM он написан на Си), всё работает.
И это правильный порядок - SystemInit выставляет корректную частоту ядра, включает внешнюю память (если есть), а только потом выполняются эти конструкторы.
Immortal_Buka
May 6 2015, 05:53
Цитата(esaulenka @ May 6 2015, 08:23)

ek74 давал же ссылку, где расписывается, как работают конструкторы для статических объектов.
И пока в SystemInit ничего подобного нет (а в примерах STM он написан на Си), всё работает.
И это правильный порядок - SystemInit выставляет корректную частоту ядра, включает внешнюю память (если есть), а только потом выполняются эти конструкторы.
Чтобы вызывались конструкторы и деструкторы должны же быть указаны __attribute__((constructor)) __attribute__((destructor)) , я правильно понимаю? И, если мы эти аттрибуты не указываем, то и функция эта у нас ничего не делает?
esaulenka
May 6 2015, 07:13
Опять же, отошлю к гуглу.
Атрибут constructor сделан для того, чтобы функция (самая обычная, не член класса) "автоматически" вызывалась до старта main.
Для чего это может понадобится, я, честно говоря, не знаю.
Если нет статических с++ классов и нет этих странных функций, то __libc_init_array(), действительно, ничего не делает.
Immortal_Buka
May 6 2015, 07:26
ага.
Код
#define __START _start
bl __START
А где можно посмотреть реализацию этой функции?
Гугл мне не смог сказать, где это в GCC.
Цитата(Immortal_Buka @ May 6 2015, 10:26)

Код
#define __START _start
bl __START
А где можно посмотреть реализацию этой функции?
Ну например тут:
GNU Tools for ARM Embedded Processors. Качаешь
исходники компилятора. В дереве исходников находишь такой файл \src\newlib\newlib\libc\sys\arm\crt0.S, который и содержит реализацию
_start.
Immortal_Buka
May 7 2015, 10:03
Цитата(ek74 @ May 7 2015, 10:02)

Ну например тут:
GNU Tools for ARM Embedded Processors. Качаешь
исходники компилятора. В дереве исходников находишь такой файл \src\newlib\newlib\libc\sys\arm\crt0.S, который и содержит реализацию
_start.
Точно! Чего-то я протупил с сырцами. Спасибо!
Immortal_Buka
Jun 10 2015, 12:36
gcc-шный crt0.S как-то мало понятен, может кто его прокомментировать, или поделиться альтернативным вариантом?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.