查看: 2142|回复: 0

[Wince技术] FL2440启动代码分析(Second Chapters)(二)

[复制链接]
  • TA的每日心情

    2014-4-10 13:56
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-1-23 09:09:42 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 forlinx2013 于 2014-1-24 09:14 编辑

    欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!

    FL2440启动代码分析(Second Chapters

    接下来的代码如下(注黑色为源程序,蓝色为解说部分代码):
    MACRO
    $HandlerLabel HANDLER $HandleLabel
    $HandlerLabel
        sub sp,sp,#4           ;减少sp(用于存放转跳地址)实质上是在计算返回地址,用来存储PC地址
        stmfd sp!,{r0}         ;把将要使用的r0寄存器入栈
        ldr    r0,=$HandleLabel;将HandleXXX的址址放入r0
        ldr    r0,[r0]         ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0
        str    r0,[sp,#4]      ;把中断服务程序(ISR)压入栈.
        ldmfd  sp!,{r0,pc}     ;用出栈的方式恢复r0的原值和为pc设定新值(完成了到ISR的转跳)
        MEND
    ;首先这段程序是个宏定义,HANDLER是宏名,不要想歪了
    ;其次后面程序遇到的HandlerXXX HANDLER HandleXXX这些语句将都被下面这段程序展开
    例如:HandlerFIQ  HANDLER  HandleFIQ 被上面那段程序展开后为:
      HandlerFIQ
           sub        sp,sp,#4      
           stmfd      sp!,{r0}        
           ldr        r0,=HandleFIQ
           ldr        r0,[r0]        
           str        r0,[sp,#4]
           ldmfd      sp!,{r0,pc}
    ;再次这段程序目的在于把中断服务程序的首地址装载到PC中,可以称之为“加载程序”
    ;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字空间都有一个标号,以Handle***命名。
    例如:HandlerFIQ    HANDLER HandleFIQ
           HandlerIRQ    HANDLER HandleIRQ
           HandlerUndef  HANDLER HandleUndef
           HandlerSWI    HANDLER HandleSWI
           HandlerDabort HANDLER HandleDabort
           HandlerPabort HANDLER HandlePabort
    ;在向量中断模式下使用“加载程序”来执行中断服务程序。
    注释:向量中断模式是 当CPU读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,通过跳转指令,系统就直接跳转到 对应地址函数中节省了中断处理时间提高了中断处理速度。例如:ADC中断的向量地址为0xC0,则在0xC0处放如下代码:ldr PC,=HandlerADC 当ADC 中断产生的时候系统会自动跳转到HandlerADC函数中处理中断。
         非向量中断模式处 理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将中断状态寄存器中对应标志位置位然后跳转到位于0x18处的统一中断函数中该函数通过读取 中断状态寄存器中对应标志位来判断中断源,并根据中断优先级寄存器中优先级关系再跳到对应中断源的处理代码中处理中断。

    补充说明:
    ;细心的人会发现在_ISR_STARTADDRESS=0x33FF_FF00里定义的第一级中断向量表是采用型如Handle***的方式的,而在程序的ENTRY处(程序开始处)采用的是b Handler***的方式.在这里Handler***就是通过HANDLER这个宏和Handle***进立联系的.所以认为HANDLER这个宏是用于第一次查表过程的实现中断向量的重定向。那么这样做有什么优点呢?
       这种方式的优点就是真正定义的向量数据放到内存空间RAM里,而不是在ENTRY(地址0x0)处的ROM(FLASH)空间里, 这样,我们就可以在程序里灵活的改动中断向量的数据了(因为ROM是只读的,而RAM为可读可写的),在这里HANDLER是一个宏,就负责查找中断处理程序的入口地址。这些中断入口地址存放在由HandleXXX指向的表项中,该表定位在RAM高端,它的基地址为_ISR_STARTADDRESS。
      例如:_ISR_STARTADDRESS为0x800000000,当IRQ中断时,根据b HandlerFIQ,先跳转再根据_ISR_STARTADDRESS基地址+HandleIRQ的偏移地址(4*6)得到的中断地址0x80000000+0x00000024=0x80000024



    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-16 15:47 , Processed in 0.110356 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.