3152|0

37

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

djyos的可移植性(三) [复制链接]

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


[ 本帖最后由 djyos 于 2012-8-10 22:39 编辑 ]
点赞 关注
个人签名坚持就是胜利,希望大家多多支持,http://www.djyos.com
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表