реклама на сайте
подробности

 
 
> User Mode Stack в обработчике исключения, LPC2378 Exceptions
amw
сообщение Feb 25 2008, 16:24
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Для примера и определения архитектуры:
Процессор LPC2378, т.е. ARM7TDMI-S

Процессор работает в USER MODE. Происходит исключение, любое, UNDEF, PREFETCH ABTORT, DATA ABORT.
Переходим в обработчик.

Вопрос:
Как в обработчике исключения узнать значение регистра SP, из USER MODE?
Нужно положить на вершину USER MODE стека значение полученное в обработчике EXCEPTION.
В общем случае, нужно в обработчике исключения знать значене SP режима, в котором произошло это исключение.

Что-то в мануале на ARM найти не могу.
Может кто ткнет в правильный мануал или пример.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zhevak
сообщение Feb 25 2008, 19:28
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(amw @ Feb 25 2008, 21:24) *
Нужно положить на вершину USER MODE стека значение полученное в обработчике EXCEPTION.


Я извиняюсь. Правильно ли я понял, что USER MODE у Вас выполняется единственная функция?

По моему, то, что Вы пытаетесь сделать, это несколько порочная практика. Представьте, что в Ваш проект разросся, и теперь в нем в юзеровском режиме дюжина функций. Заранее нельзя знать в какой момент возникнет исключение, т.е. нельзя предполагать, что, вот, в этой функции исключение не возникнет, а, вот, в этой -- возникнет.

Исключение может возникнуть в любее время, т.е. при выполнении любой функции. Значит, Вам нужно будет прописывать Ваш код (получающий инфц из исключения) во всех функциях. Но это еще пол-беды! Стек -- это такая бестия, что может оказаться, что вы затрете какие-нибудб жизненно важные данные. Как говориться, последствия не предсказуемы.

Если Вам нужно из исключения передать какую-то инфу на уровень юзера, используйте глобальные переменные с модфикатором volatile. Зачем Вам проламываться через бурелом (там все равно ничего полезного нет! Одни траблы.), когда рядом лежит классическая ровная дорога?


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
amw
сообщение Feb 26 2008, 08:48
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(zhevak @ Feb 25 2008, 21:28) *
Я извиняюсь. Правильно ли я понял, что USER MODE у Вас выполняется единственная функция?

Нет.
Цитата
По моему, то, что Вы пытаетесь сделать, это несколько порочная практика. Представьте, что в Ваш проект разросся, и теперь в нем в юзеровском режиме дюжина функций. Заранее нельзя знать в какой момент возникнет исключение, т.е. нельзя предполагать, что, вот, в этой функции исключение не возникнет, а, вот, в этой -- возникнет.

Правильно. В исключении анализируется стеск на предмет вызова функций, переменных и т.д.
Цитата
Исключение может возникнуть в любее время, т.е. при выполнении любой функции. Значит, Вам нужно будет прописывать Ваш код (получающий инфц из исключения) во всех функциях. Но это еще пол-беды! Стек -- это такая бестия, что может оказаться, что вы затрете какие-нибудб жизненно важные данные. Как говориться, последствия не предсказуемы.

Если Вам нужно из исключения передать какую-то инфу на уровень юзера, используйте глобальные переменные с модфикатором volatile. Зачем Вам проламываться через бурелом (там все равно ничего полезного нет! Одни траблы.), когда рядом лежит классическая ровная дорога?

Это не то, что мне нужно.


Цитата(GetSmart @ Feb 25 2008, 21:36) *
Мне кажется, это иммитация вызова процедуры в USER MODE. Даже не иммитация, а принудительный вызов.

Почти, но не совсем.

Цитата(KRS @ Feb 25 2008, 21:45) *
ARM же не использует стек для возвратов. Да и вообще в ARM7 / ARM9 использование R13 как SP условно. (это в новых версиях архитектуры этот регистр жестко выделен под стек)

На первый взгляд - да, это проблема.
Но практика показала, что то, что мне нужно - в стеке. При соответствующем оформлении кода конечно.
Цитата
кстати zhevak задал хорошй вопрос.
зачем все это нужно?

Преследуются три цели.
1) - Вывод отладочной инфы (например в UART), дамп регистров, дамп стека и пр. Это скорее побочный эффект чем очень нужная функция в готовом устройстве.
2) - Реализация чего-то типа виртуальной памяти на архитектуре без MMU. В связи с отсутствием MMU DATA ABORT используется в соответствии с ARM Reference Manual для подгрузки данных. Еще один побочный эффект - PREFETCH ABORT используется для подгрузки кода. Итог - динамическая линковка.
3) - Наглядная демонстрация для студентов с целью научить их как это все работает. В общем тоже побочный эффект. smile.gif Я в университете работаю.

Получается примерно так.
Код
@    Determine address of stack for mode where exception occurred
    mrs    r1, CPSR    @ Save current MODE
