[嵌入式]Cortex-A8处理器编程(上)

来源:互联网 发布:流量互换源码 编辑:程序博客网 时间:2024/06/05 15:20

Cortex-A8处理器编程

3.1 ARM编程简介

·在嵌入式系统开发中,目前使用的主要编程语言是C和汇编。很多地方,例如开机时硬件系统的初始化,包括CPU状态的设定、中断的使能、主频的设定、以及RAM的控制参数及初始化等都使用汇编语言。汇编语言是和CPU的指令集紧密相连的,作为涉及底层的嵌入式系统开发,汇编语言编程不可或缺的重要方法。

·ARM嵌入式系统程序设计和所使用的ARM微处理器资源密切相关。只有了解ARM微处理器的工作模式、状态、存储器组织、寻址方式,并且掌握ARM的指令系统,才有可能写出适用的ARM程序。

3.2 Cortex-A8处理器模式和状态

一、处理器模式

 

二、处理器状态

 Cortex-A8处理器有3种操作状态,这些状态由CPSR寄存器的T位和J位控制。

· ARM状态:执行32位字对齐的ARM指令,T位和J位为0。

· Thumb状态:执行16位或32位半字对齐的Thumb2指令,T位为1,J位为0。

· ThumbEE状态:执行为动态产生目标而设计的16位或32位半字对齐的Thumb2指令集的变体。T位和J位为1。

处理器的操作状态可以在以下几种状态间转换:

 ·ARM状态和Thumb状态之间转换

   使用BL和BLX指令,并加载到PC。

 ·Thumb状态和ThumbEE状态之间转换

   使用ENTERX指令和LEAVEX指令。

   异常会导致处理器进入ARM状态或Thumb状态。一般情况,当退出异常处理时,处理器会恢复原来的T位和J位的值。

3.3 Cortex-A8存储器组织

一、数据类型

Cortex-A8支持以下数据类型:

1)双字,64位;2)字,32位;3)半字,16位;4)字节,8位。

    当这些数据类型为无符号数据时,为普通二进制格式,N位数据值代表一个非负整数(范围为0~2N-1);当这些数据类型为有符号数据时,为二进制补码格式,N位数据值代表一个整数(范围为-2N-1~2N-1-1)。

为了达到最好的性能,数据必须按照以下方式对齐:

 ·以字为单位时,按4字节对齐;

 ·以半字为单位时,按2字节对齐;

 ·以字节为单位时,按1字节对齐。

Cortex-A8处理器支持混合大小端格式和非对齐数据访问。

 

二、存储格式

Cortex-A8处理器支持小端格式和字节不变的大端格式。此外,处理器还支持混合大小端格式(既有大端格式又有小端格式)和非对齐数据访问。对指令的读取,则总是以小端格式操作。

例如:对于0x12345678数据,大端模式和小端模式的存放如图所示。

 

三、寄存器组

Cortex-A8处理器总共有40个32位长的寄存器。

· 33个通用寄存器。

·7个状态寄存器:

——1个CPSR(Current Programs Status Register,当前程序状态寄存器);

——6个SPSR(Saved Program Status Register,备份程序状态寄存器)。

这些寄存器不能同时访问,处理器状态和操作模式决定了哪些寄存器对编程者是可用的。

 

  · 未分组的通用寄存器R0—R7

    16个数据寄存器中R0--R7是未分组的通用寄存器,用来保存数据和地址。

  ·分组通用寄存器R8—R15,处理器模式决定物理寄存器

    ——R8—R12寄存器:快速中断及其他模式两组;

    ——R13,R14寄存器:分7组,用户和管理模式共用;

            R13:又称SP,堆栈指针

            R14:又称LR,链接寄存器

    ——R15:又称PC,程序计数器,所有模式共用;

  · 当前状态寄存器CPSR:所有模式共用;

  · 分组的状态保存寄存器SPSR:6个异常模式对应。

