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

 
 
> Стартап и скрипт линкера из 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 13 2013, 18:41
Сообщение #2


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

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



Вот здесь зачем выравнивание перед таблицей векторов?
Ведь по адресу 0 должен сохраняться указатель начального адреса стека, но он уже включен в таблицу из .isr_vector.

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


По VMA и LMA тоже не все понятно.
Как я понял, LMA - это адрес расположения секции в ROM, а VMA - расположения в RAM?
Используется только при создании образа в ROM для инициализации инициализированных переменных в RAM?

Код
.text.align :
{
    . = ALIGN(8);
    _etext = .;
    _sidata = _etext;        /* start of initialized data label */
} > FLASH

.data : AT ( _sidata )        /* AT makes the LMA follow on in the binary image */
{
    . = ALIGN(4);
    _sdata = .;                /* start of .data label */
    KEEP( *(.data) )
    KEEP( *(.data.*) )
    . = ALIGN(4);
    _edata = .;                /* end of .data label */
} > RAM


Т. е., выше перечисленное следует понимать как-то так.
Размещаем образ для ининицилизации переменных после чудной секции .ARM.exidx (опять с непонятным выравниванием на 8) во FLASH. Тут у нас используется LMA.
Размещаем данные (хотя, наверное, не размещаем, а резервируем место для размещения) с выравниванием 4 (т. е., от начала RAM адрес расположения переменных будет 4) в RAM. Тут у нас используется VMA.

Кстати, зачем .data обертывать в KEEP()? В этих секциях ведь находятся данные, на которые мы ссылаемся, поэтому линкер не должен их выбрасывать при чистке мусора. Или я чего-то не допонял sad.gif

Код
KEEP(SORT(*)(.init_array))


Какой смысл в сортировке файлов при размещении статических конструкторов?

Сообщение отредактировал koluna - Jun 13 2013, 18:42


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


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

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



Цитата(koluna @ Jun 14 2013, 00:41) *
Вот здесь зачем выравнивание перед таблицей векторов?
Ведь по адресу 0 должен сохраняться указатель начального адреса стека, но он уже включен в таблицу из .isr_vector.

Ох, дались вам эти выравниванияsm.gif Если мы 0 выровняем на 4, то останется 0, так что дырки не будет. А вот если мы будем размещать .isr_vector где-то в другом месте, то выравнивание необходимо.
Цитата(koluna @ Jun 14 2013, 00:41) *
По VMA и LMA тоже не все понятно.
Как я понял, LMA - это адрес расположения секции в ROM, а VMA - расположения в RAM?
Используется только при создании образа в ROM для инициализации инициализированных переменных в RAM?

Да, всё верно.
Цитата(koluna @ Jun 14 2013, 00:41) *
Размещаем данные (хотя, наверное, не размещаем, а резервируем место для размещения) с выравниванием 4 (т. е., от начала RAM адрес расположения переменных будет 4) в RAM.

Нет, выравнивание на 4 - это не то же самое, что отступ на 4:) Если начало ОЗУ выровнено на 4 (а обычно так и есть), то никакого отступа не будет.
Цитата(koluna @ Jun 14 2013, 00:41) *
Кстати, зачем .data обертывать в KEEP()? В этих секциях ведь находятся данные, на которые мы ссылаемся, поэтому линкер не должен их выбрасывать при чистке мусора. Или я чего-то не допонял sad.gif

Тут я не помню, если честно. Вроде бы это я боролся с LTO. И вроде бы, без этого линкер что-то выкидывал нужное. Но точно не помню, могу и соврать.
Цитата(koluna @ Jun 14 2013, 00:41) *
Какой смысл в сортировке файлов при размещении статических конструкторов?

Удобно, чтоб по алфавиту вызывались.

Цитата(Сергей Борщ @ Jun 14 2013, 01:12) *
Верно. Антоха что-то намудрил. и .data : AT ( _sidata ) тоже не лучший вариант. Предпочитаю
Код
.data :
{
   ......
} > RAM AT > FLASH

С KEEP() я написал выше, хотя может и правда намудрилsm.gif А чем хуже вариант с ".data : AT ( _sidata )" ? Мне он кажется как-то понятнее по записи.


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


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

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



Цитата(AHTOXA @ Jun 13 2013, 23:48) *
Ох, дались вам эти выравниванияsm.gif Если мы 0 выровняем на 4, то останется 0, так что дырки не будет. А вот если мы будем размещать .isr_vector где-то в другом месте, то выравнивание необходимо.

...

Нет, выравнивание на 4 - это не то же самое, что отступ на 4:) Если начало ОЗУ выровнено на 4 (а обычно так и есть), то никакого отступа не будет.


Ааа... понял... выравнивание и отступ - разные вещи sm.gif
Если счетчик позиций == 0, ALIGN( 4 ) == 0.
Если счетчик позиций == 3, ALIGN( 4 ) == 4.
Если счетчик позиций == 4, ALIGN( 4 ) == 4.
Если счетчик позиций == 5, ALIGN( 4 ) == 8.
Если счетчик позиций == 7, ALIGN( 4 ) == 8.
И т. д.

Ну а отступ, это было бы что-то вроде: ". += <отступ>;"

Выравнивание начала ОЗУ на 4 тоже требование ARM EABI, как и выравнивание начала стека на 8 байт?

Так, т. е., выравнивание таблицы векторов, начала стека и начала ОЗУ - обязательные требования, получается?

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

Сообщение отредактировал koluna - Jun 14 2013, 18:14


--------------------
Благодарю заранее!
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
- - koluna   Вопросы по Вашему скрипту. Зачем вообще придумали...   Jun 12 2013, 14:58
|- - AHTOXA   Ничего себе, сколько вопросов Сразу предупреждаю, ...   Jun 12 2013, 18:45
|- - koluna   Цитата(AHTOXA @ Jun 12 2013, 22:45) Ничег...   Jun 13 2013, 07:40
|- - AHTOXA   Цитата(koluna @ Jun 13 2013, 13:40) Зачем...   Jun 13 2013, 08:36
|- - Непомнящий Евгений   Цитата(koluna @ Jun 13 2013, 11:40) Зачем...   Jun 13 2013, 08:43
|- - Сергей Борщ   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 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 Текстовая версия Сейчас: 28th June 2025 - 09:36
Рейтинг@Mail.ru


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