news 2026/5/8 3:51:35

[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/29 23:51:09

FlutterOpenHarmony主题切换功能实现

# 前言 主题切换功能是现代应用中提升用户体验的重要特性。用户可以根据个人喜好和使用环境选择不同的主题风格,如浅色主题、深色主题或跟随系统设置。对于笔记应用来说,合适的主题不仅能够保护用户视力,还能提供更舒适的阅读和编辑体验。本文…

作者头像 李华
网站建设 2026/4/22 11:23:39

DeepMind观点:分布式集体智能才是AGI的终极形态?

导语长期以来,人工智能领域一直笼罩在“单体AGI”的假设之下,认为通用人工智能终将以一个全能的超级大脑形式降临。然而,Google DeepMind 的最新研究却打破了这一幻象,提出 AGI 的真正形态或许是一个由无数亚智能体(su…

作者头像 李华
网站建设 2026/5/3 1:12:50

IAR下载与驱动兼容性:入门级问题汇总

IAR 下载失败?别急,先搞定 J-Link 驱动兼容性问题 你有没有遇到过这样的场景:代码写得没问题,编译也通过了,信心满满地点下“IAR 下载”按钮,结果弹出一个红色错误框——“No J-Link found” 或者 “Found…

作者头像 李华
网站建设 2026/5/3 16:28:06

为什么科研人员偏爱Miniconda-Python3.10进行模型复现?

为什么科研人员偏爱 Miniconda-Python3.10 进行模型复现? 在深度学习研究中,一个看似简单的“复现实验”任务常常让人头疼不已。你满怀期待地克隆了某篇论文的开源代码,安装依赖、运行脚本,结果却卡在第一条 import torch 上——版…

作者头像 李华