本文主要说明了在uboot中添加FIQ中断时遇到的问题以及对应的解决办法。

首先交代一下项目的软硬件环境。硬件方面,使用s3c2440作为主控芯片,外接串口、网卡等设备。软件方面,主控芯片上电后运行uboot程序,之后通过网口在线烧写应用程序至RAM中运行。为了使设备始终处于可控状态,需要分别在uboot及应用程序之中添加遥控程序,遥控程序使用FIQ中断来实现。uboot程序的修改主要在\arch\arm\cpu\arm920t\start.s文件及arch\arm\lib\board.c文件中。

问题:

一、发生FIQ中断之后处理器做了哪些事情?

发生中断之后ARM处理器需要处理完当前的指令,然后自动完成以下事情:

1.将当前程序状态寄存器CPSR保存到FIQ模式下的备份程序状态寄存器SPSR_fiq之中(执行中断返回时其逆过程不能自动完成)。

2.将程序计数器PC(R15)值减4存入FIQ模式下的链接寄存器R14_fiq之中(也就是lr)。

3.将PC的值强制改为ox0000001c(异常向量表中FIQ的入口地址),并跳转到该地址执行。

说明:

1.ARM处理器定义了undefined_instruction(0x00000004)、software_interrupt(0x00000008)、prefetch_abort(0x0000000c)、data_abort(0x00000010)、irq(0x00000018)、fiq(0x0000001c)等几种异常,当异常发生时,芯片会自动完成上述操作并跳转到相应的地址去执行,其中芯片上电后自动跳转至0x00000000这个地址执行,一般会在这些异常的地址处存放跳转指令,以实现后续的操作。

 _start:    b    start_code
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq

其中start_code为启动代码。

二、跳转至异常向量表后需要做那些事情?

处理器将PC强制指向0x0000001c之后,再次跳转至_fiq标号处,接下来用户需要编写程序完成以下事情:

1.计算程序的返回地址。因为ARM9采用5级流水线结构,且程序的执行阶段处在流水线的第3级,那么PC始终指向正在执行指令的下两条指令处,也就是正在执行的指令地址为PC-8(程序向高地址方向执行)。由于FIQ发生时处理器会处理完正在执行的指令,这时PC值也被更新,也就是PC=PC+4,然后处理器自动将PC值减4存入R14_fiq寄存器之中。程序返回的地址应该是FIQ发生时正在处理的指令的下一条指令处,所以将R14_fiq中的地址减4就是程序应该返回的地址。

2.根据需要,有选择地保存寄存器lr(使用bl指令时会更改该值)、r0-r12(均为通用寄存器,若被更改则无法恢复至FIQ发生前的状态,一般将这些寄存器的值进行入栈保护,这就要求事先在启动代码中设置FIQ模式的堆栈)。

3.跳转至中断处理函数运行,注意使用bl(保存下一条指令地址,可以返回),而不能使用b(不保存下条指令地址,不能返回)。

4.在执行完中断处理函数之后,需要将lr、r0-r12出栈恢复。

