前言

有时候为了等待硬件设置生效,我们会在设置完硬件寄存器后,添加微小的延时函数。本次介绍linux内核中的延时函数。

一 短延迟

Linux内核中提供了下列3个函数以分别进行纳秒、微秒和毫秒延迟:

void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);

上述延迟的实现原理本质上是忙等待,它根据CPU频率进行一定次数的循环。有时候,人们在软件中进行下面的延迟:

void delay(unsigned int time)
{while(time--);
}

ndelay()、udelay()和mdelay()函数的实现方式原理与此类似。内核在启动时,会运行一个延迟循环校准(Delay Loop Calibration),计算出lpj(Loops Per Jiffy),内核启动时会打印如下类似信息:

[    0.003137] Calibrating delay loop (skipped), value calculated using timer frequency.. 6.00 BogoMIPS (lpj=30000)

如果我们直接在bootloader传递给内核的bootargs中设置lpj=30000,则可以省掉这个校准的过程,节省约百毫秒级的开机时间。毫秒时延(以及更大的秒时延)已经比较大了,在内核中,最好不要直接使用mdelay()函数,这将耗费CPU资源,对于毫秒级以上的时延,内核提供了下述函数:

void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int millisecs);
void ssleep(unsigned int seconds);

上述函数将使得调用它的进程睡眠参数指定的时间为millisecs,msleep()、ssleep()不能被打断,而msleep_interruptible()则可以被打断。受系统Hz以及进程调度的影响,msleep()类似函数的精度是有限的。

二 在uboot中设置lpj=30000

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.11:/big/nfsroot/jiaocheng_rootfs,proto=tcp rw ip=192.168.0.3:192.168.0.11:192.168.0.1:255.255.255.0:::;lpj=30000;'

设置完毕后,启动内核,找到这条调试信息:

[    0.003143] Calibrating delay loop (skipped), value calculated using timer frequency.. 6.00 BogoMIPS (lpj=30000)

 并没有发现启动速度有超过百毫秒的提升。正如调试信息提示的一样Calibrating delay loop (skipped),计算过程跳过了,使用的是常量值。

结束

linux内核延时:短延迟相关推荐

  1. linux内核态延时函数及头文件,Linux内核延时函数

    linux内核提供3个函数分别进行纳秒,微妙和毫秒延时(使用时包要含头文件): void ndelay(unsigned long nsecs); void udelay(unsigned long ...

  2. linux sleep函数精度,深入理解linux下的短延迟:nanosleep,sleep

    最近在使用nanosleep的时候又踩坑了.于是整理下linux短延迟的用法. 用法 回顾下秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒) 1s = 1000ms = 1000 * ...

  3. Linux内核中的延时函数详解

    内核中涉及的延时主要有两种实现方式:忙等待或者睡眠等待.前者阻塞程序,在延时时间到达前一直占用CPU,而后者是将进程挂起(置进程于睡眠状态并释放CPU资源).所以,前者一般用在延时时间在毫秒以内的精确 ...

  4. linux内核时间管理(一) : 时间概念和延迟操作

    内核中的时间概念 HZ: Linux 核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts.举例来说,HZ为1000,代表每 ...

  5. Linux内核延迟写机制学习

    Linux内核延迟写机制 Linux内核延迟写的特点,是指在Linux通过write的场景下写入数据之后,会将数据直接标记为dirty,然后通过延迟读写的方式最后将数据回写到磁盘上.在本文的Linux ...

  6. linux内核中延迟的工作delayed_work

    前言 本次实验逻辑依然很简单,count数到5.如果发现代码不能执行,那是不可能的.如果真的不能执行,也让我学习学习. 对于周期性的任务,除了定时器以外,在Linux内核中还可以利用一套封装得很好的快 ...

  7. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  8. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  9. 详解神秘Linux内核

    在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概念. 我们将学习内核定时器.同步机制以及内存分配方法.不过,我们还是得从头开始这次 ...

最新文章

  1. Java 查看文件绝对路径,JAVA获取文件绝对路径的方法
  2. 2.7-egrep及bash中的变量
  3. 求斐波那契数列前n项的值
  4. 单链表操作实现getelem_c语言实现--带头结点单链表操作
  5. AFN的简单二次封装
  6. linux中特殊符号分割,Shell_Linux Shell 中实现字符串切割的几种方法
  7. Linux下android开发环境 遇到的问题
  8. ImportError: No module named ‘numpy‘的解决办法
  9. 向datagrid中加横向 纵向的合计 (在datatable中实现,datatable间倒数据)
  10. 蓝桥杯等差素数列-python
  11. 苹果x和xsmax有什么区别_苹果iPhone12与iPhone12Pro有什么区别怎么选
  12. if [ $# -ne 1 ];then 是什么意思?
  13. 皇后游戏c语言,C语言中关于4皇后或8皇后问题!
  14. (FortiGate)飞塔防火墙过滤指定会话并清理
  15. Vue3 + elementplus 分页组件英文改为中文
  16. DB_RECOVERY_FILE_DEST,LOG_ARCHIVE_DEST,LOG_ARCHIVE_DEST_N
  17. 大型研发团队敏捷实践落地 - 基于SAFe的大规模敏捷协作
  18. instr()函数的格式
  19. jsp model1模式 制作简易去哪儿网校招界面(四)
  20. 香港科大2020十大准独角兽 震撼发布!

热门文章

  1. Linux平台好用的十款屏幕录制工具
  2. linux下SCP命令 传输文件
  3. 【Power BI】部分复杂图表名称整理(持续更新)
  4. SVG颜色、渐变和填充
  5. Vuetify autocomplete组件
  6. os.environ的解释
  7. 概率统计——期望、方差与最小二乘法
  8. 长沙培训班学python
  9. OSI七层模型个人理解
  10. 手眼标定详述(坐标系介绍,二维、三维的手眼标定方法@九点法、AX=XB)