Redamancy785's Blog

在不动声色的日子里,遇见你真好

0%

🚗造轮子—Flash&SRAM优化

🚩优化FLASH内存很有效的方式之一:删除无用代码

首先来看一组Arduino内存占用情况的对比:

优化之前

优化之后

明显发生了很大的改变,而实现的功能却是一模一样的。

本次程序例程来自太极创客官网,此平台的Arduino教程深入浅出,对于想学习Arduino的同学,首推太极创客团队。(๑•̀ㅂ•́)و✧

以下便是今天练习的内存优化程序:

🎯优化前代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
* 基本功能介绍:
* 小夜灯配备人体红外感应传感器以及光敏电阻实现照明自动化
* 点亮和熄灭时产生渐明渐暗效果
* 在点亮过程中产生呼吸灯的效果
* 用户可以通过变量 maxRVal、maxGVal、maxBVal 自定义小夜灯点亮的颜色
* 用户可以通过变量 breathStep、breathStepDelay 自定义小夜灯渐明渐暗的速度
*
* 基本电路连接说明:
* 共阴极RGB-LED引脚R 连接 Arduino控制器引脚6
* 共阴极RGB-LED引脚G 连接 Arduino控制器引脚5
* 共阴极RGB-LED引脚B 连接 Arduino控制器引脚3
* 红外人体感应模块信号输出引脚 连接 Arduino控制器引脚8
* 光敏电阻分压电路信号输出引脚 连接 Arduino控制器引脚A0
*/
//定义引脚
#define rLedPin 6
#define gLedPin 5
#define bLedPin 3
#define irSensorPin 8
#define lightSensorPin A0
//设置参数
int ledR=0;
int ledG=0;
int ledB=0;

bool irReading;
int lightReading;

int maxRVal=125;
int maxGVal=200;
int maxBVal=33;

int minRVal=39;
int minGVal=65;
int minBVal=11;

int breathStep=1;
int breathStepDelay=18;
bool breathOnOff=0;

bool onOffState;

//debug模式是否开启
//bool debugOn=0;
/*
* Arduino在控制LED亮度变化时,对于时间的要求很苛刻。
* 每一次Arduino通过串口监视器输出信息时都会让Arduino短暂停顿
* 这些短暂停顿会影响小夜灯的渐明渐暗效果。
* 因此建议在程序开发时令debugOn = 1,以便于观察Arduino
* 的工作状态并作出必要的修改。
* 但是在正常工作时,建议将debugOn = 0, 从而确保Arduino
* 的最佳工作效果。
*
*if(debugOn){
* Serial.println("");
* Serial.println("===========================");
* Serial.print("irReading = "); Serial.println(irReading);
* Serial.print("lightReading = "); Serial.println(lightReading);
* Serial.println("===========================");
* delay(50);
*}
*/

void setup(){

//引脚模式的设置
pinMode(rLedPin,OUTPUT);
pinMode(gLedPin,OUTPUT);
pinMode(bLedPin,OUTPUT);
pinMode(irSensorPin,INPUT);

if(debugOn){
Serial.begin(9600);
Serial.println("Welcome!");
}

if(minRVal>maxRVal || minGVal>maxGVal || minBVal>maxBVal){
while(true){//持续闪烁红灯以示警告
anologWrite(rLedPin,255);
delay(500);
anologWrite(rLedPin,0);
delay(500);
Serial.println("Bad LED Settings!");
}
}

}


void loop(){
irReading=digitalRead(irSensorPin);
lightReading=digitalRead(lightSensorPin);

if(irReading==HIGH&&lightReading>=880){
if(onOffState==0)
fadeUp(maxRVal,maxGVal,maxBVal);
onOffState=1;
if(breatheOnOff==1)
ledBreathe();
}else{
if(onOffState==1);
fadeDown(0,0,0);
onOffState=0;
}

}

void fadeUp(int maxRVal,int maxGVal,int maxBVal){
while(ledR<maxRVal||ledG<maxGVal||ledB<maxBVal){
if(ledR+breatheStep<maxRVal){
ledR+=breatheStep;
anologWrite(rLedPin,ledR);
}else{
ledR=maxRVal;
anologWrite(rLedPin,ledR);
}

if(ledG+breatheStep<maxGVal){
ledG+=breatheStep;
anologWrite(gLedPin,ledG);
}else{
ledG=maxGVal;
anologWrite(gLedPin,ledG);
}

if(ledB+breatheStep<maxBVal){
ledB+=breatheStep;
anologWrite(bLedPin,ledB);
}else{
ledB=maxBVal;
anologWrite(bLedPin,ledB);
}

delay(breatheStepDelay);
}
}

