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