|
|
  |
скрипт 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 и все. Разберитесь почему.
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Feb 2 2009, 21:21
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Пробую запустить openocd , не запускается пишет ошибку: CODE C:\openocd\src>openocd -f WigglerF.cfg Open On-Chip Debugger 0.1.0 (2009-02-02-20:43) Release BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS$URL: https://kc8apf@svn.berlios.de/svnroot/repos...enocd-0.1.0/src/openocd.c $ jtag_speed: 0 OLD SYNTAX: DEPRECATED - translating to new syntax jtag newtap CHIP TAP -irlen 4 -ircapture 0x1 -irvalue 0xf Example: STM32 has 2 taps, the cortexM3(len4) + boundryscan(len5) jtag newtap stm32 cortexm3 ....., thus creating the tap: "stm32.cortexm3" jtag newtap stm32 boundry ....., and the tap: "stm32.boundery" And then refer to the taps by the dotted name. NEW COMMAND: invalid command name "daemon_startup_reset" C:\openocd\src> фот скрипт: CODE telnet_port 4444 gdb_port 3333 interface parport parport_port 0xDD00 parport_cable wiggler jtag_speed 0 reset_config srst_only srst_pulls_trst jtag_device 4 0x1 0xf 0xe daemon_startup reset target arm7tdmi little run_and_init 0 arm7tdmi run_and_halt_time 0 30 target_script 0 reset openocd_at91sam7x_flash.script working_area 0 0x00200000 0x4000 nobackup flash bank at91sam7 0 0 0 0 0
Может что посоветуете? Вообще все эти свободные продукты , может спешу с выводом, кошмар, у меня слов нет, работать не чего нормально не хочет, хорошей понятной доки нет, а изучать все исходники, можно, но пока их изучишь, забудешь что хотел делать .
|
|
|
|
|
Feb 3 2009, 08:23
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
судя по всему Вы используете довольно свежую версию openocd. В таком случае лучше использовать конфиги, идущие вместе с openocd. Пример моего конфига Код source [find parport.cfg] source [find stm32.cfg] , а рядом лежат конфиги для целевого кристалла(в Вашем случае вероятно sam7x256) и вигглера ( parport.cfg, возможно придется подправить адрес параллельного порта) от разработчиков.
|
|
|
|
|
Feb 3 2009, 13:03
|

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

