реклама на сайте
подробности

 
 
> прыгнуть на другой адрес в ROM
romez777
сообщение Apr 5 2008, 08:17
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую,

MCU: at91sam7s256
toolchain: Yagarto (gcc-4.2.1)

Есть два простых приложения. Образ первого (размером XXX байт) расположен по адресу 0x100000 (т.е. в самом начале флеша), печатает строку в DBGU и переходит на адрес, по которому расположен другой образ.

Второй образ лежит по адресу 0x100000 + XXX . Все что он делает это выводит другую строку в DBGU и на этом успокаивается.

Но проблема в том, что переход по этому адресу не происходит! Адреса прописал верно, скрипты линкера подлправил. Не знаю, что я упустил...

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

Спасибо!
Прикрепленные файлы
Прикрепленный файл  fwdat91boot.zip ( 4.81 килобайт ) Кол-во скачиваний: 122
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
amw
сообщение Apr 17 2008, 08:07
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 18 2008, 02:17
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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 только один раз.
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 18 2008, 08:28
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 19 2008, 04:02
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

Спасибо за ваше терпение в ответах на мои глупые вопросы smile.gif

Цитата(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. Какой же способ правильный?
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 19 2008, 10:05
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(romez777 @ Apr 19 2008, 07:02) *
Приветствую.

Спасибо за ваше терпение в ответах на мои глупые вопросы smile.gif
Хорошо. Итак, берем линкер скрипт из поста 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.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 21:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01731 секунд с 7
ELECTRONIX ©2004-2016