简介
以CK802(APT32F110x)为例,对系统的启动代码做个简单说明,供参考和学习。
一、异常
CK802异常包括处理器内部和外部异常事件,共有64个异常向量;0~29号向量是处理器内部识别向量,31号向量是留给软件的,32~63号是外设,即外部设备异常(中断)向量,其外设中断事件和内部异常事件统称为异常事件,处理方式一致。
1、异常向量表(中断向量表)
2、通用寄存器初始化和异常配置相关初始化
异常发生时,处理器保存PSR和PC到EPSR和EPC中,PSR中超级用户模式位S置1,异常向量号VEC域更新为当前发生的异常向量号;处理器根据PSR中的异常向量号计算异常入口地址(具体计算方式:用PSR中的异常向量号乘以4 + 向量基准寄存器VBR中的地址),然后进入异常(中断)服务程序(向量表中对应的服务程序入口地址)。
启动代码里先将16个32位的通用寄存器(R0~R15)初始化为0;将中断向量表首地址装载到向量基准寄存器VBR中,然后使能PSR寄存器中的异常控制位,异常有效。
二、堆栈
将栈顶位置赋值给堆栈指针寄存器R14(sp)中,并将栈顶存储空间初始化为0;栈顶__kernel_stack定义在gcc_xxx.ld链接文件中(__kernel_stack = ORIGIN(RAM) + LENGTH(RAM) - 8 ; /* stack top */)。
三、内存操作
可执行文件(ihex)包含RO Size + RW Size;RO Size 包含Code + RO Data,RW Size包含 RW DATA+ ZI DATA,系统启动时需要将RW Data段拷贝到SRAM中,ZI DATA段初始化为0;
__main函数中 _start_data、 _end_rodata、 _bss_start、_ebss在gcc_xxx.ld链接文件中定义。关于链接文件介绍,请参阅文档:LD文件实例分析