Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Переключить режим работы ARM
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
impatt
Сорри за тупой вопрос.
Я не спец в АРМ-ах, но кое-что надо сделать, не познавая весь мир со стадии "когда Земля была жидкая". Посему нуждаюсь в конкретных советах: у меня есть консоль OpenOCD, подключенного к ARM1136, я могу загружать туда код и исполнять его, могу даже сделать что-то на ассемблере, скомпилировать и выдрать бинарный образ из ELF-контейнера. Надо переключить состояние с Abort или Undefined Instruction на Supervisor. Беда в том, что не знаю до тонкостей ARM-ассемблера и особенностей работы.
Собсна, вот.
Заранее спасибо.
Aurochs
Вот фрагмент кода на ассемблере, который позволит переключиться в режим супервизора
Код
  mrs r0, cpsr
  bic r0, r0, #0x1F
  orr r1, r0, #0x13
  msr cpsr_cxsf, r1
impatt
Цитата(Aurochs @ Mar 18 2010, 16:55) *
Вот фрагмент кода на ассемблере, который позволит переключиться в режим супервизора

Вольшое спасибо, похоже на то, что требуется smile.gif
sergeeff
Если не секрет. Откуда возникла такая потребность? Оба режима Abort или Undefined Instruction - это "аварийные режимы" процессора. Если вы в них попали, надо выяснять почему и исправлять программу. А вываливаться из них какой смысл?
impatt
Цитата(sergeeff @ Mar 19 2010, 17:57) *
Если не секрет. Откуда возникла такая потребность? Оба режима Abort или Undefined Instruction - это "аварийные режимы" процессора. Если вы в них попали, надо выяснять почему и исправлять программу. А вываливаться из них какой смысл?

Не секрет, конечно: после сброса и до ввода в режим отладки, процессор успевает исполнять какой-то мусор с флэшки. Мне же его надо иметь в нормальном состоянии. Собственно, вот smile.gif
Вообще, я пока приведённым рецептом не воспользовался - нашёл способ сделать инче, но это частный случай, а так-то рецептик себе на манжету запишу smile.gif
defunct
Цитата(sergeeff @ Mar 19 2010, 14:57) *
А вываливаться из них какой смысл?

Да есть много причин возвращаться из Abort'а в svsr.. К примеру определить объем реально подключенной SDRAM памяти.
Плюсуете к адресу по мегабайту - натыкаетесь на датааборт - вот собсно и верхняя граница памяти.
aaarrr
Цитата(defunct @ Mar 21 2010, 03:32) *
Плюсуете к адресу по мегабайту - натыкаетесь на датааборт - вот собсно и верхняя граница памяти.

А контроллер памяти откуда вдруг знает о границах? Получите overlap и все.

P.S. impat, сменили б вы юзерпик - глаза можно сломать, чесслово!
defunct
Цитата(aaarrr @ Mar 21 2010, 03:06) *
А контроллер памяти откуда вдруг знает о границах? Получите overlap и все.

В реальной системе получаю abort. Откуда контроллер памяти знает меня не интересовало.
Если не нравится пример с памятью - другой пример - сохранение svsr fault регистров при краше.
aaarrr
Цитата(defunct @ Mar 21 2010, 04:45) *
В реальной системе получаю abort. Откуда контроллер памяти знает меня не интересовало.

А вот мне интересно. Можно узнать, что за система, и при каких условиях получается abort?
defunct
Цитата(aaarrr @ Mar 21 2010, 03:49) *
А вот мне интересно. Можно узнать, что за система, и при каких условиях получается abort?

SoC на двух 1136 ARM'ах, чей там SDRAM контроллер, - не знаю... Дает аборт при доступе к несуществующей памяти, даже если в MMU ARM'ов помечено, что память там есть.
aaarrr
Цитата(defunct @ Mar 21 2010, 04:58) *
SoC на двух 1136 ARM'ах, чей там SDRAM контроллер, - не знаю... Дает аборт при доступе к несуществующей памяти, даже если в MMU ARM'ов помечено, что память там есть.