5.将lr的值传递给PC,跳转至FIQ发生时的下一条指令(使用subs pc, lr, #0的目的是为了将SPSR_fiq中的值恢复至CPSR中)。

 fiq:
subs lr, lr, #
stmfd sp!, {r0-r12,lr}
bl roger_test
ldmfd sp!,{r0-r12,lr}
subs pc, lr, #

三、中断处理函数的位置?

处理器在上电之后跳转至启动代码处运行,按顺序进行相关寄存器及外设的初始化工作。在arch\arm\lib\board.c的board_init_r( )函数的末尾打开FIQ中断,此时处理器的初始化工作已经完成且已处于C语言环境。

uboot中添加FIQ中断及相关问题的更多相关文章

  1. 向linux内核中添加外部中断驱动模块

    本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...

  2. u-boot中添加mtdparts支持以及Linux的分区设置

    简介 作者:彭东林 邮箱:pengdonglin137@163.com u-boot版本:u-boot-2015.04 Linux版本:Linux-3.14 硬件平台:tq2440, 内存:64M   ...

  3. 在u-boot中添加命令

    转:http://www.embedu.org/Column/Column464.htm 作者:曾宏安,华清远见嵌入式学院讲师. u-boot是嵌入式系统中广泛使用的一种bootloader.它不仅支 ...

  4. uboot中添加自己的命令【转】

    本文转载自:http://blog.csdn.net/huanghai381/article/details/51206646 每个命令都是通过U_BOOT_CMD宏来定义的.这个宏定义了一个相关的结 ...

  5. 在U-boot中添加以太网驱动

    当定义CONFIG_CMD_NET和CONFIG_CMD_PING,编译之后执行ping命令,告警没有找到以太网. 因此,需要打开U-boot的网络功能, u-boot-sunxi-sunxi中没有找 ...

  6. 在U-Boot中添加自定义命令以实现自动下载程序【转】

    本文转载自:https://gaomf.cn/2016/06/26/%E5%9C%A8U-Boot%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9 ...

  7. uboot自定义添加命令

    1.添加命令 1.u-boot的命令格式: U_BOOT_CMD(name,maxargs,repeatable,command,”usage”,"help") name:命令的名 ...

  8. uboot中的中断macro宏

    目录 uboot中的中断macro宏 引入 内存分配 流程概览 普通中断 保存现场 中断函数打印具体寄存器 恢复现场 软中断 空间获取 保存现场 附录速记 疑惑待解 title: uboot中的中断m ...

  9. Uboot中start.S源码的指令级的详尽解析【转】

    本文转载自:http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analys ...

随机推荐

  1. 2-01SQL的概述

    SQL: Structured Query Languaage:结构化查询语言. 美国国家标准局ANSI. 国际标准化组织. T-SQL: Transact-SQL. T-SQL是SQL的扩展集. 对 ...

  2. Spring之ResourceLoader加载资源

    Resource与ResourceLoader对比 1.Resource接口定义了应用访问底层资源的能力. 通过FileSystemResource以文件系统绝对路径的方式进行访问: 通过ClassP ...

  3. HR外包系统 - 客户员工 发薪需求/个税需求 设置

    最好,客户公司层面进行设置,如果单一情况,只需要设置公司,如果不是单一情况,设置员工, 另外员工只能从公司设置好的地方选择过来. 增强系统简便设置和设置的灵活性.

  4. AIX RAC ORA-27504 ORA-27300 ORA-27301 ORA-27302 ORA-27303

    操作系统:AIX6.1  数据库:Oracle10.2.0.5 RAC 2个节点.其中一个节点正常,另外一个节点的instance的状态是offline的,手工去启动的时候报错: ORA: IPC e ...

  5. @property中strong跟weak的区别

    strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *string1; @property ...

  6. Is WPFdead

    最近看到一个bog.http://www.codeproject.com/Articles/818281/Is-WPF-dead-the-present-and-future-of-WPF 大体上讲了 ...

  7. 我的 Unity2D 屏幕适配

    以下方法纯属我YY,切勿当真!!! 确定一个设计尺寸,比如 devWidth = 960,devHeight = 640, 按照这个尺寸进行设计游戏. 方式一: 不管什么屏幕尺寸,都和设计的尺寸对应. ...

  8. OpenGL大作业

    GLfloat light0_position[] = { 15.0,15.0,15.0,10.0 };//定义光源位置 103glLightfv(GL_LIGHT0, GL_POSITION, li ...

  9. 【微信Java开发 --1】内网穿透外网,使用外网域名可以访问到本地项目

    1.首先上https://natapp.cn/ 2.接下来在网站申请账号 3.购买免费隧道 4.为你的免费隧道设置名称以及端口号,由于本人本地的使用Tomcat做服务器,所以用惯了8080端口,因此设 ...

  10. 在Android上用AChartEngine轻松绘制图表

    本文由 伯乐在线 - LeonHover 翻译.未经许可,禁止转载!英文出处:jaxenter.欢迎加入翻译组. Android发布不久的2008年底,开发者们已经开始寻找制表.制图.绘图的工具库.当 ...