测定Linux内核100ms的时钟滴答数

4、系统滴答时钟SysTick 系统滴答时钟SysTick 阅读详情
     在《Linux设备驱动程序》(第3版)中使用了以下代码实现了一种简单的、对精度要求不高的延时:
    while ( time_before( jiffies, j1 ) )
        cpu_relax();
    该程序主要利用Linux系统使用jiffies计数器记录时钟滴答数,给j1赋值将要延迟终止的jiffies值,若当前jiffies值到达j1时,则程序将退出循环,继续执行后续代码。但j1值设定为多少呢?书中未介绍。延迟一般习惯以时间为单位,如休眠多少秒或毫秒。而对不同的linux系统和不同的计算机硬件,时钟滴答的时间间隔是不一样的。本文编写了一个驱动,用于测定100ms的时钟滴答数。若测定出该值,要延迟多少时间,就很方便转换的需要延迟的时钟滴答数了。

// sumjiffies.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h> // printk()
#include <linux/sched.h>  // jiffies, HZ
#include <linux/delay.h>  // mdelay()

#define REPEAT_TIMES 10

static int __init sumjiffies_init(void)
{
    unsigned long start_jiffies, stop_jiffies, sum_jiffies;
    int i;
    printk( KERN_ALERT "sumjiffies load .../n" );
    sum_jiffies = 0;
    for ( i=0; i<REPEAT_TIMES; i++ )
    {
        start_jiffies = jiffies;
        mdelay(100);
        stop_jiffies = jiffies;
        sum_jiffies += (long)stop_jiffies - (long)start_jiffies;
        printk( KERN_ALERT "[%d] stop_jiffies - start_jiffies = %ld - %ld = %ld/n",
                            i, stop_jiffies, start_jiffies, (long)stop_jiffies - (long)start_jiffies );
    }
    printk( KERN_ALERT "average jiffies of 100ms: %ld/n", sum_jiffies / REPEAT_TIMES );
    return 0;
}

static void __exit sumjiffies_exit(void)
{
    printk( KERN_ALERT "Goodbye/n" );
}

module_init( sumjiffies_init );
module_exit( sumjiffies_exit );

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("ThinkerABC");

以下是对上述程序sumjiffies.c在linux kernel 2.4环境下编译和运行结果。

[root@a ~]# gcc -O2 -Wall -DMODULE -D__KERNEL__ -I /usr/src/linux/include/ -c sumjiffies.c
[root@a ~]# insmod sumjiffies.o
[root@a ~]# lsmod sumjiffies
Module                  Size  Used by    Not tainted
sumjiffies               576   0  (unused)
[root@a ~]# rmmod sumjiffies
[root@a ~]# dmesg
sumjiffies load ...
[0] stop_jiffies - start_jiffies = 69624 - 69573 = 51
[1] stop_jiffies - start_jiffies = 69674 - 69624 = 50
[2] stop_jiffies - start_jiffies = 69725 - 69674 = 51
[3] stop_jiffies - start_jiffies = 69776 - 69725 = 51
[4] stop_jiffies - start_jiffies = 69827 - 69776 = 51
[5] stop_jiffies - start_jiffies = 69878 - 69827 = 51
[6] stop_jiffies - start_jiffies = 69928 - 69878 = 50
[7] stop_jiffies - start_jiffies = 69979 - 69928 = 51
[8] stop_jiffies - start_jiffies = 70030 - 69979 = 51
[9] stop_jiffies - start_jiffies = 70081 - 70030 = 51
average jiffies of 100ms: 50
Goodbye
[root@a ~]#

从以上运行结果中可知在我的实验机中,100ms的平均时钟滴答数为50。

如果要使我的实验机上运行的Linux模块中延迟约1秒,这只需使用以下代码即可:
    j1 = jiffies + 500;
    while ( time_before( jiffies, j1 ) )
        cpu_relax();
