Linux 下的推迟执行

准备中秋节

说个活动,评论文章点赞排名,用心评论哦,前5名获得每人 19 心意红包。

感谢大家的支持

我最近在用freertos,想让一个任务在某个时间后再执行,找了一圈,竟然没有这样才处理机制,因为也是新手入门freertos,可能需要自己实现,当然了,自己实现的话,机制就很多了,但是有个问题是,自己实现的话,就感觉不够规范,因为这样的原因,我还特意从Linux上移植了time_before和time_after过去,用了下,感觉还是很爽的。

Linux 有延迟执行的机制,有几种办法

1、忙等待

听到这个就知道了,如果是忙等待的话,肯定是占用cpu的,所以忙等待其实也是使用了time_before这个宏来实现。

#define time_after(a,b)        \	(typecheck(unsigned long, a) && \	typecheck(unsigned long, b) && \	((long)((b) - (long)(a)) < 0))	
time_before(a,b)    time_after(b,a)

这个是实现的原型,time_before也就是time_after反过来而已,我们之前有一篇文章讨论了time_after宏的实现和用法。不清楚的同学可以去看看,其中把无符号强制转成有符号是关键。

那我们怎么使用这个忙等待呢

很简单

unsigned long timeout = jiffies +10;	
while(time_before(jiffies,timeout));

while 循环会一直执行,因为time_before会一直返回true,知道jiffies的时间超过timeout的时间,这时候就会返回false。

也可以是这样使用

unsigned long timeout = jiffies +2*HZ;	
while(time_before(jiffies,timeout));

这个是等待2秒,一秒钟的节拍数是HZ,所以2秒就是2*HZ,这个好像太简单了些。

2、短延迟

这个也类似于忙等待,但是这个忙等待使用的函数不同,我们使用jiffies使用的是系统软件滴答数来做延迟,精度和时间上都有一定的局限性,但是使用delay函数的话,会相对好一些,时间的精准度会比较好。

void udelay(unsigned long usecs)	
void ndelay(unsigned long usecs)	
void mdelay(unsigned long usecs)

学习单片机的同学都知道,CPU执行的时间可以通过指令周期来确定时间,指令周期就是执行一条简单的指令所花费的时间,80C51下我知道是多少,ARM我还不懂,但是这些我们也不用太关心,每个体系结构下的delay实现,他们都自己计算实现好了,这也是使用系统和单片机的好处,封装什么的都搞好,就是要会使用才是关键。

用延迟实现的弊端就是会一直占用CPU时间,系统调用需要非常良好的性能,所以我们使用上面delay函数的时候,如果大于1ms的话,就可以换一种实现方式了。

640?wx_fmt=png

1、时钟周期 = 振荡周期,名称不同而已,都是等于单片机晶振频率的倒数,如常见的外接12M晶振,那它的时钟周期=1/12M。

2、机器周期,8051系列单片机的机器周期=12*时钟周期,之所以这样分是因为单个时钟周期根本干不了一件完整的事情(如取指令、写寄存器、读寄存器等),而12个时钟周期就能基本完成一项基本操作了。

3、指令周期。一个机器周期能完成一项基本操作,但一条指令常常是需要多项基本操作结合才能完成,完成一条指令所需的时间就是指令周期,当然不同的指令,其指令周期就不一样的了。

3、schedule_timeout

在上面两种方法的局限下,这个应该是最好的实现方式了,它的好是因为他可以睡眠,睡眠有一个好处就是不需要占用CPU资源,等时间到了再起床去干活就好了。

    set_current_state(TASK_UNINTERRUPTIBLE);	schedule_timeout(S*HZ);

上面的代码是让当前任务进入不可中断状态,任何睡眠S秒后再起床,使用schedule_timeout的时候,一定要记得设置状态,不然不能睡觉就麻烦了,也要注意你自己写的代码能不能睡眠,要不然引起问题就更尴尬了。

fastcall signed long __sched schedule_timeout(signed long timeout)	
{	struct timer_list timer;	unsigned long expire;	switch (timeout)	{	case MAX_SCHEDULE_TIMEOUT:	/*	* These two special cases are useful to be comfortable	* in the caller. Nothing more. We could take	* MAX_SCHEDULE_TIMEOUT from one of the negative value	* but I' d like to return a valid offset (>=0) to allow	* the caller to do everything it want with the retval.	*/	schedule();	goto out;	default:	/*	* Another bit of PARANOID. Note that the retval will be	* 0 since no piece of kernel is supposed to do a check	* for a negative retval of schedule_timeout() (since it	* should never happens anyway). You just have the printk()	* that will tell you if something is gone wrong and where.	*/	if (timeout < 0)	{	printk(KERN_ERR "schedule_timeout: wrong timeout "	"value %lx from %p\n", timeout,	__builtin_return_address(0));	current->state = TASK_RUNNING;	goto out;	}	}	expire = timeout + jiffies;	init_timer(&timer);	timer.expires = expire;	timer.data = (unsigned long) current;	timer.function = process_timeout;	add_timer(&timer);	schedule();	del_singleshot_timer_sync(&timer);	timeout = expire - jiffies;	out:	return timeout < 0 ? 0 : timeout;	
}	

