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

 
 
> Стартап и скрипт линкера из 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
AHTOXA
сообщение Jun 14 2013, 19:19
Сообщение #5


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

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



Цитата(koluna @ Jun 15 2013, 00:25) *
Ааа... понял... выравнивание и отступ - разные вещи sm.gif

Даsm.gif
Цитата(koluna @ Jun 15 2013, 00:25) *
Выравнивание начала ОЗУ на 4 тоже требование ARM EABI, как и выравнивание начала стека на 8 байт?

Нет, я такого требования не припоминаю. Скорее, это сделано для удобства инициализации данных (чтоб копировать данные по слову).
Цитата(koluna @ Jun 15 2013, 00:25) *
Так, т. е., выравнивание таблицы векторов, начала стека и начала ОЗУ - обязательные требования, получается?

Начала стека - да. Начала ОЗУ - нет (вроде). А вот с таблицей векторов на самом деле требования гораздо жестче. Нужно выравнивать на ближайшую степень двойки, большую размера таблицы векторов. Так что мы недовыравнивалиsm.gif
Цитата(koluna @ Jun 15 2013, 00:25) *
Исходя из скрипта, куча начинается сразу за неинициализированными данными и растет вверх навстречу стеку?
Чтобы стек и куча не пересеклись используются менеджеры кучи?

Да, всё так.


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


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

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



Цитата(AHTOXA @ Jun 14 2013, 23:19) *
Начала стека - да. Начала ОЗУ - нет (вроде). А вот с таблицей векторов на самом деле требования гораздо жестче. Нужно выравнивать на ближайшую степень двойки, большую размера таблицы векторов. Так что мы недовыравнивалиsm.gif


Недовыравнивали - ошибка? wink.gif
Т. е., первый ". = ALIGN(4);" в секции должен выравнивать по-другому?
Хитрые там вычисления какие-то и зависят от количества векторов почему-то...

Кстати, выравненное смещение этим самым хитрым образом нужно записать в регистр VTOR, как я понимаю.
Где осуществляется запись? В стартапе и в init_HW() не нашел. Или используется значение по умолчанию?


Проекты с данным скриптом нормально собираются в Sourcery CodeBench?
Какими компиляторами собирается без проблем?

Кстати, точка входа, как я понимаю для проекта с данным скриптом будет - первый байт в секции .text?


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


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

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



Цитата(koluna @ Jun 15 2013, 16:27) *
Недовыравнивали - ошибка? wink.gif

Давайте лучше применим терминологию Сергея Борща, и скажем: "недомудрил" sm.gif
То есть, скрипт рассчитан на размещение приложения по умолчанию, но в нём были приняты некоторые меры для более лёгкой его адаптации для приложений, загружаемых по другим адресам. И меры эти - оказались недостаточными.
Цитата(koluna @ Jun 15 2013, 16:27) *
Т. е., первый ". = ALIGN(4);" в секции должен выравнивать по-другому?
Хитрые там вычисления какие-то и зависят от количества векторов почему-то...

Насколько я понял, это необходимо, чтобы адрес любого вектора из таблицы своими старшими битами совпадал с VTOR. Типа, контроллер прерываний вычисляет адрес вектора как VTOR | (номер_прерывания * 4).
Но у меня чисто теоретические познания в этой области, я не писал загрузчиков и приложений под них. Надеюсь, Сергей Борщ что-нибудь добавит.
Цитата(koluna @ Jun 15 2013, 16:27) *
Кстати, выравненное смещение этим самым хитрым образом нужно записать в регистр VTOR, как я понимаю.
Где осуществляется запись? В стартапе и в init_HW() не нашел. Или используется значение по умолчанию?

Да, по умолчанию.
Цитата(koluna @ Jun 15 2013, 16:27) *
Проекты с данным скриптом нормально собираются в Sourcery CodeBench?
Какими компиляторами собирается без проблем?

Sourcery я давно не проверял, старыми собиралось нормально. Недавно проверял с Yagarto - работало. А сам на постоянной основе использую kgp и gcc-arm-embedded, которую здесь ещё называют Linaro (что не совсем верно, имхо).
Цитата(koluna @ Jun 15 2013, 16:27) *
Кстати, точка входа, как я понимаю для проекта с данным скриптом будет - первый байт в секции .text?

Точка входа будет вот такая:
Код
    ENTRY(Reset_Handler)


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


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

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



Цитата(AHTOXA @ Jun 15 2013, 14:57) *
Давайте лучше применим терминологию Сергея Борща, и скажем: "недомудрил" sm.gif
То есть, скрипт рассчитан на размещение приложения по умолчанию, но в нём были приняты некоторые меры для более лёгкой его адаптации для приложений, загружаемых по другим адресам. И меры эти - оказались недостаточными.


Давайте применим sm.gif
Все хорошо, спасибо Вам и всем окружающим!
Достаточно полезная беседа получается!

Цитата
Насколько я понял, это необходимо, чтобы адрес любого вектора из таблицы своими старшими битами совпадал с VTOR. Типа, контроллер прерываний вычисляет адрес вектора как VTOR | (номер_прерывания * 4).
Но у меня чисто теоретические познания в этой области, я не писал загрузчиков и приложений под них. Надеюсь, Сергей Борщ что-нибудь добавит.


Подождем sm.gif

Цитата
Точка входа будет вот такая:
Код
    ENTRY(Reset_Handler)


Из доки на линкер.
Цитата
3.4.1 Setting the Entry Point

There are several ways to set the entry point. The linker will set the entry point by trying
each of the following methods in order, and stopping when one of them succeeds:
• the ‘-e’ entry command-line option;
• the ENTRY(symbol ) command in a linker script;
• the value of a target specific symbol, if it is defined; For many targets this is start,
but PE and BeOS based systems for example check a list of possible entry symbols,
matching the first one found.
• the address of the first byte of the ‘.text’ section, if present;
• The address 0.


Как я понимаю, наш случай - предпоследний?
Так... а по логике вещей при включении должно генерироваться прерывание сброса, где мы как раз и попадаем в Reset_Handler().
Ну а зачем тогда команда ENTRY и вообще разговоры об этом?


Кстати, атрибуты регионов здесь зачем?
Цитата
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 4K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K
}


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


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


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

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



Цитата(koluna @ Jun 16 2013, 01:56) *
Как я понимаю, наш случай - предпоследний?

Нет. Потому что в начале секции .text у нас лежит начальный стек. В принципе, всё работало и без строчки
ENTRY(Reset_Handler)
в скрипте. Но отладка при этом глючила.
Зачем нужны атрибуты регионов - я не задумывался, есть и есть 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
- - 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
|- - 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 Текстовая версия Сейчас: 1st July 2025 - 01:00
Рейтинг@Mail.ru


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