Merge pull request #31 from acevest/save_irq_switch_stack_size
risc-v reduce use 128 bytes irq stack
This commit is contained in:
@@ -31,3 +31,11 @@ __PORT__ void port_systick_config(uint32_t cycle_per_tick)
|
|||||||
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 4) = 0xFFFFFFFF & (mtimecmp >> 32);
|
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 4) = 0xFFFFFFFF & (mtimecmp >> 32);
|
||||||
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 0) = 0xFFFFFFFF & (mtimecmp >> 0);
|
*(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIMECMP + 0) = 0xFFFFFFFF & (mtimecmp >> 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int k_task_irq_switch_flag = 0;
|
||||||
|
__PORT__ void port_irq_context_switch()
|
||||||
|
{
|
||||||
|
k_task_irq_switch_flag = 1;
|
||||||
|
}
|
||||||
|
@@ -10,19 +10,19 @@
|
|||||||
|
|
||||||
.global port_sched_start
|
.global port_sched_start
|
||||||
.global port_context_switch
|
.global port_context_switch
|
||||||
.global port_irq_context_switch
|
|
||||||
|
|
||||||
.extern k_curr_task
|
.extern k_curr_task
|
||||||
.extern k_next_task
|
.extern k_next_task
|
||||||
|
.extern k_task_irq_switch_flag
|
||||||
|
|
||||||
#define MSTATUS_MIE 0x00000008
|
.equ MSTATUS_MIE, 0x00000008
|
||||||
#define MSTATUS_MPP 0x00001800
|
.equ MSTATUS_MPP, 0x00001800
|
||||||
|
|
||||||
#define MIE_MTIE (1 << 7)
|
.equ MIE_MTIE, (1 << 7) // machine mode interrupt enable
|
||||||
|
|
||||||
#define MIP_MTIP (1 << 7)
|
.equ MIP_MTIP, (1 << 7) // machine mode timer interrupt pending
|
||||||
|
|
||||||
#define REGBYTES 4
|
.equ REGBYTES, 4
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 2
|
.align 2
|
||||||
@@ -192,36 +192,6 @@ port_context_switch:
|
|||||||
|
|
||||||
mret
|
mret
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
.type port_irq_context_switch, %function
|
|
||||||
port_irq_context_switch:
|
|
||||||
SAVE_CONTEXT
|
|
||||||
|
|
||||||
sw ra, 0*REGBYTES(sp)
|
|
||||||
|
|
||||||
li t0, MSTATUS_MPP
|
|
||||||
sw t0, 1*REGBYTES(sp)
|
|
||||||
|
|
||||||
// save sp to k_curr_task.sp
|
|
||||||
la t0, k_curr_task // t0 = &k_curr_task
|
|
||||||
lw t1, (t0)
|
|
||||||
sw sp, (t1)
|
|
||||||
|
|
||||||
// switch task
|
|
||||||
// k_curr_task = k_next_task
|
|
||||||
la t1, k_next_task // t1 = &k_next_task
|
|
||||||
lw t1, (t1) // t1 = k_next_task
|
|
||||||
sw t1, (t0)
|
|
||||||
|
|
||||||
// load new task sp
|
|
||||||
lw sp, (t1)
|
|
||||||
|
|
||||||
RESTORE_CONTEXT
|
|
||||||
|
|
||||||
mret
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
.global trap_entry
|
.global trap_entry
|
||||||
.global irq_entry
|
.global irq_entry
|
||||||
@@ -244,13 +214,33 @@ irq_entry:
|
|||||||
mv a1, sp
|
mv a1, sp
|
||||||
bltz a0, irq
|
bltz a0, irq
|
||||||
call cpu_trap_entry
|
call cpu_trap_entry
|
||||||
j restore
|
j irq_restore
|
||||||
|
|
||||||
irq:
|
irq:
|
||||||
slli a0, a0, 16
|
slli a0, a0, 16
|
||||||
srli a0, a0, 16
|
srli a0, a0, 16
|
||||||
call cpu_irq_entry
|
call cpu_irq_entry
|
||||||
restore:
|
|
||||||
|
la t0, k_task_irq_switch_flag
|
||||||
|
lw t1, (t0)
|
||||||
|
beqz t1, irq_restore
|
||||||
|
sw zero,(t0)
|
||||||
|
|
||||||
|
// save sp to k_curr_task.sp
|
||||||
|
la t0, k_curr_task // t0 = &k_curr_task
|
||||||
|
lw t1, (t0)
|
||||||
|
sw sp, (t1)
|
||||||
|
|
||||||
|
// switch task
|
||||||
|
// k_curr_task = k_next_task
|
||||||
|
la t1, k_next_task // t1 = &k_next_task
|
||||||
|
lw t1, (t1) // t1 = k_next_task
|
||||||
|
sw t1, (t0)
|
||||||
|
|
||||||
|
// load new task sp
|
||||||
|
lw sp, (t1)
|
||||||
|
|
||||||
|
irq_restore:
|
||||||
RESTORE_CONTEXT
|
RESTORE_CONTEXT
|
||||||
|
|
||||||
mret
|
mret
|
||||||
|
|
||||||
|
@@ -27,7 +27,7 @@ void task2(void *pdata)
|
|||||||
share++;
|
share++;
|
||||||
for(int i=0; i<5; i++) {
|
for(int i=0; i<5; i++) {
|
||||||
printf("hello world from %s cnt: %08x\n", __func__, task_cnt2--);
|
printf("hello world from %s cnt: %08x\n", __func__, task_cnt2--);
|
||||||
tos_task_delay(200);
|
tos_task_delay(10);
|
||||||
}
|
}
|
||||||
tos_sem_post(&sem);
|
tos_sem_post(&sem);
|
||||||
}
|
}
|
||||||
|
@@ -14,11 +14,8 @@ void task1(void *pdata)
|
|||||||
{
|
{
|
||||||
t1++;
|
t1++;
|
||||||
share++;
|
share++;
|
||||||
//k_tick_t delay = tos_millisec2tick(10);
|
tos_task_delay(2);
|
||||||
//tos_task_delay(delay);
|
//tos_task_yield();
|
||||||
tos_task_yield();
|
|
||||||
//osDelay(10);
|
|
||||||
//asm("wfi;");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,9 +26,9 @@ void task2(void *pdata)
|
|||||||
{
|
{
|
||||||
t2--;
|
t2--;
|
||||||
share--;
|
share--;
|
||||||
//tos_task_delay(10);
|
tos_task_delay(3);
|
||||||
tos_task_yield();
|
//tos_task_yield();
|
||||||
asm("wfi;");
|
//asm("wfi;");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user