Administrator
发布于 2023-09-09 / 10 阅读 / 0 评论 / 0 点赞

RV32OS实现-其三

修复抢占式bug,记一次重大bug修复

起因:

1. entry.S的switch_to重写后不再用ret,而是mret(因为抢占式需要trap跳转)

2. 然而,sched.c的task_create()函数中,ctx_tasks[_top].ra = (reg_t) start_routin;该句子没有一起修改

解决方案:

ctx_tasks[_top].ra = (reg_t) start_routin; ——> ctx_tasks[_top].pc = (reg_t) start_routin;

解释:

ret

ret时,pc寄存器 会设置为 ra寄存器存的地址

mret

mret 将 PC 设置为 mepc的值

分析一个原子性上锁

loop:
	lw	a4,-20(s0)				# s0里放的地址 加上-20 放入a4		(a4里最终还是地址)
	li	a5,1					# a5里写1
	amoswap.w.aq	a5,a5,(a4)	# 把a4指向的内存里的值 与 a5 交换
	mv	a3,a5					a3复制寄存器a5
	bnez	a3,loop

优点:直接原子性的交换了1和锁的值,

然后再慢慢看锁的值。

如果值是1,继续2循环,否则直接走下去


评论