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

 
 
> Стартап и скрипт линкера из CMSIS для Sourcery CodeBench
koluna
сообщение Jun 6 2013, 08:09
Сообщение #1


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Всем привет!

Помогите разобраться, пожалуйста.
Стартап и скрипт взял из CMSIS 3.01 (\Device\ARM\ARMCM3\Source\GCC): gcc_arm.ld, startup_ARMCM3.S (приложил к теме).
Подцепляю к простейшему тестовому проекту.
При сборке линкер ругался сначала на отсутствие libnosys.a (ее действительно нет в дистрибе компилятора) - убрал ее из списка в скрипте. Ошибка пропала.
Но так и не нашел, что это за либа, для чего нужна и почему ее нет...
Потом линкер ругался на отсутствие "_start". Странно, откуда эта метка в стартапе и почему так называется? Поставил вместо нее "main" - все собралось. Ошибок нет.
Но осадок сомнения остался - уже две ошибки в этих двух файлах... кто знает, что там еще? Надеялся, что все заработает "из коробки".
Пока не зашивал, не уверен в работоспособности, будем пробовать.
Насколько можно верить этим файлам? Что еще в них придется корректировать (ну, кроме размеров RAM, ROM, размеров стека и кучи)?
Прикрепленные файлы
Прикрепленный файл  GCC.zip ( 3.82 килобайт ) Кол-во скачиваний: 14
 


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
koluna
сообщение Jun 12 2013, 14:58
Сообщение #2


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Вопросы по Вашему скрипту.

Зачем вообще придумали так много разных секций? Где узнать назначение каждой секции?
Секции .text, .data, .bss, .isr_vector понятно для чего.
.ARM.exidx для чего?

Код
/* higher address of the user mode stack */
PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) );


Зачем тут PROVIDE()?
Если в программе уже определен символ _estack, то линкер использует его. А если символ не определен, но есть ссылки на него, то линкер сам создаст этот символ. Так?
Не понял что тут с выравниванием и зачем так...

Код
.isr_vector :
{
    . = ALIGN(4);
    KEEP(*(.isr_vector))
    . = ALIGN(4);
} > FLASH


Зачем тут эти выравнивания?
Зачем вообще во всем скрипте так много выравниваний?
KEEP(), как я понимаю, нужен для того, чтобы при линковке с --gc-sections линкер не отбросил секцию .isr_vector?
Не совсем понятно как он чистит мусор.

Код
._usrstack :
{
    . = ALIGN(4);
    _susrstack = .;
    . = . + _Minimum_Stack_Size;
    . = ALIGN(4);
    _eusrstack = .;
} >RAM


_Minimum_Stack_Size, это размер стека?
_susrstack и _eusrstack могут использоваться программой для отслеживания переполнения стека?

Код
/* remove the debugging information from the standard libraries */
DISCARD :
{
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
}


Как я понимаю, все входные секции, перечисленные в выходной секции DISCARD не попадают в выходной файл. Здесь - все секции из перечисленных файлов.
А почему в комментарии это названо отладочной информацией? Что-то я не понимаю, мы же используем эти библиотеки, а если мы их используем, то не мешает ли выше перечисленное?!
Или получается так, что ранее мы уже включили все нужное нам из этих библиотек в выходной файл (секции .text, .data, .bss) и все что остается - нам не нужно?

Код
/* Stabs debugging sections.  */
.stab          0 : { *(.stab) }
...


Почему мы все располагаем по адресу "0"?


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 12 2013, 18:45
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ничего себе, сколько вопросовsm.gif
Сразу предупреждаю, так глубоко я не копал, так что не на все вопросы у меня есть ответы.
Цитата(koluna @ Jun 12 2013, 20:58) *
Зачем вообще придумали так много разных секций? Где узнать назначение каждой секции?
Секции .text, .data, .bss, .isr_vector понятно для чего.
.ARM.exidx для чего?

Это что-то связанное с обработкой исключений. Хотя мы отключаем эту обработку, всё равно что-то иногда пролазит. Короче, без этой секции какой-то из линкеров не собирал.
Цитата(koluna @ Jun 12 2013, 20:58) *
Код
/* higher address of the user mode stack */
PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) );


Зачем тут PROVIDE()?
Если в программе уже определен символ _estack, то линкер использует его. А если символ не определен, но есть ссылки на него, то линкер сам создаст этот символ. Так?
Не понял что тут с выравниванием и зачем так...

