Linux kernel 驱动中,有不少驱动会引用到 EPROBE_DEFER 这个错误号。比如下面这个例子,对 devm_gpiod_get 的返回值进行判断,如果有错误且错误号不是
-EPRBOE_DEFER
,才输出error log。
那么 EPRBOE_DEFER 有什么特别之处吗,需要驱动程序这样特意处理?这个与 kernel 设计的 driver-deferred-probe 机制有关。
kernel 下有多个独立的驱动,每个驱动或多或少地会引用到其他驱动提供的资源,比如某个外设驱动需要使用 gpio 资源,就会通过 gpio 驱动提供的函数接口去申请 gpio;但是当A驱动引用B驱动提供的资源时,B驱动可能还没有工作起来,
为了解决驱动之间的这种依赖关系,kernel 设计了 driver-deferred-probe 机制:某个驱动在 probe 过程中,如果遇到依赖的资源还没有准备好,那么就返回 -EPRBOE_DEFER,kernel 检测到该驱动返回的是 -EPRBOE_DEFER,就会在过一段时间后让该驱动再次 probe。
driver-deferred-probe 流程如下图所示,有三条可能的路径
:
-
生成新的 device 时
-
注册新的 driver 时
-
later_initcall 主动再次触发
driver-deferred-probe 机制的核心数据结构与函数是:
有了 driver-deferred-probe 机制后,编写驱动程序时,除了某些驱动有严格的执行次序,需要特意去定义 initcall 等级之外,一般的驱动则无需太过关心驱动间的依赖,从而在一定程度上简化了驱动开发。
以上就是对 EPRBOE_DEFER 的简要介绍。
作者:bigfish99
博客:https://www.cnblogs.com/bigfish0506/
公众号:大鱼嵌入式
Linux kernel 驱动中,有不少驱动会引用到 EPROBE_DEFER 这个错误号。比如下面这个例子,对 devm_gpiod_get 的返回值进行判断,如果有错误且错误号不是-EPRBOE_DEFER,才输出error log。那么 EPRBOE_DEFER 有什么特别之处吗,需要驱动程序这样特意处理?这个与 kernel 设计的 driver-deferred-probe 机制有关。kernel 下有多个独立的驱动,每个驱动或多或少地会引用到其他驱动提供的资源,比如某个外设驱动需...
形象的描述了async与
def
er
的区别,简单易懂的理解
async是异步执行,异步下载完毕后就会执行,不确保执行顺序,一定在 onload前,但不确定在 DOMContentLoaded事件的前或后
def
er
是延迟执行,在浏览器看起来的效果像是将脚本放在了 body后面一样(虽然按规范应该是在 DOMContentLoaded事件前,但实际上不同浏览器的优化效果不一样,也有可能在它后面)
那么 EPRBOE_
DEF
ER
有什么特别之处吗,需要
驱动
程序这样特意处理?这个与 k
er
nel 设计的 driv
er
-
def
er
red-
pro
be 机制有关。
k
er
nel 下有多个独立的
驱动
,每个
驱动
或多或少地会引用到其他
驱动
提供的资源,比如某个外设驱.
Hive内置函数一 Hive函数分类二 字符函数二 类型转换函数和数学函数三 日期函数四 集合函数五 条件函数六 聚合函数和表生成函数6.1 聚合函数6.2 表生成函数:输出可以作为表使用
一 Hive函数分类
从输入输出角度分类
标准函数:一行数据
中
的一列或多列为输入,结果为单一值
聚合函数:多行的零列到多列为输入,结果为单一值
表生成函数:零个或多个输入,结果为多列或多行
从实现方式分类
自定义函数
UDF:自定义标准函数
UDAF:自定义聚合函数
UDTF:自定义表生成函数
def
er
和async都是script标签
中
的属性,用于控制脚本的加载和执行。
def
er
属性表示延迟执行脚本,即在HTML文档解析完成后再执行脚本。
def
er
属性只对外部脚本有效,内部脚本会忽略该属性。如果有多个
def
er
脚本,它们会按照在HTML文档
中
的顺序依次执行。
async属性表示异步执行脚本,即在HTML文档解析过程
中
,脚本会被异步加载并执行,不会阻塞HTML文档的解析。如果有多个async脚本,它们会在加载完成后立即执行,执行顺序不确定。
总的来说,
def
er
适用于需要按照顺序执行的脚本,而async适用于不需要按照顺序执行的脚本。