机器人开发路线 通过这个路线图,你可以在6个月内完成从原型到试产的全流程。建议初期采用敏捷开发模式,每两周迭代一个核心功能模块。在硬件集成遇到瓶颈时,推荐参考。 阅读详情

相关推荐

Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)

以Carla官网导入RoadRunner地图的标准文档为参考,里面增添了很多细节和注意事项,遇到问题的小伙伴过来看看吧。

DSK_981029的博客 1万+

时钟滴答(clock tick)

请问时间的嘀嗒数是根据什么来设定的有必要明确一些Linux内核时钟驱动中的基本概念。 (1)时钟周期(clock cycle)的频率:8253/8254 PIT的本质就是对由晶体振荡器产生的时钟周期进行计数,晶体振荡器在1秒时间内产生的时钟脉冲个数就是时钟周期的频率。Linux用宏 CLOCK_TICK_RATE来表示8254 PIT的输入时钟脉冲的频率

hjs1122的专栏 4894

VSCode初级使用教程详细版

Visual Studio Code(简称VSCode)是一款轻量级但功能强大的代码编辑器,支持多种编程语言,具有丰富的扩展插件,并内置了Git版本控制。VSCode工具满足绝大多数工作场景,使用场景包括不限于大学生作业代码编写、读研期间实验脚本编写、工作中项目代码编写与协作、数学建模竞赛中代码编写等。本文将从VSCode的安装开始,逐步介绍其基本使用方法和一些高级功能,帮助读者快速上手。

qq_37360300的博客 5万+

linux休眠毫秒命令,usleep 休眠非man描述的微妙而是毫秒级别的!该如何处理

usleep 休眠非man描述的微妙而是毫秒级别的!centos5.4系统。gcc4.1.2nanosleep和usleep休眠级别都是毫秒,而不是man描述的纳秒和微妙。。。为什么会这样?分享到:------解决方案--------------------这个linux是支持的,只是有点点不准确而已。毕竟纳秒单位很小嘛。------解决方案--------------------你可...

weixin_29209825的博客 1509

程序化广告行业(23/89):深度剖析广告效果评估指标

大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要

yyy173611的博客 4864

Cesium生态盘点:超图、火星3D等15个二次开发框架对比

本文深入解析Cesium生态中的15个二次开发框架,包括超图、火星3D等主流选择,帮助开发者根据项目需求进行精准选型。从性能表现、功能完备性、开发友好度等维度进行对比,特别适合需要处理地理空间数据和构建三维可视化的JavaScript开发者。

weixin_28197941的博客 497

linux 实时性 100ms,实时录播延迟长达100ms

开机信息在这贴一下,没想到附件下载会丢经验。。。[16:36:19]U-Boot TPL 2017.09-g88aebe4 V1.24[16:36:19]REGFB: 0x00000030, 0x00000030[16:36:19]In[16:36:19]589MHz[16:36:19]DDR3[16:36:19] Col=10 Bank=8 Row=14 Size=256MB[16:36:19]...

weixin_29534373的博客 1129

给跨代引用记一本账:Java GC 的分配路径、卡表写屏障与收集器版图快速回顾

本文把 Java GC 的零散名词串成一条推理链路:从 TLAB 指针碰撞分配、逃逸分析,到 Eden、Survivor 与晋升的四条路,重点拆解卡表与写屏障如何为老年代指向新生代的引用记账,及 Minor GC 如何只扫脏卡。基于 JDK 8 实测:分散写使 Young GC 停顿涨 10~15 倍,条件卡标记消除卡表伪共享,计数循环让 System.gc 等待 2.7 秒,Survivor 过小使晋升量增加约 400 倍。文末梳理 JDK 8 到 27 的收集器演进、选型路径与排查顺序。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 17万+

Linux 准确延时

http://blog.chinaunix.net/uid-26707720-id-3143726.html 应用层:    #include      1、unsigned int sleep(unsigned int seconds); 秒级    2、int usleep(useconds_t usec);              微秒级:1/10^

专注的力量 3532