Да, так. Если мы сильно захотим, то можем в программе задать свой адрес для _estack.
Выравнивание на 8 байт - это требование ARM EABI. Без этого бывают трудноуловимые глюки.
Цитата(koluna @ Jun 12 2013, 20:58) *
Зачем тут эти выравнивания?
Зачем вообще во всем скрипте так много выравниваний?
KEEP(), как я понимаю, нужен для того, чтобы при линковке с --gc-sections линкер не отбросил секцию .isr_vector?
Не совсем понятно как он чистит мусор.

Выравнивания полезныsm.gif Я не помню, зачем они в каждом конкретном случае, но хуже от них точно не будет.
Лично наблюдал приличное уменьшение времени переключения контекста scmRTOS при добавлении выравнивания функции переключения контекста.
Мусор чистит очень просто. То, что KEEP - оставляет, далее строит дерево вызовов. Всё, что не вызывается из того, что KEEP - выкидывается.
Цитата(koluna @ Jun 12 2013, 20:58) *
Код
._usrstack :
{
    . = ALIGN(4);
    _susrstack = .;
    . = . + _Minimum_Stack_Size;
    . = ALIGN(4);
    _eusrstack = .;
} >RAM


_Minimum_Stack_Size, это размер стека?
_susrstack и _eusrstack могут использоваться программой для отслеживания переполнения стека?

Здесь простейшая проверка, что перед _eusrstack у нас останется _Minimum_Stack_Size свободного места. Если не останется, то линкер ругнётся.
Цитата(koluna @ Jun 12 2013, 20:58) *
Как я понимаю, все входные секции, перечисленные в выходной секции DISCARD не попадают в выходной файл. Здесь - все секции из перечисленных файлов.
А почему в комментарии это названо отладочной информацией? Что-то я не понимаю, мы же используем эти библиотеки, а если мы их используем, то не мешает ли выше перечисленное?!
Или получается так, что ранее мы уже включили все нужное нам из этих библиотек в выходной файл (секции .text, .data, .bss) и все что остается - нам не нужно?

Да, всё полезное из этих файлов мы уже забрали выше.
Цитата(koluna @ Jun 12 2013, 20:58) *
Код
/* Stabs debugging sections.  */
.stab          0 : { *(.stab) }
...


Почему мы все располагаем по адресу "0"?

Тут ничего не скажу, не знаю. Этот кусок есть во всех скриптах, которые я видел, поэтому он, наверное, нуженsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
koluna
сообщение Jun 13 2013, 07:40
Сообщение #4


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(AHTOXA @ Jun 12 2013, 22:45) *
Ничего себе, сколько вопросовsm.gif
Сразу предупреждаю, так глубоко я не копал, так что не на все вопросы у меня есть ответы.


Я посмотрел на скрипт внимательно, почитал доку на линкер и понял, что надо позадавать еще вопросов sm.gif

Цитата
Это что-то связанное с обработкой исключений. Хотя мы отключаем эту обработку, всё равно что-то иногда пролазит. Короче, без этой секции какой-то из линкеров не собирал.


Зачем вообще она нужна для ARM? Почему ее полностью не отключат изначально? Или тулчейн один и на мелкие процы, и на крупные процы, а на крупных обработка исключений в ходу, в отличие от мелких?

Цитата
Да, так. Если мы сильно захотим, то можем в программе задать свой адрес для _estack.


Ууу... что, может понадобиться?

Цитата
Выравнивание на 8 байт - это требование ARM EABI. Без этого бывают трудноуловимые глюки.


Ветку почитаем, спасибо. Пруфлинк можно про выравнивание, пожалуйста?

Цитата
Выравнивания полезныsm.gif Я не помню, зачем они в каждом конкретном случае, но хуже от них точно не будет.


Дырки в памяти образуются wink.gif И большое количество команд выравнивания вводит в ступор: не понимаешь для чего это и почему именно так и нужно ли вообще...
А хочется все понимать...

Цитата
Лично наблюдал приличное уменьшение времени переключения контекста scmRTOS при добавлении выравнивания функции переключения контекста.


Может, связано с выборкой команд? Ну там... ARM-инструкции (32 бита), THUMB-инструкции (16 бит)... т. е., адрес расположеня должен почему-то быть кратным 4 или 2 байтам...

Цитата
Мусор чистит очень просто. То, что KEEP - оставляет, далее строит дерево вызовов. Всё, что не вызывается из того, что KEEP - выкидывается.


