专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
如何去提高程序的可移植性?求高手指导。
2019-07-15 19:07
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
1681
9
1233
在使用msp430
芯片
时,程序的移植变得尤为重要,可是本人的程序总是
不能做到随意移植,想请各位大神请教一下,在编程中要注意哪些问题,可以
提高自己程序的移植性呢?望大家不吝赐教,谢谢大家!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
wywz2012
1楼-- · 2019-07-15 23:01
多写点结构体函数
加载中...
初代
2楼-- · 2019-07-16 03:42
精彩回答 2 元偷偷看……
加载中...
阿信509
3楼-- · 2019-07-16 04:34
模块化编程,别用底层调用
加载中...
1563661808
4楼-- · 2019-07-16 07:06
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个字节长。
加载中...
爱吃果冻
5楼-- · 2019-07-16 12:00
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
6楼-- · 2019-07-16 12:39
多写结构体语言
加载中...
1
2
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#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个字节长。
#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个字节长。
一周热门 更多>