10嵌入式操作系统驱动程序编写基础.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式操作系统 -驱动程序编写基础 李春杰 主要内容 设备驱动硬件基础 内核模块 中断服务例程 驱动程序组成 设备驱动的作用 驱动是应用软件和硬件的桥梁 它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。 驱动程序沟通着硬件和应用软件,而驱动工程师沟通着硬件工程师和软件工程师。 无操作系统的程序架构 在这样的系统中,虽然不存在操作系统,但设备驱动程序一般存在。一般情况下,驱动程序都会定义为一个软件模块,包含.h文件和.C文件,前者定义该设备驱动程序的数据结构并声明外部函数,后者进行驱动的具体实现。 无操作系统时驱动和应用程序的关系 在没有操作系统时,设备的接口被直接提交给用用软件。 应用软件直接调用、访问设备驱动的接口 设备驱动的接口函数与硬件的功能直接吻合,没有任何附加功能。 两种不合理设计 驱动中存在部分应用,或应用中包含驱动都会导致程序移植性和复用性变差 有操作系统的设备驱动 有操作系统的设备驱动的变化 无操作系统时设备驱动的硬件工作仍然必不可少,没有它们驱动不可能与硬件打交道 需要把驱动融入内核。为了实现这种融合,需要在驱动程序中设计面向系统内核的接口。 这样的接口有操作系统规定,对一类设备而言结构一致,独立于具体的设备。 设备驱动程序成为硬件和内核的桥梁---要写一部分内核接口,多出来两层结构,有利有弊,屏蔽了底层的差异 Linux的设备驱动 Linux设备 字符设备 块设备 网络设备 无操作系统的LED驱动 Linux的led驱动 Linux设备驱动的重点、难点 Linux设备驱动设计的硬件基础 计算机系统的硬件主要由CPU、存储器和外设组成。驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设)。 注意不是针对CPU核 Linux设备驱动设计的硬件基础 1、处理器 Linux设备驱动设计的硬件基础 2、存储器 Linux设备驱动设计的硬件基础 3、总线与接口 串口 电器特性、时序特性(掌握)、信号分类 I2C—有时序,无协议 SPI CAN—有协议,有时序 USB PCI 网口 Linux设备驱动设计的硬件基础 Linux设备驱动设计的硬件基础 原理图分析:确定设备使用的相关资源 时序分析: 芯片手册 芯片结构、整体性能、管件个数、电气性能 寄存器编程 外设控制器的编程流程 Linux设备驱动设计的硬件基础 仪器仪表使用 万用表 示波器 等等 内核模块概述 Linux的内核模块机制给内核提供了很强的灵活性,用户通过加载内核模块可以方便的给内核添加功能;同样用户也可以将内核不需要用的功能卸载。 驱动程序可以静态编译进内核,但由于外设众多,内核不可能包含所有设备的驱动。 用户通过内核模块机制可以把需要用到的驱动程序动态地加入内核。 内核模块的概述 内核模块在内核空间运行,内核模块编程是在内核空间编程。 内核模块可以引用内核空间导出的全局符号,因此内核模块编程与内核的版本密切相关。 内核模块只能调用和使用内核提供的函数,不能使用相关的应用程序库函数。 模块编程举例-一个简单的hello 模块 为何不用printf函数语句??? 上面例子是一个完整的内核模块,该模块被载入内核时会向系统的日志中写入Hello,world;当模块被卸载时,该模块会向系统日志写入一条Goodbye,cruel world的信息。 内核模块的基本结构1 一个典型的内核模块包含以下几部分: 头文件声明:头文件module.h和init.h是必须的。 module.h包含了加载模块需要的函数和符号的定义; init.h包含了模块初始化和清理函数的定义;如果模块在加载时允许用户传递参数,模块还应该包含moduleparam.h头文件。 内核模块的基本结构2 模块许可声明:MODULE_LICENSE宏声明此模块的许可证,否则在模块被加载时,内核会显示警告。 初始化、清理函数声明:在2.6内核模块必须调用宏module_init和module_exit去注册初始化与清理函数,需要注意的是初始化清理函数必须在宏module_init和module_exit使用前定义 满足以上基本结构,模块就可以正常工作了,在驱动程序中除包含模块的三个基本部分以外,还会包含文件操作及其它内容。 可以在模块中包含的其他描述性定义有 MODULE_AUTHOR ( 声明谁编写了模块 ), MODULE_DESCRIPION( 一个人可读的关于模块做什么的声明 ), 等其它MODULE_宏;各种 MODULE_ 声明可以出现在你的源码文件的任何函数之外的地方.

文档评论(0)

638922bb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档