启动文件—RISC-V通用MCU启动文件解释

发布时间 2023-09-27 15:26:54作者: WCH_CH32

_start:是整个bin文件的起始,第一个指令是j handle_reset,跳转到下文的handle_reset处。

 

_vectop_base:是中断向量表,用于存放中断函数的入口地址

  .weak是弱声明,此处把所有的中断函数都写了死循环,1:  j 1b的意思就是死循环,如果在其它.c文件中有声明则以.c中的函数内容为准,这就是weak的作用,把.c中没有声明的函数都写为死循环。目的是防止跑飞,当设置了中断,但是没有写入口函数时,调试可以发现,触发中断后会进入这里的死循环。

  另外,VTF快速免表中断的意思,就是把中断的入口地址存放在特定地方,中断触发后直接跳转,省去了到中断向量表中查找入口地址的一步,从而加快了中断的进入速度,在追求极限速度的外设上会使用。

 

 

handle_reset:这里就是从_start跳转到的地方,设置gp、sp指针,然后把data段数据从FLASH中搬运到RAM中。

data段是存放的有数据的静态变量,如全局变量 u8 a=1;  或是在函数中声明为static u8 b=2;

data段的特点是1:静态变量,2:非0,有数据。

_data_lma是变量初始数据存在FLASH中的地址,_data_vma是变量在代码运行过程中RAM的编译地址,_edata是RAM中的data段的结束地址,这三个都是从ld文件中得到的。

 

清零 bss段

bss段是存放没有初始数据的静态变量的地方,如全局变量 u8 a=0; 函数中的静态变量 static u8 b=0;

bss段的特点是1.静态变量,2.未初始化,或初始化为0。

_sbss是bss的起始地址,_ebss是结束地址,都是RAM的地址。

 

设置CSR寄存器

CSR寄存器在内核手册中

0xbc0是corecfgr,主要是流水线指令预测等设置,没有开放,一般默认。

0x804是intsyscr,主要是中断配置,硬件压栈、中断嵌套等,203、003中断嵌套等级需要修改这个地方。

mstatus是状态寄存器,主要是浮点和权限设置,跑操作系统时,需要设置为全程机器模式。

 

设置中断向量表的地址到mtvec寄存器

然后调用SystemInit函数,配置时钟,最后跳转到main函数。