1、底层驱动文档Matlab嵌入式系统的底层驱动摘要:嵌入式系统是计算机技术,通信技术,半导体技术,微电子技术,语音图象数据传输技术,甚至传感器等先进技术和具体应用对象相结合后的更新换代 产品。Matlab作为美国 MathWorks公司开发的用于概念设计,算法开发,建模仿真,实时实现的理想的集成环境。其强项就是其强大的矩阵计算以及仿真能力。该文简要介绍了 Matlab嵌入式系统的特点和发展历史,以及驱动程序的编写方法。关键词:Matlab; 嵌入式系统; 驱动程序The Matlab First Floor DriveYU Dan, WANG Guang(Basic Course Departm
2、ent of Aviation University of Air Force, Changchun 130022, China)Abstract: The built-in system is the product of renewal changes generation that combined with calculator technique, correspondence technique, semi-conductor technique, micro-electronics technique, speech portrait data delivers techniqu
3、e, spreadfeeling machine and so on.The Matlab is the ideal integrated environment that was developed by the American MathWorks company which was used forthe concept design the development of calculate way set up mimicry true the realization Of solid hour. Its strong item is the matrix calculation an
4、d the ability of imitating true.This text synopsis introduced the characteristics the development history the write method of drive procedure.Key words: Matlab; built-in system; built-in systemMatlab是英文MATrix LABoratory(矩阵实验室)的缩写,它是由美国MathWorks公司推出的用于数值计算和图形处理计算系统环境,专门以矩阵的形式处理数据。除 了具备卓越的数值计算能力外,它还提供
5、了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能,是国际公认的和Mathematica、 Maple并列的三大数学软件之一,其强项就是其强大的矩阵计算以及仿真能力。1 嵌入式系统概述嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。简单的说就是系统的应用软件与系统的硬件一体化,类似与BIOS的工作方式。它是计算 机技术, 通信技术, 半导体技术, 微电子技术, 语音图象数据传输技术, 甚至传感器等先进技术和具体应用对象相结合后的更新换代产品,具有软件代码小、高度自动化、响应速度快等特点,特别适合于要求实时的和多任务的体系,因此 往往是技术密集,投资强度大, 高度分散, 不
6、断创新的知识密集型系统,反映当代最新技术的先进水平。 2 嵌入式系统驱动程序编写2.1 驱动程序编写的方法写驱动程序,第一个要件就是先读懂规格书,并且能够存取每一个装置的管脚。第二个动作就是跟系统注册中断的服务函数,让操作系统了解中断产生的时候 要跑哪些函数。第三个动作就是将驱动程序的界面加到一般用户存取截面函数中,让用户通过一定的函数调用来存取外围装置。其中,第二项跟第三项必须依据操作 系统本身的规定来作,第一项就是依据该平台的硬件说明书来做。下面以一个简单的例子讲述第一项的程序编写方式:这是一个在DragongBall EZ328的RS-232简单版驱动程序。它做了几件事情,首先就是写了一
7、个中断服务程序(ISR),当产生中断的时候,将收到的数据防到一个缓冲区 (buffer)里去,这个buffer我们声明叫做m_pBuffer,我们通过两个变量来维护这个buffer,一个是声明m_wStartBuf, 另一个是声明m_wEndBuf,让buffer以一种环状数据的方式存在。驱动程序举例如下:#include “device.h” /声明硬件的对应地址#define RX_BUFFER_SIZE 16384/2的次方倍数#define RX_BUFS_MASK 0x3FFF /buffer size减一extern voidfun IntHandlerTable54;/中断向量表
8、unsigned char m_pBufferRX_BUFFER_SIZE; /BUFFER声明unsigned long m_wStartBuf=0; /环状指针起始位置unsigned long m_wEndBuf=0; /环状指针结束位置unsigned short UART_InData;/收到的数据unsigned long BuffEndTemp; /暂存数据2.2 编写驱动程序时的注意事项我们在编写驱动程序时必须注意下面的事项:1) 程序所占用的内存空间不能太大。针对嵌入式系统开发成本与体积的要求,驱动程序本身不能使用太多的内存,以免影响其他模块可以利用的资源。2) 程序架构所需
9、的计算资源要低。驱动程序本身只是为了方便其他模块能够简易的操作硬件,不使用大量精密复杂的数值分析运算,以减少影响其他模块执行时间的考 虑为原则。3) 驱动程序对其他模块的反应要即时。驱动程序的执行需考虑不影响其他模块调用驱动程序模块后的行为与反应时间。4) 中断程序的执行时间要足够短。实时操作系统能即时反映外界信号缘于它对中断信号处理的能力。若有一个中断程序长期占住处理器执行期间又不允许其他中断的进 入,该操作系统便失去即时反应能力。5) 驱动程序内对类似设计的移植性要高。驱动程序不同于一般的系统调用,针对硬件的不同我们会设计出不同的驱动程序库。但每个驱动程序库内,我们仍应该仔细分 出与厂商设
10、计相关或与芯片相关的部分。 6) 程序接口与硬件规格相关性低。若我们定义的驱动程序接口参数与硬件的规格息息相关,当我们转换一个平台,原规划的参数在新的平台上找不到对应,程序接口便 会变得很难理解与转换。7) 与浮点运算无关。小型的系统所使用的处理器常常都没有浮点运算的功能,而我们希望我们编写的驱动程序具备重复使用的能力。所以于程序当中,对于需要浮点计 算的场合,我们必须尽量避免。8) 减少状态变量。驱动程序本身是控制硬件,所谓的状态往往是硬件的状态,我们应该竭力的反应硬件的状态,而不是假设一个状态变量可以符合目前硬件的状态,如 此驱动程序才能减少错误动作。9) 减少状态常数所要表达的意义。尤其
11、要避免设计出一个状态常数所表示的是两种以上事件同时发生,很容易就会有例外事件没有机会被处理到,从此状态变量便进入 不可预期的状况。2.3编写驱动程序的准备在写驱动程序之前,下面这些事情必须要先做好准备:1) 基底地址常数声明的建立。建立所有存取外围寄存器的基底地址,包括控制寄存器、数据寄存器与系统内内存分布的基底地址。2) 遮罩常数声明的建立。驱动程序内存在着许多使用位表示某种功能的场合,将每个Bit以常数名称定义,于驱动程序中针对不同的应用场合组或不同遮罩组合,增 加可阅读性。3) 状态常数声明的建立。驱动程序内不可避免存在着一些状态变量,而状态变量会有许多可能的状态可选,我们将它以专有的常
12、数名称取代,避免程序当中有张冠李戴 之情形,增加可读性也减少出错的危险。4) 常用功能宏的建立。驱动程序内常常有许多类似智能的功能,但需要许多行程序代码来表示,使用宏声明可让我们的程序更简洁,也避免不必要的认为错误。参考文献:1 探矽工作室.嵌入式系统开发圣经M.北京:中国青年出版社,2002.2 Barr M.C/C 嵌入式系统编程M.北京:中国电力出版社,2001.3 张晓辉.嵌入式操作系统驱动程序开发J.安徽电气工程职业技术学校学报,2005(1).浅谈软件开发中的架构设计摘要:文章主要从软件架构的定义、为何需要为软件设计架构、架构设计的核心思维、软件架构设计的几个步骤这几个方面进行阐述
13、,以供参考。关键词:软件开发;架构设计;需求分析文章编号:1009-2374 #8197;(2010)28-0009-02软件架构是软件系统中的地基,是一个软件系统中的核心元素,它决定了一个系统的主体结构、宏观特性和具有的基本功能及其特性,它位于软件开发过程的 前期阶段,架构设计的过程,是分析客户需求、挖掘非功能性需求、并将客户需求所定义的领域知识转化为软件系统模型的过程。本质上软件架构是对软件需求的一 种抽象解决方案,用于指导大型软件系统各个方面的设计。正如大型建筑物设计成功的关键首先在于主体结构。同样,复杂的软件设计的成功与否在于软件系统的宏 观上层结构设计的正确和合理性。但现实中,软件架
14、构的理论和工具还没有形成系统、规范的概念和描述,不同架构师在图形符号说明上总是采用自己习惯的方式, 致使软件架构设计尚未形成一个有效统一的模式知识库,未能更好地发挥架构设计本身的作用。在此,本文就软件开发的架构设计的相关内容进行探讨,以供参考。1软件架构的定义软件架构(Software archiecture)一组有关如下要素的重要决策:软件系统的组织,构成系统的结构化元素,接口和它们相互协作的行为的选择,结构化元素和行为元素组合成力度更大的子系统的方式的选择,以及指导这一 组织(元素及其接口、协作和组合方式)的架构风格的选择。软件架构是对系统整体结构设计的刻画,包括全局组织与控制结构、构件间
15、通讯、同步和数据访问的协议,设计元素的功能分配,物理分布,设计元素集成, 伸缩性和性能,设计选择等。2为何需要为软件设计架构2.1不进行架构设计将很难满足系统的品质软件架构设计中的一个关键特性,是系统的品质是通过某些手段来实现的。软件的品质(如性能,安全性和可维护性等)在缺少统一的架构设计时是无法一一 实现的,因为软件的品质并不是单一的体现在软件元素中,而是渗透在整个软件体系中的,因此我们应尽早的评估在项目开发周期中的这些品质。软件架构模型的建 立,通常是为确定我们是否已经满足了软件这些品质的要求。2.2架构设计很容易让相关人员达成一致的目标架构设计提供了一个辩论系统解决方案的媒体,因此架构设
16、计可以使得不同的涉众达成一致的目标。经过有效的传送,体系架构可以使系统构架师之间、软件 开发人员之间或者其他新老成员之间的意见以及他们之间的视图达成一致。2.3架构设计能够支持计划编制过程架构设计的过程支持设计和实现活动,因为软件开发的过程是直接使用到这些活动中的,例如:细节划分、日程安排、工作分配、成本分析、风险管理和技能 开发等。2.4架构设计能够有效地管理软件复杂性 如今的软件系统越来越复杂,而这种复杂性需要我们去有效的管理。而架构设计过程考虑的是组件的递归分解。这是处理一个大的问题的很好的一个方法,它 可以把这个大问题分解成很多的小问题,再逐个的解决。2.5架构设计为复用奠定了基础架构
17、设计过程可以同时支持使用和建立复用资源。复用资源对于一个组织来说是有益的,因为它可以降低一个系统的成本,并且可以改进系统的质量。架构设计为大规模开发提供了基础和规范及可重用的资产。要进行软件系统的大规模开发,需要有一定的基础和遵循一定的规范,这既是软件工程本身的要 求,也是客户的要求。架构设计的过程中可以将一些公共部分抽象提取出来,形成公共类和工具类,以达到重用的目的。2.6架构设计能够降低维护费用架构设计过程可以在很多方面帮助我们降低维护费用。例如,架构设计过程要确保系统的维护人员是一个主要的涉众,并且他们的需求被作为首要的任务满 足。一个被恰当文档化的架构不应该仅仅为了减轻系统的可维护性,
18、还应该确保结合了恰当的系统维护机制,并且在建立体系架构的时候还要考虑系统的适应性和可 扩充性。2.7架构设计能够支持冲突分析一个好的软件构架确定了主要的组件和它们之间的交互作用,两个组件之间的依赖性以及这些组件对于需求的可追溯性。3架构设计的核心思维3.1 架构设计的源泉来自于需求分析,并且它的设计重心和特点来自于质量需求而非功能性需求任何软件系统都是以满足一定的需求为目的,因此,一个好的软件架构必须以深入全面的需求分析作为基础。然而,架构设计并没有统一的模式,任何模式的 架构也只有针对问题才有意义。作为架构设计来说,在进行需求分析的过程中,系统分析员必须对需求分析有足够的解,才能有针对性地将
19、客户需求有效的转化为计 算机模型(如架构模型及视图),这样才能设计并开发出优秀的软件产品。与此同时,在需求分析的过程中,系统架构设计师还应注重挖掘系统的质量需求而非功能 性需求,例如软件系统的稳定性、安全性、可扩展性、可定制化、可维护性、用户体验等。3.2软件架构的实现还需依赖于好的项目管理任何架构思想的完成都依靠于好的项目管理,项目管理也必须与架构思想相匹配才能够发挥真正的作用。一个好的架构设计不只需求关心成本,也需求关心时 间,这样才能在商定的时间内,以不超越软件开发中的成本预算,生产出契合需求的软件产品。因而,软件架构设计时应认真探讨现代项目管理的思想和办法,吃透 其中的精华,按照本身的
20、设计思想,提进项目管理的处理方案,以期能使软件满足非功效性需求,并且可以降低开发成本及维护费用。 软件架构设计是一个系统工程,它需求软件系统构架师有很宽的知识面,从需求剖析、架构设计到类设计乃至代码完成到项目管理都需要有透彻的了解,这之 间的关系是你中有我,我中有你,是不成单独分开的。软件系统设计的办法并不是一个僵化的规则,关键是在理论中实事求是的探索规律,从而找出契合实践达到要 求的设计。4软件架构设计的几个步骤 nbsp;(1)需求分析和理解业务模型,并选定关键案例。软件的需求需要区分用户视角和开发人员视角,从用户的角度看,又可以分为功能性和非功能性需求,我 们必须从不同的视角和级别去全面
21、的认识需求并分析需求,理解业务模型。实践表明,常常被我们忽视的非功能性需求常会导致整个项目失败。(2)从软件开发的各个视角来进行软件架构的设计。软件的架构设计必须考虑到各个方面,根据前期工作确立的领域模型,关键需求,系统约束等进行设 计,我们应从系统用户、开发人员、系统管理员、部署管理员、数据管理员等人员的角度去分析并解决问题。(3)解决技术面的重点问题和难题。在软件架构设计的过程中,我们往往会需要攻克一些技术面的重点问题和难题,这完全是一项极其需要扎实的理论知识 和丰富的实践经验支撑的工作。(4)架构设计评审是极其重要的一环,在进行架构设计之前我们应召开架构设计评审会议进行同行评审。(5)针
22、对关键案例在设计的架构上实现功能来验证架构。(6)交付给客户评审让客户理解并接受架构设计方案,在架构设计得到客户的认可后,便可进入大规模的开发。 5结语综上所述,架构设计是软件开发过程的重要组成部分,它不是单纯的技术,也不具有一种特定的形式,而是源于客户需求,其实现依赖于好的项目管理等。良 好的软件架构能够服务于整个开发过程,有效地降低项目风险,确保项目能够朝着健康的方向发展。因此,我们必须重视架构设计在软件开发中的重要作用。 参考文献1 陈晴阳.正视架构设计的重要作用J.软件世界,2007,(13).2 陆莉祯,尹晓强,柳军飞.面向模式的系统架构设计J.计算机应用与软件,2005,(6).3
23、 高焕堂.架构设计的How-toJ.程序员,2009,(4).一个嵌入式Linux系统的键盘驱动实现摘要:本文基于Linux内核中键盘驱动程序的整体框架结构,分析了为嵌入式Linux系统编写特殊键盘驱动程序时需要完成的工作,并以具体的应用为例介 绍了一个嵌入式Linux系统上的键盘驱动实现。关键词:嵌入式Linux 键盘驱动 去毛刺1 引言Linux由 于其具有内核强大且稳定,易于扩展和 裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用。很多嵌入式Linux系统,特别是一些 具有与用户强交互的嵌入式系统,往往需要配备一个特殊键盘,此时开发者需要根据实际情况,为自己的特殊键盘编写驱
24、动程序。2 Linux键盘驱动简介Linux中的大多数驱动程序都采用了层次型的体系结构,键盘驱动程序也不例外。在Linux中,键盘驱动被划分成两 层来实现。其中,上层是一个通用的键盘抽象层,完成键盘驱动中不依赖于底层具体硬件的一些功能,并且负责为底层提供服务;下层则是硬件处理层,与具体硬件 密切相关,主要负责对硬件进行直接操作。键盘驱动程序的上层公共部分都在driver/keyboard.c中。该文件中最重要的就是内核用 EXPORT_SYMBOL这个宏导出的handle_scancode函数。handle_scancode完成的功能是:首先将扫描码转换 成键码,接着根据shift, alt等
25、扩展键的按下情况将键码转换成目标码,一般情况下是ASCII码,最后将该ASCII码放到终端设备的缓冲区中,并且调度一个tasklet负责 将其在显示器上回显出来。可以看出,这个函数完成的是键盘驱动程序中最核心的一些工作,而这些核心的逻辑功能是不依赖于底层硬件的,所以可以将其独立出 来,并且导出给底层的硬件处理函数调用。在这个文件中还定义了其它几个回调函数,它们由键盘驱动程序中的上层公共部分调用,并由底层硬件处理函数实现。比 如kbd_init_hw, kbd_translate, kbd_unexpected_up等等。其中kbd_translate由handle_scancode调用,负责将
26、扫描码转换成键码;键盘驱动程序 的底层硬件处理部分则根据不同的硬件有不同的实现。例如PC平台上标准键盘的底层硬件处理函数都集中在driver/Pc_keyb.c中。这个文件包括 了键盘中断处理函数keyboard_interrupt,扫描码到键码转换函数pckbd_translate等其他一些与底层硬件密切相关的函数。 在这种体系结构下,要添加一块特殊键盘到系统中就显得格外清晰。开发者只需为其编写驱动程序中的底层硬件处理函数,就可以将该键盘驱动起来。一般说来, 底层硬件处理函数中最重要的工作就是在键盘中断处理中获取被按下键的扫描码,并且以它为参数调用handle_scancode,该扫描码可以
27、自己定义, 但它必须唯一地标识出被按下键在键盘上的位置。此外,开发者还需要提供对应的从自定义扫描码到键码的转换函数kbd_translate。具体的键码转 换,将目标码放到终端的输入缓冲区,以及回显等工作都由handle_scancode负责完成。在此我们也可以看出,内核导出函数 handle_scancode在整个键盘驱动程序中,起着将上层通用抽象层和底层硬件处理层粘和起来的关键作用。3 应用实例 下面我们将以一个具体的应用实例来说明在嵌入式Linux系统中给一个特殊键盘编写驱动程序的具体过程。3.1 硬件模块描述本 系统的构建选用了三星公司的S3C2410开发板作为硬件平台。特殊键盘的硬件
28、模块主要由两个SN74hc164芯片和一个4行16列的矩阵扫描电路构 成。SN74hc164是一个8位的串形输入并形输出移位寄存器,它的内部由8个D触发器串联而成。其工作原理简单说来是这样的,SN74hc164芯片 在时钟CLK脉冲的上升沿将A,B引脚上的串形输入在8个时钟脉冲以后并行输出到输出引脚QA到QH。其真值表见图1所示。引脚接线情况如下: 图1 SN74hc164真值表 两个SN74hc164芯片先串联后,将它们的CLK引脚和CLR引脚分别接到S3C2410开发板 的GPB2和GPB4端口上,并且将第一个SN74hc164芯片的A,B引脚接到开发板的GPB1端口上,这三个GPIO端口
29、配置成输出端口。这样我们 就借助于两个SN74hc164寄存器,实现了只占用3个GPIO端口,给矩阵扫描电路的16列提供输入,从而既节约了成本,又避免了GPIO资源的浪 费。但这同时也给键盘驱动程序的实现带来了一定的麻烦,驱动程序首先要将SN74hc164驱动起来,然后才能对矩阵电路的16列进行控制。该矩阵电路的4个行引脚分别被接到S3C2410的GPG6,GPG7,GPG8,GPG9端口上,并且这四个端口被配置成 中断源。无键按下时直接读为高电位,使用时通过SN74hc164芯片先将键盘的16列置低电位,任何一个键被按下,相应的行GPG端口就会有从高到低的 电压跳变,从而触发一次中断。3.2
30、 软件模块描述初始化部分。这部分包括硬件层和软件层上的初始化。在本例中,需要先对矩阵电 路和SN74hc164芯片所使用到的GPIO端口作配置,以使CPU可以对它们进行控制和访问。为了要将某个GPIO端口配置成输入输出或者是中断源, 需要在对应的GPIO控制寄存器中设置正确的值,具体的值可以通过查阅S3C2410开发板手册来获得。比如,为了将GPB1设置成SN74hc164的 输入端,需要将GPBCON这个控制字中2,3两位设置成二进制的01,为了将GPG6设置成电压低跳变中断源,需要将GPGCON中12,13两位设置 成二进制的10。在完成了硬件初始化操作以后,就是软件层上的初始化了。首先将
31、键盘中断处理函数注册到系统,然后设置好一个定时器结构,以便在中断发生时 将其挂到内核的定时器队列中去,该定时器将触发对键盘的扫描操作。最后通过SN74hc164将矩阵电路的16列置零。中断处理部分。如前所 述,这部分软件应该完成的工作就是扫描特殊键盘,确定哪个键被按下,并且拿到稳定的扫描码,然后调用内核导出函数handle_scancode。在这个 应用中,该特殊键盘的布局与PC标准键盘的布局比较相似,所以我们直接将PC键盘上对应键的系统扫描码作为我们特殊键盘上各个键的扫描码,同时我们将PC 键盘驱动程序中扫描码到键码的转换函数pckbd_translate作为我们的kbd_translate
32、函数。图2 毛刺示意图 确定哪一个键被按下的算法如下。在中断到来时,我们已经可以根据中断号确定被按下的键在哪一行,我们还需要确定被按下的键在哪一列。为此,我们先给串联 的两个SN74hc164芯片送一个CLR信号,清零,然后送16个1,使得特殊键盘的列均为高电位,此时我们在键盘的行端口读到的都是高电位。在16个 时钟脉冲下,给SN74hc164芯片送入1个0和15个1,使得0在每一列上都唯一出现一次,于此同时在键盘行端口进行扫描。当被按下键所在列置0时, 其所在行就会读到一个低电位。使用这种“走0法”,我们就可以确定出键盘上哪个键被按下了。但是这种简单的扫描算法还不够,因为在这种类型的矩阵扫描键盘 中,键的每次按下和抬起都会有1020ms(这段时间的长短由硬件特性决定)的毛刺抖动存在,如图2所示,所以为了获取稳定的按键信息,必须要想办法去 掉这种抖动,才能避免将用户的一次按键误当作几次按键来处理。去毛刺的一
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1