From c53e555a44192afde5f7b0cd15c7f2299a9126d7 Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Tue, 14 Nov 2023 15:13:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A010.=20=D0=98=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BD=D0=B3=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Изменены адреса указателей на стеки и глобальную область данных (указаны реальные адреса памяти). Добавлен вызов ecall. --- Labs/10. Interrupt subsystem/README.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Labs/10. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md index 63fd8cf..dfb26aa 100644 --- a/Labs/10. Interrupt subsystem/README.md +++ b/Labs/10. Interrupt subsystem/README.md @@ -246,8 +246,8 @@ _Рисунок 4. Структурная схема контроллера пр ```asm _start: # Инициализируем начальные значения регистров -li sp, 0xFFFFFFFC # устанавливаем указатель на верхушку стека -li gp, 0x10000000 # устанавливаем указатель на глобальные данные +li sp, 0x00003FFC # устанавливаем указатель на верхушку стека +li gp, 0x00000000 # устанавливаем указатель на глобальные данные li t0, 0x00000001 # подготавливаем маску прерывания единственного # (нулевого) входа @@ -259,7 +259,7 @@ la t0, interrupt # псевдоинструкция la аналоги csrw mtvec, t0 # устанавливаем вектор прерывания -li t0, 0xEFFFFFFC # готовим адрес верхушки стека прерывания +li t0, 0x00001FFC # готовим адрес верхушки стека прерывания csrw mscratch, t0 # загружаем в указатель на верхушку стека прерывания li t0, 1 # начальное значение глобальной переменной @@ -268,6 +268,11 @@ sw t0, 0(gp) # загружаем переменную в памя li t1, 0 # начальное значение, чтобы в симуляции не было xxx li t2, 0 # начальное значение, чтобы в симуляции не было xxx +# Вызов ecall исключительно из хулиганских соображений, +# поскольку в данной микроархитектурной реализации это +# приведет к появлению illegal_instr и последующей обработке +# исключения +ecall # Вызов функции main main: beq x0, x0, main # бесконечный цикл, аналогичный while (1); @@ -300,9 +305,9 @@ exc_handler: # Проверяем произошло ли иск bne t1, t2, done # если это не оно, то выходим # Обработчик исключения - csrr mepc, t1 # Узнаем значение PC (адреса инструкции, + csrr t1, mepc # Узнаем значение PC (адреса инструкции, # вызвавшей исключение) - lw t2 0x0(t1) # Загружаем эту инструкцию в регистр t2 + lw t2, 0x0(t1) # Загружаем эту инструкцию в регистр t2 # Теоретически мы могли бы после этого # сделать что-то, в зависимости от этой инструкции. # Например если это операция умножения — вызвать @@ -311,7 +316,7 @@ exc_handler: # Проверяем произошло ли иск addi t1, t1, 4 # Увеличиваем значение PC на 4, чтобы после # возврата не попасть на инструкцию, вызвавшую # исключение. - сsrw mepc, t1 # Записываем обновленное значение PC в регистр mepc + csrw mepc, t1 # Записываем обновленное значение PC в регистр mepc j done # идем восстанавливать регистры со стека и на выход # Возвращаем регистры на места и выходим