|
Цитата(sergey sva @ Feb 3 2009, 02:21)  Вообще все эти свободные продукты , может спешу с выводом, кошмар, у меня слов нет, работать не чего нормально не хочет, хорошей понятной доки нет, а изучать все исходники, можно, но пока их изучишь, забудешь что хотел делать . Не надо спешить с выводами.  У меня на компьютере почти весь софт свободный - и вполне работает. Работать хочет не тот продукт, авторы которого хорошо ограничили пользователю права, а тот, который грамотно сделан. Аналогично и с документацией. Любой продукт можно сделать хорошо, а можно плохо... Что, к примеру, непонятно в доке на openocd?
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Feb 3 2009, 13:52
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата(gotty @ Feb 3 2009, 11:23)  судя по всему Вы используете довольно свежую версию openocd. В таком случае лучше использовать конфиги, идущие вместе с openocd. Пример моего конфига Код source [find parport.cfg] source [find stm32.cfg] , а рядом лежат конфиги для целевого кристалла(в Вашем случае вероятно sam7x256) и вигглера ( parport.cfg, возможно придется подправить адрес параллельного порта) от разработчиков. Добавил конфиг: Код source [find C:\\openocd\\src\\target\\interface\\parport.cfg] source [find C:\\openocd\\src\\target\\target\\sam7se512.cfg] Порт подкорректировал на 0х378, появилась новая ошибка : командная строка : Код C:\openocd\src>openocd -f config.cfg Open On-Chip Debugger 0.1.0 (2009-02-02-20:43) Release BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS $URL: https://kc8apf@svn.berlios.de/svnroot/repos/openocd/tags/openocd-0.1.0/src/openocd.c $ jtag_speed: 0 Error: missing privileges for direct i/o Runtime error, file "command.c", line 456:
C:\openocd\src> собирал этот openocd цигвином, с ./configure --enable-parport --enable-parport_giveio потом маке и маке инстолл. Ошибок, в процессе сборки не было. с чем это проблема может быть связана ? Вот функция где происходит ошибка: CODE int command_run_line(command_context_t *context, char *line) { /* all the parent commands have been registered with the interpreter * so, can just evaluate the line as a script and check for * results */ /* run the line thru a script engine */ int retval=ERROR_FAIL; int retcode; /* Beware! This code needs to be reentrant. It is also possible * for OpenOCD commands to be invoked directly from Tcl. This would * happen when the Jim Tcl interpreter is provided by eCos for * instance. */ Jim_DeleteAssocData(interp, "context"); retcode = Jim_SetAssocData(interp, "context", NULL, context); if (retcode == JIM_OK) { /* associated the return value */ Jim_DeleteAssocData(interp, "retval"); retcode = Jim_SetAssocData(interp, "retval", NULL, &retval); if (retcode == JIM_OK) { retcode = Jim_Eval_Named(interp, line, __THIS__FILE__, __LINE__ ); // Вот это 456 строка, при запуске, сообщает что здесь ошибка
Jim_DeleteAssocData(interp, "retval"); } Jim_DeleteAssocData(interp, "context"); } if (retcode == JIM_ERR) { if (retval!=ERROR_COMMAND_CLOSE_CONNECTION) { /* We do not print the connection closed error message */ Jim_PrintErrorMessage(interp); } if (retval==ERROR_OK) { /* It wasn't a low level OpenOCD command that failed */ return ERROR_FAIL; } return retval; } else if (retcode == JIM_EXIT) { /* ignore. */ /* exit(Jim_GetExitCode(interp)); */ } else { const char *result; int reslen;
result = Jim_GetString(Jim_GetResult(interp), &reslen); int i; char buff[256+1]; for (i = 0; i < reslen; i += 256) { int chunk; chunk = reslen - i; if (chunk > 256) chunk = 256; strncpy(buff, result+i, chunk); buff[chunk] = 0; LOG_USER_N("%s", buff); } LOG_USER_N("%s", "\n"); retval=ERROR_OK; } return retval; }
Сообщение отредактировал sergey sva - Feb 3 2009, 14:00
|
|
|
|
|
Feb 3 2009, 14:21
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(sergey sva @ Feb 3 2009, 16:07)  я думал что это драйвер который нужен для работы opeocd с параллельным портом ? Всё верно. Цитата(sergey sva @ Feb 3 2009, 16:07)  Сделал сейчас make clean и все заново только без enable-parport_giveio, не чего не изменилось. для windows нужно собирать с --enable-parport_giveio. Только ещё сам драйвер надо установить. Скачать можно с http://www.pcports.ru/files/giveio.rar
|
|
|
|
|
Feb 3 2009, 15:33
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата(gotty @ Feb 3 2009, 17:21)  Всё верно. для windows нужно собирать с --enable-parport_giveio. Только ещё сам драйвер надо установить. Скачать можно с http://www.pcports.ru/files/giveio.rarУстановил теперь появились изменения, ошибки есть, может это из за того что файл sam7se512.cfg, от at91sam7s512 , а у меня at91sam7s256 его нужно подправлять.? Где бы еще найти скрипт инициализации для wigglera который нужно сюда вводить :
ошибки: CODE C:\openocd\src>openocd -f config.cfg Open On-Chip Debugger 0.1.0 (2009-02-03-17:29) Release BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS$URL: https://kc8apf@svn.berlios.de/svnroot/repos...0/src/openocd.c $ jtag_speed: 0 Info : JTAG tap: sam7se512.cpu tap/device found: 0x3f0f0f0f (Manufacturer: 0x787 , Part: 0xf0f0, Version: 0x3) Error: JTAG tap: sam7se512.cpu got: 0x3f0f0f0f (mfg: 0x787, part: 0x f0f0, ver: 0x3) Error: JTAG tap: sam7se512.cpu expected 1 of 1: 0xffffffff (mfg: 0x7ff, part: 0x ffff, ver: 0xf) Error: trying to validate configured JTAG chain anyway... Warn : no tcl port specified, using default port 6666
Сообщение отредактировал sergey sva - Feb 3 2009, 15:35
|
|
|
|
|
Feb 3 2009, 16:13
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата(gotty @ Feb 3 2009, 18:47)  А чего не используете sam7x256.cfg? Не увидел этот файл, на глаза только попался sam7se512.cfg . Сейчас Переделал config, но от ошибок все равно не избавился, теперь пишет ,что адрес уже занят : Код jtag_speed: 0 Info : JTAG tap: sam7x256.cpu tap/device found: 0x3f0f0f0f (Manufacturer: 0x787, Part: 0xf0f0, Version: 0x3) Info : JTAG Tap/device matched Error: couldn't bind to socket: Address already in use Пробовал менять на всякие разные все равно занято. telnet_port 4444 gdb_port 2001
Сообщение отредактировал sergey sva - Feb 3 2009, 16:13
|
|
|
|
|
Feb 4 2009, 10:43
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(sergey sva @ Feb 3 2009, 22:36)  ода но все же работает это радует.  А я все никак не могу подружить ARM-USB-OCD с OpenOCD и LPC2378. Пишет, что не может выполнить Halt reset. Может кто знает в чем дело? Вот лог: CODE Open On-Chip Debugger (2008-06-19 19:00) svn: 717 URL: http://svn.berlios.de/svnroot/repos/openocd/trunkInfo: options.c:50 configuration_output_handler(): jtag_speed: 3, 3 Info: options.c:50 configuration_output_handler(): Open On-Chip Debugger (2008-06-19 19:00) svn: 717 Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x4f1f0f0f (Manufacturer: 0x787, Part: 0xf1f0, Version: 0x4) Warning: embeddedice.c:185 embeddedice_build_reg_cache(): EmbeddedICE version 7 detected, EmbeddedICE handling might be broken Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x4f1f0f0f (Manufacturer: 0x787, Part: 0xf1f0, Version: 0x4) User: target.c:436 target_process_reset(): Timed out waiting for halt after reset Info: server.c:78 add_connection(): accepting 'gdb' connection from 0 Warning: gdb_server.c:416 gdb_get_packet_inner(): acknowledgment received, but no packet pending Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Info: server.c:395 server_loop(): dropped 'gdb' connection Info: server.c:78 add_connection(): accepting 'gdb' connection from 0 Warning: gdb_server.c:416 gdb_get_packet_inner(): acknowledgment received, but no packet pending Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Warning: arm7_9_common.c:1829 arm7_9_read_memory(): target not halted Заработало но появилась другая проблема: Добавил две строчки в конфигурационный файл OpenOCD, в общем приведу весь, дабы уменьшить проблемы тем, кто будет проходить этот же путь CODE #daemon configuration telnet_port 4444 gdb_port 3333 # tell gdb our flash memory map # and enable flash programming gdb_memory_map enable gdb_flash_program enable #interface interface ft2232 ft2232_device_desc "Olimex OpenOCD JTAG A" ft2232_layout "olimex-jtag" ft2232_vid_pid 0x15BA 0x0003 jtag_speed 3 jtag_nsrst_delay 200 # <- заработало после добавления вот этого jtag_ntrst_delay 200 # <- #use combined on interfaces or targets that can't set TRST/SRST separately reset_config trst_and_srst srst_pulls_trst #jtag scan chain #format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) jtag_device 4 0x1 0xf 0xe #target configuration daemon_startup reset #target <type> <startup mode> #target arm7tdmi <reset mode> <chainpos> <endianness> <variant> target arm7tdmi little run_and_halt 0 arm7tdmi-s_r4 run_and_halt_time 0 30 working_area 0 0x40000000 0x4000 nobackup #flash configuration #flash bank lpc2000 <base> <size> 0 0 <target#> <variant> flash bank lpc2000 0x0 0x40000 0 0 0 lpc2000_v1 14765 calc_checksum # For more information about the configuration files, take a look at: # http://openfacts.berlios.de/index-en.phtml...n-Chip+DebuggerВ данный момент не работают точки останова на функции main() и любые другие, если перезапустить программу. Если уже запущенную программу остановить и поставить точки останова, а потом опять запустить - они вновь начинают работать. Как победить?
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Feb 4 2009, 12:13
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
У меня обратная проблема,пока wigller подключен программу можно запустить остановить все работает, но если отсоединить wiggler, сбросить, или питание отключить включить то программа не запускается. Вот startup может в нем где что не так : CODE
ARM_MODE_USER = 0x10 /* Normal User Mode */ ARM_MODE_FIQ = 0x11 /* FIQ Fast Interrupts Mode */ ARM_MODE_IRQ = 0x12 /* IRQ Standard Interrupts Mode */ ARM_MODE_SVC = 0x13 /* Supervisor Interrupts Mode */ ARM_MODE_ABORT = 0x17 /* Abort Processing memory Faults Mode */ ARM_MODE_UNDEF = 0x1B /* Undefined Instructions Mode */ ARM_MODE_SYS = 0x1F /* System Running in Priviledged Operating Mode */ ARM_MODE_MASK = 0x1F
I_BIT = 0x80 /* disable IRQ when I bit is set */ F_BIT = 0x40 /* disable IRQ when I bit is set */
/* * Register Base Address */ AIC_BASE = 0xFFFFF000 AIC_EOICR_OFF = 0x130 AIC_IDCR_OFF = 0x124
RSTC_MR = 0xFFFFFD08 RSTC_KEY = 0xA5000000 RSTC_URSTEN = 0x00000001
WDT_BASE = 0xFFFFFD40 WDT_MR_OFF = 0x00000004 WDT_WDDIS = 0x00008000
MC_BASE = 0xFFFFFF00 MC_FMR_OFF = 0x00000060 MC_FWS_1FWS = 0x00480100
@-------------------------------------------------------- @ PMC адреса регистров PMC_BASE = 0xFFFFFC00 PMC_SCER = 0x00 PMC_SCDR = 0x04 PMC_MOR = 0x20 PMC_MCFR = 0x24 PMC_PLLR = 0x2C PMC_MCKR = 0x30 PMC_SR = 0x68 PMC_PCK0 = 0x40 @ PMC биты PMC_MOSCEN = (1 << 0) @ разрешение тактового генератора PMC_OSCBYPASS = (1 << 1) @ включение тактового генератора PMC_OSCOUNT = (0xFF << 8) @ время запуска основного тактового генератора. @ PLL биты PMC_DIV = (0x01 << 0) @ предварительный делитель PMC_PLLCOUNT = (0x3F << 8) @ Определяет число тактов сигнала SLCK, через которое устанавливается LOCK PMC_OUT = (0x00 << 14) @ Диапазон тактовых частот ФАПЧ PMC_MUL = (0x07 << 16) @ множитель ФАПЧ коэффициент (MUL+1) PMC_USBDIV = (0x01 << 28) @ предварительный делитель USB 28 / 2 ; 29 / 4 @ MCKR биты PMC_CSS = (3 << 0) @ Выбор источника основного синхронизирующего сигна 3pll PMC_PRES = (0 << 2) @ Предделитель основного генератора @ SR биты PMC_MOSCS = (1 << 0) @ Тактовый генератор стабилизирован PMC_LOCK = (1 << 2) @ ФАПЧ зафиксирована PMC_MCKRDY = (1 << 3) @ Состояние главного синхронизирующего сигнала MCK PMC_PCKRDY0 = (1 << 8) @ Состояние программируемого тактового сигнала @ Регистры PMC_MOR_Val = (PMC_OSCOUNT | PMC_MOSCEN) PMC_PLLR_Val = (PMC_USBDIV | PMC_MUL | PMC_OUT | PMC_PLLCOUNT | PMC_DIV) PMC_MCKR_Val = (PMC_PRES | PMC_CSS) @--------------------------------------------------------
.section .vectors,"ax" .code 32
/****************************************************************************/ /* Vector table and reset entry */ /****************************************************************************/ _vectors: ldr pc, ResetAddr /* Reset */ ldr pc, UndefAddr /* Undefined instruction */ ldr pc, SWIAddr /* Software interrupt */ ldr pc, PAbortAddr /* Prefetch abort */ ldr pc, DAbortAddr /* Data abort */ ldr pc, ReservedAddr /* Reserved */ ldr pc, IRQAddr /* IRQ interrupt */ ldr pc, FIQAddr /* FIQ interrupt */
ResetAddr: .word ResetHandler UndefAddr: .word UndefHandler SWIAddr: .word SWIHandler PAbortAddr: .word PAbortHandler DAbortAddr: .word DAbortHandler ReservedAddr: .word 0 IRQAddr: .word IRQHandler FIQAddr: .word FIQHandler
.ltorg
.section .init, "ax" .code 32
.global ResetHandler .global ExitFunction .extern main /****************************************************************************/ /* Reset handler */ /****************************************************************************/ ResetHandler: @---------------------------------------------------------------------------------------- @ включение тактового генератора и установка времени запуска ldr r0, = PMC_BASE ldr r1, = PMC_MOR_Val str r1, [r0, #PMC_MOR] @ настройка PMC_USBDIV PMC_MUL PMC_OUT PMC_PLLCOUNT PMC_DIV ldr r1, = PMC_PLLR_Val str r1, [r0, #PMC_PLLR] @ выбор источника генератора и настройка предварительного делителя ldr r1, = PMC_MCKR_Val str r1, [r0, #PMC_MCKR] @---------------------------------------------------------------------------------------- /* * The watchdog is enabled after processor reset. Disable it. */ ldr r1, =WDT_BASE ldr r0, =WDT_WDDIS str r0, [r1, #WDT_MR_OFF]
/* * сброс */ ldr r0, = (RSTC_KEY | RSTC_URSTEN ) ldr r1, = RSTC_MR str r0, [r1, #0]
/* * Use 2 cycles for flash access. */ ldr r1, =MC_BASE ldr r0, =MC_FWS_1FWS str r0, [r1, #MC_FMR_OFF]
/* * Disable all interrupts. Useful for debugging w/o target reset. */ ldr r1, =AIC_BASE mvn r0, #0 str r0, [r1, #AIC_EOICR_OFF] str r0, [r1, #AIC_IDCR_OFF]
/* * Setup a stack for each mode */ msr CPSR_c, #ARM_MODE_UNDEF | I_BIT | F_BIT /* Undefined Instruction Mode */ ldr sp, =__stack_und_end
msr CPSR_c, #ARM_MODE_ABORT | I_BIT | F_BIT /* Abort Mode */ ldr sp, =__stack_abt_end
msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT /* FIQ Mode */ ldr sp, =__stack_fiq_end
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT /* IRQ Mode */ ldr sp, =__stack_irq_end
msr CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT /* Supervisor Mode */ ldr sp, =__stack_svc_end
/* * Clear .bss section */ ldr r1, =__bss_start ldr r2, =__bss_end ldr r3, =0 bss_clear_loop: cmp r1, r2 strne r3, [r1], #+4 bne bss_clear_loop
/* * Jump to main */ @ mrs r0, cpsr @ bic r0, r0, #I_BIT | F_BIT /* Enable FIQ and IRQ interrupt */ @ msr cpsr, r0
mov r0, #0 /* No arguments */ mov r1, #0 /* No arguments */ ldr r2, = main mov lr, pc bx r2 /* And jump... */
ExitFunction: nop nop nop b ExitFunction
/****************************************************************************/ /* Default interrupt handler */ /****************************************************************************/
UndefHandler: b UndefHandler
SWIHandler: b SWIHandler
PAbortHandler: b PAbortHandler
DAbortHandler: b DAbortHandler
IRQHandler: b IRQHandler
FIQHandler: b FIQHandler
.weak ExitFunction .weak UndefHandler, PAbortHandler, DAbortHandler .weak IRQHandler, FIQHandler
.ltorg
|
|
|
|
|
Feb 4 2009, 12:13
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(Vitaliy_ARM @ Feb 4 2009, 12:43)  А я все никак не могу подружить ARM-USB-OCD с OpenOCD и LPC2378. Пишет, что не может выполнить Halt reset. Может кто знает в чем дело? Хм. Я тоже, но продвинулся чуть дальше Постил я сюда: http://electronix.ru/forum/index.php?showt...st&p=538405http://electronix.ru/forum/index.php?showt...st&p=538988Может вдвоем быстрее найдем правильный путь.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Feb 4 2009, 12:54
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(amw @ Feb 4 2009, 15:13)  Посмотрел. Приведу на всякий случай окно инициализации своего gdb: Продолжаем разбираться.
Эскизы прикрепленных изображений
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Feb 4 2009, 13:26
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата(Vitaliy_ARM @ Feb 4 2009, 15:54)  Посмотрел. Приведу на всякий случай окно инициализации своего gdb: Продолжаем разбираться.  попробуйте добавить break main continue
|
|
|
|
|
Feb 4 2009, 13:36
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(sergey sva @ Feb 4 2009, 16:26)  попробуйте добавить
break main continue Пробовал, потом убрал. Роли не играет. А как аппаратные брейкпоинты работают. Они во флешь прошиваются или в озу или в спец регистры?
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Feb 4 2009, 14:32
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(sergey sva @ Feb 3 2009, 22:38)  Еще есть одна непонятная ситуация, может что подскажите,из за чего может быть такое: если запускаю программу из отладчика все работает, а если отлючаю wiggler, сброс жму, программа не стартует, хотя в флэш программа записана, пробовал считать hjtag. Возможно это связано с тем, что вы используете программные точки останова. Попробуйте аппаратные. Для этого замените Код monitor arm7_9 sw_bkpts enable на Код monitor arm7_9 force_hw_bkpts enable
|
|
|
|
|
Feb 4 2009, 15:04
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата(gotty @ Feb 4 2009, 17:32)  Возможно это связано с тем, что вы используете программные точки останова. Попробуйте аппаратные. Для этого замените Код monitor arm7_9 sw_bkpts enable на Код monitor arm7_9 force_hw_bkpts enable Пробовал и аппаратные и программные, но все равно та же ситуация, виглером запускается и останавливается, после отключения включения питания программа не стартует. вот окне инициализации : CODE target remote localhost:2001 monitor reset monitor sleep 500 monitor poll monitor soft_reset_halt monitor arm7_9 force_hw_bkpts enable #monitor arm7_9 sw_bkpts enable
# WDT_MR, disable watchdog monitor mww 0xFFFFFD44 0x00008000
# RSTC_MR, enable user reset monitor mww 0xfffffd08 0xa5000001
# CKGR_MOR monitor mww 0xFFFFFC20 0x00000601 monitor sleep 10
# CKGR_PLLR monitor mww 0xFFFFFC2C 0x00481c0e monitor sleep 10
# PMC_MCKR monitor mww 0xFFFFFC30 0x00000007 monitor sleep 10
# PMC_IER monitor mww 0xFFFFFF60 0x00480100 monitor sleep 100
# needed for gdb 6.8 and higher set mem inaccessible-by-default off
load break main continue
Вот файл мап, может здесь будет видно что нибудь подозрительное: CODE
Memory Configuration
Name Origin Length Attributes rom 0x00100000 0x00040000 ram 0x00200000 0x00010000 *default* 0x00000000 0xffffffff
Linker script and memory map
LOAD ./src/crt.o LOAD ./src/main.o START GROUP LOAD c:/program files/yagarto/bin/../lib/gcc/arm-elf/4.3.2\libgcc.a LOAD c:/program files/yagarto/bin/../lib/gcc/arm-elf/4.3.2/../../../../arm-elf/lib\libc.a END GROUP 0x00000100 FIQ_STACK_SIZE = 0x100 0x00000100 IRQ_STACK_SIZE = 0x100 0x00000100 ABT_STACK_SIZE = 0x100 0x00000100 UND_STACK_SIZE = 0x100 0x00000100 SVC_STACK_SIZE = 0x100 0x00000400 USE_STACK_SIZE = 0x400
.text 0x00100000 0x214 *(.vectors) .vectors 0x00100000 0x40 ./src/crt.o 0x00100040 . = ALIGN (0x4) *(.init) .init 0x00100040 0xf8 ./src/crt.o 0x001000f4 FIQHandler 0x001000e8 PAbortHandler 0x00100040 ResetHandler 0x001000ec DAbortHandler 0x001000f0 IRQHandler 0x001000e0 UndefHandler 0x00100138 . = ALIGN (0x4) *(.text) .text 0x00100138 0x0 ./src/crt.o .text 0x00100138 0xdc ./src/main.o 0x00100138 main 0x001001b4 inicializaciya 0x00100214 . = ALIGN (0x4) *(.rodata) 0x00100214 . = ALIGN (0x4) *(.rodata*) 0x00100214 . = ALIGN (0x4) *(.glue_7t) .glue_7t 0x00100214 0x0 ./src/crt.o .glue_7t 0x00100214 0x0 ./src/main.o 0x00100214 . = ALIGN (0x4) *(.glue_7) .glue_7 0x00100214 0x0 ./src/crt.o .glue_7 0x00100214 0x0 ./src/main.o 0x00100214 . = ALIGN (0x4) 0x00100214 etext = .
.vfp11_veneer 0x00000000 0x0 .vfp11_veneer 0x00000000 0x0 ./src/crt.o .vfp11_veneer 0x00000000 0x0 ./src/main.o
.data 0x00200000 0x4 0x00200000 PROVIDE (__data_start, .) *(.data) .data 0x00200000 0x0 ./src/crt.o .data 0x00200000 0x4 ./src/main.o 0x00200000 pPIO 0x00200004 . = ALIGN (0x4) 0x00200004 edata = . 0x00200004 _edata = . 0x00200004 PROVIDE (__data_end, .)
.bss 0x00200004 0x9fc 0x00200004 PROVIDE (__bss_start, .) *(.bss) .bss 0x00200004 0x0 ./src/crt.o .bss 0x00200004 0x0 ./src/main.o *(COMMON) 0x00200004 . = ALIGN (0x4) 0x00200004 PROVIDE (__bss_end, .) 0x00200100 . = ALIGN (0x100) *fill* 0x00200004 0xfc 00 0x00200100 PROVIDE (__stack_start, .) 0x00200100 PROVIDE (__stack_fiq_start, .) 0x00200200 . = (. + FIQ_STACK_SIZE) *fill* 0x00200100 0x100 00 0x00200200 . = ALIGN (0x4) 0x00200200 PROVIDE (__stack_fiq_end, .) 0x00200200 PROVIDE (__stack_irq_start, .) 0x00200300 . = (. + IRQ_STACK_SIZE) *fill* 0x00200200 0x100 00 0x00200300 . = ALIGN (0x4) 0x00200300 PROVIDE (__stack_irq_end, .) 0x00200300 PROVIDE (__stack_abt_start, .) 0x00200400 . = (. + ABT_STACK_SIZE) *fill* 0x00200300 0x100 00 0x00200400 . = ALIGN (0x4) 0x00200400 PROVIDE (__stack_abt_end, .) 0x00200400 PROVIDE (__stack_und_start, .) 0x00200500 . = (. + UND_STACK_SIZE) *fill* 0x00200400 0x100 00 0x00200500 . = ALIGN (0x4) 0x00200500 PROVIDE (__stack_und_end, .) 0x00200500 PROVIDE (__stack_svc_start, .) 0x00200600 . = (. + SVC_STACK_SIZE) *fill* 0x00200500 0x100 00 0x00200600 . = ALIGN (0x4) 0x00200600 PROVIDE (__stack_svc_end, .) 0x00200600 PROVIDE (__stack_use_start, .) 0x00200a00 . = (. + USE_STACK_SIZE) *fill* 0x00200600 0x400 00 0x00200a00 . = ALIGN (0x4) 0x00200a00 PROVIDE (__stack_use_end, .) 0x00200a00 PROVIDE (__stack_end, .) 0x00200a00 PROVIDE (__heap_start, .) OUTPUT(at91sam7s256_v1_rom.elf elf32-littlearm)
.ARM.attributes 0x00000000 0x10 .ARM.attributes 0x00000000 0x10 ./src/crt.o .ARM.attributes 0x00000010 0x10 ./src/main.o
.debug_line 0x00000000 0xea .debug_line 0x00000000 0x7e ./src/crt.o .debug_line 0x0000007e 0x6c ./src/main.o
.debug_info 0x00000000 0x508 .debug_info 0x00000000 0x67 ./src/crt.o .debug_info 0x00000067 0x4a1 ./src/main.o
.debug_abbrev 0x00000000 0xed .debug_abbrev 0x00000000 0x12 ./src/crt.o .debug_abbrev 0x00000012 0xdb ./src/main.o
.debug_aranges 0x00000000 0x48 .debug_aranges 0x00000000 0x28 ./src/crt.o .debug_aranges 0x00000028 0x20 ./src/main.o
.debug_ranges 0x00000000 0x20 .debug_ranges 0x00000000 0x20 ./src/crt.o
.debug_frame 0x00000000 0x38 .debug_frame 0x00000000 0x38 ./src/main.o
.debug_loc 0x00000000 0x2b .debug_loc 0x00000000 0x2b ./src/main.o
.debug_pubnames 0x00000000 0x37 .debug_pubnames 0x00000000 0x37 ./src/main.o
.debug_str 0x00000000 0x281 .debug_str 0x00000000 0x281 ./src/main.o 0x29d (size before relaxing)
.comment 0x00000000 0x12 .comment 0x00000000 0x12 ./src/main.o
Cross Reference Table
Symbol File DAbortHandler ./src/crt.o FIQHandler ./src/crt.o IRQHandler ./src/crt.o PAbortHandler ./src/crt.o ResetHandler ./src/crt.o UndefHandler ./src/crt.o __bss_end ./src/crt.o __bss_start ./src/crt.o __stack_abt_end ./src/crt.o __stack_fiq_end ./src/crt.o __stack_irq_end ./src/crt.o __stack_svc_end ./src/crt.o __stack_und_end ./src/crt.o __stack_use_end ./src/crt.o inicializaciya ./src/main.o main ./src/main.o ./src/crt.o pPIO ./src/main.o
|
|
|
|
|
Feb 4 2009, 16:29
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
компиляция линкование и ассемблирование проходит без ошибок и предупреждений, программа записывается, прекрасно работает с отладчика и по шагам и в без конечном цикле. Но как отсоединяю вигглер, программа еще работает можно сброс нажать пере запустится, Если отключаю питание и заново включаю ужу не запускается. Сначала думал что программа записывается только в озу, попробовал все стер Hjtag считал, посмотрел чисто, запустил отладчик,программа записалась, запустил по шагам все работает, опять запустил hjtag считал ,флэш уже не чистая с программой, где еще копать. ?
|
|
|
|
|
Feb 4 2009, 19:11
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(Vitaliy_ARM @ Feb 4 2009, 14:54)  Посмотрел. Приведу на всякий случай окно инициализации своего gdb: Продолжаем разбираться.  Добавление команды Код monitor arm7_9 force_hw_bkpts enable приводит к ошибке Код invalid command name "arm7_9_force_hw_bkpts" Самое странное то, что из командной строки gdb запись/чтение регистров и ОЗУ работает. Код (gdb) monitor mww 0xe01fc040 2
(gdb) monitor mdw 0xe01fc040 0xe01fc040: 00000002
(gdb) monitor mww 0x40000000 0x1234
(gdb) monitor mdw 0x40000000 0x40000000: 00001234 А вот при инициализации, т.е. выолняемые из скрипта - нет. Аборты. Код invalid command name "arm7_9_force_hw_bkpts" called at file "command.c", line 456 called at file "embedded:startup.tcl", line 89 called at file "embedded:startup.tcl", line 93 memory write caused data abort (address: 0xe01fc040, size: 0x4, count: 0x1) Runtime error, file "command.c", line 456:
0xe01fc040: 00000001 Здесь аборт при записи в MEMMAP, чтение MEMMAP следующей строкой в скрипте проходит без ошибок.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Feb 5 2009, 08:51
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(amw @ Feb 4 2009, 22:11)  0xe01fc040: 00000001[/code] Здесь аборт при записи в MEMMAP, чтение MEMMAP следующей строкой в скрипте проходит без ошибок. По началу тоже было что-то подобное, когда пытался запустить отладку примера lpc2378_uart_irq с сайта WinARM. Потом заменил .cfg файл файлом для lpc2294 из директории OpenOCD, добавил пару строчек, как писал выше и отладка заработала, только остался геммор с точками останова. Видимо их gdb не зашивает в процессор. Как нестранно, но с атмеловскими процессорами проблем на порядок меньше. Имеется в распоряжении J-Link и GDB-сервер для него. Так с ним точки останова ставятся! Хрень однако  Начинаю думать, что это уже не работа, а мучение.
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Feb 5 2009, 10:48
|

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

|
Цитата(sergey sva @ Feb 4 2009, 17:13)  но если отсоединить wiggler, сбросить, или питание отключить включить то программа не запускается. Вот startup может в нем где что не так : По поводу инициализации железа ничего сказать не могу, а вот что касается программной части: а где инициализация секции .data? Судя по приведенному map файлу, в ней есть данные... Я вижу, что после очистки .bss управление сразу передается main()...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Feb 5 2009, 17:52
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Цитата(alx2 @ Feb 5 2009, 13:48)  По поводу инициализации железа ничего сказать не могу, а вот что касается программной части: а где инициализация секции .data? Судя по приведенному map файлу, в ней есть данные... Я вижу, что после очистки .bss управление сразу передается main()... Пока не селен в тонкостях работы с скриптами, Понимаю так секция bss содержит переменные, но как их нужно инициализировать, не знаю, вот в скрипте линкера: CODE .bss : { PROVIDE (__bss_start = .); *(.bss) *(COMMON) . = ALIGN(4); PROVIDE (__bss_end = .); . = ALIGN(256); PROVIDE (__stack_start = .); PROVIDE (__stack_fiq_start = .); . += FIQ_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_fiq_end = .);
PROVIDE (__stack_irq_start = .); . += IRQ_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_irq_end = .);
PROVIDE (__stack_abt_start = .); . += ABT_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_abt_end = .);
PROVIDE (__stack_und_start = .); . += UND_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_und_end = .); PROVIDE (__stack_svc_start = .); . += SVC_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_svc_end = .);
PROVIDE (__stack_use_start = .); . += USE_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_use_end = .); PROVIDE (__stack_end = .); PROVIDE (__heap_start = .); } > ram
Причина скорее всего в секции bss. Проделал такие действия: запустил программу с виглером посмотрел память и мап файл еще раз, по ниму видно что данные которые находятся в bss располагаются по адресу 0ч00200000 и занимают 4байта, хранится там цифра 00F4FFFF её запомнил, после добавил в стартап очистку все памяти : Код ldr r1, =0x00200000 ldr r2, =0x00210000 mov r3, #0 bss_clear_loop: cmp r1, r2 strne r3, [r1,#0x04]! bne bss_clear_loop Теперь если запускаю, программа не запускается, а если записываю 00F4FFFF по адресу где должен быть BSS, программа начинает работать. Похоже дело все таки в этом. Как правильно проинициализировать сектор bss , может его нужно помещать в не в ром а в рам ?
|
|
|
|
|
Feb 5 2009, 18:58
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(sergey sva @ Feb 5 2009, 19:52)  Пока не селен в тонкостях работы с скриптами... Вот пример из рабочего проекта для SAM7S256. В кратце Секция .data это секция, в которой размещаются инициализируемуе глобальные переменные. Она прошивается во флеш по адресу LMA, и копируется стартап кодом по адресу VMA. Секция .bss это секция, в которой размещаются НЕинициализируемуе глобальные переменные. Она НЕ прошивается во флеш и обнуляется стартап кодом по адресу VMA. LMA - Load Memory Address - адрес, по которому загружаются переменные из файла (для embedded прошиваются во флеш). VMA - Virtual Memory Address - адрес, по которому переменные доступны программе во время ее выполнения. За подробностями обратитесь в info ld, ну или на первоисточник http://sourceware.org/binutils/docs/А вообще-то если у Вас нет, так сказать реверенсного, скрипта линкера то выведите скрипт по умолчанию из самого ld arm-elf-ld --verbose и поправте под свои нужды.
Сообщение отредактировал amw - Feb 5 2009, 19:02
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Feb 6 2009, 12:24
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Заметил такую штуку. Когда использовал GDB сервер для J-Link версии 3,68b - точки останова ставятся, если использую последнюю версию 4.02 - проблема такая же как и с опер оцд. Точки останова не ставятся. От сюда возникает подозрение, может сменили команду установки брейкпоинтов?
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Apr 30 2009, 15:33
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(_Pasha @ Apr 30 2009, 11:54)  Подскажите, уважаемые, как бороться с такой чепухой: (WinAVR-20090313)
Пишу софтину с printf_P периодически выскакивает error: relocation truncated to fit для фрагментов с его использованием. меняю порядок компиляции файлов - все попускает. Можно ли заставить линкер как-то перетасовать объектники автоматиццки? Автоматически он делает в том порядке, в каком файлы указаны в командной строке. Вероятно память у Вас разбита на нескольков кусков в скрипте? Какие-то секции идут в один кусок, другие в другой. Ну если у Вас действительно так, то ошибка вполне законна. Добавили код - перестало влазить, что-то поменяли - размер уменьшился - опять влазит. Или вот такое http://www.motherboardpoint.com/relocation...ans-t94967.html
Сообщение отредактировал amw - Apr 30 2009, 15:38
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
May 3 2009, 13:20
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(_Pasha @ May 3 2009, 16:23)  Отключил -mshort-calls проблема ушла. На том и остановился... Я аналогично сделал (m128 забита на 80%) :( Но чуть позднее в TODO добавил посмотрть эффект ключей оптимизации: Цитата -freorder-blocks -freorder-blocks-and-partition -freorder-functions -ftoplevel-reorder однако пока так и не добрался проверить, помогут ли они сохранить отсутствие jmp.
|
|
|
|
|
Sep 7 2009, 13:04
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Можно ли как-нибудь создать один регион памяти из двух кусков, например что-то вроде: Код MFlash512 (rx) : (ORIGIN = 0x20000, LENGTH = 0x1000) OR (ORIGIN = 0x40000, LENGTH = 0x1000)  ????
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Sep 10 2009, 10:52
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(Vitaliy_ARM @ Sep 7 2009, 17:04)  Можно ли как-нибудь создать один регион памяти из двух кусков, например что-то вроде: Код MFlash512 (rx) : (ORIGIN = 0x20000, LENGTH = 0x1000) OR (ORIGIN = 0x40000, LENGTH = 0x1000)  ???? Написал этот вопрос в поддержку. Посмотрим, что ответят. Получил ответ Цитата Hi,
You just need to change ".boot" to ".text" in your linker script.
Full details on linker scripts can be found in the documentation at: Help->Help Contents Code Red Technologies Documentation Tools Documentation GNU Linker Section 3 "Linker Scripts"
Best regards, Попробовал поменять: Код .text : /* .boot*/ { KEEP(*(.isr_vector)); KEEP(*(.crp_key)); KEEP(*(.macaddr)); KEEP(*(.ipaddr)); } > BOOTMEM
.text : { *(.text*) *(.rodata*) } > MFlash512 Не работает.
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Sep 14 2009, 08:17
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
После длительной переписки со службой поддержки выяснилось, что надо было делать совсем подругому, нежели в IAR5.x. Код MEMORY { /* Define each memory region */ CODE_MEM (rx) : ORIGIN = 0x0, LENGTH = 0x00003000 MAC_IP_MEM(rx) : ORIGIN = 0x00003000, LENGTH = 0x00002000 Ram32 (rwx) : ORIGIN = 0x40000000, LENGTH = 0x8000 /* 32k */ RAM_ETH_16 (rwx) : ORIGIN = 0x7fe00000, LENGTH = 0x4000 /* 16k */ RAM_USB_8 (rwx) : ORIGIN = 0x7fd00000, LENGTH = 0x2000 /* 8k */ RAM_RTC_2 (rwx) : ORIGIN = 0xe0084000, LENGTH = 0x800 /* 2k */ }
.text : { KEEP(*(.isr_vector)); /*вектора прерываний*/ . = 0x000001FC; /*смещение указателя на адрес CRP*/ KEEP(*(.crp_key)); /*секция CRP*/ *(.text*) /*код программы*/ *(.rodata*) /*константы*/ } > CODE_MEM
.MacIpMem : /*. = 0x00003000;*/ { KEEP(*(.macaddr)) /*размещаем по адресу 0x00003000*/ . = 0x00001000; /*переход на адрес 0x00001000;*/ KEEP(*(.ipaddr)) /*размещаем по адресу 0x00004000*/ } > MAC_IP_MEM Вот так почти правильно размещать свой код в разные областя памяти. Теперь про почти: Инициализируемая константа находится в исходнике, задается следующим образом: const BYTE OurMacAddr[6] __attribute__ ((section(".macaddr"))) = {0x00,0x01,0x02,0x03,0x04,0x06}; Инициализируется мусором!!! Почему???
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Sep 14 2009, 08:54
|

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

|
Цитата(Vitaliy_ARM @ Sep 14 2009, 11:17)  После длительной переписки со службой поддержки выяснилось, что надо было делать совсем подругому, нежели в IAR5.x. Вы конечно извините, но то, что вы показали и исходный ваш вопрос "Можно ли как-нибудь создать один регион памяти из двух кусков" имеют мало общего. Ибо вопрос подразумевает, что задаются два региона и одно описание выходной секции, а линкер впихивает сколько влезет в первый регион и остаток во второй. Вам же нужно было разместить секцию по конкретному адресу, а это совсем другой вопрос. По поводу мусора - надо смотреть листинг и .map
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 14 2009, 09:42
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(Сергей Борщ @ Sep 14 2009, 12:54)  Вы конечно извините, но то, что вы показали и исходный ваш вопрос "Можно ли как-нибудь создать один регион памяти из двух кусков" имеют мало общего. Ибо вопрос подразумевает, что задаются два региона и одно описание выходной секции, а линкер впихивает сколько влезет в первый регион и остаток во второй. Вам же нужно было разместить секцию по конкретному адресу, а это совсем другой вопрос. По поводу мусора - надо смотреть листинг и .map Как я понял, вектора прерываний и код должны сидеть в одной секции. У меня в проекте Iar, секции располагались следующим образом: - Вектора прерываний - CRP ключ - Основной код - MAC адрес - IP адрес В IAR каждая секция у меня сидела в своем регионе памяти. Между векторами и основным кодом сидела секция CRP. Но в GNU Linker вроде бы как нельзя разделять их по разным регионам. Поэтому я решил что можно выйти из этой ситуации, создав секцию .text из двух кусков (поэтому так и задал этот вопрос.  , про операцию = ADDR. не догадывался ). Один кусок расположить в свободной области между векторами и CRP, а второй после CRP. Однако так тут так тоже нельзя делать. А надо было выделить один регион памяти и напихать туда по очереди все секции, а адреса смещать при помощи операции .= ADDR. Собственно как тут и сделано: Код .text : { KEEP(*(.isr_vector)); . = 0x000001FC; KEEP(*(.crp_key)); *(.text*) *(.rodata*) } > CODE_MEM Цитата(Сергей Борщ @ Sep 14 2009, 12:54)  По поводу мусора - надо смотреть листинг и .map Про map смотреть сюда?: Код .MacIpMem 0x00003000 0x1004 *(.macaddr) .macaddr 0x00003000 0x6 ./src/Emac.o 0x00003000 OurMacAddr Как можно листинг посмотреть?
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Sep 17 2009, 13:14
|

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

|
Цитата(Vitaliy_ARM @ Sep 14 2009, 13:17)  Инициализируемая константа находится в исходнике, задается следующим образом: const BYTE OurMacAddr[6] __attribute__ ((section(".macaddr"))) = {0x00,0x01,0x02,0x03,0x04,0x06}; Инициализируется мусором!!! Почему??? Наверное неправильно написан стартап-код, который и занимается инициализацией (как кариант, инициализация просто забыта, и эта секция просто остается неинициализированной). Кстати, а что говорит objdump -d -j .macaddr <объектный файл> ? Может там вообще этой секции нет?  Цитата(Vitaliy_ARM @ Sep 14 2009, 14:42)  Как я понял, вектора прерываний и код должны сидеть в одной секции. Совершенно необязательно. Хотите - размещайте в одной, хотите - в разных. Цитата(Vitaliy_ARM @ Sep 14 2009, 14:42)  В IAR каждая секция у меня сидела в своем регионе памяти. Между векторами и основным кодом сидела секция CRP. Но в GNU Linker вроде бы как нельзя разделять их по разным регионам. Неверный вывод. Разделять можно. Кстати, Вы не путаете секции и регионы? Это не одно и то же...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Sep 21 2009, 08:17
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(alx2 @ Sep 17 2009, 17:14)  Наверное неправильно написан стартап-код, который и занимается инициализацией (как кариант, инициализация просто забыта, и эта секция просто остается неинициализированной). Эти константы находятся во флешь. У меня проблема несколько в другом. Мой код отлично работает у службы поддержки Code-Red. А у меня тупо не зашиваются эти константы в процессор. Уже несколько дней разбираемся в чем может быть дело.
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|