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)”。当卸载函数被阻塞时,需要将原来的卸载函数替换成一个空的卸载函数即可。

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

时间: 2024-12-14 05:09:05

Android深度探索——第八章读书笔记及心得的相关文章

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

HAL模块 ——第9章读书笔记及心得 通过本章学习学会了Android中特有的与linux驱动交互的方法,即通过HAL模块.HAL模块本质上就是通过linux共享库(.so)与linux交互驱动,然后利用应用程序再访问linux共享库.每一个HAL共享库指定一个ID,在利用这个ID配合一定的规则找到linux共享库.知道了HAL对于Android的意义.知道了Android HAL的架构. HAL是建立在linux驱动之上的一套不属于linux内核的程序库.它属于linux内核层之上的应用层.H

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

Android开发环境搭建 ——第二章读书笔记及心得 通过本章的学习了解了如何对Ubuntu Linux下的Android进行搭建,包括搭建Android应用程序开发环境.Android NDK开发环境和交叉编译环境的搭建.了解了搭建Android环境所需要的各种东西,了解了配置ADT的必要性—以便ADT能够找到Android SDK.知道了底层开发所需要的各种工具.学会了如何在Ubuntu下安装JDK.以及编译交叉编译环境,当初在学习Linux交叉环境编译的时候就不是特别成功,中间出了很多的错

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

嵌入式linux的调用技术 ——第10章读书笔记及心得 通过本章的学习了解了printk函数.该函数与printf函数类似,用于打印内核调试信息.只是前者运行在内核空间,后者运行在用户空间.即linux驱动这样的linux内核程序只能使用printk函数输出调试信息.Printk函数的原型:asmLinkKage int printk(const char *fmt,…).Printk文件是一个简单的有4个数字组成的文本文件,该文件的默认值问6 4 1 7.6代表将消息输出到控制台的级别,只有高

《Android深度探索卷一》读书笔记一

一.Android系统架构 Android系统架构分为4层: 第一层:Linux内核 Android是基于Linux内核的,因此,Android内核和标准Linux2.6的内核结构基本相同,细微差异在Android在Linux内核中增加的主要是一些Android专用驱动和Android使用的设备驱动,这些驱动程序在Android不同版本中可能并不通用. 第二层:C/C++代码库 是使用C/C++编写的代码库也就是Linux下的.so文件,还有Android运行时环境(AndroidRuntime

《Android深度探索卷一》读书笔记二

开发,测试和调用Linux驱动,HAL程序库需要的工具: JDK6或以上版本: Eclipse3.4或以上版本: ADT(用于开发Android应用程序): CDT(用于开发AndroidNDK程序): Android SDK: Android NDK: 交叉编译环境: Linux内核源代码: Android源代码: 用于调试开发板的串口工具:minicom; 一.安装JDK 下载JDK压缩包并解压到任意目录,在Linux终端输入“getdit /etc/profile”打开profile文件,

《Android深度探索卷一》读书笔记四

下载,编译和测试Android源代码 1.配置Android源代码下载环境 下载之前必须先在Linux终端执行一些命令配置环境. 创建存放脚本文件的目录“mkdir ~/bin””PATH=~/bin:$PATH”:下载repo脚本文件“curl 地址 > ~/bin/repo””chmod a+x ~/bin/repo”;创建存放Android源代码的目录“mkdir android_source”“cd android_source”;初始化“repo init -u 地址”: 2.开始下载

《Android深度探索卷一》读书笔记五

下载和编译Linux内核源代码 Android源代码不包含Linux源代码,必须单独下载.不能直接在www.kernel.org下载Linux内核,应在Google提供的网站下载Android中使用的Linux内核. 1.下载“git clone https://android.googlesource.com/kernel/common.git”,进入common目录,“git branch -a”查看当前有的远程版本,之后导出 到导出所需版本“git checkout -b android-

Android深度探索--第八章读后感

在这一章中,我们得知了Linux内核提供了多个与I/O内存交互的函数,比如ioread16.ioread32.iowrite16.iowrite32等,Linux内核的内存管理模块负责同步I/O内存与硬件中的数据. 每一个连接Linux的硬件在I/O内存中都会有映射地址.由于LED驱动只能在S3C开发板上安装,因此build,sh 脚本直接执行了build_s3c6410.sh脚本文件进行编译和安装,并不会出现像第六章那样的要求用户选择在Ubuntu Linux .Android 模拟器还是S3

Android深度探索第八章总结

学习第八章,也就是蜂鸣器驱动的知识是为了掌握Linux驱动常用的代码重用方式.Linux的代码重用.强行卸载Linux驱动.蜂鸣器(PWM)驱动.编译是由多个文件组成的Linux驱动,代码重用分为静态和动态两种,静态重用方式是代码级的重用,也就是将需要重用的代码和使用这些代码的使用者放在一起进行编译,最终生成一个可执行文件或程序库..Linux驱动模块的依赖(导出符号),另外一种代码共享的方式:模块依赖,也称为导出符号.在一个驱动模块里使用另一个驱动模块里被导出的符号(常量.变量.函数等).强行