|
好了。。。看看V8是如何实现的。。。
RTCK_check: ; 子程序名(taoist加)
地址 机器码 汇编代码 ; taoist加的注释
00203958 B5F0 PUSH {R4,R5,R6,R7, LR} ; 子程序开始,保护寄存器
0020395A F7FF ; pre BL/BLX ; 为了4字节对齐而填充的垃圾
0020395C FFF9 BL 0x203950 ; 调用位于0x203950的子程序,进一步调用0x001069CC,用于禁止IRQ中断
0020395E 4F21 LDR R7, [PC,#0x084] ; R7 = [0x2039E4] =PIOA_PER (0xFFFFF400) 赋值
00203960 2400 MOV R4, #0 ; R4 = 0 赋值
00203962 2540 MOV R5, #64 ; R5 = 0x40 赋值
00203964 2601 MOV R6, #1
00203966 0336 LSL R6, R6, #12 ; R6 = 0x1000 赋值,R6用作计数器
00203968 63BC STR R4, [R7, #56] ; AT91C_PIOA_ODSR (0xFFFFF438) = 0 拉低TCK
0020396A 46C0 NOP ; 延时
0020396C 6BF8 LDR R0, [R7, #60] ; R0 = AT91C_PIOA_PDSR (0xFFFFF43C) 第1次读PA6
0020396E 6BF9 LDR R1, [R7, #60] ; R1 = AT91C_PIOA_PDSR (0xFFFFF43C) 第2次读PA6
00203970 6BFA LDR R2, [R7, #60] ; R2 = AT91C_PIOA_PDSR (0xFFFFF43C) 第3次读PA6
00203972 6BFB LDR R3, [R7, #60] ; R3 = AT91C_PIOA_PDSR (0xFFFFF43C) 第4次读PA6
;-----------------------------------------------------------
00203974 6BFC LDR R4, [R7, #60] ; R4 = AT91C_PIOA_PDSR (0xFFFFF43C) 第5....次读PA6
00203976 422C TST R4, R5 ;
00203978 D004 BEQ 0x203984 ; 若PA6为0,则跳到0x203984
;-----------------------------------------------------------
0020397A 1E76 SUB R6, R6, #1 ; 计数器减1
0020397C D1FA BNE 0x203974 ; 4096次到,则跳到0x203974
;-----------------------------------------------------------
0020397E 2000 MOV R0, #0
00203980 1E40 SUB R0, R0, #1 ; 赋return值为-1(error)
00203982 E010 B 0x2039A6 ; 跳到0x2039A6
;-----------------------------------------------------------
00203984 4228 TST R0, R5
00203986 D020 BEQ 0x2039CA ; if(first PA6 == 0) then goto 0x2039CA
;-----------------------------------------------------------
00203988 4229 TST R1, R5
0020398A D020 BEQ 0x2039CE ; if(second PA6 == 0) then goto 0x2039CE
;-----------------------------------------------------------
0020398C 422A TST R2, R5
0020398E D020 BEQ 0x2039D2 ; if(third PA6 == 0) then goto 0x2039D2
;-----------------------------------------------------------
00203990 422B TST R3, R5
00203992 D020 BEQ 0x2039D6 ; if(fourth PA6 == 0) then goto 0x2039D6
;-----------------------------------------------------------
00203994 2101 MOV R1, #1
00203996 0309 LSL R1, R1, #12 ; R1 = 4096
00203998 1B88 SUB R0, R1, R6 ; R0 = 4096 - R6
0020399A 2109 MOV R1, #9 ; R1 = 9
0020399C 4348 MUL R0, R1 ; R0 = (4096 - R6) * 9
0020399E 2115 MOV R1, #21 ; R1 = 21
002039A0 4348 MUL R0, R1 ; R0 = (4096 - R6) * 9 * 21 = (4096 - R6) * 189
002039A2 30C8 ADD R0, #200
002039A4 3073 ADD R0, #115 ; R0 = (4096 - R6) * 189 + 315 根据计数器的残值计算时间
;-----------------------------------------------------------
002039A6 2440 MOV R4, #64
002039A8 0224 LSL R4, R4, #8 ; R4 = 0x4000
002039AA 63BC STR R4, [R7, #56] ; AT91C_PIOA_ODSR (0xFFFFF438) = 0x4000 即令PA14 TCK = 1
002039AC 2601 MOV R6, #1
002039AE 0336 LSL R6, R6, #12 ; R6 = 0x1000(4096) 重赋计数器
;-----------------------------------------------------------
002039B0 1E76 SUB R6, R6, #1 ; R6--
002039B2 D007 BEQ 0x2039C4
;-----------------------------------------------------------
002039B4 6BFC LDR R4, [R7, #60] ; R4 = AT91C_PIOA_PDSR (0xFFFFF43C) 读PA6
002039B6 422C TST R4, R5
002039B8 D0FA BEQ 0x2039B0 ; if(PA6 == 0) then goto 0x2039B0
;-----------------------------------------------------------
002039BA 1C04 MOV R4, R0 ; R4 = R0
002039BC F7FF ; pre BL/BLX
002039BE FFCA BL 0x203954 ; call 0x001069B8 Enable_IRQ
;-----------------------------------------------------------
002039C0 1C20 MOV R0, R4 ; R0 = R4
002039C2 BDF0 POP {R4,R5,R6,R7, PC}
;-----------------------------------------------------------
002039C4 2000 MOV R0, #0
002039C6 1E40 SUB R0, R0, #1 ; R0 = 0xFFFFFFF(-1) RTCK always be 0 or 1
002039C8 E7F7 B 0x2039BA
;-----------------------------------------------------------
002039CA 2000 MOV R0, #0 ; R0 = 0
002039CC E7EB B 0x2039A6
;-----------------------------------------------------------
002039CE 207E MOV R0, #126 ; R0 = 0x7E = 126ns
002039D0 E7E9 B 0x2039A6
;-----------------------------------------------------------
002039D2 20BD MOV R0, #189 ; R0 = 0xBD = 189ns
002039D4 E7E7 B 0x2039A6
;-----------------------------------------------------------
002039D6 20FC MOV R0, #252 ; R0 = 0xFC = 252ns
002039D8 E7E5 B 0x2039A6
;-----------------------------------------------------------
002039DA 0000 FB ; 字节对齐填充的垃圾
002039DC 001069CC DW 0x001069CC ; 文字池
002039E0 001069B8 DW 0x001069B8
002039E4 FFFFF400 DW 0xFFFFF400
本贴被 taoist 编辑过,最后修改时间:2009-01-04,16:22:34. |
|