|
Стартап и скрипт линкера из 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:48
|

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

|
Цитата(koluna @ Jun 14 2013, 00:41)  Вот здесь зачем выравнивание перед таблицей векторов? Ведь по адресу 0 должен сохраняться указатель начального адреса стека, но он уже включен в таблицу из .isr_vector. Ох, дались вам эти выравнивания  Если мы 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()? В этих секциях ведь находятся данные, на которые мы ссылаемся, поэтому линкер не должен их выбрасывать при чистке мусора. Или я чего-то не допонял  Тут я не помню, если честно. Вроде бы это я боролся с LTO. И вроде бы, без этого линкер что-то выкидывал нужное. Но точно не помню, могу и соврать. Цитата(koluna @ Jun 14 2013, 00:41)  Какой смысл в сортировке файлов при размещении статических конструкторов? Удобно, чтоб по алфавиту вызывались. Цитата(Сергей Борщ @ Jun 14 2013, 01:12)  Верно. Антоха что-то намудрил. и .data : AT ( _sidata ) тоже не лучший вариант. Предпочитаю Код .data : { ...... } > RAM AT > FLASH С KEEP() я написал выше, хотя может и правда намудрил  А чем хуже вариант с ".data : AT ( _sidata )" ? Мне он кажется как-то понятнее по записи.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 14 2013, 18:25
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 13 2013, 23:48)  Ох, дались вам эти выравнивания  Если мы 0 выровняем на 4, то останется 0, так что дырки не будет. А вот если мы будем размещать .isr_vector где-то в другом месте, то выравнивание необходимо. ... Нет, выравнивание на 4 - это не то же самое, что отступ на 4:) Если начало ОЗУ выровнено на 4 (а обычно так и есть), то никакого отступа не будет. Ааа... понял... выравнивание и отступ - разные вещи  Если счетчик позиций == 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
--------------------
Благодарю заранее!
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|