linux内核延时:短延迟
前言
有时候为了等待硬件设置生效,我们会在设置完硬件寄存器后,添加微小的延时函数。本次介绍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内核延时:短延迟相关推荐
- linux内核态延时函数及头文件,Linux内核延时函数
linux内核提供3个函数分别进行纳秒,微妙和毫秒延时(使用时包要含头文件): void ndelay(unsigned long nsecs); void udelay(unsigned long ...
- linux sleep函数精度,深入理解linux下的短延迟:nanosleep,sleep
最近在使用nanosleep的时候又踩坑了.于是整理下linux短延迟的用法. 用法 回顾下秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒) 1s = 1000ms = 1000 * ...
- Linux内核中的延时函数详解
内核中涉及的延时主要有两种实现方式:忙等待或者睡眠等待.前者阻塞程序,在延时时间到达前一直占用CPU,而后者是将进程挂起(置进程于睡眠状态并释放CPU资源).所以,前者一般用在延时时间在毫秒以内的精确 ...
- linux内核时间管理(一) : 时间概念和延迟操作
内核中的时间概念 HZ: Linux 核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts.举例来说,HZ为1000,代表每 ...
- Linux内核延迟写机制学习
Linux内核延迟写机制 Linux内核延迟写的特点,是指在Linux通过write的场景下写入数据之后,会将数据直接标记为dirty,然后通过延迟读写的方式最后将数据回写到磁盘上.在本文的Linux ...
- linux内核中延迟的工作delayed_work
前言 本次实验逻辑依然很简单,count数到5.如果发现代码不能执行,那是不可能的.如果真的不能执行,也让我学习学习. 对于周期性的任务,除了定时器以外,在Linux内核中还可以利用一套封装得很好的快 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- 详解神秘Linux内核
在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概念. 我们将学习内核定时器.同步机制以及内存分配方法.不过,我们还是得从头开始这次 ...
最新文章
- Java 查看文件绝对路径,JAVA获取文件绝对路径的方法
- 2.7-egrep及bash中的变量
- 求斐波那契数列前n项的值
- 单链表操作实现getelem_c语言实现--带头结点单链表操作
- AFN的简单二次封装
- linux中特殊符号分割,Shell_Linux Shell 中实现字符串切割的几种方法
- Linux下android开发环境 遇到的问题
- ImportError: No module named ‘numpy‘的解决办法
- 向datagrid中加横向 纵向的合计 (在datatable中实现,datatable间倒数据)
- 蓝桥杯等差素数列-python
- 苹果x和xsmax有什么区别_苹果iPhone12与iPhone12Pro有什么区别怎么选
- if [ $# -ne 1 ];then 是什么意思?
- 皇后游戏c语言,C语言中关于4皇后或8皇后问题!
- (FortiGate)飞塔防火墙过滤指定会话并清理
- Vue3 + elementplus 分页组件英文改为中文
- DB_RECOVERY_FILE_DEST,LOG_ARCHIVE_DEST,LOG_ARCHIVE_DEST_N
- 大型研发团队敏捷实践落地 - 基于SAFe的大规模敏捷协作
- instr()函数的格式
- jsp model1模式 制作简易去哪儿网校招界面(四)
- 香港科大2020十大准独角兽 震撼发布!