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

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

1.APP 调用 read 等函数试图读取数据,比如读取按键;
2.APP 进入内核态,也就是调用驱动中的对应函数,发现有数据则复制到用户
空间并马上返回;
3.如果 APP 在内核态,也就是在驱动程序中发现没有数据,则 APP 休眠;
4.当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记
录数据、唤醒 APP;
5.APP 继续运行它的内核态代码,也就是驱动程序中的函数,复制数据到用户
空间并马上返回。
驱动中有数据时,图 19.1 中红线就是 APP1 的执行过程,涉及用户态、内
核态:
在这里插入图片描述
驱动中没有数据时,APP1 在内核态执行到 drv_read 时会休眠。所谓休眠就是把自己的状态改为非 RUNNING,这样内核的调度器就不会让它运行。当按下按键,驱动程序中的中断服务程序被调用,它会记录数据,并唤醒 APP1。所以唤醒就是把程序的状态改为 RUNNING,这样内核的调度器有合适的时间就会让它运行。当 APP1 再次运行时,就会继续执行 drv_read 中剩下的代码,把数据复制回用户空间,返回用户空间。APP1 的执行过程如下图的红色实线所示,它被分成了 2段:
请添加图片描述
值得注意的是,上面 2 个图中红线部分都属于 APP1 的“上下文”,或者这样说:红线所涉及的代码,都是 APP1 调用的。但是按键的中断服务程序,不属于APP1 的“上下文”,这是突如其来的,当中断发生时,APP1 正在休眠呢。
在 APP1 的“上下文”,也就是在 APP1 的执行过程中,它是可以休眠的。
在中断的处理过程中,也就是 gpio_key_irq 的执行过程中,它不能休眠:“中断”怎么能休眠?“中断”休眠了,谁来调度其他 APP 啊?
所以,请记住:在中断处理函数中,不能休眠,也就不能调用会导致休眠的
函数。
等待内核函数:
请添加图片描述
比较重要的参数就是:
wq:waitqueue,等待队列
休眠时除了把程序状态改为非 RUNNING 之外,还要把进程/进程放入wq 中,以后中断服务程序要从 wq 中把它取出来唤醒。
没有 wq 的话,茫茫人海中,中断服务程序去哪里找到你?
condition
这可以是一个变量,也可以是任何表达式。表示“一直等待,直到 condition为真”。
唤醒内核函数:
请添加图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值