Перейти к содержанию
    

Помогите разобраться с скриптами для linkera. Yagarto eclips at91sam7s256

После компиляции, создаются два объектных файла crt.o main.o сделал самый простейший скрипт,который должен

разместить секции text в ram и data в flash. После того как проходит компиляция компоновка, копирование получаю файл hex,

при попытки его загрузить с помощью h jtag выходит ошибка что память ухотит за пределы, пробовал адреса ставить 0ч0 и 0ч100000 такаже

проблема. Подозреваю что ошибка в скрипте.

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);


}   


Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подозреваю что ошибка в скрипте.
Так рассейте подозрения.

 

arm-elf-objdump -hdSCz файл.elf > файл.lss получите дизассемблированный листинг с абсолютными адресами. В заголовке будет информация о сегментах. Можете ключами -Wl,-Map=файл.map заставить gcc при линковке создать .map В нем тоже много полезной информации.

 

 

Скрипт на первый взгляд правильный. Возможно вы перечислили в нем не все сегменты, и часть служебных данных попала в выходной файл. По ссылке мой, вроде рабочий, но возможно и в нем есть какие-то недостатки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

фот файл map, не чего неправильного не вижу, конечно может плохо смотрю :)

Memory Configuration

Name             Origin             Length             Attributes
flash            0x00100000         0x00040000         xr
ram              0x00200000         0x00010000         rw
*default*        0x00000000         0xffffffff

Linker script and memory map


.text           0x00100000      0x380
*crt.o(.text)
.text          0x00100000      0x238 crt.o
               0x00100000                _start
*(.text)
.text          0x00100238      0x148 main.o
               0x00100360                udef_abort
               0x00100238                main
               0x00100370                swi_handler
               0x00100350                pref_data_abort
               0x00100340                data_abort
*(.glue_7)
.glue_7        0x00100380        0x0 crt.o
.glue_7        0x00100380        0x0 main.o
*(.glue_7t)
.glue_7t       0x00100380        0x0 crt.o
.glue_7t       0x00100380        0x0 main.o
*(.vfp11_veneer)
.vfp11_veneer  0x00100380        0x0 crt.o
.vfp11_veneer  0x00100380        0x0 main.o
               0x00100380                . = ALIGN (0x4)

.data           0x00200000       0x44
*crt.o(.data)
.data          0x00200000       0x40 crt.o
.data          0x00200040        0x4 main.o
               0x00200040                pPIO
               0x00200044                . = ALIGN (0x4)

.bss            0x00200044        0xc
*(.bss)
.bss           0x00200044        0x0 crt.o
.bss           0x00200044        0xc main.o
               0x00200048                cc
               0x00200044                g
*(COMMON)
               0x00200050                . = ALIGN (0x4)
LOAD crt.o
LOAD main.o
OUTPUT(main.out elf32-littlearm)

.ARM.attributes
               0x00000000       0x10
.ARM.attributes
               0x00000000       0x10 crt.o
.ARM.attributes
               0x00000010       0x10 main.o

.debug_abbrev   0x00000000       0xca
.debug_abbrev  0x00000000       0xca main.o

.debug_info     0x00000000      0x4d4
.debug_info    0x00000000      0x4d4 main.o

.debug_line     0x00000000       0x5b
.debug_line    0x00000000       0x5b main.o

.debug_frame    0x00000000       0xb0
.debug_frame   0x00000000       0xb0 main.o

.debug_loc      0x00000000       0xd2
.debug_loc     0x00000000       0xd2 main.o

.debug_pubnames
               0x00000000       0x73
.debug_pubnames
               0x00000000       0x73 main.o

.debug_aranges  0x00000000       0x20
.debug_aranges
               0x00000000       0x20 main.o

.debug_str      0x00000000      0x23f
.debug_str     0x00000000      0x23f main.o
                               0x261 (size before relaxing)

.comment        0x00000000       0x12
.comment       0x00000000       0x12 main.o

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при попытки его загрузить с помощью h jtag выходит ошибка что память ухотит за пределы
Прямо так и выходит? Как это "память уходит"? За пределы чего? Поясни, пожалуйста, суть ошибки, ничего не понятно.

Подозреваю что ошибка в скрипте.

фот файл map, не чего неправильного не вижу, конечно может плохо смотрю :)
Если ничего неправильного не видишь, то есть все секции размещены по тем адресам, какие требовались, отчего тогда подозрения на скрипт и вообще линкер? Подозревай h jtag, из которого выходит ошибка непонятная...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прямо так и выходит? Как это "память уходит"? За пределы чего? Поясни, пожалуйста, суть ошибки, ничего не понятно.

Ошибка на картинке.post-27923-1232908540_thumb.jpg

Если ничего неправильного не видишь, то есть все секции размещены по тем адресам, какие требовались, отчего тогда подозрения на скрипт и вообще линкер? Подозревай h jtag, из которого выходит ошибка непонятная...

Подозрение потому что не разу ими не пользовался. по поводу секций вроде все правильно , сомнения вызывают .debug_info 0x00000000 0x4d4

