汇编启动代码片段注释

复制代码
;*******************************************************************************
;* Macro Name     : EIC_INIT
;* Description    : This macro Initialize the EIC as following :
;                 - IRQ disabled
;                 - FIQ disabled
;                 - IVR contain the load PC opcode (0xE59FFXXX)
;                 - Current priority level equal to 0
;                 - All channels are disabled
;                 - All channels priority equal to 0
;                 - All SIR registers contain offset to the related IRQ
;                   table entry
;* Input          : None.
;* Output         : None.
;*******************************************************************************
        MACRO   
        EIC_INIT                    ; LDR,STR是用于寄存器和外部存储器交换数据指令,注意与MOV的区别,后面只在寄存器或常数交换. 
        LDR     r3, =EIC_Base_addr  ;(loadregister)用于把一个32Bit的WORD数据从外部存储空间装入到寄存器中,本句话是把EIC基地址赋值给R3
        MOV     r0, #0
        MVN     r1, #0
        MOV     r2, #0x0c
        STR     r0, [r3, #ICR_off_addr] ;STR(Storeregister) 用于把一个寄存器的值存入外部存储空间,是LDR的逆操作.本句话是把R0的值【0】赋值给 EIC_Base_addr+ICR_off_addr
      STR   r0, [r3, #IER_off_addr]
      STR   r1, [r3, #IPR_off_addr]
      STR   r2, [r3, #FIR_off_addr]
      STR   r0, [r3, #CIPR_off_addr]

          LDR     r4, =0xE59F0000       ;给EIC->IVR赋值

      STR r4, [r3, #IVR_off_addr] ; Write the LDR pc,[pc,#offset]
                        ; instruction code in IVR[31:16]
      LDR r2, =32            ; 32 Channel to initialize
      LDR r0, =T0TIMI_Addr      ; Read the address of the IRQs
                        ; address table
      LDR r1, =0x00000FFF
      AND r0,r0,r1                ;R0和R1内的数据逻辑与结果赋值给R      

          LDR r5, =SIR0_off_addr      ; Read SIR0 address      

          SUB r4,r0,#8          ; 减法指令R4=R0-8,也就是???是T0timer_addr中断函数的入口地址 Subtract 8 for prefetch

      LDR r1, =0xF7E8        ; Add the offset from IVR to 0x00000000 0xFFF F800+0x7E8
                      ; address(IVR address + 7E8 = 0x00000000)
                      ; 0xF7E8 used to complete the
                          ; LDR pc,[pc,#offset] opcode (0xE59FFXXX)
      ADD r1,r4,r1         ;加法指令R1=R4+R1 Compute the jump offset from IVR to the
                      ; IRQ table entry.
EIC_INI   MOV r4, r1, LSL #16     ;LSL左移指令R4=R1*2^16        Left shift the result
      STR r4, [r3, r5]           ;R3+R5=EIC_BASEADDR+SIR0_OFF_ADDR    Store the result in SIRx register
      ADD r1, r1, #4         ;Next IRQ address
      ADD r5, r5, #4         ;Next SIR
      SUBS r2, r2, #1        ;R2=32代表32次循环,这里表示下一个SIR寄存器   Decrement the number of SIR registers to initialize
      BNE EIC_INI          ;跳转指令,如果XXX跳转到EIC_INI执行      If more then continue
      MEND                      ;代码宏段结束

 
复制代码

 

posted @   流水江湖  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示