处理器有两类程序状态寄存器:1个当前程序状态寄存器CPSR和6个状态保存寄存器SPSR,主要功能如下:

·保存最近执行的算术或逻辑运算的信息;

·控制中断的允许或禁止;

·设置处理器操作模式。

 

状态寄存器

·条件标志位

·Q标志位

·IT块

·J位

·GE[3:0]位

·E位

·A位

·控制位

    ——中断屏蔽位

    ——T位

    ——模式位

·保留位

 

3.4 异常

异常是处理外部异步事件的一种方法,在有些处理器架构中称为中断。

    当某个异常发生时,例如一个来自外围设备的中断,处理器将暂停正常运行的程序。在处理这个异常之前,处理器需要保留当前处理器状态以便在异常处理程序结束之后恢复原来程序运行。

    若有两个或更多的异常同时发生,处理器将根据中断优先级来处理这些异常。

一、异常入口

二、异常退出

 

三、复位异常(RESET)

复位也是一种异常。当复位信号产生时,复位发生处理器放弃正在执行的指令。当复位信号失效之后,处理器会采取如下动作:

·将CPSR置为10011,安全Supervisor模式。

·将CPSR的A、I、F位置为1。

·将CPSR的J位置0,根据CFGTE输入的状态来决定CPSR的T位;CPSR的其他位不确定。

·强制PC从复位向量地址中获取下一条指令。

·根据CFGTE输入的状态,在ARM或者Thumb状态下执行恢复操作。

·复位之后,除了PC和CPSR以外的所有的寄存器的值都是不确定的。

四、快速中断异常(FIQ)

    FIQ异常支持快速中断。FIQ模式有8个专用寄存器。可以通过设置CPSR的F标志位,在特权模式中禁止FIQ。

五、中断异常(IRQ)

   IRQ比FIQ优先级低。当处理器进入FIQ处理时,IRQ会被屏蔽。可以通过设置CPSR的I位在特权模式下禁止IRQ异常。

六、中止异常(ABT)

试图访问无效的指令或数据内存单元通常都会引起中止。

——预取指中止:预读取中止发生时,处理器将标志这条预读取指令无效,但是直到执行这条指令才产生异常。

——数据中止:试图访问无效的数据内存单元引起。

七、软件中断异常

SVC指令进入管理模式,通常是为了请求一个特殊的管理员功能。SVC处理程序通过读取操作码来提取SVC功能号。

八、监控异常

当处理器执行SMC指令,内核进入监控模式请求监控功能。用户进程执行SMC会导致一个未定义的指令异常发生。

九、未定义指令异常

当遇到一条处理器或系统协处理器无法处理的指令时,则产生未定义指令异常。软件可以利用这种机制,通过模拟未定义的协处理器指令来扩展ARM指令集。

十、断点指令

执行断点指令BKPT,产生一个预取中止异常。在指令到达流水线执行阶段前,不会引起处理器产生预取中止异常。

 

异常向量与优先级

异常出现后处理器强制从异常类型所对应的固定存储器地址开始执行程序,这些地址称为异常向量(exception vectors)。在没有进行虚拟内存映射时,异常向量表放置于物理内存地址最低处

 

异常的进入

当处理一个异常时,ARM9内核完成以下动作:

(1)将下一条指令的地址保存在相应的LR寄存器中。

(2)将CPSR复制到相应的SPSR中。

(3)迫使CPSR模式位M[4:0]的值设置成对应的异常模式值

(4)迫使PC从相关的异常向量取下一条指令。

(5)用户可以设置中断禁止位来阻止或打开异常嵌套。如果在异常发生时处理器是在Thumb状态下,自动切换进入ARM状态。

异常的退出

在完成异常处理后,ARM9完成以下动作:

(1)将LR寄存器的值减去相应的偏移量(偏移量根据异常的不同而不同),送到PC中。

(2)将SPSR复制回CPSR中。

(3)清除中断禁止位标志。

 

 

 

0 0
原创粉丝点击