网上有挺多文章说明了这个函数的实现,首先是初始化一个timer,然后往timer里去传初始化参数,其中有一个参数是current,这个是一个宏,这个宏的作用是获取当前的task,然后再设置超时时间,超时时间到了之后,通过调用process_timeout去唤醒之前休眠的task。

我们可以这样使用,当做一个delay来嵌入自己的代码中

inline static void snd_xx_delay_long(void)	
{	set_current_state(TASK_UNINTERRUPTIBLE);	schedule_timeout(1);	
}

640?wx_fmt=jpeg

扫码或长按关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js 获得明天0点时间戳_js实现一个简单钟表动画(javascript+html5 canvas)

自己学生时代的代码&#xff0c;发现还保存着&#xff0c;今天拿出来分享下。用js和html5 canvas对象实现一个简单钟表程序主要用到的就是h5的canvas对象canvas对象本人也不是很熟&#xff0c;大致看了几个常用的方法&#xff0c;难免有不足之处&#xff0c;仅是练习所用。实现…

mysql 根据当前时间戳_mysql timestamp类型 根据当前时间戳更新

注意到这个是因为一次事故。一个简单的操作记录表&#xff0c;只记录了一个操作人&#xff0c;操作时间&#xff0c;操作结果。当时为了演示效果&#xff0c;在生产环境中去修改&#xff0c;创建数据。一顿操作猛如虎之后发现&#xff0c;所有改过的数据的创建时间都变成了当前…

设置拖拽事件,获取拖拽内容

设置dragEnter 设置DragDrop using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using…

笔记本电脑锁_2020年双11有哪些值得选购的笔记本电脑?(全能本/便携高性能笔记本电脑/设计本)...

&#xff08;本文于2020年10月22日更新&#xff09;本文章会不定期更新&#xff0c;保证文章的时效性和准确性&#xff0c;可点赞或收藏本文章&#xff0c;这样在需要的时候可以找到啦。文章推荐产品较多&#xff0c;按价位排序&#xff0c;篇幅较长&#xff0c;可按键盘CtrlF快…

300来行代码实现最小Linux文件系统

Linux作为一个类UNIX系统&#xff0c;其文件系统保留了原始UNIX文件系统的表象形式&#xff0c;它看起来是这个样子&#xff1a;rootname-VirtualBox:/# lsbin boot cdrom dev etc home lib lib64 lostfound media mnt opt proc root run sbin snap srv sys …

淘宝怎么多个订单一起付款_淘宝未付款订单如何催付?

淘宝未付款订单如何催付&#xff1f;很多人只认为运营就是技巧&#xff0c;其实客服也是需要技巧的&#xff0c;客服也是关键的数据支撑。一个好的客服团队&#xff0c;能够很好地提高转化率、客单价、复购率&#xff0c;有效的降低退款率、纠纷等售后问题。今天和大家分享一下…

爱大姚,恨男篮

先祝姚明生日快乐2019年9月12日。是中国篮协主席、CBA董事长姚明39岁的生日&#xff0c;时间已经过去几天了&#xff0c;当时铺天盖地的都是其他的热点新闻&#xff0c;很多人&#xff0c;包括我也忘记了这个大个子已经39岁了&#xff0c;看着中国男篮的惨败&#xff0c;很想冲…

Linux 内核系统架构

描述Linux内核的文章已经有上亿字了但是对于初学者&#xff0c;还是应该多学习多看&#xff0c;毕竟上亿字不能一下子就明白的。即使看了所有的Linux 内核文章&#xff0c;估计也还不是很明白&#xff0c;这时候&#xff0c;还是需要fucking the code.28年前(1991年8月26日)Lin…

gif透明背景动画_如何利用premiere制作GIF动态图片

GIF制作流程(也可以用此教程把视频变成GIF动图)作者&#xff1a;益红一、导出设计文件将要做动画的文件在ps里面导出 (透明图层用PNG)(也可以将合适的视频片段作为素材)二、在PR里面新建项目打开 Adobe premiere选择 新建项目找到新建项目 — 命名 —设置合适的项目 位置-点击浏…

离职了

