U-Boot源码之udelay、get_ticks

本文详细介绍了U-Boot中延时函数的实现原理,主要关注于timer.c文件中的实现细节,包括全局变量timestamp和lastdec的使用,以及如何通过查询定时器TC实现延时。此外,还讲解了udelay函数的最小粒度和CONFIG_SYS_HZ参数的选择,以及如何根据定时器数据宽度估算最大延迟时间。最后,展示了get_timer函数的典型用法,用于等待指定条件的满足或超时退出。
摘要由CSDN通过智能技术生成

       在U-Boot中会有一些需要用到延时的场景,像延时输入进入uboot中,擦除Flash,从控制台读取用户输入的命令等。

一、U-Boot延时函数的实现

      U-Boot延时函数主要在cpu/内核框架/处理器型号/timer.c文件中实现,比如cpu/arm926ejs/mx28/timer.c。

1、timer.c定义了表示当前时间的全局变量timestamp和上一次访问定时器的时间lastdec。timestamp表示自调用函数timer_init以来定时器经过的总计数值。lastdec表示上一次访问定时器时的定时器的计数值。

2、实现延时要用到一个定时器,u-boot采用查询定时器TC的方法得到当前的时间点,所以需要根据定时器原理实现READ_TIMER宏,从代码get_timer_maskd代码风格上判断大部分定时器都应该是TC递减的,但LPC2468的定时器是TC增加的。

3、udelay的最小粒度是1us,可以根据其最小粒度选择合适的CONFIG_SYS_HZ参数使其保证定时器增加1小于1us且1us为定时器值的整数倍。同时根据定时器TC的数据宽度为16位还是32位估算出定时器的最大延迟时间。

4、U-Boot默认延时时间不会超过TC复位周期的2倍大小,所以根据lastdec和now的TC值大小判断出TC是否循环过一次,来得到timestamp,并更新lastdec,见get_timer_masked。

5、get_timer的典型用法是先ts = gettimer(0)得到当前的timestamp,并以此为基点,然后循环判断要求的等待条件是否满足,循环内则比较gettimer(ts)与要求的延时量的大小,如超时则退出程序。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值