8-10总结

Android深度探索8-10章总结

    蜂鸣器是S3C6410自带的一个硬件设备。通过像寄存器写入特定的值控制蜂鸣器发出尖叫,其实现原理以及完整实现一个蜂鸣器驱动。驱动安装失败的解决方法,在本章的前言中首先提到,在遇到无法卸载Linux驱动时通过直接修改linux驱动相应的内存地址,删除Linux驱动。编译由多个文件组成的Linux驱动,在main.c文件会有两个宏(_init)(_exit,在以前程序中没有用过,用来标识Linux驱动初始化函数和驱动卸载函数,来提高运行效率。在product.c

文件中有extern关键字,其作用是告诉编译器该函数的函数名、参数个数、参数类型和返回值类型。当驱动包含多个文件时需要module-y或者module-objs来指定所有的目标文件。代码重用分为静态和动态,本节使用第二种模块依赖也称为导出符号,也就是在一个驱动模块里使用另一个驱动模块里被导出的符号。

   HAL硬件抽象层,他是属于linux内核层之上的应用层,解释了在Android中加入HAL的原因是Google为了满足不想开源的Linux驱动作者的要求,在Android层次结构中的系统运行库层增加了一个HAL,来统一硬件的调用接口,解决GPL版权问题以及一些特殊要求。接下来再以前第七章中的LED程序中加入HAL,应用程序不需要再关心Linux驱动和设备文件的交互方式,只需要像访问普通API一样可以和Linux启动进行交互。

   精简LED驱动,去掉了所有与读写寄存器规则相关的代码,只保留了创建设备文件及寄存器交互的代码,在设备文件的readwrite函数中读写指定的寄存器。在与LED交互时,只要向设备文件读取或者发送五个字节的数据就可以读写指定的寄存器。LED驱动程序的设备文件接收的不是字符串。而是字节类型的数据,需要一个单独程序像设备文件写入字节形式的数据,或者从设备文件中读取字节类型的数据。

    最后主要学习到如何利用开发板、Android模拟器以及一些函数、工具(gdb、gdbserver、以及kgdb)调试嵌入式Linux内核模块、可执行程序和共享库。

打印内核调试信息:printk,Printk 函数的用法和printf函数类似,但是printk函数运行在内核空间,而printf运行在用户空间,printk函数在printk.c文件中实现,路径为/root/lernel/linux_kernel_2.6.36/kernel/printk.c.他有自己的函数原型,其中第一个参数的值不加信息级别,默认值是KERN_WARNING。此函数既可以将日志信息写到日志文件,也可以将日志信息写到控制台。Printk文件是一个简单的有4个数字组成的文本文件,默认值如下:6 4 1 7,其中6将消息输出到控制台的级别,只有高于该级别的输出信息才会输出到控制台,4默认的信息日志级别。1控制台日志级别可被设置的最小值,即最高优先级别。7控制台日志级别的默认值。

调试技术要根据实际情况决定使用哪一种或哪几种,例如,当发现某段程序代码的bug太多或者很难通过printk函数输出信息找出,可以考虑使用kgdb用step by step的方式定位bug。虽然有很多调试技术,但是需要根据自己的经验,来好好利用这些技术。

 

http://www.cnblogs.com/xxyue/

posted on 2016-07-03 10:15  小呆呆yy  阅读(151)  评论(0编辑  收藏  举报