zoukankan      html  css  js  c++  java
  • S3c2410裸板程序入门单按键(一)

    有点入门了,好吧,开始学点稍微复杂的,写一个单按键的程序。

    有人可能会笑,这个复杂?的确,只有一个按键是比较简单的,关键是我们要通过这个按键引出中断处理的部分,这个就比较核心了。中断是学习某个CPU最重要的部分之一。

    这次我们将使用realview提供的初始化文件,学会自己配置(以后还有自己写呢)。然后完成一次按键触发一次中断处理函数的功能。怎么判断有没有触发中断呢?我们不是写了串口的程序吗,中断一次由串口向PC机发送个数据好了。

    1 配置(s3c2410a.s 对应的configuration):

    等会儿截几个图吧,现在手头没有截图工具。

    2 s3c2410a.s 的几个片段,着重关注中断部分。

    159IntVT_SETUP
    EQU
    1
    160IntVTAddress
    EQU
    0x33FFFF20

    ...........

    795
    AREA
    RESET
    ,
    CODE
    ,
    READONLY
    796
    ARM
    799; Exception Vectors
    800;  Mapped to Address 0.
    801;  Absolute addressing mode must be used.
    802;  Dummy Handlers are implemented as infinite loops which can be modified.
    803
    804Vectors
    LDR
    PC
    ,
    Reset_Addr
    805
    LDR
    PC
    ,
    Undef_Addr
    806
    LDR
    PC
    ,
    SWI_Addr
    807
    LDR
    PC
    ,
    PAbt_Addr
    808
    LDR
    PC
    ,
    DAbt_Addr
    809
    NOP
    ; Reserved Vector
    810
    LDR
    PC
    ,
    IRQ_Addr
    811
    LDR
    PC
    ,
    FIQ_Addr
    813
    814
    IF
    IntVT_SETUP
    <>
    0
    816;Interrupt Vector Table Address
    817HandleEINT0
    EQU
    IntVTAddress
    818HandleEINT1
    EQU
    IntVTAddress
    +
    4
    819HandleEINT2
    EQU
    IntVTAddress
    +
    4
    *
    2
    820HandleEINT3
    EQU
    IntVTAddress
    +
    4
    *
    3
    821HandleEINT4_7
    EQU
    IntVTAddress
    +
    4
    *
    4
    822HandleEINT8_23
    EQU
    IntVTAddress
    +
    4
    *
    5
    823HandleReserved
    EQU
    IntVTAddress
    +
    4
    *
    6
    
    850IRQ_Entry
    851
    sub
    sp
    ,
    sp
    ,
    #4       ;reserved for PC
    852
    stmfd
    sp!,{r8-r9} ;备份r8 r9
    853
    854
    ldr
    r9
    ,=
    INTOFFSET ;取的中断偏移
    855
    ldr
    r9
    ,[
    r9
    ]
    856
    ldr
    r8
    ,=
    HandleEINT0 ;得到中断处理函数地址的基地址
    857
    add
    r8
    ,
    r8
    ,
    r9
    ,
    lsl
    #2 ;根据基地址和偏移得到实际中断处理函数地址
    858
    ldr
    r8
    ,[
    r8
    ]
    859
    str
    r8
    ,[
    sp
    ,
    #8]
    860
    ldmfd
    sp!,{r8-r9,pc} ;修改pc指针,跳转到二级中断处理函数处
    861
    862
    ENDIF
    863
    864Reset_Addr
    DCD
    Reset_Handler
    865Undef_Addr
    DCD
    Undef_Handler
    866SWI_Addr
    DCD
    SWI_Handler
    867PAbt_Addr
    DCD
    PAbt_Handler
    868DAbt_Addr
    DCD
    DAbt_Handler
    869
    DCD
    0
    ; Reserved Address
    870IRQ_Addr
    DCD
    IRQ_Handler
    871FIQ_Addr
    DCD
    FIQ_Handler
    872
    873Undef_Handler
    B
    Undef_Handler
    874SWI_Handler
    B
    SWI_Handler
    875PAbt_Handler
    B
    PAbt_Handler
    876DAbt_Handler
    B
    DAbt_Handler
    877
    878
    IF
    IntVT_SETUP
    <>
    1
    879IRQ_Handler
    B
    IRQ_Handler
    880
    ENDIF
    881
    882
    IF
    IntVT_SETUP
    <>
    0
    883IRQ_Handler
    B
    IRQ_Entry
    884
    ENDIF
    885
    886FIQ_Handler
    B
    FIQ_Handler

    可见触发irq中断时,cpu自动把cpsr保存到spsr,把pc指针置为0x18。经过LDR PC,IRQ_AddrIRQ_Handler B IRQ_Entry,两次跳转,最终跳到了IRQ_ENTRY, 这其实就是一级中断处理函数,一级中断处理函数的作用就是根据中断偏移寄存器查的其处理函数的地址,请看代码中的注释。

    因为用html粘贴的代码,所以提示我文章过长,只有另开一文喽。


  • 相关阅读:
    ORA01033:ORCLE initialization or shutdown in progress问题的解决
    OA、SOA和SOAP
    [导入]循环赛如何排列问题
    [导入]Free Compilers / Interpreters
    终于知道纹理的GL_MODULATE是怎么回事了
    怎么acm.tongji.edu.cn又关机了?
    [导入]一个2002罗马尼亚赛区的ACM的题目
    netcraft at tongji.edu.cn
    [导入]对编写安全的代码这个方法有用吗?
    [导入]最简单的方法输出下列图形
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196353.html
Copyright © 2011-2022 走看看