risc-v add irq stack
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -43,5 +43,6 @@
|
||||
|
||||
#define TOS_CFG_MMBLK_EN 1u
|
||||
|
||||
#define TOS_CFG_IRQ_STK_SIZE 128u
|
||||
|
||||
#endif /* INC_TOS_CONFIG_H_ */
|
||||
|
Reference in New Issue
Block a user