☰
[Linux外设驱动详解]usleep 系统调用流程深度解析 (基于 RK3588 平台)
2026/10/18 5:39:14 网站建设 项目流程

usleep 系统调用流程深度解析 (基于 RK3588/ARM64 平台)

目录

  1. 概述
  2. 用户空间接口
  3. 系统调用入口
  4. 高精度定时器子系统
  5. 调度器与休眠机制
  6. ARM64 架构定时器实现
  7. RK3588 平台特性
  8. 完整调用流程图

概述

usleep()是 Linux 系统中用于微秒级延迟的函数,它通过系统调用来实现进程的精确休眠。在 RK3588 (ARM64 架构) 平台上,这一过程涉及多个内核子系统的协同工作。

核心调用链路:

usleep() → nanosleep() 系统调用 → hrtimer_nanosleep() → do_nanosleep() → schedule_hrtimeout_range() → hrtimer_start_expires() → schedule()

用户空间接口

1. usleep/usleep_range 函数

在用户空间中,usleep()是 glibc 提供的封装函数:

// glibc 实现简化版unsignedintusleep(unsignedintuseconds){structtimespects={.tv_sec=useconds/1000000,.tv_nsec=(useconds%1000000)*1000};returnnanosleep(&ts,NULL);}

2. 内核空间 usleep_range

驱动开发中常用的usleep_range()位于kernel/time/timer.c:1796:

/** * usleep_range - Sleep for an approximate time * @min: Minimum time in usecs to sleep * @max: Maximum time in usecs to sleep */void__schedusleep_range(unsignedlongmin,unsignedlongmax){usleep_range_state(min,max,TASK_UNINTERRUPTIBLE);}EXPORT_SYMBOL(usleep_range);

实现细节:

// kernel/time/timer.cvoid__schedusleep_range_state(unsignedlongmin,unsignedlongmax,unsignedintstate){ktime_texp=ktime_add_us(ktime_get(),min);u64 delta=(u64)(max-min)*NSEC_PER_USEC;for(;;){__set_current_state(state);/* Do not return before the requested sleep time has elapsed */if(!schedule_hrtimeout_range(&exp,delta,HRTIMER_MODE_ABS))break;}}

系统调用入口

1. SYSCALL_DEFINE2(nanosleep)

系统调用入口定义在kernel/time/hrtimer.c:2014:

SYSCALL_DEFINE2(nanosleep,struct__kernel_timespec__user*,rqtp,struct__kernel_timespec__user*,rmtp){structtimespec64tu;if(get_timespec64(&tu,rqtp))return-EFAULT;if(!timespec64_valid(&tu))return-EINVAL;current->restart_block.fn=do_no_restart_syscall;current->restart_block.nanosleep.type=rmtp?TT_NATIVE:TT_NONE;current->restart_block.nanosleep.rmtp=rmtp;returnhrtimer_nanosleep(timespec64_to_ktime(tu),HRTIMER_MODE_REL,CLOCK_MONOTONIC);}

2. clock_nanosleep 系统

clock_nanosleep提供更灵活的时钟选择(kernel/time/posix-timers.c:1285):

SYSCALL_DEFINE4(clock_nanosleep,constclockid_t,which_clock,int,flags

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询