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

规范化和模块化编程

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

有些人看了上面的例子会想,我都用long型或者int型就不是没有问题了吗?但是你这样的话就增大了MCU内存的开销,不利于程序快速运行,所以合理选择变量数据类型也是很重要的。
1.5 在结构体中按变量从小到大排列

先看个例子:
Struct
{
Int s; //占用第0和第1个字节
Char c1; //占用第2个字节,由于对其原因,第3个字节为空
Long l; //占用第4,5,6,7个共四个字节
Char c2; //占用第8个字节,第9个字节为空
}s;
由此可以看出浪费了2个字节空间,所以我们应该调整变量顺序,如下:
Struct
{
Int s; //占用第0和第1个字节
Char c1; //占用第2个字节
Char c2; //占用第3个字节
Long l; //占用第4,5,6,7个共四个字节
}s;
为什么会有上述情况出现,原因是结构体变量是字对齐,但是在有些单片机中可以软件设置为字节对齐,这样也可以解决上述问题,但是按顺序存放明显是规范性编程中的一员,一个好习惯不会因为疏忽造成内存开销增大。

2 模块化编程

为什么要模块化编程,主要原因当然也是可读性和可移植性。

模块化编程思路:

1分析系统项目功能模块,一般的系统可能有以下几个模块:最小系统模块(能让MCU工作的编程模块),键盘和显示模块(一般会用译码锁存器件,如智能调节仪所使用的是CH452),AD模块(采集传感器信号),继电器模块(控制一些器件工作,相当于开关),通讯模块(UART)等。

2将每个模块分别用.c和.h建立模块编程,.h文件用来存放模块相关资源定义,以及函数声明等功能,.c文件用于存放该模块功能程序代码。

3用main.c将各个模块串结成一个完整的系统,在main函数中代码要简洁,最好只有两三个函数,比如:
Void main(void)
{
System_Init();
While(1)
{
If(Key_Value)
Key_Handle();
else
System_Handle();
}
}
以上分析了模块化编程的基本思路,然后我们再来具体看个例子,以通讯模块为例:
先看.h文件:
#ifndef __uart_H
#define __uart_H

#include "config.h"
#define Buf_Max_Len 32
#define UART0_TX_ENABLE
#define UART0_TX_DISABLE
#define UART0_RX_ENABLE
#define UART0_RX_DISAbLE
typedef enum
{
Select_Uart0 = 0,
Select_Uart1
}UART_SelectTypeDef;

typedef enum
{
B9600_Freuency,
B2400_Freuency
}UART_CommMode;

typedef volatile struct
{
VU8 ReadIndex;
VU8 SendIndex;
VU8 CharCount;
VU8 Buffer[Buf_Max_Len];
}UART_TypeDef;

#endif
还有.c文件:
#include reg51.h>
#include "uart.h"
void UART_Init(UART_TypeDef *self,UART_SelectTypeDef in_sel,UART_CommMode in_mode)
{
switch(in_mode)//波特率设置
{
case B9600_Freuency:
// 相应设置代码
break;
case B2400_Freuency:
// 相应设置代码
break;
default:
break;
}
switch(in_sel)//串口选择0或1
{
case Select_Uart0:

break;
case Select_Uart1:

break;
default:break;
}
}
void Buffer_Init(UART_TypeDef *self)
{
self->ReadIndex = self->SendIndex = self->CharCount = 0;
}
void UART_SendType(UART_TypeDef *self,U8 in_char)
{
if(self->CharCount Buf_Max_Len)
{
self->Buffer[self->SendIndex] = in_char;
self->SendIndex++;
self->CharCount++;
}
}
void UART_GetType(UART_TypeDef *self)
{
U8 ctmp = 0;
if(self->CharCount)
{
ctmp = self->Buffer[self->ReadIndex];
self->ReadIndex--;
self->CharCount--;
}
}
void UART_SendChar(UART_TypeDef *self,U8 in_char)
{
UART0_TX_ENABLE;
SBUF = UART_SendType(self->Buffer,in_char);
UART0_TX_DISABLE;
}

void UART_GetChar(UART_TypeDef *self,U8 in_char)
{
U8 ctmp;
UART0_RX_ENABLE;
UART_SendType(self->Buffer,SBUF);
UART0_RX_DISABLE;
}
以上的例子只是简单的说明了模块化编程原理及一般流程,可能我们已经注意到形参使用的是指针结构体,如此可以节约系统时间并减少系统内存开销。

3 总结

编程习惯很重要,由于面对大型的工程和团队合作,养成一个规范化编程和模块化编程的好习惯相当重要,也可以说是直接影响团队的工程进程和新代码成员的跟进进度,所以在开始学习编写程序代码前必须养成一个良好的编程习惯,规范化和模块化编程是其精髓。

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

网站地图

Top