news 2026/9/10 12:52:03

[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/9/8 19:10:27

Jupyter Lab Keyboard Shortcuts键盘快捷键大全

Jupyter Lab 键盘快捷键:从高效操作到工程化实践 在数据科学和机器学习的日常工作中,你是否曾因频繁切换鼠标与键盘而感到效率受限?一个简单的“插入新单元格”动作,需要移动光标、点击按钮、再切回代码——这种看似微小的操作&am…

作者头像 李华
网站建设 2026/9/8 11:11:12

C++第七章学习心得

学习C第七章后,我对相关知识有了系统的掌握,也深刻体会到C语言的严谨性与实用性,现将学习心得总结如下: 本章核心内容围绕[此处可替换为具体章节主题,如:函数重载、类与对象、继承与派生等]展开&#xff…

作者头像 李华
网站建设 2026/9/3 10:02:49

使用Miniconda-Python3.10搭建深度学习环境:从零配置PyTorch+GPU

使用Miniconda-Python3.10搭建深度学习环境:从零配置PyTorchGPU 在高校实验室或企业AI研发团队中,你是否曾遇到过这样的场景?一个同事兴奋地跑来告诉你他复现了某篇顶会论文的结果,可当你拉下代码、安装依赖后却报出一连串CUDA不…

作者头像 李华
网站建设 2026/9/3 1:18:30

Miniconda配置PyTorch环境时如何避免网络超时错误

Miniconda配置PyTorch环境时如何避免网络超时错误 在深度学习项目开发中,一个常见的“拦路虎”不是模型调参,也不是数据清洗,而是——环境装不上。你是否经历过这样的场景:满怀信心地打开终端,输入一行 conda install …

作者头像 李华
网站建设 2026/9/10 2:01:12

Miniconda-Python3.10环境下安装PyTorch TorchVision全流程

Miniconda-Python3.10环境下安装PyTorch TorchVision全流程 在深度学习项目中,一个常见但令人头疼的问题是:“为什么我的代码在别人机器上跑不起来?” 答案往往藏在环境差异里——Python 版本不一致、依赖库冲突、CUDA 驱动错配……这些问题…

作者头像 李华
网站建设 2026/9/3 16:21:30

IAR下载调试环境配置核心要点说明

IAR下载调试环境配置核心要点说明在嵌入式开发的日常中,一个稳定高效的下载与调试环境,往往决定了项目能否顺利推进。尤其当我们面对复杂的 Cortex-M 系统、多 Bank Flash 架构或 OTA 升级需求时,IAR Embedded Workbench作为工业级 IDE 的代表…

作者头像 李华