用C编写可移植和可重用的软件正迅速成为嵌入式软件领域的一项重要活动。但是可移植的C代码不是偶然发生的,它需要意图和深谋远虑。嵌入式开发人员可以遵循七个技巧来帮助确保他们的软件更适合移植。
技巧1——使用模块级API
定义一个模块级API对于C代码是否可移植至关重要。模块级API定义了模块做什么以及它的输入和输出是什么。
技巧2——最小化模块耦合
移植代码时,没有什么比试图引入紧密耦合的代码更痛苦的了。紧密耦合的代码非常棒,因为它对外部C模块的依赖性很小。然而,耦合度越大,新代码中需要包含的模块就越多,结果,这个过程就越长,越痛苦。紧密耦合的代码也会导致ROM膨胀,因为不必要的代码会随必要的代码一起出现。着眼于可移植和可重用代码的开发人员应该尽量减少代码对外部模块的依赖。
技巧3——封装
面向对象设计的关键概念之一是封装。封装可以理解为信息隐藏,其思想是,模块开发人员应该只公开外部用户访问模块行为所需的变量和函数,其他的一切都应该隐藏起来。C 中最好的封装方式是大量使用关键字 static。默认情况下,函数和变量是隐式的 extern。为了帮助隐藏内部函数和变量,嵌入式开发人员可以使用静态说明符来限制它们的范围并从本质上隐藏数据。
技巧4——使用ANSI-C
许多编译器都有内部特性或扩展旨在通过提供未在 ANSI-C 标准中定义的功能来帮助开发人员使用这些功能(其中许多使用 #pragma )的问题在于它们是特定于编译器的。试图从一个编译器转移到下一个编译器会导致编译器错误和潜在的软件错误,这取决于所使用的附加功能。对可移植和可重用代码感兴趣的开发人员应该限制自己使用 ANSI-C 甚至严格的 ANSI-C 编译。
技巧5——定义一个C风格的指南
在开发可移植代码时,C风格指南的使用似乎并不重要。毕竟,开发人员永远不知道代码是否会被重用,如果是,代码可能会被移植到一个风格完全不同的代码库中。此外,公司C风格指南往往会随着时间的推移和员工的更替而演变。但是使用风格指南的全部意义,即使将来会有所不同,是为了确保代码至少遵循一个共同的约定。这种约定将使代码更容易被未来的嵌入式开发人员阅读和理解,他们的任务是在新项目中导入代码。
技巧6——很好地记录代码
在理想的情况下,所有代码文档中至少会包含五个不同的方面。第一个是一个基本的需求文档,定义模块首先应该做什么。其次,应该有设计文档和代码模型来演示它是如何工作的。第三,应该提供原始开发人员关于实现的代码如何工作的想法和假设。第四是关键参数和算法细节的列表,以及在移植或修改软件时可能出现故障的关键区域。最后,实际的 C 代码后面应该有实际的代码注释。一个额外的好处是收到模块级单元测试的文档,它们是如何执行的,以及任何相关的结果。
技巧 7——避免位字段领域
仅仅因为一个特性存在于C语言中,并不意味着它可以很容易地在编译器之间移植。C标准有一些模糊的地方,编译器供应商可以选择如何实现标准。这些模糊的领域中最广为人知的可能是位字段领域。编译器有权决定位的排序位置,甚至最终位字段的字节顺序。
理论上,位字段是可以移植的,但这实际上取决于程序员打算如何使用它们。使用位操作或掩码访问该字段会导致两个不同编译器之间完全意外的行为。因此,开发人员应该确保他们完全理解C标准中的漏洞以及如何保护他们的代码。
结论
在当今快节奏的开发环境中,开发可移植和可重用的C代码正迅速成为每个嵌入式开发团队的必须。这里介绍的七个技巧只是冰山一角。
发表评论 取消回复