feat: add lab-rv32i-c-interrupts card
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
#include "c10_common.h"
|
||||
|
||||
volatile uint32_t g_task01_count;
|
||||
volatile uint32_t g_task01_mcause;
|
||||
volatile uint32_t g_task01_mepc;
|
||||
volatile uint32_t g_task01_resume_pc;
|
||||
volatile uint32_t g_task01_resumed;
|
||||
volatile uint32_t g_task01_pass;
|
||||
|
||||
void __attribute__((interrupt("machine"))) handle_exception(void)
|
||||
{
|
||||
const uint32_t cause = read_csr(mcause);
|
||||
const uint32_t pc = read_csr(mepc);
|
||||
|
||||
g_task01_count++;
|
||||
g_task01_mcause = cause;
|
||||
g_task01_mepc = pc;
|
||||
g_task01_resume_pc = pc + 4u;
|
||||
write_csr(mepc, g_task01_resume_pc);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
c10_disable_interrupts();
|
||||
__asm__ volatile("ecall");
|
||||
g_task01_resumed = 1u;
|
||||
|
||||
g_task01_pass = g_task01_count == 1u &&
|
||||
g_task01_mcause == MACHINE_ECALL_CAUSE &&
|
||||
g_task01_resume_pc - g_task01_mepc == 4u &&
|
||||
g_task01_resumed == 1u;
|
||||
|
||||
c10_report("T01 count=", g_task01_count);
|
||||
c10_report("T01 mcause=", g_task01_mcause);
|
||||
c10_report("T01 mepc=", g_task01_mepc);
|
||||
c10_report("T01 resume_pc=", g_task01_resume_pc);
|
||||
c10_report("T01 delta=", g_task01_resume_pc - g_task01_mepc);
|
||||
c10_report("T01 resumed=", g_task01_resumed);
|
||||
c10_report("T01 pass=", g_task01_pass);
|
||||
return g_task01_pass ? 0 : 1;
|
||||
}
|
||||
Reference in New Issue
Block a user