zoukankan      html  css  js  c++  java
  • uboot中添加FIQ中断及相关问题

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

    首先交代一下项目的软硬件环境。硬件方面,使用s3c2440作为主控芯片,外接串口、网卡等设备。软件方面,主控芯片上电后运行uboot程序,之后通过网口在线烧写应用程序至RAM中运行。为了使设备始终处于可控状态,需要分别在uboot及应用程序之中添加遥控程序,遥控程序使用FIQ中断来实现。uboot程序的修改主要在archarmcpuarm920tstart.s文件及archarmliboard.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这个地址执行,一般会在这些异常的地址处存放跳转指令,以实现后续的操作。

    1 _start:    b    start_code
    2     ldr    pc, _undefined_instruction
    3     ldr    pc, _software_interrupt
    4     ldr    pc, _prefetch_abort
    5     ldr    pc, _data_abort
    6     ldr    pc, _not_used
    7     ldr    pc, _irq
    8     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中)。

    1 fiq:
    2     subs lr, lr, #4
    3     stmfd sp!, {r0-r12,lr}
    4     bl roger_test    
    5     ldmfd sp!,{r0-r12,lr}
    6     subs pc, lr, #0

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

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

  • 相关阅读:
    Restful API
    Vue之指令
    Scrapy框架
    爬虫提高性能:串行、线程进程、异步非阻塞
    MongoDB
    Beautifulsoup模块
    请求库之selenium
    php 正则匹配中文
    Javascript的"预编译"思考
    PHP程序员面试技巧之口试题分享
  • 原文地址:https://www.cnblogs.com/blackeyes/p/4869586.html
Copyright © 2011-2022 走看看