基于MATLAB的变分模态分解(VMD)算法详解

变分模态分解(VMD)是一种先进的信号处理方法,通过变分框架将复杂信号分解为多个模态分量。相比传统经验模态分解(EMD),VMD具有坚实的数学基础,能有效抑制模态混叠和端点效应。其核心思想是将信号分解转化为约束优化问题,通过交替方向乘子法迭代求解各模态的中心频率和带宽。VMD在机械故障诊断、生物医学信号处理等领域展现出优越性能,尤其适合处理非平稳非线性信号。该算法通过严格的数学模型实现自适应频谱优化,为信号分析提供了更可靠的工具。

qq_42212808的博客 735

Kimi Code国产AI编程助手安装使用详细教程

Kimi Code 开发者智能编程服务简介:Kimi Code 是专为开发者提供的 AI 编程辅助工具,基于旗舰模型 Kimi K3(2.8万亿参数,支持100万token上下文)。提供 CLI、VS Code 插件等形式,支持代码阅读、编辑等功能。用户可通过API Key接入第三方工具。安装简单(Windows/Mac/Linux一键脚本),需在官网生成API密钥并登录使用。注意账户需充值余额方可正常调用服务。

猿小白的博客 2067

linux 时间戳 精确度,如何提高linux中的EXT4时间戳精度?(How to increase the EXT4 timestamp precision in linux?)...

如何提高linux中的EXT4时间戳精度?(How to increase the EXT4 timestamp precision in linux?)Linux中EXT4文件系统的时间戳精度或准确度为1秒( Windows时间戳精度为100纳秒 )。 但是我们在云上运行的应用程序需要更高的文件系统精度。 如何提高Linux中的时间戳精度?Timestamp precision or accur...

weixin_35123329的博客 545

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2209

前言

时间飞逝,日月如梭,眨眼间走出象牙塔已十余年。回首流失的岁月,猛然发现这十余年虽碌碌而无为。并未独得悠闲的原因是总想比别人干得更出色,为此花了不少时间,付出了不少心血,也学了不少东西。但没有什么东西可以引以自豪,更不要说传于后人了。总结教训,发现往往是当要用到某知识时才临时抱佛脚地学,学完之后也可以应用自如,但没有及时总结,也不注重平时积累,很快随着这些知识不用而慢慢遗忘了,当再需要时就又得从头开

thinkerABC的专栏 1406

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

linux-系统时间不准确

1、编辑clock vi /etc/sysconfig/clock ZONE="Asia/Shanghai" UTC=false #(主要是这个选项,设置硬件时钟不是跟utc一致) ARC=false 2、linux的时区设置为 上海 (测试到这步就可以了) ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 3、对准时间 ntpdate 或者: date -s “20140225 20:16:00” #yyyymmdd hh:mm:s

ligt 2395

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux进程延迟准确吗,嵌入式Linux应用程序实现精确延时的方法

在Linux应用程序中,常用的延时函数包括sleep()、usleep()、select()等,这几个延时函数函数的执行机制,都是将当前线程挂起,由操作系统做延时,然后再恢复当前线程。这意味着其延时的最小间隔是两次线程切换时间。经测试,在单一线程情况下,两次线程的切换时间在150us左右。大多数情况下,应用程序会有多个线程在运行,这时线程恢复有可能在下一个时间片,而Linux系统缺省的线程轮片时间...

weixin_39553272的博客 1052

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

usleep(0)与sched_yield() 调度及cpu_relax()

1、cpu_relax()用于短时间的忙等待,比如每个用户持锁的时间很短,让出cpu的代价不如忙等待。它和死循环等待的区别是,cpu空转功耗会低。所以一定会陷入内核态,调用deactivate_task触发任务调度,然后进行任务切换。而任务调度是比较耗时的。结论:重量级usleep(0) > sched_yield() > cpu_relax()2、sched_yield会调用sched_yield系统调用。3、usleep(n)会调用nanosleep系统调用。所以一定会陷入内核态,触发任务切换。

