Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Старт STM32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Immortal_Buka
Подскажите, пожалуйста, где можно прочитать пошагово, и с комментариями про процесс загрузки до начала выполнения осн. функции, т.б. в обработчике Reset_Handler, особенно вот эта libc_init_array() функция.
ek74
Из вполне доступного, можно это почитать: GCC: статические конструкторы
esaulenka
Это надо читать в описании библиотек, прилагаемых к используемому компилятору.
STM там, или EFM - разницы никакой.

Где почитать это про GCC - самому интересно, собирал информацию по кусочкам, помогает гугл и stackoverflow.

Можно задавать более конкретные вопросы, народ тут (или на соседнем подфоруме про opensource средства разработки) на них отвечает.
Immortal_Buka
в стартаповом ассемблерном файле у нас
Код
  bl  SystemInit  
  bl __libc_init_array
  bl  main

Чему libc_init_array не нужен для сисинита, но нужен для мэйна?
esaulenka
ek74 давал же ссылку, где расписывается, как работают конструкторы для статических объектов.
И пока в SystemInit ничего подобного нет (а в примерах STM он написан на Си), всё работает.

И это правильный порядок - SystemInit выставляет корректную частоту ядра, включает внешнюю память (если есть), а только потом выполняются эти конструкторы.
Immortal_Buka
Цитата(esaulenka @ May 6 2015, 08:23) *
ek74 давал же ссылку, где расписывается, как работают конструкторы для статических объектов.
И пока в SystemInit ничего подобного нет (а в примерах STM он написан на Си), всё работает.

И это правильный порядок - SystemInit выставляет корректную частоту ядра, включает внешнюю память (если есть), а только потом выполняются эти конструкторы.

Чтобы вызывались конструкторы и деструкторы должны же быть указаны __attribute__((constructor)) __attribute__((destructor)) , я правильно понимаю? И, если мы эти аттрибуты не указываем, то и функция эта у нас ничего не делает?
esaulenka
Опять же, отошлю к гуглу.
Атрибут constructor сделан для того, чтобы функция (самая обычная, не член класса) "автоматически" вызывалась до старта main.
Для чего это может понадобится, я, честно говоря, не знаю.

Если нет статических с++ классов и нет этих странных функций, то __libc_init_array(), действительно, ничего не делает.
Immortal_Buka
ага.
Код
#define __START _start
bl    __START

А где можно посмотреть реализацию этой функции?
Гугл мне не смог сказать, где это в GCC.
ek74
Цитата(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
Цитата(ek74 @ May 7 2015, 10:02) *
Ну например тут: GNU Tools for ARM Embedded Processors. Качаешь исходники компилятора. В дереве исходников находишь такой файл \src\newlib\newlib\libc\sys\arm\crt0.S, который и содержит реализацию _start.


Точно! Чего-то я протупил с сырцами. Спасибо!
Immortal_Buka
gcc-шный crt0.S как-то мало понятен, может кто его прокомментировать, или поделиться альтернативным вариантом?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.