了解可移植类型

编写嵌入式软件的独特挑战之一是,它要求程序员不仅了解硬件的微小细节,而且还要了解他们用来使硬件活跃起来的编程语言。有时,最简单的概念要比人们可能想像的要复杂得多。在理解C语言中的基本变量类型时尤其如此。

 

每个程序员都熟悉char,integer,long等常见的变量类型。许多编程语言都包含这些变量类型,但它们不一定代表语言之间相同的物理内存空间。实际上,在C编程的嵌入式世界中,用于存储整数的字节数将取决于编译器和目标平台!任何新的开发人员都可能认为肯定不是这种情况,而是看看图1中三个不同的嵌入式微控制器的实验结果。

 

便携式F1

图1 –使用Sizeof()获取存储每种数据类型的字节数

这不仅对软件与内存映射设备的接口方式有非常实际的影响,而且还会影响软件中计算和其他功能的性能。这也使得几乎不可能将代码从一个平台移植到另一个平台,而没有机会让错误像兔子一样繁殖!这使得编写可重用的代码非常困难,但是值得庆幸的是,从ISO C99开始,开发人员可以解决可移植性问题。

 

ISO C99标准通过名为stdint.h的头文件引入了可移植数据类型。该头文件包含在编译器中,并创建固定宽度的数据类型。固定宽度的数据类型可确保8位变量为8位,16位变量为16位,依此类推。这样可以确保使用这些数据类型的C代码从一个平台到另一个平台的宽度相同!在图2中可以看到一个示例,其中显示了一些常见的有符号和无符号整数值。

 

便携式F2

图2 –普通整数类型

这些只是stdint.h中定义的变量类型的几个示例。强烈建议任何开发人员花一些时间检查此标头。有一些非常有用的宏可用于获取数据类型可以存储的最小值和最大值。这对于初始化变量以及代码中的边界检查非常有用。甚至还有类型定义,例如int_fast8_t,它被定义为最快的8位有符号整数类型。甚至还定义了至少具有一定宽度的类型,例如uint_least16_t。

 

如果您仍在使用内置的编译器变量类型char,int,long等,那么这是检查stdint.h并开始编写可以编写一次并从此移植的代码的好时机。请记住,此标头内置在C99中,如果使用的编译器不是C99或更高版本,则可能有必要构建自己的stdint.h版本。从长远来看,绝对值得一试!

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.