В RIS C -V Manual Volume II сказано:
Когда MODE = Vectored, все синхронные исключения в режиме машины приводят к тому, что p c быть установленным на адрес в поле BASE, тогда как прерывания приводят к тому, что p c устанавливается на адрес в поле BASE плюс четыре раза номер причины прерывания.
совпадает ли обработчик синхронных исключений с обработчиком прерываний ID = 0 (пользовательское программное прерывание)? И я пытаюсь решить мой вопрос по qemu-system-riscv64 virt, и после следующих шагов я пытаюсь тестовое исключение, пользовательское программное прерывание и прерывание таймера машины:
# boot:
la t0, __vector_table
xor t0, t0, 1 # vector mode
csrw mtvec, t0
# vector table
__vector_table:
IRQ_0:
j trap_handler_entry
IRQ_1:
j trap_handler_entry
...
IRQ_7:
j timer_interrupt_vector_handler
# handler at vector table index 0
trap_handler_entry:
SAVE_REGISTER
j trap_handler # trap_handler is the handler
# I used to handle all trap in direct mode
RESTORE_REGISTER
mret
# timer handler
void __atrributr__ ((interrupt)) timer_interrupt_vector_handler {
add new value in mtimecmp
}
В этот момент я проверяю ecall и прерывание таймера, когда происходит прерывание таймера и ecall, это обязательно go для функции в таблице векторов, ecall - > INDEX = 0, таймер -> INDEX = 7 И затем я пытаюсь вызвать программное прерывание пользователя, например:
# Test function
while(1) {
if (odd round) { ecall }
else {
set_csr(mip, USIP);
/* Test func in M mode, enable USIE in MIE,
* and other interrupts works well */
}
}
Но там не происходит прерывание программного обеспечения пользователя, руководство говорит:
каждый л Уровень привилегий ower имеет отдельный бит ожидания программных прерываний (SSIP, USIP), который может считываться и записываться при доступе CSR из кода, выполняемого на локальном харте с соответствующим или любым более высоким уровнем привилегий.
И я уверен, что могу получить программное прерывание Supervisor, установив MIP_SSIP. И я проверил функцию повышения прерываний в Spike, я обнаружил, что нет прерываний программного обеспечения пользователя ... В руководстве также сказано:
Если прерывания на уровне пользователя не поддерживаются, USIP и US IE подключены к нулю.
Поэтому я печатаю m ie, чтобы проверить его:
# config in mie and mstatus
write_csr(mie, read_csr(mie) | MIP_MTIP | MIP_MSIP | MIP_SSIP | MIP_USIP);
write_csr(mstatus, (read_csr(mstatus) | MSTATUS_MIE | MSTATUS_SIE | MSTATUS_UIE));
# Set mie and mip in test func
set_csr(mie, MIP_USIP);
set_csr(mip, MIP_USIP);
# Result before and after set
MIE >> 000000000000008a # before
MIP >> 0000000000000000
MIE >> 000000000000008a # after
MIP >> 0000000000000000
USIP и US IE подключены к нулю! Так, может, сейчас нет USI? Но зависит от первой попытки, я думаю, синхронное исключение на самом деле с использованием обработчика прерываний ID = 0 (пользовательское программное прерывание). Кажется, может ответ на мой вопрос - да ... И конфликт заключается в том, чтобы избежать прерывания программного обеспечения пользователя? Это правильно? Есть ли конфликт?