zoukankan      html  css  js  c++  java
  • android驱动开发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

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/levity/p/5653012.html
Copyright © 2011-2022 走看看