Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Монитор SAM-BA
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
DpInRock
Спаял наконец AT9SAM9261 плату.
И обнаружил следущую вещь.
1. Система команд SAM-BA в даташите неполная. Команда G (jump to address) может иметь параметр, который отвечает за REMAP.
Т.е. делать ремап или не делать.
Пример.
G00000# - делает джамп без ремапа, т.е. моментально вылазит BootRom/
G00000,1# - делает ремап. Программа стартует, загрузчик вырубается.
2. В Самбе уже под виндами в юзергайде неправильно описали команду send_file. Почему-то не указали параметр, который также отвечает за ремап. Т.е. сама программа подсказывает, что одного параметра не хватает. И этот параметр зовется remap.

Вопрос. Кто с этим сталкивался. Чего-нибудь еще там забыли сказать важного?
Или это я глючу после пайки деталей 0204?
aaarrr
Цитата(DpInRock @ Mar 25 2009, 19:44) *
Чего-нибудь еще там забыли сказать важного?

Весьма вероятно. SAM-BA - программа минимальной работоспособности, поэтому лучше не искать новые сюрпризы, а быстрее переходить на свое ПО.
DpInRock
Так бог с ней виндовской самбой. Тут странности с прцессорным монитором, который начального загрузчика изображает.
aaarrr
Ну, и его туда же: dataflash->свой загрузчик->...
DpInRock
AAARRR, вы умный. Как поступить.
Компилятор п адресу сброса ставит команду перехода LDR PC. Скажем, по адресу 244. А он находится, еще в области ПЗУ. Команда G монитора как-то не хочет делать ремап перед джампом. НЕ желает.
Программа оттранслированная на неремапленные адреса - работает.

Или команда G делает ремап перед джампом, но я что-то не так делаю?
aaarrr
Что-то я не очень понимаю ваши затруднения. Если у Вас внешняя флеш, то зачем команда G? Просто загружаетесь с нее при BMS=0. Или программа загружается во внутреннюю SRAM?
DpInRock
Программа грузится в внутреннюю SRAM. Флэши пока нет. Чтобы что-то во флэш записаить - надо все равно какую-то программу грузить. Либо отдельным программатором. А это неудбно очень.

Так вот. Загрузить я могу с адреса 30 0000. Это как раз SRAM. Но проограмма транслируется на адреса 0-26000. Т.е на уже ремапленные.
А первой командой компилятор ставит загрузки PC из таблицы, где указан адрес 224. Т.е. на уже ремапленный. А кто проц ремапить будет? Без ремапа проц идет по адресу 224, а там его поджидает ROM. И привет.

Вот собираюсь узнать как разместить процедуру по абсолютному адресу. Она будет ремапить и джампить на 0.
Т.е. загрузка по 30 0000. Далее выплнение команды Gxxxxxx - где xxxxx - адрес хитрой процедуры. Ну а дале - будет все нормально. Проц ремапится и начнет выполнятся начальный старт.
Так удобн отладку делать. Сразу в память. Эта же программа вполне будет работать и из флэша. Ибо Атмел уверяет, что при загрузке из флэша загрузчик ремап делает.

Программа грузится в внутреннюю SRAM. Флэши пока нет. Чтобы что-то во флэш записаить - надо все равно какую-то программу грузить. Либо отдельным программатором. А это неудбно очень.

Так вот. Загрузить я могу с адреса 30 0000. Это как раз SRAM. Но проограмма транслируется на адреса 0-26000. Т.е на уже ремапленные.
А первой командой компилятор ставит загрузки PC из таблицы, где указан адрес 224. Т.е. на уже ремапленный. А кто проц ремапить будет? Без ремапа проц идет по адресу 224, а там его поджидает ROM. И привет.

Вот собираюсь узнать как разместить процедуру по абсолютному адресу. Она будет ремапить и джампить на 0.
Т.е. загрузка по 30 0000. Далее выплнение команды Gxxxxxx - где xxxxx - адрес хитрой процедуры. Ну а дале - будет все нормально. Проц ремапится и начнет выполнятся начальный старт.
Так удобн отладку делать. Сразу в память. Эта же программа вполне будет работать и из флэша. Ибо Атмел уверяет, что при загрузке из флэша загрузчик ремап делает.
aaarrr
Можно немного подправить стартап, и ремапить самой загружаемой программой. Для этого по нулевому адресу меняем ldr pc, ... на b ..., затем ремапим процессор и делаем финт ушами:
Код
        bic        pc, pc, #0x300000
        nop


Ну а саму программу линкуем под нулевой адрес, естественно.

UPD: И кэш инструкций надо не забыть грохнуть сначала.
DpInRock
Надеюсь отыщу как убивать кэш. Вроде мелькало где-то.

Вообще это тогда будет частный случай. Если эту же программу проц будет грузить из флэша будет облом. Он ремап сам делает перед джампом на 0. Ну, так уверяет даташит. Прямым текстом.

Все-таки выгоднее тогда изобразить функцию по какому-нибудь известному адресу. Она вызываться будет исключительно снаружи. И никому не будет мешать. Вот щас пороюсь, узнаю, как такую функцию писать наиболее просто.

