ARM异常---一个Uart中断的触发处理过程:

首先给出一些定义:

//2440addr.inc

INTOFFSET    EQU  0x4a000014    ;Interruot request source offset

//option.inc

_ISR_STARTADDRESS    EQU 0x33ffff00

//2440init.s

         MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
    sub        sp,sp,#4            ;decrement sp(to store jump address)
    stmfd    sp!,{r0}            ;PUSH the work register to stack(lr does t push because it return to original address)
    ldr     r0,=$HandleLabel    ;load the address of HandleXXX to r0
    ldr     r0,[r0]                 ;load the contents(service routine start address) of HandleXXX
    str     r0,[sp,#4]          ;store the contents(ISR) of HandleXXX to stack
    ldmfd   sp!,{r0,pc}         ;POP the work register and pc(jump to ISR)
    MEND

下面进入正题:

//2440init.s

    PRESERVE8
    AREA    RESET,CODE,READONLY
    ENTRY
    EXPORT    __ENTRY
__ENTRY
ResetEntry
    b    ResetHandler    ;0x0
    b    HandlerUndef    ;handler for Undefined mode
    b    HandlerSWI       ;handler for SWI interrupt
    b    HandlerPabort    ;handler for PAbort
    b    HandlerDabort    ;handler for DAbort
    b    .                       ;reserved
    b    HandlerIRQ        ;handler for IRQ interrupt
    b    HandlerFIQ        ;handler for FIQ interrupt
    b    EnterPWDN        ; Must be @0x20.

...

HandlerIRQ      HANDLER HandleIRQ

...

.............
      ; Setup IRQ handler//建立中断表
    ldr    r0,=HandleIRQ       ;This routine is needed
    ldr    r1,=IsrIRQ      ;if there isn t ‘subs pc,lr,#4‘ at 0x18, 0x1c
    str    r1,[r0]

................
    ^   _ISR_STARTADDRESS        ;0x33ffff00
HandleReset     #   4
HandleUndef     #   4
HandleSWI        #   4
HandlePabort    #   4
HandleDabort    #   4
HandleReserved  #   4
HandleIRQ        #   4
HandleFIQ        #   4            ;0x33ffff1C
;IntVectorTable
;@0x33FF_FF20
HandleEINT0        #   4            ;0x33ffff20
HandleEINT1        #   4
HandleEINT2        #   4
.................................HandleUART1        #   4            ;0x33ffff7C.................................

uart是一个外部中断,走的是FIQ.

外部中断 --> b    HandlerFIQ ;

  看代码发现HandlerFIQ在init.s中进行了宏定义,展开之后得到:

//展开宏 HandlerIRQ  HANDLER  HandleIRQ
HandlerIRQ
        sub        sp,sp,#4          ;decrement sp(to store jump address)
        stmfd    sp!,{r0}            ;PUSH the work register to stack(lr does t push because it return to original address)
        ldr     r0,=$HandleIRQ       ;load the address of HandleXXX to r0
        ldr     r0,[r0]              ;load the contents(service routine start address) of HandleXXX
        str     r0,[sp,#4]           ;store the contents(ISR) of HandleXXX to stack
        ldmfd   sp!,{r0,pc}          ;POP the work register and pc(jump to ISR)

  可以看到,HandlerIRQ是一个标准的中断处理过程(正因如此使用了宏进行封装): 首先保存现场,然后跳转到HandleIRQ,从HandleIRQ回来之后恢复现场.

  HandleIRQ其实是一个函数指针,它可以在程序中被我们指向某一个处理函数. 这里我们指向了IsrIRQ. 在IsrIRQ里,我们读取INTOFFSET寄存器的值,加上外部中断的起始值HandleEINT0,这样我们就获得了世纪的中断入口HandleUART1. 通过ldmfd sp!,{r8-r9,pc},我们跳转进入了HandleUART1对应的实际的中断处理函数(见后面的分析).

//2440init.sIsrIRQ
    sub        sp,sp,#4       ;reserved for PC
    stmfd    sp!,{r8-r9}
    ldr        r9,=INTOFFSET
    ldr        r9,[r9]
    ldr        r8,=HandleEINT0
    add        r8,r8,r9,lsl #2  ;//r8=r8+(r9*4)
    ldr        r8,[r8]
    str        r8,[sp,#8]
    ldmfd    sp!,{r8-r9,pc}

  上面说到,"通过ldmfd sp!,{r8-r9,pc},我们跳转进入了HandleUART1对应的实际的中断处理函数." 怎么跳转的呢,在代码里,我们又实现并绑定了HandleUART1的处理函数Uart1_TxRxInt:

//2440addr.h
#define pISR_UART1        (*(unsigned *)(_ISR_STARTADDRESS+0x7c))
//2440lib.c
pISR_UART1=(unsigned)Uart1_TxRxInt;
extern unsigned char UartBuf1[256];

void __irq Uart0_TxRxInt(void)//这里只处理了接收中断
{
    unsigned char *pbuf = UartBuf1;
    if(rSUBSRCPND & BIT_SUB_RXD0)  //接收中断
    {
        rINTSUBMSK |= BIT_SUB_RXD0;

        while((rUFSTAT0&0x3f))
        {
            *pbuf++ = rURXH0;
        }
        *pbuf = ‘\0‘;

        rINTSUBMSK &= ~BIT_SUB_RXD0;
        rSRCPND |= BIT_UART0;
        rINTPND |= BIT_UART0;
        rINTSUBMSK &= ~(BIT_SUB_TXD0);
    }
}
    
时间: 2024-10-10 14:08:55

ARM异常---一个Uart中断的触发处理过程:的相关文章

ARM异常---一个DataAbort的触发过程:

一个DataAbort异常的触发过程://////////////////////////////xxxx.inc_STACK_BASEADDRESS EQU 0x33ff8000_MMUTT_STARTADDRESS EQU 0x33ff8000_ISR_STARTADDRESS EQU 0x33ffff00 ///xxx.s MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabel sub sp,sp,#4 ;decrement sp(to s

ARM异常中断返回的几种情况

ARM异常中断返回的几种情况重要基础知识:R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令.一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此 PC总是指向第三条指令.当 ARM 状态时,每条指令为 4 字节长,所以 PC 始终指向该指令地址加 8 字节的地址,即:PC 值=当前程序执行位置+8: 而 ADS 中的 pc,是为了调试看着方便而修改过的,它指向的是正在执行的指令,即“真正 pc-8”! 1.SWI 和和未定义

S5PV210-arm裸机-异常中的中断实现过程

210中的异常中的中断实现过程: 首先异常分为很多种,异常中包含了中断异常,有一个东西叫做异常向量表,在异常向量表中有很多相应异常的的地址.异常向量表中的所有异常中断的地址是不会变化的.地址都是固定的,但这些地址都是一个基于基地址的一个地址.不同的CPU中,基地址是不同的. 在210中,CPU内部给了一个发生异常时的异常向量的基地址,查阅官方资料知道,这个基地址为0XD0037400,所以我们需要自己把异常向量表中的地址加在210给的发生异常时的异常向量的基地址上.比如:reset(复位异常)在

进程—异常控制流之中断篇

从给处理器加电开始,直到断电为止,PC(程序计数器)都在不间断的读取并执行指令. 最简单的一种控制流是一个"平滑的"序列,其中每个instk和instk+1 在存储器中都是相邻的.典型地,这种平滑流的突变,也就是instk?和instk+1? 不相邻,是由诸如跳转(jump).调用(call)和返回(ret)这样一些熟悉的程序指令造成的.这样一些指令都是必要的机制,使得程序能够对由程序变量表示的内部程序状态中的变化做出反应. 但是系统也必须能够对系统状态的变化做出反应,这些系统状态不是

理解:浮空的时候外部一定要带上上拉或者下拉电阻,否则可能导致中断不断触发

浮空的时候外部一定要带上上拉或者下拉电阻,否则可能导致中断不断触发 为什么呢? 浮空,相当于此端口在默认情况下什么都不接,呈高阻态.(IO 输入状态,没接pin) IO输入状态,不接pin就可以不断产生中断,可以这样理解吗? 不可以. IO输入状态检测到上升或下降沿触发中断 因为IO输入状态,又没有接Pin,电平可能随机变化的.变化就有上升沿或下降沿. 磁场感应导致的还是? 不一定,芯片内部状态也有可能导致.

EasyUi datagrid(onClickCell:用户单击一个单元格时触发 ) 單擊編輯 editor:{type: 'combobox'}

1.columns列[一個單元格] 添加combobox下拉選項 $("#userGrid").datagrid({ singleSelect: true,            onClickCell: function (index, field, value) {                //Field = field;                //                var rows = $('#' + UserGrid).datagrid('getRo

手动实现一个单词统计MapReduce程序与过程原理分析

[toc] 手动实现一个单词统计MapReduce程序与过程原理分析 前言 我们知道,在搭建好hadoop环境后,可以运行wordcount程序来体验一下hadoop的功能,该程序在hadoop目录下的share/hadoop/mapreduce目录中,通过下面的命令: yarn jar $HADOOP_HOME/share/hadoop/mapreducehadoop-mapreduce-examples-2.6.4.jar wordcount inputPath outPath 即可对输入文

Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向

Atitit. 软件开发中的管理哲学--一个伟大的事业必然是过程导向为主    过程导向 vs 结果导向 1. 一个伟大的事业必然是过程导向为主 1 1.1. 过程的执行情况(有明确的执行手册及标准) 2 1.2. 麦哲伦的事例证明了过程导向的重要性 2 1.3. 婆罗门教大师商接罗所 过程导向,属于上梵,结果导向,属于下梵 2 1.4. 罗马皇帝诚思录上,说人生本身就是过程导向, 2 1.5. 过程导向基本属于战略层面,侧重与长期,而结果导向只是战术级别,短期容易短视 3 1.6. 任何组织的

记一个网络传输功能的实现过程

写在前面的话:功能是基于C/S模型的网络传输实现,要求是服务器端可以在局域网中任何机子上运行,客户端启动后自动寻找服务器端进行连接,之后,服务器端向已经连接的客户端发送命令,客户端根据命令执行相应的操作(即发送某个约定文件夹下的所有文件),并且客户端不需要用户操作. 1.思路 首先,对于这个功能的实现思路如下,因为服务器不确定在哪个机子上,所以为了寻找到服务器端,客户端需要发送广播消息,并且为了维护客户端在线,广播消息需要实现成心跳包(即定时发送广播消息).服务器监听心跳包,如果是新加入的客户端