|
sam256 remap, need example :( |
|
|
|
Apr 20 2007, 09:52
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Люди я чето непонимаю. Итак цель - бутром записывающийся в конец флеш, для бутрома нужны прерывания, для того чтобы его собственная таблица векторов не затиралась приложением нужно также хранить ее в конце флеша, при старте переписывать в RAM и делать remap, при выходе из загрузчика делать remap обратно на флеш. Так вот как это грамотно сделать в IARе?, кроссворксовский код Код mov r8, #0x00200000 ldr r9, =_vectors ldmia r9!, {r0-r7} stmia r8!, {r0-r7} ldmia r9!, {r0-r6} stmia r8!, {r0-r6} ldr r0, =MC_RCR_RCB strb r0, [r10, #MC_RCR_OFFSET] просто так не проходит. RAMSTART в линкер-скрипте сделал 00200100- пофиг, без команды remap работает с ней беда, до main проц не доходит. Думаю причина в том, что remap как -то не вяжется с инитом компилера? причем посмотреть отладчиком что происходит тоже не очень удается. Что такое RSEG INTRAMSTART_REMAP RSEG INTRAMEND_REMAP в статртапе? недопонял. может есть где проект под IAR с ремапом а?
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
 |
Ответов
|
Apr 20 2007, 13:21
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Цитата(Сергей Борщ @ Apr 20 2007, 13:13)  Размер страницы - 128 байт, размер сегмента векторов - вдвое меньше. Чтобы переписать остальные вектора надо предваритально затереть их все, вместе с вектором ресета. Не понял причем здесь размер страницы. Я по вектору ресета всегда в лоб пишу команду "b reset_загрузчика" если идет запись в начало флеш - это все что меняется в исходной программе. Адрес, который реально был в программе запоминается и по нему происходит прыжок в конце работы загрузчика. Правда нужно еще добавить вычисления, когда в начале программы стоит инструкция "ldr pc..". Но мысль насчет того что команда затирается понятна. Все таки я что-то не пониммаю насчет remap. В приведенных примерах вроде нет никакого шамантсва с pc.Судя по логике после этой команды pc естественно не меняется и так как сейчас код выполняется из Internal Memory Area 0, то после подсовывание на это место RAM получается фигня. Вопрос - каким образом перескочить на выполнение кода из Internal Memory Area 1? Или я вообще все не так понял?
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Apr 20 2007, 15:09
|

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

|
Цитата(SpiritDance @ Apr 20 2007, 12:21)  В приведенных примерах вроде нет никакого шамантсва с pc. Да, вместо этого шаманство в файле линкера. Загрузчик исполняется не с отремапленых адресов 0x0000.... а с реальных адресов флеш 0x01000000.... Поэтому после ремапа его код остается на месте. Именно для этого я положил в архив исправленный загрузчик для иара FlashAT91SAM7Sx.d79, ибо родной из-за ошибки умеет писать только в адреса 0x00..... Цитата(SpiritDance @ Apr 20 2007, 12:21)  Адрес, который реально был в программе запоминается и по нему происходит прыжок в конце работы загрузчика. А если программа пользователя хочет подвесить свои обработчики на остальные вектора? Можно конечно там сразу поставить LDR PC, AIC_IVR, но это уже ограничение, а как быть с FIQ?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 20 2007, 16:35
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Цитата(Сергей Борщ @ Apr 20 2007, 16:09)  Да, вместо этого шаманство в файле линкера. Загрузчик исполняется не с отремапленых адресов 0x0000.... а с реальных адресов флеш 0x01000000.... Я уже понял вроде. Пасибо. Туплю бывает. Добавил еденички, только после команды ремап все равно не работает код.  Прерывания отключены и всякие копирования векторов в рам тоже закоменчены. Отладкик такой код прошивать-отлаживать уже отказывается, наверно надо ковырятся в mac-файле. А без ремапа работает - флешка шьется читается, нормально все.  Волшебство. Цитата(Сергей Борщ @ Apr 20 2007, 16:09)  А если программа пользователя хочет подвесить свои обработчики на остальные вектора? Можно конечно там сразу поставить LDR PC, AIC_IVR, но это уже ограничение, а как быть с FIQ? Так, еще раз. Я при заливке программы через бутром меняю ей только вектор ресета, все остальное остается как есть.
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Apr 20 2007, 19:21
|

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

|
Цитата(SpiritDance @ Apr 20 2007, 15:35)  Отладкик такой код прошивать-отлаживать уже отказывается, наверно надо ковырятся в mac-файле. Хм. У меня работает. Как ругается когда не прошивает? У меня просто вис, попробуйте мой прошивальщик положить вместо штатного. Цитата(SpiritDance @ Apr 20 2007, 15:35)  А без ремапа работает - флешка шьется читается, нормально все.  Волшебство. Посмотрите в окне памяти что творится в области векторов. Окно дизассемблера не обновляется, а в окне памяти все изменения видны сразу. Цитата(SpiritDance @ Apr 20 2007, 15:35)  Так, еще раз. Я при заливке программы через бутром меняю ей только вектор ресета, все остальное остается как есть. Да, меня заклинило - у вас же загрузчик в конце памяти. Т.е. остается нехорошесть в виде переписывания сегмента с векторами. Что-то там не сложилось и прибор надо возвращать к разработчику вместо повтороной перепрошивки на месте. Цитата(d__ @ Apr 20 2007, 17:40)  при старте она проверяет был ли ремап Уже одно это действие на SAM7 нетривиально - надо изменить что-то в начале ОЗУ и посмотреть как это отразилось в нулевых адресах. После чего вернуть исходное значение. В моем варианте все гораздо проще - для старта приложения скопировал вектора приложения в начало ОЗУ, сделал ремап, перешел на адрес 0. Переход из приложения обратно в загрузчик - запретил прерывания, сделал ремап, перешел на адрес 0.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
SpiritDance sam256 remap Apr 20 2007, 09:52 amw Не совсем то, что спрашивается, поскольку делает r... Apr 20 2007, 10:45 Сергей Борщ Цитата(SpiritDance @ Apr 20 2007, 08:52) ... Apr 20 2007, 10:55 d__ А вот если так:
Если программа должна работать из... Apr 20 2007, 18:40 Waso Есть несколько непоняток по скрещиванию программы ... Nov 21 2007, 07:13 Сергей Борщ Цитата(Waso @ Nov 21 2007, 09:13) 1. Если... Nov 21 2007, 11:54 Waso У меня основная программа закачивает обновление че... Nov 23 2007, 08:38 Сергей Борщ Цитата(Waso @ Nov 23 2007, 10:38) но отла... Nov 23 2007, 09:50  Waso Цитата(Сергей Борщ @ Nov 23 2007, 16:50) ... Nov 23 2007, 10:01   Сергей Борщ Цитата(Waso @ Nov 23 2007, 12:01) Отлажив... Nov 23 2007, 10:55 Waso Однако подвисает симулятор при запуске. Но всеравн... Nov 26 2007, 06:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|