Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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
|