где они должны располагаться ? H jtag прошивал нормально, hex от keil.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ошибка на картинке.
Спасибо, стало чуть-чуть более понятно, хотя все равно недостаточно. Из левого сообщения понятно, что размер какого-то файла превышает размер flash. Что именно эта программа подразумевает под source file? Размер hex-файла (это было бы странно)? Размер содержащихся в нем аднных? Пока могу предположить следующее: слова "target flash" наводят на мысль, что программа интерпретирует все данные, содержащиеся в hex файле как данные, которые требуется рвзместить во flash. У тебя же там на самом деле содержатся не только данные flash, но и данные ОЗУ. На эту же мысль наводит и правое сообщение об ошибке - если программа трактует аднные для ОЗУ как данные для flash, то с ее точки зрения адрес расположения этих данных оказывается неверным (не попадает в диапазон адресов flash). Возможно, прграмма не может получать и то и другое одновременно в одном файле, ей требуется давать отдельно данные flash и отдельно данные ОЗУ - каждый в своем отдельном файле. А может быть программа ожидает, что данные в hex файлы должны располагалься с адреса 0, может она сама нужные смещения (базовый адрес flash) к адресам прибавляет? В любом случае требуется изучение документации именно на эту программу чтобы понять, какие именно входные данные и в каком виде ей требуются.

Подозрение потому что не разу ими не пользовался. по поводу секций вроде все правильно , сомнения вызывают .debug_info 0x00000000 0x4d4

где они должны располагаться ?

Должны кому? Программе H-Flasher? Это надо смотреть в ее документации. Вполне возможно, что они ей вообще не нужны. Линкер - существо простое, куда ему скажут (в скрипте) данные положить, туда он их и положит, ему-то все равно. Вопрос в том, что требуется получить. А это - вопрос к программе, которая потом результат работы линкера будет использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как здесь разместить вектора перерывания по указанному адресу?

(аналог IAR :

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

)

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как здесь разместить вектора перерывания по указанному адресу?

SECTIONS
{
  . = address;
  .intvec : { *(.intvec) }
}

Изменено пользователем alx2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задам еще, наверное глупый вопрос.

Может ли кто-нибудь прокомментировать строки скрипта?

 

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
}

:1111493779: :smile3046:

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!
Не за что. :) В родной документации в разделе 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)  // тоже не известно

Таблицы, необходимые для обработки исключений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже какой день разбираюсь, но все еще не могу получить нормальный hex.

Доку читал на H jtag нечего необычного нет, а вот в программе H-conver прилогается к h jtag,

можно посмотреть информацию о hex файле, смотрю инфу на hex, вижу вот это сообщение,

где размер явно маленький. post-27923-1233335805.jpg

 

в скрипте вроде все правильно , где искать что может быть не так ?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже какой день разбираюсь, но все еще не могу получить нормальный hex.

Доку читал на H jtag нечего необычного нет, а вот в программе H-conver прилогается к h jtag,

можно посмотреть информацию о hex файле, смотрю инфу на hex, вижу вот это сообщение,

где размер явно маленький. post-27923-1233335805.jpg

 

в скрипте вроде все правильно , где искать что может быть не так ?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогло :)

хотел попробовать запустить отладчик \arm-elf-gdb.exe , вывалилось куча ошибок,

делал вроде как написано на yagarto.

target remote localhost:3333
localhost:3333: \317\356\344\352\353\376\367\345\355\350\345 \355\345 \363\361\362\340\355\356\342\353\345\355\356, \362.\352. \352\356\355\345\367\355\373\351 \352\356\354\357\374\376\362\345\360 \356\362\342\345\360\343 \347\340\357\360\356\361 \355\340 \357\356\344\352\353\376\367\345\355\350\345.
monitor reset
"monitor" command not supported by this target.
monitor sleep 500
"monitor" command not supported by this target.
monitor poll
"monitor" command not supported by this target.
monitor soft_reset_halt
"monitor" command not supported by this target.
monitor arm7_9 force_hw_bkpts enable
"monitor" command not supported by this target.
monitor mww 0xFFFFFD44 0x00008000
"monitor" command not supported by this target.
monitor mww 0xfffffd08 0xa5000001
"monitor" command not supported by this target.
monitor mww 0xFFFFFC20 0x00000601
"monitor" command not supported by this target.
monitor sleep 10
"monitor" command not supported by this target.
monitor mww 0xFFFFFC2C 0x00481c0e
"monitor" command not supported by this target.
monitor sleep 10
"monitor" command not supported by this target.
monitor mww 0xFFFFFC30 0x00000007
"monitor" command not supported by this target.
monitor sleep 10
"monitor" command not supported by this target.
monitor mww 0xFFFFFF60 0x00480100
"monitor" command not supported by this target.
monitor sleep 100
"monitor" command not supported by this target.
set mem inaccessible-by-default off
load
No executable file specified.
Use the "file" or "exec-file" command.
break main
No symbol table is loaded.  Use the "file" command.
continue
The program is not being run.
No registers.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогло :)

хотел попробовать запустить отладчик \arm-elf-gdb.exe , вывалилось куча ошибок,

делал вроде как написано на yagarto.

 

Тоже испытываю трудности с отладчиком. Но эту победил. Просто у вас не стартует OpenOCD и все.

Разберитесь почему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...