(1)代码重用
代码重用分为静态和动态两种。静态方式为编译由多个文件组成的 Linux 驱动,这种方式是代码级的重用,也就是将需要重用的代码和使用这些代码的使用者放在一起进行编译,最终生成一个可执行文件或程序 库 (.ko、 .so 等)。另外一种代码共享的方式:模块依赖,也称为导出符号。如果只能用一句话解释 如何利用导出符号实现代码共享,这句话就是“在一个驱动模块里使用另一个驱动模块里的被导出 的符号(常章、变量、函数等〉”,在 Linux 驱动中可以使用如下两个宏导出函数:
EXPORT SYMBOL(符号名)
EXPORT SYMBOL GPL(符号名)
其中EXPORT SYMBOL GPL 仅用于采用GPL协议的Linux驱动模块中。
(2)强行卸载Linux驱动
情况1:由于 Linux 驱动模块的初始化函数(通常module_init宏指定的函数)进行了某些操作而崩溃,从而导致初始化函数无法正常返回,这种情况的表现是当前 Linux 驱动模块没用被任何其他的Linux 驱动模块使用,但却显示已经被引用了一次。
这种情况的关键是引用计数器的值和引用者不一致。实际上引用者是不存在的,因此,只需要将当前的 Linux 驱动模块的引用计数器清零即可。修改引用计数器可以使用下面两个函数。
static inline int try_module_get(struct module *module) //使module指向的linux模块驱动的引用计数器加1
extern void module_put(struct module *module) //使module指向的Linux驱动模块的引用计数减1
情况 2: 卸载函数被阻塞在使用 rmmod命令卸载 Linux 驱动时,系统会调用卸载函数(module_exit宏指定的函数),只有卸载函数成功返回,Linux 驱动才会被卸载。如果卸载函数被阻塞(可能是死循环、并发等 情况引起的阻塞),rmmod 命令也会被阻塞,也就是说永远不会执行到卸载 Linux 驱动模块的代码。这种情况的表现是一执行 rmmod 命令就会停在那不动了,永远也不会返回到系统的操作提示符。
(3)蜂鸣器驱动
蜂呜器驱动的原理:蜂鸣器也称为PWM(脉冲宽度调制),基本原理是通过脉冲来控制蜂鸣器的打开和停止。
实现蜂鸣器驱动