Android深度探索(卷1)HAL与驱动开发阅读心得8

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android深度探索(卷1)HAL与驱动开发阅读心得8相关的知识,希望对你有一定的参考价值。

PWM蜂鸣器驱动

 

C或C++语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要a.c文件中使用 extern预先定义b.c中的函数,extern的作用就是告诉编译器该函数的函数名、参数个数、参数类型和返回值类型。这些信息对于将a.c编译成a.o已经足够了,等到将a.o和 b.o 链接成可执行文件或程序库时,编译器再到b.o中寻找函数的具体实现。也就是说,extern只在编译阶段起作用。除此之外,还可以使用b.h文件定义b.c中的函数,然后在a.c包含b.h文件。对于有些C/C++编译器,可以省略extern关键字。不过为了更通用,建议还是加上 extern。

如果编写的Linux驱动程序在逻辑上是正确的,那么可以正常装载和卸载,但在某些情况下, 可能某些程序会出现异常情况。这时Linux驱动可能会无法正常卸载。

对于部分异常情况的linux驱动强行卸载:

         情况1:初始化函数崩溃

这种情况的关键是引用计数器的值和引用者不一致。实际上引用者是不存在的,因此,只需要将当前的Linux驱动模块的引用计数器清零即可。修改引用计数器可以使用下面两个函数。

         static inline int try_module_get(struct module *module)

         extern void module_put(struct module *module)

         情况2:卸载函数被阻塞

这种情况的问题根源就是卸载函数,因此,只要将原来的卸载函数替换成一个空的卸载函数即可。

不管是哪种情况,都需要解决一个不可回避的问题,就是要获取表示要卸载的Linux驱动模块module结构体指针。因为struct module表示了Linux驱动的相关信息。

cat /proc/kallsyms | grep _this_module | grep bad_driver1

蜂呜器驱动的原理:

技术分享

驱动关键代码:

技术分享

以上是关于Android深度探索(卷1)HAL与驱动开发阅读心得8的主要内容,如果未能解决你的问题,请参考以下文章

Android深度探索(卷1)HAL与驱动开发阅读心得6

Android深度探索(卷1)HAL与驱动开发阅读心得10

Android深度探索(卷1)HAL与驱动开发阅读心得5

Android深度探索(卷1)HAL与驱动开发阅读心得8

Android深度探索(卷1)HAL与驱动开发学习笔记

Android深度探索(卷1)HAL与驱动开发学习笔记