关闭

ARM裸机程序开发——ARM运行模式及寄存器

标签: arm运行模式 寄存器
596人阅读 评论(0) 收藏 举报
分类:

现在来总结一下ARM的运行模式以及寄存器

★ARM的运行模式类型

ARM微处理器有7中运行模式:用户模式(user)、系统模式(system)、一般中断模式(IRQ)、快速中断模式(FIQ)、管理模式(supervisor、svr)、中止模式(abort)、未定义指令中止模式(undefined)

◇这七种运行模式分别用于什么情况下?

▲用户模式:用户模式是用户程序的工作模式,它运行在操作系统的用户态,没有权限去操作硬件资源,只用执行处理自己的数据,也不能切换到其他的模式。如果想要访问硬件资源只能靠两种办法:产生异常或者软中断

▲系统模式:系统模式是特权模式,不受用户模式的限制。用户模式跟系统模式共用一套寄存器。操作系统在该模式下可以访问用户模式的寄存器,操作系统的一些特权任务也可以使用这个模式访问一些受控的资源。

▲一般中断模式:又叫做普通中断模式,用于一般的中断请求,通常在硬件产生中断后进入该模式,该模式可以自由访问硬件资源

▲快速中断模式:相对于一般中断模式,用于处理紧急的中断请求,主要用于高速数据传输及通道处理中

▲管理模式:CPU上电后,默认会进入到这个模式,用来做系统的一些初始化工作,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时通过软件中断进入该模式

▲中止模式:用于虚拟内存以及存储器的保护,当用户程序访问非法地址或者没有权限读取的地址时,会进入该模式。在Linux编程中,经常会出现segment fault一般都是在该模式下抛出的返回

▲未定义模式

用于支出硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别的指令操作时,就会进入未定义模式

◇他们的关系图

◇这几种模式具体是如何切换的?(阅读Bootloader源代码)

★ARM寄存器

ARM中共有37个寄存器,但是不能在任何模式下都可以使用,它与工作模式有关系。不同的工作模式会使用不同的寄存器组。

◇通用寄存器

通用寄存器可分为不分组寄存器(R0-R7)和分组寄存器(R8-R14)和程序计数器(R15)

◇不分组寄存器(R0-R7)

不分组寄存器工作在所用的模式下,并且没有隐含的功能

◇分组寄存器(R8-R14)

分组寄存器(R8-R14)则取决于当前的处理器工作模式,每种工作模式都有专用的分组寄存器。寄存器R8-R12可以分为2组物理寄存器。一组用于FIQ模式,另一组用于除FIQ之外的其他模式。寄存器R13-R14可分为6个分组的物理寄存器。1个用于用户模式和系统模式,其他5个分别用于svc,abt,und,irq和fiq这5个异常模式。访问时需要指定他们的模式。R13_svc,R13_abt等等

▲什么是分组寄存器?

分组寄存器在CPU不同的工作模式下所指向的物理寄存器是不同的。例如:对于分组寄存器R8-R12来说,它指向两组不同的物理寄存器。FIQ模式用一组,其他模式使用另外一组。那么在FIQ模式和其他几个模式下,虽然都是使用R8-R12这几个寄存器,但是它们却是使用了不相同的物理寄存器。


▲分组寄存器有什么作用?(或者说为什么会出现分组寄存器呢)

就使用R8-R12这几个分组寄存器。都知道这几个寄存器分为2组,其中FIQ模式使用一组,假设为A组,其他的工作模式使用另一组,假设为B组。那么当CPU运行在用户模式的时候,使用的是B组寄存器。这是突然产生一个快速中断,CPU转换为FIQ模式,然后处理中断。而快速中断模式一般使用来处理比较紧急的中断,主要用于高速的数据传输及通道处理,因此FIQ模式下处理的中断一般都是体现处理速度要非常快。如果FIQ模式与USER模式使用同一组寄存器,就会出现这样的情况,首先要将USER模式下这组寄存器的值保存下来,然后才能处理FIQ模式的中断,最后在将USER模式下的寄存器值还原,这样就会减慢了速度。而使用两组寄存器则可以解决这个问题。