@    Switch in Prevoius Mode (where exception occurred)
    mrs    r2, SPSR
    mov    r3, r2
    bic    r3, r3, #0xFFFFFFE0
    cmp    r3, #USR_MODE
    moveq    r3, #SYS_MODE @ THUMB not supported
    bic    r2, r2, #0x1F
    orr    r2, r2, r3
    orr    r2, r2, #(I_BIT | F_BIT) @ THUMB not supported
    msr    CPSR, r2 @ THUMB not supported
@    Get sp and return to exception mode
    mov    r3, sp        @ Get sp
    msr    CPSR, r1    @ Restore Exception MODE


Вроде работает. Может кому пригодится.
Если до исключения мог быть THUMB режим - то нужно добавить дополнительный анализ и ветку кода с THUMB командами.
В данном случае меня это не интересует, потому и не заморачивался.
Критика принимается.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 26 2008, 09:23
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(amw @ Feb 26 2008, 11:48) *
2) - Реализация чего-то типа виртуальной памяти на архитектуре без MMU. В связи с отсутствием MMU DATA ABORT используется в соответствии с ARM Reference Manual для подгрузки данных. Еще один побочный эффект - PREFETCH ABORT используется для подгрузки кода. Итог - динамическая линковка.

Вот это интересно! А как это можно реализовать?
(А то напоминает CPU not found! Press any key to software emulation... )
Go to the top of the page
 
+Quote Post
amw
сообщение Feb 26 2008, 09:57
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(KRS @ Feb 26 2008, 11:23) *
Вот это интересно! А как это можно реализовать?
(А то напоминает CPU not found! Press any key to software emulation... )

Мысль о динамической линковке на ARM7 без MMU и ОС (имеется в виду что-то типа uClinux а не FreeRTOS и аналогичные) навеяна необходимостью "скрестить" в одном проекте библиотеки, распространяемые по разным лицензиям.
Например GPL + LGPL + BSD + что_то_еще_закрытое_и_проприетарное.

А сама линковка требует как минимум четырех компонентов.
1. Софт для преобразования библиотек в более подходящий для МК вормат. Например из ELF во что-то не такое громоздкое. Выполняется на ПК после линковки библиотеки. Выдает файл с таблицей соответствие символов, их адресов и места размещения. Адреса указываются принудительно так, что-бы вызвать DATA ABORT или PREFETCH ABORT.
2. Софт, выполняемый на ПК (пока хватает arm-elf-objcopy) для создания кусков прошивок. Прошивки содержат указанные выше таблицы. Ну и собственно код конечно smile.gif.
3. Динамический линкер, исполняющийся на МК. Пока реализован (частично) как набор функций, вызываемых из обработчика исключения. Выполняет собственно поиск символов и закрузку кусков кода. Накладные расходы большие, так что использовать целесообразно для загрузки в память библиотеки целиком и редко.
4. Собственно программа МК, в том месте, где нужна библиотека, вызывает функции из таблиц. Таблицы содержат адреса, специально сформированные так, что-бы вызвать исключене. Кроме того, в связи с медлительностью процесса основная программа должна сначала вызвать функцию инициализации библиотеки, которая вызовет исключение, а дальше в работу вступает динамический линкер.

Слегка сумбурно, но процесс еще в самом начале.
Да, можно проще. И если бы не требования заказчика, я бы вообще не использовал закрытый софт. Но хозяи - барин, как говорится.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- amw   User Mode Stack в обработчике исключения   Feb 25 2008, 16:24
- - KRS   Цитата(amw @ Feb 25 2008, 19:24) Процессо...   Feb 25 2008, 16:32
|- - amw   Цитата(KRS @ Feb 25 2008, 18:32) IMHO в A...   Feb 25 2008, 16:39
- - GetSmart   Дык SP USER MODE виден (аппаратно!) только из ...   Feb 25 2008, 16:46
- - GetSmart   Мне кажется, это иммитация вызова процедуры в USER...   Feb 25 2008, 19:36
|- - KRS   Цитата(GetSmart @ Feb 25 2008, 22:36) Мне...   Feb 25 2008, 19:45
|- - aaarrr   Цитата(KRS @ Feb 25 2008, 22:45) Да и воо...   Feb 25 2008, 19:48
- - KRS   а не проще ли для этого использовать SWI эта инстр...   Feb 26 2008, 11:10
- - amw   Цитата(KRS @ Feb 26 2008, 13:10) а не про...   Feb 26 2008, 15:27
- - Сергей Борщ   Цитата(amw @ Feb 26 2008, 17:27) Действит...   Feb 26 2008, 15:51
- - amw   Цитата(Сергей Борщ @ Feb 26 2008, 17:51) ...   Feb 27 2008, 08:42
- - KRS   Цитата(amw @ Feb 27 2008, 11:42) Библиоте...   Feb 27 2008, 12:57
- - amw   Цитата(KRS @ Feb 27 2008, 14:57) А что за...   Feb 28 2008, 08:29


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 03:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01562 секунд с 7
ELECTRONIX ©2004-2016