Прерывания

Исполнение кода в линейной последовательности доставляет кучу проблем. Одна из которых - необходимость последовательного опроса всей периферии которую нам необходимо использовать, построение сложных, громоздких и ветвистых алгоритмов. Чтобы этого не было, а заодно чтобы разгрузить процессор были придуманны прерывания.

Основной механизм прерываний в следующем - пока процессор исполняет код может произойти какое либо событие. Получив это событие контроллер прерываний(так называется блок отвечающий за обработку внешних событий) останавливает исполнение кода в процессоре, сохраняет текущее состояние его регистров в стек приложения(об этом мы поговорим позднее) и переключает процессор на исполнение кода прерывания. Закончив обработку прерывания процессор возвращает сохраненные регистры из стека приложения и продолжает выполнение кода.

Если мы рассматриваем процессоры arm-cortex-m3 то векторизированный контроллер вложенных прерываний(NVIC) является неотъемлемой частью процессорного ядра.

Основная особенность этого контроллера - это наличие простого для пользователя но в тоже время достаточного гибкого механизма вложенных прерываний - т.е. прерывание более низкого уровня может прервать прерывание более высокого уровня.

Всего существует 81 прерывание(полное количество зависит от модели мк). Уровень прерывания может быть от 0(самый высокий приоритет) до 15(самый низкий приоритет).

Управление векторами прерываний распределено по 5 группам - по 3 32х битных регистра в каждой, за исключением последней группы(приоритеты прерываний) в ней 21 регистр). Мы не будем работать напрямую с этими регистрами(т.к. это утомительно долго) а воспользуемся готовыми макросами и встраиваимы inline фунциями заголовочного файла поставляемого вместе с мк.

Если прерывания одного приоритета то они исполняются в порядке поступления. Первое отличительное свойство такой системы - наличие четкой временной диаграммы прерываний, есть конкретные значения переключения контекста потока выполнения, в отличие от старой системы прерываний(которая была в не cortex ядрах).

Начинаем наш раздел с создания папки для проектов:

nis@jane ~/stm32/f4examples $ mkdir 02-ints

nis@jane ~/stm32/f4examples $ cd 02-ints/

nis@jane ~/stm32/f4examples/02-ints $

После этого можно настраивать и инициализировать систему прерываний. В отличие от старых процессоров в нашем ядре все будет по другому. Начнем с таблицы векторов.

Закончив описывать таблицу векторов инициализируем систему прерываний.