7、抢占式调度

        在这一章中有一个需要注意的地方,即由于任务切换是由系统决定的,因此对于上一个任务的上下文保存过程放在了trap_vector中,并且switch_to函数的返回方式变为mret(中断处理要求使用mret)。

.global trap_vector
.balign 4

trap_vector:
	csrrw t6,mscratch,t6
	reg_save t6

	mv t5,t6
	csrr t6,mscratch
	STORE t6,30*SIZE_REG(t5)

	csrr a0, mepc
	STORE a0, 31*SIZE_REG(t5)

	csrw	mscratch, t5

	csrr	a0, mepc
	csrr	a1, mcause
	call	trap_handler

	csrw	mepc, a0

	csrr	t6, mscratch
	reg_restore t6
	
	mret


.global switch_to
.balign 4

switch_to:
    
    csrw mscratch, a0

	LOAD a1, 31*SIZE_REG(a0)
	csrw mepc, a1

    mv t6, a0
    reg_restore t6
    mret
.end

        而mret会恢复之前的特权级别、程序计数器、堆栈指针等上下文信息。即调用mret时,mstatus中的MIE位会被MPIE位替换。此时需注意start.S启动代码对于mstatus寄存器的赋值,把MPIE位赋值为1即可,这样调用mret后自动开启全局中断。

    csrr t0, mstatus
    ori t0, t0, 0x80
    csrw mstatus, t0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值