按键演示休眠与唤醒场景--基于IMX6ULL

简介: 按键演示休眠与唤醒场景--基于IMX6ULL

按键演示休眠与唤醒场景–基于IMX6ULL

1.APP 调用 read 等函数试图读取数据,比如读取按键;

2.APP 进入内核态,也就是调用驱动中的对应函数,发现有数据则复制到用户

空间并马上返回;

3.如果 APP 在内核态,也就是在驱动程序中发现没有数据,则 APP 休眠;

4.当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记

录数据、唤醒 APP;

5.APP 继续运行它的内核态代码,也就是驱动程序中的函数,复制数据到用户

空间并马上返回。

驱动中有数据时,图 19.1 中红线就是 APP1 的执行过程,涉及用户态、内

核态:

ae5e0da741b547f490df514a7538dcf2.png

驱动中没有数据时,APP1 在内核态执行到 drv_read 时会休眠。所谓休眠就是把自己的状态改为非 RUNNING,这样内核的调度器就不会让它运行。当按下按键,驱动程序中的中断服务程序被调用,它会记录数据,并唤醒 APP1。所以唤醒就是把程序的状态改为 RUNNING,这样内核的调度器有合适的时间就会让它运行。当 APP1 再次运行时,就会继续执行 drv_read 中剩下的代码,把数据复制回用户空间,返回用户空间。APP1 的执行过程如下图的红色实线所示,它被分成了 2段:

9c598b398325493f87a6f8a896f20f68.png

值得注意的是,上面 2 个图中红线部分都属于 APP1 的“上下文”,或者这样说:红线所涉及的代码,都是 APP1 调用的。但是按键的中断服务程序,不属于APP1 的“上下文”,这是突如其来的,当中断发生时,APP1 正在休眠呢。

在 APP1 的“上下文”,也就是在 APP1 的执行过程中,它是可以休眠的。

在中断的处理过程中,也就是 gpio_key_irq 的执行过程中,它不能休眠:“中断”怎么能休眠?“中断”休眠了,谁来调度其他 APP 啊?

所以,请记住:在中断处理函数中,不能休眠,也就不能调用会导致休眠的

函数。

等待内核函数:


22d7ba4688434b4c9402e4fb8ee031e1.png

比较重要的参数就是:

wq:waitqueue,等待队列

休眠时除了把程序状态改为非 RUNNING 之外,还要把进程/进程放入wq 中,以后中断服务程序要从 wq 中把它取出来唤醒。

没有 wq 的话,茫茫人海中,中断服务程序去哪里找到你?

condition

这可以是一个变量,也可以是任何表达式。表示“一直等待,直到 condition为真”。

唤醒内核函数:

d7f19bb230674eeab2afe87f75f684ee.png

目录
相关文章
|
存储 SQL 分布式计算
|
9月前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费习惯预测的深度学习模型
使用Python实现智能食品消费习惯预测的深度学习模型
320 19
|
10月前
|
自然语言处理 安全 前端开发
什么是CMS?CMS适合搭建什么网站?
CMS(内容管理系统)用于快速搭建、管理和发布网站内容。它支持自定义板块,降低建站门槛。CMS分为独立CMS和SaaS CMS两种类型,主要功能包括角色分配、SEO优化、多语言支持等。建站流程包括确定需求、选择系统、购买域名和主机、安装系统、选择模板、扩展栏目、添加内容、上线和维护。PageAdmin CMS是一款优秀的建站系统,推荐免费试用。
513 1
|
10月前
|
存储 算法 安全
深入理解Linux内核的内存管理机制
本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
|
中间件 Linux 芯片
一张图秒懂嵌入式Linux系统的启动流程
一张图秒懂嵌入式Linux系统的启动流程
664 0
|
编解码 监控 Ubuntu
MJPG-streamer方案实现物联网视频监控
MJPG-streamer方案实现物联网视频监控
MJPG-streamer方案实现物联网视频监控
|
存储 Linux C语言
【IMX6ULL项目】IMX6ULL上Linux系统实现产测工具框架(一)
【IMX6ULL项目】IMX6ULL上Linux系统实现产测工具框架(一)
322 0
|
Ubuntu Linux 芯片
Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)
Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)
550 1
Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)
|
芯片
imx6ull的GPIO操作方法
imx6ull的GPIO操作方法
447 0
imx6ull的GPIO操作方法
|
存储 分布式计算 Hadoop
Apache Hudi:云数据湖解决方案
Apache Hudi:云数据湖解决方案
232 0