◇程序计数器(R15)

寄存器R15被用作程序计数器

◇状态寄存器CPSR


▲条件代码标志位


▲保留位

▲控制位

△中断禁止位

I = 1 禁止IRQ中断

F = 1 禁止FIQ中断

△T位

该位反应了运行着的状态

T = 1执行在Thumb状态

T = 0 执行在ARM状态

△模式位

决定了CPU的工作模式

 

◇程序状态保存寄存器SPSR

   

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

ARM裸机环境搭建(U-Boot命令详解)

个人强烈建议看着命令自己做做~~ 首先是你的开发板上烧写好了U-Boot。 1、引导启动相关命令 1)go 格式: go addr [arg ...] 功能: ...
  • wangpengqi
  • wangpengqi
  • 2012-12-27 14:14
  • 1318

朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言

实验环境说明硬件平台:飞凌嵌入式OK210开发板(S5PV210) 说明:开发板已经刷入OK210原厂u-boot,本文程序直接下载进CPU iRAm中运行 软件平台:Ubuntu15.10 + ...
  • Kevin_Mr
  • Kevin_Mr
  • 2016-03-16 20:55
  • 1276

ARM裸机入门简介

学习ARM裸机,是一件复杂事情,入门的概念性和基础性知识必须要了解到,以便于后面的知识的理解。 ARM概念 ARM首先是一个公司,这家公司设计CPU并向各个CPU制造商授权许可,所以ARM...
  • u012741741
  • u012741741
  • 2016-06-20 23:30
  • 3028

ARM裸机编程系列---UART

串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,...
  • Ajax_zh
  • Ajax_zh
  • 2015-03-13 00:19
  • 1351

ARM裸机程序开发14(JTAG与RealViewMDK搭建ARM开发环境)

JTAG接口信息 利用Jllink进行调试的图样 下载方式 keil嵌入式集成开发环境 MDK + Jlink + SDRAM 裸奔2440教程   1、背景 很多人学习嵌入式编程都是...
  • G1036583997
  • G1036583997
  • 2013-10-09 10:51
  • 3463

利用qemu搭建arm cortex a9开发环境以及gdb调试

网上有利用qemu搭建linux和uboot开发的教程,但是没有如何搭建裸机开发,这篇文章记录一下如何利用qemu来学习arm架构的东西。裸机运行Hello World网上有一个是关于使用arm926...
  • u011280717
  • u011280717
  • 2017-05-14 08:24
  • 712

001_<ARM9从裸机到Linux操作系统>____裸机篇____ARM9裸机程序开发环境搭建

第一章:搭建mini2440裸机开发环境   ARM9的裸机开发的编译器和下载程序的方式有好几种。通常用于arm裸机程序开发的编译器基本有三种:(1)MDK(2)IAR(3)ADS。它们的具体情况...
  • u014183513
  • u014183513
  • 2014-03-30 00:11
  • 1824

[初级教程]搭建arm-linux裸机开发的环境

arm-linux裸机开发环境搭建
  • MingLLu
  • MingLLu
  • 2016-09-11 19:23
  • 1421

ARM裸机程序开发20(2440串口总结:寄存器篇)

S3C2440共有3个串口,CON0,CON1,CON2从CPU直接引出为TTL电平。其中串口CON0通过芯片转换为RS232电平的9针串口。 在使用串口时应该首先设置CPU的引脚功能,将其初始化设置...
  • G1036583997
  • G1036583997
  • 2013-10-15 20:24
  • 1905

Exynos4412裸机开发综合练习

下面是一个案例需求: 1、编写一段程序,该程序的主要功能是监控电路板上的电压值,若电压值超过当前的电压限制则通过蜂鸣器报警,通过按键解除报警; 2、其具体要求如下;  a) 程序下载20s后,进入电压...
  • zqixiao_09
  • zqixiao_09
  • 2016-02-29 22:22
  • 3007
    个人资料
    • 访问:209994次
    • 积分:3593
    • 等级:
    • 排名:第10606名
    • 原创:131篇
    • 转载:98篇
    • 译文:0篇
    • 评论:23条
    博客专栏