历史上的今天
今天是:2025年02月03日(星期一)
2018年02月03日 | 最简单的GPIO驱动的智慧
2018-02-03 来源:eefocus
干货 | 最简单IO驱动的智慧

从单片机到ARM7、ARM9、Cortex-A8,从uC/OS到WinCE、Linux,GPIO驱动都是最简单、最易编写的驱动。但看似简单、毫无技术含量的驱动,其是否完整?是否规范?是否安全?
典型案例
本节将选取两例典型案例,从反、正两个角度进行对比。
反方案例
以某一源码中XXX驱动为例,截取XXX_IOControl部分的代码,如程序清单1所示;请留意代码突出显示部分。
程序清单1

从反方案例,实现GPIO电平状态的读或写的功能仅需要几行代码,非常简单。
正方案例
如程序清单2所示,代码截取自ZLG某核心板GPIO驱动,请留意代码中突出显示部分。
程序清单2




从正方案例,实现GPIO电平状态的读或写的功能却花费了2倍的代码工作量,差异为何如此大?
案例点评
一、指针使用
在反方案例中,函数传递进来的指针参数未经判断而直接使用,这种情况下若为空指针或野指针,则程序极可能出现异常甚至崩溃!
反方案例在读取操作后,使用“*pBytesReturned = 2;”返回实际读取的字节数,但是,该指针依然未经判断而直接使用!
而正反案例则在每一项参数使用前均对参数范围、有效性进行判断,从根本上避免了参数异常情况的发生!
二、错误提示
在反方案例中,XXX_IOControl只是返回TRUE或FALSE,返回FALSE时应用层无从获取或获知是什么原因造成了“FALSE”!
对比正方案例,在参数判断时即开始添加错误提示,在return之前,调用SetLastError函数,应用层则可以通过GetLastError获取错误原因,允许用户更快速、准确的定位错误点。
三、注释
反方案例函数体内外几乎无注释;
而正方案例,无论函数体内的关键位置还是函数体外,均做必要、详细的注释说明,为程序的后期维护带来极大的便利!
包括最简单的GPIO在内,驱动实现功能非常容易,但驱动的完整性与可靠性却蕴藏着软件工程的大智慧。
上一篇:STC单片机学习型遥控器程序
史海拾趣
|
这个文件包含了很多常用外围的应用,连 vs1003 GPS 等都有,确实佩服这种开源的精神。 本站要整理ICC下的库函数 吼吼 AVR的库函数使用范例 … 查看全部问答> |
|
双单片机主从并行通信接口,两块单片机分别采用AT89C51和AT89C2052。 以AT89C51单片机作为主单片机,通过四根控制信号线和八根数据线连接。 主机工作流程: 1.主发从收方式的工作流程如下:(1)主机设置数据传送方法控制位DIR为0,以表示主机有 ...… 查看全部问答> |
|
本人菜鸟,手头有st7781驱动芯片+TFT显示模块,已经能用contex M3在上面画图。 但是想做个视频播放,就是不知道该怎么设置st7781.我想肯定不能像画图一样把每一帧视频都画到屏上。 所以跪求对TTF应用比较厉害大侠传授点方法,或介绍点资料也行。: ...… 查看全部问答> |
|
0 引 言 心率是人体中一个非常重要的生命信息,而传统的脉诊由于其定性化和主观性影响了心率测试的精度,成为中医脉诊应用、发展和交流中的制约因素。为了提高对此类生物医学信号的测试精度,必须结合现代科学技术。目前用于检测心率的仪器很多 ...… 查看全部问答> |
|
请教:wince流接口驱动DllEntry不停被调用,不断加载卸载线程 各位大侠,本人目前intel270的硬件,跑wince5.0,目前在写流接口驱动的时候发现线程不断的被加载和卸载,即使使用一个与硬件无关的最简单的流接口驱动,情况也是如此。 OOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved) ...… 查看全部问答> |
|
宝贝交换!希望以全新的TI M3开发板换STM32仿真器和开发板! 宝贝交换!希望以全新的TI M3开发板换STM32仿真器和开发板!手头有一个TI的LM3S8962 以太网+CAN 开发板,板载仿真器,有以太网口、OLED图像显示器等资源,但是我想学STM32,所以希望用手上的开发套件换一套J-link仿真器和STM32开发板,简单能用就行 ...… 查看全部问答> |
|
请教一下大家,用什么办法能把一个六位的整数的各个位提取出来放到数组里,比如六位数246358,要把各个位2、4、6、3、5、8放到数组中去,算法里不要有乘法、除法和求余运算,430算乘除慢的吓人。硬件乘法器不能算除法和小数乘除。… 查看全部问答> |
|
用蓝色LED焊了个8*24的点阵屏,用MSP430G2452来驱动74HC595来做显示 目前2452在CCS下DEBUG有问题,先用2231验证下硬件有没有问题。 如果2452可以了就用哪个触摸板做按键使用!… 查看全部问答> |




