esp32 c3 mini芯片模块乐鑫科技代理商名单Startup.s 分析,GD32VFIxx 通过 ECLIC 管理处理器的多个中断。如果在应用程序中使用中新,侧需要设置中断向量表。GD32VF1xx Startup.s 包括中断向量表(见表 7.2)和复位中断服务程序 Reset_Handler。
如果使用中断向量表处理中断请求,esp32 c3 mini芯片模块乐鑫科技代理商名单则在 Linker 选项中需要将“Reset_Handler”设置为程序入口。
1、Reset_Handler 人口,根据启动程序所在内存地址选择分支跳转。
Reset_Handler:
la a0,_start //读取启动代码入口地址
li al,1
slli al, al, 29 //a1 = 0x2000 0000,片内 SRAM 起始地址
bleu al, a0,_start0800 //如果_start 在 SRAM起始位置,则跳到_start0800
srli al, al, 2 //a1 = 0x800 0000,片内 Elash 起始地址
bleu al, a0,_start0800 //如果_start 在 Elash起始位置,则跳到_start0800
la a0,_start0800
add a0, a0, al //a0 +a1 = 0x800 000 + _start0800,Elash 偏移
jr a0 //跳到_start0800
2、 设置中断向量,将中断向量表的基地址写入 mtvt,设置非向量中断和内核异常处理程序入口。
_start0800:
li t0,0x200
CSrS CSR MMISC_CTL,t0 //NMI 与其他中断共享向量表
/* 设置 ECLIC 中断向量表人口地址 */
la t0, vector_base
CsrW CSR_MTVT,t0
/* 设置非向量中断服务程序入口 */
la t0,irg_entry
csrw CSR_MIRQ_ENTRY,t0
csrs CSR_MIRQ_ENTRY,0x1
/* 设置内核异常处理程序人口 */
la t0, trap_entry
csrw CSR_MTVEC,t0
/*跳到启动代码人口_start*/
la t1, _start
jalr t1
2.entry.s 分析
entry.s 文件中包括 RISC-V 内核异常服务序 trap_entry 和非向量模式中断服务程序 irq_entry。
(1) trap_entry
响应异常请求后,进入 trap_entry,保存寄存器数据到栈中,esp32 c3 mini芯片模块乐鑫科技代理商名单跳转到处理函数handle_trap,处理完成后恢复数据并返回。
trap_entry:
addi sp,sp,-19* REGBYTES //分配栈空间
SAVE CONTEXT //保存通用寄存器,已定义宏
SAVE MEPC_MSTATUS //保存 mepc 和 mstatus 寄存器值,已定义宏
/*调用内核异常处理函数 handle_trap*/
csrr a0,mcause
mv al,sp
call handle_trap //使用ECLIC后,handle_trap 为空
/*恢复上下文*/
RESTORE MEPC MSTATUS //恢复 mepc 和 mstatus 寄存器值,已定义宏
RESTORE CONTEXT //恢复通用寄存器,已定义宏
addi sp, sp,19* REGBYTES //释放栈空间
Mret //机器模式返回
(2) irq_entry
在非向量中断模式下,在响应所有中断请求后,处理器先进入 irq_entry,然后通过执行指令“csrrw ra,CSR_MINTSEL_JAL,ra”,访问自定义 CSR 寄存器 CSRMINTSEL_JAL,esp32 c3 mini芯片模块乐鑫科技代理商名单进入中断向量表中对应的服务程序。
irq entry:
.......
/*备份 CSR寄存器*/
csrrwi x0,CSR PUSHMCAUSE,16
csrrwi x0,CSR PUSHMEPC,17
csrrwi x0,CSR PUSHMXSTATUS,18
service_loop;
csrrw ra,CSR_MINTSEL_JAL,ra //跳到中断向量
/*恢复寄存器 */
RESTORE_CONTEXT EXCPT_X5
/*关闭中断*/
DISABLE MIE
/*恢复 CSR 寄存器*/
LOAD x5,18 *REGBYTES(sp)
CSrW CSR_MXSTATUS,x5
LOAD x5,17*REGBYTES(sp)
csrw CSR_MEPC,x5
LOAD x5, 16 *REGBYTES(sp)
csrw CSR_MCAUSE,x5
RESTORE_CONTEXT_ONLY_X5
......
mret