|
|
|
Как процессор точно определяет, что обработчик исключения завершился? |
|
|
|
Jan 8 2007, 16:00
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(Taradov Alexander @ Jan 8 2007, 15:23) Если я правильно понял инструкция по записи LR_mode в PC с любым смещением будет знаком выхода. Это не совсем так - выйти из исключения и восстановить CPSR можно двумя способами: 1. Загрузить PC при помощи data-processing команды с установленным битом S (пример: SUBS PC, LR, #0x04). 2. Загрузить PC при помощи LDM with Restore (пример: LDMFD SP!, {..., PC}^). Цитата(Taradov Alexander @ Jan 8 2007, 15:23) То-есть если просто в обработчике изменить режим на USR или записать значение LR в PC другим способом, то прерывния останутся заблокироваными насегда? Да, останутся заблокированными. Однако, менять режим в обработчике никто не запрещает, если он потом будет корректно восстановлен. Этот прием используется при организации вложенных прерываний.
|
|
|
|
|
Jan 8 2007, 16:38
|
Профессионал
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202
|
Цитата Да, останутся заблокированными. Однако, менять режим в обработчике никто не запрещает, если он потом будет корректно восстановлен. Этот прием используется при организации вложенных прерываний. Так. А можно попродробнее? Ведь приоритеты имеют не режимы (корорые как я понял нужны просто чтобы разделить LR и SP), а конкретные исключительные ситуации. Разьве если процессор находится в режиме обработки FIQ можно разрешить другие прерывания просто поменяв режим? А где в документации это описано, если не сложно. Поясню. Я делаю свою реализацию ARM-ядра и этот момент как-то скупо освещен в докумекнтации.
Сообщение отредактировал Taradov Alexander - Jan 8 2007, 16:38
|
|
|
|
|
Jan 8 2007, 17:21
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(Taradov Alexander @ Jan 8 2007, 16:38) Разьве если процессор находится в режиме обработки FIQ можно разрешить другие прерывания просто поменяв режим? Конечно, только тогда теряется смысл использовать FIQ. Режим процессора в CPSR можно изменить из любого привилегированного режима. Цитата(Taradov Alexander @ Jan 8 2007, 16:38) А где в документации это описано, если не сложно. Про манипуляции с режимами можно почитать в PrimeCell Vectored Interrupt Controller (PL190) r1p2 Technical Reference ManualЦитата(Taradov Alexander @ Jan 8 2007, 16:38) Поясню. Я делаю свою реализацию ARM-ядра и этот момент как-то скупо освещен в докумекнтации. Однако. А на какой платформе, если не секрет?
|
|
|
|
|
Jan 8 2007, 17:28
|
Профессионал
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202
|
Цитата Спасибо. Посмотрю. Цитата Однако. А на какой платформе, если не секрет? Это чисто хобби На текущий момент расчитываю влезть в ПЛИС Sparatan 3E (С ней есть отличная отладочная плата). В настоящее время есть работающее по моделированию ядро выполняющее data processing commands, load/store, branch. Все в одном режиме. вот перешел к реализации режимов и сразу возникло много вопросов. Документация у АРМа отличная и тех. поддержка на вопросы отвечает, но им не удается объяснить, что мне нужно не со стороны пользователя, а со стороны разработчика. А на этот счет документация весьма скупа.
|
|
|
|
|
Jan 8 2007, 18:17
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(Taradov Alexander @ Jan 8 2007, 17:56) Но ведь для работы этого VIC не требуется подменять режим. Достотчно просто убрать биты I/F в CPSR. Нет, не достаточно - в противном случае будут испорчены SPSR_irq и LR_irq. Цитата(Taradov Alexander @ Jan 8 2007, 17:56) С подменой режима я вижу одну проблему. Они не взаимооднозначны с исключениями. Например режим Abort. К нему приодят Prefetch abort (приоритет 5) и Data abort (приоритет 2). Прервания с каким приоритетом разрешать, если произведена смена режима? Говорить о приоритетах можно только в одном случае - когда два или большее число исключений происходят одновременно. Разрешение прерываний определяют только биты CPSR.
|
|
|
|
|
Jan 8 2007, 18:52
|
Профессионал
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202
|
Цитата Говорить о приоритетах можно только в одном случае - когда два или большее число исключений происходят одновременно. Разрешение прерываний определяют только биты CPSR. Здорово. Я почему-то об этом не подумал. То есть если во время выполения (не одновременно с) FIQ придет prefetch abort (у него приоритет ниже), то выполение FIQ прервется? Странно, как тогда защититься от множественных вызовов одного и того-же перывния? То есть что делать в ситуации PrefetchAbort, в момент его исполнения пришел FIQ и опять Prefetch Abort. Странно как-то реализована система прерываний в АРМе
|
|
|
|
|
Jan 8 2007, 19:29
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(Taradov Alexander @ Jan 8 2007, 18:52) То есть если во время выполения (не одновременно с) FIQ придет prefetch abort (у него приоритет ниже), то выполение FIQ прервется? Да, прервется. Цитата(Taradov Alexander @ Jan 8 2007, 18:52) Странно, как тогда защититься от множественных вызовов одного и того-же перывния? То есть что делать в ситуации PrefetchAbort, в момент его исполнения пришел FIQ и опять Prefetch Abort. Никак. Просто следует помнить, что в привилегированных режимах (в т.ч. Abort) по-идее должна работать операционная система, а генерация ошибок - удел user-space приложения.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|