32位arm cpu采用流水线设计,分为取址、译码、执行,一条汇编指令对应一条机器码,占用32位 4个字节。32位cpu最大寻址空间为4g,上电默认从0x00000000地址执行。
一般而言,该地址存放芯片厂商的BL0程序,固化在芯片内部的irom中,一般大小只有几十KB,同时芯片内部还有一个较小的iram内存以供该段程序执行。BL0会获取开发板上的拨码开关状态来决定从SD卡还是EMMC运行,它其实是一条跳转指令B 地址,在SD卡中刷入uboot引导,uboot是二进制程序,是cpu能够直接运行的一个精简系统,它支持用户终端输入、文件系统、多种网络协议。由于它支持终端输入,所以可配置环境变量来引导linux内核,linux内核也是一段二进制程序,它通过和设备树结合来运行,运行后挂载根文件系统进入shell环境。根文件系统是一个包含很多工具已经内核配置以及众多库的一个文件列表。
ARM 处理器共有 7 种不同的处理器模式:
(1)USR(10000):正常用户模式,程序正常执行模式。
(2)FIQ(10001):快速中断模式,以处理快速情况,支持高速数据传输或通道处理。
(3)IRQ(10010):外部中断模式,普通中断处理
(4)SVC(10011):操作系统保护模式(管理模式),即操作系统使用的特权模式(内核),处理软件中断swi reset
(5)abt(10111):数据访问中止模式,用于 虚拟存储器 和 存储器 保护
(6)und(11011):未定义指令终止模式,用于支持通过软件仿真硬件的协处理器
(7)sys(11111):系统模式,用于运行特权级的操作系统任务( armv4 以上版本才具有)
在不同模式下,寄存器有的共用,有的有独立寄存器,见下图。
CPSR寄存器前面几位记录了cpu运算过程中发生溢出等,后面几位代表IRQ、FIQ中断的开启与否,指令集状态为thumb还是arm状态,以及arm处于具体的工作模式。IRQ和FIQ都是硬件中断,不过它们的优先级不同,SWI为软中断。当中断发生时,cpu会跳转到异常向量表,这个向量表默认为0x00 -0xXX ,每一种模式占向量表中的4个字节,只能包含一条跳转指令,硬件与cpu之间是通过中断控制器来处理中断的,中断控制器中有一个中断队列,负责管理中断,同时中断控制器包含所有外设的中断ID,当发生中断后,cpu处理中断过程中可以通过读取中断控制器中的id获知是哪个硬件产生的中断,从来处理逻辑。
R15也就是PC寄存器,PC寄存器永远指向当前要执行的指令,R13也就是LR寄存器,指向跳转后返回需要执行的指令。如果有多级跳转,那么需要将数值压栈。指令的跳转一般伴随着寄存器存储值的入栈和出栈,当返回后不至于数据丢失。
当CPU处于用户模式下,没有权限修改CPSR,所以CPU改变模式意味着发生中断,或者发生错误。
FIQ的优先级优于IRQ,同时FIQ在异常向量表中的地址处于最末尾,后面可以紧跟一段程序,免去了跳转指令,同时FIQ模式下R8-R12都有它独立的寄存器,使用这些寄存器不需要出入栈,使得FIQ的运行速度更快。
ARM最常用汇编指令:MOV 将值移入寄存器, LD开头 从内存载入寄存器 ST开头 从寄存器存入内存 B开头 跳转 SUB 减法 ADD 加法 M开头 协处理器 SWI 软中断指令
片内外设控制器:
GPIO 负责通用的输入输出,UART 串口 一般由两个线(TD、RD)它用来点对点通信,串口通过波特率来保证两段同步,串口最多每次发5-8位数据,发送之前要发送开始信号,结束要发送结束信号。WDT 开门狗 :本质是一个倒计时硬件,倒计时结束(意味着发生cpu错误)产生cpu复位,cpu需要时不时通知修改WDT的倒计时保证不归零,开门狗也可用来作为定时器,ADC 模数转换器,可用来监测电压的变化,RTC 时钟:一个具备统计当前时间的控制器,以BCD格式存储,一般由备用电池供电来保证断电后时间的准确性,PWM:能发出脉冲信号的控制器,用于无源蜂鸣器发声。IIC总线,芯片级通信协议,由SCL\SDA两条线构成,IIC默认情况下两条线都是高电平,SCL下降沿代表发送,上升沿代表结束。IIC是主从结构,初次发送一位开启位占领总线,然后发送7位地址信息以及发送方向,接收方发送应答,发送方发送数据,接收方发应答,发送方发结束信号,IIC是半双工通信协议。SPI: spi也是一种总线协议,它由多条线组成,时钟线、主-从线,从-主线、CS线,CS线有多少个从设备,主设备就要引出多少条CS线,CS线同一时间只有一条线的电平保持通信中该有的电平,时钟线保证数据同步收发,它是全双工的通信,所以它比IIC速度快。