打印

一线研发之声:嵌入式C编程经验 之 请写可移植性高的模块

[复制链接]
12300|73
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sedatefire|  楼主 | 2012-1-6 23:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sedatefire 于 2012-1-13 23:16 编辑

/**************************************************************************************
* Filename:一线研发之声:嵌入式C编程经验 之 请写可移植性高的模块
* Author:SedateFire E-mail:SedateFire@126.com
* Version:1.000 Time: 2012-01-05
* key: 嵌入式 可移植性 模块化 依赖
**************************************************************************************/

我想你或许有这样的经验,你要实现的一个模块同事已经实现了。老板发话说:你复用他的代码啊,半天给我搞定。于是你拷过来编译一下,几乎是必然的,会有error有warning,一看,哇,原来依赖了这么多外部的东东。于是你开始着手修改它,如果模块小,自然三两下搞定。如果是个大的模块要复用,一下弹出几百个编译错误报警,我想你边修改心里也边骂娘。

我*,这个蜂鸣器控制函数为何要去判断当前在作什么应用?!

我*,这么多缺失的include文件,没有拷过来吗?

我*,这个函数是什么东东,注释明显对不上,还判断赋值了一堆全局变量。

我*,这个if处理了,那else呢,哪里去了?这是什么跟什么啊。

我*,通通删掉干掉,自己加班偷偷重写好了。

什么!老板在催了,我*靠靠啊…

想必你有共鸣了......

那么如何实现可移植性高的代码呢,我就先写几点吧,有些晚了,准备睡觉了

1.擅用define。请把“裸露”的常量,用短小又信息准确的宏定义起来,务必全大写。常量的宏定义要大写,我会在后期关于代码规范的主题**分析。请把设备驱动的io,用define定义分离出来。当然,还有许多妙用,宏定义简直是移植旅行必备佳品。待我后期再整理下思路吧。

2.抽像出平台依赖严重的代码。比如访问一个特定mcu寄存器,开关中断,清狗指令,中断写法等等。

3.如果可以,我希望你的.c档中包含的.h档尽可能的少。这样在移植的时候,你只要看包含了那些.h档,你就知道该模块大概依赖了其他哪些模块。我知道,大多数的程序员都喜欢在.c档的文件头仅有一个
#include "includes.h"
而在includes.h 中包罗万象,这是原罪!当然,要一个萝卜一个坑地梳理清楚.c与.h档的关系,需要长期的工作经验,尤其在编译条件错综复杂时,操作起来的确痛苦且容易出错,但其实这已经预示了你系统架构的某种不合理。

如果没有足够的经验,那么我建议你,先在设备层的.c档尽量包含尽可能少的.h档。然后把设备层的.h档放在includes.h中,给应用层使用。

3. 打造自定义库,这个准备设专题讲解。

4. 通信数据统一是大端的,内部应用代码统一用数值说话,和大小端无关,不要乱糟糟的一片胡写蛮缠。少用union,发送数据时统一用单字节移位发出去,接收时用移位收进来。牺牲了效率,但提高了可移植性。在51中也许不大现实,但在未来M3的大趋势下,效率是可以牺牲的。

5.欲知后事如何,请听下回分解....
评分
参与人数 5威望 +14 收起 理由
448738516 + 1 很给力!
板砖横飞 + 1
McuPlayer + 10 满分,方法比技术更重要!
xyz549040622 + 1
john_lee + 1

查看全部评分

相关帖子

沙发
sedatefire|  楼主 | 2012-1-6 23:43 | 只看该作者
静待博客积分,嘻嘻

使用特权

评论回复
板凳
sedatefire|  楼主 | 2012-1-7 00:32 | 只看该作者
再灌水一下

使用特权

评论回复
地板
原野之狼| | 2012-1-7 00:37 | 只看该作者
请经常来21IC逛逛~:lol

使用特权

评论回复
5
ayb_ice| | 2012-1-7 08:25 | 只看该作者
底层的东西本身移植性就差,与硬件直接打交道多了

使用特权

评论回复
6
yewuyi| | 2012-1-7 10:36 | 只看该作者
什么事情都两面性,要想偏于移植那最好尽量分割小一点,但分割的太细了也是问题多多,所以移植也是建立在一些基本的约定和条件基础上的

使用特权

评论回复
7
Ryanhsiung| | 2012-1-7 13:07 | 只看该作者
这一点我很同意
  若不模块化,就会有太多不必要的工作

使用特权

评论回复
8
linfuchi| | 2012-1-7 14:39 | 只看该作者
支持

使用特权

评论回复
9
teddeng| | 2012-1-7 14:58 | 只看该作者
哎,一直以为,对于要解决的问题,代码是最不重要的。可惜,好的文档更是少得可怜。。

使用特权

评论回复
10
nongfuxu| | 2012-1-7 16:25 | 只看该作者
快过年了,好贴子也像知道快过年似的,接二连三啊.

使用特权

评论回复
11
nayaix| | 2012-1-7 17:28 | 只看该作者

使用特权

评论回复
12
智多芯| | 2012-1-7 21:35 | 只看该作者
工作了才真正了解到模块化的重要性,嘿嘿。MARK。

使用特权

评论回复
13
McuPlayer| | 2012-1-7 21:52 | 只看该作者
非常有价值的总结,希望早日看到后续的文字

使用特权

评论回复
14
highgear| | 2012-1-7 23:39 | 只看该作者
好帖,顶!

我最近所做的几个项目,都是在 visual c++下编译测试,同时源代码也在 dsp 平台上直接编译,在 emulator 以及simulator 上运行。这么做的好处是,那些复杂的算法和运算,在 pc 下调试很方便。

也贡献一点经验:
要想可移植性高,首先要有全局的观念,对几种平台的差异有清楚地认识了解,在设计之初,就时刻要把移植性考虑在内。其次,如楼主所说,可以使用macro, 统一调用接口等等手段隔离不通用的部分。

使用特权

评论回复
15
Cortex-M0| | 2012-1-8 05:56 | 只看该作者
好帖

使用特权

评论回复
16
HORSE7812| | 2012-1-8 10:55 | 只看该作者
牵着蚂蚁来逛21IC!

使用特权

评论回复
17
jiabin1024| | 2012-1-8 16:41 | 只看该作者
楼主继续!

使用特权

评论回复
18
1020472043zhu| | 2012-1-8 17:14 | 只看该作者
mark

使用特权

评论回复
19
victorgaopeiqi| | 2012-1-8 23:29 | 只看该作者
支持

使用特权

评论回复
20
红金龙吸味| | 2012-1-9 08:51 | 只看该作者
说的不错。在编写模块文件时候,一定要有可移植的概念,对于可能对移植产生影响的部分尽可能独立出来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4393

主题

5935

帖子

33

粉丝