Jump to content

    

Переключить режим работы ARM

Сорри за тупой вопрос.

Я не спец в АРМ-ах, но кое-что надо сделать, не познавая весь мир со стадии "когда Земля была жидкая". Посему нуждаюсь в конкретных советах: у меня есть консоль OpenOCD, подключенного к ARM1136, я могу загружать туда код и исполнять его, могу даже сделать что-то на ассемблере, скомпилировать и выдрать бинарный образ из ELF-контейнера. Надо переключить состояние с Abort или Undefined Instruction на Supervisor. Беда в том, что не знаю до тонкостей ARM-ассемблера и особенностей работы.

Собсна, вот.

Заранее спасибо.

Share this post


Link to post
Share on other sites

Вот фрагмент кода на ассемблере, который позволит переключиться в режим супервизора

  mrs r0, cpsr
  bic r0, r0, #0x1F
  orr r1, r0, #0x13
  msr cpsr_cxsf, r1

Share this post


Link to post
Share on other sites
Вот фрагмент кода на ассемблере, который позволит переключиться в режим супервизора

Вольшое спасибо, похоже на то, что требуется :)

Share this post


Link to post
Share on other sites

Если не секрет. Откуда возникла такая потребность? Оба режима Abort или Undefined Instruction - это "аварийные режимы" процессора. Если вы в них попали, надо выяснять почему и исправлять программу. А вываливаться из них какой смысл?

Share this post


Link to post
Share on other sites
Если не секрет. Откуда возникла такая потребность? Оба режима Abort или Undefined Instruction - это "аварийные режимы" процессора. Если вы в них попали, надо выяснять почему и исправлять программу. А вываливаться из них какой смысл?

Не секрет, конечно: после сброса и до ввода в режим отладки, процессор успевает исполнять какой-то мусор с флэшки. Мне же его надо иметь в нормальном состоянии. Собственно, вот :)

Вообще, я пока приведённым рецептом не воспользовался - нашёл способ сделать инче, но это частный случай, а так-то рецептик себе на манжету запишу :)

Share this post


Link to post
Share on other sites
А вываливаться из них какой смысл?

Да есть много причин возвращаться из Abort'а в svsr.. К примеру определить объем реально подключенной SDRAM памяти.

Плюсуете к адресу по мегабайту - натыкаетесь на датааборт - вот собсно и верхняя граница памяти.

Share this post


Link to post
Share on other sites
Плюсуете к адресу по мегабайту - натыкаетесь на датааборт - вот собсно и верхняя граница памяти.

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

 

P.S. impat, сменили б вы юзерпик - глаза можно сломать, чесслово!

Share this post


Link to post
Share on other sites
А контроллер памяти откуда вдруг знает о границах? Получите overlap и все.

В реальной системе получаю abort. Откуда контроллер памяти знает меня не интересовало.

Если не нравится пример с памятью - другой пример - сохранение svsr fault регистров при краше.

Share this post


Link to post
Share on other sites
В реальной системе получаю abort. Откуда контроллер памяти знает меня не интересовало.

А вот мне интересно. Можно узнать, что за система, и при каких условиях получается abort?

Share this post


Link to post
Share on other sites
А вот мне интересно. Можно узнать, что за система, и при каких условиях получается abort?

SoC на двух 1136 ARM'ах, чей там SDRAM контроллер, - не знаю... Дает аборт при доступе к несуществующей памяти, даже если в MMU ARM'ов помечено, что память там есть.

Share this post


Link to post
Share on other sites
SoC на двух 1136 ARM'ах, чей там SDRAM контроллер, - не знаю... Дает аборт при доступе к несуществующей памяти, даже если в MMU ARM'ов помечено, что память там есть.

Хорошо, а как инициализируется этот контроллер - знаете? Просто ведь неоткуда знать ему, что там и в каком количестве снаружи прикручено, если только кто-то (сам процессор, точнее) не подскажет.

А вот генерить abort там, где ему было сказано, что памяти нет - это пожалуйста.

Share this post


Link to post
Share on other sites
Хорошо, а как инициализируется этот контроллер - знаете?

Мой application грузится бутлоадером сразу в SDRAM, стало быть SDRAM контроллер уже настроен бутлоадером.

Количество памяти в системе мой application узнает описанным выше способом.

Share this post


Link to post
Share on other sites
Мой application грузится бутлоадером сразу в SDRAM, стало быть SDRAM контроллер уже настроен бутлоадером.

Количество памяти в системе мой application узнает описанным выше способом.

 

Существуют более интеллигентные способы узнать объем памяти без вваливания в Abort. Я таким пользуюсь года три.

Share this post


Link to post
Share on other sites
Существуют более интеллигентные способы узнать объем памяти без вваливания в Abort. Я таким пользуюсь года три.

Интеллигентных способа, как я понимаю, здесь два:

1. Получить значение объема от bootloader'а

2. Прочитать конфигурацию контроллера памяти

 

Попытка выяснить объем самостоятельно неминуемо приведет к abort'у.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this