Files
lab-rv32i-c-interrupts/src/tasks/task01_ecall_resume.c
T
2026-07-21 19:14:20 +02:00

42 lines
1.2 KiB
C

#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;
}