arm下的udelay

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

Write before:

默认汇编中只会把R0-R3四个寄存器的值传给所调用的C语言,多余的参数会通过堆栈的方式传递。

loops_per_jiffy calibrate_delay来算出来。

/*

 *  linux/arch/arm/lib/delay.S

 *

 *  Copyright (C) 1995, 1996 Russell King

 *

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License version 2 as

 * published by the Free Software Foundation.

 */

#include <linux/linkage.h>

#include <asm/assembler.h>

#include <asm/param.h>

              .text

 

.LC0:             .word      loops_per_jiffy

.LC1:             .word      (2199023*HZ)>>11

 

/*

 * r0  <= 2000

 * lpj <= 0x01ffffff (max. 3355 bogomips)

 * HZ  <= 1000

 */

 

ENTRY(__udelay)

              ldr   r2, .LC1     //save LC1 to r2

              mul  r0, r2, r0     //r0 = r0*r2

ENTRY(__const_udelay)                            @ 0 <= r0 <= 0x7fffff06

              ldr   r2, .LC0

              ldr   r2, [r2]           @ max = 0x01ffffff

              mov r0, r0, lsr #14        @ max = 0x0001ffff  r0 logical shift right 14bit

              mov r2, r2, lsr #10        @ max = 0x00007fff

              mul  r0, r2, r0        @ max = 2^32-1  r0=r2*r0

              movs      r0, r0, lsr #6  //s improve cpsr

              moveq     pc, lr   //if r0 == (r0 >> 6) then return

 

/*

 * loops = r0 * HZ * loops_per_jiffy / 1000000

 *

 * Oh, if only we had a cycle counter...

 */

 

@ Delay routine

ENTRY(__delay)

              subs r0, r0, #1  //r0 = r0 -1

              bhi   __delay  //hi:  >   one loop end

              mov pc, lr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值