void fadeDown(int minRVal,int minGVal,int minBVal){
while(ledR>minRVal||ledG>minGVal||ledB>minBVal){
if(ledR-breatheStep>minRVal){
ledR-=breatheStep;
anologWrite(rLedPin,ledR);
}else{
ledR=minRVal;
anologWrite(rLedPin,ledR);
}

if(ledG-breatheStep>minGVal){
ledG-=breatheStep;
anologWrite(gLedPin,ledG);
}else{
ledG=minGVal;
anologWrite(gLedPin,ledG);
}

if(ledB-breatheStep>minBVal){
ledB-=breatheStep;
anologWrite(bLedPin,ledB);
}else{
ledB=minBVal;
anologWrite(bLedPin,ledB);
}

delay(breatheStepDelay);
}
}

void ledBreathe(){
fadeDown(minRVal,minGVal,minBVal);
fadeUp(maxRVal,maxGVal,maxBVal);
}

🎯优化后代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137

#define rLedPin 6
#define gLedPin 5
#define bLedPin 3
#define irSensorPin 8
#define lightSensorPin A0

int ledR=0; //byte ledR=0;
int ledG=0; //byte ledG=0;
int ledB=0; //byte ledB=0;

bool irReading;
int lightReading;

int maxRVal=125; //const int PROGMEM maxRVal=125;
int maxGVal=200; //
int maxBVal=33; //

int minRVal=39; //
int minGVal=65; //
int minBVal=11; //

int breathStep=1; //
int breathStepDelay=18;//
bool breathOnOff=0; //

bool onOffState;


void setup(){

//引脚模式的设置
pinMode(rLedPin,OUTPUT);
pinMode(gLedPin,OUTPUT);
pinMode(bLedPin,OUTPUT);
pinMode(irSensorPin,INPUT);

if(debugOn){
Serial.begin(9600);
Serial.println(F("Welcome!"));
}

if(minRVal>maxRVal || minGVal>maxGVal || minBVal>maxBVal){
while(true){
anologWrite(rLedPin,255);
delay(500);
anologWrite(rLedPin,0);
delay(500);
Serial.println(F("Bad LED Settings!"));
}
}

}


void loop(){
irReading=digitalRead(irSensorPin);
lightReading=digitalRead(lightSensorPin);

if(irReading==HIGH&&lightReading>=880){
if(onOffState==0)
fadeUp(maxRVal,maxGVal,maxBVal);
onOffState=1;
if(breatheOnOff==1)
ledBreathe();
}else{
if(onOffState==1);
fadeDown(0,0,0);
onOffState=0;
}

}

void fadeUp(int maxRVal,int maxGVal,int maxBVal){
while(ledR<maxRVal||ledG<maxGVal||ledB<maxBVal){
if(ledR+breatheStep<maxRVal){
ledR+=breatheStep;
anologWrite(rLedPin,ledR);
}else{
ledR=maxRVal;
anologWrite(rLedPin,ledR);
}

if(ledG+breatheStep<maxGVal){
ledG+=breatheStep;
anologWrite(gLedPin,ledG);
}else{
ledG=maxGVal;
anologWrite(gLedPin,ledG);
}

if(ledB+breatheStep<maxBVal){
ledB+=breatheStep;
anologWrite(bLedPin,ledB);
}else{
ledB=maxBVal;
anologWrite(bLedPin,ledB);
}

delay(breatheStepDelay);
}
}

void fadeDown(int minRVal,int minGVal,int minBVal){
while(ledR>minRVal||ledG>minGVal||ledB>minBVal){
if(ledR-breatheStep>minRVal){
ledR-=breatheStep;
anologWrite(rLedPin,ledR);
}else{
ledR=minRVal;
anologWrite(rLedPin,ledR);
}

if(ledG-breatheStep>minGVal){
ledG-=breatheStep;
anologWrite(gLedPin,ledG);
}else{
ledG=minGVal;
anologWrite(gLedPin,ledG);
}

if(ledB-breatheStep>minBVal){
ledB-=breatheStep;
anologWrite(bLedPin,ledB);
}else{
ledB=minBVal;
anologWrite(bLedPin,ledB);
}

delay(breatheStepDelay);
}
}

void ledBreathe(){
fadeDown(minRVal,minGVal,minBVal);
fadeUp(maxRVal,maxGVal,maxBVal);
}

✔优化代码技巧:

  • 串口监视器输出:Serial.println(“……”);[SRAM] → Serial.println(F(“……”));[Flash]
  • 常量:const int a = 125;[SRAM] → const int PROGMEM a = 125;[Flash]
  • 变量(尽量使用局部变量代替全局变量):全局变量[独享SRAM] → 局部变量[共享SRAM]
  • 数据类型:int [2字节] → bool/byte[1字节]
我不管,我要吃棒棒糖~