|
|
  |
скрипт Linkera |
|
|
|
Jan 24 2009, 17:43
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Помогите разобраться с скриптами для linkera. Yagarto eclips at91sam7s256 После компиляции, создаются два объектных файла crt.o main.o сделал самый простейший скрипт,который должен разместить секции text в ram и data в flash. После того как проходит компиляция компоновка, копирование получаю файл hex, при попытки его загрузить с помощью h jtag выходит ошибка что память ухотит за пределы, пробовал адреса ставить 0ч0 и 0ч100000 такаже проблема. Подозреваю что ошибка в скрипте. CODE OUTPUT_FORMAT("elf32-littlearm") /* формат памяти. прямой порядок байт (Little-endian). */ OUTPUT_ARCH(arm) /* архитектура АРМ */
_vec_reset = 0x0;
_stack_end = 0x20FA00; /* конец стека (верх стека) */
ENTRY(_vec_reset) /* вектор сброса */
/* Память микроконтроллера AT91SAM7S256 */ MEMORY { flash (rx) : ORIGIN = 0x100000, LENGTH = 256K /* FLASH EPROM */ ram (rw) : ORIGIN = 0x200000, LENGTH = 64K /* static RAM area */ }
SECTIONS {
.text : { *crt.o (.text) }>flash . = ALIGN(4);
.data : { *crt.o (.data) }> ram . = ALIGN(4);
.bss : { *(.bss) *(COMMON) }>ram . = ALIGN(4); }
|
|
|
|
|
Jan 24 2009, 19:23
|

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

