复杂程序系统构架方法-设备驱动程序

转载 2013年12月02日 22:24:58

系统越做越复杂,涉及到很多集成外设或者是外部功能模块的操作。这时需要对每个外设或功能模块编写相应的驱动程序,驱动程序编写是复杂系统模块化过程中一个很重要的环节。好坏与否关系系统的稳定性和模块的可重复利用性。

       驱动程序是将外设抽象成与硬件无关操作的中间程序,因此驱动程序有两个重要问题要处理,一个是设备的操作流程处理,二是驱动函数调用时传递和返回值的处理。

       由于应用程序层的函数希望通过调用驱动程序的方式使得应用程序与硬件无关,因此驱动函数的调用应该尽可能完成所有与硬件直接相关的操作流程,同时为应用程序提供必要的可变配置信息输入端口,以方便应用程序灵活调用。驱动程序的返回原则上应该是操作的状态信息,例如:是否成功,或故障代码。而数据传输应该以传入数据缓存区指针的方式完成。

       一个设备的驱动程序应包含一下几个调用函数:

       1、初始化函数 

             用于外设启动所需的电气连接操作,或设计IO端口配置,设备上电后配置操作等,在多任务系统中初始化操作还应包含所需信号量或消息等的创建。初始函数供应用函数在使用该设备时调用。初始化函数的参数一般为:设备号(如果相同的设备有多个的时候需要,这样可以有效重复利用驱动程序代码),必要参数(传输速率,工作模式等)。返回一般为:成功或不成功,简单操作或无法判断是否成功的情况下也可以不返回 。

            例如:uart_Init(const S_BSP_UART *pUart,uint32 dBaudrate,uint32 dMode);

                      adc_Init(uint32 channel,uint8 trg,uint16 period);

                      key_Init(void);                

       2、读设备操作函数

             用于从设备中获取数据,该函数应该包含这个读写过程所需的所有操作。确保应用程序在调用该程序后就能获得想要的数据,而不要在添加其他辅助操作或与硬件相关的操作。其参数一般为:设备号,数据缓存指针,欲读取数据长度等,返回:读取成功或不成功

            例如:uart_GetData(const S_BSP_UART *pUart,uint8 *RecivBuf,uint16 timeout,uint16 size,uint16 *rsize);

                      adc_GetDatas(uint16 *buff,uint16 size);

       3、写设备操作函数

            用于向设备中写入数据,该函数应该包含这个读写过程所需的所有操作。确保应用程序在调用该程序后就能获得想要的数据,而不要在添加其他辅助操作或与硬件相关的操作。其参数一般为:设备号,数据缓存指针,欲写入数据长度等,返回:写入成功或不成功

            例如:twi_Write(uint32 sla,uint32 suba,uint32 subasize,uint8 *data,uint32 len);

                      pwm_Set(S_PWM_DRIVER *pPwm,uint32 frequency,uint16 dutycycle,uint16 type);

       4、中断处理函数

              设备使用过程中需要使用到中断,需要编写中断处理函数,用来挂接到系统中断处理程序中。中断处理函数应尽可简短,不允许有等待信号量或消息等操作,不允许使用操作系统延时。中断处理函数应该处理最近紧急的事件或完成时序严格的操作,数据处理可以消息或信号的方式发自出来。该函数不返回,可带参数。

             例如:uart_ISRHandler(const S_BSP_UART *pUart);

                       adc_ISRHandler(void);

       5、设备IO操作函数

            设备IO操作用于完成设备的控制性操作,例如关闭,休眠,待机,唤醒,擦除,删除等命令性动作。 

浅论C++的复杂性

C++语言已经有了20多年的历史。作为一门影响广泛的编程语言,它所受到的关注和争论恐怕是任何一门其他的语言所不能比拟的。十几年前,Java等新生语言的出现曾导致“C++信任危机”,但最终C++以自身非...
  • K346K346
  • K346K346
  • 2015年12月05日 11:56
  • 1740

程序时间复杂度计算(一)

最近休息的状态,所以将以前工作时纪录在“印象笔记”的较好的资料和以前自己的一些想法,逐步整理到博客里吧。一、概念 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总...
  • u010910436
  • u010910436
  • 2016年04月20日 17:16
  • 695

复杂计算器的实现,没有界面

/* 这里给大家分享一个用于计算器的工具类,里面只有一个方法值核心的代码, 就是名为  baseParse  这个名字的方法,这个方法可以计算一个没有括号的 混合的加减乘除的字符串    比如可...
  • u013120273
  • u013120273
  • 2015年07月26日 16:04
  • 237

复杂网络分析工具及其比较(转)

原文地址:复杂网络分析工具及其比较(转)作者:zhengw789 转自:http://bbs.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&...
  • qingqingpiaoguo
  • qingqingpiaoguo
  • 2016年12月22日 16:29
  • 981

Network Analysis]复杂网络分析总结

http://www.cnblogs.com/maybe2030/p/4665847.html 阅读目录 1. 复杂网络的特点2. 社区检测3. 结构平衡4. 影响最大化5...
  • zdy0_2004
  • zdy0_2004
  • 2015年12月23日 17:05
  • 8015

[Network Analysis] 复杂网络分析总结

阅读目录 1. 复杂网络的特点2. 社区检测3. 结构平衡4. 影响最大化5. 网络传播6. 补充7. 参考文献   在我们的现实生活中,许多复杂系统都可以建模成一种复杂网络进行分析,...
  • github_36741341
  • github_36741341
  • 2016年11月20日 13:30
  • 2732

新手必看:如何成为一个很牛的C++程序员

这个题目的噱头太大,要真的写起来, 足够写一本书了。本人是过来人, 结合自身的体会和大家交流一下,希望新人能少走弯路。每个人的情况不一样,我下面的描述可能并不适合每一个看到这篇文章的人。 一、C...
  • encoder1234
  • encoder1234
  • 2013年09月18日 15:47
  • 2190

复杂指针的定义(含复杂函数指针)

引言 指针是C/C++语言中很重要的机制,一些C语言高级用法基本都需要指针的参与。本文从定义的角度, 解析各类用到指针的定义。 具体解析过程              int   p; 定义普通变量p...
  • CHENGUANCHI
  • CHENGUANCHI
  • 2013年11月11日 13:03
  • 1344

Android复杂列表的实现

初步实现 问题的开始是这样的:项目里有个页面,整个列表采用ListView实现,除了常规的列表项外,还有两个自定义的View也要随着页面滑动。Ok,listView支持addHead,而且还是多he...
  • u013700502
  • u013700502
  • 2017年04月11日 16:31
  • 551

不使用split和replace情况下分割复杂字符串

最近遇到一个问题,具体需求如下: 有一个字符串,可能会有中文/英文/数字/逗号/引号等字符,现在需要按照逗号分割输出,如果有一个待输出的字符串里面包含了引号的话,需要将其里面的值完整输出,并且如果里...
  • xiayingwen1989
  • xiayingwen1989
  • 2015年08月15日 14:15
  • 482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:复杂程序系统构架方法-设备驱动程序
举报原因:
原因补充:

(最多只允许输入30个字)