Jump to content

    

Старт STM32

Подскажите, пожалуйста, где можно прочитать пошагово, и с комментариями про процесс загрузки до начала выполнения осн. функции, т.б. в обработчике Reset_Handler, особенно вот эта libc_init_array() функция.

Share this post


Link to post
Share on other sites

Это надо читать в описании библиотек, прилагаемых к используемому компилятору.

STM там, или EFM - разницы никакой.

 

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

 

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

Share this post


Link to post
Share on other sites

в стартаповом ассемблерном файле у нас

  bl  SystemInit   
  bl __libc_init_array
  bl  main

Чему libc_init_array не нужен для сисинита, но нужен для мэйна?

Share this post


Link to post
Share on other sites

ek74 давал же ссылку, где расписывается, как работают конструкторы для статических объектов.

И пока в SystemInit ничего подобного нет (а в примерах STM он написан на Си), всё работает.

 

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

Share this post


Link to post
Share on other sites
ek74 давал же ссылку, где расписывается, как работают конструкторы для статических объектов.

И пока в SystemInit ничего подобного нет (а в примерах STM он написан на Си), всё работает.

 

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

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

Share this post


Link to post
Share on other sites

Опять же, отошлю к гуглу.

Атрибут constructor сделан для того, чтобы функция (самая обычная, не член класса) "автоматически" вызывалась до старта main.

Для чего это может понадобится, я, честно говоря, не знаю.

 

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

Share this post


Link to post
Share on other sites

ага.

#define __START _start
bl    __START

А где можно посмотреть реализацию этой функции?

Гугл мне не смог сказать, где это в GCC.

Share this post


Link to post
Share on other sites
#define __START _start
bl    __START

А где можно посмотреть реализацию этой функции?

 

Ну например тут: GNU Tools for ARM Embedded Processors. Качаешь исходники компилятора. В дереве исходников находишь такой файл \src\newlib\newlib\libc\sys\arm\crt0.S, который и содержит реализацию _start.

Share this post


Link to post
Share on other sites
Ну например тут: GNU Tools for ARM Embedded Processors. Качаешь исходники компилятора. В дереве исходников находишь такой файл \src\newlib\newlib\libc\sys\arm\crt0.S, который и содержит реализацию _start.

 

Точно! Чего-то я протупил с сырцами. Спасибо!

Share this post


Link to post
Share on other sites

gcc-шный crt0.S как-то мало понятен, может кто его прокомментировать, или поделиться альтернативным вариантом?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this