微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 规范化和模块化编程

规范化和模块化编程

时间:08-13 来源:互联网 点击:

0 引言

通过一年多的编程经历,经常会为杂乱无章的程序弄的晕头转向,影响编程质量和进度。同时也为了程序的可移植性和可读性,规范化和模块化编程应该在开始编写的第一个程序时就要有规范化和模块化编程的思想,并在实践中运用,养成规范化和模块化编程的好习惯。

1 规范化编程

谈到规范性编程这里我们是在符合c语言基本运用原理的基础上加以说明,以下我们主要讲以下几个方面:
1.1 定义一个自己config.h文件

首先我把我使用的config文件列出:
typedef signed char S8;
typedef signed int S16;
typedef signed long S32;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef volatile signed char vS8;
typedef volatile signed int vS16;
typedef volatile signed long vS32;
typedef volatile unsigned char vu8;
typedef volatile unsigned int vu16;
typedef volatile unsigned long vu32;
typedef const u8 FLASH;
typedef enum{FALSE=0,TRUE=!FALSE} BOOL;

为什么要定义一个自己的这样一个文件,主要有两个原因:

1节约编程时间

2更高的可移植性

同样也是为本工程形成一种规范,这是一种局部规范,读者可以定义一个适合自己的config文件。

1.2 变量名的选取

首先要知道变量名的组成成分:字母,下划线,数字;而且要注意的是数字不能作为开头,并且字母区分大小写,下划线主要的功能用于分隔两个有意义的单词或者是区别形参和实参等用途。

其次就是怎么正确选择的问题了,在开始编程时大家都可能喜欢用a,b,c等简单字母作为变量名,这样只是单纯的定义了一个变量,读者并不能从中获取很多信息量,比如这个变量的用途等。所以为了能表达的更准确并能获得更多的信息量,应该选取有意义的英文单词或者中文拼音,可以用下划线作为单词之间,也可使用首字母大写区分,具体可根据个人编程习惯。

例:取一个关于定时器定时计数的变量,可以有以下几种模式(仅供参考):

1U16 TimerCounter;

2U16 timer_counter;

这样选取的变量名不仅达到了有意义的要求,而且更美观。从接触C到开始编程就要养成一个良好的习惯,选取变量名是往往程序首先要做的事,所以变量名的选取也是规范化编程的第一步,很关键。

1.3 与硬件资源相关用define去定义

在说明这个问题之前,我们先看个例子:

#include reg51.h>
#include "config.h"
sbit led = P0^0;
void fun1(void);
void delay(void);
void main(void)
{
while(1)
{
delay();
fun1();
delay();
}
}
void fun1(void)
{
U8 i;
U8 temp = 0xfe;
led = 0;
for(i=0;i8;i++)
{
P1 = temp;
temp = temp 1;
delay();
}
led = 1;
}
void delay(void)
{
U8 i,j;
for(i=0;i200;i++)
{
for(j=0;i200;j++);
}
}
为了能形成对比,我们再看运用规范化编程原理的程序:
#include reg51.h>
#include "config.h"
sbit led = P0^0;
#define Led_On led = 0
#define Led_Off led = 1
#define LedCyclePort P1
void Soft_DealyTimer(void);
void LedCycleProc(void);
void main(void)
{
while(1)
{
Soft_DealyTimer();
LedCycleProc();
Soft_DealyTimer();
}
}
void LedCycleProc(void)
{
U8 i;
U8 temp = 0xfe;
Led_On;
for(i=0;i8;i++)
{
LedCyclePort = temp;
temp = temp 1;
Soft_DealyTimer();
}
Led_Off;
}
void Soft_DealyTimer(void)
{
U8 i,j;
for(i=0;i200;i++)
{
for(j=0;i200;j++);
}
}

通过以上两个程序我们可以看出来具体区别是什么,程序中没有了类似于P1这种标识,而是巧妙的利用define定义P1,以及函数名的修改,都是为了体现有意义和可移植性的要求。以上只是一个很简单有关于define这个关键字的用法,巧妙运用能使程序的可读性和可移植性大大增强,也是规范性编程不可或缺的关键因素。
1.4 合理选取变量的数据类型,防止掉入C陷进

在说明之前先看一个简单的例子:
#include reg51.h>
#include "config.h"
sbit led = P0^0;
#define Led_On led = 0
#define Led_Off led = 1
void Soft_DealyTimer(void);
void main(void)
{
while(1)
{
Led_On;
Soft_DealyTimer();
Led_Off;
Soft_DealyTimer();
}
}
void Soft_DealyTimer(void)
{
U8 i,j;
for(i=0;i=256;i++)
{
for(j=0;i=200;j++);
}
}
初看觉得没什么问题,可是当你下载到MCU运行时,你会发现灯永远是亮的,不会熄灭,为什么呢?我们来分析一下,灯亮说明至少运行到了while(1)中的Led_On语句,说明应该问题就出在软件延时函数,细看我们发现i的取值大了,因为U8 i的范围是0~255,虽然我们知道unsigned char 是无符号8位,28值是256,但是要注意的是单片机初始值都是从0开始的,所以要注意这些细节问题。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top