_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函数。
标签:文件,函数,启动,中断,RISC,地址,跳转,data,变量 From: https://www.cnblogs.com/wchmcu/p/17732814.html