CK80x系列内核启动代码介绍

简介

以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文件实例分析

四、进入main主函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值