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

 
 
> прыгнуть на другой адрес в 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 7 2008, 11:24
Сообщение #2


Знающий
****

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



Цитата(romez777 @ Apr 5 2008, 11:17) *
Приветствую,

MCU: at91sam7s256
toolchain: Yagarto (gcc-4.2.1)

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

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

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

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

Спасибо!

А что, собственно, располагается по адресу 0x1004f8? А Вы что ожидаете по этому адресу? main()?
Так оно не должно там быть.
А startup код у Вас есть? Где он? В обоих программах?
И дайте вывод
Код
arm-elf-objdump -SD app1.elf
arm-elf-objdump -SD app2.elf

PS: insight просимулирует этот код, но без периферии. Да из eclipse на gdb при target sim. Не знаю, входит ли insight в Yagarto. Я сам собирал.

Сообщение отредактировал amw - Apr 7 2008, 11:29


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 9 2008, 09:21
Сообщение #3


Местный
***

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



Цитата(amw @ Apr 7 2008, 14:24) *
И дайте вывод
Код
arm-elf-objdump -SD app1.elf
arm-elf-objdump -SD app2.elf


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

Код
...
    ((funct)0x100580)();
  1002f2:    4b06          ldr    r3, [pc, #24]    (10030c <.text+0x30c>)
  1002f4:    f000 f80c     bl    100310 <.text+0x310>
...


Может быть стартап второго приложения нужно переписать (на данный момент он идентичен с первым), ведь первое приложение все уже инициализирует, во втором наверное достаточно только настроить стек и bss?

Есть еще какие-то идеи?

Спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 9 2008, 10:35
Сообщение #4


Гуру
******

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



Цитата(romez777 @ Apr 9 2008, 12:21) *
Может быть стартап второго приложения нужно переписать (на данный момент он идентичен с первым), ведь первое приложение все уже инициализирует, во втором наверное достаточно только настроить стек и bss?
А вот этого делать ни в коем случае не нужно. Мало ли что понанастраивало первое приложение. Второму виднее, что ему нужно и пусть оно настроит все, в чем нуждается. Иначе у вас будет слишком большая зависимость второго приложения от первого.


Цитата(romez777 @ Apr 9 2008, 12:21) *
Поизучал полученный дамп, но вроде никакого криминала не обнаружилось.
Нифига себе - никакого smile.gif
Код
00100000 <_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 */
  100000:    ea000010     b    100048 <InitReset>
Но этот код должен исполняться не с 100000, а с нуля, хотя расположен должен быть действительно по адресу 100000. Kоманда B, будучи перемещенная в адрес 0, прыгнет совсем не туда, куда вы хотите, ибо использует относительную адресацию. Вы попадете на адрес 0x48, и надо ли описывать, что произойдет после ремапа? В начале этого стартапа крупными буквами написано:
Цитата
Generic CStartup for KEIL and GCC No Use REMAP
Он предназначен для линковки с адреса 0.

Второе приложение у вас находится в том же секторе, что и первое. Интересно, как ваш загрузчик будет его стирать? Вместе с собой? Надо сразу распределять память под приложение правильно.

Прикладываю свой вариант стартапа, скриптов линкера и "рыбу" загрузчика. Проверка целостности приложения происходит в __low_level_init(). Если приложение можно запускать, оно тут же и запускается (приложение получает практически всю периферию нетронутой - только запущен PLL и настроено направление портов). Если нельзя - после возврата из __low_level_init() заканчиввается инициализация загрузчика и запуск main() собственно загрузчика. Приложение использует этот же стартап-код из crt.s.
Прикрепленные файлы
Прикрепленный файл  boot_GCC.zip ( 6.49 килобайт ) Кол-во скачиваний: 95
 


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 10 2008, 05:47
Сообщение #5


Местный
***

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



Здравствуйте,

большое спасибо за ценные замечания.

У меня все же путаница в голове о ремаппинге и пр. Вот мое видение - поправьте, если что-то не так.

После ресета АРМ переходит на адрес 0х0 и выполняет найденную там инструкцию; обычно по этому адресу располагается таблица векторов.

Обычно девайсы грузятся с ROM'a. Согласно даташиту, ПЗУ в SAM7 после сброса чипа (и до ремапа) доступно по адресу 0x0; также в любое время к флешу можно обратиться по адресу 0x00100000 - т.е. флэш "двуликий" smile.gif

RAM, в свою очередь, располагается по адресу 0x00200000. После ремапа - с адреса 0x0.

Как я понял, основная польза от ремапа в том, чтобы код выполнялся из SRAM, что значительно быстрее, и для модификации таблицы векторов. А также при работе с флешом (запись, чтение) - функции, оперирующие с флешем, должны выполняться из RAM.

Цитата(Сергей Борщ @ Apr 9 2008, 13:35) *
Но этот код должен исполняться не с 100000, а с нуля, хотя расположен должен быть действительно по адресу 100000.

Понятно, ведь ARM стартует с 0x0. Но тогда почему все атмеловские примеры для САМ7 привязываются к 0x100000 (это и по objdump видно, и по линк-скриптам)....

Цитата
Kоманда B, будучи перемещенная в адрес 0, прыгнет совсем не туда, куда вы хотите, ибо использует относительную адресацию. Вы попадете на адрес 0x48, и надо ли описывать, что произойдет после ремапа? В начале этого стартапа крупными буквами написано: Он предназначен для линковки с адреса 0.

Вот здесь опять конфуз в голове... Ведь после ремаппинга RAM также доступна с 0x0. Или здесь под адресами линковки подразумевается только internal flash?

Цитата
Второе приложение у вас находится в том же секторе, что и первое. Интересно, как ваш загрузчик будет его стирать? Вместе с собой? Надо сразу распределять память под приложение правильно.

Прикладываю свой вариант стартапа, скриптов линкера и "рыбу" загрузчика. Проверка целостности приложения происходит в __low_level_init(). Если приложение можно запускать, оно тут же и запускается(приложение получает практически всю периферию нетронутой - только запущен PLL и настроено направление портов). Если нельзя - после возврата из __low_level_init() заканчиввается инициализация загрузчика и запуск main() собственно загрузчика. Приложение использует этот же стартап-код из crt.s.

Я посмотрел стартап, не заметил больших отличий от того, что я использую (из атмеловского примера). Только в main.c вы делаете ремап (устанавливаете битик в MC_RCR). И есть разница в линкерном скрипте... Вот это:

Код
SECTIONS
{
  .vectors :
  {
    *(.vectors)
    KEEP(*(.vectors))
  } > REMAPED AT > ROM


говорит линкеру грузить секцию .vectors в область REMAPED, определенную ранее. правильно я понимаю?
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
|- - romez777   Цитата(amw @ Apr 7 2008, 14:24) А что, со...   Apr 8 2008, 03:34
||- - Сергей Борщ   Цитата(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
- - amw   Да есть такая проблема. Сделайте так КодТут убрать...   Apr 17 2008, 08:07
- - romez777   Приветствую. Цитата(amw @ Apr 17 2008, 11...   Apr 18 2008, 02:17
- - amw   Цитата(romez777 @ Apr 18 2008, 05:17) При...   Apr 18 2008, 08:28
- - romez777   Приветствую. Спасибо за ваше терпение в ответах н...   Apr 19 2008, 04:02
- - amw   Цитата(romez777 @ Apr 19 2008, 07:02) При...   Apr 19 2008, 10:05
- - 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 Текстовая версия Сейчас: 22nd June 2025 - 11:34
Рейтинг@Mail.ru


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