OpenHarmony API-sleep()、usleep() 休眠指定的时间

介绍

让程序休眠(延时)指定的时间,然后再继续执行。是阻塞函数,调用期间当前线程会暂停执行,不消耗 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 超过最大值)。

注意事项

  1. 精度限制:
    usleep 的实际延时精度受系统调度和硬件时钟影响,可能存在微小误差(通常在几十到几百微秒内),不适合要求纳秒级精度的场景。

  2. 最大延时:
    标准 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 控制、传感器交互等场景。


原文出处:/show_1GW1wJDkVcQB.html