第三次月考
第八章 让开发板发出声音:蜂鸣器驱动
代码重用分为静态和动态。静态重用是使用某些功能时,include相应的头文件即可。动态重用就是一个Linux驱动可以使用另外一个Linux驱动中的资源。C或C++语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中德函数,extern的作用就是告诉编译器该函数的函数名、参数个数、参数类型和返回值类型。Extern只在编译阶段起作用。
当linux驱动异常无法正常卸载时,即无法使用rmmod命令卸载Linux驱动。有如下几种情况:1.初始化函数奔溃。2.卸载函数被阻塞。当遇到这种情况时可以重启机器解决,但是每次都重启比较麻烦,因此可以通过修改Linux驱动的相应内存地址删除Linux驱动。
一、linux代码驱动的代码重用:linux驱动的代码重用有很多的方法,比如说用c程序的方式,将要重用的代码放到其他文件中但是要在头文件中声明。还可以采用另外一种动态重用的方式就是一个linux驱动可以使用另一个驱动的内容,如函数等。编译是由多个文件组成的linux驱动,如果linux驱动复杂,就需要多个linux文件来存放不同的功能,这样有利于分类和管理。
二、强行卸载linux驱动:如果编写的linux驱动程序在逻辑上是正确的,那么是可以正常装载和卸载的,在有些情况下就不能正常装载和卸载,Linux驱动无法卸载的情况:
情况一:初始化函数崩溃p
情况二:卸载函数被阻塞
三、蜂鸣器(pwm)驱动:蜂鸣器与LED一样也是开发板自带的简单的硬件,若打开蜂鸣器开发板会发出想蜂鸣一样的叫声,关闭就会停止尖叫。蜂鸣器驱动的原理:pwm基本原理通过脉冲来控制蜂鸣器的打开和关闭。
第九章 硬件抽象层:HAL
HAL(硬件抽象层)是建立在Linux驱动之上的一套程序库。是属于Linux内核之上的应用层。传统的Linux系统中Linux驱动一般有两种:访问硬件寄存器的代码和业务逻辑代码。而HAL是位于Android的系统运行库层,采用Android licence2.0协议,就不必开源了。加入Hal的目的:(1)同意硬件的调用接口。(2)解决了GPL版权问题。(3)针对一些特殊的要求。HAL架构Android SDK和应用程序(APK)、NDK部分、Service程序库(.so)、HAL程序库(.so)(将.so文件隐藏起来)、Linux驱动程序。
编写支持HAL的Linux驱动程序的步骤:(1)编写Linux驱动。(2)编写HAL library(即普通的Linux library(*.so)文件)。(3)编写service library。编译和安装Led驱动sh build.sh。rwdev:命令行程序。<r|w>:读或写命令。〈dev_file〉:设备文件名。〈byte_count〉:写入或读取的字节数。<byte1>:写入的字节。HAL输入Android的一部分,在编译HAL模块之前需要Android源代码。Leds_hal.h头文件用于定义结果体、宏和引用一些系统的头文件。
在Android系统中使用Linux驱动的两种方式:1.直接与Linux驱动交互。2.通过HAL模块。HAL模块本质上就是通过Linux共享库(.so)与Linux驱动交互,然后应用程序在访问Linux共享库。
一、为什么要在Android中加入HAL:在linux驱动中一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑代码。对于访问硬件寄存器的代码而言,并没有秘密,这都是调用linux内核的标准函数进行的标准操作。Google为android加入HAL其主要目的在于:
统一硬件的调用接口;
解决了GPL版权问题;‘
针对一些特殊要求;
二、andriod HAL架构
在Andriod系统中使用程序库,条用位于内核空间的Linux驱动,然后Andriod应用程序。架构图如下:
HAL的基本原理是在android系统中使用程序库调用内核空间的linux驱动。
第十章 嵌入式linux的调试技术
对于复杂的linux驱动及HAL等程序库,需要使用各种方法对其进行调试
Prink打印内核调试信息。Prink函数运行在内核空间,printf函数运行在用户空。Prink函数在prink.c文件中实现。Prink函数的原型:asmlinkge int prink(const char *fmt,…。Prink文件是一个简单的由4个数字组成的文本文件,6:将消息输出到控制台的级别。4:默认的消息日志级别。1:控制台日志级别可被设置的最小值。7:控制台日志级别的默认值。Linux驱动只在开发阶段使用Prink函数输出信息,在正式发布Linux驱动是将可能影响性能的prink函数去掉。可变参数的宏:与固定参数宏的不同之处就是可变参数宏需要通过_VA_ARGS_宏来获取可变参数宏的可变参数。Do{…}while(0):将多条语句作为一个整体处理。通过虚拟文件系统(/proc)进行数据交互。/proc是虚拟文件系统,即内存映射,并且读写/proc文件系统的速度要远比读写/dev文件系统的速度快。
一、打印内核调试信息:printK:printK函数与printf函数类似,只不过printK函数运行在内核空间,printf函数运行在用户空间。也就是说像linux驱动这样的linux内核程序只能使用printK函数输出调试信息。
二、防止printK函数降低linux驱动性能:虽然printK函数可以很方便的将消息写入日志文件或控制台,大那是大量使用printK函数操控日志文件或控制台设备文件会严重影响linux的驱动性能。只要只在开发阶段使用printK函数,在正式发布linux驱动时把有可能影响性能的printK函数去掉。
三、通过虚拟文件系统(/proc)进行数据交互:在linux文件系统中,/proc经常用来被作为用户空间和内核空间进行数据交互的工具。/proc文件系统的行为方式和设备系统(/dev)的类似。
四、调试工具:gdb,gdbservice,和kgdb。