分享:C语言模块化的一点心得

2020-02-20 20:25发布

其实刚参加工作的时候,老大就告诉我们,做程序要模块化,然后一直以来对这个概念比较模糊,因为从硬件入手进入编程领域的同学,基本和我差不多,都是一点一点自己在摸索,一点一点进步。直到2010年,当时要学一点OS,在Linux里面才学到那么一点点意思!昨天浪里白条问我一个问题,所以我就想写写自己的心得出来给大家参考!

我的理解,模块化的主要意义在于模块分离。有一种情况是移植,比如说我做了一个模块,可能要在不同的程序中应用,但是在此模块中可能会调用别的模块的变量、函数、参数等等,这样的话用的时候就需要对模块进行工作量大小不一的修改。那么有什么好办法可以不用修改模块呢?在这里,我用指针,用指针的好处是可以将模块与其它模块完全脱离,像上次老白说的,说GSM模块中有调用UART模块中的函数。这种情况就是在GSM模块中定义一个函数指针,然后在初始化的时候将UART模块中的函数赋值给它,这就造成一个假像,此函数属于GSM模块了,用的时候调用的是GSM模块本身的变量。这样的好处是下次GSM模块需要调用SPI模块同样功能的函数,那么我只要在初始化的时候将SPI模块的该函数赋值给GSM模块的函数指针就可以了。为了防止该指针在没有被赋值的情况下被调用,我们在调用之前需要先判断一下该指针是否为空,这样就不会造成野指针的出现!以上是一个以函数为代表说明一下分离,其它的都差不多,比如变量什么的,都可以用指针在本模块中做一个虚拟值,就像我们做硬件模块,以前都是直接把线焊到一起的,分离的时候很麻烦,现在我用了一个插座,呵呵,那分离就简单多了,指针就是我们的插座,只要在初始化的时候把各个插座对接上,那么就可以应用了!

另外还有一种情况,在同一个程序中重复调用。我还用刚才GSM模块说明,比如现在我需要两个GSM模块功能,但是这两个可能在同一段时间内都要被调用,那么可能我在任务1中调用GSM模块的时候任务2也需要调用,所以这时候GSM模块中的一些公用参数就会产生冲突。这时候又该怎么办呢?我的做法是用结构体,我将所有公共参数都包含到一个结构体里面去,然后在该模块初始化的时候申请一块结构体大小的内存,作为当前模块的共用参数的保存。只要记住起始指针就可以了。这样我就不怕他重复调用了,程序还是原来的程序,只是两个任务调用的时候所操作的数据区完全不同了,也不会影响到别的调用!

其实这大概就是面向对像的原理!像我前几天发的一个代码生成的帖子中的那个小工具,就是基于这个原理做出来的。

例子没有,欢迎讨论!

最后祝大家工作顺利!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
cn_x
1楼-- · 2020-02-23 10:36
wangpengcheng 发表于 2014-9-2 15:48
话说我一开始就想弄个塔式板玩,呵呵,只是现在路子变了,可能到时候拿到后得先放一段时间了! ...

我没想过拿塔式 ,就是6000和3000的板子迟迟不出,悬着,也就不停往前冲了
wangpengcheng
2楼-- · 2020-02-23 14:49
浪里白条 发表于 2014-9-2 15:51
又被你调侃了。

大家都觉得了,哈哈!
cn_x
3楼-- · 2020-02-23 15:39
wangpengcheng 发表于 2014-9-2 15:55
呵呵,有时候感觉换工作多了不好,但又有时候感觉在同一家公司到一定程度后技术上就不会再有什么进步了! ...

没辙啊
之前做太阳能设备赶上了双反,从朝阳行业一下打入冷宫
在这个行业难混啊
wangpengcheng
4楼-- · 2020-02-23 18:50
 精彩回答 2  元偷偷看……
Lengxue
5楼-- · 2020-02-24 00:13
对结构体和指针还不是很熟悉
但是本着软件和硬件设计思想一样的原则 用硬件设计思想来理解
在硬件中也要注重模块化的设计思想,比如我设计了一个MP3模块,我把它画成一个子图(相当于程序中的.c文件)和一个顶层原理图(相当于程序中的.h文件),那么我要调用的时候只需把顶层的接口连接即可,这样在不同的处理器之间移植的话就很容易而且出错的可能性也会降低
cn_x
6楼-- · 2020-02-24 04:15
wangpengcheng 发表于 2014-9-2 15:56
冲吧,没事,以目前的进度来看,TOWER是没什么问题了,IPAD咱就不想了,哈哈! ...

IPAD mini有一个哈,平时也就看看电影
看看PDF什么的,后悔当初没买3G版的,好歹还能用来导航

一周热门 更多>