1.2. 数据位宽 再谈谈数据类型长度的问题,笔者认为,这是C语言的一个缺陷,它只定义了数据类型的名字,却没有明确它的数据长度。C语言的数据长度,可笑得很,它不是由标准定义的,而是由编译器设计者定义的,他们从自己的喜好以及方便实现的角度去定义。结果是,同一个类型,在不同的机器上,或者机器但编译器不同,事件类型的长度是不一样的。例如: 1、 int类型的长度依机器字长而定,甚至出现过26位长度的int类型。 2、 同是在x86下面,int类型用turbo c编译时16位的,而用VC编译却是32位的。 3、 Char类型按有符号还是无符号处理,由编译器说了算。 嵌入式软件运行环境五花八门,其数据长度不一致的情况,较台式机更严重。因此,要编写可移植的嵌入式软件,就不能使用c语言定义的原始类型,而是要用定长的类型。Djyos在stdin.h文件中,定义了一系列的长度和符号都确定的类型,略举几个如下: u32:无符号32位整数 s32:有符号32位整数 vu32:易失性的无符号32位整数 vs32:易失性的有符号32位整数 另外,还定义了一些跟CPU字长有关的常数和变量,例如在32位机上,有如下定义: #define cn_cpu_bits 32 //处理器字长 #define cn_ptr_bits 32 //CPU地址位宽 #define cn_cpu_bits_suffix_zero 5 //cpu字长后缀0个数,比如32=0b0100000,后缀5个0 #define cn_byte_bits 8 //字节位宽 应用程序中跟cpu字长相关的代码中,使用这些常量,那么在不同字长的cpu之间移植程序时,只要修改这些常量定义就可以了。关于这些常量的使用方法,可在共享的djyos源码中搜索这些符号。 定义了ptu32_t这个数据类型,表示一个无符号整数,如果指针长度大于32,则等于指针长度,如果指针长度小于等于32,其长度为32。在所有可能作为指针使用的地方,都使用这个类型的话,那么,你在32位机上开发的软件,移植到64位机时,无须做任何修改。有许多程序员、甚至是相当有经验的程序员,都爱把32位数强制转换为指针,或者把指针强制转换为32位数进行运算。这种程序,移植到16位或者64位机上时,就要做大量的修改。 定义了ucpu_t和scpu_t类型,该类型分别是与cpu字长等长的有符号和无符号整数,这种数据的读或写操作是天然的原子操作,注意,是读或者写,不是读修改写。对于A模块只读、B模块只写的数据,这种数据典型地可以用来传递状态量,这种场合,可以不用信号量保护。 编写djyos应用程序,强烈建议使用djyos定义的数据类型,这样可以确保你的应用程序在运行djyos的各种硬件平台上,是可移植的。
[ 本帖最后由 djyos 于 2012-8-10 22:39 编辑 ]
|