leiyanjie8995的博客 1269

【STM32】滴答时钟24位递减计数器系统时钟【SystTick】

系统时钟SystTck & Delay延时函数

weixin_63135906的博客 1717

cpu_relax和_mm_pause

cpu_relax和_mm_pause

qixiang2013的专栏 2013

什么时候需要cpu_relax()锁

在典型的超线程处理器中,每个超线程不是一个独立的core,所以两个或者多个超线程之间仍然在竞争一些资源,如果其中一个人调用了yield,那么它会在争抢中放慢节奏,而旁边的那个兄弟会抢地更多。2, 如果是超线程CPU的机器,可以让渡CPU给其他的线程;当然,cpu_relax()的具体实现与体系架构相关,不同的体系架构实现不一样,可能只完成了上面3个功能中的1个,2个而不是全部。总之,不管具体的体系架构怎么实现,忙等里面都适合加cpu_relax(),毕竟内核多数的代码要求是跨平台的。

yiyeguzhou100的专栏 2507

linux内核获取滴答数,Linux获取时间函数及计算时间差

第二章 计算时间差1. 实时函数clock_gettime 单位是十亿分之一秒,也就是纳秒(ns),使用的是标准POSIX实时时钟, 计算出来的结果可能有误差。在POSIX1003.1中增添了这个函数,它的原型如下:int clock_gettime(clockid_t clk_id, struct timespec *tp);它有以下的特点:1)它也有一个时间结构体:timespec ,tim...

weixin_36174545的博客 2472

cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化

在lock_timer_base()函数中看到在for循环操作中调用了cpu_relax(),本来以为是要让出CPU,调度其他进程运行,但是看代码之后发现完全不是这么回事。cpu_relax()中只有一条调用语句,调用的是rep_nop函数。rep_nop()函数如下: static inline void rep_nop(void) { asm volatile("rep; nop" :

Justlinux2010的专栏 1万+

linux内核时钟机制及延时

时钟时间维护和利用是操作系统的一个基础任务。操作系统中的时间相关的服务包括: 时间维护时钟同步time-of-day的表示下一个事件的调度处理器以及内核定时器进程统计进程度量 linux最初的实现包括了对这些服务的支持。其模型如图所示(TOD:time of day): 这种实现下每一种架构都有自己的一套时钟实现方案代码,同时也只支持低分辨率定时器,无法支持高分辨率定时器

浩海拾贝 8975

linux调度周期systick怎么看,Cortex-M0系统滴答定时器Systick详解

上图是LPC1114系统滴答定时器(SysTick)的结构图。系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器。其存在的主要目的是为嵌入式操作系统提供100Hz(即10ms)的定时节拍。当然,也可以做为其它的普通定时等其他用途。下面是LPC1114用户手册上列举出的一些用途,你可以了解了解。可编程设置频率的RTO...

weixin_39611382的博客 445

获取linux毫秒时钟滴答

https://blog.youkuaiyun.com/guang11cheng/article/details/6865992 https://www.cnblogs.com/wangliangblog/p/9336276.html

chenliang0224的专栏 1818

实时操作系统的滴答Tick设置多少才合适?

这里的配置选项很多,初学者可能不理解一些选项的含义,可以使用官方默认配置即可,等熟悉到一定程度,这些配置选项自然就理解了。中,对系统配置文件进行配置也是重要的一步。1000是一个比较适合的中等值,其他100、10000,或者2000也可以,只是不利于系统以及编程。100M主频的单片机,执行一次调度(几十条语句),时间在us级别,你说1ms对于系统而言有多长?除此之外,100、10000,或者2000,就是延时计算不方便之外,按理说也是可以的。,1us调度一次,CPU基本都在做调度的工作,不用干其他事了。

wangchen900705的博客 690
上一篇: Linux C语言库函数参考 — nice
下一篇: 如何使得执行scp命令时不需要输入用户密码
thinkerABC
博客等级 码龄23年 9粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值