今天把内核启动流程和时钟系统的知识点理了一遍,记录一下核心内容。
一、CPS指令
CPS指令在armv6指令集之后才支持,主要用来快速切换CPU工作模式,或者直接开关中断。
常用的模式切换指令:
切换到IRQ模式
cps #0x12
切换到system模式
cps #0x1F
开关中断也可以直接用CPS指令完成:
cpsie i :使能IRQ中断
cpsid i :屏蔽IRQ中断
二、ARM内核启动流程
标准的内核启动代码一共7步:
1. 设置异常向量表
2. 重映射异常向量表地址到0x87800000
3. 为不同工作模式开辟栈空间,主要是IRQ模式和system模式
4. 使能IRQ中断
5. 清零bss段
6. 打开icache
7. 引导内核跳转到C语言main函数执行
三、中断优先级
中断优先级的规则是编号越小,优先级越高。
GIC V2版本:最多支持1020个中断,256个优先级,范围0~255
IMX6ULL芯片:实际支持160个中断,32个优先级,范围0~31
优先级又分成抢占优先级(组优先级)和子优先级两级。
顺带提一下ocp原则:对代码修改是关闭的,对代码扩展是开放的,写驱动的时候尽量按这个思路来。
四、时钟系统基础
时钟源分无源晶振和有源晶振,IMX6ULL的外部主晶振是24MHz。
几个核心部件的作用:
PLL(锁相环):倍频,输入24MHz,乘以N倍得到高频时钟
Prescale(预分频器):分频,输入时钟除以M得到低频时钟
PFD(相位分数分频器):实现分数倍频/分频,比例为N/M,大于1是倍频,小于1是降频
预分频器的位宽决定分频范围,2位预分频器分频档位少,3位预分频器可以实现1~8分频。
五、IMX6ULL系统时钟配置
完整的时钟配置分三步:
1. 配置ARM内核时钟,设置为528MHz
2. 配置PLL2下的4个PFD和PLL3下的4个PFD
3. 配置三个根时钟,分别为132MHz、66MHz、66MHz
外设时钟就从这些根时钟里取源,再经过外设自己的分频器得到最终工作频率。



