姓名:刘哲宁
学号:16020520053
【嵌牛导读】:本文章介绍了封装驱动或者抽象API的前期分析方法,API的命名规则,以及实现API的时候需要注意的地方。对于初入嵌入式行业的来说,能对封装API这项工作有整体把握,掌握实现方法,编程注意事项也有利于提高自身的编码质量。同时也是对我工作的一个总结。
【嵌牛鼻子】:封装API,嵌入式
【嵌牛提问】:使用对象分析
首先强调一点,封装API是一个复杂性和综合性都较强的工作,不是一蹴而就。可能一些人会说,这有啥复杂的,不就是把功能包装一下,加几个参数完事。其实不然,一组API,应该能应对各种使用情况,应该是安全、高效、易使用的,也应该有统一的标准。
一个基本原则是处在使用者的角度出发,结合自身的特点,来分析这些问题。在对一个驱动或者某些功能封装API的时候,应该先做丰富的调查和举例,然后才开始后续工作。调查从功能本身出发,向你的下游(提供者)和上游(使用者)拓展,归纳出使用方法、使用方式和限制。
【嵌牛正文】:第一步是需要搞清楚你能使用的资源,即你的提供者的提供有那些功能和数据;
第二步是对你的调用者进行分析,他们的常用使用方法、使用步骤,以及是否有特殊需求等等;
第三步即对一二步的内容进行归纳总结,需要得出功能、用法和要求3个方面的内容。
功能:需要封装的接口能实现哪些功能,各个功能之间有何调用关系;用法:接口怎么使用,是同步还是异步调用,是否需要记录错误信息;要求:使用这组接口的要求,是否需要其他组件配合,是否有速率的限制等等。
所有这些调查工作最好是能把提供者和使用者召集起来一起开会讨论,他们各自表述自己的功能和需求。但是这种情况比较难以实现,那么你至少应该把归纳出来的情况让有经验的人士来review。
完成这些工作后,应该对要定义的API有了初步的概念,即应该定义哪些接口,接口间的调用关系等等。如果有机会porting,那你是幸运的。当然也要注意修改不合理的地方。
抽象接口
抽象接口要有统一的标准,要保证一组API只做一类工作。一般来说,每组API均有共性,是有章可循的。这里介绍一种从功能角度来分类的抽象接口框架,包括:资源管理、状态控制和数据传输。
资源管理,一般来说这类接口主要是完成入口和出口的资源分配和管理,比如:入口的工作,会创建对象,初始化变量,申请资源,句柄注册等;出口的工作会有对象删除,资源回收,句柄删除等,所以这一类接口可以用以下的关键字来表述:initialize/uninitialized, register/ unregister,open/close等。
状态控制,一般用于控制进程和状态维护。常用:start、stop、suspend、resume、sleep等。
数据传输:get/set data,send/receive data,get/set status等。
这个框架能应对大部分设计。分析完设计对象的功能后,就可以按功能归入对应框架。还有一点不要忽略,就是抽象接口函数参数不能太多,因为过多的参数不仅会增加调用时间,浪费资源,同时还很不方便使用。接口函数还要避免值传递,对于小型嵌入式系统来说尤为重要。
API命名
这个涉及到code rule ,每个公司都有自己的规定,就不多说了。但是应该把握的基本思想是API名称意思明确,没有歧义,参数顺序合理,形参名称直观易懂。应该避免的是简单的命名如write/read,因为这不仅让使用者困惑,在多个接口的使用还容易产生冲突。C++中有namespace的区分,也要避免使用简单的命名来污染命名空间。
接口实装
写程序的环节,是攻城狮最喜欢的,因为这是相对简单和纯粹的事情。主要就是代码质量,关于代码质量的书籍很多,这里也不累述。提一些注意点:
参数合理性判断,以及对于非法值处理。
接口函数线程安全,以及接口的重入性。
使用的资源管理,申请的内存,打开的文件句柄,等都要正确释放。
异常处理。
接口函数尽量避免值传递。
是否越界。