Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: User Mode Stack в обработчике исключения
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
amw
Для примера и определения архитектуры:
Процессор LPC2378, т.е. ARM7TDMI-S

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

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

Что-то в мануале на ARM найти не могу.
Может кто ткнет в правильный мануал или пример.
KRS
Цитата(amw @ Feb 25 2008, 19:24) *
Процессор работает в USER MODE. Происходит исключение, любое, UNDEF, PREFETCH ABTORT, DATA ABORT.
Переходим в обработчик.

Вопрос:
Как в обработчике исключения узнать значение регистра SP, из USER MODE?

IMHO в ARM7,ARM9 только переключиться в USER mode (лучше в SYSTEM что бы ограничений не было) и скопировать R13 в другой регистр и если надо вернуться обратоно в exception mode.
amw
Цитата(KRS @ Feb 25 2008, 18:32) *
IMHO в ARM7,ARM9 только переключиться в USER mode (лучше в SYSTEM что бы ограничений не было) и скопировать R13 в другой регистр и если надо вернуться обратоно в exception mode.

Здравая мысль.
Спасибо, это устроить.
Хотя если кто-то знает другой способ - буду благодарен.
GetSmart
Дык SP USER MODE виден (аппаратно!) только из USER/SYSTEM MODE. Так что другого способа нет. Можно только переключиться в USER/SYSTEM и сразу положить то, что надо (из младших регистров). Но это в общем-то же самое.
zhevak
Цитата(amw @ Feb 25 2008, 21:24) *
Нужно положить на вершину USER MODE стека значение полученное в обработчике EXCEPTION.


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

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

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

Если Вам нужно из исключения передать какую-то инфу на уровень юзера, используйте глобальные переменные с модфикатором volatile. Зачем Вам проламываться через бурелом (там все равно ничего полезного нет! Одни траблы.), когда рядом лежит классическая ровная дорога?
GetSmart
Мне кажется, это иммитация вызова процедуры в USER MODE. Даже не иммитация, а принудительный вызов.
KRS
Цитата(GetSmart @ Feb 25 2008, 22:36) *
Мне кажется, это иммитация вызова процедуры в USER MODE. Даже не иммитация, а принудительный вызов.

ARM же не использует стек для возвратов. Да и вообще в ARM7 / ARM9 использование R13 как SP условно. (это в новых версиях архитектуры этот регистр жестко выделен под стек)

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

Не вполне - он все-таки банкируется.
amw
Цитата(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 командами.
В данном случае меня это не интересует, потому и не заморачивался.
Критика принимается.
KRS
Цитата(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... )
amw
Цитата(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. Собственно программа МК, в том месте, где нужна библиотека, вызывает функции из таблиц. Таблицы содержат адреса, специально сформированные так, что-бы вызвать исключене. Кроме того, в связи с медлительностью процесса основная программа должна сначала вызвать функцию инициализации библиотеки, которая вызовет исключение, а дальше в работу вступает динамический линкер.

Слегка сумбурно, но процесс еще в самом начале.
Да, можно проще. И если бы не требования заказчика, я бы вообще не использовал закрытый софт. Но хозяи - барин, как говорится.
KRS
а не проще ли для этого использовать SWI
эта инструкция вроде как и предназначена для системных вызовов.
amw
Цитата(KRS @ Feb 26 2008, 13:10) *
а не проще ли для этого использовать SWI
эта инструкция вроде как и предназначена для системных вызовов.

Действительно SWI проще.
Но для его использования необходимо переписать все используемые в проекте библиотеки.
И сильно переписать.
Вариант с исключениями позволяет экономить время и не вносить свои глюки в чужие библиотеки.
Сергей Борщ
Цитата(amw @ Feb 26 2008, 17:27) *
Действительно SWI проще.
Но для его использования необходимо переписать все используемые в проекте библиотеки.
И сильно переписать.
Почему? Достаточно написать в исключении SWI чтение номера SWI из вызвавшей исключение инструкции, переключение в user(system) mode и ветвление по номеру swi на соответствующие библиотечные функции.
amw
Цитата(Сергей Борщ @ Feb 26 2008, 17:51) *
Почему? Достаточно написать в исключении SWI чтение номера SWI из вызвавшей исключение инструкции, переключение в user(system) mode и ветвление по номеру swi на соответствующие библиотечные функции.

Если-бы все так просто было wink.gif. У меня случай обратный.
Нужно обеспечить библиотеке данные из написанного мной кода плюс сервисные функции, то-же написанные мной.
Для реализации этого методом SWI нужно убедить правообладателя библиотеки переписать код, нужным мне спобом, что весьма затруднительно (и убедить и перписать). Библиотека не моя, распространяется за деньги и только в бинарном виде.
Интерфейс библиотеки включает уже упомянутые мной таблицы с адресами.
KRS
Цитата(amw @ Feb 27 2008, 11:42) *
Библиотека не моя, распространяется за деньги и только в бинарном виде.

А что за библиотека такая? ( если не секрет )
amw
Цитата(KRS @ Feb 27 2008, 14:57) *
А что за библиотека такая? ( если не секрет )

Это попадает под NDA. Как и имена заказчиков.
Могу только сказать, что мой заказчик представляет известного OEM производителя сетевого оборудования в Украине. Библиотека разработана OEM производителем для работы с периферией своих ASIC с ядром ARM7TDMI.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.