• Android深度探索——第八章读书笔记及心得


    蜂鸣器驱动

    ——第8章读书笔记及心得

           通过本章的学习,学会了pwm的驱动实验,知道了蜂鸣器实现的原理。蜂鸣器是开发板上的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声。本实验将linux驱动区分成了多个实现文件。学会了编写Makefile文件。知道了linux驱动模块的依赖。通过实验学会了linux驱动常用的代码重用方式及强行卸载linux驱动的方法。

           在C语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中的函数,extern的作用就是告诉编译器该函数的函数名、参数个数、参数类型和返回值类型。这些信息用以将a.c编译成a.o。将a.o和b.o连接成可执行文件或程序库时,编译器再到b.o中寻找函数的具体实现。所以extern只在编译阶段起作用。

           在编译时,最关键的一步是编写Makefile文件。该文件的代码如下:

                  Obj-m := multi_file_driver.o

                  Multi_file_driver-objs :=main.o fun.o product.

           其中在multi_file_driver目录中有一个build.sh的脚本文件,用于编译和测试示例。命令为:#sh build.sh。执行成功后可以使用demesg查看命令日志信息。

           代码重用分为静态和动态两种。静态重用是代码级的重用,需要将重用的代码和使用者放在一起进行编译。最后生成可执行的文件或程序库。模块依赖(到处符号)是另一种代码共享。在linux驱动中可以实现宏导出的函数有两个为EXPORT_SYMBOL和EXPORT_SYMOL_GPL(该函数仅用于GPL协议的linux驱动模块中)。

           当linux驱动模块没有被正常引用导致的linux驱动无法正常卸载,无法使用rmmod。卸载失败可能的两种原因:1、初始化函数崩溃,2、卸载函数被阻塞。当初始化函数崩溃时,需要将linux驱动模块的引用函数清零。可利用的函数“static inline try_module_get(struct module *module)”和“extern void module_put(struct module *module)”。当卸载函数被阻塞时,需要将原来的卸载函数替换成一个空的卸载函数即可。

           蜂鸣器(脉冲宽度调制),基本原理是通过脉冲来控制蜂鸣器的打开和停止。

  • 相关阅读:
    Python 操作 MySQL 的5种方式
    ffiddler抓取手机(app)https包
    Git远程操作详解(clone、remote、fetch、pull、push)
    Mysql学生课程表SQL面试集合
    Python获取list中指定元素的索引
    python找出字典中value最大值的几种方法
    python sort、sorted高级排序技巧
    JMeter之BeanShell常用内置对象
    Docker从容器拷贝文件到宿主机或从宿主机拷贝文件到容器
    编程必备基础知识|计算机组成原理篇(10):输入输出设备
  • 原文地址:https://www.cnblogs.com/zhanghui9505/p/5639419.html
Copyright © 2020-2023  润新知