8-10章笔记

第八章:

1、通过蜂鸣器实现一个完整的蜂呜器驱动,可以打开和关闭蜂鸣器.。

2、PWM驱动的实现方式不同于LED驱动, PWM 驱动将由多个文件组成。

3、Linux 驱动的代码重用的方法:

1)采用标准 C程序的方式。将要重用的代码放在其他 的文件 (在头文件中声明〉中。 如果要使用某些功能, include 相应的头文件即可〈这种方式称为 静态重用〉。

2)使用另外一种动态重用的方式,也就是一个 Linux 驱动可以使用另外←个 Linux 驱动中的资源(函数、变量、宏等)。

4、强行卸载Linux驱动(只能卸载自于异常情况而导致的 Linux 驱动模块无法卸载的情况)

1)白 初始化函数崩溃

2) 卸载函数被阻塞

5、蜂鸣器驱动蜂鸣器驱动的原理蜂鸣器也称为 PWM (脉冲宽度调制〉,基本原理是通过脉冲来控制蜂鸣器的打开和停止。实现蜂鸣器驱动测试蜂鸣器驱动

6、PWM 驱动与LED驱动的原理相似

7、通过有I/O命令可以打开和停止PWM,PWM 驱动由3 个文件组成: pwm.c, pwm_fun.h 、pwm_fun.c(pwm.c 是驱动主程序;pwm_fun.h 引用了相应的头文件,以及定义了一些宏;pwm_fun.c 文件则包含了打开和停止PWM的两个函数( pwm_start 和pwm_stop ))

8、运行之后从Makefile 文件的内容可以看出,

1)首先将pwm.c 和pwm_fun.c 文件编译成pwm.o和pwm_fun.o,

2)然后再将这两个*.o文件链接成pwm_driver.o,

3)最后生成pwm_driver.ko 。

9、测试蜂鸣器驱动

1)进入/root/drivers/ioctl 目录, 执行build础脚本文件编译和上传ioctl 文件〈如果启动多个Android 设备,要选择上传到S3C6410 开发板。

2)在测试PWM 驱动之前,先要按照上一节的方法编译和安装PWM 驱动,然后进入开发板终端的Idata/local 目录, 输入打开和关闭PWM的明令 。

3)由于ioctl 命令必须要求输入I/O命令的参数,但PWM 驱动未使用I/O 命令参数。所以ioctl 最后一个命令行参数可以任意输入。执行上面的命令后,如果输出(# . / ioctl /dev/pwm_dev 1 0)的信息,并且PWM. 可以正常发出尖叫声,说明PWM 驱动测试成功。

10、Linux代码的重用:

1)在头文件中加载即可使用到原来所有的功能,还有动态方式就是一个驱动使用另一个驱动的资源。

2)对于像蜂鸣器这样的实验,它的内部文件有很多,所有要有很多的源代码以用于妥善管理。

3)有多个文件的话,module-y指定所有的文件,然后将会生成一个build.sh脚本,使用sh执行,使用dmesg查看日志信息。

4)代码重用分为静态和动态的。静态重用是生成.ko内核,动态重用是模块依赖,一个驱动使用另一个驱动模块里导出的符号。

5)重启开发板或者模拟器.ko文件就会自动消失。使用异常情况卸载(1.初始化函数卸载。2.卸载函数被阻塞)

6)卸载一个驱动,需要输入一堆命令查询module结构体的首地址,安装和下载force_kill_driver驱动。

7)蜂鸣器的驱动实现原理与LED基本相同,但是实现方式不同,因为PWM是由多个文件组成的。

8)静态函数结构体,PWM设备文件open函数,使用信号量控制在同一时刻 只能打开PWM设备文件,然后close函数释放信号量,ioctl()函数处理I/O命令,设置文件设备file_operation设备,最后在最开始初始化信号量,移除信号量。在pwm.h文件PWM_IOTCL_START打开,PWM_IOTCL_STOP停止,生成.ko文件,编译成功。

第九章

1、硬件抽象层:HAL,它是建立在Linux驱动之上的一套程序库。

2、在Android中加入HAL的目的:

1)统一硬件的调用接口

2)解决了GPL版权问题

