一、重复步骤的程序结构优化
1、重复步骤的程序例举
以单片机为例,重复的操作其实涉及很多方面,例如:多路PWM通道的输入捕获、多路PWM通道的输出控制、多路ADC的采集等等。即:当涉及对一个外设的多路通道的操作时,就会 产生重复步骤。
以多路PWM输入捕获为例子,最简单的PWM输入捕获的结构代码如下:
uint8_t pwm_get_period(uint8_t channel)
{
uint8_t period;
switch (channel)
{
case channel0:
DoSomething();
break;
case channel1:
DoSomething();
break;
......
default:
break;
}
return period;
}
以上结构很简单容易实现,但是有以下缺点:
- 当通道数增多的时候,代码会变得冗余,不容易修改
- 修改完后,调试麻烦,容易在细节上出错
2、重复步骤的程序优化
对于整体的程序结构,最好修改成应用+配置的模式。即:当我们要对程序进行修改的时候,仅需要在配置文件中进行改动,对于应用文件中不需要或者仅做小部分的改动。
还是以前面的PWM输入捕获为例子,优化如下:
(1)配置文件:设计一个结构体将跟PWM输入捕获需要修改的内容,尽量全部囊括在该结构体中,设置宏定义索引
#define PWM_IN_CHANNEL_CNT 2
#define PWM_IN_CHANNEL_0 0
#define PWM_IN_CHANNEL_1 1
typedef struct PwmInChannelCfg
{
uint8_t channel;
uint8_t flag;
uint8_t Port;
uint8_t Pin;
uint32_t *statusReg;
uint32_t *dataReg;
};
const PwmInChannelCfg PwmInChannel[PWM_IN_CHANNEL_CNT] = {
{PWM_IN_CHANNEL_0, flag1, Port8, Pin1, &(TAUB0.CSR0), &(TAUB0.CDR0)},
{PWM_IN_CHANNEL_0, flag2, Port8, Pin2, &(TAUB0.CSR0), &(TAUB0.CDR0)},
}
(2)应用文件:使用配置文件中的通道结构体来进行程序的编写
uint8_t pwm_get_period(uint8_t channel)
{
uint8_t i, period;
uint8_t flag, port, pin;
uint32_t *statusReg, *dataReg;
for(i = 0; i < PWM_IN_CHANNEL_CNT; i++)
{
if(channel == PwmInChannel[i].channel)
{
flag = PwmInChannel[i].flag;
port = PwmInChannel[i].port;
pin = PwmInChannel[i].pin;
statusReg = PwmInChannel[i].statusReg;
dataReg = PwmInChannel[i].dataReg;
}
}
........
return period;
}
做以上修改后有以下几个优点:
- 新增或者减少通道时候,仅需要在配置文件中做修改宏定义,和对PwmInChannel中的内容进行修改
- 应用文件中的代码变得更加简单易读,不会太过冗余,并且不管是新增或者减少通道,应用文件中的代码不需要进行改动