这是我毕业后的第一份工作...面试时&#xff0c;HR小姐姐告诉我...然鹅...我入职之后才发现&#xff1a;对标阿里的只有加班强度对标华为的只有狼性文化对标百度的&#xff0c;额&#xff0c;没有对标百度同事们有的住在海淀区、有的住在朝阳区&#xff0c;作为刚毕业的一枚“穷…

windows7官方原版_如何下载微软原版操作系统、办公软件

如何下载微软原版操作系统、办公软件&#xff1f;简介&#xff1a;微软操作系统从MS-DOS到Windows XP&#xff0c;Windows 7&#xff0c;Windows 8&#xff0c;再到现在的Windows 10 &#xff0c;一代比一代强&#xff0c;每代都有自己的特点。现在我们能从官网上下载到的只有W…

CPU是如何访问到内存的?

讨论的重点我们知道CPU有地址总线&#xff0c;数据总线和控制总线数据总线&#xff08;Data Bus&#xff09;&#xff1a;在CPU与RAM之间来回传送需要处理或是需要储存的数据。地址总线&#xff08;Address Bus&#xff09;&#xff1a;用来指定在RAM&#xff08;Random Access…

macos支持exfat吗_打造便捷、人性化的macOS桌面使用环境

原标题&#xff1a;打造便捷、人性化的macOS桌面使用环境打造便捷、人性化的macOS桌面使用环境 2020-10-23 17:25:410点赞4收藏0评论欢迎参加#果粉是怎样炼成的#征稿&#xff0c;围观秋季发布会新品&#xff01;是什么让苹果生态无法割舍&#xff1f;快来讲讲你的果粉炼成记&am…

滴滴是如何搭建起PB级数据中台的?

滴滴公司自12年底上线至今&#xff0c;俨然成功跻身互联网大咖行列&#xff0c;在以流量活命的互联网世界里&#xff0c;如果没有一定的硬核技术为业务做支撑&#xff0c;单靠营销与宣传&#xff0c;是没有办法留住日益挑剔的用户的。我们今天就谈一谈滴滴打车背后所用到的大数…

java技术_2020年最流行的Java开发技术

点击上方“千锋教育”后台回复「 Java 」&#xff0c;领取视频学习教程在本文中&#xff0c;我们将以编程界最常用的编程语言Java为例&#xff0c;分享最为主流的技术与工具。Java几乎无处不在&#xff0c;无论在智能手机、台式机、游戏设备还是科学超级计算机上&#xff0c;处…

gx works2 存储器空间或桌面堆栈不足_静态体验奇瑞艾瑞泽GX冠军版,细节做工很精湛...

奇瑞艾瑞泽GX冠军版车型正式上市。编辑近日趁着区域上市的机会&#xff0c;对其进行了静态体验。这车怎么样&#xff1f;分几个方面来看看外观方面&#xff0c;运动范儿十足&#xff0c;看着就年轻&#xff0c;一副活力四射的样子。得益于fastback极速凌动的设计元素&#xff0…

我这几年呆的这几个公司

之前发的丰富的经历我12年硕士毕业&#xff0c;历经华为&#xff0c;某芯片原厂外企&#xff0c;某芯片原厂国企&#xff0c;某手机公司&#xff0c;最后来到大疆&#xff0c;可以说是一个跳槽小能手&#xff0c;因为具有多家大企业的工作经历&#xff0c;我觉得谈下自己在各个…

nsoutlineview 搜索_阿里巴巴搜索推荐广告三位一体的在线服务体系

最近在工作中大量使用到了淘系的在线分发服务体系&#xff0c;可以快速高效的实现个性化内容分发&#xff0c;其技术架构的概览在这里分享给大家。AIOS(Artificial Intelligence Online Serving)是阿里巴巴集个性化搜索、推荐、广告三位一体的在线服务平台。在大型互联网公司里…

为了生活

前几天&#xff0c;我刚刚满30岁&#xff0c;30岁的那天&#xff0c;过得很深刻&#xff0c;高烧了40度&#xff0c;每次发烧我都没有去医院&#xff0c;这次也一样&#xff0c;潜意识里面觉得它一定会来&#xff0c;潜意识里面也知道它一定会走&#xff0c;不管是40度还是45度…

深度ip转换器手机版app_手机大师智能管家app下载-手机大师智能管家app官网版 v1.0.0...

手机大师智能管家app&#xff1a;针对各种手机垃圾快速在线清除的软件&#xff0c;利用这款软件可以快速的清除各种不同的手机垃圾&#xff0c;而且还可以一键在线加速&#xff0c;更好的享受手机加速带来的便捷&#xff0c;同时针对各种文件清理也更加的简单&#xff0c;让你更…