3)针对一些特殊的要求。

3、可以利用位于用户空间的HAL代码来辅助Linux驱动完成一些工作。

4、Android HAL架构。

5、led驱动增加HAL,主要是将所有的业务逻辑从LED驱动移到HAL模块,而LED驱动只保留读写寄存器的功能。

6、HAL步骤:

1)编写Linux驱动

2)编写HAL Library

3)编写Service Library 精简LED驱动

7、编写HAL模块的步骤和原理:

1)定义结构体和宏 编写HAL模块需要使用到3个非常重要的结构体,在第一步需要定义两个新的结构体。

2)编写HAL模块的open函数 open函数是HAL模块的入口点。本例中使用的是led_device_open函数。该函数主要做如下三个工作。初始化hw_device_t的子结构体。 打开设备文件。 初始化寄存器。

3)定义hw_module_methhods_t 结构体变量

4)定义HAL_MODULE_INFO_SYM函数

5)编写HAL模块的close 函数 当HAL模块被卸载后会调用close函数

6)编写控制LED的函数

第十章

嵌入式Linux的调试技术

1、 在Linux文件系统中,/proc经常被用来作为内核空间与用户空间进行数据交换的工

2、 /proc 文件系统的行为方式与设备文件系统(/dev)类似。

3、 /proc是虚拟文件系统,也就是说,/proc并不是真正的文件系统,而是内存映射。

4、 所有读写/proc的操作都是对内存的读写。

5、 所有读写/proc文件系统的速度要远比读写/dev文件系统的速度快。

6、 /proc文件系统也可作为Linux驱动与用户空间程序交互的工具。

7、 在Linux系统中提供了一类工具。通过这些工具可以逐行跟踪程序的代码,就好像可视化开发工具的step into和step over一样。这些工具包含用于调试用户空间程序的gdb、gdbserver和调试内核空间的kgdb。

8、 对于任何一位内核代码的编写者来说,最急迫的问题之一就是如何完成调试。由于内核是一个不与特定进程相关的功能集合,所以内核代码无法轻易地放在调试器中执行,而且也很难跟踪。同样,要想复现内核代码中的错误也是相当困难的,因为这种错误可能导致整个系统崩溃,这样也就破坏了可以用来跟踪它们的现场。

9、 通过打印调试最普通的调试技术就是监视,即在应用程序编程中,在一些适当的地点调用printf显示监视信息。调试内核代码的时候,则可以用 printk 来完成相同的工作。

10、             调试内核的方法(使用调试器来一步步地跟踪代码,查看变量和计算机寄存器的值):

1) 使用gdb,gdb在探究系统内部行为时非常有用。在我们这个层次上,熟练使用调试器,需要掌握 gdb 命令、了解目标平台的汇编代码,还要具备对源代码和优化后的汇编码进行匹配的能力。

2) 使用Kgdb,kgdb 程序(使用 gdb 的远程主机 Linux 内核调试器)提供了一种使用 gdb 调试 Linux 内核的机制。kgdb 程序是内核的扩展,它让您能够在远程主机上运行gdb时连接到运行用kgdb扩展的内核机器。可以接着深入到内核中、设置断点、检查数据并进行其它操作(类似于您在应用程序上使用 gdb 的方式)。这个补丁的主要特点之一就是运行gdb的主机在引导过程中连接到目标机器(运行要被调试的内核)。这让您能够尽早开始调试。请注意,补丁为Linux内核添加了功能,所以gdb可以用来调试Linux内核。(使用kgdb需要两台机器:一台是开发机器,另一台是测试机器,一条串行线(空调制解调器电缆)将通过机器的串口连接它们)

时间: 2024-11-08 07:37:39

8-10章笔记的相关文章

《Python编程:从入门到实践》第10章 笔记

备注:以下按照Python 2的规则编写代码. 在jupyter notebook中运行直接显示结果. 10 文件和异常 10.1 文件中读取数据 10.1.1 读取整个文件 """file_reader.py""" with open('chapter_10/pi_digits.txt') as file_object: # 关键字with在不再需要访问文件后将其关闭 contents = file_object.read() print(co

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1.2 INSERT SELECT 语句 8.1.3 INSERT EXEC 语句 8.1.4 SELECT INTO 语句 8.1.5 BULK INSERT 语句 8.1.6 标识列属性和序列对象 8.1.6.1 标识列属性 8.1.6.2 序列对象 8.2 删除数据 8.2.1 DELETE 语

