RISC-V在不同中断选项下,寄存器的保存规则

无特殊选项(普通函数,非中断服务函数ISR):

void SysTick_Handler(void)
{
	SysTick->SR = 0;
	millis_count++;
}
void SysTick_Handler(void)
{
	SysTick->SR = 0;
    254c:	e000f7b7          	lui	a5,0xe000f
    2550:	0007a223          	sw	zero,4(a5) # e000f004 <_eusrstack+0xbffff004>
	millis_count++;
    2554:	200007b7          	lui	a5,0x20000
    2558:	0c478793          	addi	a5,a5,196 # 200000c4 <millis_count>
    255c:	4398                	lw	a4,0(a5)
    255e:	0705                	addi	a4,a4,1
    2560:	c398                	sw	a4,0(a5)
}
    2562:	8082                	ret

"machine" 选项:

void SysTick_Handler(void) __attribute__((interrupt("machine")));

void SysTick_Handler(void)
{
	SysTick->SR = 0;
	millis_count++;
}
void SysTick_Handler(void)
{
    254c:	1141                	addi	sp,sp,-16
    254e:	c63a                	sw	a4,12(sp)
    2550:	c43e                	sw	a5,8(sp)
	SysTick->SR = 0;
    2552:	e000f7b7          	lui	a5,0xe000f
    2556:	0007a223          	sw	zero,4(a5) # e000f004 <_eusrstack+0xbffff004>
	millis_count++;
    255a:	200007b7          	lui	a5,0x20000
    255e:	0c478793          	addi	a5,a5,196 # 200000c4 <millis_count>
    2562:	4398                	lw	a4,0(a5)
    2564:	0705                	addi	a4,a4,1
    2566:	c398                	sw	a4,0(a5)
}
    2568:	4732                	lw	a4,12(sp)
    256a:	47a2                	lw	a5,8(sp)
    256c:	0141                	addi	sp,sp,16
    256e:	30200073          	mret

"supervisor" 选项:

void SysTick_Handler(void) __attribute__((interrupt("supervisor")));

void SysTick_Handler(void)
{
	SysTick->SR = 0;
	millis_count++;
}
void SysTick_Handler(void)
{
    254c:	1141                	addi	sp,sp,-16
    254e:	c63a                	sw	a4,12(sp)
    2550:	c43e                	sw	a5,8(sp)
	SysTick->SR = 0;
    2552:	e000f7b7          	lui	a5,0xe000f
    2556:	0007a223          	sw	zero,4(a5) # e000f004 <_eusrstack+0xbffff004>
	millis_count++;
    255a:	200007b7          	lui	a5,0x20000
    255e:	0c478793          	addi	a5,a5,196 # 200000c4 <millis_count>
    2562:	4398                	lw	a4,0(a5)
    2564:	0705                	addi	a4,a4,1
    2566:	c398                	sw	a4,0(a5)
}
    2568:	4732                	lw	a4,12(sp)
    256a:	47a2                	lw	a5,8(sp)
    256c:	0141                	addi	sp,sp,16
    256e:	10200073          	sret

"user" 选项:

void SysTick_Handler(void) __attribute__((interrupt("user")));

void SysTick_Handler(void)
{
	SysTick->SR = 0;
	millis_count++;
}
void SysTick_Handler(void)
{
    254c:	1141                	addi	sp,sp,-16
    254e:	c63a                	sw	a4,12(sp)
    2550:	c43e                	sw	a5,8(sp)
	SysTick->SR = 0;
    2552:	e000f7b7          	lui	a5,0xe000f
    2556:	0007a223          	sw	zero,4(a5) # e000f004 <_eusrstack+0xbffff004>
	millis_count++;
    255a:	200007b7          	lui	a5,0x20000
    255e:	0c478793          	addi	a5,a5,196 # 200000c4 <millis_count>
    2562:	4398                	lw	a4,0(a5)
    2564:	0705                	addi	a4,a4,1
    2566:	c398                	sw	a4,0(a5)
}
    2568:	4732                	lw	a4,12(sp)
    256a:	47a2                	lw	a5,8(sp)
    256c:	0141                	addi	sp,sp,16
    256e:	00200073          	uret

沁恒(WCH)定制选项:

void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void SysTick_Handler(void)
{
	SysTick->SR = 0;
	millis_count++;
}
void SysTick_Handler(void)
{
	SysTick->SR = 0;
    254c:	e000f7b7          	lui	a5,0xe000f
    2550:	0007a223          	sw	zero,4(a5) # e000f004 <_eusrstack+0xbffff004>
	millis_count++;
    2554:	200007b7          	lui	a5,0x20000
    2558:	0c478793          	addi	a5,a5,196 # 200000c4 <millis_count>
    255c:	4398                	lw	a4,0(a5)
    255e:	0705                	addi	a4,a4,1
    2560:	c398                	sw	a4,0(a5)
}
    2562:	30200073          	mret