单片机/MCU论坛
直播中

初代

11年用户 16经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 EMC/EMI设计 光电显示 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[问答]

如何去提高程序的可移植性?求高手指导。

在使用msp430芯片时,程序的移植变得尤为重要,可是本人的程序总是
不能做到随意移植,想请各位大神请教一下,在编程中要注意哪些问题,可以
提高自己程序的移植性呢?望大家不吝赐教,谢谢大家!

回帖(9)

wywz2012

2014-7-20 11:05:48
多写点结构体函数
举报

初代

2014-7-20 11:10:52
引用: wywz2012 发表于 2014-7-20 11:05
多写点结构体函数

比如呢?能不能举个简单的例子说明一下?
举报

阿信509

2014-7-21 09:21:48
模块化编程,别用底层调用
举报

1563661808

2014-7-21 16:58:51
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

爱吃果冻

2014-7-21 16:59:05
1) 写程序请一定要考虑到你今后可能换个编译器。所以请使用预定义宏!比如MS的编译器就事先定义了__MSC,而Borland的就预先定义了__BORLAND_C。Sunplus GCC编译器也肯定有这样的宏。举个例子:setvect函数在Borland的实现中就叫setvect,而MS C/C++中却是_dos_setvet。如果你仅仅是简单的用setvect,那你的程序就很可能失去了移植到MS C下的可能。不过如果你这么写:

#if  defined(  __MSC  )

    _dos_setvect( 0x09,  禁止发广告_timer_handler ) ;

#else

#if  defined( __BORLAND_C  )

    setvect( 0x09,  禁止发广告_timer_handler ) ;

#endif

#error Error ! Need MSC or Borland C to compile this programe !

#endif

上面的代码就有很好的可移植性。并且可以在MS和BORLAND的编译器下都正确的工作,并且还能检测出如果的你编译器不是这两种的话,还能给个错误信息并终止编译。这个程序的可移植性很好。

2) 内存对齐与字节序。大多数的不可移植问题似乎都来自内存对齐,所以要避免写出需要内存对齐的或者对字节序有特殊要求的程序。

3) 使用标准的C语言。给大家再介绍一个预定义宏,可以用来检测你的C语言编译器是不是一个标准C编译器:

#if  defined( __STDC__ )

// This is a standerd ANSI C compiler

#else

// This is not a standerd C compiler, perhaps K&R C ???

#endif

3) 永远不要使用位域(bit fields)。虽然C支持在结构内申明位,比如:

int ch : 1 ;

但那往往带来的后果就是你的代码成了architecture specific code。也就是说,完全丧失了可移植性。

4) 不要直接使用int。int是魔鬼!在16位系统上,sizeof(int)是2,在32位系统上,却是4。一些依赖于int长度的程序将无法移植,我建议写下面的宏:

#if defined( CPU16 )

typedef  int SWORD ;

typedef unsigned int UWORD ;

#else

...

...

#endif

如果觉得这样麻烦,那就用short,它在十六位和三十二位系统上都是2个字节长。
举报

cunyipeng

2014-7-21 20:19:14
多写结构体语言
举报

初代

2014-8-4 10:53:34
引用: 1563661808 发表于 2014-7-21 16:58
1) 写程序请一定要考虑到你今后可能换个编译器。所以请使用预定义宏!比如MS的编译器就事先定义了__MSC, ...

哈哈,多谢啦~
举报

1563661808

2014-8-4 11:43:28
引用: 初代 发表于 2014-8-4 10:53
哈哈,多谢啦~

不客气  

举报

十点十分

2014-8-4 12:52:52
直接写成子函数,用的时候调用就行了……方便简单
举报

更多回帖

发帖
×
20
完善资料,
赚取积分