risc-v add irq stack
This commit is contained in:
@@ -1,6 +1,14 @@
|
|||||||
#include <tos.h>
|
#include <tos.h>
|
||||||
#include <riscv_port.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)
|
__KERNEL__ void cpu_systick_init(k_cycle_t cycle_per_tick)
|
||||||
{
|
{
|
||||||
port_systick_priority_set(TOS_CFG_CPU_SYSTICK_PRIO);
|
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) {
|
__KERNEL__ void cpu_init(void) {
|
||||||
k_cpu_cycle_per_tick = TOS_CFG_CPU_CLOCK / k_cpu_tick_per_second;
|
k_cpu_cycle_per_tick = TOS_CFG_CPU_CLOCK / k_cpu_tick_per_second;
|
||||||
|
|
||||||
cpu_systick_init(k_cpu_cycle_per_tick);
|
cpu_systick_init(k_cpu_cycle_per_tick);
|
||||||
|
|
||||||
port_cpu_init();
|
port_cpu_init();
|
||||||
@@ -173,4 +182,3 @@ __API__ uint32_t tos_cpu_clz(uint32_t val)
|
|||||||
return (nbr_lead_zeros);
|
return (nbr_lead_zeros);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -320,12 +320,24 @@ rv32_exception_entry:
|
|||||||
csrr t0, mstatus
|
csrr t0, mstatus
|
||||||
sw t0, __reg_mstatus__OFFSET(sp)
|
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
|
// get irq num and call irq handler
|
||||||
li t0, SOC_MCAUSE_EXP_MASK
|
li t0, SOC_MCAUSE_EXP_MASK
|
||||||
csrr a0, mcause
|
csrr a0, mcause
|
||||||
and a0, a0, t0
|
and a0, a0, t0
|
||||||
call cpu_irq_entry
|
call cpu_irq_entry
|
||||||
|
|
||||||
|
// switch back to task stack
|
||||||
|
lw t0, (sp)
|
||||||
|
mv sp, t0
|
||||||
|
|
||||||
la t0, k_curr_task
|
la t0, k_curr_task
|
||||||
la t1, k_next_task
|
la t1, k_next_task
|
||||||
|
|
||||||
|
@@ -48,6 +48,9 @@
|
|||||||
// 配置TencentOS tiny空闲任务栈大小
|
// 配置TencentOS tiny空闲任务栈大小
|
||||||
#define TOS_CFG_IDLE_TASK_STK_SIZE 512u
|
#define TOS_CFG_IDLE_TASK_STK_SIZE 512u
|
||||||
|
|
||||||
|
// 配置TencentOS tiny中断栈大小
|
||||||
|
#define TOS_CFG_IRQ_STK_SIZE 128u
|
||||||
|
|
||||||
// 配置TencentOS tiny的tick频率
|
// 配置TencentOS tiny的tick频率
|
||||||
#define TOS_CFG_CPU_TICK_PER_SECOND 1000u
|
#define TOS_CFG_CPU_TICK_PER_SECOND 1000u
|
||||||
|
|
||||||
|
@@ -43,5 +43,6 @@
|
|||||||
|
|
||||||
#define TOS_CFG_MMBLK_EN 1u
|
#define TOS_CFG_MMBLK_EN 1u
|
||||||
|
|
||||||
|
#define TOS_CFG_IRQ_STK_SIZE 128u
|
||||||
|
|
||||||
#endif /* INC_TOS_CONFIG_H_ */
|
#endif /* INC_TOS_CONFIG_H_ */
|
||||||
|
Reference in New Issue
Block a user