迈向嵌入式系统的自诊断API
随着嵌入式系统需求的增长和开发周期的缩小,开发人员越来越多地集成商业应用程序编程接口(API)或软件工具的功能集合发布者提供在应用程序中使用该工具的功能。程序员选择这些预先构建的库,而不是手动编写所需的功能。常见示例是通信,消息传递,数据库和用户界面库。这些“中间件”API在便利性,可移植性,生产力和上市时间方面提供了诸多益处。但是,这些库通常还存在引入破坏性和极难发现的编程错误的风险。这种风险源于商业API的实施方式。包含API的软件功能几乎总是数据结构无知。通过使用void指针在API库和应用程序之间传递数据,他们处理数据而不“知道”他们运行的数据类型。
然而,创建API的潜力它捕获了更广泛的编程错误,并减少了API学习曲线的启动,内置于C ++和C语言中。通过利用每个ANSI C/C ++编译器的函数参数类型检查能力,可以创建一个数据感知的编程接口,从而实现自诊断。 C/C ++作为首选的嵌入式系统开发环境不断发展,因此基于环境固有功能的任何改进都具有广泛的适用性。
数据管理通常是核心应用程序需求,以及许多商业数据库API在解决嵌入式系统的性能和占用空间要求的同时,我们已经开始满足这一需求。
从历史上看,数据库SDK已经为数据库提供的服务提供了预定义的静态编程接口。对于嵌入式系统,这些API中的大多数都是导航的,具有排序,存储和检索数据的功能,同时一次浏览数据库的内容。开发人员必须学习这样一个数据库来完成一项任务,一般都是积极的,或者至少是中立的:虽然API提供了一个可以增加项目时间的学习曲线,但这种记忆在未来的项目中可能会有用。人们普遍期望这个API几乎可以处理任何类型和组织的数据。
然而,一个重要的缺点是,对于预定义的数据库函数库来说,能够管理任何数据库定义的数据,接口必须忽略所有数据的类型。换句话说,数据库编程接口必须将数据视为不透明或未键入的数据。简单来说,数据库库无法知道公司,人员,网络节点,传感器,高速公路或任何其他特定类型的信息是从数据库读取还是写入数据库。编程接口只能知道正在写入一些数据。
为了实现这一点,所有这些数据库都使用void指针在数据库库和应用程序之间传递数据。 void指针是一个C/C ++语言程序变量,可以合法地指向任何类型的数据。无效指针是什么叫做un-typed?正如其名称所暗示的那样,它没有类型。
没有类型,C/C ++编译器和数据库运行时都不能对它们执行任何验证。这开启了编程错误的可能性,这些错误源于将指针传递给错误类型的数据。这种错误的后果包括数据库中的无意义数据到损坏的(不可用的)数据库到崩溃的程序。
编写函数参数时出错的结果将导致数据库运行时放置将数据放入数据库中不适合的位置(例如,将数据放入数据库为模型数据指定的位置)。充其量,这会导致乱码存储在数据库中。更糟糕的是,数据库运行时可能会尝试超出程序堆栈的末尾并导致内存冲突(即崩溃)。
从数据库中读取数据会带来其他风险。尝试将N字节宽的数据读入一个小于N字节宽的程序变量将导致数据库覆盖内存中的随机位置。关键数据可能会被覆盖(例如程序调用堆栈),从而导致崩溃。重写数据库运行时结构也可能会被覆盖并导致数据库损坏。
引入错误有多容易?实际上,通过切割和粘贴代码块的省力实践,这种错误很快就会进入代码。任何与void指针相关的编辑错误,无论是传递指向错误主机程序变量的指针,还是传递指向已分配不足内存的指针,编译器或中间件都无法检测到。无论错误类型如何,使用void指针传递数据条C/C +编译器和中间件运行时它们检测错误的能力。纠正这些类型的错误的努力从最小到最大不等。
自我诊断API
创建更好的数据库API的潜力?一个捕获这样的编程错误,并减少API学习曲线启动?自从80年代首次将函数原型引入C和C ++以来,已经存在:通过利用每个ANSI C/C ++编译器的函数参数类型检查能力,创建一个数据感知的编程接口,从而实现自诊断。/p>
函数原型是函数的“签名”。函数原型声明函数的名称,函数的参数(参数)数,每个参数的数据类型以及函数返回值的数据类型。如果函数的实际使用与其签名不匹配,编译器将发出错误消息,并且必须先纠正违规代码,然后才能成功编译程序。
利用现代ANSI C/C ++编译器的函数原型设计功能要求我们放弃旧的想法,即数据库编程接口必须是程序员学习的静态函数库,然后应用于每个可能的数据库设计。相反,编程接口必须特定于每个数据库设计,因此了解每个特定数据库的数据类型。换句话说,填充模型记录以强制要求程序员传递模型信息的数据库函数的唯一方法是,该接口是从模型所参与的数据库设计派生的,也是特定的。
McObject的eXtremeDB是一种用于嵌入式系统的内存数据库系统(IMDS),它展示了如何将自诊断API应用于嵌入式系统中间件。 eXtremeDB有一个用于通用任务的小型静态API(打开并建立与数据库的连接,开始和结束事务等)。但是,大多数接口??关于填充,搜索和读取数据库定义中动态生成的数据的部分。
eXtremeDB数据库用户使用输入到文本文件中的eXtremeDB数据库定义语言(DDL)来描述数据库。编译器mcocomp处理此DDL,验证其语法,如果没有错误,则生成开发人员在其应用程序项目中包含的 .c和 .h文件。 .c和.h文件定义该唯一数据库的编程接口。
在生成的文件中有函数原型(.h文件)和实现(.c文件)创建,搜索和读取由数据库设计者定义的每种类型的类和索引。每个接口都是针对特定数据元素和操作的特定用途的;因此,在接口定义中考虑了元素的类型。
eXtremeDB还建立在利用ANSI C函数原型的基础上,提供了包含大量(和可配置)运行的数据库库的开发人员版本-time检查函数原型无法检测到的其他类型的编程错误,例如尝试使用事务范围之外的对象的句柄,或者使用无效的事务句柄。
直观的界面可以在项目的开始阶段提高程序员的工作效率,并延长软件的使用寿命。与基于模糊静态编程接口的非描述性代码相比,进入项目的维护程序员发现阅读和理解函数要容易得多。
为每个项目出现一个新界面,非常简单的规则管理它的产生和使用。掌握生成和使用此类API的基础知识可以提供比学习静态中间件API的100到250个功能更强大,更灵活的“生活工具”。
作者:Steven T. Graves,总裁兼首席执行官,McObject LLC,Issaquah,WA
审核编辑 黄宇
-
嵌入式
+关注
关注
5082文章
19111浏览量
304878 -
嵌入式系统
+关注
关注
41文章
3587浏览量
129441 -
API
+关注
关注
2文章
1499浏览量
61975 -
数据库
+关注
关注
7文章
3795浏览量
64367
发布评论请先 登录
相关推荐
评论