diff --git a/.pic/Labs/lab_10_irq/fig_02.drawio.png b/.pic/Labs/lab_10_irq/fig_02.drawio.png deleted file mode 100644 index c1b2676..0000000 Binary files a/.pic/Labs/lab_10_irq/fig_02.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_10_irq/fig_02.png b/.pic/Labs/lab_10_irq/fig_02.png new file mode 100644 index 0000000..7e87910 Binary files /dev/null and b/.pic/Labs/lab_10_irq/fig_02.png differ diff --git a/.pic/Labs/lab_10_irq/fig_03.drawio.png b/.pic/Labs/lab_10_irq/fig_03.drawio.png index c837bca..c1b2676 100644 Binary files a/.pic/Labs/lab_10_irq/fig_03.drawio.png and b/.pic/Labs/lab_10_irq/fig_03.drawio.png differ diff --git a/.pic/Labs/lab_10_irq/fig_04.drawio.png b/.pic/Labs/lab_10_irq/fig_04.drawio.png index 40b67f0..c837bca 100644 Binary files a/.pic/Labs/lab_10_irq/fig_04.drawio.png and b/.pic/Labs/lab_10_irq/fig_04.drawio.png differ diff --git a/.pic/Labs/lab_10_irq/fig_05.drawio.png b/.pic/Labs/lab_10_irq/fig_05.drawio.png new file mode 100644 index 0000000..40b67f0 Binary files /dev/null and b/.pic/Labs/lab_10_irq/fig_05.drawio.png differ diff --git a/.pic/Labs/lab_10_irq/tab_03.png b/.pic/Labs/lab_10_irq/tab_05.png similarity index 100% rename from .pic/Labs/lab_10_irq/tab_03.png rename to .pic/Labs/lab_10_irq/tab_05.png diff --git a/Labs/10. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md index c03430e..080c10c 100644 --- a/Labs/10. Interrupt subsystem/README.md +++ b/Labs/10. Interrupt subsystem/README.md @@ -122,13 +122,24 @@ _Таблица 4. Список регистров, подлежащих реа По адресу `0x304` должен располагаться регистр, позволяющий маскировать прерывания. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1. -Регистр `mtvec` является базовым адресом обработчика прерывания. Это значит, что предусмотрена возможность реализации как обзорной (прямой), так и векторной системы прерывания. В первом случае при возникновении прерывания в **program counter** загружается значение `mtvec`. Во втором случае, в **program counter** загружается сумма регистра базового адреса `mtvec` и регистра причины прерывания `mcause`, который обновляется каждый раз, когда происходит прерывание, значение в нем несет информацию о том, что именно произошло в системе. +Регистр `mtvec` состоит из двух полей: BASE[31:2] и MODE. Поле BASE хранит старшие 30 бит базового адреса обработчика перехвата (поскольку этот адрес должен быть всегда равен четырем, младшие два бита считаются равными нулю). Поле MODE кодирует тип системы прерывания: + +- `MODE == 2'd0` — система прерывания обзорная; +- `MODE == 2'd1` — система прерывания векторная. + +![../../.pic/Labs/lab_10_irq/fig_02.png](../../.pic/Labs/lab_10_irq/fig_02.png) + +Рисунок 2. Разделение регистра `mtvec` на поля `BASE` и `MODE` + +В случае обзорной системы прерывания, любой перехват приводит к загрузке в PC значения базового адреса обработчика перехвата (`PC=BASE`). В векторной системе прерывания исключения обрабатываются таким же способом, как и в обзорной системе, а вот прерывания обрабатываются путем загрузки в PC суммы базового адреса и учетверенного значения причины прерывания (`PC=BASE+4*CAUSE`). + +В рамках данной лабораторной работы мы будем реализовывать обзорную систему прерываний. Кроме того, поскольку у обзорной системы прерываний `MODE==0`, что совпадет с тем, что два младших бита базового адреса обработчика перехвата должны быть равны нулю, при перехвате мы можем присваивать программному счетчику значение `mtvec` без каких-либо преобразований. Так как обработчик перехвата будет использовать те же регистры, что и прерванная программа, то перед использованием регистрового файла, данные из него необходимо сохранить, разместив их на стеке. Стек для перехвата находится не там же, где программный стек, а адрес начала этого стека хранится в регистре `mscratch` и по сути является указателем на верхушку стека. Регистр `mepc` сохраняет адрес инструкции во время которой произошел перехват. Это очень важно понимать, при реализации обработчика исключения — если в нем не перезаписать этот регистр, по возврату из обработчика процессор снова окажется на инструкции, которая вызвала исключение. То как кодируется причина перехвата в регистре `mcause` описано в [спецификации](https://github.com/riscv/riscv-isa-manual/releases/download/riscv-isa-release-1239329-2023-05-23/riscv-privileged.pdf) привилегированной архитектуры (раздел 3.1.15, стр. 38): -![../../.pic/Labs/lab_10_irq/tab_03.png](../../.pic/Labs/lab_10_irq/tab_03.png) +![../../.pic/Labs/lab_10_irq/tab_05.png](../../.pic/Labs/lab_10_irq/tab_05.png) _Таблица 5. Кодирование причины перехвата в регистре `mcause`_ @@ -174,7 +185,7 @@ _Таблица 5. Кодирование причины перехвата в Контроллер прерываний позволит обрабатывать входящие запросы на прерывания: маски́ровать их, выбирать один запрос из нескольких, а так же игнорировать запросы во время обработки текущего прерывания. -![../../.pic/Labs/lab_10_irq/fig_02.drawio.png](../../.pic/Labs/lab_10_irq/fig_02.drawio.png) +![../../.pic/Labs/lab_10_irq/fig_03.drawio.png](../../.pic/Labs/lab_10_irq/fig_03.drawio.png) _Рисунок 2. Место разрабатываемых блоков в структуре процессора._ @@ -184,7 +195,7 @@ _Рисунок 2. Место разрабатываемых блоков в с Рассмотрим один из возможных вариантов организации блока **Control and Status Registers**. Основную часть схемы занимают мультиплексор, подающий на выход **read_data_o** значение регистра, соответствующего пришедшему адресу, и демультиплексор маршрутизирующий сигнал разрешения на запись **write_enable_i** (en) на тот же регистр. -![../../.pic/Labs/lab_10_irq/fig_03.drawio.png](../../.pic/Labs/lab_10_irq/fig_03.drawio.png) +![../../.pic/Labs/lab_10_irq/fig_04.drawio.png](../../.pic/Labs/lab_10_irq/fig_04.drawio.png) _Рисунок 3. Структурная схема контроллера CS-регистров_ @@ -198,7 +209,7 @@ _Рисунок 3. Структурная схема контроллера CS- Рассмотрим один из возможных способов реализации простейшего контроллера прерываний, представленного на _рис. 4_. -![../../.pic/Labs/lab_10_irq/fig_04.drawio.png](../../.pic/Labs/lab_10_irq/fig_04.drawio.png) +![../../.pic/Labs/lab_10_irq/fig_05.drawio.png](../../.pic/Labs/lab_10_irq/fig_05.drawio.png) _Рисунок 4. Структурная схема контроллера прерываний_