|
прыгнуть на другой адрес в ROM |
|
|
|
Apr 5 2008, 08:17
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Приветствую, MCU: at91sam7s256 toolchain: Yagarto (gcc-4.2.1) Есть два простых приложения. Образ первого (размером XXX байт) расположен по адресу 0x100000 (т.е. в самом начале флеша), печатает строку в DBGU и переходит на адрес, по которому расположен другой образ. Второй образ лежит по адресу 0x100000 + XXX . Все что он делает это выводит другую строку в DBGU и на этом успокаивается. Но проблема в том, что переход по этому адресу не происходит! Адреса прописал верно, скрипты линкера подлправил. Не знаю, что я упустил... Прикладываю маленкьй архив с кодом обоих приложений и ld-скриптов. Очень надеюсь, что знающие люди подскажут где я облажался. Спасибо!
|
|
|
|
|
 |
Ответов
|
Apr 17 2008, 08:07
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Да есть такая проблема. Сделайте так Код Тут убрать секцию с векторами .text : { /* ARM Exception vectors */ . = _vectors; KEEP (*(.vectors*)) . = _evectors; KEEP (*Cstartup.o (.text) ) /* Startup code */ *(.text*) /* remaining code */ *(.glue_7t) *(.glue_7) } >Что тут у Вас должно быть Дальше продолжение вашего скрипта. Дело в том, что 1. Ваш скрипт описывает действия с секцией текст несколько раз 2. Секции располагаются в памяти в алфавитном порядке если не указанно иное. Поскольку vectors идет после text то тут возникают вопросы.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 18 2008, 02:17
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Приветствую. Цитата(amw @ Apr 17 2008, 11:07)  Да есть такая проблема. Сделайте так Код Тут убрать секцию с векторами .text : { /* ARM Exception vectors */ . = _vectors; KEEP (*(.vectors*)) . = _evectors; KEEP (*Cstartup.o (.text) ) /* Startup code */ *(.text*) /* remaining code */ *(.glue_7t) *(.glue_7) } >Что тут у Вас должно быть Дальше продолжение вашего скрипта. Наверное вы имели в виду: Код SECTIONS { .text : { /* ARM exception vectors */ _vectors_start = .; KEEP(*(.vectors)) _vectors_end = .; KEEP(*Cstartup.o (.text)) /* Startup code */ *(.text) /* code */ *(.rodata) /* read-only data (constants) */ *(.rodata*)
*(.glue_7t) *(.glue_7) } >ROM =0 } Но это все равно не помогает. Map-файл выглядит так: Код Memory Configuration
Name Origin Length Attributes ROM 0x00101000 0x00001000 xr RAM 0x00200000 0x00004000 rw STACK 0x00204000 0x00000000 rw REMAPPED 0x00000000 0x00004000 xrw *default* 0x00000000 0xffffffff ...
.text 0x00101000 0x4f0 0x00101000 _vectors_start = . *(.vectors) .vectors 0x00101000 0x20 Cstartup.o 0x00101000 _startup 0x00101020 _vectors_end = . *Cstartup.o(.text) .text 0x00101020 0x14c Cstartup.o ... Вектора он таки поместил в начало и размер 0x20, то есть 32 байта. Но objdump тем не менее видит эти вектора по неверному адресу: Код main.elf: file format elf32-littlearm
Disassembly of section .text:
00101000 <_startup>: //*- If an exception occurs before remap, this would result in an infinite loop. //*- To ensure if a exeption occurs before start application to infinite loop. //*------------------------------------------------------------------------------*/
B InitReset /* 0x00 Reset handler */ 101000: ea000011 b 10104c <InitReset> ... Цитата Дело в том, что 1. Ваш скрипт описывает действия с секцией текст несколько раз В линкер-скрипте секция .text только один раз.
|
|
|
|
|
Apr 18 2008, 08:28
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(romez777 @ Apr 18 2008, 05:17)  Приветствую. Наверное вы имели в виду: Давайте согласуем действия. Возмем за основу приложенный проект. Линкер скрипт взят из поста #24. Ваши коментарии? Результаты компиляции? Код $ arm-elf-as -v GNU assembler version 2.18 (arm-elf) using BFD version (GNU Binutils) 2.18 $ arm-elf-ld -v GNU ld (GNU Binutils) 2.18 $ arm-elf-gcc -v Using built-in specs. Target: arm-elf Configured with: /home/amw/devel/ARM/arm7tdmi/tools/src/gcc-4.2.2/configure --target=arm-elf --prefix=/usr/local/arm/arm-elf --enable-interwork --enable-multilib --with-newlib --with-headers=/usr/local/arm/arm-elf/arm-elf/include --with-gnu-ld --with-gnu-as --disable-nls --disable-shared --enable-languages=c Thread model: single gcc version 4.2.2 Цитата В линкер-скрипте секция .text только один раз. Пост #24. ?????
Прикрепленные файлы
jump.zip ( 6.68 килобайт )
Кол-во скачиваний: 78
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 19 2008, 04:02
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Приветствую. Спасибо за ваше терпение в ответах на мои глупые вопросы  Цитата(amw @ Apr 18 2008, 11:28)  Давайте согласуем действия. Возмем за основу приложенный проект. Линкер скрипт взят из поста #24. Ваши коментарии? Результаты компиляции? Хорошо. Итак, берем линкер скрипт из поста N24 (скрипт из приложенного вами проекта отличается совмем немного, но об этом позже), приложенный проект и успешно компилирую. НО - binary образ, полученный в результате arm-elf-objcopy -O binary tst.elf tst.bin получается огромным (1,052,808байт!) и соответственно не прошивается. При этом бинарник из архива jump.zip крохотный, благополучно прошивается и похоже на то, что работает. Мой тулчейн взят с www.yagarto.de, собран под Win32: Код D:\Documents and Settings\sam>arm-elf-gcc --version arm-elf-gcc (GCC) 4.2.1 Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
D:\Documents and Settings\sam>arm-elf-ld --version GNU ld version 2.17 Copyright 2005 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty.
D:\Documents and Settings\sam>arm-elf-as --version GNU assembler 2.17 Copyright 2005 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty. This assembler was configured for a target of `arm-elf'. Вопросы: 1) почему в вашем стартапе вектора определены через "ldr pc, ..." и далее просто word-ами размещены точки входа в обработчики? Чем это лучше/правильнее/оптимальнее, почему не сразу, например: Код B InitReset undefvec: B undefvec swivec: B swivec ... 2) в стартапе вы не делаете ремап и не инициализируете стеки (это наверное связано с тем, что приложение простое и дано как пример?) 3) непонятет вот этот кусок: Код _startup: ldr r0, =0x12345678 mov r1, #0x14 str r0, [r1] bl main b _startup Обычно я видел, что в r0 кладется адрес ф-ции main, а потом bx r0 4) в линкер файле вы определяете размер секции векторов в 64 байта. Это потому, что там сначала идут ldr pc ... (7 штук и ноль), а потом 7 слов ? 5) в линкер скрипте секция .vectors вынесена отдельно и .text описывается дважды. Ранее вы советовали vectors вынести внутрь .text. Какой же способ правильный?
|
|
|
|
|
Apr 19 2008, 10:05
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(romez777 @ Apr 19 2008, 07:02)  Приветствую. Спасибо за ваше терпение в ответах на мои глупые вопросы  Хорошо. Итак, берем линкер скрипт из поста N24 (скрипт из приложенного вами проекта отличается совмем немного, но об этом позже), приложенный проект и успешно компилирую. НО - binary образ, полученный в результате arm-elf-objcopy -O binary tst.elf tst.bin получается огромным (1,052,808байт!) и соответственно не прошивается. При этом бинарник из архива jump.zip крохотный, благополучно прошивается и похоже на то, что работает. Мой тулчейн взят с www.yagarto.de, собран под Win32: Мой тулчейн собран мной и работаю я на Debian/Lenny amd64. Давайте отлчия в скрипте линкера. Скорее всего проблема с LOAD ADDRESS (то что в секции после } > !!!!!!!). Цитата Код D:\Documents and Settings\sam>arm-elf-gcc --version arm-elf-gcc (GCC) 4.2.1 Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. D:\Documents and Settings\sam>arm-elf-ld --version GNU ld version 2.17 Copyright 2005 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty.
D:\Documents and Settings\sam>arm-elf-as --version GNU assembler 2.17 Copyright 2005 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty. This assembler was configured for a target of `arm-elf'. Почти одинаково. Думаю это не имеет значения. Цитата Вопросы: 1) почему в вашем стартапе вектора определены через "ldr pc, ..." и далее просто word-ами размещены точки входа в обработчики? Чем это лучше/правильнее/оптимальнее, почему не сразу, например: Код B InitReset undefvec: B undefvec swivec: B swivec ... Потому что команда B использует относительную адресацию. Если Вы переместите этот кусок кода в другое место (а Вы его копируете в нулевой адрес), то разница между текущим PC и адресом перехода изменится, а команда B ничего про это не знает. Объявленные адреса обработчиков через .word содержат АБСОЛЮТНЫЕ адреса обработчиков. Команда LDR то-же использует относительную адресацию, но Вы же копируете и собственно LDR .... и абсолютные адреса (всего 64 байта). Таким образом в команде LDR после копирования будет правильное смещение до слова в памяти, по которому лежит абсолютный адрес обработчика. Цитата 2) в стартапе вы не делаете ремап и не инициализируете стеки (это наверное связано с тем, что приложение простое и дано как пример?) 3) непонятет вот этот кусок: Код _startup: ldr r0, =0x12345678 mov r1, #0x14 str r0, [r1] bl main b _startup Обычно я видел, что в r0 кладется адрес ф-ции main, а потом bx r0 Ну этот кусок кода просто для того, что бы что-то было определенное, а не просто заглушка в виде xxx: B xxx Этот кусок кода можна, например, пройти отладчиком и смотреть на адреса и тп. Цитата 4) в линкер файле вы определяете размер секции векторов в 64 байта. Это потому, что там сначала идут ldr pc ... (7 штук и ноль), а потом 7 слов ? Всего векторов 8 (один резервный) плюс 8 абсолютных адресов обработчиков. Итого 16 слов по 4 байта. Всего 64 байта. В LPC, например ремапу подлежит только 64 первых байта флеш или ОЗУ. Ну и для ровного счета. Это называется "common practics". Цитата 5) в линкер скрипте секция .vectors вынесена отдельно и .text описывается дважды. Ранее вы советовали vectors вынести внутрь .text. Какой же способ правильный? Правильно и так и эдак. Все зависит от нужной в каждом конкретном случае линковки. Внесение .vectors внутрь .text облегчает написание скрипта, но менее гибко.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Сообщений в этой теме
romez777 прыгнуть на другой адрес в ROM Apr 5 2008, 08:17 Leen Не специалист, увы, но по моим соображениям:
- вну... Apr 6 2008, 07:54 romez777 Цитата(Leen @ Apr 6 2008, 10:54) Не специ... Apr 6 2008, 08:27  Сергей Борщ Цитата(romez777 @ Apr 6 2008, 11:27) Я со... Apr 7 2008, 09:54 r301 делал нечто похожее, но на lpc2378. Проблема была ... Apr 6 2008, 10:53 romez777 Цитата(r301 @ Apr 6 2008, 13:53) делал не... Apr 6 2008, 23:39 Leen А Вы можете сдампить прошивку контроллера и выложи... Apr 7 2008, 05:21 romez777 Цитата(Leen @ Apr 7 2008, 08:21) А Вы мож... Apr 7 2008, 06:25 Leen у Вас есть gdb. Но я им пользоваться не умею... За... Apr 7 2008, 09:29 romez777 Цитата(Leen @ Apr 7 2008, 12:29) у Вас ес... Apr 7 2008, 12:49 amw Цитата(romez777 @ Apr 5 2008, 11:17) Прив... Apr 7 2008, 11:24 romez777 Цитата(amw @ Apr 7 2008, 14:24) А что, со... Apr 8 2008, 03:34 romez777 Цитата(amw @ Apr 7 2008, 14:24) И дайте в... Apr 9 2008, 09:21  Сергей Борщ Цитата(romez777 @ Apr 9 2008, 12:21) Може... Apr 9 2008, 10:35   romez777 Здравствуйте,
большое спасибо за ценные замечания... Apr 10 2008, 05:47    Сергей Борщ Цитата(romez777 @ Apr 10 2008, 08:47) Обы... Apr 10 2008, 06:36     romez777 Приветствую.
Все немного проясняется, из мозаики ... Apr 10 2008, 14:46      amw Цитата(romez777 @ Apr 10 2008, 17:46) Все... Apr 11 2008, 07:56       romez777 Здравствуйте,
Цитата(amw @ Apr 11 2008, 10... Apr 12 2008, 04:11        amw Цитата(romez777 @ Apr 12 2008, 07:11) Здр... Apr 12 2008, 07:30         romez777 Большое спасибо за подробные разъяснения!
Цит... Apr 14 2008, 07:28          amw Цитата(romez777 @ Apr 14 2008, 10:28) Бол... Apr 14 2008, 13:22           romez777 Цитата(amw @ Apr 14 2008, 16:22) Примерно... Apr 15 2008, 13:31            Сергей Борщ Цитата(romez777 @ Apr 15 2008, 16:31) Пос... Apr 15 2008, 13:50             romez777 Здравствуйте.
Цитата(Сергей Борщ @ Apr 15 20... Apr 16 2008, 00:19              romez777 Немного покрутил, но все равно не работает Сейчас... Apr 17 2008, 07:51   romez777 Цитата(Сергей Борщ @ Apr 9 2008, 13:35) П... Apr 12 2008, 01:28     romez777 Цитата(amw @ Apr 19 2008, 13:05) Мой тулч... Apr 21 2008, 02:08      amw Цитата(romez777 @ Apr 21 2008, 05:08) Отл... Apr 21 2008, 08:07       romez777 ЦитатаПотому что команда B использует относительну... Apr 22 2008, 06:06        amw Цитата(romez777 @ Apr 22 2008, 09:06)
Фа... Apr 22 2008, 08:49         romez777 ЦитатаКод/* Copy exception vectors in RAM */
LDR... Apr 23 2008, 00:27          amw Цитата(romez777 @ Apr 23 2008, 03:27) При... Apr 23 2008, 08:16           romez777 ЦитатаНу Вы хоть исправили значение для конца цикл... Apr 25 2008, 05:38            amw Цитата(romez777 @ Apr 25 2008, 08:38) В с... Apr 25 2008, 10:07             romez777 ЦитатаДа, правильно понимаете. Приложение должно и... Apr 26 2008, 01:30              amw Цитата(romez777 @ Apr 26 2008, 04:30) Но ... Apr 28 2008, 11:33               romez777 Цитата(amw @ Apr 28 2008, 14:33) Лучше вс... May 6 2008, 14:58                amw Цитата(romez777 @ May 6 2008, 17:58) Прив... May 6 2008, 18:01                 romez777 Приветствую.
Выкладываю полный архив со всеми инк... May 7 2008, 14:49                  amw Цитата(romez777 @ May 7 2008, 17:49) Прив... May 7 2008, 15:10                   romez777 ЦитатаВ дизассемблере даны КОДЫ КОМАНД. В бинарике... May 8 2008, 06:10                    amw Цитата(romez777 @ May 8 2008, 09:10) Да, ... May 8 2008, 09:12                     romez777 ЦитатаВсе проверил - видимо, дело в ключах компиля... May 8 2008, 11:08                      amw Цитата(romez777 @ May 8 2008, 14:08) А во... May 8 2008, 11:20                       romez777 Цитата(amw @ May 8 2008, 14:20) Ну так у ... May 9 2008, 05:37                        amw Цитата(romez777 @ May 9 2008, 08:37) Я та... May 11 2008, 10:35                         romez777 Цитата(amw @ May 11 2008, 13:35) 1. У Вас... May 13 2008, 05:28                          amw Цитата(romez777 @ May 13 2008, 08:28) Вот... May 13 2008, 07:16                          aaarrr Цитата(romez777 @ May 13 2008, 09:28) В с... May 13 2008, 09:12           Сергей Борщ Цитата(amw @ Apr 23 2008, 11:16) Чтобы от... Apr 25 2008, 09:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|