|
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.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Apr 20 2007, 10:45
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Не совсем то, что спрашивается, поскольку делает remap при старте на ОЗУ: Код @-------------------------------------------------------- @ Memory controller definitions .equ MC_BASE, 0xFFFFFF00 @ MC Base Address .equ MC_RCR, 0x00 @ MC_RCR Offset .equ MC_FMR, 0x60 @ MC_FMR Offset @-------------------------------------------------------- @ Memory remap _check_mapping: ldr r0, =0x200014 mov r1, #0x14 ldr r2, =0x12345678 str r2, [r0] ldr r0, [r1] cmp r0, r2 beq _check_mapping_end _mem_remap: @ RAM remap ldr r0, =MC_BASE mov r1, #1 str r1, [r0, #MC_RCR] _check_mapping_end: mov r0, #0x14 mov r1, #0 str r1, [r0] Сначала проверка, что сейчас по нулевому адресу. Записывается 0x12345678 в ОЗУ на неиспользуемый вектор, а потом сравнивается с нулевым смещением. И не забудте првильно установить вектора Exceptions для обоих случаев.
Сообщение отредактировал amw - Apr 20 2007, 10:46
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Apr 20 2007, 10:55
|

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

|
Цитата(SpiritDance @ Apr 20 2007, 08:52)  Итак цель - бутром записывающийся в конец флеш, для бутрома нужны прерывания, для того чтобы его собственная таблица векторов не затиралась приложением нужно также хранить ее в конце флеша, при старте переписывать в RAM и делать remap, при выходе из загрузчика делать remap обратно на флеш. Системная ошибка. Загрузчик вместе со своими векторами живет в начале ФЛЕША, а пользовательское приложение работает в ремапе. Этим мы гарантируем, что при любом слете в процессе перезаписи проц будет в состоянии стартануть и попасть хотя бы в загрузчик. Цитата(SpiritDance @ Apr 20 2007, 08:52)  Так вот как это грамотно сделать в IARе? может есть где проект под IAR с ремапом а? Вот рыба. проект состоит из двух - загрузчика и приложения. Действия загрузчика - 1) инициализация ноги PIO принудительного старта загрузчика и PLL. 2) проверка был ли это старт из приложения, если да - запуск собственно загрузчика. 3) проверка был ли сигнал принудительного старта, если да - запуск собственно загрузчика. 4) проверка КС приложения. Если не совпала - запуск загрузчика. 4a) Если совпала - копирование векторов приложения в ОЗУ, ремап, переход на вектор сброса (старт приложения). ---- действия 1-4 происходят в __low_level_init() ---- 5) собственно загрузчик. Сброс периферии, проверка был ли это вызов из приложения, если нет - ждать команду начала прошивки. Если из периферии - пропустить ожидание команды, команда была получена приложением. 6) собственно прошивка - допишите во вкусу 7) рестарт. После рестарта снова попадем в загрузчик, он проверит КС и т.д. Для приложения даю файл линкера. Единственное, что требуется от приложения - не трогать ремап. В остальном-обычная программа, правда слинкованная в новые адреса. Там же пример старта загрузчика по получению команды апдейта прошивки. В общем несколько сумбурно, но работает. Выдрал из проекта, если что - спрашивайте. Будет интерес - сделаю законченный проект -шаблон, но не сегодня.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
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)
|
|
|
|
|
Nov 21 2007, 11:54
|

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

|
Цитата(Waso @ Nov 21 2007, 09:13)  1. Если я ставлю линкеру например -DROMSTART=00008000 в программе, то размер выходного бинарника не меняется. Значит вначале файла идут вектора, а затем программа как и в обычном случае, но со смещенными переходами? Трудно сказать, не видя файла линкера. Зависит от того, как описан сегмент векторов - он либо линкуется в нулевые адреса ( -Z(CODE)INTVEC=00-3F ) либо начиная с ROMSTART (-Z(CODE)INTVEC=ROMSTART-ROMEND или подобное). Цитата(Waso @ Nov 21 2007, 09:13)  2. Если я хочу прошить в чистый кристалл сразу и прогу и бутлодер, то как быть с векторами программы? Получается, нужно самому в этом случае создавать табличку векторов перед началом кода программы чтобы все это вместе вело себя также как и после перепрошивки проги бутом. Я опишу как делаю я. Насколько это правильно - со стороны, наверное, виднее. Я использую AES Loader и на мегах и на ARMах. У меня загрузчик и приложение - два отдельных проекта. Я прошиваю сначала загрузчик, потом приложение. В процессе этого заодно тестируется канал связи. Если мне надо прошивать все сразу программатором (пока нужно было только на мегах) - я прошиваю загрузчик без лок-битов, прошиваю загрузчиком приложение, убеждаюсь, что все работает, считываю программатором всю память, открываю полученный .hex текстовым редактором и удалаю все строки, содержащие одни 0xFF. Получаю прошивку для масового производства. В голове крутится еще такой вариант - если прошиваем .hex, то можно "склеить" два файла (загрузчика и приложения) текстовым редактором или утилитой вроде srecord. Если прошивка делается из ИАРа через JTAG, то наверняка можно склеить полученный файл загрузчика с приложением при помощи postlink (не пробовал, не подскажу). Про вектора - они находятся в начале приложения, загрузчик их копирует в начало ОЗУ и делает ремап. Поскольку приложение - отдельный проект, то для него естественным образом получаются и таблица векторов, и инициализация памяти.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 23 2007, 09:50
|

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

|
Цитата(Waso @ Nov 23 2007, 10:38)  но отладчик упорно начинает работать с нулевого адреса даже если ROMSTART=00100000 То же самое будет происходить и в железе. По нулевой адрес в зависимости от ремап/не ремап должна зеркалится команда перехода на загрузчик (с адреса 0x00100000) или на приложение (зеркалится с адреса 0x00200000, куда ее копирует загрузчик). Цитата(Waso @ Nov 23 2007, 10:38)  . Какнибудь можно его научить учитывать ремап/неремап при запуске? можно. в .mac - файле написать соответствующий скрипт. Напишите, что конкретно он должен сделать, я накидаю скрипт. Пока непонятно зачем, но накидаю.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 23 2007, 10:01
|

Местный
  
Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470

|
Цитата(Сергей Борщ @ Nov 23 2007, 16:50)  нулевой адрес в зависимости от ремап/не ремап должна зеркалится команда перехода на загрузчик (с адреса 0x00100000) или на приложение (зеркалится с адреса 0x00200000, куда ее копирует загрузчик).можно. в .mac - файле написать соответствующий скрипт. Отладчик не зеркалит флеш в нулевые адреса при старте. Это и надо исправить. Отлаживаю пока в симуляторе. Оттого и удивляюсь насчет брейкпоинтов. Проц - AT91SAM7X256, ИДЕ IAR 440A
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|