Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 5 Текст программы exception_handler.s






/* СЕКЦИЯ СБРОСА " ax" требуется для того, чтобы определить секцию как исполняемую.AMP автоматически размещает секцию сброса по адресу, определяемому в настройках процессора в SOPC Builder.*/

 

.section.reset, " ax"

movia r2, _start

jmp r2 /* Переходим в основную программу */

 

/***************************************************************************

СЕКЦИЯ ИСКЛЮЧЕНИЙ " ax" требуется для того, чтобы определить секцию как исполняемую.AMP автоматически размещает секцию сброса по адресу, определяемому в настройках процессора в SOPC Builder.***************************************/

 

section.exceptions, " ax"

.global EXCEPTION_HANDLER /*Определяем процедуру как глобальную*/

EXCEPTION_HANDLER: /*Процедура обработки прерываний*/

subi sp, sp, 16 /* Изменяем адрес указателя стека */

stw et, 0(sp) /*Сохраняем содержимое регистра et в стеке*/

 

rdctl et, ctl4

beq et, r0, SKIP_EA_DEC /* Если прерывание не внешнее, то переходим на SKIP_EA_DEC */

 

subi ea, ea, 4 /* декрементируем регистр ea на 1 команду */

 

 

SKIP_EA_DEC:

stw ea, 4(sp) /* Сохраняем регистры в стеке */

stw ra, 8(sp)

stw r22, 12(sp)

 

rdctl et, ctl4

bne et, r0, CHECK_LEVEL_0 /* Если прерывание внешнее, то переходим на CHECK_LEVEL_0*/

 

NOT_EI: /* Прерывание произошло в случае встречи невыполнимой команды или команды TRAP */

 

br END_ISR /* Выходим из обработчика прерываний */

 

CHECK_LEVEL_0: /* Проверка, является ли прерывание прерыванием от таймера IRQ0 */

 

andi r22, et, 0b1

beq r22, r0, CHECK_LEVEL_1 /*Если бит 0b1 регистра et не равен 1, то переходим к проверке, является ли прерывание прерыванием от кнопок*/

 

call INTERVAL_TIMER_ISR /*Вызываем процедуру обработки прерывания от таймера*/

 

br END_ISR /*Выходим из обработчика прерываний*/

 

CHECK_LEVEL_1: /*Проверка, является ли прерывание прерыванием от кнопок IRQ1*/

 

andi r22, et, 0b10

beq r22, r0, END_ISR /* Если бит 0b10 регистра et не равен 10, то выходим из обработчика прерываний*/

 

call PUSHBUTTON_ISR /*Вызываем процедуру обработки прерываний от кнопок*/

 

END_ISR:

 

/*Восстанавливаем из стека все используемые регистры*/

 

ldw et, 0(sp)

ldw ea, 4(sp)

ldw ra, 8(sp)

ldw r22, 12(sp)

addi sp, sp, 16

 

eret /*Выходим из процедуры обработки прерывания*/

.end

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал