• управлять прохождением данных к подпрограмме RealMonitor (например, rm_irqhandler2 ());
• требовать ИС для приложения непосредственно (например, appJRQHandler ()).
Reset
Undefined
SWI
Prefetch Abort
Data Abort
Reserved
IRQ
FIQ
RealMonitor снабжен обработчиками векторов исключений
rm_undef_handler() rm_prefetcabort_handler() rm_dataabort_handler() rmJrqhandlerO
Совместное использование запросов IRQ RealMonitor и пользовательским обработчиком запросов IRQ
rmjrqhandler2()
AppJRQHandlerQ
Рис. 24.3. Исключительные ситуации, обрабатываемые RealMonitor
В самом простом случае, когда приложение не имеет никаких собственных обработчиков исключительных ситуаций, приложение может поместить обработчик исключительных ситуаций низкого уровня, входящий в состав RealMonitor, непосредственно в векторную таблицу процессора. Обработчик запроса IRQ должен передавать управление по адресу контроллера векторов прерываний. Самый простой способ сделать это состоит в том, чтобы записать команду перехода (<адрес>) в векторную таблицу с тем, чтобы переход производился на начальный адрес встроенного в RealMonitor обработчика ИС.
24.4.2. Инициализация RMTarget
Когда процессор находится в привилегированном режиме, и запросы IRQ запрещены, пользователь должен включить в последовательность команд, выполняемых при запуске приложения, программную строку, которая вызывает функцию rm_init_entry().
24.5. Пример кода с использованием RealMonitor
В программном фрагменте, предоставленном производителем LPC2000 и приведенном ниже, демонстрируются инициализация стека, VIC, RealMonitor и разрешение некоторых невекторизованных прерываний.
IMPORT rm_init_entry
IMPORT rm_prefetchabort_handler
IMPORT rm_dataabort_handler
IMPORT rm_irqhandler2
IMPORT rm_undef_handler
IMPORT User_Entry ;Точка входа пользовательского приложения.
CODE32
ENTRY
/Определение таблицы исключений. Инструкция компоновщику размещать код
;с адреса 0x0000 0000
AREA exception_table, CODE
LDR рс, Reset_Address
LDR pc, Undefined_Address
LDR pc, SWI_Address
LDR pc, Prefetch_Address
LDR pc, Abort_Address
NOP ;Здесь должна быть вставка пользователя, задающая действительную сигнатуру LDR рс, [рс, #-0xFF0] ;Загрузка вектора IRQ от VIC LDR PC, FIQ_Address
Reset_Address DCD _init ;Вход в точку сброса
UndefiBed_Address DCD rm_undef_handler ; Если RealMonitor SWI_Address- DCD 0 ; Пользователь может поместить здесь адрес обработчика SWI Prefetch_Address DCD rm_prefetchabort_handler ; Если инициализируем и RealMonitor Abort_Address DCD rm_dataabort_handler ; Если инициализируем и RealMonitor FIQ_Address DCD 0 ; Пользователь может здесь поместить адрес обработчика FIQ AREA init_code, CODE
ram_end EQU 0x4000xxxx ; «Вершина» встроенной RAM. _init
. / *********************************************************************
. * установка указателей вершины стека для различных режимов процессора. ; * Стек растет вниз.
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |