|
|
  |
Стартап и скрипт линкера из CMSIS для Sourcery CodeBench |
|
|
|
Jun 15 2013, 10:57
|

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

|
Цитата(koluna @ Jun 15 2013, 16:27)  Недовыравнивали - ошибка?  Давайте лучше применим терминологию Сергея Борща, и скажем: "недомудрил"  То есть, скрипт рассчитан на размещение приложения по умолчанию, но в нём были приняты некоторые меры для более лёгкой его адаптации для приложений, загружаемых по другим адресам. И меры эти - оказались недостаточными. Цитата(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)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 15 2013, 19:56
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 15 2013, 14:57)  Давайте лучше применим терминологию Сергея Борща, и скажем: "недомудрил"  То есть, скрипт рассчитан на размещение приложения по умолчанию, но в нём были приняты некоторые меры для более лёгкой его адаптации для приложений, загружаемых по другим адресам. И меры эти - оказались недостаточными. Давайте применим  Все хорошо, спасибо Вам и всем окружающим! Достаточно полезная беседа получается! Цитата Насколько я понял, это необходимо, чтобы адрес любого вектора из таблицы своими старшими битами совпадал с VTOR. Типа, контроллер прерываний вычисляет адрес вектора как VTOR | (номер_прерывания * 4). Но у меня чисто теоретические познания в этой области, я не писал загрузчиков и приложений под них. Надеюсь, Сергей Борщ что-нибудь добавит. Подождем  Цитата Точка входа будет вот такая: Код 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 } Как я понимаю, если линкер встречает входную секцию, которая не замаплена на выходную секцию, то он создаст выходную секцию с именем входной секции и подберет регион памяти для ее расположения с участием этих атрибутов?
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 15 2013, 22:03
|

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

|
QUOTE (AHTOXA @ Jun 15 2013, 13:57)  Но у меня чисто теоретические познания в этой области, я не писал загрузчиков и приложений под них. Надеюсь, Сергей Борщ что-нибудь добавит. Из описания VTOR: QUOTE Bits 29:11 TBLOFF[29:9]: Vector table base offset field. It contains bits [29:9] of the offset of the table base from memory address 0x00000000. When setting TBLOFF, you must align the offset to the number of exception entries in the vector table. The minimum alignment is 128 words. Собственно тут все сказано: выравнивание должно быть на 128 байт. QUOTE (koluna @ Jun 15 2013, 22:56)  Как я понимаю, наш случай - предпоследний? Нет. Но в двух словах: программа будет работать в железе и без строчки ENTRY(), ибо старт с вектора по адресу 0x00000004 в процессоре прибит гвоздями. Эта строка (в приведенном AHTOXой виде) нужна отладчику, ибо он не умеет (пока) брать стартовый адрес из таблицы векторов, а пытается, по старинке, считать код команды по адресу 0. А у Cortex там лежит начальное значение указателя стека и получается конфуз. QUOTE (koluna @ Jun 15 2013, 22:56)  Кстати, атрибуты регионов здесь зачем? QUOTE К программисту подходит сынишка: - Папа, почему солнышко каждый день встает на востоке, а садится на западе? - Что, правда? - Да. - Каждый день? - Да. - По-другому было когда нибудь? - Нет. - О! Вот это работает - не трогай.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 15 2013, 23:15
|

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

|
QUOTE (AHTOXA @ Jun 16 2013, 01:33)  128 слов Да, виноват, ошибся. 128 слов, 512 байт. Да я вам больше скажу: они там сами никак не определятся. На картинке замаскированы 9 бит, а полностью описание звучит так: QUOTE Bits 29:11 TBLOFF[29:9]: Vector table base offset field. It contains bits [29:9] of the offset of the table base from memory address 0x00000000. When setting TBLOFF, you must align the offset to the number of exception entries in the vector table. The minimum alignment is 128 words. Table alignment requirements mean that bits[8:0] of the table offset are always zero. Bit 29 determines whether the vector table is in the code or SRAM memory region. 0: Code 1: SRAM Note: Bit 29 is sometimes called the TBLBASE bit. Bits 10:0 Reserved, must be kept cleared Так все-таки 29:11 или 29:9? Судя по последующим "Bits 10:0" маскируются 11 бит и выравнивание должно быть на 2048 байт. "Ребус, краксворд!".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 16 2013, 07:25
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 16 2013, 00:26)  Нет. Потому что в начале секции .text у нас лежит начальный стек. В принципе, всё работало и без строчки ENTRY(Reset_Handler) Код .text : { __ctors_start__ = .; KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */ __ctors_end__ = .;
__dtors_start__ = .; __dtors_end__ = .; . = ALIGN(4); *(.text) /* remaining code */ *(.text.*) *(.rodata) /* read-only data (constants) */ *(.rodata*)
*(.eh_frame_hdr) *(.eh_frame) *(.ARM.extab* .gnu.linkonce.armextab.*) *(.gcc_except_table) *(.eh_frame_hdr) *(.eh_frame)
*(.glue_7) *(.glue_7t) . = ALIGN(4); } > FLASH Так, я где здесь начальный стек?  Вижу конструкторы вначале.
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 16 2013, 19:48
|

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

|
Цитата(Сергей Борщ @ Jun 16 2013, 05:15)  Так все-таки 29:11 или 29:9? Судя по последующим "Bits 10:0" маскируются 11 бит и выравнивание должно быть на 2048 байт. "Ребус, краксворд!". В PM0214 (Programming manual для F4) всё однозначно: Цитата Bits 29:9 TBLOFF: Vector table base offset field. Bits 8:0 Reserved, must be kept cleared Видимо была опечатка в предыдущих PM.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 17 2013, 14:51
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
О счетчике позиций. Может быть вот это: Код __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > FLASH __exidx_end = .; было бы правильнее сделать так: Код .ARM.exidx : { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) __exidx_end = .; } > FLASH Есть определенные сомнения после прочтения документации. Цитата The GNU Linker 3.10.5 The Location Counter ... Setting symbols to the value of the location counter outside of an output section statement can result in unexpected values if the linker needs to place orphan sections. ...
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 18 2013, 11:02
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Не совсем разобрался с адресацией: абсолютная и относительная. Как я понял, вне описания секций адресация абсолютная, внутри описания секций - относительная. Вот в чем проблема. Если внутри секций мы присваиваем значение счетчика позиций (или просто число) какому-нибудь символу, то присваевается относительный адрес (адрес относительно начала секции). Код __ctors_start__ = .; __ctors_end__ = .; _sdata = .; _edata = .; _sbss = .; _ebss = .; Потом в программе (в первую очередь в стартапе) мы используем эти символы. Но адреса-то они содержат относительные! Программе, как я понимаю, нужны абсолютные адреса?
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 18 2013, 13:25
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 18 2013, 17:00)  Нет. Это адрес в выходной секции (в нашем случае это FLASH или RAM): Знаю. Но тогда это что значит? Цитата Note: . actually refers to the byte offset from the start of the current containing object. Normally this is the SECTIONS statement, whose start address is 0, hence . can be used as an absolute address. If . is used inside a section description however, it refers to the byte offset from the start of that section, not an absolute address
Сообщение отредактировал koluna - Jun 18 2013, 15:27
--------------------
Благодарю заранее!
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|