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