Хорошо, а как инициализируется этот контроллер - знаете? Просто ведь неоткуда знать ему, что там и в каком количестве снаружи прикручено, если только кто-то (сам процессор, точнее) не подскажет.
А вот генерить abort там, где ему было сказано, что памяти нет - это пожалуйста.
defunct
Цитата(aaarrr @ Mar 21 2010, 04:10) *
Хорошо, а как инициализируется этот контроллер - знаете?

Мой application грузится бутлоадером сразу в SDRAM, стало быть SDRAM контроллер уже настроен бутлоадером.
Количество памяти в системе мой application узнает описанным выше способом.
aaarrr
Тогда вопросов более нет.
sergeeff
Цитата(defunct @ Mar 21 2010, 05:19) *
Мой application грузится бутлоадером сразу в SDRAM, стало быть SDRAM контроллер уже настроен бутлоадером.
Количество памяти в системе мой application узнает описанным выше способом.


Существуют более интеллигентные способы узнать объем памяти без вваливания в Abort. Я таким пользуюсь года три.
aaarrr
Цитата(sergeeff @ Mar 21 2010, 15:27) *
Существуют более интеллигентные способы узнать объем памяти без вваливания в Abort. Я таким пользуюсь года три.

Интеллигентных способа, как я понимаю, здесь два:
1. Получить значение объема от bootloader'а
2. Прочитать конфигурацию контроллера памяти

Попытка выяснить объем самостоятельно неминуемо приведет к abort'у.
sergeeff
Завтра с работы пришлю процедуру без входа в Abort.
aaarrr
Цитата(sergeeff @ Mar 21 2010, 23:26) *
Завтра с работы пришлю процедуру без входа в Abort.

Не надо процедуру. Принцип в двух словах изложите.
Как определить границу памяти без входа в abort, если при обращении мимо этот самый abort однозначно генерируется?
sergeeff
В u-boot есть такая функция ram_size:

Код
static long ram_size(ulong *base, long maxsize)
{
    volatile long    *test_addr;
    volatile ulong    *base_addr = base;
    ulong        ofs;        /* byte offset from base_addr */
    ulong        save;        /* to make test non-destructive */
    ulong        save2;        /* to make test non-destructive */
    long        ramsize = -1;    /* size not determined yet */

    save = *base_addr;        /* save value at 0 so can restore */
    save2 = *(base_addr+1);    /* save value at 4 so can restore */

    /* is any SRAM present? */
    *base_addr = 0x5555aaaa;

    /* It is important to drive the data bus with different data so
     * it doesn't remember the value and look like RAM that isn't there.
     */
    *(base_addr + 1) = 0xaaaa5555;    /* use write to modify data bus */

    if (*base_addr != 0x5555aaaa)
    ramsize = 0;        /* no RAM present, or defective */
    else {
    *base_addr = 0xaaaa5555;
    *(base_addr + 1) = 0x5555aaaa;    /* use write to modify data bus */
    if (*base_addr != 0xaaaa5555)
        ramsize = 0;    /* no RAM present, or defective */
    }

    /* now size it if any is present */
    for (ofs = 4; ofs < maxsize && ramsize < 0; ofs <<= 1) {
    test_addr = (long*)((long)base_addr + ofs);    /* location to test */

    *base_addr = ~*test_addr;
    if (*base_addr == *test_addr)
        ramsize = ofs;    /* wrapped back to 0, so this is the size */
    }

    *base_addr = save;        /* restore value at 0 */
    *(base_addr+1) = save2;    /* restore value at 4 */
    return (ramsize);
}



Вызываю ее при запрещенных прерываниях, соответственно нет и Abort
zltigo
Цитата(sergeeff @ Mar 22 2010, 10:03) *
Вызываю ее при запрещенных прерываниях, соответственно нет и Abort

Однако, нет слов sad.gif.
_Pasha
Цитата(sergeeff @ Mar 22 2010, 11:03) *
Вызываю ее при запрещенных прерываниях, соответственно нет и Abort

