реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Старт STM32, до main()
Immortal_Buka
сообщение May 5 2015, 08:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



Подскажите, пожалуйста, где можно прочитать пошагово, и с комментариями про процесс загрузки до начала выполнения осн. функции, т.б. в обработчике Reset_Handler, особенно вот эта libc_init_array() функция.
Go to the top of the page
 
+Quote Post
ek74
сообщение May 5 2015, 10:38
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351



Из вполне доступного, можно это почитать: GCC: статические конструкторы
Go to the top of the page
 
+Quote Post
esaulenka
сообщение May 5 2015, 10:55
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Immortal_Buka
сообщение May 6 2015, 04:52
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



в стартаповом ассемблерном файле у нас
Код
  bl  SystemInit  
  bl __libc_init_array
  bl  main

Чему libc_init_array не нужен для сисинита, но нужен для мэйна?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение May 6 2015, 05:23
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Immortal_Buka
сообщение May 6 2015, 05:53
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



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

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

Чтобы вызывались конструкторы и деструкторы должны же быть указаны __attribute__((constructor)) __attribute__((destructor)) , я правильно понимаю? И, если мы эти аттрибуты не указываем, то и функция эта у нас ничего не делает?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение May 6 2015, 07:13
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Immortal_Buka
сообщение May 6 2015, 07:26
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



ага.
Код
#define __START _start
bl    __START

А где можно посмотреть реализацию этой функции?
Гугл мне не смог сказать, где это в GCC.
Go to the top of the page
 
+Quote Post
ek74
сообщение May 7 2015, 07:02
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351



Цитата(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.
Go to the top of the page
 
+Quote Post
Immortal_Buka
сообщение May 7 2015, 10:03
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



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


Точно! Чего-то я протупил с сырцами. Спасибо!
Go to the top of the page
 
+Quote Post
Immortal_Buka
сообщение Jun 10 2015, 12:36
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969



gcc-шный crt0.S как-то мало понятен, может кто его прокомментировать, или поделиться альтернативным вариантом?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01455 секунд с 7
ELECTRONIX ©2004-2016