|
Стартап и скрипт линкера из CMSIS для Sourcery CodeBench |
|
|
|
Jun 6 2013, 08:09
|
Профессионал
    
Группа: Участник
Сообщений: 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
--------------------
Благодарю заранее!
|
|
|
|
|
 |
Ответов
|
Jun 13 2013, 18:41
|
Профессионал
    
Группа: Участник
Сообщений: 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()? В этих секциях ведь находятся данные, на которые мы ссылаемся, поэтому линкер не должен их выбрасывать при чистке мусора. Или я чего-то не допонял  Код KEEP(SORT(*)(.init_array)) Какой смысл в сортировке файлов при размещении статических конструкторов?
Сообщение отредактировал koluna - Jun 13 2013, 18:42
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 13 2013, 19:12
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (koluna @ Jun 13 2013, 21:41)  Вот здесь зачем выравнивание перед таблицей векторов? Ведь по адресу 0 должен сохраняться указатель начального адреса стека, но он уже включен в таблицу из .isr_vector. Считайте это перестраховкой. Чтобы когда захочется эту программу использовать с загрузчиком и адрес начала региона будет задан не 0 и, возможно, не кратным 4, программа продолжала собираться в рабочее состояние. Чтобы в варианте с загрузчиком, добавление секции перед этой .isr_vector не ломало программу. QUOTE (koluna @ Jun 13 2013, 21:41)  По VMA и LMA тоже не все понятно. Как я понял, LMA - это адрес расположения секции в ROM, а VMA - расположения в RAM? Да. QUOTE (koluna @ Jun 13 2013, 21:41)  Используется только при создании образа в ROM для инициализации инициализированных переменных в RAM? Чаще всего - да. Также используется для загружаемых в ОЗУ функций. QUOTE (koluna @ Jun 13 2013, 21:41)  Кстати, зачем .data обертывать в KEEP()? В этих секциях ведь находятся данные, на которые мы ссылаемся, поэтому линкер не должен их выбрасывать при чистке мусора. Верно. Антоха что-то намудрил. и .data : AT ( _sidata ) тоже не лучший вариант. Предпочитаю CODE .data : { ...... } > RAM AT > FLASH QUOTE (koluna @ Jun 13 2013, 21:41)  Какой смысл в сортировке файлов при размещении статических конструкторов? кто-то может использовать для задания порядка вызова конструкторов. Т.е. Объект ADC будет создан до объекта UART. Но по секркту - это рудимент от найденного в интернете образца скрипта  Не мешает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 14 2013, 13:41
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(Сергей Борщ @ Jun 13 2013, 23:12)  кто-то может использовать для задания порядка вызова конструкторов. Т.е. Объект ADC будет создан до объекта UART. Но по секркту - это рудимент от найденного в интернете образца скрипта  Не мешает. Вот смотрю я доку на линкер и не понимаю (Sourcery Codebench)... Цитата SORT is an alias for SORT_BY_NAME. Ну тут понятно. В доке все время упоминается синтаксис вида: Код ... SORT_BY_NAME(.text*) ... SORT_BY_NAME (SORT_BY_NAME (wildcard section pattern)) .... Т. е., SORT обрамляет шаблон секций. А в скрипте - SORT обрамляет шаблон файлов: Код ... SORT(*)(.init_array) ... И, мне, например, непонятно из всего прочитанного/увиденного, толи только файлы будут сортироваться по имени, толи всетаки сначала файлы а внутри них и содержимое секций... В моем понимании надо делать как-то так: Код ... SORT( *( .init_array ) ) ... Ну, или так: Код ... *( SORT( .init_array ) ) ... Цитата(Terminator @ Jun 14 2013, 05:51)  А как, при такой записи, определить по какому адресу FLASH эти данные расположились? Видимо, линкер разместит эти данные во FLASH сразу за предыдущей секцией, размещенной во FLASH. Цитата The load address is specified by the AT or AT> keywords. Specifying a load address is optional. The AT keyword takes an expression as an argument. This specifies the exact load address of the section. The AT> keyword takes the name of a memory region as an argument. See Section 3.7 [MEMORY], page 63. The load address of the section is set to the next free address in the region, aligned to the section’s alignment requirements.
--------------------
Благодарю заранее!
|
|
|
|
Сообщений в этой теме
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  Terminator Цитата(Сергей Борщ @ Jun 14 2013, 02:12) ... Jun 14 2013, 01:51 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|