MySQL cookbook第10章读书笔记

1,使用load data和mysqlimport导入数据 1个ok,2个warning!!! 为什么会有warning,而且数据也没有load进去 2,指定数据文件位置 了解MySQL查找文件位置的规则. 如果load data语句没有local选项,MySQL读取数据文件将按下述规则在服务器所在机器上定位文件的位置: 文件的绝对全路径名(从文件系统的根开始),MySQL直接读取该文件. 给定的是文件的相对路径名,按照路径名的两种不同形式来解释和处理. 3,指定数据文件的结构 有一个数据文件但

《浪潮之巅》读书笔记——第10章 惠普

第10章 惠普  公司发展    硅谷最早的公司    1939 Hewlett和Packard创办    进驻斯坦福工业园    90年代前发现一帆风顺    衰落      领导者的错误        产品线太长.内部混乱        将仪器部门剥离上市(安捷伦)        与亏损的康柏合并        卡莉.菲奥莉娜          1999 最差CEO?          主持朗讯与飞利浦的合并          2002 与康柏合并      日本.中国制造冲击      从

I/O重定向和管道——《Unix/Linux编程实践教程》读书笔记(第10章)

1.I/O重定向的概念与原因 及 标准输入.输出的标准错误的定义 所以的Unix I/O重定向都基于标准数据流的原理.三个数据了分别如下: 1)标准输入--需要处理的数据流 2)标准输出--结果数据流 3)标准错误输出--错误消息流 概念:所以的Unix工具都使用文件描述符0.1和2.标准输入文件的描述符是0,标准输出的文件描述符是1,而标准错误输出的文件描述符则是2.Unix假设文件描述符0.1.2已经被打开,可以分别进行读写操作. 通常通过shell命令行运行Unix系统工具时,stdin.

第10章,程序包管理学习笔记

更多内容请点击: Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~) http://blog.51cto.com/13683480/2095439 笔记整理开始时间:2018年4月20日14:07:22 第10章  程序包管理 本章内容 软件运行环境 软件包基础 rpm包管理 yum管理 定制yum仓库 编译安装 软件运行和编译: ABI: Application Binary  Interface 应用程序的二进制接口 window:       PE,Por

<<Python基础教程>>学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

《白帽子讲WEB安全》学习笔记之第10章 访问控制

第10章 访问控制 10.1 what can i do? 权限控制是值某个主体(身份)对某一个客体需要实施某种操作,而系统对这种操作的限制就是权限控制. 在一个安全系统中,确定主题的身份是"认证"解决的问题:而客体是胭脂红资源,是主题发起的请求对象.在主体对客体进行操作的过程,系统控制主体不能"无限制"地对客体进行操作,这过程就是"访问控制". 在WEB应用中,根据访问楷体的不同,常见的访问控制可以分为"基于URL的访问控制"

JavaScript高级程序设计(第三版)学习笔记8、9、10章

第8章,BOM BOM的核心对象是window,具有双重角色,既是js访问浏览器的一个接口,又是ECMAScript规定的Global对象.因此,在全局作用域中声明的函数.变量都会变成window对象的属性和方法. 例: var age = 20; function sayAge(){ alert(this.age); } alert(window.age); //20 window.sayAge(); //20 定义全局变量与在window对象上直接定义属性区别:全局变量不能通过delete操

Javascript高级程序设计读书笔记(第10章 DOM)

第10章 DOM 10.1  节点层次 每个节点都有一个nodeType属性,用于表明节点的类型.任何节点类型必是下面中的一个: Node.Element_NODE(1); NODE.ATTRIBUTE_NODE(2); Node.TEXT_NODE(3); Node.CDATA_SECTION_NODE(4); Node.ENTITY_REFERENCE_NODE(5); Node.ENTITY_NODE(6); Node.PROCESSING_INSTRUCTION_NODE(7); Nod