Т. е., то, на что есть ссылки в коде и то, что обрамлено KEEP оставляется, все остальное - выкидывается?

Цитата
Здесь простейшая проверка, что перед _eusrstack у нас останется _Minimum_Stack_Size свободного места. Если не останется, то линкер ругнётся.


Код
._usrstack :
{
    . = ALIGN(4);
    _susrstack = .;
    . = . + _Minimum_Stack_Size;
    . = ALIGN(4);
    _eusrstack = .;
} >RAM


Как я понимаю, эта секция - последнее, что будет размещено в RAM. И, если не хватит места для ее размещения, то линкер об этом сообщит?
Фактически мы проверям (на этапе линковки), что размер стека будет не менее чем _Minimum_Stack_Size?
А во время выполнения программы? wink.gif
Стек ведь может переполниться...

Цитата
Да, всё полезное из этих файлов мы уже забрали выше.


Как я понимаю, это влияет на размер бинаря. А еще что на размер влияет? sm.gif
Встречал где-то, что многие сталкиваются с "раздуванием" бинаря при использовании Си++, но сам пока не изучал вопрос.


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- koluna   Стартап и скрипт линкера из CMSIS для Sourcery CodeBench   Jun 6 2013, 08:09
- - Непомнящий Евгений   Я в свое время сам писал и скрипт и стартап. Чем-т...   Jun 6 2013, 08:22
|- - koluna   Цитата(Непомнящий Евгений @ Jun 6 2013, 12...   Jun 6 2013, 08:42
- - koluna   Кто-нибудь выскажет свое мнение? Или мир разделилс...   Jun 6 2013, 11:58
|- - _Артём_   Цитата(koluna @ Jun 6 2013, 14:58) И нет ...   Jun 6 2013, 17:32
|- - koluna   Цитата(_Артём_ @ Jun 6 2013, 21:32) Скрип...   Jun 6 2013, 18:27
|- - AHTOXA   Попробуйте скрипты и стартап от scmRTOS. Я точно з...   Jun 6 2013, 18:29
- - koluna   AHTOXA, спасибо большое! Но мне хотелось бы вс...   Jun 7 2013, 10:59
- - koluna   AHTOXA, есть вопросы по Вашему стартапу, прошу пом...   Jun 7 2013, 14:44
|- - AHTOXA   Цитата(koluna @ Jun 7 2013, 20:44) Строки...   Jun 7 2013, 16:59
|- - koluna   Цитата(AHTOXA @ Jun 7 2013, 20:59) Это пе...   Jun 7 2013, 19:53
|- - AHTOXA   Цитата(koluna @ Jun 8 2013, 01:53) Кстати...   Jun 7 2013, 21:39
|- - koluna   Цитата(AHTOXA @ Jun 8 2013, 01:39) Да. Ли...   Jun 10 2013, 12:41
|- - AHTOXA   Цитата(koluna @ Jun 10 2013, 18:41) Кстат...   Jun 10 2013, 18:56
|- - koluna   Цитата(AHTOXA @ Jun 10 2013, 22:56) Ну ма...   Jun 11 2013, 07:46
|- - AHTOXA   Цитата(koluna @ Jun 13 2013, 13:40) Зачем...   Jun 13 2013, 08:36
|- - Непомнящий Евгений   Цитата(koluna @ Jun 13 2013, 11:40) Зачем...   Jun 13 2013, 08:43
- - koluna   Вот здесь зачем выравнивание перед таблицей вектор...   Jun 13 2013, 18:41
|- - Сергей Борщ   QUOTE (koluna @ Jun 13 2013, 21:41) Вот з...   Jun 13 2013, 19:12
||- - Terminator   Цитата(Сергей Борщ @ Jun 14 2013, 02:12) ...   Jun 14 2013, 01:51
||- - koluna   Цитата(Сергей Борщ @ Jun 13 2013, 23:12) ...   Jun 14 2013, 13:41
|- - AHTOXA   Цитата(koluna @ Jun 14 2013, 00:41) Вот з...   Jun 13 2013, 19:48
|- - koluna   Цитата(AHTOXA @ Jun 13 2013, 23:48) Ох, д...   Jun 14 2013, 18:25
|- - AHTOXA   Цитата(koluna @ Jun 15 2013, 00:25) Ааа.....   Jun 14 2013, 19:19
|- - koluna   Цитата(AHTOXA @ Jun 14 2013, 23:19) Начал...   Jun 15 2013, 10:27
|- - AHTOXA   Цитата(koluna @ Jun 15 2013, 16:27) Недов...   Jun 15 2013, 10:57
|- - koluna   Цитата(AHTOXA @ Jun 15 2013, 14:57) Давай...   Jun 15 2013, 19:56
|- - AHTOXA   Цитата(koluna @ Jun 16 2013, 01:56) Как я...   Jun 15 2013, 20:26
|- - koluna   Цитата(AHTOXA @ Jun 16 2013, 00:26) Нет. ...   Jun 16 2013, 07:25
|- - AHTOXA   Цитата(koluna @ Jun 16 2013, 13:25) Так, ...   Jun 16 2013, 10:00
- - Сергей Борщ   QUOTE (AHTOXA @ Jun 13 2013, 22:48) А чем...   Jun 14 2013, 19:50
|- - AHTOXA   Цитата(Сергей Борщ @ Jun 15 2013, 01:50) ...   Jun 15 2013, 05:43
- - Сергей Борщ   QUOTE (AHTOXA @ Jun 15 2013, 13:57) Но у ...   Jun 15 2013, 22:03
|- - AHTOXA   Цитата(Сергей Борщ @ Jun 16 2013, 04:03) ...   Jun 15 2013, 22:33
|- - Сергей Борщ   QUOTE (AHTOXA @ Jun 16 2013, 01:33) 128 с...   Jun 15 2013, 23:15
|- - AHTOXA   Цитата(Сергей Борщ @ Jun 16 2013, 05:15) ...   Jun 16 2013, 19:48
- - koluna   О счетчике позиций. Может быть вот это: Код__exid...   Jun 17 2013, 14:51
|- - Сергей Борщ   QUOTE (koluna @ Jun 17 2013, 17:51) было ...   Jun 18 2013, 07:54
|- - AHTOXA   Вот ведь дилемма... С одной стороны, "возможн...   Jun 18 2013, 08:46
- - koluna   Не совсем разобрался с адресацией: абсолютная и от...   Jun 18 2013, 11:02
|- - AHTOXA   Цитата(koluna @ Jun 18 2013, 17:02) Вот в...   Jun 18 2013, 13:00
- - koluna   Цитата(AHTOXA @ Jun 18 2013, 17:00) Нет. ...   Jun 18 2013, 13:25
|- - AHTOXA   Цитата(koluna @ Jun 18 2013, 19:25) Знаю....   Jun 18 2013, 16:58
|- - koluna   Цитата(AHTOXA @ Jun 18 2013, 20:58) А фиг...   Jun 18 2013, 17:43
|- - AHTOXA   Да, всё так.   Jun 18 2013, 17:54
|- - Сергей Борщ   QUOTE (koluna @ Jun 18 2013, 20:43) Вот и...   Jun 18 2013, 18:34
- - koluna   Пока так и не понял, "--gc-sections" раб...   Jun 18 2013, 15:52
- - koluna   Мучает меня вопрос по секциям все-таки... .init_...   Jun 18 2013, 18:37
|- - AHTOXA   Цитата(koluna @ Jun 19 2013, 00:37) .init...   Jun 18 2013, 19:44
|- - koluna   Цитата(AHTOXA @ Jun 18 2013, 23:44) Можно...   Jun 19 2013, 07:41
|- - AHTOXA   Цитата(koluna @ Jun 19 2013, 13:41) Наско...   Jun 19 2013, 08:04
|- - koluna   Цитата(AHTOXA @ Jun 19 2013, 12:04) Емним...   Jun 19 2013, 09:44
|- - Сергей Борщ   QUOTE (koluna @ Jun 19 2013, 12:44) Кстат...   Jun 19 2013, 10:02
|- - koluna   Понятно, спасибо. А с деструкторами все-таки что?...   Jun 19 2013, 12:31
|- - Сергей Борщ   QUOTE (koluna @ Jun 19 2013, 15:31) А с д...   Jun 19 2013, 13:11
- - koluna   Судя по всему для EABI, по аналогии с конструктора...   Jun 19 2013, 14:10
- - koluna   Что такое common-символы (секция COMMON)? Из доки ...   Jun 19 2013, 18:30
- - koluna   И все-таки хотелось бы немного поговорить и о скри...   Jun 20 2013, 16:26
- - koluna   Посмотрел у себя файлы crt* в папках компилятора: ...   Jun 21 2013, 20:50


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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 08:09
Рейтинг@Mail.ru


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