add rega board interrupt process

This commit is contained in:
Wang_Weigen 2022-01-29 15:59:53 +08:00
parent aa0c438976
commit d5d7ea74c8
3 changed files with 60 additions and 3 deletions

View File

@ -1,3 +1,3 @@
SRC_FILES := startup_RV32M1_ri5cy.S system_RV32M1_ri5cy.c interrupt.c SRC_FILES := startup_RV32M1_ri5cy.S interrupt_gcc.S system_RV32M1_ri5cy.c interrupt.c
include $(KERNEL_ROOT)/compiler.mk include $(KERNEL_ROOT)/compiler.mk

View File

@ -11,7 +11,7 @@
#include <xs_base.h> #include <xs_base.h>
#include <xs_isr.h> #include <xs_isr.h>
#include "fsl_common.h" #include "fsl_common.h"
#include <RV32M1_ri5cy.h>
int ArchDisableHwIrq(uint32_t irq_num) int ArchDisableHwIrq(uint32_t irq_num)
{ {
@ -45,6 +45,25 @@ void EnableLocalInterrupt(x_base oldstat)
__enable_irq(); __enable_irq();
} }
typedef void (*irq_handler_t)(void);
extern const irq_handler_t isrTable[];
void SystemIrqHandler(uint32_t mcause)
{
uint32_t intNum;
if (mcause & 0x80000000) /* For external interrupt. */
{
intNum = mcause & 0x1FUL;
/* Clear pending flag in EVENT unit .*/
EVENT_UNIT->INTPTPENDCLEAR = (1U << intNum);
/* Now call the real irq handler for intNum */
isrManager.done->incCounter();
isrTable[intNum]();
isrManager.done->decCounter();
}
}

View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018/10/02 Bernard The first version
*/
#include "boot.h"
.section .text.entry
.align 2
.global IRQ_Handler
IRQ_Handler:
SAVE_X_REGISTERS
mv fp, sp
/* switch to interrupt stack */
la sp, __stack
/* interrupt handle */
csrr a0, mcause
csrr a1, mepc
mv a2, sp
call SystemIrqHandler
/* switch to from thread stack */
mv sp, fp
mv a0, fp
call KTaskOsAssignAfterIrq
j SwitchKTaskContextExit