关于udelay(); mdelay(); ndelay(); msleep();

本文详细介绍了Linux系统中常用的延时函数,包括msleep、mdelay、udelay等,并对比了它们之间的区别与应用场景,特别指出msleep和mdelay在实际使用中的差异。
在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay.
虽然msleep和mdelay都有延迟的作用,但他们是有区别的.
mdeday还忙等待函数,在延迟过程中无法运行其他任务.这个延迟的时间是准确的.是需要等待多少时间就会真正等待多少时间.而msleep是休眠函数,它不涉及忙等待.你如果是msleep(10),那实际上延迟的时间,大部分时候是要多于10ms的,是个不定的时间值.
他们的差异,平时我也讲的出来,可是真正用起来的时候,就忘记了.曾在两个driver的i2c的code中,需要用到delay函数,而我用了msleep函数,一直I2C速度超慢.而我又不知道哪里出了问题,我潜意识中,认为我只delay了1ms,可是,实际上是十几毫秒.
这几个函数都是内核的延时函数:
1.
udelay(); mdelay(); ndelay();实现的原理本质上都是忙等待,ndelay和mdelay都是通过udelay衍生出来的,我们使用这些函数的实现往往会碰到编译器的警告implicit declaration of function'udelay',这往往是由于头文件的使用不当造成的。在include/asm-???/delay.h中定义了udelay(),而在include/linux/delay.h中定义了mdelay和ndelay.
udelay一般适用于一个比较小的delay,如果你填的数大于2000,系统会认为你这个是一个错误的delay函数,因此如果需要2ms以上的delay需要使用mdelay函数。
2.由于这些delay函数本质上都是忙等待,对于长时间的忙等待意味这无谓的耗费着cpu的资源,因此对于毫秒级的延时,内核提供了msleep,ssleep等函数,这些函数将使得调用它的进程睡眠参数指定的时间。
应用层:    #include    1、unsigned int sleep(unsigned int seconds); 秒级    2、int usleep(useconds_t usec);              微秒级:1/10^-6    #define _POSIX_C_SOURCE 199309    #include    3、int nanosleep(const struct timespec *req, struct timespec *rem);        struct timespec {                   time_t tv_sec;        /* seconds */                   long   tv_nsec;       /* nanoseconds */               };        // The value of the nanoseconds field must be in the range 0 to 999999999.    内核层:    include    1、void ndelay(unsigned long nsecs);         纳秒级:1/10^-10    2、void udelay(unsigned long usecs);         微秒级: 1/10^-6    3、void mdelay(unsigned long msecs);         毫秒级:1/10^-3
【教程文章/演示视频链接:https://blog.csdn.net/m0_61712829/article/details/147479334?spm=1001.2014.3001.5501】本教程文章完整记录实现STM32+ESP8266+MQTT+ThingsCloud云平台+Android App及iOS App及微信小程序及Web App应用。手机APP支持苹果以及安卓系统,以及微信小程序和Web App。同时在ThingsCloud云平台可查看数据。本教程以远程温湿度显示及点灯作为示例。最终效果实现本地OLED显示屏、云平台和手机APP、微信小程序和Web App可远程查看温湿度数据,并可远程控制LED灯亮灭。以此完成STM32+ESP8266+MQTT+ThingsCloud云平台+上位机应用软件的基于MQTT协议的远程发布订阅数据,以此在本教程基础上可扩展开发更多的功能。所需主要硬件包括:STM32F103C8T6最小系统板、0.96寸 OLED显示屏、DHT11温湿度传感器、ESP8266模块、LED为STM32F103C8T6最小系统板的板载PC13指示灯。文章首先介绍实现本地OLED显示温湿度及控制LED,以及本教程的接线原理图,接着讲解ESP8266烧录MQTT固件及接线,接着讲解在ThingsCloud云平台创建项目,然后讲解编写STM32程序接入平台并订阅发布消息,最后讲解创建Android App及iOS App及微信小程序及Web App应用。“1.程序源码”文件夹如下两个“1.本地OLED显示温湿度及LED控制”程序源码工程实现本地OLED显示温湿度及LED闪烁控制“2.远程显示温湿度及LED控制---ThingsCloud云平台”程序源码工程是本项目的最终程序工程,实现远程显示温湿度及点灯“2.原理图”为本项目电路原理图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值