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

), и вызвать программу, предназначенную специально для обработки данного события. Например, включение питания или нажатие кнопки сброса вызывает обработчик сброса, который подготавливает контроллер к работе и запускает рабочую программу (ту, которая крутится всё время, пока контроллер работает). Так вот, вектором прерывания называют определённую ячейку памяти, в которой (в случае ATmega) находится первая команда обработчика того или иного вида прерывания, ну а таблица векторов -- это просто сборище всех этих ячеек, где находятся первые команды каждого вектора. На ATmega'х таблица векторов располагается в памяти программы с нулевого адреса. В моём примере она заполнена командами jmp, выполняющими переход на собственно обработчики конкретных прерываний, но, поскольку пример жутко примитивный, реально используется только вектор сброса -- он является самым первым, и его команда jmp находится по нулевому адресу.
Код: Выделить всё
.CSEG
.ORG 0
; =======================
;
; Таблица векторов прерываний
;
; =======================
jmp Reset ; Сброс, включение питания, сторожевой таймер
jmp _IRQ ; Внешнее прерывание INT0
jmp _IRQ ; Внешнее прерывание INT1
jmp _IRQ ; Внешнее прерывание INT2
jmp _IRQ ; Pin Change Interrupt Request 0
jmp _IRQ ; Pin Change Interrupt Request 1
jmp _IRQ ; Timer/Counter3 Capture Event
jmp _IRQ ; Timer/Counter3 Compare Match A
jmp _IRQ ; Timer/Counter3 Compare Match B
jmp _IRQ ; Timer/Counter3 Overflow
jmp _IRQ ; Timer/Counter2 Compare Match
jmp _IRQ ; Timer/Counter2 Overflow
jmp _IRQ ; Timer/Counter1 Capture Event
jmp _IRQ ; Timer/Counter1 Compare Match A
jmp _IRQ ; Timer/Counter1 Compare Match B
jmp _IRQ ; Timer/Counter1 Overflow
jmp _IRQ ; Timer/Counter0 Compare Match
jmp _IRQ ; Timer/Counter0 Overflow
jmp _IRQ ; Serial Transfer Complete
jmp _IRQ ; USART0, Rx Complete
jmp _IRQ ; USART1, Rx Complete
jmp _IRQ ; USART0 Data Register Empty
jmp _IRQ ; USART1 Data Register Empty
jmp _IRQ ; USART0, Tx Complete
jmp _IRQ ; USART1, Tx Complete
jmp _IRQ ; EEPROM Ready
jmp _IRQ ; Analog Comparator
jmp _IRQ ; Store Program Memory Ready
_IRQ: reti
Все остальные jmp ведут на метку _IRQ, по которой у меня расположена команда reti -- возврат из прерывания. В принципе, все эти векторы, кроме нулевого (сброса) в мигалке можно было бы и не заполнять, поскольку никакие другие прерывания не используются, но я предпочитаю сразу заполнять всю таблицу, чтобы потом просто корректировать имена обработчиков, если надо. Ну а в комментариях у меня указано, какой вектор какому прерыванию соответствует.
Как, надо полагать, Вы уже поняли из нашего спора, таблица векторов прерываний выглядит по-разному на различных микроконтроллерах даже одного семейства (ATmega в данном случае). Эта таблица -- именно для атмеги-162, для другого микроконтроллера она будет выглядеть по-другому, хотя общие принципы остаются неизменными. Точный формат таблицы векторов приводится в руководстве ("даташите" -- datasheet) на конкретный контроллер, так что, если сколько-нибудь серьёзно собираетесь разбираться с этим делом, его скачать нужно обязательно.