news 2026/4/16 20:03:44

[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/4/16 16:12:22

[Linux外设驱动详解]Linux 定时器系统深度解析

Linux 定时器系统深度解析 目录 概述 定时器类型总览 HZ 定时器 (传统定时器) 高精度定时器 (hrtimer) 两种定时器的关系 硬件定时器层 完整调用链分析 概述 Linux 内核有多个定时器子系统,它们协同工作提供不同精度的定时服务。理解这些定时器之间的关系对于深入理解内核时…

作者头像 李华
网站建设 2026/4/16 16:24:32

CUDA安装Nsight Systems性能分析工具介绍

CUDA与Nsight Systems在AI开发中的性能优化实践 如今,深度学习模型的规模正以惊人的速度增长——从数亿参数到数千亿参数,训练任务对算力的需求几乎每两年翻一番。在这种背景下,仅仅让代码“跑起来”已经远远不够了。我们真正需要的是高效地跑…

作者头像 李华
网站建设 2026/4/16 15:06:26

Miniconda-Python3.10一键配置PyTorch环境,轻松实现AI训练加速

Miniconda-Python3.10一键配置PyTorch环境,轻松实现AI训练加速 在高校实验室里,一个学生刚接手师兄留下的深度学习项目,满怀信心地运行代码,结果却卡在了第一条 import torch 上——CUDA 版本不兼容、依赖包冲突、环境变量错误………

作者头像 李华
网站建设 2026/4/16 13:32:59

嵌入式系统中crash的底层驱动成因深度剖析

嵌入式系统崩溃的底层驱动真相:从指针越界到中断失控,一次讲透你有没有遇到过这样的场景?设备运行得好好的,突然“啪”一下重启,串口只留下一行模糊的Unable to handle kernel NULL pointer dereference,再…

作者头像 李华
网站建设 2026/4/16 15:15:14

WeChatPad终极指南:轻松实现微信多设备同时在线

WeChatPad终极指南:轻松实现微信多设备同时在线 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 微信作为国民级应用,其设备限制一直是用户痛点。WeChatPad项目通过创新的技术方案&…

作者头像 李华
网站建设 2026/4/16 15:15:12

终极指南:WeChatPad如何强制开启微信平板模式实现双设备登录

终极指南:WeChatPad如何强制开启微信平板模式实现双设备登录 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad WeChatPad是一款基于Xposed框架的LSPosed模块,专门用于强制启用微信平板模…

作者头像 李华