Хотя первой можно поставить команду которая идет по относительному адресу. А ей будет все равно ремаплено или нет. А уж дальше разбираться.
Но все это как-то странно. У атмела на этот счет ни гугу. Типа, чтоб сами разбирались?
aaarrr
Цитата(DpInRock @ Mar 26 2009, 20:10) *
Надеюсь отыщу как убивать кэш. Вроде мелькало где-то.

Код
        mrc        p15, 0, r0, c1, c0, 0    ; read CP15 register 1 into r0
        bic        r0, r0, #0x01            ; clear MMU enable
        bic        r0, r0, #(0x01 << 0x0c)    ; disable I Cache
        bic        r0, r0, #(0x01 << 0x02)    ; disable D Cache
        mcr        p15, 0, r0, c1, c0, 0    ; write value back


Цитата(DpInRock @ Mar 26 2009, 20:10) *
Вообще это тогда будет частный случай. Если эту же программу проц будет грузить из флэша будет облом. Он ремап сам делает перед джампом на 0. Ну, так уверяет даташит. Прямым текстом.

Не будет он делать ремап, если это внешняя флеш (не dataflash). Состояние ремапа всегда можно проверить.

Цитата(DpInRock @ Mar 26 2009, 20:10) *
У атмела на этот счет ни гугу. Типа, чтоб сами разбирались?

У Атмела remap - это просто старая традиция. Ну, и разбираться там особо нечего.
DpInRock
Как раз датафлэш у меня. Ничего особенного. И загрузчик, обнаруживая прогу в датафлэш закачивает ее, делает ремап и джамп.
Это вроде точно (типа, так написано).
aaarrr
Цитата(DpInRock @ Mar 26 2009, 20:58) *
Это вроде точно (типа, так написано).

Да, это точно. Тогда проверяйте состояние ремапа и переключайте только когда это необходимо.
DpInRock
Совсем просто расположить функцию по адресу как-то тяжело.
Решил дело проще.

#pragma location=0x200
unsigned long q[5]={code1, code2, code3,code4,code5};
Где сразу забью код кманд ремапа и джампа.
Потом этот массив можно и использовать повторно. Для чего-нибудь.
DpInRock
А оказалось еще проще.

Закачал себе 5.4 ИАР. И там в стартапе для 9261 в комментариях к этому джаму по нулевому адресу написан кммент, типа засунь сюда относительный джам, ежели требуется ремап. Вот спасибо иаровцам.

Теперь придется смотреть систему команд. Понятия не имею как выглядит этот относительный джамп.
aaarrr
Цитата(DpInRock @ Mar 26 2009, 22:58) *
Теперь придется смотреть систему команд. Понятия не имею как выглядит этот относительный джамп.

b <метка> Но систему команд изучите обязательно.
DpInRock
Палучилось. !!!!!! Целый день, ё, мучался. Спасибо Иару 5 и принявшим участие в горькой судьбе начинающего армовладельца.
Поправил на релятивный бранч и вставил ремап без проверки. Чего там проверять. Надеюсь, не будет неопознанных стартов с нулевого адреса.

Но до чего же странно устроены ихние армвские команды.
Чтобы загнать число в регистр они делают вот что:

Требуется записать по адресу FFFF EE00 число 3.
Берем инвертируем FF для получения FFFF FF00 MVN R0, #0xFF
Потом инвертируем пару бит для получения FFFF EE00 BIC R0, R0, #0x1100.

Теперь в регистре R0 требуемый адрес. У него что, все команды только из одного слова состоятьт могут?
И так Си с каждой константой мучается? Надо будет посмотреть.

O!
А если использовать команду BL, то в R14 запишется PC? Это значит, я смогу узнать откуда стартовал и требуется ли ремап?
Невреддно читать систему команд. Си как-то настраивает на леность в этом вопросе.
aaarrr
Цитата(DpInRock @ Mar 27 2009, 00:20) *
У него что, все команды только из одного слова состоятьт могут?

Да.

Цитата(DpInRock @ Mar 27 2009, 00:20) *
И так Си с каждой константой мучается? Надо будет посмотреть.

Компилятор как раз не мучается, в отличие от человека smile.gif
DpInRock
Да. Посмотрю. Чтоб по крайней мере узнать какие переменные лучше использовать. Похоже на то, что все одиноко стоящие переменные лучче собрать в массив. Чтоб он так с каждым адресом не суетился. Не сильно наглядно, но экономно.
aaarrr
Да не надо в массив, у Вас же не будет сотен отдельных глобальных переменных. А экономия копеечная в лучшем случае выйдет, при полной потере читаемости.
DpInRock
У меня любительская радиостанция на стапеле. Там стоко переменных, что жуть берет.
А читаемость - полдня дефайнов и будет читаться как роман. Но это я так. Пока проблема памяти не стоит. Инит всей периферии занял всего 1.5К бинарника.

Кстати, я сделал на перемычках переключение 16 и 24 битного цвета.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.