加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Linux设备驱动开发详解_宋宝华

Linux设备驱动开发详解_宋宝华.pdf

Linux设备驱动开发详解_宋宝华

lishaobao0
2011-09-04 0人阅读 举报 0 0 暂无简介

简介:本文档为《Linux设备驱动开发详解_宋宝华pdf》,可适用于IT/计算机领域

嵌入式学院华清远见旗下品牌:wwwembeduorg嵌入式学院华清远见旗下品牌:wwwembeduorg《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg第章设备驱动概述本章将带您走进Linux设备驱动的精彩世界。节讲解了设备驱动的概念和作用。节和节分别讲述无操作系统和有操作系统情况下设备驱动的设计方法通过分析讲解设备驱动与硬件和操作系统的关系。节对Linux操作系统的设备驱动进行了概要性的介绍讲解设备驱动与系统软硬件的关系分析了Linux设备驱动的重点难点和学习方法。本章的最后给出了一个设备驱动的“HelloWorld”实例即最简单的LED驱动在无操作系统情况下和Linux操作系统下的实现。《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg设备驱动的作用任何一个计算机系统的运行都是系统中软硬件协作的结果没有硬件的软件是空中楼阁而没有软件的硬件则只是一堆废铁。硬件是底层基础是所有软件得以运行的平台代码最终会落实为硬件上的组合逻辑与时序逻辑软件则实现了具体应用它按照各种不同的业务需求而设计满足了用户的需求。硬件较固定软件则很灵活可以适应各种复杂多变的应用。可以说计算机系统的软硬件互相成就了对方。但是软硬件之间同样存在着悖论那就是软件和硬件不应该互相渗透到对方的领地。为了尽可能快速地完成设计应用软件工程师不想也不必关心硬件而硬件工程师也难有足够的闲暇和能力来顾及软件。例如应用软件工程师在调用套接字发送和接收数据包的时候他不必关心网卡上的中断、寄存器、存储空间、IO端口、片选以及其他任何硬件词汇在使用printf()函数输出信息的时候他不用知道底层究竟是怎样把相应的信息输出到屏幕或串口。也就是说应用软件工程师需要看到一个没有硬件的纯粹的软件世界硬件必须被透明地呈现给他们。谁来实现硬件对应用软件工程师的隐形?这个艰巨的任务就落在了驱动工程师的头上。对设备驱动最通俗的解释就是“驱使硬件设备行动”。设备驱动与底层硬件直接打交道按照硬件设备的具体工作方式读写设备寄存器完成设备的轮询、中断处理、DMA通信进行物理内存向虚拟内存的映射最终使通信设备能够收发数据使显示设备能够显示文字和画面使存储设备能够记录文件和数据。由此可见设备驱动充当了硬件和应用软件之间的纽带它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。在系统中没有操作系统的情况下工程师可以根据硬件设备的特点自行定义接口如对串口定义SerialSend()、SerialRecv()对LED定义LightOn()、LightOff()以及对Flash定义FlashWrite()、FlashRead()等。而在有操作系统的情况下设备驱动的架构则由相应的操作系统定义驱动工程师必须按照相应的架构设计设备驱动这样设备驱动才能良好地整合到操作系统的内核中。驱动程序沟通着硬件和应用软件而驱动工程师则沟通着硬件工程师和应用软件工程师。随着通信、电子行业的迅速发展全世界每天都会有大量的新芯片被生产大量的新电路板被设计因此也会有大量设备驱动需要开发。这些设备驱动或运行在简单的单任务环境中或运行在VxWorks、Linux、Windows等多任务操作系统环境中发挥着不可替代的作用。无操作系统时的设备驱动《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg并不是任何一个计算机系统都一定要运行操作系统在许多情况下操作系统是不必要的。对于功能比较单一、控制并不复杂的系统如公交车刷卡机、电冰箱、微波炉、简单的手机和小灵通等并不需要多任务调度、文件系统、内存管理等复杂功能用单任务架构完全可以很好地支持它们的工作。一个无限循环中夹杂对设备中断的检测或者对设备的轮询是这种系统中软件的典型架构如代码清单所示。代码清单单任务软件典型架构intmain(intargc,char*argv){while(){if(serialInt==)*有串口中断*{ProcessSerialInt()*处理串口中断*serialInt=*中断标志变量清零*}if(keyInt==)*有按键中断*{ProcessKeyInt()*处理按键中断*keyInt=*中断标志变量清零*}status=CheckXXX()switch(status){}}}在这样的系统中虽然不存在操作系统但是设备驱动是必须存在的。一般情况下对每一种设备驱动都会定义为一个软件模块包含h文件和c文件前者定义该设备驱动的数据结构并声明外部函数后者进行设备驱动的具体实现。代码清单定义了一个串口的驱动。代码清单无操作系统情况下串口的驱动***********************serialh文件**********************externvoidSerialInit(void)externvoidSerialSend(constcharbuf*,intcount)《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorgexternvoidSerialRecv(charbuf*,intcount)***********************serialc文件***********************初始化串口*voidSerialInit(void){}*串口发送*voidSerialSend(constcharbuf*,intcount){}*串口接收*voidSerialRecv(charbuf*,intcount){}*串口中断处理函数*voidSerialIsr(void){serialInt=}其他模块需要使用这个设备的时候只需要包含设备驱动的头文件serialh然后调用其中的外部接口函数即可。如我们要从串口上发送字符串“HelloWorld”使用函数SerialSend("HelloWorld",)即可。由此可见在没有操作系统的情况下设备驱动的接口被直接提交给了应用软件工程师应用软件没有跨越任何层次就直接访问了设备驱动的接口。设备驱动包含的接口函数也与硬件的功能直接吻合没有任何附加功能。图所示为无操作系统情况下硬件、设备驱动与应用软件的关系。有的工程师把单任务系统设计成了如图所示的结构即设备驱动和具体的应用软件模块处于同一层次这显然是不合理的不符合软件设计中高内聚低耦合的要求。另一种不合理的设计是直接在应用中操作硬件的寄存器而不单独设计驱动模块如图所示。这种设计意味着系统中不存在或未能充分利用可被重用的驱动代码。图无操作系统时硬件、设备驱动和应用软件的关系《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg图设备驱动与应用高耦合的不合理设计图应用直接访问硬件的不合理设计有操作系统时的设备驱动节中的设备驱动直接运行在硬件之上不与任何操作系统关联。当系统中包含操作系统后设备驱动会变得怎样?首先无操作系统时设备驱动的硬件操作工作仍然是必不可少的没有这一部分设备驱动不可能与硬件打交道。其次我们还需要将设备驱动融入内核。为了实现这种融合必须在所有的设备驱动中设计面向操作系统内核的接口这样的接口由操作系统规定对一类设备而言结构一致独立于具体的设备。由此可见当系统中存在操作系统的时候设备驱动变成了连接硬件和内核的桥梁。如图所示操作系统的存在势必要求设备驱动附加更多的代码和功能把单一的“驱使硬件设备行动”变成了操作系统内与硬件交互的模块它对外呈现为操作系统的API不再给应用软件工程师直接提供接口。有了操作系统之后设备驱动反而变得复杂那要操作系统干什么?首先一个复杂的软件系统需要处理多个并发的任务没有操作系统想完成多任务并发是很困难的。其次操作系统给我们提供内存管理机制。一个典型的例子是对于多数含MMU的处理器而言Windows、Linux等操作系统可以让每个进程都独立地访问GB的内存空间。上述优点似乎并没有体现在设备驱动身上操作系统的存在给设备驱动究竟带来了什么好处呢?图硬件、设备驱动、操作系统和应用程序的关系《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg简而言之操作系统通过给设备驱动制造麻烦来达到给上层应用提供便利的目的。如果设备驱动都按照操作系统给出的独立于设备的接口而设计应用程序将可使用统一的系统调用接口来访问各种设备。对于类UNIX的VxWorks、Linux等操作系统而言应用程序通过write()、read()等函数读写文件就可以访问各种字符设备和块设备而不用管设备的具体类型和工作方式是非常方便的。Linux设备驱动设备的分类及特点计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制造工艺的发展目前芯片的集成度越来越高往往在CPU内部就集成了存储器和外设适配器。ARM、PowerPC、MIPS等处理器都集成了UART、IC控制器、USB控制器、SDRAM控制器等有的处理器还集成了片内RAM和Flash。驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设)而不是针对CPU核。Linux将存储器和外设分为个基础大类:l字符设备l块设备l网络设备。字符设备指那些必须以串行顺序依次进行访问的设备如触摸屏、磁带驱动器、鼠标等。块设备可以用任意顺序进行访问以块为单位进行操作如硬盘、软驱等。字符设备不经过系统的快速缓冲而块设备经过系统的快速缓冲。但是字符设备和块设备并没有明显的界限如Flash设备符合块设备的特点但是我们仍然可以把它作为一个字符设备来访问。字符设备和块设备的驱动设计呈现出很大的差异但是对于用户而言他们都使用文件系统的操作接口open()、close()、read()、write()等函数进行访问。在Linux系统中网络设备面向数据包的接收和发送而设计它并不对应于文件系统的节点。内核与网络设备的通信和内核与字符设备、块设备的通信方式完全不同。另外TTY驱动、IC驱动、USB驱动、PCI驱动、LCD驱动等本身大体可归纳入个基础大类但是对于这些复杂的设备Linux系统还定义了独特的驱动体系结构。Linux设备驱动与整个软硬件系统的关系如图所示除网络设备外字符设备与块设备都被映射到Linux文件系统的文件和目录通过文件系统的系统调用接口open()、write()、read()、close()等函数即可访问字符设备和块设备。所有的字符设备和块设备都被统一地呈现给用户。块设备比字符设备复杂在它上面会首先建立一个磁盘Flash文件系统如FAT、Ext、YAFFS、JFFS等。FAT、Ext、YAFFS、JFFS规范了文件和目录在存储介质上的组织。《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg应用程序可以使用Linux的系统调用接口编程也可以使用C库函数出于代码可移植性的考虑后者更值得推荐。C库函数本身也通过系统调用接口而实现如C库函数中的fopen()、fwrite()、fread()、fclose()分别会调用操作系统API的open()、write()、read()、close()函数。图Linux设备驱动与整个软硬件系统的关系编写Linux设备驱动的技术基础Linux设备驱动的学习是一项浩大的工程读者需要首先掌握以下基础。l编写Linux设备驱动要求工程师具有良好的硬件基础懂得SRAM、Flash、SDRAM、磁盘的读写方式UART、IC、USB等设备的接口轮询、中断、DMA的原理PCI总线的工作方式以及CPU的内存管理单元(MMU)等。l编写Linux设备驱动要求工程师具有良好的C语言基础能灵活地运用C语言的结构体、指针、函数指针及内存动态申请和释放等。l编写Linux设备驱动要求工程师具有一定的Linux内核基础虽然并不要求工程师对内核各个部分有深入的研究但至少要了解设备驱动与内核的接口尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备。l编写Linux设备驱动要求工程师具有良好的多任务并发控制和同步的基础因为在设备驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制。本书对以上内容都进行了详细的讲解以使读者快速掌握编写Linux设备驱动的基础。Administrator下划线Administrator下划线Administrator下划线Administrator下划线Administrator下划线《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorgLinux设备驱动的学习方法动手实践永远是学习任何软件开发的最好方法学习Linux设备驱动也不例外。因此您最好有一块可以实际练手的电路板来构造嵌入式开发环境。如果您暂时没有则可以用VmWare搭建两台虚拟机两台虚拟机上都运行Linux操作系统一台作为开发主机另一台作为目标机。目前的PC上往往只有个串口但是调试要求主机和目标机之间使用串口通信这要求个串口。在虚拟机中我们可以用管道虚拟串口。在主机端设置“终端是客户机”并选择“其他终端是一个虚拟机”。在目标机端设置“终端是服务器”同样选择“其他终端是一个虚拟机”但是要启用轮询。主机和目标机的串口设置分别如图和图所示。图VmWare中主机串口设置《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg图VmWare中目标机串口设置另外为了使VmWare中安装的多个Linux系统之间以及Linux与Windows系统之间的网络互通可以设置VmWare中的Linux系统使用VMnet(仅主机)如图所示。打开VMnet虚拟网卡的连接共享将Linux系统的网关设置为VMnet的IP地址“”Linux系统将通过这个地址连接外网。图VmWare中虚拟机网卡的设置为了使VmWare中的Linux系统具有较高的显示分辨率并能与主机上的Windows之间通过hgfs文件系统共享文件最好在Linux中安装VmWaretools。源代码是学习Linux驱动的最权威资料阅读Linux源代码的最佳工具是SourceInsight在其中建立一个工程并将Linux内核的所有源代码加入该工程同步这个工程之后我们将可以非常方便地在代码之间进行关联阅读如图所示。《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg图在SourceInsight中阅读Linux源代码网站http:lxrlinuxnoident提供了、、、、、、、、、、、版本内核和i、Alpha、ARM、IA、mk、MIPS、MIPS、PowerPC、IBMS、SH、SPARC、SPARC、x体系结构下Linux源代码的“CrossReferencing”在其中输入Linux内核中的函数、数据结构或变量的名称就可以直接得到以超链接形式给出的定义和引用它的所有位置。如搜索内核、i体系结构下的syswrite()函数得到如下信息:syswriteDefinedasafunctionin:*fsreadwritec,lineDefinedasafunctionprototypein:*includelinuxsyscallsh,lineReferenced(infilestotal)in:*archmipskernelirixioctlc,line*archmipskernelsysirixc:olineoline*archskernelcompatlinuxc,line*archsparckernelsyssunosc,line*archsparckernelsyssunosc,line*fsreadwritec,line*includeasmxunistdh,line《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg*includeasmxtensaunistdh,line*includelinuxsyscallsh,line*initdomountsrdc:olineoline*initinitramfsc:olineolineoline除此之外阅读经典书籍和参与Linux社区的讨论也是非常好的学习方法。Linux内核源代码中包含了一个Documentation目录其中包含了一批内核设计的文档全部是文本文件。很遗憾这些文档的组织不太好内容也不够细致。学习Linux设备驱动的一个注意事项是要避免管中窥豹、只见树木不见森林因为各类Linux设备驱动都从属于一个Linux设备驱动的架构单纯而片面地学习几个函数、几个数据结构是不可能理清设备驱动中各组成部分之间的关系的。因此Linux驱动的分析方法是点面结合将对函数和数据结构的理解放在整体架构的背景之中而这正是本书各章节讲解驱动的方法。设备驱动的HelloWorld:LED驱动无操作系统时的LED驱动在嵌入式系统的设计中LED一般直接由CPU的GPIO(通用可编程IO口)控制。GPIO一般由两组寄存器控制即一组控制寄存器和一组数据寄存器。控制寄存器可设置GPIO口的工作方式为输入或输出。当引脚被设置为输出时向数据寄存器的对应位写入和会分别在引脚上产生高电平和低电平当引脚设置为输入时读取数据寄存器的对应位可获得引脚上相应的电平信号。在本例子中我们屏蔽具体CPU的差异假设在GPIOREGCTRL物理地址处的控制寄存器处的第n位写入可设置GPIO为输出在GPIOREGDATA物理地址处的数据寄存器的第n位写入或可在引脚上产生高或低电平则在无操作系统的情况下设备驱动代码如清单所示。代码清单无操作系统时的LED驱动#definereggpioctrl*(volatileint*)(ToVirtual(GPIOREGCTRL))#definereggpiodata*(volatileint*)(ToVirtual(GPIOREGDATA))*初始化LED*voidLightInit(void){reggpioctrl|=(<<n)*设置GPIO为输出*Administrator高亮Administrator高亮Administrator高亮Administrator高亮《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg}*点亮LED*voidLightOn(void){reggpiodata|=(<<n)*在GPIO上输出高电平*}*熄灭LED*voidLightOff(void){reggpiodata=~(<<n)*在GPIO上输出低电平*}上述程序中的LightInit()、LightOn()、LightOff()等函数都将作为LED驱动提供给应用程序的外部接口函数。程序中ToVirtual()等函数的作用是当系统启动了硬件MMU之后根据物理地址和虚拟地址的映射关系将寄存器的物理地址转化为虚拟地址。Linux系统下的LED驱动在Linux操作系统下编写LED设备的驱动时操作硬件的LightInit()、LightOn()、LightOff()这些函数仍然需要但是需要遵循Linux编程的命名习惯重新将其命名为lightinit()、lighton()、lightoff()。这些函数将被LED驱动中独立于设备的针对内核的接口进行调用代码清单给出了Linux系统下的LED驱动现在读者并不需要能读懂这些代码。代码清单Linux系统下的LED驱动#include*包含内核中的多个头文件**设备结构体*structlightdev{structcdevcdev*字符设备cdev结构体*unsignedcharvalue*LED亮时为熄灭时为用户可读写此值*}structlightdev*lightdevpintlightmajor=LIGHTMAJORMODULEAUTHOR("SongBaohua")MODULELICENSE("DualBSDGPL")*打开和关闭函数*《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorgintlightopen(structinode*inode,structfile*filp){structlightdev*dev*获得设备结构体指针*dev=containerof(inode>icdev,structlightdev,cdev)*让设备结构体作为设备的私有信息*filp>privatedata=devreturn}intlightrelease(structinode*inode,structfile*filp){return}*写设备:可以不需要*ssizetlightread(structfile*filp,charuser*buf,sizetcount,lofft*fpos){structlightdev*dev=filp>privatedata*获得设备结构体*if(copytouser(buf,(dev>value),)){returnEFAULT}return}ssizetlightwrite(structfile*filp,constcharuser*buf,sizetcount,lofft*fpos){structlightdev*dev=filp>privatedataif(copyfromuser((dev>value),buf,)){returnEFAULT}*根据写入的值点亮和熄灭LED*if(dev>value==)《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorglighton()elselightoff()return}*ioctl函数*intlightioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg){structlightdev*dev=filp>privatedataswitch(cmd){caseLIGHTON:dev>value=lighton()breakcaseLIGHTOFF:dev>value=lightoff()breakdefault:*不能支持的命令*returnENOTTY}return}structfileoperationslightfops={owner=THISMODULE,read=lightread,write=lightwrite,ioctl=lightioctl,open=lightopen,release=lightrelease,《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorg}*设置字符设备cdev结构体*staticvoidlightsetupcdev(structlightdev*dev,intindex){interr,devno=MKDEV(lightmajor,index)cdevinit(dev>cdev,lightfops)dev>cdevowner=THISMODULEdev>cdevops=lightfopserr=cdevadd(dev>cdev,devno,)if(err)printk(KERNNOTICE"ErrordaddingLEDd",err,index)}*模块加载函数*intlightinit(void){intresultdevtdev=MKDEV(lightmajor,)*申请字符设备号*if(lightmajor)result=registerchrdevregion(dev,,"LED")else{result=allocchrdevregion(dev,,,"LED")lightmajor=MAJOR(dev)}if(result<)returnresult*分配设备结构体的内存*lightdevp=kmalloc(sizeof(structlightdev),GFPKERNEL)if(!lightdevp)*分配失败*{result=ENOMEMgotofailmalloc}memset(lightdevp,,sizeof(structlightdev))《Linux设备驱动开发详解》第章、设备驱动概述嵌入式学院华清远见旗下品牌:wwwembeduorglightsetupcdev(lightdevp,)lightinit()returnfailmalloc:unregisterchrdevregion(dev,lightdevp)returnresult}*模块卸载函数*voidlightcleanup(void){cdevdel(lightdevp>cdev)*删除字符设备结构体*kfree(lightdevp)*释放在lightinit中分配的内存*unregisterchrdevregion(MKDEV(lightmajor,),)*删除字符设备*}moduleinit(lightinit)moduleexit(lightcleanup)代码清单的行数与代码清单相比多了很多除了代码清单中的硬件操作函数仍然需要外代码清单中还包含了大量读者陌生的元素如结构体fileoperations、cdevLinux内核模块声明用的MODULEAUTHOR、MODULELICENSE、moduleinit、moduleexit以及用于字符设备注册、分配和注销用的函数registerchrdevregion()、allocchrdevregion()、unregisterchrdevregion()等。此外设驱动中也增加了lightinit()、lightcleanup()、lightread()、lightwrite()等这样的函数。此时我们只需要有一个感性认识那就是上述元素都是Linux驱动与内核的接口。Linux对各类设备的驱动都定义了类似的数据结构和函数。推荐课程:嵌入式学院嵌入式Linux长期就业班·招生简章:http:wwwembeduorgcoursesindexhtm·课程内容:http:wwwembeduorgcoursescoursehtm·项目实战:http:wwwembeduorgcoursesprojecthtm·出版教材:http:wwwembeduorgcoursescoursehtm《Linux设备驱动开发详解》第章、驱动设计的硬件基础嵌入式学院华清远见旗下品牌:wwwembeduorg第章驱动设计的硬件基础本章讲解底层驱动工程师必备的硬件基础给出了嵌入式系统硬件原理及分析方法的全景视图。节讲解微控制器、微处理器、数字信号处理器以及应用于特定领域的处理器各自的特点。节对嵌入式系统中所使用的各类存储器与CPU的接口、应用领域及特点进行了详细讲解。节讲解常见的外设接口与总线的工作方式包括串口、IC、USB、以太网接口、ISA、PCI和cPCI等。嵌入式系统硬件电路中经常会使用CPLD和FPGA节讲解了CPLD和FPGA在电路中的作用。~节讲解实际项目开发过程中硬件分析的方法包括如何进行原理图分析、时序分析以及如何快速地从芯片手册获取有效信息。节讲解了调试过程中常用仪器、仪表的使用方法涉及万用表、示波器和逻辑分析仪。Administrator波浪线Administrator波浪线Administrator波浪线Administrator波浪线《Linux设备驱动开发详解》第章、驱动设计的硬件基础嵌入式学院华清远见旗下品牌:wwwembeduorg处理器通用处理器通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化它们具有一般化的通用体系结构和指令集以支持复杂的运算并易于新开发功能的添加。一般而言在嵌入式微控制器(MCU)和微处理器(MPU)中会包含一个通用处理器核。MPU通常代表一个CPU(中央处理器)而MCU则强调把中央处理器、存储器和外围电路集成在一个芯片中。早期微控制器被称为单片机意思是把计算机集成在一个芯片内。嵌入式微控制器也常被称作片上系统(SoC)含义是在一个芯片上设计了整个系统。芯片厂商在推出MCU时往往会有明确的市场定位如定位于PDA、MP、ADSL等。定位不同的产品可能包含共同的CPU核但是集成的扩展电路则不一样。图所示为一个典型的集成了外围电路的MCU的结构。图典型的MCU内部结构举个例子Intel的属于微处理器而内部集成了处理器、片选单元、中断控制、定时器、看门狗、定时器、串行IO、DMA、总线仲裁、DRAM控制器等的EX则是微处理器的微控制器版本。嵌入式微控制器一般由一个CPU核和多个外围电路集成目前主流的CPU核如下。.AdvancedRISCMachines公司的ARMARM内核的设计技术被授权给数百家半导体厂商做成不同的SoC芯片。ARM的功耗很低在当今最活跃的无线局域网、G、手机终端、手持设备、有线网络通信设备等中应用非常广泛。《Linux设备驱动开发详解》第章、驱动设计的硬件基础嵌入式学院华清远见旗下品牌:wwwembeduorg.SiliconGraphics公司的MIPS两个最重要的MIPS芯片厂商为PMC和IDT。PMCSierra公司的MIPS处理器被CISCO公司大量采用在高端路由器上。IDT公司在MIPS核上集成PCI接口广泛用于以太网交换另外也尝试增加了HDLC、Ethernet、串口、SDRAM控制器、片选、DMA控制器等外设接口以用于低端通信产品。.IBM和Motorola的PowerPCPowerPC处理器是通信和工控领域应用最广泛的处理器国内包括华为、中兴在内的通信公司都大量使用PowerPCMPC和MPC是其最经典的两款。.Motorola公司独有的内核KCOLDFIREK内核是最早在嵌入式领域广泛应用的内核其最著名的代表芯片是。Coldfire则继承了K的特点并对其保持了兼容。Coldfire内核被用于DSP模块、CAN总线模块以及一般嵌入式处理器所集成的外设模块在工业控制、机器人研究、家电控制等领域被广泛采用。Motorola的半导体部已经独立为飞思卡尔半导体公司(FreescaleSemiconductorInc)因为历史原因上文仍然使用Motorola。中央处理器的体系架构可以分为两类一类为冯·诺伊曼结构一类为哈佛结构。冯·诺伊曼结构也称普林斯顿结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置因此程序指令和数据的宽度相同。而哈佛结构将程序指令和数据分开存储指令和数据可以有不同的数据宽度。此外哈佛结构还采用了独立的程序总线和数据总线分别作为CPU与每个存储器之间的专用通信路径具有较高的执行效率。图显示了冯·诺伊曼结构和哈佛结构的区别。图冯·诺伊曼结构与哈佛结构从指令集的角度来讲中央处理器也可以分为两类即RISC(精简指令集计算机)和CISC(复杂指令集计算机)。CSIC强调增强指令的能力、减少目标代码的数《Linux设备驱动开发详解》第章、驱动设计的硬件基础嵌入式学院华清远见旗下品牌:wwwembeduorg量但是指令复杂指令周期长而RISC强调尽可能减少指令集、指令单周期执行但是目标代码会更大。ARM、MIPS、PowerPC等CPU内核都采用了RISC指令集。目前RISC和CSIC的融合非常明显。数字信号处理器数字信号处理器(DSP)针对通信、图像、语音和视频处理等领域的算法而设计。它包含独立的硬件乘法器。DSP的乘法指令一般在单周期内完成且优化了卷积、数字滤波、FFT(快速傅立叶变换)、相关、矩阵运算等算法中的大量重复乘法。DSP一般采用如图所示的改进的哈佛架构它具有独立的地址总线和数据总线两条总线由程序存储器和数据存储器分时共用。图改进的哈佛结构DSP分为两类一类是定点DSP一类是浮点DSP。浮点DSP的浮点运算用硬件来实现可以在单周期内完成因而其浮点运算处理速度高于定点DSP。而定点DSP只能用定点运算模拟浮点运算。德州仪器(TI)、美国模拟器件公司(ADI)是全球DSP的两大主要厂商。TI的TMS™DSP平台包含了功能不同的多个系列:系列、系列、系列、系列、系列工程师也习惯称其为X、X、X、X、X。除了与系列是定点DSP外其余的均为浮点DSP。ADI主要有位定点的xx系列、位浮点的SHARC系列、从SHARC系列发展而来的TigerSHARC系列及高性能位DSP信号处理能力与通用微控制器方便性相结合的blackfin系列等。通用处理器和数字信号处理器也有相互融合以取长补短的趋势如数字信号控制器(DSC)即为MCUDSPblackfin系列属于DSC。目前芯片厂商推出了许多ARMDSP的双核处理器。除了上述的通用微控制器和数字信号处理器外还有一些针对特定领域而设计的专用处理器(ASP)它们都是针对一些特定应用而设计的如用于HDTV、ADSL、CableModem等的专用处理器。网络处理器是一种可编程器件它应用于电信领域的各种任务如包处理、协议分析、路由查找、声音数据的汇聚、防火墙、QoS等。网络处理器器件内部通常由若干《Linux设备驱动开发详解》第章、驱动设计的硬件基础嵌入式学院华清远见旗下品牌:wwwembeduorg微码处理器和若干硬件协处理器组成多个微码处理器在网络处理器内部并行处理通过预先编制的微码来控制处理流程。而对于

用户评价(11)

点击加载更多内容
关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/49

Linux设备驱动开发详解_宋宝华

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利