risc-v add irq stack

This commit is contained in:
acevest
2019-10-06 16:52:48 +08:00
parent f666ae3131
commit 93ae1c96ca
4 changed files with 25 additions and 1 deletions

View File

@@ -1,6 +1,14 @@
#include <tos.h>
#include <riscv_port.h>
#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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -43,5 +43,6 @@
#define TOS_CFG_MMBLK_EN 1u
#define TOS_CFG_IRQ_STK_SIZE 128u
#endif /* INC_TOS_CONFIG_H_ */