From 93ae1c96cae7503294b725d0bcd97a80d8516b7b Mon Sep 17 00:00:00 2001 From: acevest Date: Sun, 6 Oct 2019 16:52:48 +0800 Subject: [PATCH] risc-v add irq stack --- arch/risc-v/common/tos_cpu.c | 10 +++++++++- arch/risc-v/rv32i/gcc/port_s.S | 12 ++++++++++++ board/GD32VF103C_START/TOS_CONFIG/tos_config.h | 3 +++ board/QEMU_Spike/TOS-CONFIG/tos_config.h | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/arch/risc-v/common/tos_cpu.c b/arch/risc-v/common/tos_cpu.c index 3ae8f0ef..273f047b 100644 --- a/arch/risc-v/common/tos_cpu.c +++ b/arch/risc-v/common/tos_cpu.c @@ -1,6 +1,14 @@ #include #include +#ifndef TOS_CFG_IRQ_STK_SIZE +#warning "did not specify the irq stack size, use default value" +#define TOS_CFG_IRQ_STK_SIZE 128 +#endif + +k_stack_t k_irq_stk[TOS_CFG_IRQ_STK_SIZE]; +const k_stack_t *k_irq_stk_top = (k_stack_t *) ((char *)(k_irq_stk + TOS_CFG_IRQ_STK_SIZE) - sizeof(cpu_data_t)); + __KERNEL__ void cpu_systick_init(k_cycle_t cycle_per_tick) { port_systick_priority_set(TOS_CFG_CPU_SYSTICK_PRIO); @@ -9,6 +17,7 @@ __KERNEL__ void cpu_systick_init(k_cycle_t cycle_per_tick) __KERNEL__ void cpu_init(void) { k_cpu_cycle_per_tick = TOS_CFG_CPU_CLOCK / k_cpu_tick_per_second; + cpu_systick_init(k_cpu_cycle_per_tick); port_cpu_init(); @@ -173,4 +182,3 @@ __API__ uint32_t tos_cpu_clz(uint32_t val) return (nbr_lead_zeros); } - diff --git a/arch/risc-v/rv32i/gcc/port_s.S b/arch/risc-v/rv32i/gcc/port_s.S index 278cc199..233cc6cf 100644 --- a/arch/risc-v/rv32i/gcc/port_s.S +++ b/arch/risc-v/rv32i/gcc/port_s.S @@ -320,12 +320,24 @@ rv32_exception_entry: csrr t0, mstatus sw t0, __reg_mstatus__OFFSET(sp) + // switch to irq stack + mv t0, sp + la t1, k_irq_stk_top + lw sp, (t1) + andi sp, sp, 0xFFFFFFF0 + sw t0, (sp) + + // get irq num and call irq handler li t0, SOC_MCAUSE_EXP_MASK csrr a0, mcause and a0, a0, t0 call cpu_irq_entry + // switch back to task stack + lw t0, (sp) + mv sp, t0 + la t0, k_curr_task la t1, k_next_task diff --git a/board/GD32VF103C_START/TOS_CONFIG/tos_config.h b/board/GD32VF103C_START/TOS_CONFIG/tos_config.h index 939447d3..6c096ebf 100644 --- a/board/GD32VF103C_START/TOS_CONFIG/tos_config.h +++ b/board/GD32VF103C_START/TOS_CONFIG/tos_config.h @@ -48,6 +48,9 @@ // 配置TencentOS tiny空闲任务栈大小 #define TOS_CFG_IDLE_TASK_STK_SIZE 512u +// 配置TencentOS tiny中断栈大小 +#define TOS_CFG_IRQ_STK_SIZE 128u + // 配置TencentOS tiny的tick频率 #define TOS_CFG_CPU_TICK_PER_SECOND 1000u diff --git a/board/QEMU_Spike/TOS-CONFIG/tos_config.h b/board/QEMU_Spike/TOS-CONFIG/tos_config.h index 149d0915..2c46809f 100644 --- a/board/QEMU_Spike/TOS-CONFIG/tos_config.h +++ b/board/QEMU_Spike/TOS-CONFIG/tos_config.h @@ -43,5 +43,6 @@ #define TOS_CFG_MMBLK_EN 1u +#define TOS_CFG_IRQ_STK_SIZE 128u #endif /* INC_TOS_CONFIG_H_ */