Разве оно работает? Вместо того чтобы писАть в рам адрес ячейки, чтобы оверлап детектировать, Вы пишете туда ахинею, совсем для этого не предназначенную sad.gif
sergeeff
Ну просветите! Надо объем памяти выяснить или в Abort влезть?

По поводу "Нет слов". Может это тлетворное влияние понедельника, но не въехал в смысл фразы.

Пишу не я, а авторы u-boot.
zltigo
Цитата(sergeeff @ Mar 22 2010, 10:50) *
Пишу не я, а авторы u-boot.

Зачем тогда копипастите, то что не понимете, да и еще и добавляете отсебятину sad.gif?
sergeeff
Цитата(zltigo @ Mar 22 2010, 10:59) *
Зачем тогда копипастите, то что не понимете, да и еще и добавляете отсебятину sad.gif?


Уважаемый гуру!

Наверное у меня с утра приступ мозговой слабости. Буду признателен, если вы уделите некоторую толику своего времени для пояснения мне:
1. Чего я не понимаю.
2. В чем состоит отсебятина.

P.S. Безо всякого ехидства спрашиваю. Действительно не понял.
aaarrr
Цитата(sergeeff @ Mar 22 2010, 11:07) *
Действительно не понял.

Запрет прерываний на Abort ну никаким образом не распространяется.
zltigo
Цитата(sergeeff @ Mar 22 2010, 11:07) *
Чего я не понимаю.

Про осебятину с запретом прерыаний - ответили.
А не хотите понимать того, что Data Abort будет всегда при обращении к внешней памяти о которой не знает/не запрограммирован EMC. Есть/нет/работоспособна память это второе, а как запрограммирован EMC это первое.
sergeeff
Благодарю за ответы, переотдыхал, наверное.
defunct
Цитата(sergeeff @ Mar 22 2010, 09:03) *
В u-boot есть такая функция ram_size:
Код
static long ram_size(ulong *base, long maxsize)
{
....
}


Не знаю как насчет интеллигентности, но такой код выглядит куда более яснее и понятнее того, что вы привели:

Код
{
    V8 *p = 0x00;
    HANDLE h;

    GetExceptionVector( EXPVECT_DABT,  &h);
    SetExceptionVector( EXPVECT_DABT,  DabtDetHandler);

    while ( !DabtHappened )
    {
         p += 1*M;
         *p;
    }

    SetExceptionVector( EXPVECT_DABT, h);
    return (U32)p - 1;
}

Другое дело, что он работоспособен только после настройки EMC как выяснилось. sad.gif
impatt
Привет всем.
Есть кусок кода:
CODE
;
; Disable L2 cache
;
ldr r1, =CSP_BASE_REG_PA_L2CC
ldr r0, =0x0
str r0, [r1, #L2CC_CR_OFFSET]


Как я разумею:
1. "ldr r1, =CSP_BASE_REG_PA_L2CC" - загружает в r1 то, что содержится (а именно константа CSP_BASE_REG_PA_L2CC) в некоем адресе, заданном как смещение относительно PC. Так ?
2. "ldr r0, =0x0" - по аналогии, запись в r0 числа 0. Хотя, путь странноват. Неправильно понимаю ?
3. "str r0, [r1, #L2CC_CR_OFFSET]" - созранить значение из r0 в адрес, заданный как r1+ L2CC_CR_OFFSET. Верно понимаю ?

Спасибо.
scifi
По пунктам 1 и 2: запись "LDR reg, =число" значит загрузить число в регистр. При этом ассемблер сам выбирает реализацию. К примеру, если число - это 0, то он подставит инструкцию "MOV reg, #0". Может поиграть константой и сдвигами, если есть возможность. Иначе загрузит по смещению от PC.
Пункт 3. Верно.
aaarrr
Все верно понимаете. Вместо второго ldr логичнее написать mov r0, #0.
zltigo
Цитата(impatt @ Mar 24 2010, 13:55) *
Привет всем.

Moderator:
1.Мигающий Аватар убрал, раз на просьбы Вы не реагируете.
2.Темы захламляющие основные ветки форума объединил и перенес к начинающим. Настоятельно прошу не плодить темы с детскими вопросами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.