九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4228|回复: 1
打印 上一主题 下一主题

关于延时函数udelay的疑惑(已解决)

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-3 00:33:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 laotang365 于 2014-10-10 10:38 编辑

s5pv210-tick-delay.c文件中
udelay中,首先 hz = get_system_hz,我用串口打印出来hz等于100,而
那么udelay(us)等价于__delay(us * loops_per_jiffy / (1000000 / hz));而,loops_per_jiffy 等于29440。百度说loops_per_jiffy为每0.5个TICK时间范围内CPU可以执行空指令的条数,那么get_system_hz返回值是什么?100Mhz?

还是我自己解答吧:
get_system_hz返回每hz的tick数
  1. void s5pv210_tick_initial(void)
  2. {
  3. ...
  4. ...
  5.         /* initial system tick */
  6.         tick_hz = 100;//每秒 100个tick
  7.         jiffies = 0;//时刻,从初始化开始计时,每10ms +1
  8. }

  9. u32_t get_system_hz(void)
  10. {
  11.         return tick_hz;
  12. }

  13. u64_t clock_gettime(void)
  14. {
  15.         if(get_system_hz() > 0)
  16.                 return (u64_t)jiffies * 1000000 / get_system_hz();//返回cpu已运行时间(us)

  17.         return 0;
  18. }


  19. void udelay(u32_t us)
  20. {
  21.         u32_t hz = get_system_hz();//每秒100个tick

  22.         if(hz)
  23.                 __delay(us * loops_per_jiffy / (1000000 / hz));        //(每tick的loop数 * 100个tick为每秒loop数,
  24.         else                                                                                                //再除以1000000即得1us应__delay的loops数)
  25.                 __delay(us);                                                                        //或者这样理解:1000000/每秒tick数 = 每tick的时长(us)=10000us)
  26. }
  27. static void calibrate_delay(void)//校准loops_per_jiffy
  28. {
  29.         u32_t ticks, loopbit;
  30.         s32_t lps_precision = 8;
  31.         u32_t hz = get_system_hz();//每秒tick数,即100个tick

  32.         if(hz > 0)
  33.         {
  34.                 loops_per_jiffy = (1<<12);//4096

  35.                 while((loops_per_jiffy <<= 1) != 0)//8192
  36.                 {
  37.                         /* wait for "start of" clock tick */
  38.                         ticks = jiffies;
  39.                         while (ticks == jiffies);

  40.                         /* go ... */
  41.                         ticks = jiffies;
  42.                         __delay(loops_per_jiffy);
  43.                         ticks = jiffies - ticks;//8192个loop之后,经过的tick数

  44.                         if(ticks)        //1tick后立即跳出,得到1tick运行的loops(粗略值) 大于实际值
  45.                                 break;
  46.                 }

  47.                 loops_per_jiffy >>= 1;//loops_per_jiffy / 2,1个tick里至少经过的loop数
  48.                 loopbit = loops_per_jiffy;

  49.                 while(lps_precision-- && (loopbit >>= 1))//8-- && (loopbit / 2)即8-- && (loops_per_jiffy  / 2) ,校准8次
  50.                 {
  51.                         loops_per_jiffy |= loopbit;//loops_per_jiffy | = (loops_per_jiffy  / 2),即每次循环loops_per_jiffy加上 loopbit 的一半(的一半的一半。。。)
  52.                         ticks = jiffies;
  53.                         while(ticks == jiffies);

  54.                         ticks = jiffies;
  55.                         __delay(loops_per_jiffy);//延时1个tick

  56.                         /* longer than 1 tick */
  57.                         if(jiffies != ticks)/
  58.                                 loops_per_jiffy &= ~loopbit;//loop超过1tick,则loops_per_jiffy低位清零(减小)
  59.                 }
  60.         }
  61.         else
  62.         {
  63.                 loops_per_jiffy = 0;
  64.         }
  65. }
复制代码
  1. void __attribute__ ((noinline)) __delay(volatile u32_t loop)
  2. {
  3.         for(; loop > 0; loop--);
  4. }

  5. void udelay(u32_t us)
  6. {
  7.         u32_t hz = get_system_hz();
  8.         serial_printf(0,"get_system_hz = %u",hz);

  9.         if(hz)
  10.                 __delay(us * loops_per_jiffy / (1000000 / hz));
  11.         else
  12.                 __delay(us);
  13. }
复制代码
回复

使用道具 举报

沙发
发表于 2014-11-25 19:43:21 | 只看该作者
计算bogomips可是有一段很有意思的故事,linux创始人实现的,可以网上搜搜
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-11-23 00:11 , Processed in 0.019375 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表