mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР10. Уточнение принципа работы регистра mtvec
This commit is contained in:
@@ -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` — система прерывания векторная.
|
||||
|
||||

|
||||
|
||||
Рисунок 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):
|
||||
|
||||

|
||||

|
||||
|
||||
_Таблица 5. Кодирование причины перехвата в регистре `mcause`_
|
||||
|
||||
@@ -174,7 +185,7 @@ _Таблица 5. Кодирование причины перехвата в
|
||||
|
||||
Контроллер прерываний позволит обрабатывать входящие запросы на прерывания: маски́ровать их, выбирать один запрос из нескольких, а так же игнорировать запросы во время обработки текущего прерывания.
|
||||
|
||||

|
||||

|
||||
|
||||
_Рисунок 2. Место разрабатываемых блоков в структуре процессора._
|
||||
|
||||
@@ -184,7 +195,7 @@ _Рисунок 2. Место разрабатываемых блоков в с
|
||||
|
||||
Рассмотрим один из возможных вариантов организации блока **Control and Status Registers**. Основную часть схемы занимают мультиплексор, подающий на выход **read_data_o** значение регистра, соответствующего пришедшему адресу, и демультиплексор маршрутизирующий сигнал разрешения на запись **write_enable_i** (en) на тот же регистр.
|
||||
|
||||

|
||||

|
||||
|
||||
_Рисунок 3. Структурная схема контроллера CS-регистров_
|
||||
|
||||
@@ -198,7 +209,7 @@ _Рисунок 3. Структурная схема контроллера CS-
|
||||
|
||||
Рассмотрим один из возможных способов реализации простейшего контроллера прерываний, представленного на _рис. 4_.
|
||||
|
||||

|
||||

|
||||
|
||||
_Рисунок 4. Структурная схема контроллера прерываний_
|
||||
|
||||
|
Reference in New Issue
Block a user