news 2026/3/8 15:57:04

[Linux外设驱动详解]usleep 系统调用流程深度解析 (基于 RK3588 平台)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Linux外设驱动详解]usleep 系统调用流程深度解析 (基于 RK3588 平台)

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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/6 7:55:29

使用Miniconda为不同客户定制专属大模型运行环境

使用Miniconda为不同客户定制专属大模型运行环境 在面向企业客户的AI项目交付中,一个看似基础却频频引发故障的问题浮出水面:为什么同一个模型,在开发机上跑得好好的,到了客户服务器却频频报错? 答案往往藏在那些不起眼…

作者头像 李华
网站建设 2026/3/7 21:07:48

如何在Miniconda环境下高效部署PyTorch并启用GPU加速

如何在Miniconda环境下高效部署PyTorch并启用GPU加速 在深度学习项目日益复杂的今天,开发者常面临一个看似简单却极易出错的问题:为什么本地能跑通的代码,换一台机器就报错?更常见的是,明明装了 PyTorch 和 CUDA&#…

作者头像 李华
网站建设 2026/3/4 22:47:31

STM32开发第一步:Keil5 MDK安装详细操作指南

从零开始搭建STM32开发环境:Keil5 MDK 安装实战全记录 你是不是也经历过这样的时刻?刚买回一块STM32开发板,满心期待地打开电脑准备“点灯”,结果第一步就被卡在了 Keil安装失败、编译器报错、ST-Link无法识别 ……明明只是想写…

作者头像 李华
网站建设 2026/3/7 4:01:14

IAR下载与Bootloader协同设计:实战示例

IAR下载与Bootloader协同设计:实战示例从一个真实问题说起你有没有遇到过这样的场景?调试应用代码时,一切正常。可当你通过IAR重新下载一次程序后,设备再也无法启动——不是卡在复位循环,就是直接“变砖”。更诡异的是…

作者头像 李华