原创 keil_C51模块化思想

2008-5-25 18:19 3293 10 10 分类: 软件与OS

前言:使大项目得以有条不紊的开发,一步一步的做,不知不觉的就做好了,看每个小单元都是不起眼的小程序,每一个都不值得骄傲的,但总体看来,大项目出来了,成果很巨大,自己很激动,这时才悟出大项目原来是这样炼成的。


本文也适用于 mplab  icc 等别的单片机的编程,但由于IDE环境的差别和编译器的不通,有些地方还应该改动,但基本思想是不变的,原理也是通用的。


首先抛开单片机不谈,简单的说一下C语言的模块化思想, 简而言之就是好多的 .C  .H  文件,通过对变量作用范围的定义,利用C中最经典的子函数概念,有效的将大系统分割成小模块,模块之间动过变量(经过范围定义处理的)、形参—实参对应、函数返回值等连接。一切井井有条。如果那个模块需要更换或者出了毛病或者要全部修改或者全部删除,我们只要着重的处理一下该模块,而对于全局,稍微处理一下即可。这样就不会牵一发而动全身了。系统程序的兼容、维护、纠错能力都很强,固若金汤!


各个模块处理好了,直接编译,将各个.C 和.H文件编译连接,就出来hex执行文件了(C软件自己就能完成这个步骤,但是牛人用makefile技术来组织编译连接,在这里我就不说了,其实我也不会,不过对一般的项目和情况都用不着)。


在回到单片机,说说keil,keil对变量分类(按照生存周期和作用范围来分):


 


动态变量:只在某个特定函数中有意义,这个特定函数的生存周期就是这个动态变量的生存周期。将该函数调用结束后,动态变量的存储空间就被覆盖,即该动态变量的存储空间被释放了。


 


静态变量:只在某个特定函数中有意义,但静态变量的生存周期是永久的,即这个特定函数执行完,该静态变量不可被其它函数调用,该静态变量的意义失效了,但它的值保持不变(包含它的那个特定函数执行完后的值),直到那个特定函数再次调用,该静态变量才允许改变。静态变量的存储空间是不变的,永远被其独占。


 


上述动态变量、静态变量只是对我一般情况而言。其实它们还有“变种”,下面我会进行解释的。


 


公用变量(全局变量),在函数外定义的变量,生存周期是永久的,意义也是永久的。在定义它的这个.c或者.h文件中可以用,若在其它文件中调用,要先说明一下(不是定义),要在其前面加上 extern ,这样做的目的是告诉编译器在其它处查找变量而不分配存储空间,即存储空间已经由别的文件分配了。


 


下面在看一下静态变量的“变种”—静态公用变量(静态全局变量),在函数外定义的静态变量,(靠,杂交变量—自创,哈哈!),该变量有这静态变量和全局变量的特性,但不是完全继承,(总有点变异,嘿嘿!),静态全局变量仅在该文件中有意义,在其它文件中将不予识别。(靠,没护照!)


函数也有类似的,静态子函数、公用(全局)子函数、外部子函数;只要变量搞懂了化,对于函数以此类推,我就不说了。


   


下面给个表格,比较直观,仅供参考(如果光是看图是看不懂地,要静下心来研究各个变量的定义和特性)


 


动态变量   y()


{


  int x;


}


 


静态变量


          y()


          {


            static int x;


          }


   公用(全局)变量


             Int x;


 


外部变量


           extern int x;


 


静态全局变量


           static int x;


静态函数


          static y()


          {


               ;


}


公用(全局)函数


y()


{


              ;


}


外部函数                 (extern 省去了)


       y();

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条