|
Цитата(sergey sva @ Jan 24 2009, 19:43)  Подозреваю что ошибка в скрипте. Так рассейте подозрения. arm-elf-objdump -hdSCz файл.elf > файл.lss получите дизассемблированный листинг с абсолютными адресами. В заголовке будет информация о сегментах. Можете ключами -Wl,-Map=файл.map заставить gcc при линковке создать .map В нем тоже много полезной информации. Скрипт на первый взгляд правильный. Возможно вы перечислили в нем не все сегменты, и часть служебных данных попала в выходной файл. По ссылке мой, вроде рабочий, но возможно и в нем есть какие-то недостатки.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 25 2009, 18:19
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(sergey sva @ Jan 24 2009, 22:43)  при попытки его загрузить с помощью h jtag выходит ошибка что память ухотит за пределы Прямо так и выходит? Как это "память уходит"? За пределы чего? Поясни, пожалуйста, суть ошибки, ничего не понятно. Цитата(sergey sva @ Jan 24 2009, 22:43)  Подозреваю что ошибка в скрипте. Цитата(sergey sva @ Jan 25 2009, 22:23)  фот файл map, не чего неправильного не вижу, конечно может плохо смотрю  Если ничего неправильного не видишь, то есть все секции размещены по тем адресам, какие требовались, отчего тогда подозрения на скрипт и вообще линкер? Подозревай h jtag, из которого выходит ошибка непонятная...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jan 25 2009, 18:35
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата Прямо так и выходит? Как это "память уходит"? За пределы чего? Поясни, пожалуйста, суть ошибки, ничего не понятно. Ошибка на картинке.
Цитата Если ничего неправильного не видишь, то есть все секции размещены по тем адресам, какие требовались, отчего тогда подозрения на скрипт и вообще линкер? Подозревай h jtag, из которого выходит ошибка непонятная... Подозрение потому что не разу ими не пользовался. по поводу секций вроде все правильно , сомнения вызывают .debug_info 0x00000000 0x4d4 где они должны располагаться ? H jtag прошивал нормально, hex от keil.
|
|
|
|
|
Jan 26 2009, 10:37
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(sergey sva @ Jan 25 2009, 23:35)  Ошибка на картинке. Спасибо, стало чуть-чуть более понятно, хотя все равно недостаточно. Из левого сообщения понятно, что размер какого-то файла превышает размер flash. Что именно эта программа подразумевает под source file? Размер hex-файла (это было бы странно)? Размер содержащихся в нем аднных? Пока могу предположить следующее: слова "target flash" наводят на мысль, что программа интерпретирует все данные, содержащиеся в hex файле как данные, которые требуется рвзместить во flash. У тебя же там на самом деле содержатся не только данные flash, но и данные ОЗУ. На эту же мысль наводит и правое сообщение об ошибке - если программа трактует аднные для ОЗУ как данные для flash, то с ее точки зрения адрес расположения этих данных оказывается неверным (не попадает в диапазон адресов flash). Возможно, прграмма не может получать и то и другое одновременно в одном файле, ей требуется давать отдельно данные flash и отдельно данные ОЗУ - каждый в своем отдельном файле. А может быть программа ожидает, что данные в hex файлы должны располагалься с адреса 0, может она сама нужные смещения (базовый адрес flash) к адресам прибавляет? В любом случае требуется изучение документации именно на эту программу чтобы понять, какие именно входные данные и в каком виде ей требуются. Цитата(sergey sva @ Jan 25 2009, 23:35)  Подозрение потому что не разу ими не пользовался. по поводу секций вроде все правильно , сомнения вызывают .debug_info 0x00000000 0x4d4 где они должны располагаться ? Должны кому? Программе H-Flasher? Это надо смотреть в ее документации. Вполне возможно, что они ей вообще не нужны. Линкер - существо простое, куда ему скажут (в скрипте) данные положить, туда он их и положит, ему-то все равно. Вопрос в том, что требуется получить. А это - вопрос к программе, которая потом результат работы линкера будет использовать.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jan 27 2009, 13:26
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Как здесь разместить вектора перерывания по указанному адресу? (аналог IAR : Код place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; )
Сообщение отредактировал Vitaliy_ARM - Jan 27 2009, 13:27
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Jan 28 2009, 10:45
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Vitaliy_ARM @ Jan 27 2009, 18:26)  Как здесь разместить вектора перерывания по указанному адресу? Код SECTIONS { . = address; .intvec : { *(.intvec) } }
Сообщение отредактировал alx2 - Jan 28 2009, 10:46
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jan 28 2009, 15:04
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(alx2 @ Jan 28 2009, 13:45)  Код SECTIONS { . = address; .intvec : { *(.intvec) } } Спасибо!
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Jan 29 2009, 10:52
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Задам еще, наверное глупый вопрос. Может ли кто-нибудь прокомментировать строки скрипта? Код SECTIONS { /* first section is .text which is used for code */ .text : { KEEP(*(.RESET)) /* Startup code from .init-section */ -- что это за статап код, это вектора прерываний? Что означает KEEP() *(.text .text.*) /* remaining code */ -- с этим понятно, память команд, сюда линкуются весь код команд по умолчанию *(.gnu.linkonce.t.*) // не известно!? *(.glue_7) // не известно! в этом пдф тоже не знают http://www.atmel.com/dyn/resources/prod_documents/atmel_tutorial_source.zip, зачем это надо *(.glue_7t) // не известно! тоже атмел не знает, зачем нужна эта строчка *(.gcc_except_table) // тоже не известно *(.rodata) /* read-only data (constants) */ -- сюда линкуются все флешь константы, строки и т.п. *(.rodata*) // -- сюда линкуются все константные указатели и указатели на строки и т.п. *(.gnu.linkonce.r.*) // не известно!? . = ALIGN(4); } > ROM }
Сообщение отредактировал Vitaliy_ARM - Jan 29 2009, 10:52
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Jan 29 2009, 14:03
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Vitaliy_ARM @ Jan 28 2009, 20:04)  Спасибо! Не за что.  В родной документации в разделе Simple Linker Script Example практически тот же пример с подробными пояснениями... Код SECTIONS { /* first section is .text which is used for code */ .text : { KEEP(*(.RESET)) /* Startup code from .init-section */ -- что это за статап код, это вектора прерываний? Что означает KEEP() Тут почему-то комментарий не соответствует директиве. Но, скорее всего да - в секции .RESET наверняка содержатся вектора прерываний и стартап-код, который выполняется сразу после сброса. Поскольку после сброса процессор начинает выполнять код с фиксированного адреса (в случае ARM или AVR - с адреса 0), этот код выделяют в отдельную секцию, которую линкерный скрипт размещает по нужному адресу. Стартап-код выподняет обычно инициализацию стека, инициализацию секции .data, очистку секции .bss, вызов конструкторов голбальных объектов и т.п. Что такое KEEP, написано в документации: http://sourceware.org/binutils/docs/ld/Inp...ction-Keep.html KEEP здесь требуется, потому что в программе, как правило, нет ссылок на стартап код, и линкер может подумать, что эта секция не нжна... Код *(.text .text.*) /* remaining code */ -- с этим понятно, память команд, сюда линкуются весь код команд по умолчанию Да, в секции .text* обычно помещается исполняемый код. Код *(.gnu.linkonce.t.*) // не известно!? *(.gnu.linkonce.r.*) // не известно!? Эти секции как-то связаны с таблицами виртуальных методов классов. Подробнее ничего сказать не могу. Код *(.gcc_except_table) // тоже не известно Таблицы, необходимые для обработки исключений.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jan 30 2009, 17:16
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Уже какой день разбираюсь, но все еще не могу получить нормальный hex. Доку читал на H jtag нечего необычного нет, а вот в программе H-conver прилогается к h jtag, можно посмотреть информацию о hex файле, смотрю инфу на hex, вижу вот это сообщение, где размер явно маленький.  в скрипте вроде все правильно , где искать что может быть не так ? CODE OUTPUT_FORMAT("elf32-littlearm") /* формат памяти. прямой порядок байт (Little-endian). */ OUTPUT_ARCH(arm) /* архитектура АРМ */
ENTRY(_start)
/* Память микроконтроллера AT91SAM7S256 */ MEMORY { flash (rx) : ORIGIN = 0x00100000, LENGTH = 256K /* FLASH EPROM */ ram (rw) : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ }
SECTIONS {
.text : { *(.text) *(.glue_7) *(.glue_7t) *(.vfp11_veneer) . = ALIGN(4); }>flash .data : { *(.data) . = ALIGN(4); }> ram
.bss : { *(.bss) *(COMMON) . = ALIGN(4); }>ram
}
Сообщение отредактировал sergey sva - Jan 30 2009, 17:19
|
|
|
|
|
Jan 30 2009, 18:19
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(sergey sva @ Jan 30 2009, 19:16)  Уже какой день разбираюсь, но все еще не могу получить нормальный hex. Доку читал на H jtag нечего необычного нет, а вот в программе H-conver прилогается к h jtag, можно посмотреть информацию о hex файле, смотрю инфу на hex, вижу вот это сообщение, где размер явно маленький.  в скрипте вроде все правильно , где искать что может быть не так ? CODE OUTPUT_FORMAT("elf32-littlearm") /* формат памяти. прямой порядок байт (Little-endian). */ OUTPUT_ARCH(arm) /* архитектура АРМ */
ENTRY(_start)
/* Память микроконтроллера AT91SAM7S256 */ MEMORY { flash (rx) : ORIGIN = 0x00100000, LENGTH = 256K /* FLASH EPROM */ ram (rw) : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */ }
SECTIONS {
.text : { *(.text) *(.glue_7) *(.glue_7t) *(.vfp11_veneer) . = ALIGN(4); }>flash .data : { *(.data) . = ALIGN(4); }> ram
.bss : { *(.bss) *(COMMON) . = ALIGN(4); }>ram
}
Что это за программа я не знаю, но если Total Length - это размер данных в файле то выводы такие. У SAM7S256 имеется 256K флеш. А, судя по картинке, в HEX файле даннях аж на целый МЕГАбайт и даже больше. Этот файл никак не влезет во флеш. ОЗУ у SAM7S256 меньше чем флеша (не помню точно сколько), так что и в ОЗУ не влезет. Сделайте так Код .data : { *(.data) . = ALIGN(4); }> ram AT > flash
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Feb 2 2009, 08:28
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(sergey sva @ Jan 30 2009, 22:23)  Помогло  хотел попробовать запустить отладчик \arm-elf-gdb.exe , вывалилось куча ошибок, делал вроде как написано на yagarto. Тоже испытываю трудности с отладчиком. Но эту победил. Просто у вас не стартует OpenOCD и все. Разберитесь почему.
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|