介绍
让程序休眠(延时)指定的时间,然后再继续执行。是阻塞函数,调用期间当前线程会暂停执行,不消耗 CPU 资源,但会阻塞后续代码运行,需避免在实时性要求高的场景中使用过长延时
使用场景
在 GPIO 控制中,usleep 常用于需要时间间隔的操作
头文件
使用这些函数时,需要加上下面头文件才能调用:
#include <unistd.h>
sleep()
秒级延时
定义
unsigned int sleep (unsigned int __seconds);
参数:
__seconds:需要休眠的时间,单位:秒
返回值:成功返回 0;失败返回 -1(例如 __seconds 超过最大值)。
例子
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Hello, World!\n");
sleep(3);
printf("Hello, World!\n");
return 0;
}
usleep()
微秒级延时,1秒(s)=1000毫秒(ms)
秒、毫秒、微秒、纳秒换算详见 链接
定义
int usleep(unsigned int __useconds);
参数:
__useconds:需要休眠的时间,单位:微秒,范围通常为0到1,000,000(即最大支持 1 秒延时,部分平台可能支持更大值)。
返回值:成功返回 0;失败返回 -1(例如 usec 超过最大值)。
注意事项
精度限制:
usleep的实际延时精度受系统调度和硬件时钟影响,可能存在微小误差(通常在几十到几百微秒内),不适合要求纳秒级精度的场景。最大延时:
标准usleep最大支持 1 秒(1,000,000 微秒)延时,若需要更长时间,可多次调用或使用sleep函数(秒级延时)。
案例
1. 控制 LED 闪烁(固定间隔)
#include "gpio_if.h"
#include "wifiiot_gpio.h"
#include "unistd.h" // 包含usleep头文件
void BlinkLedExample(void) {
// 配置GPIO9为通用GPIO并设置为输出模式(省略部分代码)
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
GpioSetDir(WIFI_IOT_GPIO_IDX_9, WIFI_IOT_GPIO_DIR_OUT);
while (1) {
// 点亮LED(输出高电平)
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_9, 1);
usleep(500000); // 延时500,000微秒(0.5秒)
// 熄灭LED(输出低电平)
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_9, 0);
usleep(500000); // 延时0.5秒
}
}
2. 与传感器交互(等待响应时间)
部分传感器(如温湿度传感器 DHT11)在发送触发信号后,需要等待一定时间才能返回数据,此时可用 usleep 控制等待时长:
// 发送触发信号(省略引脚配置)
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_5, 0); // 拉低总线
usleep(18000); // 保持18毫秒(18,000微秒)
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_5, 1); // 拉高总线
usleep(40); // 等待40微秒,等待传感器响应
区别
sleep(sec):秒级延时,参数为秒数(如sleep(1)表示延时 1 秒),精度较低。usleep(usec):微秒级延时,精度中等,适合毫秒级(1毫秒=1000微秒)到秒级的延时。nanosleep(nsec):纳秒级延时,精度最高(1微秒=1000纳秒),但在嵌入式平台中较少使用。
在 OpenHarmony 物联网开发中,usleep 是平衡精度和易用性的常用选择,尤其适合 GPIO 控制、传感器交互等场景。